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

Hibernate、Struts 2 與 Spring 整合開發完整指南

     編輯:Java 相關知識

前言

在 Java EE 開發中,Hibernate、Struts 2 與 Spring 的整合(俗稱 SSH 整合)是經典的企業級應用架構。本文將詳細記錄如何在 Eclipse 環境下,逐步搭建一個基於這三大框架的 Web 專案,涵蓋環境配置、資料源設定、DAO 層實作、Action 整合以及事務管理等核心步驟。

一、Hibernate 與 Spring 整合基礎

1. 建立 Web 專案

在 Eclipse 中新建一個 Web Project,選擇 Java EE 5.0 作為執行環境。

2. 加入 Hibernate 支援

  • 為專案增加 Hibernate 開發能力,將相關類庫加入 Build Path。
  • 選擇 Hibernate 3.1 版本,勾選 Core 包。
  • 工具會自動生成 hibernate.cfg.xml 配置檔,稍後我們將其移除,改由 Spring 統一管理。

3. 加入 Spring 支援

  • 增加 Spring 開發能力,將 Spring 相關類庫加入 Build Path。
  • 選擇 Spring 2.x,勾選 Core、Persistence Core(會自動包含 AOP)、Web 包。
  • 建議將 applicationContext.xml 放置於 WebRoot/WEB-INF/ 目錄下。

4. 配置 Spring 管理 Hibernate

刪除 hibernate.cfg.xml,修改 applicationContext.xml,配置資料源與 SessionFactory:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
       xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="https://www.springframework.org/schema/beans
       https://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

  <!-- 資料源配置:使用 DBCP 連線池 -->
  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@liuweiv3000:1521:ora9"/>
    <property name="username" value="scott"/>
    <property name="password" value="tiger"/>
  </bean>

  <!-- SessionFactory 配置 -->
  <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource"><ref bean="dataSource"/></property>
    <property name="hibernateProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
      </props>
    </property>
    <property name="mappingResources">
      <list>
        <value>cn/com/jobedu/shop/model/Catalog.hbm.xml</value>
      </list>
    </property>
  </bean>
</beans>

別忘了在 Build Path 中加入 commons-dbcp-1.2.2.jar 和 commons-pool-1.3.jar。

5. 反向工程生成實體與映射檔

使用 MyEclipse 的反向工程向導,根據資料庫表結構自動生成 POJO 類別與對應的 .hbm.xml 映射檔。

6. 更新映射資源配置

將新生成的映射檔加入 applicationContext.xml 的 mappingResources 列表中:

<property name="mappingResources">
  <list>
    <value>cn/com/jobedu/shop/model/Catalog.hbm.xml</value>
    <value>cn/com/jobedu/shop/model/Product.hbm.xml</value>
  </list>
</property>

7. 定義 DAO 介面

package cn.com.jobedu.shop.dao;
import java.util.List;
import cn.com.jobedu.shop.model.Catalog;

public interface CatalogDao {
    void create(Catalog c);
    Catalog getCatalog(Long id);
    List getCatalogs();
    void update(Catalog c);
    void remove(Long id);
}

8. 實作 DAO:繼承 HibernateDaoSupport

package cn.com.jobedu.shop.dao.hibernate;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.com.jobedu.shop.dao.CatalogDao;
import cn.com.jobedu.shop.model.Catalog;

public class CatalogDaoHibernate extends HibernateDaoSupport implements CatalogDao {
    @Override public void create(Catalog c) { getHibernateTemplate().save(c); }
    @Override public Catalog getCatalog(Long id) { return (Catalog)getHibernateTemplate().get(Catalog.class, id); }
    @Override public List getCatalogs() { return getHibernateTemplate().find("from Catalog order by id desc"); }
    @Override public void remove(Long id) { getHibernateTemplate().delete(getCatalog(id)); }
    @Override public void update(Catalog c) { getHibernateTemplate().update(c); }
}

9. 在 Spring 中註冊 DAO Bean

<bean id="catalogDao" class="cn.com.jobedu.shop.dao.hibernate.CatalogDaoHibernate">
  <property name="sessionFactory"><ref bean="sessionFactory"/></property>
</bean>

二、整合 Struts 2,完成 SSH 三層整合

1. 配置 web.xml:Struts 2 過濾器

<filter>
  <filter-name>struts2</filter-name>
  <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
  <filter-name>struts2</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

2. 加入 Struts 2 類庫與 Spring 整合插件

將 struts2-spring-plugin-x.x.x.jar 加入專案類別路徑。

3. 配置 struts.xml:指定 Spring 為物件工廠

<struts>
  <constant name="struts.objectFactory" value="spring" />
</struts>

4. 配置 web.xml:Spring 監聽器與 OpenSessionInViewFilter

<!-- Spring 容器啟動監聽器 -->
<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<!-- 解決 LazyInitializationException,支援視圖層延遲載入 -->
<filter>
  <filter-name>lazyLoadingFilter</filter-name>
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>lazyLoadingFilter</filter-name>
  <url-pattern>*.action</url-pattern>
</filter-mapping>

5. 撰寫 Action 類別

Action 類別不再繼承特定基類,而是通過 Setter 注入 Service 或 DAO,由 Spring 管理生命週期。

6. 配置 struts.xml:Action 映射

<struts>
  <constant name="struts.objectFactory" value="spring" />
  <include file="struts-default.xml"/>
  <package name="default" extends="struts-default">
    <action name="hello" class="helloBean">
      <result>hello.jsp</result>
    </action>
    <!-- 更多 action 配置 -->
  </package>
</struts>

7. 修改 applicationContext.xml:配置 Action Bean

<beans default-autowire="byName">
  <bean id="helloBean" class="cn.com.jobedu.HelloWorld" scope="prototype" />
  <!-- 其他 bean -->
</beans>

設定 default-autowire="byName" 可讓 Spring 自動依名稱注入屬性(如 catalogDao)。

8. 宣告式事務管理配置

在 applicationContext.xml 中加入事務管理器、通知與 AOP 切面:

<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>

<!-- 事務屬性:增刪改方法需事務,查詢唯讀 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="add*" propagation="REQUIRED"/>
    <tx:method name="delete*" propagation="REQUIRED"/>
    <tx:method name="update*" propagation="REQUIRED"/>
    <tx:method name="*" read-only="true"/>
  </tx:attributes>
</tx:advice>

<!-- AOP 切面:套用至 service 包下所有類 -->
<aop:config>
  <aop:pointcut id="allManagerMethod" expression="execution(* cn.com.jobedu.crm.service.*.*(..))"/>
  <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
</aop:config>

9. 撰寫 JSP 頁面、部署測試

完成上述配置後,編寫對應的 JSP 視圖,部署至 Tomcat 等容器,啟動專案驗證整合是否成功。

總結

本文完整示範了從零開始搭建 SSH 整合環境的全過程:Spring 管理 Hibernate 的 SessionFactory 與事務,Struts 2 通過 Spring 插件接管 Action 實例化,並配合 OpenSessionInViewFilter 解決延遲載入問題。掌握此流程,可快速建立結構清晰、易於維護的企業級 Java Web 應用。

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