JSF的每個元件基本上都是可替換的,像是轉換器(Converter)、驗證器(Validator)、元件(Component)、繪製 器(Renderer)等等,每個元件都可以替換讓JSF在使用時更有彈性,但相對的所付出的就是元件組合時的複雜性,為此,最基本的,如果您打算自訂一 些 JSF元件,那麼您對於JSF處理請求的每個階段必須要有所瞭解。
下圖是JSF處理請求時的每個階段與簡單說明,起始狀態即使用者端發出請求時,終止狀態則相當於繪製器發出回應時:
扣除事件處理,JSF總共必須經過六個階段:
- 回復畫面(Restore View)
對於選擇的頁面如果是初次瀏覽則建立新的元件樹。如果是會話階段,會從使用者端或伺服器端的資料找尋資料以回復
每個元件的狀態並重建元件樹,如果不包括請求參數,則直接跳過接下來的階段直接繪製回應。
- 套用申請值(Apply Request Values)
每個元件嘗試從到來的請求中找尋自己的參數並更新元件值,在這邊會觸發ActionEvent,這個事件會被排
入佇列中,然後在喚起應用程式階段之後才會真正由事件處理者進行處理。
然而對於設定immeduate為true的命令(Commamnd)元件來說,會立即處理事件並跳過之後的階
段直接繪製回應,而對於設定immediate為true的輸入(Input)元件,會馬上進行轉換驗證並處理值變事件,之後跳過接下來的階段,直接繪製
回應。
- 執行驗證(Process Validations)
進行轉換與驗證處理,如果驗證錯誤,則會跳過之後的階段,直接繪製回應,結果是重新呼叫同一頁繪製結果。
- 更新模型值(Update Model Values)
更新每一個與元件綁定的backing bean或模型物件。
- 喚起應用程式(Invoke Application)
處理動作事件,並進行後端應用程式邏輯。
- 繪製回應(Render Response)
使用繪製器繪製頁面。
如果您只是要「使用」JSF,則您最基本的只需要知道「執行驗證」、「更新模型值」、與「喚起應用程式」這三個階段及中間的事件觸發,JSF參考實作將這 三個階段之外的其它階段之複雜性隱藏起來了,您不需要知道這幾個階段的處理細節。
然而如果您要自訂元件,則您還必須知道「回復畫面」、「套用請求值」與「繪製回應」這些階段是如何處理的,這幾個階段相當複雜,所幸的是您可以使用JSF 所提供的框架來進行元件自訂,JSF提供的框架已經很大程度上降低了元件製作的複雜性。
當然,即使JSF框架降低了複雜性,但實際上要處理JSF自訂元件還是很複雜的一件事,在嘗試開發自訂元件之前,您可以先搜尋一些網站,像是 Apache MyFaces,看看是不是 已經有相關類似的元件已經開發完成,省去您重新自訂元件的氣力。