1

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

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

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

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

4

1 回答 1

0

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

预渲染视图事件

对于 JSF 2.x,最简单的方法是为PreRenderViewEvent. 为此,您首先需要f:event在页面中添加一个标签,如下所示:

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

的监听器PreRenderViewEvent必须在视图根 ( f:view) 上注册。因此f:eventf:view如果您不使用f:view. with 模板f:event必须放在ui:define保证相同的 a 中。

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

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

@PreRenderView

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

查看操作

使用 JSF 2.2(尚未最终版本),您可以使用视图操作在生命周期的不同阶段调用方法。有关详细信息,请参阅我关于 JSF 2.2 查看操作的 JSFlive 帖子

您可以在我的GitHub 存储库中找到示例PreRenderViewEvent并查看操作

于 2013-04-11T20:12:37.190 回答