三大框架整合原理

    三大框架SSH整合原理


                                       

                                                       SSH整合过程

  注意:在整合框架,每一大步都要测试,这样容易排查问题,否则出了问题要从头开始


1.导包:

    1)先将hibernate中的包全部导入进来  一共是11个  如下:

  jpa  注意  10 个包 + 1个驱动包

2).导入Struts2所有包          一共14个


   导包过程中,如果发现是同一个包,版本不同一定要将其中之一删除,原则是删除版本低的,

因为版本高的会兼容版本低的

         然后再导入struts2和spring整合的包         如下:

       一旦导入了这个包,Struts2在启动的时候会自动寻找spring容器,如果没有配置spring,

        就会出现异常


     3).导入spring的所有包  一共16个

        4+2基础的包

        2+2     aop

          4             c3p0  tx  springjdbc  数据库驱动

          1           test

           1          spring-web包

            1        spring -orm包

  


  2.测试spring是否配置成功:

             首选创建一个appliContext.xml

             导入4个约束:beans            contet        aop       tx


       在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

            1)先将struts2插件包删除

             2)然后书写struts.xml导入约束    书写刚刚的userAction的配置

              3)在web.xml中配置struts2的过滤器

                  4)测试


   4.整合spring和struts2

                          1)将刚刚删除的包导入进来

                           2)添加常量

                               

<!--struts.objectFactory = spring-->
<!--action的创建交给spring-->
<!--struts.objectFactory.spring.autoWire = name 默认开启-->
<!--spring负责装配的action的属性-->
<constant name="struts.objectFactory" value="spring"></constant>
<constant name="struts.objectFactory.spring.autoWire" value="name"></constant>

                 3) 有spring管理action(方法有两种)

                      一:

                        struts2创建action 有spring 负责struts2的属性注入struts2的配置文件 

<package name="main" namespace="/" extends="struts-default">
    <action name="userAction_*" class="cn.hd.action.UserAction" method="{1}">
        <result name="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">
        <property name="userService" ref="userService"></property>
</bean>

             二:完全交给spring去管理action

                   在配置action时的class 的属性值改为spring 中的bean的名字

                    struts2配置文件 

<package name="main" namespace="/" extends="struts-default">
    <action name="userAction_*" class="userAction" method="{1}">
        <result name="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" scope="prototype">
        <property name="userService" ref="userService"></property>
</bean>

                  注意:spring配置action要配置的类的创建模式为多例

            


   5.单独整合hibernate

                 1)书写实体类和orm数据源文件

                   2)书写配置文件

                     3)书写测试类 测试hibernate单独配置成功

                                  测试hibernate

                              

   @Test
public void fun(){
       Session session = Hibernate.getOpenSession();
       Transaction transaction = session.beginTransaction();

       User user = new User();
       user.setMoney(100);
       user.setPsd(123);
       user.setName("张二狗");
           session.save(user);
       transaction.commit();
       session.close();


   }

  6.hibernate和spring的结合

                  实际上结合的原理是hibernate中的sessionFactory和事务交给spring管理

                             有两种方案:                         

                        1)hibernate中的配置文件,在spring配置文件sessionFactory对象

<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">

    <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>

         书写测试代码:

@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class Demo1 {     @Resource(name = "sessionFactory")     private SessionFactory sessionFactory; @Test     public void fun(){         Session session = sessionFactory.openSession();         User user = session.get(User.class, 3);         System.out.println(user);     }

              2)不使用hibernate配置文件,所有配置写到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 name="userService" class="cn.hd.service.impl.UserServiceImpl"></bean>
    <bean name="userAction" class="cn.hd.action.UserAction">

        <property name="userService" ref="userService"></property>
    </bean>


<!--配置hibernate-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
   <!--读取第二种方案-->
   <!-- <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>-->

      <!--读取第二种方案-->
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url">jdbc:mysql://localhost:3306/sshdemo</prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">123</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>

            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.format_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">update</prop>
        </props>

    </property>
    <property name="mappingDirectoryLocations" value="classpath:cn/hd/entity"></property>

</bean>

     7.整合出c3po连接池

                      使用spring连接池的配置文件

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

                      配置bean连接池的配置配置文件

        

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClass" value="${jdbc.driverClass}"></property>
     <property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
    <property name="user" value="${jdbc.user}"></property>
    <property name="password" value="${jdbc.password}"></property>
</bean>

                  将hibernate中的数据库配置删除,增加一个propertity为dataSource

<property name="dataSource" ref="dataSource"></property>



8.整合状态下 操作数据库(dao)

                1)书写dao类 并让dao继承hibernateDaoSuppert

                  2)提供一个hibernateTemolate模块

             这个模块可以实现hibernate的crud   hql  criteria      sql 四种查询


   

User user = getHibernateTemplate().get(User.class, 1);
return user;


9.整合spring aop 事务

                1)获得事务管理对象

                     DataSourceTransaction

                     HibernateTransactionManager

                  

<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:method name="add*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="persist*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="*modify" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
        <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true"/>
        <tx:method name="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:advisor pointcut-ref="tXpc" advice-ref="txAdvice"></aop:advisor>
 </aop:config>



 10.介绍template模块
        

使用hiberTemplate.execute就拿到了session

 回到了原始的hibernate开发

  return   this.getHibernateTemplate().execute(new HibernateCallback <List<User>>() {
        @Nullable
        @Override
        public List<User> doInHibernate(Session session) throws HibernateException {
              String hql="from User";
            Query query = session.createQuery(hql);
            List<User> list = query.list();
          return list;
        }
    });






               各位大姐姐大哥哥们  希望你们可以对文章提出建议,共同进步

猜你喜欢

转载自blog.csdn.net/qq_41961660/article/details/80947280