com.sun.faces.numberOfViewsInSession与com.sun.faces

Mojarra JSF 2的实现具有以下上下文参数:

  • com.sun.faces.numberOfViewsInSession (默认为15)

  • com.sun.faces.numberOfLogicalViews (默认为15)

它们之间有什么区别?该文档没有太多谈论这些。我的应用在ViewExpiredException某些页面上遇到了麻烦,但是在将这些设置提高到更高的值后,我们就不再遇到问题了。

我的应用程序是一个财务的,支持表单的,支持Ajax的应用程序(某些屏幕具有50多个输入,并可以选择通过AJAX添加更多数据/输入)。

造成这种现象的原因是什么?我知道第一个参数定义了会话中保留的“页面”数,这对于后退按钮可能很有用,但是触发我的用例的情况是ViewExpiredException不使用后退按钮。第二个参数指的是什么?如果我停留在同一屏幕上,但继续通过AJAX添加大量数据,这是否会导致页面需要大量逻辑视图?


撒科打诨
浏览 377回答 3
3回答

HUH函数

首先,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中引入了具有类似目的的版本,但实现方式有所不同,默认情况下已禁用。

牧羊人nacy

实际上,就像(已将javax.faces.STATE_SAVING_METHOD设置为服务器)一样,如果我通过打开16个标签页触发16个GET请求,然后转到第一个标签页并通过按下命令按钮,如果com.sun.faces.numberOfLogicalViews为15,则将发生viewexpiredexcetion。关于为什么选择服务器作为状态保存方的任何原因?
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript