作者主導 JSF + Seam 專案進入尾聲,提煉 15 條核心經驗,助後人少走彎路。
- 異常處理必裝 Seam:單純 JSF 異常追蹤極弱,Seam 加入 PhaseListener 後,全生命週期異常堆疊無保留輸出,甚至不用 Seam 功能也值得裝。附《Seam 無縫整合 JSF》三部曲參考。
- CSS 是靈魂:JSF 基於塊結構開發,關注內容結構而非樣式,符合 W3C 原意。善用 CSS 佈局,「JSF 不適合複雜頁面」謬論不攻自破。
- dataTable 是禍根:無特定行樣式、無回退按鈕風險方案、無優雅分頁、數據提交幻影問題。大量時間耗於 dataTable 融合。JSF 1.2 統一 EL 支援 JSTL `` 或成補充方案。
- 模型 Bean 與業務 Bean 合二為一:前端提交綁定模型同時完成業務封裝,交由服務層一氣呵成,消除服務層對 DTO 依賴,JSF 綁定機制完美支援。
- 大膽用 Converter:列表頁 radio 提交 int 值,展現層還原業務模型增加負擔。自定義 Converter 讓頁面見 int、提交見物件,服務層全程面向物件。
- 跨頁參數傳遞用 ``:MyFaces 組件極好用,建議傳遞模型物件而非數值,貫徹面向物件設計。
- Session 謹慎用,改用 Seam Conversation:JSF 過度依賴 Session,展現層確需有狀態簡化開發。Seam 長會話適合業務編輯,短會話填補 JSF 易丟失的短期數據。
- 調試神器:自定義 PhaseListener:想知數據在哪階段變化?繼承
PhaseListener 介面,任意階段斷點調試,無需把 JSF 源碼加入專案。
- 分頁方案:參考 blogJava 範例(dataTable values 直接用 DataModel),注意與 Seam `@DataModel` 不兼容,需用 getter 方式。
- 用 Ajax4JSF 必須用 Facelets:頁面須為標準 XHTML,別寫完才發現。
- dataTable 中用 radio/link 必加 `immediate=true`:未選 radio 也能觸發 link。務必用 `` 而非 ``/``,checkbox 同理。
- DoGet 請求用 ``:Seam 組件支援 GET 導航。
- 引入頁面必符合 JSF 渲染規則:無 Facelets 時,混合 HTML 會解析失敗。主頁面盡量用 JSF 標籤混合 HTML(每個 HTML 組件有 `rendered` 屬性),JSF 1.2 已將混合 HTML 作為 output 組件輸出,兼容性佳。關注點在組件與模型關係,非全頁皆須 JSF 標籤。
- 不要信 JSF 慢:樹形組件遞歸遍歷不代表慢,作者系統極快。慢是專案問題,非框架問題。
- 堅信 JSF 是下代表現層王者:信念決定成敗。