在 JSF 項目中首次使用 Facelets,最驚喜的是能創建可重用的復合組件——將一個頁面 (如 JSP) 直接變為組件。結論:不用 Facelets,就無法榨取 JSF 最大價值。
JSP 專注生成動態內容輸出,而 JSF 需 JSP 協調組件模型構建。任務超出 JSP 原設計,導致諸多彆扭。多數開發者只能一事一議打補丁,治標不治本。Facelets 是徹底解決方案:專為 JSF 組件生命周期量身定制的模板語言。
前兩者 (模板化、復合組件) 最關鍵,本文重點探討。
JSP 生成 Servlet,主體等價於 jspService();JSF 標籤調用組件渲染狀態,組件生命周期獨立於 Servlet 生命周期,這是混淆根源。
Facelets 模板直接構建組件樹而非 Servlet,允許將組件組合成新組件,實現更好復用。幾乎無需編寫自定義標籤即可使用 JSF 組件,只需在 Facelets 標籤庫文件聲明 JSF 組件即可直接使用。
提供針對組件構建的模板框架,支援熟悉的 JSTL 風格標籤與 EL 表達式,學習曲線極低。可定義組件集直接包含頁面或加入標籤庫,定義站點模板 (類 Tiles 但無定義文件)。甚至可在自定義 JSF 組件內部使用 Facelets,API 提供無縫整合接口。
示例應用:在線 CD 商店 (CRUD),含新增 CD 表單、音樂分類單選按鈕 (選擇觸發 JS 提交)、CD 列表排序。類圖展示領域模型。
遷移過程中,Facelets 以 <ui:composition>、<ui:decorate>、<ui:define> 等標籤實現模板繼承與組件復用,代碼量大幅減少,結構更清晰。
Facelets 從根本上解決了 JSP 與 JSF 生命周期衝突,將「視圖」提升為一等公民,讓組件化開發真正落地。對於追求可維護性、復用性的 JSF 團隊,遷移至 Facelets 是必經之路。