記錄《青軟 S2SH》教材核心知識點,涵蓋 Struts2、Spring、Hibernate 三大框架整合要點、配置細節與常見問題。雖然現代開發多用 Spring Boot + SpringMVC + MyBatis/JPA,但理解經典 S2SH 架構有助於掌握框架演進脈絡與企業級應用遷移。
| 框架 | 層級 | 核心職責 | 關鍵技術點 |
|---|---|---|---|
| Struts2 | 表現層 (MVC Controller) | 請求攔截、參數封裝、結果視圖分發、攔截器鏈 | Action、Result、Interceptor、OGNL、值棧 |
| Spring | 業務層容器 (IoC/AOP) | 依賴注入、AOP 切面、事務管理、模板封裝 (JdbcTemplate, HibernateTemplate) | Bean 定義、生命周期、循環依賴、@Transactional、AOP 代理 |
| Hibernate | 持久層 (ORM) | 對象關係映射、Session 管理、HQL/Criteria 查詢、緩存 (一級/二級)、鎖機制 | 映射配置、SessionFactory、延遲加載、N+1 問題、樂觀/悲觀鎖 |
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Struts2 │────▶│ Spring │────▶│ Hibernate │
│ Action │ │ Service │ │ DAO │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
▼ ▼ ▼
web.xml applicationContext.xml hibernate.cfg.xml
struts.xml 事務配置 映射文件 *.hbm.xml
/success.jsp
org.hibernate.dialect.MySQLDialect true update
openSessionInViewFilter org.springframework.orm.hibernate5.support.OpenSessionInViewFilter sessionFactoryBeanName sessionFactory openSessionInViewFilter /*
作用:延長 Session 生命周期至視圖渲染結束,解決延遲加載時無 Session 異常。注意:長事務風險、連接佔用久,高併發慎用。
| 問題 | 原因 | 解決 |
|---|---|---|
| Action 注入 Service 為 null | Struts2 默認自創 Action 實例 | 配置 struts.objectFactory=spring、Action 定義為 prototype |
| 懶加載失敗: no session | Session 關閉後訪問代理集合 | OSIV Filter / fetch join / DTO 投影 |
| 事務不生效 | 未配置事務管理器/註解驅動/代理模式 | 檢查 @Transactional 位置、proxy-target-class |
| Hibernate 映射找不到 | 映射文件路徑/名稱錯誤 | mappingLocations 用 classpath:*、檢查 .hbm.xml 部署 |
| 樂觀鎖失效 | 版本字段未配置/未加鎖 | <version name="version" column="VERSION"/> |
@Configuration、@ComponentScan、@EnableTransactionManagement