状态保存了多少个视图副本?

时间:2012-10-11 15:29:18

标签: jsf-2

每篇文章和JSF2规范都一直在说视图已恢复并保存。没有人说每个用户保存了多少版本的相同视图。我可以看到javax.faces.ViewState隐藏变量的值在每次回发后都会不断变化。我也知道我可以从两个不同的浏览器选项卡在同一页面上工作,每个选项卡都保持自己的状态。

所以,问题是,每次发生回发时,都会保存一个新版本的视图(除了已经保存的副本)?

我需要知道这有两个原因。 a)估计会话大小b)编写自动化测试脚本。

感谢。

2 个答案:

答案 0 :(得分:0)

  

所以,问题是,每次发生回发时,都会保存一个新版本的视图

那部分是真的。

  

(除了已保存的副本)?

那部分不是真的。将仅添加新创建的视图(来自GET请求),而不是已恢复的视图(来自POST请求)。

在回发中,视图将被恢复,处理和保存,从而基本上替换了同一视图的先前版本。

另见:

答案 1 :(得分:0)

所以,我对Mojarra如何在服务器中保存状态做了更多调查。我浏览了Mojarra源代码,编写了一个会话监听器和一个打印出用户会话内容的Servlet。这是我发现的:

Mojarra在会话中添加了一个名为“com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap”的Map。对于从选项卡请求的每个唯一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

这对繁忙的网站的影响是可怕的。