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>
在POM 4中,<dependency>中还引入了<scope>,它主要管理依赖的部署。目前<scope>可以使用5个值:
* compile,缺省值,适用于所有阶段,会随着项目一起发布。
* provided,类似compile,期望JDK、容器或使用者会提供这个依赖。如servlet.jar。
* runtime,只在运行时使用,如JDBC驱动,适用运行和测试阶段。
* test,只在测试时使用,用于编译和运行测试代码。不会随项目发布。
* system,类似provided,需要显式提供包含依赖的jar,Maven不会在Repository中查找它。
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>
springmvc启用注解
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默认读写支持