代码之家  ›  专栏  ›  技术社区  ›  Miguel Ping

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

  •  34
  • Miguel Ping  · 技术社区  · 15 年前

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

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

    他们之间有什么区别?文档中没有太多关于这些的内容。我的应用程序遇到问题 ViewExpiredException 对于某些页面,但是在我们将这些设置设置设置为更高的值之后,我们就不再有问题了。

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

    2 回复  |  直到 13 年前
        1
  •  66
  •   Community Mohan Dere    9 年前

    首先,Mojarra实现无意中交换了这些上下文参数的含义。因此,如果您认为描述与文本上下文参数名称的含义正好相反,那么这确实是正确的。


    com.sun.faces.numberOfLogicalViews

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

    要尝试使用它,请将其设置为值3,启动新的浏览器会话并依次打开4个不同的浏览器选项卡(不考虑URL;可能相同,可能不同),然后返回到第一个选项卡并在其中提交表单。你会得到一个 ViewExpiredException ,因为此视图已从会话中视图的LRU(最近使用最少的)映射中推出。如果打开最多3个选项卡,则不会发生这种情况。

    OmniFaces <o:enableRestorableView> 结合使用请求作用域bean和请求参数,或者使用视图作用域bean,如果需要还原其自身的状态,则该bean将签入(post)构造。另一个选择是 stateless with <f:view transient="true"> ,这样就不再保存视图,但不能再使用视图范围的bean。

    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.ViewState 在ajax回发时返回的值)。无论如何,浏览器都不支持后退按钮。浏览器的back按钮只会让您回到先前的同步请求,因此将所有ajax回发存储为会话中的逻辑视图是没有意义的。

    How to navigate in JSF? How to make URL reflect current page (and not previous one) . 此外,缓存在动态页面上经常被禁用,因此back按钮基本上会给您一个全新的视图back。另见 Avoid back button on JSF web application . 如果这也是针对您的应用程序的情况,那么您可以安全地将该值设置为1。

    MyFaces最初对此没有等价物,并且在会话中将此视为物理视图。在2.0.6版中, org.apache.myfaces.NUMBER_OF_SEQUENTIAL_VIEWS_IN_SESSION 是以类似的目的引入的,但是使用了不同的实现,并且在默认情况下被禁用。


        2
  •  5
  •   tasel    15 年前

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

    这可能会有帮助:

    如果您有一个简单的应用程序,那么默认的15个视图或15个逻辑视图可能太大。在这种情况下,您应该考虑减少允许的视图和逻辑视图的数量,以节省内存。相反,更复杂的应用程序可能需要在会话中保存15个以上的视图或逻辑视图。