Spring-day4-三大框架的整合

一、导包

     1.hibernate导包

hibernate的必须包:

以及java的持久化规范接口包:

数据库的驱动:

2.struct2包

struct2中必须懂得包:

struct2中整合Spring的包:这个包导入之后,struct2启动时就会找Spring容器,找不到就会出现异常。

3.Sping包

基本的包4+2:core|beans|expression|context|和两个日志包:logging和log4g。

整个web的包:web

aop包4:aop,aspect,aop联盟,aopweaving包

整合hibernate事务的包:Spring-jdbc,Spring-tx,c3p0,Spring-org;

4.整合junit的包

Spring-test

5.标签库

standard.jar,jstl-1.2.jar

一共41个包。

二、单独配置Spring容器

1.创建配置文件,并导入约束。

applicationContext.xml

2.配置容器随项目的启动而创建。(监听器)

<!-- 配置Spring容器随项目的启动而创建 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 配置Spring配置文件位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

三、单独配置struts2

1.配置Struts2的主配置文件

struts.xml

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <package name="User" namespace="/" abstract="struts-default">
        <action name="userAction_*" class="cn.guanyq.web.UserAction" method="{1}">
            <result name="success">/Test.jsp</result>
        </action>
    </package>
</struts>

2.配置struts2的核心过滤器。

<!-- 配置Struct的核心过滤器 -->

    <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>

四、struts2于Spring的整合

1.常量的配置。

在struts.xml文件中配置常量。将Action交给Spring容器

<!--# struts.objectFactory = spring  -->
<constant name="struts.objectFactory" value="spring"></constant>

2.将Action对象注册到Spring容器中

注意Action对象应该是多例的,因为每次请求都会创建一个。

<!-- 注册Action对象 -->
      <bean name="userAction" class="cn.guanyq.web.UserAction" scope="prototype"></bean>

3.整合

方案1:什么都不改,也不用在Spring内部注册Action,只需要配置常量即可,此时由Sturts2创建Action,但是由Spring自动组装内部依赖关系。但是注意,内部的对象的变量要和注册的名字相同,自动组装

方案2:在Struts.xml内部配置的Class处填上,Spring注册的Action的name属性。Action内部的依赖性需要自己手动配置。

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

 

五、单独配置hibernate

1.配置bean的主配置文件和orm配置文件。

User.hbm.xml

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

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.guanyq.bean">
    <class name="User" table="user">
        <id name="uid">
            <generator class="native"></generator>
        </id>
        <property name="uname"></property>
    </class>
</hibernate-mapping>

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>
       <!-- 数据库驱动 -->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
         <!-- 数据库url -->
        <property name="hibernate.connection.url">jdbc:mysql:///test</property>
         <!-- 数据库连接用户名 -->
        <property name="hibernate.connection.username">root</property>
         <!-- 数据库连接密码 -->
        <property name="hibernate.connection.password">123</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
         <!-- 将hibernate生成的sql语句打印到控制台 -->
        <property name="hibernate.show_sql">true</property>
        <!-- 将hibernate生成的sql语句格式化(语法缩进) -->
        <property name="hibernate.format_sql">true</property>
        
        <property name="hibernate.hbm2ddl.auto">update</property>
    <mapping resource="cn/guanyq/bean/User.hbm.xml"/>
    
    </session-factory>
    </hibernate-configuration>

六、hibernate和Spring的整合

1.整合的原理就是讲sessionFactory对象放入Spring容器中。

配置方案一:仍然使用外部的hibernate.cfg.xml配置文件。

<!-- 注册hibernate的sessionFactory对象 --> 
      <bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
         <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
      </bean>

配置方案2:在Spring的配置中放置hibernate的配置信息。

bean name="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
                <prop key="hibernate.connection.url">jdbc:mysql:///test</prop>
                <prop key="hibernate.connection.username">root</prop>
                <prop key="hibernate.connection.password">123</prop>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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/guanyq/bean"></property>
    </bean>

这个时候也就不需要hibernate.cfg.xml这个配置文件了。

七、Spring整合c3p0连接池

1.读取c3p0连接池必须的配置文件。

<!--读取连接池所必须的配置文件  -->
    <context:property-placeholder location="classpath:db.properties"/>

2.注册连接池

<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
      <!-- 创建datasource时需要的配置配置注入 -->
        <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>

3.src下的db.properties连接池配置信息为:

jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql:///需要连接的库
jdbc.user=root
jdbc.password=123

4.将连接池注入到sessionFactory中

   <bean name="sessionFactory"
        class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"></property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</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/guanyq/bean"></property>
    </bean>

八、Spring整合hibernate操作数据库。

1.数据库的操作在dao层,需要注入sessionFactory,利用sessionFactory对象来操作数据库。在这里dao层的实现类只需要继承HibernateDaoSupport就可以注入sessionFactory。

 

2.然后再利用hibernate模板来操作。

  return  getHibernateTemplate().execute(new HibernateCallback<User>() {

            @Override
            public User doInHibernate(Session session) throws HibernateException {
                // TODO Auto-generated method stub
                String hql="from User where uid=?";
                Query query = session.createQuery(hql);
                query.setParameter(0, id);
                User result = (User) query.uniqueResult();
                return result;
            }            
        });

在Dao层调用execute方法和HibernateCallback匿名内部类获得session对象,来操作。

 

九、Spring中的aop事务

1.注册事务的核心管理器。

<!-- 注册事务核心管理器 -->
    <bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager" >
    <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

 

内部需要注入sessionFactory对象。

2.xml配置aop事务

1)配置通知。

<!-- 配置通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
            <tx:method name="persist*" 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="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
            <tx:method name="remove*" isolation="DEFAULT" propagation="REQUIRED" read-only="false" />
            <tx:method name="find*" isolation="DEFAULT" propagation="REQUIRED" read-only="true" />
            <tx:method name="get*" isolation="DEFAULT" propagation="REQUIRED" read-only="true" />
        </tx:attributes>
    </tx:advice>

 

2)将通知织入

<!--织入通知  -->
    <aop:config>
       <aop:pointcut expression="execution(* cn.guanyq.service.*ServiceImpl.*(..))" id="txPc"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txPc"/>
    </aop:config>

 

3.利用注解开启aop事务。

<!-- 注解开启事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

 

@Transactional(isolation=Isolation.DEFAULT,propagation=Propagation.REQUIRED,readOnly=true)

 

类上面或者方法上面利用注解设置事务。

十、session范围的扩大

 session的作用范围扩大,由于懒加载的存在,扩大session作用范围,解决nosession问题。只需要配置一个过滤器就可以。所有的filter都一定要在struct的核心过滤器之前。

<!--配置session作用域的加大 -->
    <filter>
        <filter-name>openSessionInView</filter-name>
        <filter-class>
            org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSessionInView</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 

posted @ 2018-06-28 18:50  流浪的小蛤蟆  阅读(105)  评论(0)    收藏  举报