2012-03-15 80 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