【问题标题】:When to use preRenderView versus viewAction?何时使用 preRenderView 与 viewAction?
【发布时间】:2014-08-20 19:49:43
【问题描述】:

什么时候应该使用 preRenderView 事件来初始化页面的数据而不是使用 viewAction?它们在使用上是否相同,是否具有相同的效果?

preRenderView 事件

<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>

viewAction

<f:metadata>
  <f:viewAction action="#{myBean.initialize}"/>
</f:metadata>

【问题讨论】:

    标签: jsf-2 jsf-2.2 prerenderview


    【解决方案1】:

    在实践中,它们可以用来实现相同的效果,但viewAction(JSF2.2 的新功能)具有以下增强功能:

    1. onPostbackviewAction 带有此属性,允许您指定是否希望在回发到同一视图时执行操作(即在页面刷新或按钮提交时)等等)。它默认为false,因此如果不需要,您甚至不必指定它。要达到与preRenderView 相同的效果,您需要

       <f:metadata>
           <f:event type="preRenderView" rendered="#{facesContext.postBack}" listener="#{myBean.initialize}"/>
       </f:metadata>
      
    2. phase:此属性允许您指定在特定 JSF 阶段执行的操作。默认为 INVOKE_APPLICATION,但所有其他 JSF Phase Id 在这里都有效。

    3. if:此属性允许您提供一个计算结果为布尔结果的值表达式。视图动作只会在这个表达式的结果上执行。

    4. immediate:此属性现在授予在APPLY_REQUEST_VALUES 阶段执行viewAction 的能力(相对于默认的INVOKE_APPLICATION 阶段),允许它表现得像普通的UIComponent

    总的来说,viewAction 是一种更简洁的设计方法来执行视图命令。

    【讨论】:

    • 带有&lt;f:event&gt; 标签的rendered="..." 的技巧对我不起作用(在Wildfly 9.0 和Mojarra 2.2.11 上)。根据JSF 2.2 VDL documentation&lt;f:event&gt; 没有rendered-属性。
    • @MartinHöller 没有记录,但我在 GF4 上有(在我写这个答案时有)JSF2.2,并且标签确实带有 rendered 属性。可能是开发人员的疏忽
    • 也许行为改变了一些次要版本,但我尝试了rendered="false",并且每次请求视图时都会调用通过listener-attribute 指定的方法。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 2018-05-05
    • 1970-01-01
    • 2014-12-26
    • 1970-01-01
    • 2013-01-29
    • 2014-11-22
    相关资源
    最近更新 更多