三大框架整合
原理
原理
步骤
导包
hibernate
hibernate/lib/required
hibernate必备包
hibernate/lib/jpa|java persist api java的持久化规范(接口)
图片.png
数据库驱动
图片.png
Struts2
struts-blank.war/WEB-INF/lib/* 模板工程下的lib
图片.png
javassist-3.18-GA.jar包与hibernate中的包重复 删除版本低的包
struts整合spring插件包
图片.png
注意:这个包一旦导入,那么struts2在启动时就会寻找Spring容器,如果找不到将会抛出异常
Spring
基本包 4+2
- core|beans|context|expression|logging|log4j
整合web包:web包
整合aop 4个
- spring-aop|spring-aspect|aop联盟|aopweaving
整合Hibernate和事物:4个
- spring-jdbc|spring-tx|c3p0|spring-orm
整合Junit4测试:test包
- spring-test
标签库
- standard.jar
- jstl-1.2.jar
单独配置Spring容器
创建配置文件 导入约束
- 创建配置文件: src/applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
配置Spring随web启动而启动
- 项目的web.xml文件中 添加监听器
<!--配置Spring监听器 让Spring随web启动而创建-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--配置Soring配置文件位置参数-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
Struts2
配置Struts2主配置文件
- 创建 struts.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="crm" namespace="/" extends="struts-default">
<action name="userAction_*" class="cn.probuing.action.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
配置Struts2核心过滤器
<!--配置Struts2核心过滤器-->
<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整合
导包
- struts2-spring-plugin-2.3.24.jar
配置常量
- struts.xml文件中
<struts>
<!--配置常量-->
<!--spring负责装配action依赖-->
<!--struts.objectFactory.spring.autoWire = name-->
<!--将action的创建 交给spring容器-->
<constant name="struts.objectFactory" value="spring"/>
整合方案1:struts2自己创建action,spring负责组装依赖属性
<!--
整合方案1:
class属性上仍然配置action的完整类名
struts2仍然创建action 由spring负责组装Action中的依赖属性
-->
<action name="userAction_*" class="cn.probuing.action.UserAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
</package>
不推荐理由:最好由spring完整管理action的生命周期.spring中功能才应用到Action上.
整合方案2:spring负责创建action以及组装
- applicationContext.xml
<!--action的对象作用范围一定是多例的 保证每次向spring要对象的时候都是新的-->
<bean name="userAction" class="cn.probuing.action.UserAction" scope="prototype">
<property name="userService" ref="userService"/>
</bean>
- struts.xml
<!--
整合方案2:class属性上填写spring中action对象的BeanName
完全由spring管理action生命周期,包括Action的创建
这种方式下,spring不能组装属性
-->
<action name="userAction_*" class="userAction" method="{1}">
<result name="success">/index.jsp</result>
</action>
单独配置Hibernate
导入实体类&orm元数据
实体对象.png
hibernate主配置文件
<?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://103.249.130.173:3306/hibernate_crm?useUnicode=true&characterEncoding=UTF8</property>
<!--数据库连接用户名-->
<property name="hibernate.connection.username">appUser</property>
<!--数据库连接密码-->
<property name="hibernate.connection.password">AA1122BB</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>
<!-- 引入orm元数据
路径书写: 填写src下的路径
-->
<mapping resource="cn/probuing/domain/Customer.hbm.xml"/>
<mapping resource="cn/probuing/domain/LinkMan.hbm.xml"/>
<mapping resource="cn/probuing/domain/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
Spring整合Hibernate
原理
将sessionFactory对象交给Spring容器管理
<!--hibernate配置 配置sessionFactory-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
方案一:仍然使用外部的hibernate.cfg.xml配置信息
<!--方案1:仍然使用外部的hibernate.cfg.xml配置信息-->
<property name="configLocation" value="classpath:hibernate.cfg.xml"/>
方案2:在Spring配置中放置hibernate配置信息
<!--方案2:在spring配置中放置hibernate配置信息-->
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--配置hibernate基本信息-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql://103.249.130.173:3306/hibernate_crm?useUnicode=true&characterEncoding=UTF8</prop>
<prop key="hibernate.connection.username">appUser</prop>
<prop key="hibernate.connection.password">AA1122BB</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!--引入orm元数据 mappingDirectoryLocation 指定orm元数据所在的包路径,spring会自动读取包中的所有配置-->
<property name="mappingDirectoryLocations" value="classpath:cn/probuing/domain"></property>
</bean>
Spring整合c3p0连接池
配置db.properties
jdbc.jdbcUrl=jdbc:mysql://103.249.130.173:3306/hibernate_crm?useUnicode=true&characterEncoding=UTF8
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=appUser
jdbc.password=AA1122BB
引入连接池到spring
<!--读取db.properties文件-->
<context:property-placeholder location="classpath:db.properties"/>
<!--配置c3p0连接池-->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
将连接池注入给sessionFactory中
<bean name="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!--将连接池注入到sessionFactory-->
<property name="dataSource" ref="dataSource"/>
Spring整合hibernate环境操作数据库
Dao类:使用Spring提供的Hibernate模板 HibernateDapSupport
- 接口定义
public interface UserDao {
//根据登录名称查询user对象
User getByUserCode(String userCode);
}
- 实现类 继承HibernateDaoSupport
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
hibernate模板的操作
- Criteria 方式
@Override
public User getByUserCode(final String userCode) {
DetachedCriteria dc = DetachedCriteria.forClass(User.class);
dc.add(Restrictions.eq("user_code", userCode));
List<User> list = (List<User>) getHibernateTemplate().findByCriteria(dc);
if (list != null && list.size() > 0) {
return list.get(0);
}
return null;
}
}
- HQL方式
@Override
public User getByUserCode(final String userCode) {
User execute = getHibernateTemplate().execute(new HibernateCallback<User>() {
@Override
public User doInHibernate(Session session) throws HibernateException {
String sql = "from user where user_code = ?";
Query query = session.createQuery(sql);
query.setParameter(0, userCode);
User user = (User) query.uniqueResult();
return user;
}
});
}
Spring中配置dao
<!--配置dao-->
<bean name="userDao" class="cn.probuing.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
Spring的aop事物
配置核心事务管理器
<!--配置核心事务管理器-->
<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
xml配置aop事务
配置通知
<!--配置通知-->
<tx:advice id="tvAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="persist*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="update*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="modify*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="delete*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="remove*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="false" />
<tx:method name="get*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" isolation="REPEATABLE_READ" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
配置织入
<aop:config>
<!--配置切点-->
<aop:pointcut id="txPc" expression="execution(* cn.probuing.service.impl.*ServiceImpl.*(..))"/>
<!--配置切面-->
<aop:advisor advice-ref="tvAdvice" pointcut-ref="txPc"/>
</aop:config>
注解配置aop事务
开启注解事务
<!--开启注解配置事务-->
<tx:annotation-driven transaction-manager="transactionManager"/>
Service类中使用注解
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = true)
public class UserServiceImpl implements UserService {
private UserDao ud;
public void setUd(UserDao ud) {
this.ud = ud;
}
@Override
public User getUserByCodePassword(User u) {
System.out.println("getUserByCodePassword");
return null;
}
@Transactional(isolation = Isolation.REPEATABLE_READ,propagation = Propagation.REQUIRED,readOnly = false)
@Override
public void saveUser(User u) {
ud.saveUser(u);
}
}
扩大session作用范围
<!--
扩大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>
- 任何filter一定要在struts的filter之前调用