Spring学习笔记(六)—— SSH整合
一、整合原理

二、整合步骤
2.1 导包
【hibernate】
- hibernate/lib/required
- hibernate/lib/jpa
- 数据库驱动
【struts2】
- struts-blank.war/WEB-INF/lib/*(注意:javassist-3.18.1-GA.jar包与hibernate中的重复,删除版本低的)
- struts整合spring插件包
(注意:这个包一旦导入,那么struts2在启动时就会寻找spring容器,如果你导入了这个包,却没有配置spring容器,那么项目启动的时候就会抛出异常)
【spring】
- 基本(4+2):core、beans、context、expression、logging、log4j
- 整合web的包:spring-web
- 整合aop(4个):spring-aop、spring-aspect、aop联盟、aopweaving
- 整合Hibernate和事务(4个):spring-jdbc、spring-tx、c3p0、spring-orm
- junit4测试包:spring-test
2.2 单独配置spring容器
2.2.1 创建配置文件applicationContext.xml,并导入约束

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.0.xsd "> </beans>
2.2.2 在web.xml中配置spring随项目启动
<!-- 让spring随web启动而启动的监听器 -->
<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>
2.3 单独配置struts2
2.3.1 配置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 -->
<package name="crm" namespace="/" extends="struts-default">
<!-- 配置Action -->
<action name="UserAction_*" class="cn.itcast.web.action.UserAction" method="{1}">
<!-- 配置结果页面的跳转 -->
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
2.3.2 配置struts2核心过滤器到web.xml
<!-- 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>
2.4 struts2与spring整合
2.4.1 在struts.xml中配置常量
<!-- # struts.objectFactory = spring 将antion的创建交给spring容器
struts.objectFactory.spring.autoWire = name spring负责装配Action的依赖属性
-->
<constant name="struts.objectFactory" value="spring"></constant>
2.4.2 整合
- 方案1:struts2自己创建action,spring负责组装依赖属性(不推荐,最好由spring完整管理action的生命周期.spring中的功能才能应用到Action上)
<!-- 整合方案1:class属性上仍然配置action的完整类名
struts2仍然创建action,由spring负责组装action中的依赖属性
-->
<action name="UserAction_*" class="cn.itcast.web.action.UserAction" method="{1}">
<result name="success">/success.jsp</result>
</action> - 方案2:spring负责创建action以及组装。struts.xml:
<!-- 整合方案2:class属性上填写spring中action对象的BeanName
完全由spring管理action生命周期,包括Action的创建
注意:需要手动组装依赖属性
-->
<action name="UserAction_*" class="userAction" method="{1}">
<result name="success">/success.jsp</result>
</action>applicationContext.xml
<!-- action -->
<!-- 注意:Action对象的作用范围一定是多例的,这样才符合struts2架构 -->
<bean name="userAction" class="cn.itcast.web.action.UserAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
2.5 单独配置hibernate
2.5.1 导入实体类&orm元数据

2.5.2 配置主配置文件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:///crm</property>
<!-- 数据库连接用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 数据库连接密码 -->
<property name="hibernate.connection.password">root</property>
<!-- 数据库方言
注意: MYSQL在选择方言时,请选择最短的方言.
-->
<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/itcast/domain/Customer.hbm.xml" />
<mapping resource="cn/itcast/domain/LinkMan.hbm.xml" />
<mapping resource="cn/itcast/domain/User.hbm.xml" /> </session-factory>
</hibernate-configuration>
2.6 spring整合hibernate
2.6.1 在spring中配置sessionFactory
- 方案一:仍然使用外部的hibernate.cfg.xml配置信息
<!-- 将SessionFactory配置到spring容器中 -->
<!-- 加载配置方案1:仍然使用外部的hibernate.cfg.xml配置信息 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
</bean>
- 方案二:在spring配置中配置hibernate配置信息
<!-- 将SessionFactory配置到spring容器中 -->
<!-- 加载配置方案2:在spring配置中配置hibernate配置信息 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<!-- 配置hibernate基本信息 -->
<property name="hibernateProperties">
<props>
<!-- 必选配置 -->
<prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
<prop key="hibernate.connection.url">jdbc:mysql:///crm</prop>
<prop key="hibernate.connection.username">root</prop>
<prop key="hibernate.connection.password">root</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> <!-- 引入orm元数据,指定orm元数据所在的包路径,spring会自动读取包中的所有配置 -->
<property name="mappingDirectoryLocations" value="classpath:cn/itcast/domain"></property>
</bean>
2.6.2 操作数据库
- Dao类创建:继承HibernateDaoSupport
// HibernateDaoSupport 为dao注入sessionFactory
public class UserDaoImpl extends HibernateDaoSupportimplements UserDao{ @Override
public User getByUserCode(final String usercode) {
// HQL
return getHibernateTemplate().execute(new HibernateCallback<User>() {
@Override
public User doInHibernate(Session session) throws HibernateException {
Query query = session.createQuery("from User where user_code=?");
query.setParameter(0, usercode);
User user = (User) query.uniqueResult();
return user;
}
}); // Criteria
/*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);
}else{
return null;
}*/
}
} - spring中配置dao
<!-- dao -->
<bean name="userDao" class="cn.itcast.dao.impl.UserDaoImpl">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
2.7 spring整合c3p0连接池
2.7.1 配置db.properties
jdbc.jdbcUrl=jdbc:mysql:///crm
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.user=root
jdbc.password=root
2.7.2 引入连接池到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>
2.7.3 将连接池注入给SessionFactory
<!-- 将SessionFactory配置到spring容器中 -->
<bean name="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 将连接池注入到sessionFactory,hibernate会通过连接池获得连接 -->
<property name="dataSource" ref="dataSource"></property>
...
</bean>
2.8 spring的AOP事务
详细步骤见Spring学习笔记(四)—— Spring中的AOP
三、扩大session作用范围
为了避免使用懒加载时出现no-session问题,在web.xml中配置openSessionInViewFilter来扩大session的作用范围
<!-- 扩大session的作用范围 注意:任何filter一定要在struts的filter之前调用 -->
<filter>
<filter-name>openSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter> <filter-mapping>
<filter-name>openSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Spring学习笔记(六)—— SSH整合的更多相关文章
- Spring学习笔记六:Spring整合Hibernate
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html 前言:整合概述 Spring整合Hibernate主要是把Hibernate中常用的S ...
- Spring学习(六)整合web开发
https://www.cnblogs.com/Leo_wl/p/4459274.html 1.加载Spring核心配置文件 //1.加载Spring配置文件,根据创建对对象 ApplicationC ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Java架构师之路 Spring学习笔记(一) Spring介绍
前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...
- Spring学习笔记(一)
Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- spring学习笔记(一) Spring概述
博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书. 强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
随机推荐
- 正确理解Python函数是第一类对象
正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...
- (转)Mac下MySql安装经历(含安装错误排查、卸载多种折腾)
在安装mysql的时候,活活折腾我两天.结果终于被我折腾成功了……一开始我就放了个错误:我下了32位版本的mysql:mysql-5.5.8-osx10.6-x86.dmg 须知在mac下装的是64位 ...
- 【HDU5861】Road
题意 有n个村庄排成一排,有n-1条路将他们连在一起.每条路开放一天都会花费一定数量的钱.你可以选择打开或者关上任意条路在任意一天,但是每条路只能打开和关闭一次.我们知道m天的运输计划.每天都有一辆马 ...
- 【总结整理】Edraw Max亿图图示软件快捷键(转)
Edraw Max亿图图示软件快捷键大全,你想要的都在这了! 用过Edraw Max亿图图示软件的一定知道,亿图是一款功能十分强大的图形图表设计软件.无论是流程图.思维导图.组织结构图.甘特图.网 ...
- Ubuntu16.04 ARM平台移植libcurl curl-7.63.0
libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, P ...
- VS运行release版本正常,直接执行exe文件会出现问题
博客转载自:https://blog.csdn.net/weixinhum/article/details/39962483 检测了一下自己的程序,发现程序先后开启了两个线程,并且对两个线程的启动顺序 ...
- 为什么rand和srand总是同时出现?
如果没有srand,那么rand在我电脑上运行每次返回的随机数是一样的.如果如果先调用srand,而且srand的参数不一样,那么最后产生的随机数就会不一样?那怎么然srand的参数是不一样的呢? 是 ...
- 15.select into
select into SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档. CREATE TABLE ...
- Entity Framework 6.0 Tutorials(11):Download Sample Project
Download Sample Project: Download a sample project for Entity Framework 6 Database-First model below ...
- php无限级分类
使用递归方法,遍历子类,对数据进行重新排序,使用level进行无限级分类 /** * 功能:无限级分类 * 参数:$data 类别查询结果集 * 返回值:$arr 排序后的数组 */ public f ...