SpringMVC-DispatcherServlet¶
DispatcherServlet 介绍¶
DispatcherServlet 本质上是一个 HttpServlet,为请求处理提供了一个共享算法,而实际工作则由可配置的委托组件执行。其核心组件包括:

请求映射(
HandlerMapping): 根据请求获取其对应的执行链HandlerExecutionChainhandler适配器(
HandlerAdapter): 执行 handler,得到ModelAndView异常处理器(
HandlerExceptionResolver): 处理异常,得到异常的ModelAndView视图解析器(
ViewResolver):根据试图名,获取视图View
请求处理¶

如上图所示,请求抵达 DispatcherServlet 后,将进行如下处理:
绑定
WebApplicationContext绑定
Local解析器LocaleResolver,以便解析客户端使用的 Locale,可能还有他们的时区,以便能够提供国际化的视图。绑定主题解析器
ThemeResolver,以便让视图决定使用哪个主题。绑定
FlashMap管理器FlashMapManager,管理FlashMap,可用于将属性从一个请求传递到另一个请求(如重定向时)multipart检查,如果存在MultipartResolver,且请求是multipart,就将请求包裹在一个MultipartHttpServletRequest中。在根据请求,在
handlerMappings中搜索处理程序处理执行链HandlerExecutionChain(包括一个处理程序handler和多个HandlerInterceptor)。HandlerMapping的一个重要实现是RequestMappingHandlerMapping(支持 @RequestMapping 注解的方法)调用
HandlerInterceptor的preHandle方法。HandlerAdapter调用handler,得到ModelAndView,例如,调用一个有注解的controller需要解析注解的问题,HandlerAdapter的主要目的是将 DispatcherServlet 从这些细节中屏蔽掉。调用
HandlerInterceptor的postHandle方法。使用
viewResolvers将逻辑视图名称解析为实际的View(遍历视图解析器集合,只要遇到一个ViewResolver返回的视图不为空,就返回当前视图),并将其渲染到响应。使用
View的渲染方法render(),将视图渲染为返回结果,传入的model本质上是一个Map<String, ?>,可以用作模板渲染。调用
HandlerInterceptor的afterCompletion方法。遇到异常时,就调用
HandlerExceptionResolver的resolveException处理异常。