hibernate-5.0.7+struts-2.3.24+spring-4.2.4三大架構整合_spring

來源:互聯網
上載者:User
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三大架構就又整合完畢。兩種方式任君選擇。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.