首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

JSF 生命週期深度解析與 AJAX 整合四大模式

     編輯:J2EE

JSF 生命週期六大階段

入口:FacesServlet 初始化創建 FacesContextFactory 與 Lifecycle。請求到達時獲取 FacesContext (ThreadLocal),委派 Lifecycle.execute() (階段 1-5) 與 Lifecycle.render() (階段 6)。

  1. Restore View (恢復視圖): 建立/恢復組件樹 (UIViewRoot),綁定 View State (隱藏字段/Session)。
  2. Apply Request Values (應用請求值): 解碼請求參數賦值給組件 (decode()),佇列事件。處理事件。
  3. Process Validations (處理驗證): 執行驗證器 (validate()),轉換器 (convert()),失敗則直接跳轉階段 6。處理事件。
  4. Update Model Values (更新模型值): 驗證通過後,將組件值推送到 Backing Bean 屬性 (setValue())。處理事件。
  5. Invoke Application (調用應用): 執行 ActionListener/Action 方法 (業務邏輯、導航決策)。處理事件。
  6. Render Response (渲染響應): 編碼組件樹輸出 HTML (encodeBegin/End/Children()),保存 View State。

AJAX 與 JSF 生命週期整合四大模式

模式一:完全獨立的 Servlet/Filter (最自然、復用性最差)

  • 單獨映射 URL (如 /ajax/*) 處理 AJAX 請求,繞過 FacesServlet。
  • JSF 組件輸出 JS 代碼觸發請求。
  • 優點: 零侵入 JSF,邏輯隔離清晰。
  • 缺點: 頁面開發者需手寫 JS,組件無法封裝 AJAX 行為,復用性極低。

模式二:自定義組件內建 AJAX (組件級封裝、開發者無感)

  • 組件開發者在 Renderer 中輸出 JS 邏輯與回調渲染代碼。
  • 請求發送至特定 URL (可同 FacesServlet),在 Apply Request Values 階段結束後調用 FacesContext.responseComplete() 短路生命週期,直接輸出局部更新片段。
  • 優點: 頁面開發者零 JS,組件級復用。
  • 缺點: 組件開發複雜度高,需精準控制生命週期短路點。

模式三:PhaseListener 全局攔截短路 (最主流、非侵入式)

  • 實現 PhaseListener,afterPhase(PhaseId.RESTORE_VIEW) 判斷是否 AJAX 請求 (Header/參數標識)。
  • 若是,執行 AJAX 業務邏輯,調用 responseComplete() 終止後續階段。
  • 優點: 現有頁面/組件無需修改,集中式 AJAX 控制,靈活支援局部渲染/腳本執行。
  • 缺點: 需自行實現局部渲染機制 (如僅渲染特定組件樹子集),易與 JSF 狀態管理衝突。

模式四:自定義精簡 Lifecycle (三階段:Apply Request → Invoke App → Render)

  • 自定義 Lifecycle 實現僅包含 3 個階段。
  • 類 FacesServlet 的分發 Servlet 根據 URL 映射決定使用標準或精簡 Lifecycle。
  • 優點: 從根源精簡流程,效能最優,避免不必要的驗證/模型更新開銷。
  • 缺點: 架構侵入性強,需維護雙 Lifecycle 體系,狀態管理一致性難保障。

模式對比選型建議

維度模式一模式二模式三模式四
開發者體驗需寫 JS零 JS零 JS (配置式)零 JS (配置式)
組件復用性極低高中 (依賴框架支援)中
實現複雜度低高 (組件作者)中 (框架擴展)高 (架構級)
生命週期控制完全繞過階段 2 後短路階段 1 後短路精簡專用週期
推薦場景極簡頁面、legacy 整合Rich Component 庫開發現代 JSF 應用 (PrimeFaces/OmniFaces 模式)高性能專用端點、Comet/Long-polling

現代最佳實踐:PrimeFaces / OmniFaces / JSF 2.2+ 標準 AJAX

主流組件庫 (PrimeFaces, RichFaces, ICEfaces) 均採用 模式三增強版:

  • <f:ajax> 標準標籤聲明式配置 (JSF 2.0+)。
  • PartialViewContext API 程序化控制局部渲染 (getRenderIds(), getExecuteIds())。
  • 內建 PhaseListener 自動識別 AJAX 請求 (javax.faces.partial.ajax=true Header)。
  • 支援 @all, @form, @this 關鍵字簡化組件 ID 指定。
  • 回調 JavaScript (onstart/complete/success/error) 整合客戶端邏輯。

核心提示

JSF 組件化本質決定了 AJAX 整合必須圍繞組件樹生命週期展開。 理解六大階段與 responseComplete() 短路機制,是診斷 AJAX 亂序、狀態丟失、驗證跳過等疑難雜症的鑰匙。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved