SSH架構整合思想
三大架構應用在JavaEE三層結構,每一層都用到了不同的架構。SSH架構整合的思想可用下圖來表示:
SSH架構的整合方式一:零障礙整合(帶有Hibernate設定檔)
我們先整合Struts2和Spring這兩個架構,再整合Spring和Hibernate這兩個架構。 整合Struts2和Spring架構
整合Struts2和Spring這兩個架構要解決的事情就是把Struts2的Action的建立交給Spring來配置。
第一步,建立Web項目,匯入Struts2架構相關的jar包。
要進行Struts2的基本的開發,可以參考struts-2.3.24中的apps下的一些範例程式碼,其中struts2-blank.war是一個Struts2的空的工程。我們只需要將struts2-blank.war解壓後進入到WEB-INF下的lib中查看。
除此之外,對於Struts2還需要瞭解以下jar包: struts2-convention-plugin-2.3.24.jar:Struts2註解的開發包 struts2-json-plugin-2.3.24.jar:Struts2整合AJAX返回JSON資料 struts2-spring-plugin-2.3.24.jar:Struts2整合Spring的外掛程式包。在本文中,我只匯入了這個jar包。
第二步,編寫一個Action。
在src目錄下建立一個cn.itcast.action包,並在該包下建立一個UserAction。
public class UserAction extends ActionSupport { @Override public String execute() throws Exception { System.out.println("action.........."); return NONE; }}
第三步,建立Struts2的核心設定檔,該核心設定檔的位置是在src目錄下面,名稱是struts.xml。並且在該核心設定檔配置UserAction。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <package name="demo" extends="struts-default" namespace="/"> <action name="user" class="cn.itcast.action.UserAction"></action> </package></struts>
此時UserAction類由Struts2自己建立。
注意:Struts2和Spring架構整合的時候,Struts2核心設定檔的名稱和位置是有固定要求的,即名稱只能是struts.xml,且必須位於src目錄下面。
第四步,配置Struts2的過濾器。即在web.xml設定檔中添加如下配置:
<!-- 配置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>
第五步,匯入Spring架構相關的jar包。 Spring架構基本開發的jar包:
AOP開發相關的jar包:
與JDBC開發相關的jar包:
與交易管理的開發相關jar包:
整合Hibernate的jar包:
整和Web項目的jar包:
第六步,建立Spring的核心設定檔——bean1.xml。
引入約束
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"></beans>
配置Spring的監聽器,即在web.xml設定檔中添加如下配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
指定Spring設定檔的位置,即在web.xml設定檔中添加如下配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:bean1.xml</param-value> <!-- 因為bean1.xml設定檔在src目錄下,故可直接這樣寫 --></context-param>
第七步,把UserAction交給Spring進行配置,即在Spring設定檔中添加如下配置:
<!-- 配置action對象 --><bean id="userAction" class="cn.itcast.action.UserAction" scope="prototype"></bean>
這時,在Spring設定檔——bean1.xml中配置了UserAction對象,在Struts2設定檔——struts.xml中也配置了UserAction對象。很顯然,這種做法是不可取的。解決思路是只需要在Spring設定檔裡面配置UserAction對象,而不要在Struts2設定檔中配置。所以,Struts2設定檔應該改為:
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"><struts> <package name="demo" extends="struts-default" namespace="/"> <!-- 在action標籤裡面不要寫action全路徑,class屬性值寫在Spring配置action對象的bean標籤的id值 --> <action name="user" class="userAction"></action> </package></struts>
到這裡,Struts2和Spring架構已經整合好了,現在就需要測試是否真如我們所願了。
在src目錄下建立一個cn.itcast.dao包,並在該包下編寫Dao層的一個類——UserDao.java。
public class UserDao { public void add() { System.out.println("dao.............."); }}
然後在src目錄下建立一個cn.itcast.service包,並在該包下編寫Service層的一個類——UserService.java,並在該類中調用UserDao類裡面的方法。
public class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service.............."); userDao.add(); }}
接著在UserAction類裡面調用UserService類裡面的方法。
public class UserAction extends ActionSupport { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } @Override public String execute() throws Exception { System.out.println("action.........."); userService.add(); return NONE; }}
相應地,Spring的核心設定檔就要修改為:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置action對象 --> <bean id="userAction" class="cn.itcast.action.UserAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <bean id="userService" class="cn.itcast.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="cn.itcast.dao.UserDao"></bean></beans>
最後,在瀏覽器地址欄中輸入地址http://localhost:8080/Spring_day04_demo1/user.action,即可在Eclipse控制台看到如下輸出結果:
action……….
service…………..
dao………….. 整合Spring和Hibernate架構
我之前也說過,要整合Spring和Hibernate架構,須解決下面兩件事情: 把Hibernate核心設定檔裡面的資料庫資訊的配置交給Spring來管理。 把Hibernate裡面的SessionFactory的建立交給Spring來管理。
下面我就來詳細介紹Spring架構整合Hibernate架構的具體實現。
第一步,匯入Hibernate開發相關的jar包。
首先匯入lib/required目錄下所有的jar包,因為在該目錄下,包含運行Hibernate項目必須的jar包。
再匯入mysql資料庫的驅動jar包:
接著再匯入日誌相關的jar包:
其中log4j的包由Spring匯入。
在進行這一步時,可能會遇到以下兩個問題: 匯入Struts2和Hibernate的jar包時有jar包衝突問題(兩個jar包功能相同,但版本不一樣),即在Struts2裡面有一個這樣的jar包:
在Hibernate裡面也有這樣的一個jar包:
解決方式很簡單了,就是刪除那個低版本的jar包。 Spring整合持久化層架構時,還須匯入如下jar包:
第二步,搭建Hibernate開發環境。
建立實體類。在src目錄下建立一個cn.itcast.entity包,並在該包下編寫一個User實體類。
public class User { private Integer uid; private String username; private String address; public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; }}
配置實體類映射關係,即在cn.itcast.entity包中建立User.hbm.xml對應檔:
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated 2017-4-5 14:44:57 by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="cn.itcast.entity.User" table="t_user"> <id name="uid" type="java.lang.Integer"> <column name="uid" /> <generator class="native" /> </id> <property name="username" type="java.lang.String"> <column name="username" /> </property> <property name="address" type="java.lang.String"> <column name="address" /> </property> </class></hibernate-mapping>
建立Hibernate核心設定檔,即在src目錄下引入hibernate.cfg.xml檔案。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 配置關於資料庫連接的四個項:driverClass url username password --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernateTest</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">yezi</property> <!-- 可以將向資料庫發送的SQL語句顯示出來 --> <property name="hibernate.show_sql">true</property> <!-- 格式化SQL語句 --> <property name="hibernate.format_sql">true</property> <!-- hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 自動建立表 --> <property name="hibernate.hbm2ddl.auto">update</property> <mapping resource="cn/itcast/entity/User.hbm.xml" /> </session-factory></hibernate-configuration>
注意:如果只是單純使用Hibernate架構,那麼核心設定檔名稱必須是hibernate.cfg.xml且位置必須在src目錄下。但Hibernate和Spring架構整合的時候,Hibernate核心設定檔的名稱和位置是沒有固定要求的。
第三步,把Hibernate核心設定檔中的資料庫配置的資訊交給Spring進行配置。即把Hibernate核心設定檔中的資料庫資訊的配置去掉,改在Spring的核心設定檔中配置:
<!-- 配置串連池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///spring_lee"></property> <property name="user" value="root"></property> <property name="password" value="yezi"></property></bean>
第四步,把Hibernate裡面的SessionFactory的建立交給Spring來配置。具體思路為:伺服器啟動的時候,載入Spring設定檔,繼而把設定檔中的對象都建立完畢。故可把SessionFactory對象的建立也在Spring設定檔進行配置。又因為建立SessionFactory對象的代碼不是簡簡單單new出來的,而是多行代碼實現的,核心代碼如下:
// 載入核心設定檔config = new Configuration().configure();// 建立SessionFactory對象sessionFactory = config.buildSessionFactory();
所以我們不可能在Spring設定檔中通過一個<bean>標籤就簡簡單單地進行配置。Spring架構針對上面這種情況,幫我們封裝了一個類,配置這個類的對象就可以建立SessionFactory對象了。所以我們應在Spring設定檔中添加如下內容:
<!-- 配置sessionFactory的建立 --><bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <!-- 1.指定資料庫位置 --> <property name="dataSource" ref="dataSource"></property> <!-- 2.指定使用的Hibernate核心設定檔位置 --> <property name="configLocations" value="classpath:hibernate.cfg.xml"></property></bean>
第五步,之前我就講過Spring針對JavaEE三層結構中的每一層都提供了不同的技術,在dao層,Spring提供了JDBC模板的技術,可對資料庫進行CRUD操作。Spring提供了很多持久層技術的模板類簡化了編程,如下圖:
現在我們就要在dao層裡面使用HibernateTemplate模板類,至於它是什麼,我待會將做簡單介紹。具體操作為:向UserDao裡面注入HibernateTemplate模板類對象,並調用HibernateTemplate模板類裡面的save方法向資料庫表中添加一條記錄。這樣UserDao類的代碼就應修改為:
public class UserDao { // 在Dao裡面注入HibernateTemplate模板對象 private HibernateTemplate hibernateTemplate; public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void add() { // 向表中添加記錄 // 使用hibernateTemplate實現添加 // HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory); // hibernateTemplate.save(entity); System.out.println("dao.............."); User user = new User(); user.setUsername("李阿昀"); user.setAddress("湖北天門"); hibernateTemplate.save(user); }}
當然了,Spring設定檔的修改是必不可少的啦。所以應向Spring設定檔添加如下配置:
<bean id="userDao" class="cn.itcast.dao.UserDao"> <property name="hibernateTemplate" ref="hibernateTemplate"></property></bean><!-- 建立HibernateTemplate模板對象 --><bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <!-- 注入sessionFactory --> <property name="sessionFactory" ref="sessionFactory"></property></bean>
第六步,配置Spring的交易管理。
配置交易管理員
<!-- 1.配置事務的管理器 --><bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property></bean>
註解交易管理的開啟
<!-- 2.開啟事務註解 --><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
在業務層添加一個@Transactional註解
@Transactionalpublic class UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service.............."); userDao.add(); }}
這時啟動tomcat伺服器,就會探索資料庫中多了一個t_user表,這是理所應當的啦。接著在瀏覽器地址欄中輸入地址http://localhost:8080/Spring_day04_demo1/user.action進行訪問,即可看到t_user表多了一條記錄,如下:
至此,hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大架構就已整合完畢。 HibernateTemplate介紹
HibernateTemplate對Hibernate架構進行了封裝,直接調用HibernateTemplate裡面的方法即可實現對資料庫進行CRUD的操作。
HibernateTemplate常用的方法如下: Serializable save(Object entity):添加操作 void update(Object entity):修改操作 void delete(Object entity):刪除操作 <T> T get(Class<T> entityClass, Serializable id):根據id查詢 <T> T load(Class<T> entityClass, Serializable id):根據id查詢 List find(String queryString, Object... values):查詢操作的方法 SSH架構整合過程總結 匯入相關的jar包。
一共有42個jar包。 搭建Struts2的開發環境
建立Action,引入struts.xml設定檔,並配置Action 配置Struts2架構的過濾器 搭建Hibernate的開發環境
建立實體類 配置實體類和資料庫表之間的映射關係 建立Hibernate核心設定檔,主要是引入映射設定檔 搭建Spring的開發環境
建立Spring核心設定檔 讓Spring設定檔在伺服器啟動時候進行載入
配置監聽器 指定Spring設定檔的位置 Struts2和Spring架構的整合
把Struts2的Action的建立交給Spring來配置(記住Action是多執行個體的對象)。 在struts.xml設定檔中的action標籤的class屬性裡面寫上bean的id值。 Spring和Hibernate架構的整合
把Hibernate核心設定檔裡面的資料庫資訊的配置交給Spring來管理。 把Hibernate裡面的SessionFactory的建立交給Spring來管理。 在dao裡面使用HibernateTemplate模板類
在dao裡面注入HibernateTemplate模板類對象 在HibernateTemplate模板對象中注入SessionFactory 配置Spring的交易管理 SSH架構的整合方式二:不帶Hibernate設定檔
Spring整合Hibernate架構的時候,可以不用寫Hibernate的核心設定檔。下面我就舉個例子來示範。
首先複製以上SSH項目,再在其基礎上進行修改。
然後查看之前寫的Hibernate核心設定檔,可知Hibernate核心設定檔包含如下內容: 串連資料庫必要的參數 Hibernate的屬性 串連池的配置 對應檔的引入
Spring整合Hibernate架構的時候,雖然可以不用寫Hibernate的核心設定檔,但還是要把Hibernate核心設定檔中的基本資料配置和對應檔的引入放到Spring設定檔中進行配置。所以Spring設定檔的內容應修改為:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 配置串連池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="com.mysql.jdbc.Driver"></property> <property name="jdbcUrl" value="jdbc:mysql:///spring_lee"></property> <property name="user" value="root"></property> <property name="password" value="yezi"></property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <!-- <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> --> <!-- 如果不寫Hibernate的核心設定檔,你就不需要寫上面這行配置了 --> <!-- 1.把Hibernate的基本資料的配置(寫在這兒) --> <property name="hibernateProperties"> <props> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> </props> </property> <!-- 2.把對應檔引入 --> <property name="mappingResources"> <list> <value>cn/itcast/entity/User.hbm.xml</value> <!-- <value>...</value> --> </list> </property> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <tx:annotation-driven transaction-manager="transactionManager"/> <bean id="userAction" class="cn.itcast.action.UserAction" scope="prototype"> <property name="userService" ref="userService"></property> </bean> <bean id="userService" class="cn.itcast.service.UserService"> <property name="userDao" ref="userDao"></property> </bean> <bean id="userDao" class="cn.itcast.dao.UserDao"> <property name="hibernateTemplate" ref="hibernateTemplate"></property> </bean> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"></property> </bean></beans>
至此,hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大架構就又整合完畢。兩種方式任君選擇。