关于SpringMVC的工作流程我引用其官方文档上的一幅截图:SpringMVC处理过程_ DispatcherServlet

上面这幅图从宏观上粗略的介绍了SpringMVC的整个工作流程,简洁明了。

下面我从代码的角度去感受一下:

SpringMVC处理过程_ DispatcherServlet_02

由于,我们在web.xml中声明了一个DispatcherServlet,那么,tomcat启动的时候就会初始化它。

我们知道,Servlet的初始化方法是init(),就从这里入手,看看它初始化都干了些什么

SpringMVC处理过程_SpringMVC_03

SpringMVC处理过程_SpringMVC_04

SpringMVC处理过程_ DispatcherServlet_05

一、初始化

在HttpServletBean中有一个init方法

SpringMVC处理过程_ DispatcherServlet_06

FrameworkServlet类中重写了initServletBean()方法

SpringMVC处理过程_ DispatcherServlet_07

FrameworkServlet中的initWebApplicationContext()方法

SpringMVC处理过程_SpringMVC_08

Dispatcher类中重写onRefresh()方法

SpringMVC处理过程_SpringMVC_09

至此,我们看到DispatcherServlet初始化的时候顺带初始化了一堆组件,什么视图解析器、处理器映射之类的。

二、处理请求

因为DispatcherServlet是继承HttpServlet的,所以处理请求时会调用doGet或者doPost方法

在FrameworkServlet类中重写了doGet和doPost方法

SpringMVC处理过程_ DispatcherServlet_10

FrameworkServlet中processRequest方法是这样的

SpringMVC处理过程_SpringMVC_11

它调用了doService方法,接下来,好戏开始了

DispatcherServlet重写了doService()方法

SpringMVC处理过程_ DispatcherServlet_12


至此,请求处理完成

总结一下处理过程:

  1. 绑定资源到请求

  2. 检查是否文件上传

  3. 查找HandlerMappping获得HandlerExecutionChain

  4. 依次调用与处理器关联的所有拦截器的preHandle方法

  5. 调用处理器方法

  6. 依次调用与处理器关联的所有拦截器的postHandle方法

  7. 渲染视图

  8. 依次调用与处理器关联的所有拦截器的afterCompleting方法