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,找到了

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

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

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

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

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

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

doService又去调用doDispatch方法

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

handlerMappings可以调试发现,有两个

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

之后

获取HandlerAdapter,

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

可以通过调试找到

HttpRequestHandlerAdapter

SimpleControllerHandlerAdapterXML配置的适配器

RequestMappingHandlerAdapter注解配置的适配器

代码继续往下走applyPreHandle

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

没有拦截器的话

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

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

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

它主要去调用了render方法

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

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

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

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

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

我们以Thymeleaf为例子

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

来张图补脑

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

你可能感兴趣的:(SpringMVC 原理探究 全网最详细)