1. Spring MVC 设计思想
1.1 回顾servlet 与jsp 执行过程
WEB-INF/web.xml
<servlet>
<servlet-name>servlet</servlet-name>
<servlet-class>bat.ke.qq.com.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html");
resp.getWriter().write("<h1>hello world</h1>");
}
}
1.2 什么是Spring MVC
Spring Web MVC是基于Servlet API构建的原始Web框架,从一开始就包含在Spring框架中。其正式名称“Spring Web MVC”来自它的源模块(Spring -webmvc)的名称,但它更常见的名称是“Spring MVC”。
Springmvc本质上还是在使用Servlet处理,并在其基础上进行了封装简化了开发流程,提高易用性、并使用程序逻辑结构变得更清晰
- 基于注解的URL映射
- http表单参数转换
- 全局统一异常处理
- 拦截器的实现
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gkRGgR3-1575868076522)(C:\Users\chaos\AppData\Roaming\Typora\typora-user-images\1562225442967.png)]
2. Spring MVC应用及其源码分析
2.1 Spring MVC 组件介绍
-
DispatchServlet
前端控制器
请求处理逻辑: DispatcherServlet#doDispatch
-
HandlerMapping
处理器映射
其为mvc 中url路径与Controller对象的映射,DispatcherServlet 就是基于此组件来寻找对应的Control,如果找不到就会报Not Found mapping 的异常。
目前主流的三种mapping 如下:
BeanNameUrlHandlerMapping //基于ioc中beanName以 "/" 开头的Bean的映射 SimpleUrlHandlerMapping //基于手动配置 url 与controller映射 RequestMappingHandlerMapping //基于@RequestMapping注解配置对应的映射
-
HandlerAdapter
处理器适配器
Springmvc 采用适配器模式来适配调用指定Handler,根据Handler的不同种类采用不同的Adapter,其Handler与 HandlerAdapter 对应关系如下:
Handler类别 | 对应适配器 | 描述 |
---|---|---|
Controller | SimpleControllerHandlerAdapter | 标准控制器,返回ModelAndView |
HttpRequestHandler | HttpRequestHandlerAdapter | 业务自行处理 请求,不需要通过modelAndView 转到视图 |
Servlet | SimpleServletHandlerAdapter | 基于标准的servlet 处理 |
HandlerMethod | RequestMappingHandlerAdapter | 基于@requestMapping对应方法处理 |
-
HandlerExecutionChain
处理器执行链(handler interceptors)
-
ViewResolver
视图解析器
找到应的Adapter 之后就会基于适配器调用业务处理,处理完之后业务方会返回一个ModelAndView ,在去查找对应的视图进行处理。
其在DispatcherServlet#resolveViewName() 中遍历 viewResolvers 列表查找,如果找不到就会报一个 Could not resolve view with name 异常。
-
View
具体解析视图
基于ViewResolver**.**resolveViewName() 获取对应View来解析生成Html并返回
-
HandlerExceptionResolver
处理器异常解析器
该组件用于指示当出现异常时 Spring mvc 该如何处理。
DispatcherServlet 会调用DispatcherServlet#processHandlerException() 方法,遍历 handlerExceptionResolvers 处理异常,处理完成之后返回errorView 跳转到异常视图。
-
HandlerInterceptor
处理器拦截器
其实现机制是基于 HandlerExecutionChain 分别在 doDispatch 方法中执行以下方法:
- preHandle :业务处理前执行
- postHandle:业务处理后(异常则不执行)
- afterCompletion:视图处理后
在org/springframework/web/servlet/Di