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

何时应该使用f:viewActionpreRenderView事件初始化页面的数据,而不是使用@PostConstruct注释? 是基于支持bean的范围types使用一个或另一个的基本原理,例如,如果支持bean是@RequestScoped ,那么select在呈现之前使用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() { } } 

什么时候应该使用f:viewAction或preRenderView事件来初始化使用@PostConstruct注解的页面经文的数据?

如果要在呈现HTML之前执行方法,请使用<f:viewAction> 。 如果要在更新模型值阶段根据由<f:viewParam>设置的模型值执行操作,这一点尤其有用。 也就是说,@ @PostConstruct运行的时候不可用。 在JSF 2.0 / 2.1中,这个标签不存在,您必须使用preRenderView解决方法。

如果支持bean是@RequestScoped,他们有效地做同样的事情吗? (那么这是由开发人员的select?(@PostConstruct似乎“更清洁”)。

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

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

也可以看看:

  • 什么可以使用<f:元数据>,<f:viewParam>和<f:viewAction>?
  • ViewParam vs @ManagedProperty(value =“#{param.id}”)
  • 是否有可能在回发中禁用f:event type =“preRenderView”侦听器?

你是否需要初始化托pipebean的属性? – >然后,使用@ PostConstruct否则,你需要使用其他视图传递的参数吗? – >然后,使用“ preRenderView