ssh三個框架整合筆記詳解

 三大框架整合的原理


ssh整合過程

注意:在整合框架的過程中,每一大步都要測試,在這樣容易排查問題,出現問題從頭開始。

1、導包

(1)、先將Hibernate中的包全部導入進來。

Jap 注意:10個包+一個驅動包。

(2)、再將Struts2中的包導入進來。

導包時,如果發現是同一個包,版本不同一定要將其中之一刪掉,原則是刪除低版本。

再導入Struts2和spring整合的包

       一旦導入了這個包,struts2在啓動時會自動尋找spring容器,如果沒有配置spring,就會出現異常。

(3)、導入spring的所有包 16

             

              4+2       基本的包

              2+2       aop

              4     c3p0     tx  spring jdbc數據庫驅動包    spring Jdbc

              1  test

1         spring web 包

1     orm 包

一共40個包。

2、測試spring是否配置成功

(1)、首先創建一個applicationContext.xml

(2)、導入4個約束,beans context    aop      tx

(3)、在web.xml中配置監聽器

<!--監聽器-->

<listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--項目一啓動自動加載配置文件-->
<context-param>
    <param-name>contextConfigLocation</param-name>
   <param-value>classpath:applicationContext.xml</param-value>
</context-param>

3、單獨配置Struts2

       先把Struts2插件包刪除

       然後書寫struts.xml文件,導入約束,書寫剛剛的userAction的配置。在web.xml文件中配置struts2的過濾器。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
        "-//Apache SoftwareFoundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!--友好提示-->
    <constant name="struts.devMode"value="true"></constant>

    <!--
        action的創建交給spring
        struts.objectFactory = spring
     -->
    <constant name="struts.objectFactory"value="spring"></constant>
    <!--
        spring負責裝配的action的屬性
       struts.objectFactory.spring.autoWire = name
     -->
    <constant name="struts.objectFactory.spring.autoWire"value="name"></constant>

    <package name="main" namespace="/"extends="struts-default">
        <action name="userAction_*"class="userAction" method="{1}">
            <result name="success">/index.jsp</result>
        </action>
    </package>
</struts>

       測試

4、整合Spring和struts2

(1)、將剛剛刪除的包導入進來。

      

(2)、添加常量

       <!—


    action的創建交給spring
    struts.objectFactory = spring
 -->
<constant name="struts.objectFactory"value="spring"></constant>
<!--
    spring負責裝配的action的屬性
    struts.objectFactory.spring.autoWire= name
 -->
<constant name="struts.objectFactory.spring.autoWire"value="name"></constant>

 

(3)、由spring管理action(兩種方式)

       一、由struts2創建action   spring負責struts2的屬性注入。

Struts2配置文件

<package name="main"namespace="/" extends="struts-default">


    <actionname="userAction_*" class="cn.hd.action.UserAction"method="{1}">
        <resultname="success">/index.jsp</result>
    </action>
</package>

Spring配置文件

<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>


<bean name="userAction"class="cn.hd.action.UserAction">
    <propertyname="userService" ref="userService"></property>
</bean>

 

       二、完全交給spring去管理action

       在配置action的時候,class的屬性值改爲在spring中bean的名字。

Struts2配置文件

<package name="main"namespace="/" extends="struts-default">


    <actionname="userAction_*" class="userAction"method="{1}">
        <resultname="success">/index.jsp</result>
    </action>
</package>

Spring配置文件

<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>


<bean name="userAction"class="cn.hd.action.UserAction">
    <propertyname="userService" ref="userService"></property>
</bean>

注意:spring配置action要配置的類的創建模式爲多例。

<bean name="userService"class="cn.hd.service.impl.UserServiceImpl"></bean>

<bean name="userAction"class="cn.hd.action.UserAction" scope="prototype">
    <propertyname="userService" ref="userService"></property>
</bean>

5、單獨整合Hibernate

(1)、書寫實體類和orm數據源文件

(2)、書寫核心配置文件

              將線程綁定

              事務隔離級別刪除掉,後面使用Spring管理事務。

(3)、書寫測試類,測試Hibernate單獨配置成功

package cn.hd.test;


import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class Demo {
    @Test
    public void fun1(){

        Configuration configuration = newConfiguration().configure();
        SessionFactory sessionFactory =configuration.buildSessionFactory();
        Session session =sessionFactory.openSession();
        Transaction transaction =session.beginTransaction();

        User user = new User();
        user.setMoney(10000);
        user.setName("李四");
        user.setPsd("123456");
        session.saveOrUpdate(user);

        transaction.commit();

    }
}

6、Hibernate和Spring的結合

       實際上結合的原理就是Hiernate當中的sessionFactory和事務交給Spring管理。

一、      hibernate中的配置文件不動,在spring配置文件中配置sessionFactory對象。

<!--orm包下-->


<bean name="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <propertyname="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>

 

package cn.hd.test;


import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {

    @Resource(name = "sessionFactory")
    private SessionFactorysessionFactory;
    @Test
    public void fun1(){
        Session session =sessionFactory.openSession();
        User user =session.get(User.class, 1);
        System.out.println(user);

    }
}

二、      不使用hibernate配置文件,所有配置文件寫入到spring配置文件中。

<!--第二種-->

<bean name="sessionFactory"class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <propertyname="hibernateProperties">
        <props>
            <!--必寫-->
            <propkey="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <propkey="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo?useUnicode=true&amp;characterEncoding=utf-8</prop>
            <propkey="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">123</prop>
            <propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <!--可選-->
            <propkey="hibernate.show_sql">true</prop>
            <propkey="hibernate.format_sql">true</prop>
            <propkey="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>
    <!--配置源數據-->
    <propertyname="mappingDirectoryLocations"value="classpath:cn/hd/entity"></property>
</bean>

 

package cn.hd.test;


import cn.hd.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class Demo1 {

    @Resource(name ="sessionFactory")
    private SessionFactorysessionFactory;
    @Test
    public void fun1(){
        Session session =sessionFactory.openSession();
        User user =session.get(User.class, 1);
        System.out.println(user);

    }
}

7、整合c3p0連接池

(1)、使用spring讀取連接池的配置文件

<context:property-placeholder

location="classpath:db.properties"></context:property-placeholder>

(2)、配置連接池的bean

<bean name="dataSourse"class="com.mchange.v2.c3p0.ComboPooledDataSource">

<propertyname="driverClass"value="${jdbc.driverClass}"></property>
    <property name="jdbcUrl"value="${jdbc.jdbcUrl}"></property>
    <property name="user"value="${jdbc.user}"></property>
    <propertyname="password"value="${jdbc.password}"></property>
</bean>

(3)、將hibernate中的數據庫配置刪除掉,增加一個properties爲dataSource

<bean name="sessionFactory"

class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <!--得到dataSource-->
    <propertyname="dataSource" ref="dataSourse"></property>

    <propertyname="hibernateProperties">
        <props>
            <!--必寫-->
            <!--<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <propkey="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo?useUnicode=true&amp;characterEncoding=utf-8</prop>
            <propkey="hibernate.connection.username">root</prop>
            <propkey="hibernate.connection.password">123</prop>-->
            <propkey="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <!--可選-->
            <propkey="hibernate.show_sql">true</prop>
            <propkey="hibernate.format_sql">true</prop>
            <propkey="hibernate.hbm2ddl.auto">update</prop>
        </props>
    </property>

8、整合狀態下操作數據庫(dao)

       書寫dao類並讓dao類繼承HibernateDaoSupport

       提供了一個HibernateTemplate模板

       這個模板可以實現hibernate      crud     hql criteria sql四種查詢

public class UserDaoImpl extendsHibernateDaoSupport implements UserDao {


    @Override
    public void add(User user) {
        /*可以將它當成session來用*/
        HibernateTemplate ht =getHibernateTemplate();
        ht.save(user);
    }

9、整合Spring AOP事務

(1)、獲得事務管路對象

<bean name="transactionManager"

class="org.springframework.orm.hibernate5.HibernateTransactionManager"></bean>

(2)、配置事務通知

<!--配置事務-->

<bean name="transactionManager"class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory"ref="sessionFactory"></property>
</bean>
<!--配置事務通知-->
<tx:advice id="txAdvice"transaction-manager="transactionManager">
    <tx:attributes>
        <tx:methodname="add*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="persist*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>

        <tx:methodname="delete*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="remove*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>

        <tx:methodname="update*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>
        <tx:methodname="modify*" isolation="DEFAULT"propagation="REQUIRED" read-only="false"/>

        <tx:methodname="get*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
        <tx:methodname="find*" isolation="DEFAULT"propagation="REQUIRED" read-only="true"/>
    </tx:attributes>
</tx:advice>
<!--將事務織入到目標對象-->
<aop:config>
    <!--切點-->
    <aop:pointcut id="txPc"expression="execution(*cn.hd.service.impl.*ServiceImpl.*(..))"></aop:pointcut>
    <!--切面-->
    <aop:advisorpointcut-ref="txPc"advice-ref="txAdvice"></aop:advisor>
</aop:config>

10、介紹Template模板

       使用HibernateTemplate.excute方法就拿到了session

       回到了原始的Hibernate開發

@Override

public List<User> getAll() {
   returnthis.getHibernateTemplate().execute(newHibernateCallback<List<User>>() {
        @Nullable
        @Override
        public List<User>doInHibernate(Session session) throws HibernateException {
            String hql = "fromUser";
            Query query =session.createQuery(hql);
            List<User> list =query.list();
            return list;
        }
    });
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 


發佈了87 篇原創文章 · 獲贊 381 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章