JSF 2.0部分状态保存似乎不起作用

时间:2010-12-08 18:00:35

标签: jsf jsf-2 session-state state-saving

我正在评估在高流量网站中使用JSF的可能性。我被告知在JSF 2.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。如果我删除了<form>标记,则会话中不会存储任何内容。

知道组件树存储在会话中的原因吗?我认为这将在回发请求中计算。

1 个答案:

答案 0 :(得分:20)

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

要自行测试,请通过context-param中的以下web.xml切换状态:

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

当设置为false时,您会看到大小增加,这意味着已保存整个组件树。

它存储在会话中,因为它是Servlet API提供的唯一范围,其范围大于请求范围。存储在请求范围中将没有任何价值,因为在后续请求中它将不再可用。 Servlet API没有像JSF那样的视图范围的概念(顺便说一句,它是使用会话范围间接使用的,基本上,视图状态是组件树状态)。

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

另见: