前言
SSM框架是Spring MVC,Spring和Mybatis框架的整合,是标准的MVC模式。标准的SSM框架有四层,分别是dao层(mapper),service层,controller层和View层。
Spring实现业务对象管理、spring MVC负责请求的转发和视图管理、Mybatis作为数据对象的持久化引擎。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架。
框架
通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫开发者只使用 JSP 技术。
Spring MVC 分离了控制器、模型对象、过滤器以及处理程序对象的角色,这种分离让它们更容易进行定制。
优点
Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。
它是一个典型的教科书式的MVC构架,而不像struts等都是变种或者不是完全基于MVC系统的框架,对于初学者或者想了解MVC的人来说我觉得Spring是最好的,它的实现就是教科书!它和tapestry一样是一个纯正的Servlet系统,这也是它和Tapestry相比Struts所具有的优势。而且框架本身有代码,看起来容易理解。
单元测试
关于Spring MVC Controller 层的单元测试
测试准备工作:
1、搭建测试Web环境
@RunWith(UnitilsJUnit4TestClassRunner.class)
@SpringApplicationContext({
"classpath:*.xml","file:src/main/webapp/WEB-INF/spring-configuration/*.xml",
"file:src/main/webapp/WEB-INF/*.xml"
})
2、注入Controller 类
@Controller
BeanController controller;
3、编写测试数据
测试数据的文件名一定要与测试类的文件名相同
比如测试数据BeanControllerTest.xml ,测试类 BeanControllerTest。
4、注入测试数据
@Test
@DataSet
public void testBean(){
}
一、各层解释说明
用IDEA创建一个maven项目结构,在该项目中,有五个包,分别是controller、dao、entity、service和serviceimpl:
二、SSM中各层作用及关系
SSM框架全称为Spring+SpringMVC+MyBatis,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统
由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架
SSM = Spring + SpringMVC + Mybatis = (Spring + Mybatis) + SpringMVC
整合说明:SSM整合可以使用多种方式,选择XML+注解的方式
1、整合思路
先搭建整合的环境
先把Spring的配置搭建完成
搭建SpringMVC框架,通过测试搭建无误
再使用Spring整合SpringMVC框架
搭建MyBatis框架,单元测试通过
最后使用Spring整合MyBatis框架
2、SSM框架实现一个web程序主要使用到如下三个技术:
Spring:用到注解和自动装配,就是Spring的两个精髓IOC(反向控制)和 AOP(面向切面编程)。
IOC(控制反转)
它可以装载bean,也是一种降低对象之间耦合关系的设计思想。(比如租房子。以前租房子需要一个房子一个房子找,费时费力,然后现在加入一个房屋中介,把你需要的房型告诉中介,就可以直接选到需要的房子,中介就相当于spring容器。
AOP(面向切面)
是面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态的修改模型以满足新的需求,如:动态的增加日志、安全或异常处理等。AOP使业务逻辑各部分间的耦合度降低,提高程序可重用性,提高开发效率。
横切关注点:从每个方法中抽取出来的同一类非核心业务代码。
切面:封装横切信息点的类,每个关注点体现为一个通知方法。
通知:切面必须要完成的各个具体工作,也就是切面里的一个个方法。
目标:被通知的对象,也就是被通知方法所作用的对象。
代理:像目标对象应用通知之后所创建的代理对象。
连接点:横切关注点在程序代码中的具体体现,对应用程序执行的某个特定位置。(通俗来讲就是一个个的方法)
切入点:切入点就是定位连接点的方式。每个通知上的切入点表达式找到对应的连接点,执行通知之后连接点也就变成了切入点。
SpringMVC:用到了MVC模型,将流程控制代码放到Controller层处理,将业务逻辑代码放到Service层处理。
SpringMVC是一个基于mvc的web框架,它是Spring框架的一个模块,两者无需通过中间整合进行整合。
3、SpringMVC框架的执行步骤
复杂版
- 用户发送请求至前端控制器DispatcherServlet。
- 前端控制器DispatcherServlet收到请求调用HandlerMapping处理器映射器。 前端控制器请求处理器映射器查找Handler
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 处理器映射器向前端控制器返回Handler
- 前端控制器DispatcherServlet调用处理器适配器去执行HandlerAdapter
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器) 处理器适配器去执行Handler
- Controller执行完成返回ModelAndView Handler执行完成给适配器返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet 处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括Model和View- 前端控制器DispatcherServlet将ModelAndView传给ViewReslover视图解析器
前端控制器请求视图解析器去进行视图解析,根据逻辑图名解析成真正的视图(jsp)- 视图解析器ViewReslover解析后向前端控制器返回具体View
- 前端控制器DispatcherServlet根据View进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 前端控制器DispatcherServlet向用户响应结果
简单版
- 客户端发送请求到DispacherServlet(分发器)
- 由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller
- Controller调用业务逻辑处理后,返回ModelAndView
- DispacherSerclet查询视图解析器,找到ModelAndView指定的视图
- 视图负责将结果显示到客户端
Mybatis是对JDBC的封装,它让数据库底层操作变的透明。Mybatis的操作都是围绕一个sqlSessionFactory实例展开的。Mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的Sql语句映射。在每次与数据库交互时,通过SqlSessionFactory拿到一个SqlSession,再执行Sql命令。
4、实体层:pojo层/entity层(Model层)(属于SpringMVC模块)
模型层,bean类,逻辑显示方法,查询数据库,即Plain Ordinary Java Object,model是模型的意思。
pojo层是对应的数据库表的实体类,与entity、domain、pojo、bean类似,实体层用于存放我们的实体类,类中定义了多个类属性,并与数据库表的属性值和字段基本保持一致,一张表对应一个model类。
数据库在项目中的类,主要用于定义与数据库对象应的属性,实现set/get方法,tostring方法,有参无参构造函数。
导入lombok驱动依赖,用来生成get/set方法依赖,代码如下(示例):
package com.dvms.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import lombok.experimental.Accessors;
import java.util.Date;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true