每当加载Facelet页面时,在辅助bean中运行一段代码

时间:2013-04-11 12:17:52

标签: jsf session jsf-2 facelets

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

<c:forEach var="p" items="#{statusBean.statusList}"
                        varStatus="loop">

由于statusBean是会话作用域,因此它在页面加载时第一次运行构造函数。

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

1 个答案:

答案 0 :(得分:0)

有不同的方法来实现这一目标。首先,您必须定义“Facelets页面加载时”的含义。我假设你的意思是在页面呈现之前。

<强> PreRenderViewEvent

使用JSF 2.x,最简单的方法是PreRenderViewEvent的系统事件监听器。为此,您首先需要在页面中使用f:event标记,如下所示:

<f:event type="javax.faces.event.PreRenderViewEvent"
    listener="#{bean.preRenderView}"/>

PreRenderViewEvent的监听器必须在视图根(f:view)上注册。因此,如果您不使用f:event,则f:view必须是f:view或某个顶级域的直接孩子。模板f:event必须放在保证相同的ui:define内。

在呈现视图之前调用listener属性中引用的侦听器方法。该方法可能如下所示:

public void preRenderView(ComponentSystemEvent ev) {
    //Do something
}

<强> @PreRenderView

如果将CDI与MyFaces CODI一起使用,则可以使用@PreRenderView简单地注释托管bean方法,并在呈现页面之前调用它。

查看操作

使用JSF 2.2(尚未最终),您可以使用视图操作在生命周期的不同阶段调用方法。有关详细信息,请参阅我的JSFlive post on JSF 2.2 view actions

您可以找到PreRenderViewEvent的示例并查看我的GitHub repository

中的操作