我正在使用JSF构建一个网站。我想在每次加载Facelet页面时运行一个代码块,我需要使用会话范围备份bean。我尝试使用后台bean的构造函数来运行代码块,但它只是第一次运行,我使用了以下代码
<c:forEach var="p" items="#{statusBean.statusList}"
varStatus="loop">由于statusBean是会话作用域,所以它在加载页面时首次运行构造函数。
在页面加载时,是否还有其他选择来运行代码块,而不仅仅是第一次?
发布于 2013-04-11 20:12:37
要做到这一点,有不同的方法。首先,您必须用“Facelets页面加载时”来定义您的意思。我想你是说在页面呈现之前。
PreRenderViewEvent
使用JSF2.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
如果您在MyFaces CODI中使用CDI,您可以简单地用@PreRenderView注释托管bean方法,并且在呈现页面之前会调用它。
视图操作
使用JSF2.2(尚未最终确定),您可以使用视图操作在生命周期的不同阶段调用方法。有关细节,请参阅我的关于JSF2.2视图操作的JSFlive帖子。
您可以在我的PreRenderViewEvent中找到GitHub存储库的示例并查看操作
https://stackoverflow.com/questions/15948587
复制相似问题