首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >com.sun.faces.numberOfViewsInSession对com.sun.faces.numberOfLogicalViews

com.sun.faces.numberOfViewsInSession对com.sun.faces.numberOfLogicalViews
EN

Stack Overflow用户
提问于 2010-11-05 11:28:23
回答 2查看 29.7K关注 0票数 37

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

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

他们之间有什么区别?这些文档并没有太多的内容。我的应用程序在一些页面上遇到了ViewExpiredException的问题,但是当我们把这些设置的值提高到一个更高的值后,我们就不再有问题了。

我的应用程序是一个金融的、表单丰富的、支持AJAX的应用程序(一些屏幕上有50+输入,可以通过AJAX添加更多的数据/输入)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 02:30:12

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

com.sun.faces.numberOfLogicalViews

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

要试用它,将其设置为值3,启动一个新的浏览器会话并按顺序打开4个不同的浏览器选项卡(不管URL如何;可能相同,可能不同),然后返回到第一个选项卡并在其中提交表单。您将得到一个ViewExpiredException,因为此视图已从LRU (最近使用最少的)会话视图映射中导出。这将不会发生,如果你打开最多3标签。

默认值为15,这是一个罕见的现实世界问题。如果您的way应用程序确实被设计成以这种方式使用(例如,邀请在多个选项卡(如讨论论坛或问答)中打开的社交/社区站点),那么您可以考虑使用客户端状态保存而不是增加默认值。通过客户端状态保存,您将永远不会遇到此异常。另一种方法是结合使用OmniFaces (请求作用域bean和请求参数),或者使用视图作用域bean (如果需要恢复其自身状态)签入(Post)构造。另一种选择是转到stateless with ,这样就不再保存视图,但是不能再使用视图作用域bean了。

MyFaces的等价物是默认为20的org.apache.myfaces.NUMBER_OF_VIEWS_IN_SESSION

com.sun.faces.numberOfViewsInSession

这基本上是同步的(非ajax!)基于职位请求。每个同步的POST请求都会创建一个新的逻辑视图。它们都存储在类似于Map<PhysicalView, Map<LogicalView, ViewState>>的物理视图的基础上。因此,对于最大15个物理视图和最大15个逻辑视图,理论上可以在会话中拥有15*15 = 225视图。

要对其进行实验,将其设置为3,使用同步表单打开视图,提交4次,然后按浏览器的后退按钮4次,然后再次提交表单。您将得到一个ViewExpiredException,因为这个视图已经从逻辑视图的LRU (最近使用最少的)映射中移出。这将不会发生,如果你返回最多3次,然后重新提交它。

注意,ajax提交重用相同的逻辑视图(您可以通过看到在ajax回发上返回的完全相同的javax.faces.ViewState值来确认它)。无论如何,浏览器都不支持它的后退按钮。浏览器的back按钮只会将您带回到以前的同步请求,因此在会话中将所有ajax回发存储为逻辑视图是没有任何意义的。

由于默认值为15,以及当前动态页面上只有ajax的表单和禁用缓存的趋势,这是一个非常罕见的现实问题。正确设计的表单不应该邀请您按下浏览器的后退按钮。相反,在成功提交时,它们应该重定向到目标视图,如果失败,则应该重新显示与验证错误相同的表单。参见提示(也见How to navigate in JSF? How to make URL reflect current page (and not previous one) )。另外,在动态页面上,缓存通常是禁用的,所以back按钮基本上会给您一个全新的视图。另见Avoid back button on JSF web application。如果这也适用于您的应用程序,那么可以安全地将值设置为1。

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

另请参阅:

票数 68
EN

Stack Overflow用户

发布于 2010-11-11 12:10:44

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

这可能会有帮助:

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4105439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档