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