8

我正在评估在高流量网站中使用 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>标签,会话中不会存储任何内容。

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

4

1 回答 1

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,这意味着将保存整个组件树。

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

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

也可以看看:

于 2010-12-08T19:35:17.233 回答