准备
简单搭建一个Spring MVC的项目,并写一个Controller,运行一个基本的请求转发
DispatcherServlet类图分析
由此图我们可以分析的到,DispatcherServlet继承的FrameworkServlet实现了Spring中的ApplicationContextAware接口,然后又间接继承了HttpServlet。所以实质上是一个Servlet,(因为Spring MVC的切入口是Servlet,不同于Struts2,是Filter)。实现ApplicationContextAware,就可以拿到Spring的容器,就能获取Spring容器中的@Controller注解的类等。
断点调试
断点调试DispatcherServlet.class->onRefresh()->initStrategies(),来看下Spring MVC的初始化流程。
- 第一个过程
首先Spring已经把我们注解或者xml配置的bean装载进去了,
在这个阶段,DispatcherServlet会从Spring容器中取出bean用于初始化HandlerMapping、HandlerAdapter、ViewResolver等放入DispatcherServlet对象中。断点init*方法即可看到其过程。
HandlerMapping的作用是根据request找到对应的处理器Handler
HandlerAdapter的作用是调用具体的方法对用户发来的请求来进行处理
ViewResolver的作用是把Handler返回的逻辑视图名称解析为真正的视图View对象。 - 第二个过程:
请求映射与包装返回:
在web.xml中,配置servlet的servlet-mapping的url为/,那么所有的请求都会进入这个DispatcherServlet中。
在FrameworkServlet中,重写了service方法,当然这里只是做一些判断。
(service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法)
请求进入后,一次进入方法:
service()->进入相应的doGet或doPost等->processRequest()->doService()->doDispatch()
doDispatch这个方法是映射的核心,在其中,会去拿到request地址对应的mappedHandler,从而拿到对应的HandlerAdapter,然后HandlerAdapter执行handle方法(可以理解为去反射执行对应的Controller中的方法),返回ModelAndView。
最后就是视图解析的过程了。
整理流程:
- 用户发送请求至前端控制器DispatcherServlet。
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet调用HandlerAdapter处理器适配器。
- HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
- Controller执行完成返回ModelAndView。
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
- ViewReslover解析后返回具体View。
- DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户。