Spring MVC
SpringMVC的详细讲解
一、什么是MVC
MVC是一种设计模式,在这种设计模式下软件被分为三层:模型
、视图
、控制器
。
- 模型:工程中的Bean,代表的是数据,具体分为实体类Bean(存储业务数据)和业务处理Bean(servlet或Dao对象,专门处理业务逻辑和数据访问)
- 视图层:工程中的html、jsp等页面,用于和用户交互,展示数据
- 控制层:工程中的servlet,用于接受请求和相应浏览器。
流程如下所示:
SpringMVC将这套MVC流程进行封装,屏蔽底层细节,开放出相关接口供开发者调用,让MVC开发更简单
二、Spring MVC的实现原理
2.1 核心组件
- DispatcherServlet:前置控制器,负责调度其他组件的执行,可以降低不同组件之间的耦合度,是整个SpringMVC的核心模块
- Handler:处理器,完成具体的业务逻辑,
相当于Servlet
。 - HaddlerMapping:DispatcherServlet通过HandlerMapping把
请求映射到不同的Handler
. - HandlerInterceptor:处理器拦截器,是一个
接口
,如果如要进行一些拦截处理,通过实现该接口完成 - HandlerExecutionChain:处理器执行链,包括两部分内容:
Handler和HandlerInterceptor
(系统会有一个默认的HandlerInterceptor,如果有额外的拦截处理,可以添加拦截器进行设置) - HandlerAdapter:处理器适配器,Handler执行业务方法之前,需要进行一系列的操作,包括:
表单的数据验证、数据类型转换、把表单数据封装到POJO等,这些都有HandlerAdapter完成
。Dispatcher通过HandlerAdapter执行不同的Adapter
。 - ModelAndView:封装了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet.
- ViewResolver:视图解析器,DispacherServlet通过它把逻辑视图解析为物理视图,最终把渲染的结果相应给客户端
2.2 工作流程
- 客户端请求被DispatcherServlet接受
- 根据HandlerMapping映射到Handler
- 生成Handler和HandlerInterceptor
- Hander和HandlerInterceptor通过HandlerExecutionChain的方式返回给DispatcherServlet
- DIspatchServlet通过HandlerAdapter调用Handler的方法完成逻辑处理
- 返回一个ModlerAndView对象给迁至控制器
- 把ModlerAndView传给视图解析器
- ViewResolver返回一个View进行视图渲染
- DispatcherServlet把渲染后的视图响应给客户端
三、常用注解
3.1 @RequestMapping
作用:用来处理请求地址映射,将其中的处理器方法
映射到url路径
上
属性:
- method:指定请求的method的类型,比如post、get
- value:请求的实际地址,多个地址用{}指定
- produces:指定返回的内容类型,当request请求头中的Accept类型中包含指定的类型才可以返回
- consumes:指定处理请求的提交内容类型,比如json、html、text等
- headers:指定request中必须包含header值时,才会用该方法处理请求
- params:指定request中必须有的参数值时,才会用该方法处理请求
3.2 RequestParam
作用:将请求参数绑定到控制器的方法参数上,是SpringMVC中的接收普通参数的注解
属性:
- value:请求参数中的名称
- required:是否必须提供参数
3.3. RequestBody:
作用:如果作用在方法中,表示该方法的返回结果是直接按写入的Http responsebody中(异步获取数据时使用的注解)
属性:required
3.4 PathVariable
作用:用于绑定url中的占位符(spring3.0后,url才支持占位符)
3.5 RequestParam和PathVariable的区别
@PathVariable主要用于接收http://host:port/path/{参数值}数据。@RequestParam主要用于接收http://host:port/path?参数名=参数值数据,这里后面也可以不跟参数值。
@RequestParam和@PathVariable这两者之间区别不大,主要是请求的URL不一样
用@RequestParam请求接口时,URL是:http://www.test.com/user/getUserById?userId=1
用@PathVariable请求接口时,URL是:http://www.test.com/user/getUserById/2
四、拦截器
4.1 过滤器、监听器、拦截器的对比
Servlet:处理Request请求和Response响应
过滤器:对Request请求起到过滤作用,作用在Servlet之前
,如果配置为/*可以为所有资源进行过滤处理
监听器:实现监听接口的服务器端组件,随Web应用的启动而启动,只初始化一次,然后一直监视,随web应用的停止而销毁
- 做初始化工作
- 监听web中的特定事件,比如HttpSession,ServletRequest的创建和销毁;变量的创建、销毁和修改等可以在某些动作前后增加处理,实现监控,比如统计在线人数等
拦截器:SpringMVC、Structs等表现层框架自己的,不会拦截jsp/html/image等的访问,只会拦截访问的控制器方法
- servlet、filter、listener是配置在web.xml中,interceptor配置在表现层框架自己的配置文件中
- 在Handler业务逻辑执行前拦截一次
- 在Handler逻辑执行完但还没有跳转页面前拦截一次
4.2 拦截器的基本概念
SpringMVC中的拦截器类似于Servlet中的过滤器,主要用于拦截用户的请求并作相应处理。通过拦截器可以进行权限验证
、记录请求信息的日志
、判断用户是否登录
等。
拦截器类的定义:
- 实现HandlerInterceptor的接口
- 继承HandlerInterceptor接口的实现类
所有的拦截器都需要实现HandlerInterceptor接口,该接口包含三个方法:
- preHandler:在Handler执行前执行,返回true,则执行Handler方法
- postHandler:在Handler执行后,视图生成前执行
- afterCompletion:在视图生成后执行
如图所示为Spring MVC拦截器的执行流程
拦截器的开发步骤:
- 开发拦截器
实现handlerInterceptor接口 - 注册拦截器
定义配置类,并让它实现WebMvcConfigurer接口,在接口的addInterceptor方法中注册拦截器。
4.3 怎么做请求拦截
如果是对Controller进行拦截,使用SpringMVC的拦截器
如果是对所有请求拦截,使用Filter
如果是对除了Controller之外的其他Bean请求拦截,使用Spring AOP