Jsf 每当Facelet页面加载时,在支持bean中运行代码块

Jsf 每当Facelet页面加载时,在支持bean中运行代码块,jsf,session,jsf-2,facelets,Jsf,Session,Jsf 2,Facelets,我正在使用JSF构建一个网站。我想在每次加载Facelet页面时运行一段代码,我需要使用会话范围支持bean。我尝试使用支持bean的构造函数来运行代码块,但它只是第一次运行,我使用了以下代码 <c:forEach var="p" items="#{statusBean.statusList}" varStatus="loop"> 由于statusBean是会话作用域,因此在加载页面时它第一次运行构造函数 当页面加载时,是否有其他替代

我正在使用JSF构建一个网站。我想在每次加载Facelet页面时运行一段代码,我需要使用会话范围支持bean。我尝试使用支持bean的构造函数来运行代码块,但它只是第一次运行,我使用了以下代码

<c:forEach var="p" items="#{statusBean.statusList}"
                        varStatus="loop">
由于statusBean是会话作用域,因此在加载页面时它第一次运行构造函数


当页面加载时,是否有其他替代方法来运行代码块,而不仅仅是第一次加载?

有不同的方法来实现这一点。首先,必须定义加载Facelets页面时的含义。我想你的意思是在页面呈现之前

预渲染视图事件

对于JSF2.x,最简单的方法是为PreRenderViewEvent创建一个系统事件监听器。为此,您首先需要在页面中添加一个f:event标记,如下所示:

<f:event type="javax.faces.event.PreRenderViewEvent"
    listener="#{bean.preRenderView}"/>
public void preRenderView(ComponentSystemEvent ev) {
    //Do something
}
@预渲染视图

如果将CDI与MyFaces CODI一起使用,只需使用@PreRenderView注释托管bean方法,就会在呈现页面之前调用该方法

查看操作

由于JSF2.2还不是最终版本,您可以使用视图操作在生命周期的不同阶段调用方法。有关详细信息,请参阅我的


您可以在my

中找到PreRenderViewEvent和view操作的示例。请注意,这些操作在视图生成时运行,而不是在视图渲染时运行。因此,预渲染视图事件太晚了。OP的最佳选择是将请求/视图范围的数据拆分为请求/视图范围的bean,并在其中注入会话范围的bean。@BalusC如果您能详细说明如何在请求/视图范围的bean中注入会话范围的bean,那将非常有帮助。或者更简单:扔掉c:forEach,改用ui:repeat-它是一个组件,并且在渲染时进行评估。@Amlan顺便说一句。也许您应该给我们一些您想要实现的细节。可能还有另一种更简单的方法。@Michi我试过使用ui:repeat,但遇到了一些问题。所以我试着切换到c:forEach。当前的问题是,无论我在哪里放置f:event,backingbean函数都没有运行。