入口:FacesServlet 初始化創建 FacesContextFactory 與 Lifecycle。請求到達時獲取 FacesContext (ThreadLocal),委派 Lifecycle.execute() (階段 1-5) 與 Lifecycle.render() (階段 6)。
UIViewRoot),綁定 View State (隱藏字段/Session)。decode()),佇列事件。處理事件。validate()),轉換器 (convert()),失敗則直接跳轉階段 6。處理事件。setValue())。處理事件。encodeBegin/End/Children()),保存 View State。/ajax/*) 處理 AJAX 請求,繞過 FacesServlet。FacesContext.responseComplete() 短路生命週期,直接輸出局部更新片段。PhaseListener,afterPhase(PhaseId.RESTORE_VIEW) 判斷是否 AJAX 請求 (Header/參數標識)。responseComplete() 終止後續階段。Lifecycle 實現僅包含 3 個階段。FacesServlet 的分發 Servlet 根據 URL 映射決定使用標準或精簡 Lifecycle。| 維度 | 模式一 | 模式二 | 模式三 | 模式四 |
|---|---|---|---|---|
| 開發者體驗 | 需寫 JS | 零 JS | 零 JS (配置式) | 零 JS (配置式) |
| 組件復用性 | 極低 | 高 | 中 (依賴框架支援) | 中 |
| 實現複雜度 | 低 | 高 (組件作者) | 中 (框架擴展) | 高 (架構級) |
| 生命週期控制 | 完全繞過 | 階段 2 後短路 | 階段 1 後短路 | 精簡專用週期 |
| 推薦場景 | 極簡頁面、legacy 整合 | Rich Component 庫開發 | 現代 JSF 應用 (PrimeFaces/OmniFaces 模式) | 高性能專用端點、Comet/Long-polling |
主流組件庫 (PrimeFaces, RichFaces, ICEfaces) 均採用 模式三增強版:
<f:ajax> 標準標籤聲明式配置 (JSF 2.0+)。PartialViewContext API 程序化控制局部渲染 (getRenderIds(), getExecuteIds())。PhaseListener 自動識別 AJAX 請求 (javax.faces.partial.ajax=true Header)。@all, @form, @this 關鍵字簡化組件 ID 指定。JSF 組件化本質決定了 AJAX 整合必須圍繞組件樹生命週期展開。 理解六大階段與
responseComplete()短路機制,是診斷 AJAX 亂序、狀態丟失、驗證跳過等疑難雜症的鑰匙。