JavaServer Faces 生命週期

每個呈現 JavaServer Pages (JSP) 頁面的 JavaServer Faces 要求都包含一個 JavaServer Faces 元件樹狀結構,也稱為視圖,它會經歷由各個階段組成的一段要求處理程序的生命週期。 要求處理程序生命週期的標準階段開始於建置還原視圖,之後是套用要求值、處理驗證、更新模型值,以及呼叫應用程式。


JavaServer Faces 生命週期的圖解
建置還原視圖
JavaServer Faces 元件樹狀結構用來建置和維護頁面的狀態和事件。 每個階段作業都會建置一次這個樹狀結構,當使用者返回頁面時會重複使用它。 在這個階段結束時,如果有前一個 Faces 回應產生的視圖之儲存配置,現行要求的 FacesContext 實例之根內容會反映這項配置。
套用要求值
要求處理程序生命週期的這個階段用途,是讓每個元件都有機會利用現行要求所包含的資訊(如參數、標頭和 Cookie)來更新它的現行值。
處理驗證
在建立這個要求的視圖時,每個元件可以登錄零或多個驗證器實例。 另外,元件類別本身也可以在它們的 validate() 方法中實作驗證邏輯。 在這個階段結束時,會完成所有配置的驗證。

失敗的驗證會呼叫現行要求的 FacesContext 實例之 addMessage() 方法,以在佇列中放入訊息,對應元件的有效內容會設為 false。 如果所呼叫的任何 validate() 方法呼叫了現行要求的 FacesContext 實例之 responseComplete(),就必須立即終止現行要求的生命週期處理程序。如果所呼叫的任何 validate() 方法呼叫了現行要求的 FacesContext 實例之 responseResponse(),就必須將控制權轉給要求處理程序生命週期的呈現回應階段。相同狀況也適用於處理放在佇列中的事件之事件接聽器。 如果沒有發生任何這些狀況,控制會繼續進入下個階段來更新模型值。

更新模型值
如果到了要求處理程序生命週期的這個階段,就表示根據所執行的驗證,送入要求的語意和語法都有效,元件樹狀結構中每個元件的區域值都已更新, 這時適合更新應用程式的模型資料,以準備執行佇列中的任何應用程式事件。
呼叫應用程式
如建置還原視圖時所述,如果從前一個要求儲存的狀態資訊來重新建構現行要求的視圖,JavaServer Faces 實作會確保在這個 Web 應用程式的應用程式物件上呼叫 getActionListener 而傳回的 ActionListener,都會藉由 restoreState() 方法而登錄在元件樹狀結構中的所有 UICommand 元件。
呈現回應
這個階段會同時完成兩件事:將回應呈現給用戶端,以及儲存回應狀態供後續要求的處理程序使用。 在單一階段同時處理兩項任務,是因為在 JSP 應用程式中呈現回應的行為,會使視圖建置成頁面呈現器。 因此,視圖的狀態在呈現給用戶端之前無法儲存。
事件處理
要求處理程序生命週期的若干階段可以將事件放入佇列中,比方說,藉由呼叫來源 UIComponent 實例的 queueEvent() 方法,或呼叫 FaceEvent 實例的 queue() 方法。 這時必須將放在佇列中的這些事件廣播給有此需求的所有事件接聽器。 執行廣播是呼叫現行元件樹根的 UIViewRoot 實例之適當生命週期管理方法(processDecodes()、processValidators()、processUpdates() 或 processApplication())的邊際作用。 每個放在佇列中的事件都是在來源 UIComponent 的 broadcast() 方法受到呼叫之後,擴播給登錄了要利用這個來源元件來處理指定事件類型的所有事件接聽器。 傳回的 Boolean 旗標表示這個事件是否完全處理好,以及 JavaServer Faces 實作能不能將它從事件佇列中移除。

在要求處理程序生命週期的現行階段中,事件接聽器也有可能造成必須將其他事件放入佇列來等待處理。 這些事件必須在佇列中所有原來事件都廣播好之後,但在生命週期管理方法傳回之前,依照它們放入佇列的次序來廣播。

請參閱 UIComponent.broadcast() 方法的 API 參考手冊,以瞭解詳細的功能需求。

相關概念
JavaServer Faces
相關工作
建立 Faces 應用程式 - 概觀
建立 Faces JSP 頁面
相關參考
Faces 元件參照
Faces 元件的屬性
讀者意見
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.