1.请求进入DispatcherServlet
的doService()
进行处理前准备工作
- 通过
logRequest()
打印请求日志 - 将
WebApplicationContext
和一些解析器(LocalResolver
、ThemeResolver
)通过setAttribute()
设置在请求中
2.doService()
最后调用doDispatch()
开始真正处理工作
- 若请求是
Multipart
请求,则转换为MultipartFile
请求 - 通过
HandlerMapping
获取请求对应的HandlerExecutionChain
(Handler
+List<HandlerInterceptor>
)- 常规的使用的
RequestMappingHandlerMapping
类寻找HandlerExecutionChain
HandlerExecutionChain
中包含了拦截器和Handler
(具体的是HandlerMethod
)
- 常规的使用的
- 通过
HandlerExecutionChain
中的Handler
(HandlerMethod
)生成对应的HandlerAdapter
(RequestMappingHandlerAdapter
)
- 处理
last-modify
头部信息 - 调用
HandlerExcutionChain
中的拦截器类中的PreHandler()
方法 - 真正执行
Handler
方法(具体Controller
类中的某个方法) - 调用
HandlerExcutionChain
中的拦截器中的PostHandle()
方法
3.doDispatch()
方法调用processDispatchResult()
完成最终结果处理
- 异常处理
- 调用
render()
方法,render()
方法中先解析出View
,然后View
通过model
再次渲染 - 通过
HandlerExecutionChain
获取拦截器,并执行拦截器的afterCompletion()