何时使用f:viewAction/preRenderView与PostConstruct



与使用@PostConstruct注释相比,什么时候应该使用f:viewActionpreRenderView事件初始化页面的数据?使用其中一个或另一个的理由是基于backingbean的作用域类型吗?例如,如果backingbean是@RequestScoped,那么在渲染视图之前使用f:viewActionpreRenderView而不是@PostConstruct来初始化backingbean是否无关紧要,因为两者会产生相同的效果?

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解决方法。

如果backingbean是@RequestScoped,它们是否有效地做了完全相同的事情?(所以这取决于开发人员的选择?(@PostConstruct看起来"更干净")

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

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

另请参阅:

  • 什么可以<f: 元数据>lt;f: viewParam>并且<f: viewAction>用于
  • ViewParam与@ManagedProperty(值="#{param.id}")
  • 是否可以禁用f:event-type=";preRenderView";回发时的侦听器

是否需要初始化托管bean的属性?-->然后,使用@PostConstruct否则,是否需要使用从其他视图传递的params?-->然后,使用"preRenderView"

相关内容

  • 没有找到相关文章

最新更新