一、整合原理

  

二、整合步骤

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整合的更多相关文章

  1. Spring学习笔记六:Spring整合Hibernate

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6785323.html  前言:整合概述 Spring整合Hibernate主要是把Hibernate中常用的S ...

  2. Spring学习(六)整合web开发

    https://www.cnblogs.com/Leo_wl/p/4459274.html 1.加载Spring核心配置文件 //1.加载Spring配置文件,根据创建对对象 ApplicationC ...

  3. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  4. Java架构师之路 Spring学习笔记(一) Spring介绍

    前言 这是一篇原创的Spring学习笔记.主要记录我学习Spring4.0的过程.本人有四年的Java Web开发经验,最近在面试中遇到面试官总会问一些简单但我不会的Java问题,让我觉得有必要重新审 ...

  5. Spring学习笔记(一)

    Spring学习笔记(一) 这是一个沉淀的过程,大概第一次接触Spring是在去年的这个时候,当初在实训,初次接触Java web,直接学习SSM框架(当是Servlet都没有学),于是,养成了一个很 ...

  6. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  7. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  8. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  9. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

随机推荐

  1. 正确理解Python函数是第一类对象

    正确理解 Python函数,能够帮助我们更好地理解 Python 装饰器.匿名函数(lambda).函数式编程等高阶技术. 函数(Function)作为程序语言中不可或缺的一部分,太稀松平常了.但函数 ...

  2. (转)Mac下MySql安装经历(含安装错误排查、卸载多种折腾)

    在安装mysql的时候,活活折腾我两天.结果终于被我折腾成功了……一开始我就放了个错误:我下了32位版本的mysql:mysql-5.5.8-osx10.6-x86.dmg 须知在mac下装的是64位 ...

  3. 【HDU5861】Road

    题意 有n个村庄排成一排,有n-1条路将他们连在一起.每条路开放一天都会花费一定数量的钱.你可以选择打开或者关上任意条路在任意一天,但是每条路只能打开和关闭一次.我们知道m天的运输计划.每天都有一辆马 ...

  4. 【总结整理】Edraw Max亿图图示软件快捷键(转)

    Edraw Max亿图图示软件快捷键大全,你想要的都在这了!   用过Edraw Max亿图图示软件的一定知道,亿图是一款功能十分强大的图形图表设计软件.无论是流程图.思维导图.组织结构图.甘特图.网 ...

  5. Ubuntu16.04 ARM平台移植libcurl curl-7.63.0

    libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS,POP3, P ...

  6. VS运行release版本正常,直接执行exe文件会出现问题

    博客转载自:https://blog.csdn.net/weixinhum/article/details/39962483 检测了一下自己的程序,发现程序先后开启了两个线程,并且对两个线程的启动顺序 ...

  7. 为什么rand和srand总是同时出现?

    如果没有srand,那么rand在我电脑上运行每次返回的随机数是一样的.如果如果先调用srand,而且srand的参数不一样,那么最后产生的随机数就会不一样?那怎么然srand的参数是不一样的呢? 是 ...

  8. 15.select into

    select into SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用于创建表的备份复件或者用于对记录进行存档. CREATE TABLE ...

  9. Entity Framework 6.0 Tutorials(11):Download Sample Project

    Download Sample Project: Download a sample project for Entity Framework 6 Database-First model below ...

  10. php无限级分类

    使用递归方法,遍历子类,对数据进行重新排序,使用level进行无限级分类 /** * 功能:无限级分类 * 参数:$data 类别查询结果集 * 返回值:$arr 排序后的数组 */ public f ...