SpringMVC
是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。SpringMVC分离了控制器,模型对象,分派器,处理器,视图解析器等,它们各司其职,使得系统耦合性大大降低,而且扩展性很好。通过一套注解,让一个简单的Java类成为处理请求的控制器,使得开发者可以很方便的进行配置,而且可以支持Restful风格的请求。
SpringMVC的优点
- SpringMVC是一个基于请求驱动的框架,每一个请求都会被DispatcherServlet进行处理,它会将请求映射到Controller上,从而将请求的处理和视图的渲染分离开来。
- 配置简单,使用注解就可以完成大部分的配置,而且SpringMVC内置了大量的注解,开发者不需要自己去编写过多的配置文件。
- 支持Restful风格的请求,通过注解的方式就可以完成Restful风格的请求。
- 支持多种视图技术,如JSP,Freemarker,Velocity,Thymeleaf等。
SpringMVC和Struts2的区别
- SpringMVC是基于方法设计的,Struts2是基于类设计的。
- Spring MVC会将用户请求的URL路径信息与Controller的某个方法进行映射,所有请求参数会注入到对应方法的形参上,生成Handler对象,对象中只有一个方法;
- Struts每处理一次请求都会实例一个Action,Action类的所有方法使用的请求参数都是Action类中的成员变量,随着方法增多,整个Action也会变得混乱。
- SpringMVC支持单例模式,Struts2不支持单例模式。由于Struct只能通过类的成员变量接收参数,所以每次请求都会实例化一个Action,所以Struts2不支持单例模式。
- Struct处理速度比SpringMVC慢,Struct使用了Struts标签,而标签的执行速度比JSP的EL表达式慢。
- Struct2的核心是基于一个Filter,SpringMVC的核心是基于一个Servlet。
SpringMVC的主要组件
- DispatcherServlet:前端控制器,负责接收请求并将请求分发给其他的控制器。
- HandlerMapping:处理器映射器,负责将请求映射到处理器。
- HandlerAdapter:处理器适配器,负责将请求分发给处理器。
- Handler:处理器,负责处理请求,处理请求的业务逻辑。并返回相应的数据和视图信息,将其封装为ModelAndView对象。
- ViewResolver:视图解析器,负责将逻辑视图名解析为具体的视图对象。
- View:视图,负责渲染数据,将数据显示到客户端。
SpringMVC的常用注解
- @Controller:用于标注控制层组件,相当于struts中的action层。
- @RequestMapping:用于标注控制器中的方法,用来处理请求地址映射的注解。
- @RequestParam:用于将请求参数区域的数据映射到控制器中的方法形参上。
- @ResponseBody:用于将控制器方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
- @RequestBody:注解实现接收HTTP请求的json数据,将json数据转换为Java对象。
- PathVariable:用于将请求URL中的模板变量映射到控制器方法的参数上。
- RestController:相当于@Controller和@ResponseBody的组合,返回json数据时使用。
- ExceptionHandler:用于全局处理控制器里的异常。
@Controller注解的作用
标记一个类为SpringMVC控制器,SpringMVC会将扫描到该注解的类,然后扫描这个类下面带有的@RequestMapping注解的方法,将这些方法映射到指定的URL上。
@Controller和@RestController的区别
@Controller是SpringMVC的注解,一般用来标注控制器类,@RestController是Spring4之后加入的注解,是@ResponseBody和@Controller的组合注解,一般用来标注控制器类,返回json数据时使用。更加适合目前的前后端分离开发。
SpringMVC拦截器
实现了三个方法
- 前置处理:preHandle,返回true表示继续执行,返回false表示终止执行。
- 后置处理:postHandle,在执行控制器方法调用之后,且在返回视图之前执行。由于该方法在DispatcherServlet进行视图返回渲染之前执行,所以我们可以通过此方法对Controller处理之后的ModelAndView对象进行操作。可通过此方法对请求域中的模型和视图做出进一步的修改。
- 已完成处理:afterCompletion,该方法在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,主要用于进行资源清理工作。
可以通过拦截器进行权限验证,日志记录,参数校验等操作。
RESTful风格
RESTful是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。RESTful架构风格的核心是:资源,每一个URI代表一种资源,客户端和服务器之间传递这种资源的某种表现层。客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。
优势:
- 风格统一,符合标准,易于理解。
- 面向资源,而不是面向行为。具有自解释性,易于理解。
- 充分利用HTTP协议的优点,支持HTTP协议的各种特性,如缓存。
MyBatis是什么
- MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
- 内部封装了JDBC,开发时只需要关注SQL本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂过程。
- 作为持久层框架,MyBatis的作用是封装JDBC操作数据库的细节,使开发者只需要关注SQL本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂过程。
- 将SQL语句和程序代码分离,提高了可维护性。
ORM框架
ORM(Object Relational Mapping)对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的–“虚拟对象数据库”。
通过描述对象和数据库之间的映射的元数据,将程序中的对象自动持久化到关系数据库中。
MyBatis的工作原理
- 读取配置文件,将配置文件中的信息加载到内存中。
- 加载映射文件,该文件中配置了操作数据库的SQL语句。需要在MyBatis的配置文件中加载映射文件。每个文件对应数据库中的一张表
- 创建SqlSessionFactory对象,该对象是用来创建SqlSession对象的工厂。
- 创建SqlSession对象,该对象是用来操作数据库的对象。
- Executor执行器,封装了JDBC操作数据库的方法,是MyBatis的核心对象。根据sqlSession对象中的参数,动态生成代理对象,代理对象会调用Executor对象中的方法。同时负责缓存管理。
- MappedStatement 对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息
- 输入参数映射:在Executor接口的执行方法中有一个Object类型的参数,该参数是输入参数,MyBatis会将输入参数映射到SQL语句中的占位符中。
- 输出结果映射:在Executor接口的执行方法中有一个Object类型的返回值,该返回值是输出结果,MyBatis会将输出结果映射到输出结果对象中。