SSH(Struts2 + Spring + Hibernate)曾是 Java EE 開發的經典組合。雖然微服務架構下 Spring Boot 更主流,但理解 SSH 整合原理對維護老項目、掌握 IOC/AOP 核心機制仍有重要價值。本文梳理三大核心配置文件的關鍵點,助你快速搭建可運行的 SSH 基礎架構。
web.xml 是 Web 應用的部署描述符,負責啟動 Spring 容器、註冊 Struts2 過濾器。
<!-- 1. Struts2 核心過濾器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 2. Spring 容器啟動監聽器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
關鍵點:
StrutsPrepareAndExecuteFilter 取代舊版 FilterDispatcher,支援 Struts 2.3+。contextConfigLocation 指定 Spring 配置文件路徑,ContextLoaderListener 讀取該路徑初始化 ApplicationContext。此文件定義數據源、SessionFactory、事務管理等核心 Bean。
<!-- 1. 數據源 (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:@localhost:1521:orcl"/>
<property name="username" value="accp"/>
<property name="password" value="accp"/>
</bean>
<!-- 2. SessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop>
<!-- 可加入 show_sql, hbm2ddl.auto 等 -->
</props>
</property>
<property name="mappingResources">
<list>
<value>com/example/User.hbm.xml</value>
</list>
</property>
</bean>
<!-- 3. 事務管理器 & 事務增強 (建議補全) -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
關鍵點:
LocalSessionFactoryBean 將 Hibernate SessionFactory 納入 Spring 管理。mappingResources 列出所有 .hbm.xml 映射文件,或改用 packagesToScan 自動掃描實體類。HikariCP 或 Druid 連接池,並啟用註解驅動事務。Struts2 的 Action 實例化完全移交給 Spring 容器,struts.xml 中 class 屬性填寫 Spring Bean 的 ID。
<package name="default" namespace="/" extends="struts-default">
<action name="userAction" class="userActionBean"> <!-- 此處為 Spring Bean ID -->
<result name="success">/success.jsp</result>
</action>
</package>
對應 applicationContext.xml 中:
<bean id="userActionBean" class="com.example.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
關鍵點:
scope="prototype",確保每次請求創建新實例,避免線程安全問題。ContextLoaderListener → Spring 容器初始化 → Struts2 過濾器初始化 → 從 Spring 獲取 Action。struts2-spring-plugin 版本與 Spring、Struts2 核心版本一致。LocalSessionFactoryBean 包路徑改為 org.springframework.orm.hibernate5。掌握以上三大配置文件的核心邏輯,即可搭建起一個清晰、可維護的 SSH 基礎架構,為後續業務開發打下堅實基礎。