我建议将所有数据查找放在给定页面的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。
答案 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。