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没有参与
来张图补脑
[百度] 最后一张图来源于百度