JSF2.0部分状态保存似乎不起作用

JSF2.0部分状态保存似乎不起作用,jsf,jsf-2,session-state,state-saving,Jsf,Jsf 2,Session State,State Saving,我正在评估在高流量网站中使用JSF的可能性。我被告知,在JSF2.0中,组件树不存储在会话中,并且在修改组件树后只存储增量 以下是我正在查看的页面: <?xml version="1.0" encoding="UTF-8"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html"> <body> <h:form>

我正在评估在高流量网站中使用JSF的可能性。我被告知,在JSF2.0中,组件树不存储在会话中,并且在修改组件树后只存储增量

以下是我正在查看的页面:

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
   xmlns:h="http://java.sun.com/jsf/html">
    <body>
        <h:form>
            hello, world
        </h:form>
    </body>
</html>

你好,世界
每次我查看此页面时,都会为会话分配近1K。如果删除
标记,则会话中不会存储任何内容


知道为什么会在会话中存储组件树吗?我认为这将根据回发请求进行计算。

部分状态保存并不意味着状态不会保存在会话中。这只意味着将保存组件树状态的一部分,而不是整个组件树状态。部分状态保存的关键思想是不会保存客户端在后续请求中不会更改的组件状态。相反,它是通过在恢复视图期间在服务器端重新执行视图来获得的。仅保存对客户端更改敏感的组件状态(表单、输入、按钮等)。您在会话中看到的1K是部分状态本身

要自己测试,请通过
web.xml
中的以下
context参数打开和关闭状态:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>

javax.faces.PARTIAL_STATE_保存
假的
您将看到,当设置为
false
时,大小会增加,这意味着整个组件树将被保存

它存储在会话中,因为这是ServletAPI提供的唯一一个作用域大于请求作用域的应用程序。存储在请求范围内没有任何价值,因为它在后续请求中不再可用。ServletAPI没有像JSF那样的视图范围的概念(它是间接使用会话范围的,基本上,视图状态是组件树状态)

当您删除表单时,您确实再也看不到它了,因为实际上客户机已经没有什么可以更改的了(也就是说,不会有回发)。当时拯救国家是没有意义的。此外,没有任何东西可以将保存状态的键作为隐藏输入字段传递(名称为
javax.faces.ViewState

另见: