JSF在页面加载之前调用bean方法

时间:2014-01-05 16:06:10

标签: jsf

我必须在我的bean上调用init方法作为页面加载的第一个操作,我试图在页面的最开头简单地调用#{bean.init},但我看到{{1} }测试在<c:if>之前执行。我有类似

的东西
init()

并在#{bean.init} <c:if test="#{bean.conditionsCheck}">...</c:if> 之前调用conditionsCheck()方法, 我该如何修复它并首先调用init()

3 个答案:

答案 0 :(得分:6)

您可以使用@PostConstruct注释自动调用init方法:

@PostConstruct
public void init() {
  // do something
}

构造bean后会自动调用此方法。

您的解决方案看起来更像f:event type="preRenderView",但无法使用此解决方案,因为c:if标记在视图构建期间进行评估,而f:event( (分别是您的解决方案)在呈现响应阶段呈现视图之前运行。请查看this questionthis 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>