每篇文章和 JSF2 规范都在说视图已恢复和保存。没有人说每个用户保存了多少相同视图的版本。我可以看到 javax.faces.ViewState 隐藏变量的值在每次回发后都会不断变化。我也知道我可以从两个不同的浏览器选项卡在同一页面上工作,并且每个选项卡都保持自己的状态。
所以,问题是,每次回发时,是否保存了新版本的视图(除了已经保存的副本)?
我需要知道这一点有两个原因。a) 估计会话大小 b) 编写自动化测试脚本。
谢谢。
每篇文章和 JSF2 规范都在说视图已恢复和保存。没有人说每个用户保存了多少相同视图的版本。我可以看到 javax.faces.ViewState 隐藏变量的值在每次回发后都会不断变化。我也知道我可以从两个不同的浏览器选项卡在同一页面上工作,并且每个选项卡都保持自己的状态。
所以,问题是,每次回发时,是否保存了新版本的视图(除了已经保存的副本)?
我需要知道这一点有两个原因。a) 估计会话大小 b) 编写自动化测试脚本。
谢谢。
所以,问题是,每次回发发生时,是否保存了新版本的视图
那部分是真的。
(除了已经保存的副本)?
那部分是不正确的。只会添加新创建的视图(来自 GET 请求),而不是恢复的视图(来自 POST 请求)。
在回发时,视图被恢复、操作和保存,从而基本上替换了相同视图的先前版本。
因此,我对 Mojarra 如何在服务器中保存状态进行了更多调查。我浏览了 Mojarra 源代码,编写了一个会话监听器和一个打印出用户会话内容的 Servlet。这是我发现的:
Mojarra 在会话中添加了一个名为“com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap”的地图。对于从选项卡请求的每个唯一 XHTML 页面,都会向该 Map 添加一个条目。这个条目也是一个地图。视图状态保存在第二张地图中。据我所见,为页面的初始 GET 请求以及每个回发保存了一个单独的状态。例如,如果用户首先查看页面,然后提交表单 3 次,则为同一页面保存 4 个不同的状态。相信Mojarra别无选择,只能保存每一个回发来支持浏览器的后退按钮。
从概念上讲,顶级 Map(保存在会话中名为“com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap”的地图)的内容如下:
/index.xhtml:Tab#1. This is a map and contains:
- View state for initial GET
- View state for postback #1
- View state for postback #2
/index.xhtml:Tab#2. This is a map and contains:
- View state for initial GET
- View state for postback #1
- View state for postback #2
/another.xhtml:Tab#1. This is a map and contains:
- View state for initial GET
- View state for postback #1
- View state for postback #2
这对繁忙的网站的影响是可怕的。