就在我以爲我已經明白了眼前...... *嘆息*嘗試當它不應該
考慮下面的JSF頁面瞭解即時=「真正的」跳過輸入:
<h:inputText value="#{testBean.text}" required="true" />
<h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" />
<h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br />
<h:outputText value="#{testBean.didSomething}" />
而且支持bean:
public class TestBean {
private String didSomething = "Nothing done yet";
// + getter
public void doFoo() {
didSomething = "Did foo!";
}
public void doBar() {
didSomething = "Did bar!";
}
從我所瞭解即時我希望以下內容:
當試圖在沒有爲輸入字段提供值的情況下執行foo時,該動作從不執行,因爲在
processValidationsPhase
期間發生錯誤,導致在該階段之後直接重新呈現頁面並顯示錯誤消息。didSomething
的值保持不變。 (這按預期工作)當試圖在輸入字段沒有提供值的情況下執行操作時,由於immediate屬性,該操作在
applyRequestValuesPhase
期間執行。變量didSomething
已更改。 (這工作正常)
在接下來會發生什麼,this description狀態:
「返回null值(action方法的結果)將導致處理正常繼續,即非直接組件被驗證,然後執行update-model(如果沒有發生驗證錯誤)。對於返回void的動作監聽器方法,如果不需要正常流,則需要調用facesContext.renderResponse()。
從這個我有這樣的處理繼續,正常的想法(因爲我的操作方法既不返回的結果也不力renderResponse()
),導致同樣的驗證錯誤。設置爲didSomething
後,唯一不同的是它會發生。 但是,這不會發生。相反,感覺網站仍然會跳過所有剩餘的階段,輸入字段沒有被觸摸。它重新渲染沒有錯誤信息。
有人可以向我解釋我對這種工作方式的理解在哪裏嗎?
其中剩餘階段?在調用動作階段之後只有一個剩餘階段:渲染響應階段。除了呈現迴應之外,你預期會發生什麼?相關:http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html – BalusC
那麼,在InvokeActions期間不會調用直接按鈕的操作,而是在ApplyRequestValues的末尾調用,對嗎?所以如果它不影響正常流程,應該仍然有ProcessValidations,UpdateModel和InvokeActions? – Louise
我明白你的意思了。我發佈了一個答案。 – BalusC