我正在使用JSF来构建一个网站。我想在每次加载Facelet页面时运行一段代码,我需要使用会话范围支持bean。我尝试使用支持bean的构造函数来运行代码块,但它只是第一次运行,我使用以下代码
<c:forEach var="p" items="#{statusBean.statusList}"
varStatus="loop">
由于statusBean
是会话作用域,因此它在页面加载时第一次运行构造函数。
在页面加载时是否还有其他替代方法可以运行代码块,而不仅仅是第一次?
答案 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