首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Struts + Spring + Hibernate 整合架構:打造鬆耦合的企業級 Web 應用

     編輯:Java 相關知識

建構企業級 Web 應用面臨諸多挑戰:使用者介面、業務邏輯、資料持久化三大層次如何分工?如何實現層與層之間的鬆耦合?如何整合事務管理等容器級服務?本文展示如何整合 Struts(表現層)、Spring(業務層)、Hibernate(持久層)三大開源框架,構建清晰、可維護、可擴展的標準化架構。

四層架構職責劃分

層次職責避免事項
表現層請求/回應處理、控制器委派、異常處理、顯示模型、UI 驗證JDBC 直連、業務邏輯、事務管理
業務層業務邏輯/驗證、事務管理、層間介面、依賴管理、協調表現/持久層直接資料庫操作、UI 邏輯
持久層物件查詢/儲存/更新/刪除、ORM 映射、資料庫交互業務邏輯、表現層邏輯
領域模型層業務實體物件(訂單、商品等),跨層流轉,免 DTO 轉換—

核心整合策略:Spring IoC 串聯各層

Spring 透過「依賴注入」(IoC)將各層組件鬆耦合連接:

  • 業務服務物件透過 Setter 注入 DAO 介面,不依賴具體實作
  • SessionFactory、TransactionManager 由 Spring 管理並注入
  • 表現層透過 Service Locator 從 Spring Context 取得業務服務

實作範例:訂單管理系統

領域模型


// Order.java - 一對多關聯 OrderLineItem
public class Order {
    private int id;
    private String username;
    private double total;
    private Set lineItems = new HashSet<>();
    // getter/setter...
}

// OrderLineItem.java
public class OrderLineItem {
    private int id;
    private String productName;
    private int quantity;
    private double price;
    // getter/setter...
}

持久層:Hibernate 映射與 DAO


// IOrderDAO.java - 介面定義
public interface IOrderDAO {
    Order findOrderById(int id);
    List findOrdersPlaceByUser(String placedBy);
    Order saveOrder(Order order);
}

// OrderHibernateDAO.java - 繼承 HibernateDaoSupport
public class OrderHibernateDAO extends HibernateDaoSupport implements IOrderDAO {
    public Order saveOrder(Order order) {
        getHibernateTemplate().saveOrUpdate(order);
        return order;
    }
    // 其他方法實作...
}

業務層:服務介面與實作


// IOrderService.java
public interface IOrderService {
    Order saveNewOrder(Order order) throws OrderException, OrderMinimumAmountException;
    List findOrderByUser(String user) throws OrderException;
    Order findOrderById(int id) throws OrderException;
    void setOrderDAO(IOrderDAO orderDAO); // Setter 注入點
}

// OrderServiceSpringImpl.java
public class OrderServiceSpringImpl implements IOrderService {
    private IOrderDAO orderDAO;
    
    public Order saveNewOrder(Order order) throws OrderException, OrderMinimumAmountException {
        // 業務驗證:最低訂單金額
        if (order.getTotal() < MIN_AMOUNT) 
            throw new OrderMinimumAmountException();
        return orderDAO.saveOrder(order);
    }
    // 其他方法委派 DAO...
    public void setOrderDAO(IOrderDAO orderDAO) { this.orderDAO = orderDAO; }
}

Spring 配置:組件裝配與事務管理




    
        
            com/meagle/bo/Order.hbm.xml
            com/meagle/bo/OrderLineItem.hbm.xml
        
    
    
        
            net.sf.hibernate.dialect.MySQLDialect
            false
        
    
    



    




    



    




    
    
    
        
            PROPAGATION_REQUIRED,readOnly
            PROPAGATION_REQUIRED,readOnly
            PROPAGATION_REQUIRED
        
    

表現層:Struts Action 整合


// BaseAction.java - Service Locator 模式取得 Spring Bean
public abstract class BaseAction extends Action {
    private IOrderService orderService;
    
    public void setServlet(ActionServlet actionServlet) {
        super.setServlet(actionServlet);
        WebApplicationContext wac = WebApplicationContextUtils
            .getRequiredWebApplicationContext(actionServlet.getServletContext());
        this.orderService = (IOrderService) wac.getBean("orderService");
    }
    protected IOrderService getOrderService() { return orderService; }
}

// SaveOrderAction.java - 委派業務層處理
public class SaveOrderAction extends BaseAction {
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response) throws Exception {
        OrderForm oForm = (OrderForm) form;
        Order order = buildOrderFromForm(oForm); // 從表單建構領域物件
        
        getOrderService().saveNewOrder(order); // 委派業務層
        
        oForm.setOrder(order);
        saveMessages(request, new ActionMessage("message.order.saved.successfully"));
        return mapping.findForward("success");
    }
}

Struts 配置:異常處理



    
    
    

架構優勢總結

  • 層次清晰:各層職責單一,程式碼易讀、易維護
  • 鬆耦合:介面導向設計 + IoC,可替換任一層實作(如 Hibernate → iBATIS)
  • 事務管理:Spring 聲明式事務,業務邏輯零侵入
  • 異常處理:業務異常穿透至表現層統一處理
  • 測試友善:各層可獨立單元測試,Mock 介面即可

結語

Struts + Spring + Hibernate 的經典整合展現了「分而治之」的架構智慧。透過 Spring IoC 容器串聯三層,配合介面導向設計與聲明式事務,構建出高內聚、低耦合、易擴展的企業級應用基石。此架構模式雖歷經歲月,其核心思想仍為現代微服務與雲原生架構的重要啟發來源。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved