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

Posted

技术标签:

【中文标题】JSF 2.0 部分状态保存似乎不起作用【英文标题】:JSF 2.0 partial state saving does not seem to work 【发布时间】:2011-05-22 09:37:14 【问题描述】:

我正在评估在高流量网站中使用 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。如果我删除 &lt;form&gt; 标记,则会话中不会存储任何内容。

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

【问题讨论】:

【参考方案1】:

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

要自己测试,请通过context-param 中的context-param 来打开和关闭状态web.xml

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

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

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

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

另见:

What's new in JSF 2.0? - State saving What's the view build time? Why JSF saves the state of UI components on server?

【讨论】:

以上是关于JSF 2.0 部分状态保存似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 dealloc 中保存对象状态不起作用

没有情节提要的 UIViewController 状态恢复不起作用

为啥 JSF 将 UI 组件的状态保存在服务器上?

通过客户端状态保存防止 JSF2 中的 CSRF

以表单数据作为对象保存在表单状态下的表单-重置不起作用

保存的首选项在重新启动时不起作用