SpringMVC-DispatcherServlet

DispatcherServlet 介绍

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

DispatcherServlet-class

  • 请求映射(HandlerMapping): 根据请求获取其对应的执行链 HandlerExecutionChain

  • handler适配器(HandlerAdapter): 执行 handler,得到ModelAndView

  • 异常处理器(HandlerExceptionResolver): 处理异常,得到异常的ModelAndView

  • 视图解析器(ViewResolver):根据试图名,获取视图View

请求处理

SpringMVC

如上图所示,请求抵达 DispatcherServlet 后,将进行如下处理:

  1. 绑定 WebApplicationContext

  2. 绑定 Local 解析器 LocaleResolver,以便解析客户端使用的 Locale,可能还有他们的时区,以便能够提供国际化的视图。

  3. 绑定主题解析器ThemeResolver,以便让视图决定使用哪个主题。

  4. 绑定FlashMap管理器FlashMapManager,管理FlashMap,可用于将属性从一个请求传递到另一个请求(如重定向时)

  5. multipart 检查,如果存在MultipartResolver,且请求是multipart,就将请求包裹在一个 MultipartHttpServletRequest 中。

  6. 在根据请求,在handlerMappings中搜索处理程序处理执行链HandlerExecutionChain(包括一个处理程序handler和多个HandlerInterceptor)。HandlerMapping 的一个重要实现是RequestMappingHandlerMapping(支持 @RequestMapping 注解的方法)

  7. 调用HandlerInterceptorpreHandle方法。

  8. HandlerAdapter 调用handler,得到ModelAndView,例如,调用一个有注解的 controller 需要解析注解的问题,HandlerAdapter 的主要目的是将 DispatcherServlet 从这些细节中屏蔽掉。

  9. 调用HandlerInterceptorpostHandle方法。

  10. 使用viewResolvers 将逻辑视图名称解析为实际的 View(遍历视图解析器集合,只要遇到一个ViewResolver返回的视图不为空,就返回当前视图),并将其渲染到响应。

  11. 使用 View的渲染方法render(),将视图渲染为返回结果,传入的model本质上是一个Map<String, ?>,可以用作模板渲染。

  12. 调用HandlerInterceptorafterCompletion方法。

  13. 遇到异常时,就调用HandlerExceptionResolverresolveException处理异常。