gpt4 book ai didi

jsf - 何时使用 f :viewAction/preRenderView versus PostConstruct?

转载 作者:行者123 更新时间:2023-12-02 12:04:51 25 4
gpt4 key购买 nike

什么时候应该使用 f:viewActionpreRenderView 事件来初始化页面数据,而不是使用 @PostConstruct 注释?是否根据支持 bean 的范围类型使用其中一种或另一种的基本原理,例如如果支持 bean 是 @RequestScoped,那么可以选择使用 f:viewActionpreRenderView 而不是 @PostConstruct在渲染 View 之前初始化支持 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()
{

}
}

最佳答案

When should one use the f:viewAction or preRenderView event to initialize data for a page verses using the @PostConstruct annotation?

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

If the backing bean is @RequestScoped, do they effectively do the exact same thing? (and so then it is up to developer choice? (@PostConstruct seems "cleaner").

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

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

另请参阅:

关于jsf - 何时使用 f :viewAction/preRenderView versus PostConstruct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9844526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com