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

Jsf 何时使用f:viewAction/preRenderView与PostConstruct?,jsf,jsf-2,postconstruct,prerenderview,viewaction,Jsf,Jsf 2,Postconstruct,Prerenderview,Viewaction,与使用@PostConstruct注释相比,何时应该使用f:viewAction或preRenderView事件初始化页面数据?是否基于支持bean的作用域类型(例如,如果支持bean是@RequestScoped),使用一个或另一个的理由,那么,在呈现视图之前使用f:viewAction或preRenderView而不是@PostConstruct来初始化支持bean的选择是否不相关,因为这两种方法会产生相同的效果 f:viewAction或preRenderView <f:metada

与使用
@PostConstruct
注释相比,何时应该使用
f:viewAction
preRenderView
事件初始化页面数据?是否基于支持bean的作用域类型(例如,如果支持bean是
@RequestScoped
),使用一个或另一个的理由,那么,在呈现视图之前使用
f:viewAction
preRenderView
而不是
@PostConstruct
来初始化支持bean的选择是否不相关,因为这两种方法会产生相同的效果

f:viewAction或preRenderView

<f:metadata>
  <f:viewAction action="#{myBean.initialize}" />
</f:metadata>
何时应该使用f:viewAction或preRenderView事件来初始化使用@PostConstruct注释的页面的数据

如果要在呈现HTML之前执行方法,请使用
。如果要在更新模型值阶段根据
设置的模型值执行操作,这一点特别有用。也就是说,它们在
@PostConstruct
运行时不可用。在JSF2.0/2.1中,这个标签不存在,您必须使用
preRenderView
解决方法

如果支持bean是@RequestScope的,那么它们是否有效地执行了完全相同的操作?(因此,这取决于开发人员的选择?(@PostConstruct似乎“更干净”)

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

总之,如果您想在bean的构造过程中对由
@EJB
@Inject
@ManagedProperty
等设置的注入依赖项和托管属性执行操作,请使用
@PostConstruct
。如果您还想对由
设置的属性执行操作,请使用
在JSF 2.0/2.1上,使用
preRenderView
而不是
。如果需要,您可以在
FacesContext\isPostback()
上添加一个复选框,以便仅在初始请求时执行
preRenderView
操作

另见:

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

谢谢。很抱歉,在您编写响应时,我编辑了我的原始问题……我提到了bean范围,因为如果bean是会话范围的(在第一次创建bean时),则只会调用@PostConstruct一次但是每次访问页面时都会调用preRenderView。或者我弄错了吗?是的,这是正确的。preRenderView事件在调用操作阶段调用。post构造在bean构造之后调用。会话范围的bean不是在每个HTTP请求上构造的。我想知道我的my方法是在aja期间被调用的x请求。isPostBack()调用节省了时间!!为了完整起见,我们应该提到:“对于HTTP请求参数,它基本上类似于
,但主要的区别是,注入的参数在
@PostConstruct
期间直接可用,从而允许更简单的处理方式,而不需要视图中的
。”
<f:metadata>
  <f:event type="preRenderView" listener="#{myBean.initialize}"/>
</f:metadata>
public class MyBean
{
    @PostConstruct
    public void initialize()
    {

    }
}