Jsf 2 何时使用preRenderView与viewAction?

Jsf 2 何时使用preRenderView与viewAction?,jsf-2,jsf-2.2,prerenderview,Jsf 2,Jsf 2.2,Prerenderview,什么时候应该使用preRenderView事件初始化页面数据,而不是使用viewAction?它们的用途相同吗?它们有相同的效果吗 预渲染视图事件 <f:metadata> <f:event type="preRenderView" listener="#{myBean.initialize}"/> </f:metadata> 或 查看操作 <f:metadata> <f:viewAction action="#{myBean.

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

预渲染视图事件

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

查看操作

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

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

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

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

  • 如果
    :此属性允许您提供计算结果为布尔结果的值表达式。视图操作将仅在此表达式的结果上执行

  • 立即
    :此属性现在授予在
    应用请求值
    阶段执行
    查看操作
    的能力(与默认的
    调用应用程序
    阶段不同),使其行为类似于常规的
    UIComponent


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

    带有
    标记的
    rendered=“…”
    技巧对我不起作用(在带有Mojarra 2.2.11的Wildfly 9.0上)。根据没有
    呈现的
    -属性。它没有@MartinHöller文档记录,但我(在我写这个答案时)在GF4上有JSF2.2,并且标记确实带有
    呈现的
    属性。可能是开发人员的疏忽可能bahavior使用了一些次要版本进行了更改,但我尝试了
    rendered=“false”
    ,并且每次请求视图时都会调用通过
    侦听器指定的方法。