J2EE Web 架構經歷了 Model 1 (JSP 大雜燴) → Model 2 (MVC) → 多層分離 → 成熟框架生態四個階段。本文系統分析架構演進動力、四大主流框架 (Struts、JATO、JSF、WAF) 的 MVC 實現差異、優劣勢與選型建議,並給出現代化遷移路徑。
架構演進四階段
| 階段 | 特徵 | 痛點 | 解決方案 |
| Model 1 | JSP 直連資料庫、業務邏輯、頁面渲染 | 職責混雜、難複用、難測試、團隊協作衝突 | 引入 Servlet 作為控制器 |
| Model 2 (MVC) | 前端控制器 Servlet → Action → JSP 視圖 | 導航硬編碼、表單綁定繁瑣、驗證分散 | 框架化:Struts 1.x |
| 多層架構 | Client / Web (Servlet/JSP) / EJB / EIS | EJB 2.x 過重、配置地獄、測試困難 | 輕量容器:Spring + Hibernate + Struts 2 |
| 現代化 | Spring Boot + REST/GraphQL + React/Vue + K8s | 單體遷移成本、微服務複雜度 | 領域驅動設計、API 先行、可觀測性 |
四大經典框架深度對比 (歷史視角)
1. Apache Struts 1.x (曾霸主)
- 核心:
ActionServlet 前端控制器 → Action → ActionForm 表單綁定 → struts-config.xml 集中導航。
- 優點:開源免費、大型應用驗證、導航集中、國際化、標籤庫豐富。
- 缺點:
ActionForm 與 JSP 強耦合、大量樣板碼、非標準、工具支援弱、安全漏洞頻出 (OGNL 注入)。
- 改進建議:
ActionForm 改為 XML 數據傳輸、導航外置、遷移至 Struts 2 / Spring MVC。
2. JATO (iPlanet/Sun ONE Application Framework)
- 核心:
ApplicationServletBase 前端控制器 → RequestDispatcher → Command (Worker) → ViewBean (層次化視圖組件) → JSP 標籤庫同步。
- 特色:頁面為中心 (類 VB/Delphi)、事件驅動、組件層次樹、核心/組件/擴展三層可插拔。
- 缺點:非標準、導航分散在視圖、無工具支援、文檔稀缺、Sun 檢視後停止演進。
- 改進:視圖/模型數據交換改 XML、增加集中導航定義。
3. JSF (JavaServer Faces, JSR 127/252/344/372)
- 定位:**標準化 UI 組件框架**,而非完整 MVC。僅負責視圖層:組件樹、狀態管理、事件、驗證、轉換、導航規則、國際化。
- 組合:JSF + Facelets (View) + CDI/Managed Bean (Model) + PrettyFaces/OmniFaces (擴展)。
- 優點:Java EE 標準、組件化開發、工具支援強 (NetBeans/Eclipse/IntelliJ 視覺化設計)。
- 缺點:生命週期複雜、狀態保存開銷大、學習曲線陡峭、REST 整合弱、社區活躍度下降。
4. WAF (Web Application Framework, Sun Blueprints)
- 核心:
TemplateServlet (屏幕導航) + MainServlet (動作處理) + ScreenDefinition.xml/Mapping.xml 雙配置。
- 特色:
WebClientController 事件鏈 → EJBAction 會話級業務處理,適合多步驟精靈 (購物車)。
- 缺點:源碼混亂、無正式 Model 層、視圖概念弱、無模型→視圖綁定、穩定性未驗證。
- 優勢:僅提供骨架,極大擴展自由度,適合自建框架團隊。
框架選型決策矩陣 (2005 年視角 vs 現代視角)
| 維度 | Struts 1 | JATO | JSF | WAF | 現代首選 |
| 標準化 | 否 | 否 | 是 (JSR) | 否 | Spring MVC (事實標準) |
| 學習曲線 | 中 | 高 | 高 | 中 | 低 (Spring Boot) |
| 大型專案適配 | 良 | 良 | 良 | 需自建 | 優 |
| 工具支援 | 中 | 無 | 強 | 無 | 極強 |
| 社區活躍 | 低 (EOL) | 無 | 中低 | 無 | 極高 |
遷移現代化路徑建議
- Struts 1 → Spring MVC:
Action → @Controller、ActionForm → @ModelAttribute/DTO、struts-config.xml → @RequestMapping + ViewResolver。
- JSF → Spring MVC + Thymeleaf/React:組件樹 → 組件化前端、Managed Bean → Spring Bean、導航規則 → 前端路由/後端 REST。
- EJB 2.x → Spring + JPA:Session Bean →
@Service、Entity Bean → @Entity、CMP → Hibernate/MyBatis。
- 採用 Spring Boot 3 + Jakarta EE 10 基線,容器化部署,可觀測性 (Micrometer/Prometheus/Grafana) 內建。