1.请求进入DispatcherServletdoService()进行处理前准备工作

  1. 通过logRequest()打印请求日志
  2. WebApplicationContext和一些解析器(LocalResolverThemeResolver)通过setAttribute()设置在请求中

image.png

2.doService()最后调用doDispatch()开始真正处理工作

  1. 若请求是Multipart请求,则转换为MultipartFile请求
  2. 通过HandlerMapping获取请求对应的HandlerExecutionChain(Handler+List<HandlerInterceptor>)
    1. 常规的使用的RequestMappingHandlerMapping类寻找HandlerExecutionChain
    2. HandlerExecutionChain中包含了拦截器和Handler(具体的是HandlerMethod)

HandlerExcutionChain_ev.gif

  1. 通过HandlerExecutionChain中的Handler(HandlerMethod)生成对应的HandlerAdapter(RequestMappingHandlerAdapter)

HandlerAdater获取_ev.gif

  1. 处理last-modify头部信息
  2. 调用HandlerExcutionChain中的拦截器类中的PreHandler()方法
  3. 真正执行Handler方法(具体Controller类中的某个方法)
  4. 调用HandlerExcutionChain中的拦截器中的PostHandle()方法

image.png

3.doDispatch()方法调用processDispatchResult()完成最终结果处理

  1. 异常处理
  2. 调用render()方法,render()方法中先解析出View,然后View通过model再次渲染
  3. 通过HandlerExecutionChain获取拦截器,并执行拦截器的afterCompletion()

image.png