JSF 應用在 web.xml 宣告 javax.faces.webapp.FacesServlet,所有 JSF 請求由此進入。原始碼來自 Mojarra 專案(JSF RI),包含 jsf-api(介面、規格)與 jsf-ri(com.sun.faces 實現)兩模組。
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、系統屬性)動態載入實現類,實現「規格與實現分離」。
| 組件 | 介面 | 實現類 | 角色隱喻 |
|---|---|---|---|
| FacesContextFactory | javax.faces.context.FacesContextFactory | com.sun.faces.context.FacesContextFactoryImpl | 請求包裝工廠:將 ServletRequest/Response 包裝為 FacesContext |
| Lifecycle | javax.faces.lifecycle.Lifecycle | com.sun.faces.lifecycle.LifecycleImpl | 過濾器鏈:定義請求處理的 6 大階段流程 |
FacesServlet.service()。FacesContext(含 ExternalContext 隔離 Servlet API)。FacesContext 通過 Lifecycle 階段鏈處理:execute()(邏輯 5 階段)→ render()(渲染 1 階段)。ExternalContext 抽象化 Servlet/Portlet 環境差異。FactoryFinder 機制允許替換工廠、生命週期、RenderKit 等核心組件。FacesContext 綁定於 ThreadLocal,每請求獨立。