傳統三層 (表示/業務/數據) 在 B/S 系統中面臨:控制邏輯混雜表示層、持久化邏輯滲透業務層。N 展架構引入控制/中介層與數據映射層,實現關注點精細分離。
| ISA (信息系統架構) | Brown 模型 | J2EE 標準層 | 對應技術實現 |
|---|---|---|---|
| 表示層 | 表示層 | 客戶層 | 瀏覽器、HTML、XSL、移動端、Applet |
| 服務器表示層 | JSP、ActionForm、XML、Velocity | ||
| 控制/中介層 | Controller | 控制層 | Struts Action、Controller Servlet、Spring MVC |
| 領域層 | 領域層 | 業務層 | JavaBeans、Session Bean、Session Facade、POJO Service |
| 數據映射層 | 整合層 | 持久層 | Entity Bean (BMP/CMP)、Hibernate、JDO、JDBC、iBATIS |
| 數據源層 | 資源層 | 資源層 | RDBMS (Oracle、MySQL、DB2)、LDAP、ERP、文件系統 |
「各層實現應解耦或耦合最小化,最終實現任意層實現的任意切換。」
業務層 (Session Facade / Service) 僅依賴 DAO 接口,具體實現由 Spring IoC 容器注入,部署環境決定採用哪套持久化策略,業務代碼零修改。
ActionServlet (前端控制器) + Action (請求處理器) + ActionForm (表單數據傳輸/校驗)。BusinessDelegate 或直接調用 Service 接口,不包含業務邏輯。| 反模式 | 症狀 | 修正 |
|---|---|---|
| Action 胖化 | Action 內含 SQL、事務、複雜業務計算 | 抽取 Service 層,Action 僅做參數轉換、異常捕獲、導航 |
| Form 跨層流動 | ActionForm 直接傳入 Service/DAO | Action 組裝領域對象/DTO,Form 僅在 Web 層流轉 |
| JSP 含業務邏輯 | Scriptlet 中調用 Service、查詢數據庫 | 控制器預備數據,JSP 僅渲染,使用 EL/JSTL/Taglib |
| 持久化技術硬編碼 | Service 直接 new HibernateDAO() | 定義 DAO 接口,Spring 注入具體實現 |
application.xml 聲明模塊依賴與安全角色。物理部署單元與邏輯層對齊,支援分佈式部署 (Web 服務器集群 + EJB 容器集群) 與獨立升級。
N 層架構非層數越多越好,而在於識別變化維度、建立穩定接口、實現構建時/部署時/運行時的多維解耦。Struts 專注控制層,配合 Spring (業務/持久容器) 與 ORM 框架,構建經典 Java EE 應用架構基石。