首页 > 编程语言 >2022-10-03-SpringMVC执行流程梳理及结合源码断点调试过程源码分析

2022-10-03-SpringMVC执行流程梳理及结合源码断点调试过程源码分析

时间:2022-10-03 20:55:33浏览次数:80  
标签:返回 10 控制器 调用 方法 视图 源码 处理器 断点

SpringMVC执行流程梳理

image
image

接口方式控制器实现流程分析

控制器层代码实现
image
控制器配置
image
SpringMVC.xml配置文件
image
image

客户端浏览器发起请求,按回车
image
前端控制器拦截所有请求 /
image
控制器DispatcherServlet实际上是个servlet
image
直接进入DispatcherServlet此处
image
通过调用类内部的doDispatch方法
image
点进去方法,通过调用getHandler方法返回处理器执行链HandlerExecutionChain
image
点进去方法,根据用户请求遍历返回对应的HandlerExecutionChain
image
HandlerExecutionChain类内部包含处理器;拦截器。
image
最后,点进去getHandler方法可查看到是可以获取到最终返回的处理器执行链的
image
接续向下执行,通过调用getHandlerAdapter获取处理器适配器HandlerAdapter
image
怎么获取的?点进去方法查看如何获取,实际上是通过遍历获取对应的匹配的HandlerAdapter
image
image
image
然后获取当前请求的方法
image
前置拦截器处理先不看,跳过处理
image
接着调用处理器适配器HandlerAdapter的handle方法,是个接口
image
使用子类实现SimpleControllerHandlerAdapter类
image
image
查看子类的方法实现,是通过调用handler的handleRequest方法来完成的,方法并返回ModelAndView对象
image
控制器实现了接口,所以可以调用对应的方法,接着按F8就进入控制器方法这里了
image
在方法中处理完,则填充View和参数Model,并返回对象ModelAndView对象
image
一步步向上返回,最终返回到前端控制器servlet这个类这里,得到一个mv对象
image
拦截器后置处理,先跳过分析,不需要进去看
image
然后继续就是进入processDispatchResult方法进行mv的处理,该方法把参数都传入进去了,接下来如何执行的需要点进去看
image
进去之后,内部调用render方法进行视图解析
image
image
查看render方法实现
先拿到视图名字
image
然后调用resolveViewNanme方法解析视图名称,并传入model数据,返回视图为封装数据后的视图
image
调用view的render方法进行视图中的数据封装
image
点进去查看render方法,通过OutputModel来完成
image
调用国际资源视图解析器,内部通过servlet转发器RequestDispatcher来完成
image
跳转到对应的web页面
image

核心流程到此处理完毕。

注解形式控制器实现(简化后续处理部分(未附截图)ModelAndView处理同通过接口实现方式)

image
浏览器网页发起客户请求:按回车
image
首先会进入前端控制器类DispatcherServlet进行处理
image
接着进入doDispatch方法
image
然后进入doDispatch方法内部的方法调用getHandler方法
image
通过遍历HandlerMappings调用对应的HandlerMapping的getHandler方法,来返回handlerExecutionChain处理器执行链
image
image
然后调用getHandlerAdapter方法根据处理器查找(处理器)适配器
image
通过遍历HandlerAdapters调用对应的HandlerAdapter的supports方法,来返回RequestMappingHandlerAdapter适配器
image
继续往下走,调用适配器的handle方法进行处理,并返回ModelAndView
image
调用handle方法
image
实际调用的是抽象父类中的handle方法
image
父类中的方法handleInternal是抽象方法,所以是由子类RequestMappingHandlerAdapter来实现,调用的是子类中的实现方法
image
调用的是子类中的handleInternal实现方法
image
方法内部调用invokeHandlerMethod方法返回ModelAndView对象
image
点进去最终通过在invokeAndHandle方法内部实际调用的是invokeForRequest获取返回值。
image
而函数内部又是通过doInvoke方法来获取返回值。
image
最后,doInvoke方法又是通过调用getBridgedMethod方法利用反射来实现方法调用的。
image
image
调用Bean中对应的方法sayHello,并进行返回。
image
最终执行结果
image
核心流程到此处理完毕。

参考网络视频学习整理:
https://www.bilibili.com/video/BV1tG411H748?p=1&vd_source=1

同一模一样
B站讲的最好的springMVC教程,springMVC执行流程详解https://www.bilibili.com/video/BV1Kz4y1D7yb?p=2

标签:返回,10,控制器,调用,方法,视图,源码,处理器,断点
From: https://www.cnblogs.com/YiMingXiaoBuYiMengXiaoNai/p/SpringMVC-sourceCodeFenXi.html

相关文章

  • 2022-10
    2022-1010-03这是第一天,介于今天比赛中我的「惊天地泣鬼神」的表现,决定在这里做一个学习直播,顺带说些东西,人流不会很多也不会很少,加油吧.距离CSP2022-2还有......
  • 2022.10.03考试总结
    2022.10.03考试总结得分:\(140/300\)总结:今天拿了一个暴力分,第二题的暴力因为精度问题没有跑过去,第一题是签到题,在考场上因为担心这道题出现问题所以打了对拍,二三题都有......
  • 【閒話】2022.10.03閒話
    最近繃不住要看書了又到了一波補給大家可以來我宿舍搶奪(什啊最近再切莫反好難啊所以joke您怎麼那麼巨啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊......
  • thinkphp 知识付费小程序源码 后台免费一键更新教程资源
    知识付费小程序源码thinkphp后台管理数据,带800条真实教程资源数据,后台免费一键更新教程资源  thinkphp3.2后台,小程序前端已修改很多bug,会员收藏,会员下载记录,会员积......
  • 【金山文档】集中存放资源共享文件夹-2022年10月3日
     【金山文档】集中存放资源共享文件夹-2022年10月3日  www.kdocs.cn/l/cnSk5MmgUrqa www.autoahk.com/?p=44005  www.cnblogs.com/delphixx/p/16750423.html......
  • Ipyton使用笔记[1003]
    第一次使用:字符串操作   In[1]:lst=[11,12,13,7,1,3,2,2,5,6,10,7]In[2]:lstOut[2]:[11,12,13,7,1,3,2,2,5,6,10,7]In[3]:lst1=[11,12,13,......
  • 10.3
        自定义类:ClassAndObjectTest.java       这两种方式定义变量不同,前一种数据为基本类型integer,变量可以用数值去赋值,即显式初始化,而MyClass......
  • 总结1003
    ##用户交互交互的本质就是输入、输出关键字inputprint或者是output##格式化输出关键字占位符%s%d特殊方法\n\a等不需要使特殊符号起作用是前面加r##算术......
  • Node.js实现大文件断点续传
    前言平常业务需求:上传图片、Excel等,毕竟几M的大小可以很快就上传到服务器。针对于上传视频等大文件几百M或者几G的大小,就需要等待比较长的时间。这就产生了对应的解决方......
  • Node.js实现大文件断点续传
    前言平常业务需求:上传图片、Excel等,毕竟几M的大小可以很快就上传到服务器。针对于上传视频等大文件几百M或者几G的大小,就需要等待比较长的时间。这就产生了对应的解决方......