0

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

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

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

谢谢。

4

2 回答 2

0

所以,问题是,每次回发发生时,是否保存了新版本的视图

那部分是真的。

(除了已经保存的副本)?

那部分是不正确的。只会添加新创建的视图(来自 GET 请求),而不是恢复的视图(来自 POST 请求)。

在回发时,视图被恢复、操作和保存,从而基本上替换了相同视图的先前版本。

也可以看看:

于 2012-10-11T17:15:40.430 回答
0

因此,我对 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

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

于 2012-10-12T16:27:20.497 回答