何时使用f:viewAction / preRenderView与PostConstruct?

时间:2012-03-23 18:20:29

标签: jsf jsf-2 postconstruct prerenderview viewaction

应该何时使用f:viewActionpreRenderView事件初始化网页数据而不是使用@PostConstruct注释?基于支持bean的范围类型使用一个或另一个的基本原理是如果支持bean是@RequestScoped,那么在呈现视图之前选择使用f:viewActionpreRenderView而不是@PostConstruct来初始化您的支持bean是不相关的,因为两者会产生同样的效果?

f:viewAction或preRenderView

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

@PostConstruct

public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}

2 个答案:

答案 0 :(得分:112)

  

何时应该使用f:viewAction或preRenderView事件使用@PostConstruct注释初始化页面的数据?

如果要在呈现HTML之前执行方法,请使用<f:viewAction>。如果要在更新模型值阶段期间基于<f:viewParam>设置的模型值执行操作,这将特别有用。也就是说,@PostConstruct运行时它们不可用。在JSF 2.0 / 2.1中,此标记不存在,您必须使用preRenderView解决方法。

  

如果支持bean是@RequestScoped,他们是否有效地完成了同样的事情? (那么这取决于开发人员的选择?(@ PostConstruct看起来更“干净”)。

不,他们肯定没有有效地做同样的事情。 @PostConstruct旨在在bean构造和设置所有注入的依赖项和托管属性(例如@EJB@Inject@ManagedProperty之后直接执行 操作等等。注入的依赖项在bean的构造函数中不可用。因此,当bean是视图,会话或应用程序作用域时,每个视图,会话或应用程序只运行一次。默认情况下,<f:viewAction>仅在初始GET请求时调用,但也可以通过onPostback="true"属性配置为在回发请求上调用。每个HTTP请求都会调用preRenderView事件(是的,这也包括ajax请求!)。

总结一下,如果要在bean构造期间对@PostConstruct@EJB@Inject等设置的注入依赖项和托管属性执行操作,请使用@ManagedProperty。如果 想要对<f:viewAction>设置的属性执行操作,请使用<f:viewParam>。如果您仍在使用JSF 2.0 / 2.1,请使用preRenderView而不是<f:viewAction>。如有必要,您可以在FacesContext#isPostback()上添加一项检查,以便仅对初始请求执行preRenderView操作。

另见:

答案 1 :(得分:1)

您是否需要初始化托管bean的属性? - &GT;然后,使用@ PostConstruct 否则,你需要使用从其他视图传递的params吗? - &GT;然后,使用“ preRenderView