2012-10-18 69 views
21

就在我以爲我已經明白了眼前...... *嘆息*嘗試當它不應該

考慮下面的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後,唯一不同的是它會發生但是,這不會發生。相反,感覺網站仍然會跳過所有剩餘的階段,輸入字段沒有被觸摸。它重新渲染沒有錯誤信息。

有人可以向我解釋我對這種工作方式的理解在哪裏嗎?

+0

其中剩餘階段?在調用動作階段之後只有一個剩餘階段:渲染響應階段。除了呈現迴應之外,你預期會發生什麼?相關:http://balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html – BalusC

+0

那麼,在InvokeActions期間不會調用直接按鈕的操作,而是在ApplyRequestValues的末尾調用,對嗎?所以如果它不影響正常流程,應該仍然有ProcessValidations,UpdateModel和InvokeActions? – Louise

+0

我明白你的意思了。我發佈了一個答案。 – BalusC

回答

30

對於按鈕上的immediate="true",該動作確實在應用請求值階段被調用,並且所有其餘階段被跳過。這也是該屬性的唯一要點:在應用請求值階段期間立即處理(解碼,驗證,更新和調用)組件。

所有的輸入做不是immediate="true"無論如何都被忽略。只有具有immediate="true"的輸入也被處理,但是在應用請求值階段也會發生這種情況。爲什麼如果在應用請求值階段中已經發生了所有事情,就應該調用剩下的階段?

Debug JSF lifecycle文章中,你可以找到下面的總結應該開導到(不)使用時immediate"true"

好吧,當我應該使用immediate屬性?

如果它是不完全清楚的是,這裏有一個總結,完全與現實世界中使用的例子時,他們可能是有益的:如果UIInput(S)止,處理驗證階段將設置

  • 而是在應用請求值階段發生。使用這個來優先確認UIInput組件的驗證。當任何一個驗證/轉換失敗時,非直接組件將不會被驗證/轉換。

  • 如果僅在UICommand中設置,則對於任何UIInput組件,都會跳過應用請求值階段,直到更新模型值階段將被跳過。使用它來跳過表單的整個處理。例如。 「取消」或「返回」按鈕。

  • 如果兩個UIInputUICommand部件設置,所述應用請求值階段,直到與更新模型值相將被跳過對任何UIInput成分(S),其不具有此屬性集。使用它來跳過對整個表單的處理,期望某些字段(立即)。例如。登錄表單中的「忘記密碼」按鈕,並帶有必需的但不是即時的密碼字段。

參見:

+0

我使用引用鏈接來源更新了問題。如果我錯了,請糾正我,但他們的描述和你的描述給出了一個不同的畫面 - 與你的實際行爲相匹配。他們的有點錯誤嗎? – Louise

+1

顯然,MyFaces中存在一篇文章作者觀察爲正確行爲的錯誤。 – BalusC

+0

[jsf 2.2規範](https://jcp.org/en/jsr/detail?id=344)的2.5.1部分超級可讀,支持BalusC的出色說明。 – djeikyb