JSF (JavaServer Faces) 是 JCP 標準化的 Java Web 應用框架,提供組件化、事件驅動、可視化開發的服務端 UI 框架,解決傳統 JSP「HTML 與 Java 混雜、腳本難復用、調試困難」三大痛點,實現真正的 MVC 分離。
傳統 JSP 痛點回顧
- 邏輯與視圖混雜:JSP 混合 HTML、Java Scriptlet、JSTL,設計師與開發者無法並行。
- 腳本不可復用:大量複製貼上導致多版本共存,維護噩夢。
- 調試困難:Servlet 編譯錯誤行號難映射回 JSP 原始行。
- TagLib 只解決部分:仍未徹底分離邏輯與標記。
JSF 核心特性
| 特性 | 說明 |
| 組件化 UI | 豐富服務端組件庫 (輸入、布局、數據表、Ajax 等),第三方可擴展 |
| 渲染器分離 | 組件邏輯與渲染分離,同一組件可輸出 HTML、WML、JSON 等多種標記 |
| 事件驅動 | 客戶端事件 (點擊、輸入) 自動提交至服務端 Listener,無需手寫請求參數解析 |
| 標準驗證/轉換 | 內建驗證器 (長度、正則、必填) 與轉換器 (日期、數字、枚舉),可自定義 |
| 導航規則 | faces-config.xml 聲明式頁面跳轉,支援條件導航 |
| 狀態管理 | 自動保存/恢復視圖狀態 (客戶端/服務端),無需手動 Session 管理 |
| 國際化 (i18n) | 資源包機制,標籤屬性直接引用 #{msg.key} |
JSF 架構:標準 MVC
- Model:JavaBean (POJO),承載業務數據與邏輯,可在 JSF 頁面直接綁定
#{bean.property}。
- View:Facelets (JSF 2.0+ 推薦) 或 JSP 頁面,由 JSF 組件標籤構成 (
h:inputText, h:dataTable 等)。
- Controller:
FacesServlet (前端控制器) 統一處理請求生命周期,faces-config.xml 配置導航、Managed Bean、驗證器、轉換器。
關鍵差異:JSF 實現徹底的邏輯與視圖分離,Controller 不包含業務邏輯,僅協調生命周期與導航。
JSF 生命周期 (6 階段)
- Restore View:建立/恢復組件樹 (ViewRoot)。
- Apply Request Values:將請求參數解碼賦值給組件。
- Process Validations:執行驗證器,失敗則跳至 Render Response。
- Update Model Values:驗證通過,將組件值更新到 Model Bean。
- Invoke Application:執行 Action Listener、Action 方法 (業務邏輯)。
- Render Response:渲染組件樹輸出響應。
開發流程 (配合 RAD 工具)
- 視圖設計:拖拽組件到 Facelets 頁面,綁定 Bean 屬性、Action 方法。工具自動生成 Bean 骨架代碼。

- 模型設計:實現業務邏輯 JavaBean,在
faces-config.xml 或註解 (@ManagedBean) 宣告。
- 控制器配置:
web.xml 映射 FacesServlet;faces-config.xml 配置導航規則、Managed Bean 作用域。
主流廠商支援
| 廠商 | 產品/組件庫 | IDE 支援 |
| Sun/Oracle | JSF RI (Mojarra), ADF Faces | NetBeans, JDeveloper |
| IBM | JSF Extensions, WebSphere Studio | RAD / RSA |
| Red Hat | RichFaces, PrimeFaces (社區) | JBoss Tools (Eclipse) |
| Apache | MyFaces (RI 實現) | Eclipse WTP |
JSF 版本演進
- JSF 1.0/1.1:早期版本,JSP 為視圖技術。
- JSF 1.2:隨 Java EE 5 發布,統一 EL、註解支援。
- JSF 2.0+:Facelets 取代 JSP、Ajax 標準化 (
f:ajax)、註解配置 (@ManagedBean, @ViewScoped)、組件複合 (cc:interface)、Partial State Saving、Bookmarkable URLs。當前主流版本。
- JSF 3.0 (Jakarta Faces 3.0):Jakarta EE 9+,API 包名遷移
javax.faces → jakarta.faces。
優缺點總結
| 優點 | 缺點 |
| 標準化、廠商中立、可移植 | 學習曲線陡峭 (生命周期、組件樹、狀態管理) |
| 組件復用度高、第三方生態豐富 | ViewState 體積大 (客戶端狀態管理時),影響帶寬 |
| 工具友好、可視化開發極致 | 對 RESTful API、前後端分離架構支援弱 |
| 事件模型簡化控制器代碼 | 大型頁面組件樹深、生命周期開銷大,性能調優複雜 |
適用場景
- 企業級內部管理系統 (ERP、CRM、OA):表單密集、業務邏輯複雜、需快速構建標準化 UI。
- 團隊偏好服務端渲染、組件化開發、標準化技術棧。
- 需整合 Portlet、Seam、Spring Web Flow 等企業級框架。
現代前後端分離架構 (React/Vue + Spring Boot) 下,JSF 新專案採用率下降,但存量系統維護與特定領域仍具不可替代價值。
- 上一篇文章: Java 多線程編程精要:Thread 類與 Runnable 介面實現線程詳解
- 下一篇文章: J2ME MMAPI 開發行動多媒體應用完整指南
Copyright ©
程式碼之家 All Rights Reserved