J2EE 為中介軟體領域建立了統一標準(分散式事務、目錄服務、訊息服務、JDBC 等),卻始終未能提供令人滿意的應用程式編程模型。Sun 與應用伺服器廠商試圖以工具降低複雜度,但工具生成的代碼往往與框架本身同樣複雜,且遠遜於 .NET 生態的工具鏈。這迫使開源社區另闢蹊徑——以框架簡化 J2EE 開發,Struts、Hibernate、Spring 遂成為那個時代的三駕馬車。
框架本質是「半成品應用」:它調用你的代碼(好萊塢原則:「別調用我們,我們會調用你」),管理程式流程,而非像類庫般被動被調用。優秀框架帶來的價值:
1999-2000 年,開發者發現 JSP Model 1 將請求處理、業務邏輯、HTML 模板糅雜在一起,維護極其困難。缺乏標準框架下,大家自行實作 Front Controller 模式,質量參差不齊。
2001-2002 年 Apache Struts 發布,雖非完美,卻以「足夠好」確立了事實標準。它讓 MVC 在 Web 層落地:
Struts 幾乎滲透進每個 J2EE 專案,甚至保守組織也接受其 Apache 許可,成為 J2EE 架構的事實組件。
早期商業 ORM(TopLink)昂貴且違背 EJB 標準;JDO 雖標準化但廠商冷遇。真正的轉折點在 2002 年:
Hibernate 雖非理論創新,但以「更易用、更直接、更廉價」的編程模型贏得市場。隨後 TopLink 開放授權、商業 JDO 實現湧現,ORM 徹底贏得持久化戰場。
Struts + Hibernate 解決了 Web 層與持久層,但業務邏輯層仍無合適模型。EJB 雖提供方案,卻繼承了沉重的編程模型。
Spring、PicoContainer、HiveMind 等輕量容器將 POJO 脫離 J2EE API,使單元測試變得極簡——無需部署伺服器、無需模擬容器。這直接催化了 TDD(測試驅動開發)在企業級開發的普及。
| 層級 | 標準陣營 | 開源陣營 | 現狀 |
|---|---|---|---|
| 表現層 | JSF (Sun/大廠) | Struts, Tapestry, Wicket | 開源創新更快(Tapestry 借鑒 WebObjects) |
| 業務層 | EJB 3.0 (DI 子集) | Spring (完整 IoC/AOP) | 開源功能更豐富,EJB 3.0 試圖標準化 DI 卻犧牲彈性 |
Spring/dynaop 等「帶拐杖的 AOP」普及了切面概念,AspectJ 等純粹 AOP 技術正崛起。JBoss 透過 JCP 推動 EJB 3.0 整合 AOP,但 JCP 尚未正式擁抱 AOP 標準化。
下一代 J2EE 規範必將擁抱 Spring/Hibernate 證明的簡單 POJO 模型。開發者將從「被規格綁架」轉向「以經驗驅動開發」。這場變革不似過往規格發布後的空歡喜,而是實實在在的生產力解放——因為它源自無數專案的血淚驗證,而非象牙塔的想像。