SpringMVC执行流程梳理
接口方式控制器实现流程分析
控制器层代码实现
控制器配置
SpringMVC.xml配置文件
客户端浏览器发起请求,按回车
前端控制器拦截所有请求 /
控制器DispatcherServlet实际上是个servlet
直接进入DispatcherServlet此处
通过调用类内部的doDispatch方法
点进去方法,通过调用getHandler方法返回处理器执行链HandlerExecutionChain
点进去方法,根据用户请求遍历返回对应的HandlerExecutionChain
HandlerExecutionChain类内部包含处理器;拦截器。
最后,点进去getHandler方法可查看到是可以获取到最终返回的处理器执行链的
接续向下执行,通过调用getHandlerAdapter获取处理器适配器HandlerAdapter
怎么获取的?点进去方法查看如何获取,实际上是通过遍历获取对应的匹配的HandlerAdapter
然后获取当前请求的方法
前置拦截器处理先不看,跳过处理
接着调用处理器适配器HandlerAdapter的handle方法,是个接口
使用子类实现SimpleControllerHandlerAdapter类
查看子类的方法实现,是通过调用handler的handleRequest方法来完成的,方法并返回ModelAndView对象
控制器实现了接口,所以可以调用对应的方法,接着按F8就进入控制器方法这里了
在方法中处理完,则填充View和参数Model,并返回对象ModelAndView对象
一步步向上返回,最终返回到前端控制器servlet这个类这里,得到一个mv对象
拦截器后置处理,先跳过分析,不需要进去看
然后继续就是进入processDispatchResult方法进行mv的处理,该方法把参数都传入进去了,接下来如何执行的需要点进去看
进去之后,内部调用render方法进行视图解析
查看render方法实现
先拿到视图名字
然后调用resolveViewNanme方法解析视图名称,并传入model数据,返回视图为封装数据后的视图
调用view的render方法进行视图中的数据封装
点进去查看render方法,通过OutputModel来完成
调用国际资源视图解析器,内部通过servlet转发器RequestDispatcher来完成
跳转到对应的web页面
核心流程到此处理完毕。
注解形式控制器实现(简化后续处理部分(未附截图)ModelAndView处理同通过接口实现方式)
浏览器网页发起客户请求:按回车
首先会进入前端控制器类DispatcherServlet进行处理
接着进入doDispatch方法
然后进入doDispatch方法内部的方法调用getHandler方法
通过遍历HandlerMappings调用对应的HandlerMapping的getHandler方法,来返回handlerExecutionChain处理器执行链
然后调用getHandlerAdapter方法根据处理器查找(处理器)适配器
通过遍历HandlerAdapters调用对应的HandlerAdapter的supports方法,来返回RequestMappingHandlerAdapter适配器
继续往下走,调用适配器的handle方法进行处理,并返回ModelAndView
调用handle方法
实际调用的是抽象父类中的handle方法
父类中的方法handleInternal是抽象方法,所以是由子类RequestMappingHandlerAdapter来实现,调用的是子类中的实现方法
调用的是子类中的handleInternal实现方法
方法内部调用invokeHandlerMethod方法返回ModelAndView对象
点进去最终通过在invokeAndHandle方法内部实际调用的是invokeForRequest获取返回值。
而函数内部又是通过doInvoke方法来获取返回值。
最后,doInvoke方法又是通过调用getBridgedMethod方法利用反射来实现方法调用的。
调用Bean中对应的方法sayHello,并进行返回。
最终执行结果
核心流程到此处理完毕。
参考网络视频学习整理:
https://www.bilibili.com/video/BV1tG411H748?p=1&vd_source=1
同一模一样
B站讲的最好的springMVC教程,springMVC执行流程详解https://www.bilibili.com/video/BV1Kz4y1D7yb?p=2