本文記錄一個網上商城專案從零開始搭建 SSH(Struts2 + Spring + Hibernate)整合環境的完整流程,採用「分層驗證、逐步整合」策略,確保每一步可獨立運行。
建議在 IDE 的 User Library 中按功能分類:
beans.xml,配置掃描或手動定義 Bean。@RunWith(SpringJUnit4ClassRunner.class) + @ContextConfiguration 載入配置,注入 java.util.Date 驗證 IoC 容器啟動正常。shop 與表 category。Category.java)與映射檔(Category.hbm.xml)或註解。HibernateSessionFactory(單例 + ThreadLocal 模式)。CategoryService 手動管理 Session 與事務,測試資料入庫成功。<!-- 資料源:交給 Spring 管理,hibernate.cfg.xml 可移除連線配置 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
</bean>
<!-- SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
</bean>
<!-- 事務管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- AOP 事務通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="*" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>
<!-- 切面:service.impl 包下所有方法 -->
<aop:config>
<aop:pointcut id="pc" expression="execution(* cn.it.shop.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>
sessionFactory.getCurrentSession() 獲取 Spring 綁定的 Session。beans.xml 註冊 Service Bean,注入 sessionFactory。測試:JUnit 直接注入 CategoryService 呼叫 update(),資料庫更新成功,聲明式事務生效。
web.xml 配置 StrutsPrepareAndExecuteFilter,攔截 *.action。CategoryAction 繼承 ActionSupport,struts.xml 使用動態方法調用 category_*{method}。null(尚未整合 Spring),流程通順。struts2-spring-plugin-2.3.24.1.jar(位於 spring-web 分類)。beans.xml 定義 Action Bean(scope="prototype"),注入 Service:<bean id="categoryAction" class="cn.it.shop.action.CategoryAction" scope="prototype">
<property name="categoryService" ref="categoryService"/>
</bean>
struts.xml 的 class 改為 Spring Bean ID:class="categoryAction"。web.xml 加入 ContextLoaderListener,指定 contextConfigLocation 為 classpath:beans.xml(Listener 需在 Filter 之前啟動)。重新測試:控制台輸出 Service 實例與 SQL,Action 已由 Spring 管理,整合完成。
src ├─ cn.it.shop.action // Struts2 Action ├─ cn.it.shop.service // Service 介面 ├─ cn.it.shop.service.impl// Service 實現(Spring 事務切面) ├─ cn.it.shop.dao // DAO 介面(後續抽取) ├─ cn.it.shop.model // Hibernate 實體 └─ cn.it.shop.util // 基礎類 WebRoot ├─ WEB-INF │ ├─ classes/beans.xml // Spring 總配置 │ ├─ classes/hibernate.cfg.xml │ ├─ struts.xml │ └─ web.xml └─ js/jsp...
至此,SSH 整合環境完全就緒,可進入業務開發階段。完整原始碼可參考文末下載連結。