3 回答
TA贡献1836条经验 获得超4个赞
首先,Mojarra实现无意间交换了这些上下文参数的含义。因此,如果您觉得描述与文字上下文参数名称所暗示的含义完全相反,那么确实如此。
com.sun.faces.numberOfLogicalViews
这基本上是基于GET请求的。每个GET请求都会在会话中创建一个新视图。
要对其进行试验,请将其设置为3,开始新的浏览器会话,并依次打开4个不同的浏览器选项卡(无论URL;可能相同,可能不同),然后返回第一个选项卡并提交那里的表格。您将得到一个ViewExpiredException,因为此视图已从LRU(最近最少使用)映射中推出,用于会话视图。如果您最多打开3个标签,则不会发生这种情况。
默认值为15,这是一个罕见的现实问题。如果您的Web应用程序确实是设计用于这种方式的(例如,邀请在多个选项卡中打开的社交/社区网站,例如讨论论坛或Q&A),那么您可以考虑使用客户端状态保存而不是增加默认值。使用客户端状态保存,您将永远不会遇到此异常。一种替代方法是将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次,然后重新提交,则不会发生这种情况。
注意,ajax提交重用相同的逻辑视图(您可以通过查看javax.faces.ViewStateajax回发中返回的值完全相同来确认它)。无论如何,没有浏览器的后退按钮支持。浏览器的后退按钮仅使您返回上一个同步请求,因此将所有这些ajax回发存储为会话中的逻辑视图没有任何意义。
默认值为15,并且当前趋势是仅使用ajax表单,并且在动态页面上禁用了缓存,这是一个非常罕见的现实问题。设计正确的表单不应邀请您按下浏览器的后退按钮。相反,他们应该在成功提交重定向到目标视图后,在失败时仅重新显示带有验证错误的相同表单。另请参见提示如何在JSF中导航?如何使URL反映当前页面(而不是上一页)。此外,动态页面上的缓存经常会被禁用,因此后退按钮基本上可以为您提供全新的后退视图。另请参见JSF Web应用程序上的“避免后退”按钮。如果这也适合您的应用程序,则可以安全地将该值设置为1。
MyFaces最初没有与此等效的功能,因此也将其视为会话中的物理视图。在2.0.6版本org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION中引入了具有类似目的的版本,但实现方式有所不同,默认情况下已禁用。
TA贡献1862条经验 获得超7个赞
实际上,就像(已将javax.faces.STATE_SAVING_METHOD设置为服务器)一样,如果我通过打开16个标签页触发16个GET请求,然后转到第一个标签页并通过按下命令按钮,如果com.sun.faces.numberOfLogicalViews为15,则将发生viewexpiredexcetion。关于为什么选择服务器作为状态保存方的任何原因?
添加回答
举报