SpringMVC——MVC执行流程底层剖析

SpringMVC流程图如上面所示,根据上图,串联一下底层源码:
1.在DispatcherServlet中找到doDisPatch

2.观察方法体,然后找到getHandler方法

3.点进方法,发现也是调用另一个getHandler方法

4.点进方法,发现是一个接口,然后我们进入其抽象类的AbstractHandlerMapping的getHandler方法:


5.查看getHandlerExecutionChain方法
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
//如果不是chain类型,将handler作为构造函数创建一个chain实例
HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ?
(HandlerExecutionChain) handler : new HandlerExecutionChain(handler));
//获得有效url路径,用于匹配拦截器规则
String lookupPath = this.urlPathHelper.getLookupPathForRequest(request);
//获取所有拦截器
for (HandlerInterceptor interceptor : this.adaptedInterceptors) {
//如果是MappedInterceptor类型的,按照规则看看当前拦截器是否需要加入拦截
if (interceptor instanceof MappedInterceptor) {
MappedInterceptor mappedInterceptor = (MappedInterceptor) interceptor;
//如果拦截器规则设置/*,表示拦截所有,也就是说url是什么都会加入
if (mappedInterceptor.matches(lookupPath, this.pathMatcher)) {
chain.addInterceptor(mappedInterceptor.getInterceptor());
}
}
else {
//该拦截器直接加入拦截器链
chain.addInterceptor(interceptor);
}
}
return chain;
6.返回到DispatcherServlet,这样我们知道getHandler方法就是通过HandlerMapping(处理映射器)返回一个处理链,处理链中包含了n个拦截(上面代码详解)

7.进入getHandlerAdapter方法

这里回忆一下默认的Adapter实现有哪些:
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
其中前两个Adapter都跟我们当前的例子没关系,怎么看出来的呢?回到getHandlerAdapter方法中,接下来会遍历Adapter列表,依此调用supports方法查询与当前handler是否支持。其上两个Adapter一个是处理HttpRequestHandler,一个是处理Controller类的,只有最后一个RequestMappingHandlerAdapter的supports方法才是我们要的
8.进入RequestMappingHandlerAdapter


此时看到上面两个方法,便一切都能说通了,如下图:

9.这一步,我们知道中央调度器将处理链交给处理器适配器进行处理器Handler的匹配,从而调用Controller的方法,返回ModelAndView,交给中央调度器 ,然后进行下面的视图解析,渲染视图等
SpringMVC——MVC执行流程底层剖析的更多相关文章
- 从源码角度了解SpringMVC的执行流程
目录 从源码角度了解SpringMVC的执行流程 SpringMVC介绍 源码分析思路 源码解读 几个关键接口和类 前端控制器 DispatcherServlet 结语 从源码角度了解SpringMV ...
- springMVC的执行流程和完整代码
一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...
- 一文读懂Spring MVC执行流程
说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: ...
- Java——一文读懂Spring MVC执行流程
说到Spring MVC执行流程,网上有很多这方面的文章介绍,但是都不太详细,作为一个初学者去读会有许多不理解的地方,今天这篇文章记录一下我学习Spring MVC的心得体会 话不多说,先上图: Sp ...
- 《SpringMVC从入门到放肆》二、SpringMVC的执行流程及默认配置
上一篇博文我们做了一个hello world的程序,并且已经成功的跑起来了.这一篇我们来深入的了解一下SpringMVC的执行流程以及一些其它的配置. 一.执行流程 来解释一下上图中的各个名词1.Di ...
- 通过自己实现接口来加深理解SpringMVC的执行流程
功能介绍 上篇文章[从源码角度了解SpringMVC的执行流程]通过接口源码向大家介绍了SpringMVC的执行流程,主要偏重于源码.这篇文件我们来自己实现那几个关键接口,来真实体验下SpringMV ...
- Spring MVC入门(一)—— SpringMVC的执行流程与常用注解
一.什么是SpringMVC SpringMVC就是类似于Struts2的mvc框架,属于SpringFrameWork的后续产品.在模型层中与视图层的交互部分. springMVC执行流程: 二.常 ...
- springmvc的执行流程详解
1.什么是MVC MVC是Model View Controller的缩写,它是一个设计模式 2.springmvc执行流程详细介绍 第一步:发起请求到前端控制器(DispatcherServlet) ...
- SpringMVC的执行流程
解析SpringMVC执行流程 SpringMVC的执行图大概如下所示 1.首先它是由客户端发起请求,到DispatcherServlet,被拦截后到HandlerMapping这里充当一个路由器,通 ...
随机推荐
- Online Meeting CodeForces - 420B (思维)
大意: 给定某一段连续的上线下线记录, 老板上线或下线时房间无人, 并且每次会议都在场, 求哪些人可能是老板. 结论1: 从未出现过的人一定可以是老板. 结论2: 出现过的人中老板最多只有1个. 结论 ...
- Array Product CodeForces - 1042C (细节)
#include <iostream> #include <sstream> #include <algorithm> #include <cstdio> ...
- THUWC2020滚粗记
\(Day-?\) 教练叫走了3个人,没叫我 感觉药丸,然后被告知pku没过,thu过了 神奇,然后就活了 后来在机房颓废,大声说笑被diss 当时感觉颓的有点过头,药丸 \(Day0\) 跟NC去T ...
- 《深入实践C++模板编程》之一——Hello模板
1.通过一个简单的例子来理解模板的用途: 模板为不同类型的数据生成操作相同或相似的函数. 弱语言如Python,可以使用一种函数来应对各种类型,但是C++就不得不为不同的类型编写相似的函数.模板的作用 ...
- WEBAPI 最近更新项目时 服务器总是提示:An error has occurred.
解决办法: 在webconfig中设置 <system.web><customErrors mode="Off"/></system.web> ...
- 【原创】大数据基础之Drill(1)简介、安装及使用
https://drill.apache.org/ 一 简介 Drill is an Apache open-source SQL query engine for Big Data explorat ...
- 你不知道的css各类布局(一)之固定布局、静态布局
前言 当为大量用户设计网站时,设计人员必须考虑到访问者的差异: 屏幕分辨率, 浏览器的选择, 是否在浏览器最大化状态, 浏览器的额外工具栏的开启(历史记录,书签等), 操作系统和硬件. 我们知道css ...
- Atcoder-SoundHound Inc.Contest 2018 -Masters Tournament-比赛报告
A C++ Example #include <iostream> #include <cstdio> #include <cstdlib> #include &l ...
- MFC + XToolKit的使用 ( 亲自实践 )
1. 变量声明: 在Dlg.h 的public下 CXTPButton m_Button2; 2. 变量交换并设置按钮风格: Dlg.cpp下 void CXT_VS2010Dlg::DoDat ...
- Unexpected console statement (no-console)
在vue cli项目中用consloe.log()打印,启动项目报错 export default { name: 'app', components: { }, created() { this.t ...