[英]JSF2 preRenderComponent is called always when f:ajax is executed
我有一個由NewsBean.java支持的JSF頁面,其中<f:event type="preRenderComponent" listener="#{newsBean.init}" />
作為bean初始化程序。
頁面底部有一個按鈕,用於發送注釋: <f:ajax event="click" execute="@form" render="@form" listener="#{newsBean.sendComment}" />
和被<h:form>
包圍。 單擊按鈕時,始終會調用NewsBean.init()
。
我的bean范圍是視圖。 這是一個有效的行為(總是調用init())? 如何防止始終調用init()
?
無論是初始請求還是回發請求,都會在預呈現事件上調用preRender
偵聽器。 每個請求都有一個呈現響應階段,無論它是普通請求還是ajax請求。 所以這種行為是通過規范。 如果是回發請求,則需要通過檢查FacesContext#isPostback()
來檢查自己的偵聽器方法。
public void sendComment() {
if (!FacesContext.getCurrentInstance().isPostback()) {
// ...
}
}
<f:event type="preRenderXxx">
(其中Xxx
可以是View
或Component
)本質上是一種“變通方法”,用於在視圖參數被調用之后能夠調用bean動作方法的功能要求在初始請求中處理。 在即將推出的JSF 2.2中,將引入一個新的<f:viewAction>
標簽,它應該完全符合<f:viewAction>
的工作:
<f:viewAction action="#{newsBean.sendComment}" />
此標記支持onPostback
屬性,該屬性已默認為false
:
<f:viewAction action="#{newsBean.sendComment}" onPostback="false" />
JSF 2.2將於2012年第一季度發布.JSF 2.2的快照版本目前已經發布。
我想你的<f:event>
標簽放在<h:form>
標簽內。 因此,當您單擊ajax按鈕時,它會重新呈現整個<h:form>
組件,從而導致再次觸發preRenderComponent事件。
我認為你應該使用的是PreRenderViewEvent 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.