歡迎浏覽Java工程師SSH教程從零打造線上網盤系統系列教程,本系列教程将會使用SSH(Struts2+Spring+Hibernate)打造一個線上網盤系統,本系列教程是從零開始,是以會詳細以及着重地闡述SSH三個架構的基礎知識,第四部分将會進入項目實戰,本篇我們一起進入項目實戰篇-SSH架構整合
歡迎浏覽Java工程師SSH教程從零打造線上網盤系統系列教程,本系列教程将會使用SSH(Struts2+Spring+Hibernate)打造一個線上網盤系統,本系列教程是從零開始,是以會詳細以及着重地闡述SSH三個架構的基礎知識,第四部分将會進入項目實戰,如果您已經對SSH架構有所掌握,那麼可以直接浏覽第四章,源碼均提供在GitHub/ssh-network-hard-disk上供大家參閱
本章目标
- Struts2和Hibernate整合
- Struts2,Spring,Hibernate整合
既然本章将的是整合Struts2,Spring,Hibernate三大架構,為何還要提及Struts2和Hibernate的整合呢?我希望小夥伴們能在Struts2和Hibernate的整合中明白如果缺少Spring架構裝配各層需要的Bean是多麼遺憾的一件事啊!如果沒有Spring我們在整合Struts2和Hibernate将會面臨以下問題
- 頻繁建立和管理各層實作類,使程式耦合嚴重
- 頻繁編寫管理資料庫連結及事務等模闆代碼
- ...
Struts2和Hibernate整合 示例源碼下載下傳
下圖所示是使用Struts2和Hibernate整合編寫的一個WEB網頁,各位運作本節示例源碼通路http://localhost:8080/index.jsp 本章三種整合完整工程均可通過github下載下傳
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTNxMDM3kDMx0CN0kzN0EjMyETMyETM4EDMy0CM2ADOxITMvwVMxgTMwIzLcBjNwgTMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
在Struts2和Hibernate的整合中,為了避免"頻繁建立和管理各層實作類,使程式耦合嚴重" ,在示例源碼中使用工廠模式來管理實作類;為了避免"頻繁編寫管理資料庫連結及事務等模闆代碼"問題,在示例源碼中使用了 HibernateSessionFactory工具類來統一管理Hibernate的Session的管理,但是這些解決方法,僅僅能避免我們少寫一些代碼,當随着程式的增大,我們仍然要面臨解耦和重複編碼問題
Struts2,Spring,Hibernate整合 示例源碼下載下傳
我們在Struts2和Hibernate整合中可以看到,我們需要使用Spring來替我們解決程式的解耦和重複編碼問題,那麼Spring是如何來解決問題的呢?(依賴注入)
- 整合思路
- Struts2和Spring整合
- Spring和Hibernate整合
- 整合步驟
第一步:導入依賴(這裡有坑,注意Spring的版本不要太高)
<dependencies>
<!--Spirng-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--Spring-orm-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--Hibernate-->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.3.7.Final</version>
</dependency>
<!--Struts2-->
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.16</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-convention-plugin</artifactId>
<version>2.5.18</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.5.17</version>
</dependency>
<!--資料庫相關-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency>
<!--Servlet相關-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
第二步:确定配置檔案
Struts2-Spring整合方式1 :即Struts2的Action由Struts2本身進行管理,Spring不參與操作,當依賴包存在Struts2-spring插件時,該插件會自動将Service服務注入到Action 本章三種整合完整工程均可通過github下載下傳
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTNxMDM3kDMx0CN0kzN0EjMyETMyETM4EDMy0CM2ADOxITMvwVMxgTMwIzLcBjNwgTMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
public class UserAction extends ActionSupport implements ModelDriven<User> {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
@Action(value = "getUser", results = {
@Result(name = "success", location = "/index.jsp")
})
public String get() throws Exception {
User user = userService.get(this.user.getId());
ValueStack valueStack = ActionContext.getContext().getValueStack();
valueStack.set("user", user);
return SUCCESS;
}
......
}
Struts2-Spring整合方式2 :即Struts2的Action不再由Struts2本身管理,而交由Spring進行管理 本章三種整合完整工程均可通過github下載下傳
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTNxMDM3kDMx0CN0kzN0EjMyETMyETM4EDMy0CM2ADOxITMvwVMxgTMwIzLcBjNwgTMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
<!--Spring配置WEB層-->
<bean name="userAction" class="com.jimisun.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
<!--在Struts2僅僅配置映射關系-->
<package name="ssh" extends="struts-default" namespace="/">
<global-results>
<result name="success">/index.jsp</result>
</global-results>
<action name="addUser" class="userAction" method="add">
</action>
<action name="getUser" class="userAction" method="get">
</action>
</package>
Spring-Hibernate整合 :當Hiberante和Spring一同使用的時候,我們不再需要hibernate.cfg.xml檔案,那麼怎麼配置hibernate呢?我們可以使用Spring配置嘛
<!--配置Hibernate-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 先加載連接配接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 加載方言,加載可選 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 引入映射的配置檔案 -->
<property name="mappingResources">
<list>
<value>com/jimisun/domain/User.hbm.xml</value>
</list>
</property>
</bean>
整合結果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLygTNxMDM3kDMx0CN0kzN0EjMyETMyETM4EDMy0CM2ADOxITMvwVMxgTMwIzLcBjNwgTMyEzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
本章小結
本章通過Struts2和Hibernate的整合明白了我們要重複進行編碼和解耦,而通過使用Spring的依賴注入讓我們不再頻繁管理Bean,通過Spring的面向切面程式設計我們不再編寫類似擷取事務送出事務等操作..... 當然本章不是Spring的教程,具體請移步另一系列教程Java開發上帝之眼教程,本章仍然着重關注SSH的整合,本章提供的整合工程均可通過Github下載下傳
雜家不如專家,精益求精