我正在评估在高流量网站中使用JSF的可能性。有人告诉我,在JSF 2.0中,组件树未存储在会话中,并且只有修改了组件树后才存储Deltas。

这是我正在查看的页面:

<?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> 标签,会话中什么都没有存储。

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

有帮助吗?

解决方案

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

要自己测试,请按以下方式打开状态 context-paramweb.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).

也可以看看:

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top