SpringMVC 原理探究 全网最全

SpringMVC

 

Spring Web MVC 是最原始的Web框架,在最原始的Servlet的基础上构建的

兄弟 Spring Web Flux 非阻塞的异步的

 

DispatcherServlet

一个继承源于Servlet的类,是一个前置控制器,起请求分发的作用

所有的请求都会委托给DispatchServlet,既然是Servlet,就需要

被定义和映射到Servlet容器中,使用Java configuration 或者web.xml

SpringMVC 原理探究

继承关系 DispatchServlet → FrameworkServlet → HttpServletBean → HttpServlet

HttpServlet 是原生的Servlet,有个service方法,所以我们去他的子类中找service方法,在HttpServletBean中没找到service的实现方法,继续寻找子类FrameworkServlet,找到了

SpringMVC 原理探究 全网最全

可以看到,先调用了HttpMethod的.resolve方法,打开HttpMethod是个啥子

SpringMVC 原理探究 全网最全

没错,是个枚举,这个是springmvc提供的HTTP请求方法

resolve其实就是将客户端请求字符串封装成HttpMethod的枚举

之后的判断,根据请求方法,如果是PATCH或者是空,直接走processRequest(request, response)方法,如果是其他的标准方法,会去调用父类的service方法,然而父类的service方法会判断请求方法,走对应的方法,比如说GET走doGet方法

SpringMVC 原理探究 全网最全

SpringMVC 原理探究 全网最全

在FrameworkServlet的doGet、doPost等标准请求中,总是在调用processRequest方法,我们来看看这个方法

SpringMVC 原理探究 全网最全

主要调用了doService,而FrameworkServlet类的doService是个抽象方法,所以去子类看看

SpringMVC 原理探究 全网最全

doService又去调用doDispatch方法

 

SpringMVC 原理探究 全网最全

先检查是否为多媒体请求,然后去getHandler

SpringMVC 原理探究 全网最全

handlerMappings可以调试发现,有两个

遍历这两个Map,去尝试寻找符合request的Controller,找到之后,将Controller和他对应的拦截器封装到HandlerExecutionChain里面然后将对象返回给doDispatch方法

SpringMVC 原理探究 全网最全

之后SpringMVC 原理探究 全网最全

获取HandlerAdapter,

SpringMVC 原理探究 全网最全

根据controller对象去找到合适的适配器,可以发现和HandlerMapping如出一辙

可以通过调试找到

HttpRequestHandlerAdapter  
SimpleControllerHandlerAdapter XML配置的适配器
RequestMappingHandlerAdapter 注解配置的适配器

 

SpringMVC 原理探究 全网最全

代码继续往下走applyPreHandle

SpringMVC 原理探究 全网最全

有拦截器的话走拦截器,因为有拦截器的话,在的doDispatch那里直接return了

没有拦截器的话

 

SpringMVC 原理探究 全网最全

执行handle,其实就是执行Controller的方法,处理业务逻辑,返回一个ViewAndModel 对象

SpringMVC 原理探究 全网最全

在调用processDispatchResult这里将request,response,controller和拦截器,ViewAndModel等都给这个方法

我们来看这个方法,处理之前的判断传过来的数据是否可用

SpringMVC 原理探究 全网最全

它主要去调用了render方法

SpringMVC 原理探究 全网最全

先设置了本地化,之后主要调用resolveViewName方法

SpringMVC 原理探究 全网最全

看看,和HandlerMappings、HandlerAdapter也是一样的,在viewResolvers中去寻找合适的视图返回,其中带着本地参数,为了国际化的页面,话说回来,render方法获取到View对象后

SpringMVC 原理探究 全网最全

调用了view的render方法,其中调用了mv.getModelInternal()

SpringMVC 原理探究 全网最全

其实 就是把Model的数据(是个Map)给视图,让视图去把map里面的数据一个一个的选词填空的填上,

View是个接口,我们来看看实现类

SpringMVC 原理探究 全网最全

我们以Thymeleaf为例子

是View的实现类将最后填空的作业用原生的Response响应给客户端的,在相应html字符串的这里,dispatchservlet没有参与

SpringMVC 原理探究 全网最全

来张图补脑

SpringMVC 原理探究 全网最全

[百度]  最后一张图来源于百度