✿ 阅读源码思路:

先跳过非重点,深入每个方法,进入的时候可以把整个可以理一下方法的执行步骤理一下,也可以,理到某一步,继续深入,回来后,接着理清除下面的步骤。

✿ 阅读本文的准备工作,预习一下SpringMVC的执行流程

■ 解释一下,为什么标题是验证SpringMVC执行流程:

不知道小伙伴有没有做过物理实验的验证实验,道理是一样的,举个高中生都做过的物理实验吧----自由落体实验,这个实验是通过小钢球做抛物运动,验证重力加速度的g值是9.8。对于本文,咱的做法是通过调试来验证SpringMVC的执行流程是:

1、前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。

2、前端控制器通过处理器适配器,调用处理器的方法,然后处理器执行后返回模型视图对象给处理器适配器,适配器再将模型视图对象返回给前端对象。

3、前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应。

SpirngMVC执行流程图(图片来源于叩丁狼)

一、执行流程前的次要源码

● 开始debug的时候,对HttpMethod感到好奇,点进去查看一下HttpMethod究竟是何物?

  • HttpMethod 是请求方法的枚举类,结合咱浏览器地址栏的参数是直接输入,可以知道咱的HttpMethod的值是Get

  • 果然咱的HttpMethod的值是Get,所以下一步会执行super.service(request, response);

  • ctr进入该方法看一下,究竟是何物,发现按ctr没有反应解决:重新打开该类的文件

  • 进入super.service(request, response);内部一探究竟:

  • 发现这个service方法做的是请求分发操作,结合咱的请求方法是GET,所以下一步咱是到doGet方法去一探究竟~

  • 再进入processRequest方法~

  • 进入发现重点是doService(request, response);那咱就进入该方法内部一探究竟吧~

  • 进入发现重点是doDispatch(request, response);那咱就进入该方法内部一探究竟吧~

二、真正的springMVC执行流程的源码分析

1、验证:前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。

● 获取处理器映射器返回处理器执行链对象,getHandler(processedRequest);方法

【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器寻找处理器,返回一个处理器执行链对象】。

● 发现了 this.handlerMappings 处理器映射器-观察它的值为:

[org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping@40851021]【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器寻找处理器,返回一个处理器执行链对象】。

● 进入 mapping.getHandler(request); 方法内部:

● 进入返回处理器对象的getHandlerInternal方法内部:Object handler = lookupHandler(lookupPath, request);

【咱提前了解到的springMVC的执行过程:前端控制器接收请求,通过处理器映射器依据路径进行匹配来寻找处理器,返回一个处理器执行链对象】。

● 进入lookupHandler方法内部:验证了通过处理器映射器依据路径进行匹配来寻找处理器。还观察到urlPath的值,正是咱配置的处理器的路径



---- 按照阅读源码观察步骤,到这一步,你已经理清楚了,可以调试回去,回去到:



......

✿ 至此,验证了SpringMVC的执行流程:前端控制器接收到客户端的请求后,通过处理器映射器handlerMappings,根据路径urlPath去匹配选择处理器handler,最终返回一个处理器执行链对象HandlerExcutionChain。


2、验证:前端控制器通过处理器适配器,调用处理器的方法,然后处理器执行后返回模型视图对象给处理器适配器,适配器再将模型视图对象返回给前端对象.

● 获取处理器适配器对象HandlerAdapter

● 进入getHandlerAdapter获取处理器适配器方法内部:

看到了this.handlerAdapters 处理器映射器-观察它的值为:

[org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter@60038152]

  • 非重点:判断与“被修改”相关的
  • 非重点:前置拦截器相关的

● 进入ha.handle方法内部观察:

  • 看到了(Controller) handler -观察它的值为:

    com.shan.hello.HelloController@591b274

  • `执行完((Controller) handler).handleRequest(request, response);即调用咱自己书写的处理器类的方法~``

  • 返回,继续观察,发现ModelAndView对象,观察它的值

    ModelAndView [view="/WEB-INF/views/welcome.jsp"; model={msg=你好,easyMVC}]

  • 这个深入进去,设置视图名称

  • 非重点:后置拦截器

  • 继续观察---观察到:处理分发的结果,深入进去观察:

  • 非重点:错误异常相关的

  • 重点:渲染方法

。。。。。。跟视图有关的重点。。。。。

至此,验证了SpringMVC的执行流程:前端控制器通过处理器适配器HandlerAdapter,调用处理器HelloController的方法,然后处理器执行后返回模型视图对象ModelAndView给处理器适配器,适配器再将模型视图对象返回给前端控制器.


3、验证:前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应.

  • 非重点:国际化
  • 非重点:视图名称

● 重点:渲染视图



  • 观察到返回一个模型对象,根据方法调用的先后顺序,先调用了view.render(mv.getModelInternal(), request, response);的mv.getModelInternal()方法,需要重新深入一次



● 在渲染视图render方法内部,观察到mergedModel,观察它的值:

{msg=你好,easyMVC}

  • 非重点:预响应

● 重点:renderMergedOutputModel【符合咱提前了解的SpringMVC的执行流程中渲染视图的数据】

● 深入,发现是将共享数据设置到请求中去

● 接着往下,跳过非重点,来到请求转发

至此,验证:前端控制器通过视图解析器,将模型视图进行解析,然后将模型数据填充到View,并渲染到视图,然后返回响应.

【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程的更多相关文章

  1. SpringMVC源码分析(3)DispatcherServlet的请求处理流程

    <springmvc源码分析(2)dispatcherservlet的初始化>初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的 ...

  2. SpringMVC源码剖析(三)- DispatcherServlet的初始化流程

    在我们第一次学Servlet编程,学Java Web的时候,还没有那么多框架.我们开发一个简单的功能要做的事情很简单,就是继承HttpServlet,根据需要重写一下doGet,doPost方法,跳转 ...

  3. springmvc 源码分析(二)-- DiapartcherServlet核心调用流程分析

    测试环境搭建: 本次搭建是基于springboot来实现的,代码在码云的链接:https://gitee.com/yangxioahui/thymeleaf.git 项目结构代码如下: 一: cont ...

  4. spark 源码分析之二十一 -- Task的执行流程

    引言 在上两篇文章 spark 源码分析之十九 -- DAG的生成和Stage的划分 和 spark 源码分析之二十 -- Stage的提交 中剖析了Spark的DAG的生成,Stage的划分以及St ...

  5. SpringMVC源码分析系列

    说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Servlet容器元素来设计的,同时sp ...

  6. SpringMVC源码

    SpringMVC源码分析系列 说到java的mvc框架,struts2和springmvc想必大家都知道,struts2的设计基本上完全脱离了Servlet容器,而springmvc是依托着Serv ...

  7. 【Spring专场】「IOC容器」不看源码就带你认识核心流程以及运作原理

    这是史上最全面的Spring的核心流程以及运作原理的分析指南 [Spring核心专题]「IOC容器篇」不看繁琐的源码就带你浏览Spring的核心流程以及运作原理 [Spring核心专题]「AOP容器篇 ...

  8. SpringMVC源码情操陶冶-FreeMarker之web配置

    前言:本文不讲解FreeMarkerView视图的相关配置,其配置基本由FreeMarkerViewResolver实现,具体可参考>>>SpringMVC源码情操陶冶-ViewRe ...

  9. 手把手带你阅读Mybatis源码(三)缓存篇

    前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读Mybatis源码(一)构造篇 和 手把手带你阅读Mybatis源码(二)执行篇,主要说明了MyBatis是如何 ...

随机推荐

  1. nextcloud个人云搭建

    nextcloud个人云搭建 目录 nextcloud个人云搭建 树莓派安装系统 安装OMV5 安装dockcer 挂载硬盘进行映射(使用u盘测试的) 不足 配置数据库 使用docker拉取postg ...

  2. CF Round #530 Div2

    A. 尛你 \(\%\%\%\) B. 题意:你需要在平面上画 \(n(n \le 10 ^ 9)\) 个 \(1 \times 1\) 的正方形,且顶点都在整点上,每次可以画一条长度为 \(1\) ...

  3. kindof

    kindof:相当于 __kindof:表示当前类或者它的子类' 类设计历史 id:可以调用任何对象方法,不能进行编译检查 @interface Person : NSObject // xcode5 ...

  4. Java内存分析简单介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html Java内存分析简单介绍: 1. # 设置内存溢出时自动生成堆内存快照 ...

  5. mybatis的一对多(collection)

    使用图解: 低效率查询: 高效率查询: 1 查询用联合查询 2<collection 里面不写column

  6. linux_5

    1 简述osi七层模型和TCP/IP五层模型 2 总结描述TCP三次握手四次挥手 TCP是一种可靠的,面向连接的全双工传输层协议. TCP连接的建立是一个三次握手的过程.如图所示: 第一次握手:主机A ...

  7. 北京太速科技-6U VPX 6槽 Full Mesh结构背板机箱

    一.产品概述 Ori6UVPX6SlotFullMesh264背板机箱 为 6U VPX 6槽 Full Mesh结构,用于实现PCIE.RapidIO IO 4X Full Mesh 高速数据互联, ...

  8. 常用文本处理命令 & 三剑客之 sed

    今日内容 文本处理命令 Linux 三剑客之 sed 内容详细 文本处理命令 1.sort : 文件内容排序 默认按照文件隔行内容的第一个字符大小进行排序(默认是升序) 默认输出文本结果 sort [ ...

  9. suse 12 部署chrony时间同步服务器

    文章目录 1.ntp和chrony的区别 1.1.关于chrony 1.2.chronyd的优势 2.环境介绍 3.部署chrony 4.配置chrony 4.1.配置文件解析 4.2.查看chron ...

  10. 日行一算(Vowel-大小写转换)

    题目 题目描述 solo从小就对英文字母非常感兴趣,尤其是元音字母(a,e,i,o,u,A,E,I,O,U),他在写日记的时候都会把元音字母写成大写的,辅音字母则都写成小写,虽然别人看起来很别扭,但是 ...