JSF生命週期
JSF(JavaServer Faces)應用程序框架的簡單程序是自動管理生命週期階段,並允許您手動管理。JSF(JavaServer Faces)應用程序的生命週期從客戶端對頁面發出HTTP請求時開始,並在服務器響應頁面時結束。
JSF生命週期分爲兩個主要階段:
- 執行階段
- 渲染階段
1. 執行階段
在執行階段,當第一次請求時,構建或恢復應用程序視圖。 對於其他後續請求,執行其他操作,如應用請求參數值,對組件值執行轉換和驗證,受託管的bean
將使用組件值進行更新,並調用應用程序邏輯。
執行階段被進一步分成以下子階段。
- 恢復視圖階段
- 應用請求值階段
- 流程驗證階段
- 更新模型值階段
- 調用應用階段
- 渲染響應階段
恢復視圖階段
當客戶端請求一個JavaServer Faces頁面時,JavaServer Faces實現開始恢復視圖階段。 在此階段,JSF將視圖中的組件構建爲請求頁面,線性事件處理程序和驗證器的視圖,並將視圖保存在FacesContext實例中。
如果對該頁面的請求是回發,那麼與該頁面相對應的視圖已經存在於FacesContext實例中。 在此階段,JavaServer Faces實現通過使用保存在客戶端或服務器上的狀態信息來還原視圖。
應用請求值階段
在此階段,在回發請求期間恢復組件樹。 組件樹是表單元素的集合。樹中的每個組件通過使用其decode(processDecodes())
方法從請求參數中提取其新值。 之後,該值將本地存儲在每個組件上。
- 如果任何解碼方法或事件偵聽器在當前FacesContext實例上調用了renderResponse方法,則JavaServer Faces實現將跳過「渲染響應」階段。
- 如果任何事件在此階段已排隊,則JavaServer Faces實現將事件廣播到有興趣的監聽器。
- 如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用
FacesContext.responseComplete()
方法。 - 如果當前請求被識別爲部分請求,則從FacesContext檢索部分上下文,並應用部分處理方法。
流程驗證階段
在此階段,JavaServer Faces通過使用其validate()
方法來處理在組件上註冊的所有驗證器。 它檢查指定驗證規則的組件屬性,並將這些規則與爲組件存儲的本地值進行比較。 JavaServer Faces還完成了沒有將immediate
屬性設置爲true
的輸入組件的轉換。
- 如果任何驗證方法或事件偵聽器在當前FacesContext上調用了
renderResponse
方法,則JavaServer Faces實現將跳過「渲染響應」階段。 - 如果應用程序需要重定向到不同的Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用
FacesContext.responseComplete
方法。 - 如果事件在此階段已排隊,則JavaServer Faces實現將它們廣播給有興趣的監聽器。
- 如果當前請求被識別爲部分請求,則從FacesContext檢索部分上下文,並應用部分處理方法。
更新模型值階段
確保數據有效後,它遍歷組件樹,並將相應的服務器端對象屬性設置爲組件的本地值。 JavaServer Faces實現只更新輸入組件的value
屬性指向bean
屬性。 如果本地數據無法轉換爲bean
屬性指定的類型,生命週期將直接前進到「渲染響應」階段,以便重新呈現頁面並顯示錯誤。
- 如果任何updateModels方法或任何監聽器在當前FacesContext實例上調用了
renderResponse()
方法,則JavaServer Faces實現將跳過「渲染響應」階段。 - 如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JavaServer Faces組件的響應,則可以調用
FacesContext.responseComplete()
方法。 - 如果任何事件在此階段已排隊,JavaServer Faces實現將它們廣播到有興趣的監聽器。
- 如果當前請求被識別爲部分請求,則從FacesContext檢索部分上下文,並應用部分處理方法。
調用應用階段
在此階段,JSF處理應用程序級事件,例如提交表單或鏈接到另一個頁面。
現在,如果應用程序需要重定向到其他Web應用程序資源或生成不包含任何JSF組件的響應,則可以調用FacesContext.responseComplete()
方法。
之後,JavaServer Faces實現將控制轉移到「渲染響應」階段。
渲染響應階段
這是JSF生命週期的最後階段。 在此階段,JSF將構建視圖並將權限委託給相應的資源來呈現頁面。
- 如果這是初始請求,則頁面上表示的組件將被添加到組件樹中。
- 如果這不是初始請求,組件已經添加到樹中,不需要再添加。
- 如果請求是迴應,並且在應用請求值階段,過程驗證階段或更新模型值階段期間遇到錯誤,則在此階段將再次呈現原始頁面。
如果頁面包含h:message
或h:messages
標籤,頁面上會顯示任何排隊的錯誤消息。
在渲染視圖的內容之後,保存響應的狀態,以便後續請求可以訪問它。 恢復視圖階段可以使用保存的狀態。
2. 渲染階段
在此階段,請求的視圖作爲對客戶端瀏覽器的響應。 視圖渲染是以HTML或XHTML生成輸出的過程。 所以,用戶可以在瀏覽器看到它。
在渲染過程中採取以下步驟。
- 當客戶端對
index.xhtml
網頁進行初始請求時,編譯應用程序。 - 應用程序在編譯後執行,併爲應用程序構建一個新的組件樹,並放置在FacesContext中。
- 使用由
EL
表達式表示的組件和與其關聯受託管bean
屬性填充組件樹。 - 基於組件樹。 建立了新的視圖。
- 該視圖作爲響應呈現給請求客戶端。
- 組件樹被自動銷燬。
- 在後續請求中,重新構建組件樹,並應用已保存的狀態。