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

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

它们有什么区别?该文档对这些并不多。我的应用程序遇到了麻烦 ViewExpiredException 对于某些页面,但是在将这些设置撞到(更高)的价值之后,我们就不再遇到问题了。

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

这种行为的原因是什么?我了解第一个参数定义了在会话中保存的“页面”的数量,这可能对后退按钮有用,但是我的用例触发了我的用例 ViewExpiredException 不要使用后按钮。第二个参数指的是什么?如果我留在同一屏幕中,但请继续通过AJAX添加大量数据,这是否会导致页面上有更多逻辑视图?

有帮助吗?

解决方案

首先,Mojarra实施无意间交换了这些上下文参数的含义。因此,如果您的印象是描述与文字上下文名称所暗示的完全相反,那么这确实是正确的。


com.sun.faces.numberOfLogicalViews

这基本上是基于请求的。每个获取请求都会在会话中创建一个新视图。

要尝试一下,将其设置为3个值,启动新的浏览器会话并打开4个不同的浏览器选项卡(无论URL如何;可能是相同的,可能是不同的),然后返回到1st选项卡并提交那里的形式。你会得到一个 ViewExpiredException, ,因为该视图已从LRU(最近使用的最少使用)地图中推出,以获取会话中的视图。如果您打开最大3个选项卡,这将不会发生。

默认值为15,这是一个罕见的现实世界问题。如果您的WebApp真正设计为使用这种方式(例如,一个社交/社区网站邀请在多个选项卡中打开,例如讨论论坛或Q&A),那么您可以考虑使用客户端状态保存而不是增加默认值。有了客户端的状态节省,您将永远不会面临此例外。另一种方法是使用 综合 <o:enableRestorableView> 结合使用请求范围的bean和请求参数,或一个视图范围的bean,该范围内检查(post)构造是否需要恢复其自己的状态。再次选择是去 无状态 <f:view transient="true">, ,这样,视图就不再保存了,但是您不能再使用视图示波器豆。

等效的myfaces是 org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION 默认为20。


com.sun.faces.numberOfViewsInSession

这基本上是基于邮政请求的同步(非AJAX!)。每个同步的帖子请求都会创建一个新的逻辑视图。它们都是基于像物理观点一样存储的 Map<PhysicalView, Map<LogicalView, ViewState>>. 。因此,使用最大15个物理视图和最大15个逻辑视图,理论上可以在会话中具有15*15 = 225视图。

要尝试一下,请将其设置为3个值,打开同步表单的视图,提交4次,然后按4次浏览器的背面按钮,然后再次提交表单。你会得到一个 ViewExpiredException, ,因为从LRU(最近使用的最少使用)映射中将此视图推出以获取逻辑视图。如果您返回最大3次然后重新提交它,则不会发生这种情况。

请注意,Ajax提交了重复使用相同的逻辑视图(您可以通过查看完全相同 javax.faces.ViewState 值在AJAX寄回上返回)。无论如何,都没有浏览器的后退按钮支持。浏览器的后退按钮只会使您回到以前的同步请求中,因此将所有这些AJAX发后返还作为会话中的逻辑视图没有任何意义。

由于默认值为15,并且在动态页面上的仅AJAX形式和残疾缓存的当前趋势,这是一个非常罕见的现实世界问题。正确设计的表格不应邀请按下浏览器的背面按钮。相反,他们应成功提交重定向到目标视图,而在失败时只需将相同的表格重新播放,并带有验证错误。也看到提示 如何在JSF中导航?如何使URL反映当前页面(而不是先前的页面). 。另外,缓存比在动态页面上经常被禁用,因此后面的按钮基本上会给您一个全新的视图。也可以看看 避免在JSF Web应用程序上的备用按钮. 。如果这也适用于您的应用程序,则可以将值安全设置为1。

MyFaces最初对此没有等效,并将其视为会话中的物理视图。在2.0.6版中 org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION 介绍了类似的目的,尽管实现了不同,并且默认情况下是禁用的。


也可以看看:

其他提示

刚刚在网上找到了这一点: http://oss.org.cn/ossdocs/java/ee/javaeetutorial5/doc/jsfconfigure11.html

这可能会有所帮助:

逻辑视图是顶级视图的子视图。例如,如果您有一个包含多个帧的页面,则每个帧都是逻辑视图。如果您有一个简单的应用程序,那么15个视图或15个逻辑视图的默认值可能太大了。在这种情况下,您应该考虑减少允许数量的视图和逻辑视图以节省内存。相反,更复杂的应用程序可能需要超过15个视图或逻辑视图在会话中保存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top