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

JSF 請求處理生命週期(一):FacesServlet 初始化與核心組件架構

     編輯:Java 相關知識

切入點:web.xml 中的 FacesServlet

JSF 應用在 web.xml 宣告 javax.faces.webapp.FacesServlet,所有 JSF 請求由此進入。原始碼來自 Mojarra 專案(JSF RI),包含 jsf-api(介面、規格)與 jsf-ri(com.sun.faces 實現)兩模組。

初始化核心任務:init() 方法

public void init(ServletConfig config) {
    // 1. 取得 FacesContextFactory 實現
    facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(
        FactoryFinder.FACES_CONTEXT_FACTORY);

    // 2. 取得 LifecycleFactory 再獲取預設 Lifecycle
    LifecycleFactory lf = (LifecycleFactory) FactoryFinder.getFactory(
        FactoryFinder.LIFECYCLE_FACTORY);
    lifecycle = lf.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
}

FactoryFinder 依據配置(META-INF/services/、faces-config.xml、系統屬性)動態載入實現類,實現「規格與實現分離」。

兩大核心組件角色隱喻

組件介面實現類角色隱喻
FacesContextFactoryjavax.faces.context.FacesContextFactorycom.sun.faces.context.FacesContextFactoryImpl請求包裝工廠:將 ServletRequest/Response 包裝為 FacesContext
Lifecyclejavax.faces.lifecycle.Lifecyclecom.sun.faces.lifecycle.LifecycleImpl過濾器鏈:定義請求處理的 6 大階段流程

請求處理宏觀流程預覽

  1. 請求到達 FacesServlet.service()。
  2. 工廠包裝請求 → FacesContext(含 ExternalContext 隔離 Servlet API)。
  3. FacesContext 通過 Lifecycle 階段鏈處理:execute()(邏輯 5 階段)→ render()(渲染 1 階段)。
  4. 回應輸出至客戶端。

關鍵設計亮點

  • 環境中立:ExternalContext 抽象化 Servlet/Portlet 環境差異。
  • 可擴展性:FactoryFinder 機制允許替換工廠、生命週期、RenderKit 等核心組件。
  • 執行緒安全:FacesContext 綁定於 ThreadLocal,每請求獨立。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved