基本上,我需要在RENDER_RESPONSE阶段之后调用一个方法。我试过这个:
<f:phaseListener type="com.examples.MyPhaseListener"/>
即使是ajax调用,上面的监听器也一直在监听。我试过了
rendered="#{!facesContext.postback}"
但我猜这不适用于此。所以我尝试了这篇文章Is it possible to disable f:event type="preRenderView" listener on postback?中提到的:
public void beforePhase(PhaseEvent pe) {
if (!FacesContext.getCurrentInstance().isPostback()) {
//do nothing
}
}
public void afterPhase(PhaseEvent pe) {
if (!FacesContext.getCurrentInstance().isPostback()) {
if (pe.getPhaseId() == PhaseId.RENDER_RESPONSE) {
//call a method
}
}
}
它正在工作但是在初始响应之后还有其他方法来禁用侦听器吗? 我也试过preRenderComponent,但它在RENDER_RESPONSE阶段之前被调用,看起来它不会呈现响应,直到该方法超出堆栈(基本上它不是异步)。所以我觉得与在PostConstruct中调用它们相比,像preRenderView和preRenderComponent这样的SystemEvents没有太多优势。
答案 0 :(得分:3)
实现功能需求并没有其他方法。 Filter
其中您在 chain.doFilter(request, response)
调用之后执行工作也应该有效,但是这不会让您访问faces上下文(尽管有很多JSF特定数据)也可以通过标准的Servlet API获得。
至于你的阶段监听器,如果你需要让它只监听渲染响应 ,那么添加
public PhaseId getPhaseId() {
return PhaseId.RENDER_RESPONSE;
}
这样您就不需要检查侦听器方法中的当前阶段。
public void afterPhase(PhaseEvent event) {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
在即将推出的JSF 2.2中,将会有一个新标签,它可以理解isPostback()
,<f:viewAction>
:
<f:viewAction action="#{bean.action}" onPostback="false" />
但是,它仅在调用操作阶段运行。