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

Sam*_*ran 8 jsf session-state jsf-2 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>
Run Code Online (Sandbox Code Playgroud)

每次查看此页面时,都会为会话分配近1K.如果我删除<form>标记,则会话中不会存储任何内容.

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

Bal*_*usC 20

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

为了测试它自己,状态切换和关闭由以下context-paramweb.xml:

<context-param>
    <param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
    <param-value>false</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)

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

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

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

也可以看看: