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

Struts + Spring + Hibernate 整合架構:打造鬆耦合 Web 應用完整指南

     編輯:Java 程式設計入門

為什麼需要整合框架?

構建非簡單 Web 應用時,開發者面臨三大核心挑戰:

  • 表現層:如何處理請求/回應、驗證、導航?
  • 業務層:業務邏輯、事務管理、與其他層解耦?
  • 持久層:資料存取、ORM、資料庫無關性?

優秀框架應具備:解決特定領域複雜度、可擴展、社群支援。單一框架難以覆蓋所有層次,整合多框架讓各層專注核心職責,透過介面鬆耦合溝通,實現層級替換不影響整體。

三層架構職責劃分

表現層 — Struts

職責:

  • 管理 HTTP 請求/回應
  • 控制器代理呼叫業務邏輯
  • 處理來自下層的異常
  • 為視圖提供展示模型
  • 執行 UI 層級驗證(格式、必填)

嚴禁: 直接 JDBC、業務邏輯、事務管理、資料庫操作。

持久層 — Hibernate

職責:

  • 物件關聯映射(ORM):POJO ↔ 資料表
  • HQL(物件導向查詢語言)或 Criteria API 查詢
  • 儲存、更新、刪除實體
  • 支援關聯(一對多、多對多)、繼承、多型、事務

嚴禁: 業務邏輯、與表現層直接耦合。

業務層 — Spring

核心:依賴注入(DI)/ 控制反轉(IoC)

  • 管理業務邏輯與業務驗證
  • 宣告式事務管理
  • 提供服務介面供表現層呼叫
  • 管理 DAO、Service 等業務物件依賴關係
  • 隔離表現層與持久層,雙向解耦

透過 XML 設定檔(或註解)將 DataSource、TransactionManager、DAO、Service 串聯。

領域模型層

POJO 實體類別(如 Order、OrderLineItem),在各層間流動。Hibernate 直接持久化領域物件,避免 DTO 轉換損失與額外程式碼。

整合實戰:訂單管理範例

1. 領域物件

// com.meagle.bo.Order.java
public class Order {
    private Long id;
    private Date orderDate;
    private Set<OrderLineItem> lineItems = new HashSet<>();
    // getters/setters
}

// com.meagle.bo.OrderLineItem.java
public class OrderLineItem {
    private Long id;
    private Product product;
    private int quantity;
    private BigDecimal price;
    // getters/setters
}

2. Hibernate 映射與 DAO

<!-- Order.hbm.xml -->
<class name="com.meagle.bo.Order" table="ORDERS">
    <id name="id" column="ORDER_ID">
        <generator class="native"/>
    </id>
    <set name="lineItems" cascade="all">
        <key column="ORDER_ID"/>
        <one-to-many class="com.meagle.bo.OrderLineItem"/>
    </set>
</class>

DAO 介面與實作:

public interface OrderDAO {
    Order findById(Long id);
    void save(Order order);
}

public class OrderDAOHibernate implements OrderDAO {
    private HibernateTemplate hibernateTemplate;
    // 注入 HibernateTemplate
    public Order findById(Long id) {
        return (Order) hibernateTemplate.get(Order.class, id);
    }
    // ...
}

3. Spring 業務服務與設定

public interface OrderService {
    Order createOrder(Order order);
    Order getOrder(Long id);
}

public class OrderServiceImpl implements OrderService {
    private OrderDAO orderDAO;
    // setter 注入
    public Order createOrder(Order order) {
        // 業務邏輯、驗證
        orderDAO.save(order);
        return order;
    }
}
<!-- applicationContext.xml -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" ... />
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list><value>Order.hbm.xml</value></list>
    </property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="orderDAO" class="com.meagle.service.dao.hibernate.OrderDAOHibernate">
    <property name="hibernateTemplate" ref="hibernateTemplate"/>
</bean>
<bean id="orderService" class="com.meagle.service.OrderServiceImpl">
    <property name="orderDAO" ref="orderDAO"/>
</bean>

4. Struts 整合 Spring

在 struts-config.xml 設定 DelegatingActionProxy,Action 由 Spring 容器管理:

<action path="/order" type="org.springframework.web.struts.DelegatingActionProxy">
    <forward name="success" path="/orderSuccess.jsp"/>
</action>

Action 類別:

public class OrderAction extends Action {
    private OrderService orderService;
    public void setOrderService(OrderService orderService) { this.orderService = orderService; }

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest req, HttpServletResponse res) {
        OrderForm of = (OrderForm) form;
        Order order = of.getOrder();
        orderService.createOrder(order);
        return mapping.findForward("success");
    }
}

Spring 設定 Action:

<bean name="/order" class="com.meagle.action.OrderAction" singleton="false">
    <property name="orderService" ref="orderService"/>
</bean>

整合優勢總結

層級框架核心價值替換彈性
表現Struts請求分派、驗證、標籤庫可換 Spring MVC、JSF、WebWork
業務SpringDI、AOP、宣告式事務、服務抽象可換 PicoContainer、EJB 3.0
持久HibernateORM、HQL、快取、透明持久化可換 iBATIS、JPA、JDO

最佳實踐提醒

  • 套件命名反映分層:bo(領域)、service(業務)、dao(持久)、action/form(表現)
  • 業務介面與實作分離,表現層僅依賴介面
  • 事務邊界在 Service 層宣告,DAO 不管理事務
  • 異常轉換:DAO 拋出資料存取異常 → Service 包裝為業務異常 → Action 捕獲轉向錯誤頁
  • Open Session in View 模式解決 LazyInitializationException
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved