SSM三大框架详细整合流程

1、基本概念

1.1、Spring 

        Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

1.2、SpringMVC

      Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。

1.3、MyBatis 

       MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

2、整合步骤

首先对SSM框架有一个相应的认识:


SpringMVC:

  SpringMVC:主要进行页面的 请求接受与响应。

  组件包括:前端控制器,处理器映射器,处理器适配器,视图解析器,处理器Handler,视图View。其中,只有处理器Handler和视图View需要程序员开发。

View是一个接口,实现类支持不同的View类型(jsp,freemarker,pdf等)。另外,处理器Handler就是Controller。


Service:

  Service层功能:注入dao,调用dao方法。


Mybatis:

  开始Mybatis时要记住最终目的,我们要对数据库的数据进行操作,所以你只需要记住,他的使用很方便,很方便,方便,即可。

  

  最后我们的开发思路就很明确了,从页面获取数据到Controller层,然后传递到service层进行相关操作(调用方法等),然后再传递到持久层对数据库进行相应增删改查即可。

2.1、整合准备

  整合内容:

    整合架构:Spring、SpringMVC以及MyBatis的整合。

    数据库:MySQL

    连接池:C3P0或Druid

  整合工具:

    整合工具为:Eclipse

    Jar管理工具:Maven

    项目类型为:Maven Pproject

2.2 创建项目

  使用eclipse,创建一个maven project,建立好相应的目录结构,步骤如下:

  1、New --> Maven Project --> Create a simple project and location;

  2、填入GAV坐标(Group Id、Artifact Id、Version),选择war包,点击finish;

    注意:此处会报错:web.xml is missing and <failOnMissingWebXml> is set to true。因为默认没有生成web.xml文件,需手动创建。

  3、在项目名上右键,选择Properties --> Project Facets.

    先勾掉Dynamic Web Services,点击Apply,再勾选Dynamic Web Services,选择版本2.5,点击下方Further configuration available…,手动创建web文件的目录,即在directory处输入src/main/webapp,apply --> 确定 即可,此时WEB-INF下会创建web.xml文件。

  web.xml是整个项目的核心配置文件,也可以理解为Web程序访问的入口,

此时文件目录结构中各自作用如下:

 文件名

 作用

src

  根目录,没什么好说的,下面有main和test。

main

  主要目录,可以放java代码和一些资源文件。

java

  存放我们的java代码,这个文件夹要使用Build Path -> Use as Source Folder,这样看包结构会方便很多,新建的包就相当于在这里新建文件夹咯。

resources

  存放资源文件,譬如各种的spring,mybatis,log配置文件。

mapper

  存放dao中每个方法对应的sql,在这里配置,无需写daoImpl。

spring

  这里当然是存放spring相关的配置文件,有dao service web三层。

sql

  其实这个可以没有,但是为了项目完整性还是加上吧。

webapp

  这个貌似是最熟悉的目录了,用来存放我们前端的静态资源,如jsp js css。

resources

  这里的资源是指项目的静态资源,如js css images等。

WEB-INF

  很重要的一个目录,外部浏览器无法访问,只有羡慕内部才能访问,可以把jsp放在这里,另外就是web.xml了。你可能有疑问了,为什么上面java中的resources里面的配置文件不妨在这里,那么是不是会被外部窃取到?你想太多了,部署时候基本上只有webapp里的会直接输出到根目录,其他都会放入WEB-INF里面,项目内部依然可以使用classpath:XXX来访问,好像IDE里可以设置部署输出目录,这里扯远了~

test

  这里是测试分支。

java

  测试java代码,应遵循包名相同的原则,这个文件夹同样要使用Build Path -> Use as Source Folder,这样看包结构会方便很多。

resources

  没什么好说的,好像也很少用到,但这个是maven的规范。

2.3 引入jar包依赖

  <dependencies>
        <!-- 1    Spring核心包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <!-- 关系型数据库整合时需配置,包含Spring对DAO特性集进行了扩展,使其支持 Mybatis、JDO等。
        此jar文件里大部分类都要依赖spring-dao.jar里的类,用这个包时需要同时包含spring-dao.jar包 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>

        <!-- 2    SpringMVC -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.0.RELEASE</version>
        </dependency>
        
        <!-- 3    MyBatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.8</version>
        </dependency>
        <!-- 3.1 MyBatis/Spring包  -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.2.2</version>
        </dependency>
        <!-- MyBatis中延迟加载需要使用Cglib,即启用懒加载 --> 
        <dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>2.2</version>
        </dependency>
        
        <!-- 4    数据库连接 -->
        <!-- 4.1 MySQL数据库驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.37</version>
        </dependency>
        <!-- C3P0数据库连接池 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.2</version>
        </dependency>
        <!-- 或者使用 -->
        <!-- dbcp连接池 -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>

        <!-- 5    Servlet、jsp、jstl依赖 -->
        <!-- provided表明该包只在编译和测试的时候用,而Tomcat中也有servlet-api包,所以当启动tomcat的时候,就不会冲突了 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1.3-b06</version>
            <scope>provided</scope>
        </dependency>
        <!-- JSTL标签类 -->
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>


        <!-- 6    辅助 -->

        <!-- 6.1 单元测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <!-- 表示开发的时候引入,发布的时候不会加载此包 -->
            <scope>test</scope>
        </dependency>
        
        <!-- 6.2 日志文件管理包 -->
        <!-- log4j是具体的实现(即怎么来打印日志等),和logback是一样的。 -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!-- slf4j是日志的接口(只定义了一些方法而没有去实现),和commons-logging一样。 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.7</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.7</version>
        </dependency>
        
        <!-- 6.3 格式化对象工具包,方便输出日志 -->
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.2.4</version>
        </dependency>
        
        <!-- 6.4 上传组件包 -->
       <dependency>
           <groupId>commons-fileupload</groupId>
           <artifactId>commons-fileupload</artifactId>
           <version>1.3.1</version>
       </dependency>
       <dependency>
           <groupId>commons-io</groupId>
           <artifactId>commons-io</artifactId>
           <version>2.5</version>
       </dependency>
       <dependency>
           <groupId>commons-codec</groupId>
           <artifactId>commons-codec</artifactId>
           <version>1.10</version>
       </dependency>
       
       <!-- 6.5 代码生成器(逆向工程) -->
        <dependency>  
            <groupId>org.mybatis.generator</groupId>  
            <artifactId>mybatis-generator-core</artifactId>  
            <version>1.3.3</version>  
        </dependency>
        
        <!-- 6.6 Apache提供的包含StringUtils工具类的Jar包 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.3.2</version>
        </dependency>
        
        <!-- 其余辅助 -->
        <!-- springmvc默认使用的是jackson来解析json的 -->
        <dependency>
            <groupId>org.codehaus.jackson</groupId>
            <artifactId>jackson-mapper-asl</artifactId>
            <version>1.9.11</version>
        </dependency>
        
        <!-- 各种集合类和集合工具类的封装类库 -->
        <dependency>
            <groupId>commons-collections</groupId>
            <artifactId>commons-collections</artifactId>
            <version>3.1</version>
        </dependency>
        
        <!-- json需使用的包 -->
        <dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
        </dependency>
        
        <!-- jedis包 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
          
    </dependencies>

2.4 集成Spring框架

  Spring框架是整个系统架构的核心,将前端请求数据的处理以及数据库的数据操作整合在一起,非常重要。

  在web.xml文件中增加配置信息集成Spring框架:

 1 <web-app>
 2 ...
 3     <context-param>
 4         <param-name>contextConfigLocation</param-name>
 5         <param-value>classpath*:spring-*.xml</param-value>
 6     </context-param>
 7     <listener>
 8         <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
 9     </listener>
10 ...
11 </web-app>

  Spring环境构建时需要读取web应用的初始化参数contextConfigLocation, 从classpath中读取配置文件spring/spring-*.xml在项目src/main/resources目录中增加spring文件夹,并在其中增加spring-context.xml配置文件。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:aop="http://www.springframework.org/schema/aop"
 7     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
 8         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
10         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
11 
12 </beans>

  Spring框架的核心是构建对象,整合对象之间的关系(IOC)及扩展对象功能(AOP),所以需要在spring-context.xml配置文件中增加业务对象扫描的相关配置。扫描后由Spring框架进行管理和组合。

1 <beans>
2     ...
3     <context:component-scan base-package="com.getmymoney.*" >
4         <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
5     </context:component-scan>
6     ...
7 </beans>

扫描配置中为什么要排除Controller注解

  Controller注解的的作用是声明控制器(处理器)类。从数据流转的角度,这个类应该是由SpringMVC框架进行管理和组织的,所以不需要由Spring框架扫描。

2.4 集成SpringMVC框架

  SpringMVC框架用于处理系统中数据的流转及控制操作。(从哪里来,到哪里去。多么有哲理的一句话。)

  集成SpringMVC框架,需要在web.xml文件中增加配置信息。

 1 <web-app>
 2 ...
 3     <servlet>
 4         <servlet-name>springmvc</servlet-name>
 5         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
 6         <init-param>
 7             <param-name>contextConfigLocation</param-name>
 8             <param-value>classpath:spring/springmvc-context.xml</param-value>
 9         </init-param>
10         <load-on-startup>1</load-on-startup>
11     </servlet>
12     <servlet-mapping>
13         <servlet-name>springmvc</servlet-name>
14         <url-pattern>/</url-pattern>
15     </servlet-mapping>
16 ...
17 </web-app>

  SpringMVC环境构建时需要读取servlet初始化参数init-param, 从classpath中读取配置文件spring/springmvc-context.xml

  

  在项目src/main/resources/spring目录中,增加springmvc-context.xml配置文件。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xmlns:mvc="http://www.springframework.org/schema/mvc"
 7     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 8         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
10 
11 </beans>

  SpringMVC框架的核心是处理数据的流转,所以需要在springmvc-context.xml配置文件中增加控制器对象(Controller)扫描的相关配置。扫描后由SpringMVC框架进行管理和组合。

1 <!-- 1、包扫描 -->
2 <context:component-scan base-package="com.getmymoney.controller" use-default-filters="false">
3     <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
4     <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice" />
5 </context:component-scan>

静态资源如何不被SpringMVC框架进行拦截

  在配置文件中增加<mvc:default-servlet-handler/><mvc:annotation-driven />即可,在实际的项目中静态资源不会和动态资源放在一起,也就意味着不会放置在服务器中,所以这些配置可以省略。

  如果SpringMVC框架数据处理为页面跳转,那么需要配置相应的视图解析器ViewResolver

1 <!-- 2、视图解析器 -->
2 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
3     <property name="prefix" value="/WEB-INF/"></property>
4     <property name="suffix" value=".jsp"></property>
5 </bean>

如果有多个视图解析器怎么办?

SpringMVC框架中允许存在多个视图解析器,框架会按照配置声明顺序,依次进行解析。

  

  如果SpringMVC框架数据处理为响应JSON字符串,那么为了浏览器方便对响应的字符串进行处理,需要明确字符串的类型及编码方式。

 1 <!--字符编码方式-->
 2 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" >
 3     <property name="messageConverters" >
 4         <list>
 5             <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >
 6                 <property name="supportedMediaTypes" >
 7                     <list>
 8                         <value>application/json;charset=UTF-8</value>
 9                     </list>
10                 </property>
11             </bean>
12         </list>
13     </property>
14 </bean>

  如果项目中含有文件上传业务,还需要增加文件上传解析器MultipartResolver

1 <!-- 3、SpringMVC上传文件时,需要配置MultipartResolver处理器 -->
2 <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
3     <property name="defaultEncoding" value="UTF-8" />
4     <!-- 指定所上传文件的总大小,单位字节。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
5     <property name="maxUploadSize" value="10240000" />
6 </bean>
1 <!-- 4、启动注解 -->
2 <mvc:annotation-driven />
3 <mvc:default-servlet-handler />

2.5 集成Mybatis框架

  Mybatis框架主要处理业务和数据库之间的数据交互,所以创建对象和管理对象生命周期的职责可以委托Spring框架完成。如:创建Mybatis核心对象。

 1    <!-- 3.配置SqlSessionFactory对象 -->
 2     <bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
 3         <!-- 注入数据库连接池 -->
 4         <property name="dataSource" ref="dataSource" />
 5         <!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
 6         <property name="configLocation" value="classpath:mybatis-config.xml" />
 7     </bean>
 8     <!-- 4.配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
 9     <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
10         <!-- 注入sqlSessionFactory -->
11         <property name="basePackage" value="com.getmymoney.mapper" />
12         <!-- 给出需要扫描Dao接口包 -->
13         <property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean" />
14     </bean>

  既然需要和数据库进行关联,那么Mybatis核心对象就需要依赖于数据库连接池,所以在Spring配置文件中增加相应的配置。

1    <!-- 2.数据库连接池 -->
2     <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
3         <!-- 配置连接池属性 -->
4         <property name="driverClassName" value="${driverClassName}" />
5         <property name="url" value="${url}" />
6         <property name="username" value="${jdbc.username}" />
7         <property name="password" value="${jdbc.password}" />
8     </bean>

  在Spring配置文件开头增加properties属性

1    <!-- 1.配置数据库相关参数properties的属性:${url} -->
2     <context:property-placeholder location="classpath:dbConfig.properties" />

  在项目src/main/resources/spring目录中,增加dbConfig.properties配置文件。

1 driverClassName=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF8
3 jdbc.username=root
4 jdbc.password=abc123

  集成Mybatis框架时同时还需要增加核心配置文件mybatis/config.xml

1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE configuration
3   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4   "http://mybatis.org/dtd/mybatis-3-config.dtd">
5 <configuration>
6     <mappers>
7     </mappers>
8 
9 </configuration>

  及SQL映射文件mybatis/mapper-*.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
3 <mapper namespace="com.getmymoney.mapper.AreaMapper">
4 
5 </mapper>

  为了保证数据操作的一致性,必须在程序中增加事务处理。Spring框架采用声明式事务,通过AOP的方式将事务增加到业务中。所以需要在Spring配置文件中增加相关配置

 1 <!--事务管理-->
 2 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 3     <property name="dataSource" ref="dataSource"></property>
 4 </bean>
 5 
 6 <tx:advice transaction-manager="txManager" id="txAdvice">
 7     <tx:attributes>
 8         <tx:method name="*" propagation="REQUIRED" rollback-for="java.lang.Exception" />
 9     </tx:attributes>
10 </tx:advice>
11 
12 <aop:config>
13     <aop:pointcut expression="execution(* com.getmymoney.service.*.*(..))" id="pointcut" />
14     <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" />
15 </aop:config>

 

2.6 总结

web.xml配置文件

  1、配置Spring配置文件路径(contextConfigLocation);

  2、配置监听器(ContextLoaderListener);

  3、配置DispatcherServlet,SpringMVC配置文件路径;

  4、配置servlet映射规则(servlet-mapping)。

applicationcontext.xml Spring配置文件

  1、读入数据库连接相关参数(即引入配置文件);

  2、配置Spring扫描的包;

  3、配置数据连接池的连接属性;

  4、配置SqlSessionFactory对象(mybatis);

  5、扫描dao层(Mapper)接口,动态实现Mapper接口。

spring-mvc.xml SpringMVC配置文件

  1、配置SpringMVC扫描的包;

  2、静态资源默认servlet配置(可选,多不写)

    ①加入对静态资源的处理:js,gif,png

    ②允许使用 "/" 做整体映射

  3、配置jsp显示ViewResolver(视图解析器);

  4、开启SpringMVC注解模式

    ①自动注册DefaultAnootationHandlerMapping,AnotationMethodHandlerAdapter

    ②提供一些列:数据绑定,数字和日期的format @NumberFormat, @DateTimeFormat, xml,json默认读写支持

原文地址:https://www.cnblogs.com/jasonZh/p/8947795.html