我必须在我的bean上调用init方法作为页面加载的第一个操作,我试图在页面的最开头简单地调用#{bean.init}
,但我看到{{1} }测试在<c:if>
之前执行。我有类似
init()
并在#{bean.init}
<c:if test="#{bean.conditionsCheck}">...</c:if>
之前调用conditionsCheck()
方法,
我该如何修复它并首先调用init()
?
答案 0 :(得分:6)
您可以使用@PostConstruct
注释自动调用init方法:
@PostConstruct
public void init() {
// do something
}
构造bean后会自动调用此方法。
您的解决方案看起来更像f:event
type="preRenderView"
,但无法使用此解决方案,因为c:if
标记在视图构建期间进行评估,而f:event
( (分别是您的解决方案)在呈现响应阶段呈现视图之前运行。请查看this question和this question以获取详细信息。
更新:正如您所评论的那样,您使用的是@SessionScoped
bean,其中@PostConstruct
每个会话只调用一次而不是每次加载页面。在这种情况下,另一种解决方案是将init
方法作为conditionsCheck
方法中的第一个语句调用(与使用假c:if
布尔init的建议几乎相同)。您也可以使用自定义PhaseListener
,但我想这个问题会有点过量。
另见:
答案 1 :(得分:0)
如果您添加像CommandButton
这样的JSF控件,并且在其值中将其写为:
value="#{sessionScopedBean.method()}"
只要加载此页面,就会调用此方法。
答案 2 :(得分:-1)
任何搜索的人......
我们可以使用scriptRollector标签的preRender,如果使用的JSF实现支持它,例如:
<scriptCollector id="scriptCollector1" preRender="#{bean.method}">
...
</scriptCollector>