http://docs.oracle.com/javaee/6/tutorial/doc/docinfo.html html
查看其中 Part II Web tier --> javaserver faces technology --> advance concepts (高級概念) java
前言:充分理解JSF生命週期對於JSF開發意義重大 服務器
發現網上有了官方的對應翻譯 直接拿了用了(生命週期圖換成了官方的) 架構
JSF是一個Web應用,也會遵循請求/相應的架構,與JSP的生命週期徹底類似:客戶端發送一個HTTP請求,服務器端對請求進行處理以後,向客戶端送回HTTP響應,整個JSP生命週期完成。JSF將請求/響應的生命週期細化爲更多階段,從而支持更加複雜的UI組件模型。 oracle
當客戶端向某個JSF頁面發送請求時,例如單擊了某個超連接或者按鈕時,JSF就開始恢復視圖階段。
在這個階段,JSF將會爲該頁面建立對應的視圖,並將事件監聽器、輸入校驗器等鏈接到頁面所包含的UI組件上,使用FacesContext實例來保存視圖對象。此時,應用相關的全部組件,包括UI,事件處理器,轉換器和輸入校驗器均可以訪問到該FacesContext實例。 spa
若是是初始請求:JSF將在該階段建立一個新的視圖對象,並將生命週期階段直接推動到生產響應階段。
若是是提交表單:則對應該頁面的視圖已經存在,JSF將會採用客戶端或服務器端的信息來恢復視圖。 翻譯
當視圖恢復完成後,每一個組件都會調用它的decode方法從請求參數中提取新的參數值,並保存在本地組件上(保存以前須要先進行類型轉換,若是值轉換失敗,JSF將會使用FacesContext來保存與組件相關的錯誤消息,並將消息放入消息對了中,這些消息將會等到輸出響應階段幾種處理)。 code
若是任何組件的decode方法或者事件監聽器調用了FacesContext的renderResponse方法,那麼JSF將會直接推動到生成響應階段。 server
若是頁面的某個組件設置了immediate="true",這個階段還會處理這些組件相關的驗證、轉換和事件等。 htm
在這個階段,應用能夠重定向到其餘資源,或者生成一個不包含Java Server Faces組件的響應,若是須要實現這種處理,開發者必須調用Facescontext。responseComplete來跳過生成響應階段。
這個階段結束後,全部組件都被設置成了他們的新值,全部消息和事件都被放入隊列。
處理UI組件註冊的輸入校驗器,JSF會用各UI組件上的本地值和對應輸入校驗規則進行比較,若是本地值無效,JSF就會把對應的錯誤消息添加到FacesContext實例中,而JSF的生命週期也將直接推動到生成響應階段,顯示頁面能夠經過<h:message>或者<h:messages>來顯示輸入校驗的錯誤信息。
在這個階段中,任何validator方法和事件監聽器調用了當前的FacesContext實例的renderResponse方法,那麼應用的生命週期將會直接推動到生成響應階段。
若是須要在該階段重定向到其餘資源,或者生成一個不包含Java Server Faces組件的響應,開發者能夠調用FacesContext.responseComplete來跳轉到生成響應階段。
經過了輸入校驗以後,使用UI組件的本地值更新與之綁定的託管Bean(將用戶輸入的數據傳送給服務器端的託管Bean),JSF只會更新綁定到輸入組件的託管Bean。
若是沒法更新,則會生成錯誤信息,生命週期直接推動到生成響應階段,能夠採用<h:message>或<h:messages>來顯示錯誤信息。
在這個階段中,若是任何updateModels方法或事件監聽器調用了當前FacesContext實例的renderResponse方法,生命週期將會直接推動到生成響應階段。
若是須要在該階段重定向到其餘資源,或者生成一個不包含Java Server Faces組件的響應,開發者能夠調用FacesContext.responseComplete來跳轉到生成響應階段。
在這個階段中,JSF將會處理應用級別的事件,例如提交表單或連接到其餘頁面。
若是須要在該階段重定向到其餘資源,或者生成一個不包含Java Server Faces組件的響應,開發者能夠調用FacesContext.responseComplete來跳轉到生成響應階段。
在這個階段中,應用準備想客戶度輸出響應,若是使用了JSP頁面,JSF將調用JSP容器來處理響應。若是是初始請求,頁面上的組件將被JSP容器添加到組件樹中;若是不是初始請求,那麼全部組件都已被添加到組件樹中,所以不須要再次添加。
若是在提交表單階段,而且在應用請求值階段、處理階段或更新模型階段遇到了錯誤,應用將會選擇生成最初的頁面。
生成響應後,應用的響應狀態也被保存下來。
JSF提供了PhaseId類來表明生命週期階段,本質上是一個枚舉類,經常使用的常量:
http://docs.oracle.com/javaee/6/tutorial/doc/bnaqq.html#glprc