天天看點

《Java EE 7精粹》—— 3.4 請求處理生命周期階段

本節書摘來異步社群《java ee 7精粹》一書中的第3章,第3.4節,作者:【美】arun gupta,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

jsf定義了标準的請求處理生命周期階段。應用程式開發人員并不需要知道生命周期的詳細資訊,但在某些情況下我們可以從中得到幫助,比如何時驗證,何時轉換,通常在何時處理事件,怎樣改變事件的處理方式和時間。

一個jsf頁面是由被稱為視圖的ui元件樹來表示的。當用戶端向該頁面發起請求時,開始一個生命周期。在生命周期中,jsf的實作必須建立視圖,同時考慮儲存此前送出頁面的狀态。當用戶端送出頁面時,jsf的實作必須執行一些任務,比如驗證視圖中元件的資料輸入,将輸入資料轉換為伺服器端指定的類型,并且将資料綁定到backing bean。jsf的實作為生命周期中的一系列步驟執行所有這些任務。

應用程式的不同元件經曆以下明确定義的請求處理生命周期階段。

恢複并建立一個伺服器端的元件樹表示來自用戶端的ui資訊。

如果是第一次向一個url發起請求,那麼建立一個新的視圖對象并呈現給用戶端。這個視圖同時存儲在目前facescontext執行個體中。如果已經在facescontext中發現視圖狀态,那麼視圖被恢複并顯示。

任何與ui元件連接配接的自定義的轉換器、驗證器和渲染器,在這個階段被恢複。如果ui元件的值被直接映射到一個托管bean定義的屬性,那麼該屬性的值将被恢複并與視圖相關聯。大部分的工作是由viewhandler.restoreview方法來處理的。

這個階段将使用來自用戶端的請求參數、請求頭資訊、cookie等更新伺服器端元件。

更具體地說,uicomponent.processdecodes方法被所有元件調用。這一階段可能結束于處理驗證階段或渲染響應階段。如果任何轉換或驗證失敗,則終止目前操作,控制直接轉到渲染響應階段,展示轉換或驗證的錯誤給用戶端。

這一階段将處理所有uicomponent已配置的驗證和資料類型轉換。

在這個階段中,uicomponent.processvalidators方法被所有元件調用。如果有任何轉換或驗證錯誤發生,那麼目前程序被終止,并且控制被引導到渲染響應階段報告發生的任何錯誤。

到達這個階段意味着請求值的文法是有效的。

uicomponent的值會與模型對象同步,模型對象通常是backing bean。在這個階段中,uicomponent.processupdates方法被所有元件調用。将請求值指派給模型對象,也可能會導緻排隊和觸發事件。

調用應用的邏輯并執行導航處理。

所有已注冊的uicomponent的監聽器被調用。例如,所有的動作元件(如指令按鈕或超連結)有預設的動作監聽器,會在這個階段被調用。

渲染響應并将其傳回給用戶端應用程式。

在渲染響應之前,應用程式通過調用uiviewroot.savestate方法在緩存中存儲視圖的狀态。