JSF getter方法称为BEFORE beforePhase触发

时间:2010-04-22 15:48:26

标签: java jsf

我建议将所有数据查找放在给定页面的beforePhase中,但是,现在我正在进行更深入的分析,似乎在beforePhase被触发之前调用了一些getter方法。

当我添加对url参数的支持并且我在onPhase调用中初始化的对象上获得NPE时,这变得非常明显。

有什么想法?我设置错了。

我在JSP页面中有这个:

<f:view beforePhase="#{someController.beforePhaseSummary}">

这只是JSP文件中的第5行,就在taglibs之后。

以下是beforePhaseSummary方法中的代码:

public void beforePhaseSummary(PhaseEvent event) {
    logger.debug("Fired Before Phase Summary: " + event.getPhaseId());
    if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
        HttpServletRequest request = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
        if (request.getParameter("application_id") != null) {
            loadApplication(Long.parseLong(request.getParameter("application_id")));
        }
        /* Do data fetches here */
    } 
}

上面的日志记录输出表示触发了一个事件。 servlet请求用于捕获url参数。数据提取收集数据。但是,日志记录输出如下:

2010-04-23 13:44:46,968 [http-8080-4] DEBUG ...SomeController 61 - Get Permit
2010-04-23 13:44:46,968 [http-8080-4] DEBUG ...SomeController 107 - Getting UnsubmittedCount
2010-04-23 13:44:46,984 [http-8080-4] DEBUG ...SomeController 61 - Get Permit
2010-04-23 13:44:47,031 [http-8080-4] DEBUG ...SomeController 133 - Fired Before Phase Summary: RENDER_RESPONSE(6)

日志表示在触发beforePhase之前有2次调用getPermit方法,另一次调用getUnsubmittedCount。

1 个答案:

答案 0 :(得分:0)

想出来了。如果将JSTL混合到页面中,那些方法可能会在调用JSF方法之前触发。我有类似的方法:

<c:if test="${someController.logic == true}">
    <p>Some Text</p>
</c:if>

someController.logic调用在someController.beforePhase调用之前触发。

我用

替换了上面的内容
<h:outputText rendered="#{someController.logic == true}">
    <p>Some Text</p>
</h:outputText>

现在事情以正确的顺序发射。我还发现我的应用程序中的其他页面在将JSTL与JSF混合时会产生奇怪的结果。所以我现在正在从应用程序中驱逐JSTL。