2012-03-15 77 views
3

基本上,我需要在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中调用它们相比,SystemEvent没有像preRenderView和preRenderComponent那么多优点。

+0

“不是对Ajax的请求”,“不回发”是不一样的,你需要哪一种?另外,“异步”是什么意思? JSF是作为一个servlet实现的,所有的JSF代码假定它将在请求处理线程中运行,所以与JSF异步交互不是用途。 – meriton 2012-03-15 22:23:37

+0

你是什么意思“调用PostConstruct中的事件”? – meriton 2012-03-15 22:26:34

+2

Ajax请求隐式总是回发。但并非所有回发都必须是Ajax请求。 – BalusC 2012-03-15 22:30:55

回答

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

然而,仅在Invoke操作阶段运行。

+0

谢谢你的提示,我会ATLEAST用它来听上仅呈现响应和相位听众对我来说不是一个过滤器更好的选择。 – Ravi 2012-03-15 23:34:30

+0

不客气。 – BalusC 2012-03-15 23:35:20

+2

@BalusC你让JSF容易处理我非常感谢你所有的答案;) – YouYou 2013-11-19 11:43:45