2011-12-19 73 views
4

我有一個由NewsBean.java支持的JSF頁面,它有<f:event type="preRenderComponent" listener="#{newsBean.init}" />作爲bean初始值設定項。執行f:ajax時總是調用JSF2 preRenderComponent

頁面底部有一個按鈕,用於發送評論: <f:ajax event="click" execute="@form" render="@form" listener="#{newsBean.sendComment}" />並且被<h:form>包圍。點擊按鈕時,始終調用NewsBean.init()

我的bean作用域是視圖。這是一個有效的行爲(始終調用init())?我怎樣才能防止總是打電話init()

回答

9

A preRender監聽器總是在預渲染事件上調用,而不管它是初始請求還是回發請求。每個請求都有一個呈現響應階段,無論它是普通請求還是ajax請求。所以這個行爲是通過規範。如果是回發請求,您需要通過檢查FacesContext#isPostback()來檢查偵聽器方法。

public void sendComment() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // ... 
    } 
} 

<f:event type="preRenderXxx">(其中Xxx可以ViewComponent)是由在本質上的方式「的解決方法的方法」爲能夠調用豆動作方法功能需求之後的視圖參數被處理上最初的請求。在即將到來的JSF 2.2新<f:viewAction>標籤將被引入intented應該做的正是這項工作:

<f:viewAction action="#{newsBean.sendComment}" /> 

此標籤支持的onPostback屬性,它已經默認爲false

<f:viewAction action="#{newsBean.sendComment}" onPostback="false" /> 

JSF 2.2會將於2012年第一季度發佈。目前JSF 2.2的快照版本已經上市。

+0

感謝BalusC。一如既往的完美答案。 – Mohsen 2011-12-20 06:58:07

0

我想你的<f:event>標籤放在<h:form>標籤內。因此,當您單擊ajax按鈕時,它會重新呈現整個組件,導致再次觸發preRenderComponent事件。

我認爲你應該使用的是PreRenderViewEvent

相關問題