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;
        }
    });
}


发布了88 篇原创文章 · 获赞 383 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/weixin_42047611/article/details/80957998