首先,Mojarra 实现无意中交换了这些上下文参数的含义。因此,如果您的印象是描述与字面上下文参数名称所暗示的完全相反,那么这确实是正确的。
com.sun.faces.numberOfLogicalViews
这基本上是基于 GET 请求的。每个 GET 请求都会在会话中创建一个新视图。
为了试验它,将其设置为 3,启动一个新的浏览器会话并依次打开 4 个不同的浏览器选项卡(不管 URL;可能相同,可能不同),然后返回第一个选项卡并提交里面的表格。您将得到一个ViewExpiredException
,因为该视图已从 LRU(最近最少使用)映射中推出,用于会话中的视图。如果您打开最多 3 个选项卡,则不会发生这种情况。
默认值为 15,这是一个罕见的现实世界问题。如果您的 web 应用程序确实设计为以这种方式使用(例如,邀请在多个选项卡中打开的社交/社区站点,例如讨论论坛或问答),那么您可能会考虑使用客户端状态保存而不是增加默认值. 使用客户端状态保存,您将永远不会遇到此异常。另一种方法是结合使用OmniFaces<o:enableRestorableView>
请求范围的 bean 和请求参数,或视图范围的 bean,如果它自己的状态需要恢复,则检查(后)构造。另一种选择是使用无状态<f:view transient="true">
,这样视图不再保存,但您不能再使用视图范围的 bean。
MyFaces 等效org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION
项默认为 20。
com.sun.faces.numberOfViewsInSession
这基本上是基于同步(非 ajax!)POST 请求的。每个同步 POST 请求都会创建一个新的逻辑视图。它们都存储在这样的物理视图的基础上Map<PhysicalView, Map<LogicalView, ViewState>>
。因此,最多 15 个物理视图和最多 15 个逻辑视图,理论上您可以在会话中拥有 15*15 = 225 个视图。
为了试验它,将其设置为 3,打开一个同步表单的视图,提交 4 次,然后按浏览器的后退按钮 4 次,然后再次提交表单。你会得到一个ViewExpiredException
, 因为这个视图已经从逻辑视图的 LRU(最近最少使用)映射中推出。如果您最多返回 3 次然后重新提交,则不会发生这种情况。
javax.faces.ViewState
请注意,ajax 提交重用相同的逻辑视图(您可以通过查看在 ajax 回发上返回的完全相同的值来确认它)。无论如何,没有浏览器的后退按钮支持。浏览器的后退按钮只会让您回到之前的同步请求,因此将所有这些 ajax 回发存储为会话中的逻辑视图是没有任何意义的。
使用默认值 15 以及当前仅 ajax 表单和禁用动态页面上的缓存的趋势,这是一个非常罕见的现实世界问题。正确设计的表单不应邀请按下浏览器的后退按钮。相反,他们应该成功提交重定向到目标视图,失败时只需重新显示带有验证错误的相同表单。另请参阅如何在 JSF 中导航?如何使 URL 反映当前页面(而不是上一个页面)。此外,缓存在动态页面上经常被禁用,所以返回按钮基本上会给你一个全新的视图。另请参阅避免 JSF Web 应用程序上的后退按钮。如果这也是您的应用程序的情况,那么您可以安全地将值设置为 1。
MyFaces 最初对此没有等效项,并且也将其视为会话中的物理视图。在 2.0.6 版中,org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION
引入了类似的目的,但实现方式不同并且默认禁用。
也可以看看: