我正在评估在高流量网站中使用 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>
标签,会话中不存储任何内容。
知道为什么组件树存储在会话中吗?我认为这将根据回发请求进行计算。
部分状态保存并不意味着状态不会保存在会话中。这仅仅意味着一个part组件树状态的将被保存而不是entire组件树状态。部分状态保存的关键思想是,在后续请求中客户端不会更改的组件的状态将不会被保存。而是通过恢复视图时在服务器端重新执行视图来获取。仅保存对客户端更改敏感的组件状态(表单、输入、按钮等)。您在会话中看到的 1K 是部分状态本身。
要自行测试,请通过以下方式打开和关闭状态context-param
in web.xml
:
<context-param>
<param-name>javax.faces.PARTIAL_STATE_SAVING</param-name>
<param-value>false</param-value>
</context-param>
当设置为false
,这意味着entire相反,组件树被保存。
它存储在会话中,因为这是 Servlet API 唯一提供的,其范围比请求范围更大。存储在请求范围中将没有任何价值,因为它在后续请求中将不再可用。 Servlet API 没有像 JSF 那样的视图范围概念(顺便说一句,它在幕后间接使用会话范围,基本上,视图状态是组件树状态)。
当您删除表单时,您确实不再看到它,因为实际上没有任何内容可供客户端更改(即不会有回发)。那时拯救国家就没有意义了。此外,没有什么可以将保存状态的键作为隐藏输入字段(名称为javax.faces.ViewState
).
也可以看看:
- JSF 2.0 中有哪些新增内容? - 国家储蓄
- 视图构建时间是多少?
- 为什么 JSF 将 UI 组件的状态保存在服务器上?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)