前言
GlassFish 作為開源應用服務器標桿,其管理控制台是展示 Java EE 技術棧的最佳窗口。本文整理自 InfoQ 對 GlassFish 核心提交者 Anissa 的深度專訪,揭示 JSF 在大型企業級控制台開發中的架構決策、工程實踐與性能優化心法。
一、為何選擇 JSF + JSFTemplating 作為核心框架
1. 組件化開發契合控制台場景
管理控制台包含大量復雜 UI 組件:文件選擇器、上傳組件、數據表格、麵包屑導航、屬性表單等。JSF 面向組件的模型天然適配此類「重組件、輕頁面」場景,開發者可像搭積木般組裝頁面。
2. JSF 1.2 缺失模板機制,JSFTemplating 彌補關鍵短板
JSF 1.2 無原生模板支持,導致頁面結構復用困難。JSFTemplating 引入:
- 細粒度事件模型:支撐複雜交互邏輯解耦
- 可參數化處理函數:實現邏輯復用
- 頁面作用域:解決跨請求數據共享,避免 Session 濫用
- 資源流抽象:統一處理靜態資源、動態內容
- 可定制組件工廠:支撐主題切換、動態組件生成
這些特性與 JSF 豐富組件庫結合,構建出高效開發環境。
二、單元測試:從 Selenium 到 JSFUnit 的演進
| 版本 | 測試策略 | 工具 | 痛點 |
| GlassFish V2 | 功能測試為主 | Selenium + QA 自動化 | 單元測試缺失,反饋周期長 |
| GlassFish V3 | 集成到 CI 流水線 | JSFUnit + Maven + Hudson | 正在探索中,期望實現真正單元級測試 |
核心洞見:JSF 單元測試難點在於視圖層與邏輯層耦合,JSFUnit 通過模擬 JSF 生命周期在容器外運行測試,是當前最佳路徑。
三、錯誤診斷:四大實戰技巧
- 閱讀源碼:JSF 開源,遇到難解異常直接追蹤源碼(如
UIViewRoot、Application 核心類)
- 提交 Issue:官方 Issue Tracker 既能改進框架又能獲得專家幫助
- 善用搜索與社區:Google + 論壇 + IRC (
irc.freenode.net #jsf),90% 問題已有解
- 必放
h:messages:JSF 大量錯誤通過 FacesMessage 機制輸出,缺少此組件等於「盲飛」
四、開發與美工協作:Woodstock 組件庫實踐
- 標準化設計語言:Woodstock 組件默認實現產品視覺規範,減少 80% 定制工作
- 分工邊界清晰:美工產出圖片/HTML 原型,開發轉化為 JSF 頁面或自定義組件
- 新組件委託組件庫團隊:非通用組件優先推給 Woodstock 團隊,急需時自行實現
這種「組件即契約」模式,讓雙方聚焦各自專長。
五、AJAX 應用:Dynamic Faces 實現局部刷新
兩大典型場景:
- 麵包屑動態計算:客戶端 JS 計算當前樹節點 → XMLHttpRequest 發送服務端 → 服務端組裝 Woodstock 超鏈接組件 → 返回片段更新頁面
- 樹節點增量更新:新建對象時僅刷新受影響分支,避免整棵樹重渲染
技術棧:Dynamic Faces(Ed Burns 領導的 JSF 擴展項目),屬於早期 JSF AJAX 解決方案,現多遷移至 PrimeFaces/OmniFaces 等成熟庫。
六、組件庫選擇與表單擴展
- 全棧 Woodstock:未自研組件庫,Woodstock 提供完整 JSF 組件套件,滿足本地化、無障礙、主題等企業級需求
- 自研組件參考:Ken Paulsen(JSFTemplating 作者)的 TheServerSide 文章 展示如何用 JSFTemplating 加速渲染器開發
- 表單擴展:直接使用 Woodstock 表單組件,通過屬性綁定、驗證器、轉換器實現業務擴展
七、棘手問題排查:組件 Bug 定位三步走
- 與組件作者直接溝通(郵件列表/ISSUE)
- 論壇/IRC 尋求社區幫助
- Google 搜索類似案例
得益於組件廣泛復用,嚴重 Bug 通常已被發現並修復。
八、Session 與作用域管理:避免內存洩漏
- 原則:能用 Request 就不用 Session
- 引入 Page Session:隨頁面生命周期綁定數據,頁面跳轉自動銷毀,解決跨請求臨時數據共享
- 極少數跨頁場景:參數傳遞或極小範圍使用 Session
此策略有效控制內存佔用,避免「殘留數據導致邏輯錯誤」。
九、性能優化建議:按需使用功能
「JSF 提供海量功能,但功能只有在需要時才有價值。」—— Anissa
- 閱讀權威書籍(如《Core JSF》)建立知識體系
- 活躍於
#jsf、#jsftemplating IRC 頻道,聆聽專家實戰經驗
- 針對具體瓶頸優化:視圖狀態壓縮、部分渲染、延遲加載、數據分頁等
十、總結
GlassFish 管理控制台的 JSF 實踐展示了:框架選型服務於業務場景、工程化手段解決框架短板、組件化思維驅動團隊協作、作用域精細化控制資源。這些經驗對當前遷移至 JSF 2.x/3.x、整合 PrimeFaces/OmniFaces 的項目同樣具有指導意義。