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>

浙公网安备 33010602011771号