程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> SSH整合,ssh整合實例

SSH整合,ssh整合實例

編輯:JAVA綜合教程

SSH整合,ssh整合實例


前言

所謂的SSH,就是表現層使用Struts2,業務邏輯層使用Spring,數據訪問層使用Hibernate,好了,廢話不多說,開打開打,哦,不,是開講開講。

前提,需要你熟悉Struts2,Spring,Hibernate的基本使用。

步驟,第一步,添加繁瑣的Jar包們,第二步:Spring整合Hibernate。第三步:Struts2整合Spring。

-------------------------------------------------不知道起啥名分割線--------------------------------------------------------------------------------

我在這四個文件中尋找jar包。

① 導入Struts jar包,struts-2.3.15.3\apps\struts2-blank\WEB-INF\lib下的jar包

 

上面落了一個Struts整和Spring的關鍵jar包:struts2-spring-plugin-2.3.15.3.jar,上面未列出。(共14個包)

②導入Spring jar包,一個是核心包:spring-framework-3.2.0.RELEASE\libs

另一個是依賴包:

   

其中,spring-orm.jar就是Spring整合Hibernate的關建包。(共13個包)

注意:若單獨引用Spring,還需引入一個依賴包:com.springsource.org.apache.commons.logging-1.1.1.jar,但是由於前面Struts2引入了commons-logging-1.1.3.jar包,所以不需要再次引用。其實,它們是一樣的代碼,只是Spring將其改了名字,自己可以查看代碼就會發現了。

③導入Hibernate Jar包

ehcache.jar包是Hibernate的二級緩存包,其依賴backport-util-concurrent.jar,和commons-logging.jar包。(共10個包)

Hibernate中也有一個javassist-3.12.0.GA.jar包,Struts2中已經引用了javassist-3.11.0.GA.jar,所有我替換成了12版本。上面未列出。

④當然,最後還有一個jar包,那就是mysql-connector-java-5.0.8-bin.jar

到此為止,共添加了38個包,包不再改動。

----------------------------------------情景設置分割線--------------------------------------------------------------------------------------------------

業務:用戶添加

實體類:User(兩個字段:name和age)

------------------------------[Spring+Hibernate]分割線-----------------------------------------------------------------------------------------------

Spring開始整合Hibernate,眾所周知,這兩個框架都有自己的配置文件,分別是:Spring的applicationContext.xml(名字任意),Hibernate的配置文件與映射文件hibernate.cfg.xml與【實體類】.hbm.xml文件。整合的結果就是Hibernate的配置文件消失(當然它的配置信息跑到了Spring的配置文件中去了)。

程序代碼:

//DAL層的用戶接口
public interface UserDao {
    boolean insert(User user);
}
//DAL層的用戶接口的具體實現
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Override
    public boolean insert(User user) {
        HibernateTemplate s=this.getHibernateTemplate();
        s.save(user);
        return true;
    }
}

applicationContext.xml文件配置:(User.hbm.xml不多說,沒區別)

    <!-- 使用C3P0得到數據源-->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.jdbc.Driver"></property>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="user" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
    <!-- 使用FactoryBean創建Spring得到 SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
          <!-- 把hibernate.cfg.xml文件中的配置信息注入進來,從而可以刪掉配置文件 -->
          <property name="dataSource" ref="dataSource"></property>
          <property name="hibernateProperties">
                  <props>
                      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                      <prop key="javax.persistence.validation.mode">none</prop>
                      <prop key="hibernate.show_sql">true</prop>
                      <prop key="hibernate.format_sql">true</prop>
                      <prop key="hibernate.hbm2ddl.auto">update</prop>
                      <prop key="hibernate.current_session_context_class">thread</prop>
                  </props>
          </property>
          <property name="mappingLocations" value="classpath:king/domain/User.hbm.xml"></property>
    </bean>
    <!-- 目的:創建DAO -->
    <bean id="userDao" class="king.dao.impl.UserDaoImpl">
          <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- Spring的事務管理之Hibernate,需要注入SessionFactory -->
    <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 通知 -->
    <tx:advice id="adviceId" transaction-manager="txManager">
         <tx:attributes>
             <tx:method name="*" propagation="REQUIRED" isolation="DEFAULT"/>
         </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:advisor advice-ref="adviceId" pointcut="execution(* king.dao.impl.*.*(..))"/>
    </aop:config>

測試代碼:

    @Test
    public void test1(){
        ClassPathXmlApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao user=app.getBean(UserDao.class);
        User u=new User();
        u.setAge(1);
        u.setName("King");
        user.insert(u);
        app.close();
    }

這樣就實現了Spring與Hibernate的整合,去掉了hibernate.cfg.xml文件,由原來直接操作SessionFactory,Session到現在我們操作Spring提供的類來操作。

解讀:

  • 1

之前我們使用Spring的JdbcTemplate時,需要DAL層對象繼承JdbcDaoSupport,而我們整合了Hibernate,就需要DAO對象繼承HibernateDaoSupport。而我們繼承這個類是為了得到HibernateTemplate對象,來操作數據庫,HibernateTemplate使用起來和Session類似,其底層就是采用Session。而數據源等等各種配置肯定在我們得到HibernateTemplate對象之前啦,所以這時肯定就需要注入【原來寫在hibernate.cfg.xml中的配置信息】。說到HibernateDaoSupport的注入,要麼注入SessionFactory,要麼注入HibernateTemplate。這裡我們注入SessionFactory。可以在上面的配置文件中看出。

  • 2  

說一下applicationContext.xml文件,我們要得到UserDaoImpl對象,需要往裡面注入SessionFactory。我們要得到SessionFactory,需要往裡面注入DataSource與各種配置信息。這裡的數據源(連接池)我們采用C3P0。

說一下UserDaoImpl對象的生成,我們得到的肯定是代理對象,因為下面已經加上了<aop:config></aop:config>標簽,所以是全自動方式的代理對象,是基於接口的JDK代理對象方式生成,當然也可以設置為CGlib生成代理對象,需要添加額外配置<proxy-target-class="true">

  • 4

這裡的代理對象的通知就是事務。通過txManager來對目標方法的前後添加【開啟事務】【提交事務/回滾事務等等操作】,然後返回代理對象。這時,我們所有的操作都是在事務之中,只要發生異常,事務就會回滾。這裡是聲明式事務。

  • 5

說一下我們加的幾個包的作用。

Spring-orm.jar  它就是Spring整合Hibernate的關鍵,它依賴spring-jdbc.jar包,因為它會用到其中的LobHandler類。

Spring-web.jar  它是讓Tomcat容器加載Spring配置文件的關鍵。因為我們需要容器為我們加載配置文件,創建代理對象。

slf4j-api.jar       SLF4J(Simple logging Facade for Java)不是一個真正的日志實現,而是一個抽象層,它允許你在後台使用任意一個日志類庫。如果是在編寫供內外部都可以使用的API或者通用類庫,那麼你真不會希望使用你類庫的客戶端必須使用你選擇的日志類庫。所以我們若要使用log4j,則還需引入slf4j-log4j.jar包。

----------------------------------------[Struts2+Spring]整合分割線-------------------------------------------------------------------

struts.xml:

<struts>
    <constant name="struts.devMode" value="true"/>
    <package name="User" namespace="/User" extends="struts-default">
         <!-- action的實例由struts來創建 -->
         <action name="AddUser" class="king.action.UserAction" method="addUser">
                 <result name="success" type="redirect">/success.html</result>
         </action>
    </package>
</struts>

web.xml:

  <!-- 這兩處配置是Spring為了整合Web,這是因為原來手動加載.xml文件,現在需要Tomcat啟動加載.xml文件,
       所以需要Spring整合Web,讓Tomcat加載配置文件,來實現注入,生成代理等等各種功能。spring-web.jar包在起作用。 -->    
  <!-- 很多Spring的jar包依賴commons-logging.jar包 
       Commons-logging.jar的目的是為“所有的Java日志實現”提供一個統一的接口。   -->                     
  <!-- 配置spring配置文件的位置 -->
  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!-- 如果只配置spring的監聽,則會加載默認的位置:src/applicationContext.xml 
       作用:啟動Web容器時,自動裝配ApplicationContext的配置信息。   -->
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
<!-- struts的過濾器 --> <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>

UserAction類:

/**
 * ActionSupport出自xwork-core.jar
 * 
 * 疑問:userDao是誰注入的?
 * 答案:struts2-spring-plugin.jar中的struts-plugin.xml,設置默認的對象工廠為Spring,由Spring進行注入。
 * 
 * @author King
 *
 */
public class UserAction extends ActionSupport implements ModelDriven<User> {
    private static final long serialVersionUID = 1885943501464870512L;
    private User user=new User();
    @Override
    public User getModel() {
        return user;
    }
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    public String addUser(){
        boolean isOk=userDao.insert(user);
        if(isOk){
            return "success";
        }else{
            return "fail";
        }
    }
}

這樣我們就實現了Struts2+Spring的整合,關鍵之處在於web.xml的配置和struts2-spring-plugin.jar中的struts-plugin.xml,兩個配置文件。

解讀:

  • 1

Struts2有一系列的配置文件按照一定順序加載 1 :default.propertities  2:struts-default.xml  3:struts-plugin.xml  4 :struts.xml。

而我們引入了struts2-spring-plugin.jar中,其中有struts-plugin.xml,裡面設置了對象工廠由Spring來創建。所以明明這裡的UserAction是Struts2創建的,但是UserDao對象是由Spring注入的,注意:<bean id="userDao"></bean>與代碼中    private UserDao userDao;   名字要相同,這樣Spring才能注入,否則會出現空指針異常。

  • 2

之前我們測試類中是手動加載applicationContext.xml文件,得到其中的bean,而整合了Struts2,我們發現沒有這個過程了,而Spring照樣正常工作,這是為啥呢?

這就是上面我們配置監聽類<listener-class>ContextLoaderListener</listener-class>的作用:加載applicationContext.xml文件,所以我們沒有手動加載配置文件而Spring正常工作的原因。你可以看,這個類所屬的包就是spring-web.jar,所以這個包也是整合它們的關鍵。

 

好了,到現在為止,SSH三大框架整合完畢。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved