我正在使用JSF建立一个网站。我想在每次加载Facelet页面时运行一段代码,我需要使用会话作用域支持bean。我尝试使用后台bean的构造函数来运行代码块,但它只运行第一次,我使用以下代码
<c:forEach var="p" items="#{statusBean.statusList}"
varStatus="loop">
由于statusBean
是会话作用域,它在加载页面时第一次运行构造函数。
当页面加载时,是否有其他方法可以运行代码块,而不仅仅是第一次?
有不同的方法来实现这一点。首先,你必须定义"当Facelets页面加载时"是什么意思。我想你的意思是在页面呈现之前。
PreRenderViewEvent
使用JSF 2。最简单的方法是为PreRenderViewEvent
设置系统事件侦听器。为此,您首先需要在页面中添加f:event
标签,如下所示:
<f:event type="javax.faces.event.PreRenderViewEvent"
listener="#{bean.preRenderView}"/>
PreRenderViewEvent
的监听器必须在视图根(f:view
)上注册。因此,如果不使用f:view
, f:event
必须是f:view
的直接子级或某个顶级级。对于模板,f:event
必须放在ui:define
中,以保证相同的效果。
在呈现视图之前调用listener
属性中引用的侦听器方法。该方法可能如下所示:
public void preRenderView(ComponentSystemEvent ev) {
//Do something
}
@PreRenderView
如果您使用CDI与MyFaces CODI,您可以简单地用@PreRenderView
注释一个托管bean方法,它将在页面呈现之前被调用。
视图操作
在JSF 2.2(尚未最终确定)中,您可以在生命周期的不同阶段使用视图操作来调用方法。有关详细信息,请参阅我关于JSF 2.2视图操作的JSFlive帖子。
您可以在我的GitHub存储库
PreRenderViewEvent
和查看动作的示例。