SSH 框架整合是 Java Web 經典架構,但版本兼容性、Jar 包衝突、配置順序常讓初學者卡殼。本文提供基於 MyEclipse 的標準化整合流程,涵蓋核心庫選型、配置文件編寫、衝突排查全過程。
| 框架 | 推薦版本 | 核心 Jar 包組 |
|---|---|---|
| Struts 2 | 2.3.x / 2.5.x | Struts2 Core Libraries + Struts2 Spring Libraries |
| Spring | 4.3.x / 5.0.x | Core, AOP, Context, Web, JDBC, ORM, Tx, Expression |
| Hibernate | 5.2.x / 5.4.x | Core, EntityManager, JPA API, Validator |
web.xml 核心配置:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
關鍵包:struts2-core-xxx.jar, struts2-spring-plugin-xxx.jar (整合 Spring 必須)
web.xml 添加監聽器:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/classes/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
核心包 (Spring 5 為例):
spring-core, spring-beans, spring-context, spring-aopspring-web, spring-webmvc (Web 環境必須)spring-jdbc, spring-orm, spring-tx (Hibernate 整合必須)spring-expression (SpEL 表達式支持)核心包:
hibernate-corehibernate-entitymanager (JPA 支持)hibernate-validator (Bean Validation)關鍵依賴:數據庫驅動 (MySQL: mysql-connector-java, Oracle: ojdbc8 等)
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/dbname"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.example.entity"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
| 衝突現象 | 典型原因 | 解決方案 |
|---|---|---|
NoSuchMethodError | 同一類不同版本 (如 asm, cglib) | 統一版本,排除傳遞依賴 |
ClassNotFoundException | 缺少必要包 (如 jta, slf4j-api) | 補全缺失依賴 |
LinkageError | 類加載器雙親委派衝突 | 檢查 WEB-INF/lib 與服務器共享庫 |
| 多個 SLF4J 綁定警告 | classpath 存在多個 logging 實現 | 保留一個 (如 logback-classic),排除其它 |
<properties>
<struts2.version>2.5.28</struts2.version>
<spring.version>5.3.21</spring.version>
<hibernate.version>5.6.10.Final</hibernate.version>
</properties>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>${struts2.version}</version>
<exclusions>
<exclusion><groupId>org.springframework</groupId><artifactId>spring-core</artifactId></exclusion>
<exclusion><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></exclusion>
</exclusions>
</dependency>
容器啟動順序:
1. ServletContextListener (Spring ContextLoaderListener)
→ 初始化 Spring 容器 (applicationContext.xml)
→ 創建 DataSource, SessionFactory, TransactionManager
2. Filter (StrutsPrepareAndExecuteFilter)
→ 初始化 Struts 2 (struts.xml)
→ 通過 Spring 插件獲取 Action Bean (從 Spring 容器)
3. Servlet (如 DispatcherServlet 若配置)
→ 初始化 Spring MVC (若使用)
關鍵點:Spring 必須先於 Struts 2 初始化,否則 Action 注入失敗。
struts2-spring-plugin 版本必須與 Struts2 核心版本一致mysql-connector-java 8.0+ 且驅動類名 com.mysql.cj.jdbc.Driverslf4j-api + logback-classic,排除 commons-logging, log4jSSH 整合核心在於版本兼容矩陣、配置加載順序 (Spring 先於 Struts)、依賴傳遞去重。建議使用 Maven/Gradle 管理依賴,鎖定版本屬性,排除衝突傳遞依賴。新項目優先考慮 Spring Boot 簡化配置,維護舊項目時遵循「最小驚訝原則」最小化變更。