阶段监听器只有在没有回发的情况下才能监听

时间:2012-03-15 21:56:18

标签: jsf primefaces

基本上,我需要在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没有太多优势。

1 个答案:

答案 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" />

但是,它仅在调用操作阶段运行。