100

什么时候应该使用f:viewActionorpreRenderView事件来初始化页面的数据而不是使用@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()
    {

    }
}
4

2 回答 2

124

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

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

如果支持 bean 是 @RequestScoped,它们是否有效地做同样的事情?(所以这取决于开发人员的选择?(@PostConstruct 似乎“更干净”)。

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

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

也可以看看:

于 2012-03-23T18:27:24.313 回答
1

您需要初始化托管 bean 的属性吗?--> 然后,使用@PostConstruct 否则,您需要使用从其他视图传递的参数吗?--> 然后,使用“ preRenderView

于 2015-07-31T09:54:15.623 回答