何时使用 preRenderView 与 viewAction?

Posted

技术标签:

【中文标题】何时使用 preRenderView 与 viewAction?【英文标题】:When to use preRenderView versus 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>

【问题讨论】:

【参考方案1】:

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

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

     <f:metadata>
         <f:event type="preRenderView" rendered="#facesContext.postBack" listener="#myBean.initialize"/>
     </f:metadata>
    

    phase:此属性允许您指定在特定 JSF 阶段执行的操作。默认为 INVOKE_APPLICATION,但所有其他 JSF Phase Id 在这里都有效。

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

    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 指定的方法。

以上是关于何时使用 preRenderView 与 viewAction?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0。无法在 preRenderView 事件处理程序中获取 POST 参数和 cookie

有没有办法以编程方式检测用户何时按下浏览器中的F5按钮?

查看 Scoped Bean preRenderView 方法被多次调用

JSF f:event preRenderView 是由 f:ajax 调用和部分渲染触发的,还有别的吗?

何时使用 f:view 和 f:subview

Objective C:何时在 App Delegate 中使用方法以及何时在 View Controller 中使用方法