更多的了解DispatcherServlet

DipatcherServlet使用默认的Bean处理请求

Spring的DispatcherServlet使用了内置在WebApplicationContext中的特定的Bean来处理请求、渲染视图等,这些Bean是Spring MVC框架的一部分。

如果你想指定使用哪个特定的Bean,可以在WebApplicationContext中简单地配置它们。当然这只是可选的,Spring MVC维护了一个默认的Bean列表,如果没有进行特别的配置,框架将会使用默认的Bean。DispatcherServlet都依赖的这些Bean如下所示。

HandlerMapping处理器映射

HandlerMapping处理器映射。它会根据某些规则将进入容器的请求映射到具体的处理器以及一系列前处理器和后处理器(即处理器拦截器)上。

具体的规则视HandlerMapping类的实现不同而有所不同。其最常用的一个实现支持你在控制器上添加注解,配置请求路径。当然,也存在其他的实现。

(这里提到了前处理器和后处理器,即处理器拦截器,这部分知识我接触的比较少)

HandlerAdapter处理器适配器

HandlerAdapter处理器适配器。拿到请求所对应的处理器后,适配器将负责去调用该处理器,这使得DispatcherServlet无需关心具体的调用细节。

比方说,要调用的是一个基于注解配置的控制器,那么调用前还需要从许多注解中解析出一些相应的信息。因此,HandlerAdapter的主要任务就是对DispatcherServlet屏蔽这些具体的细节。

(能够理解其需要进行的工作,将请求体转换成Request DTO可能是在这个处理器中做的)

MultipartResolver解析器

MultipartResolver解析multi-part的传输请求,比如支持通过HTML表单进行的文件上传等。

其他的Bean

HandlerExceptionResolver处理器异常解析器它负责将捕获的异常映射到不同的视图上去,此外还支持更复杂的异常处理代码。

ViewResolver视图解析器。它负责将一个代表逻辑视图名的字符串(String)映射到实际的视图类型View上。

LocaleResolver & LocaleContextResolver地区解析器 和 地区上下文解析器。它们负责解析客户端所在的地区信息甚至时区信息,为国际化的视图定制提供了支持。

ThemeResolver主题解析器。它负责解析你web应用中可用的主题,比如,提供一些个性化定制的布局等。

FlashMapManagerFlashMap管理器。它能够存储并取回两次请求之间的FlashMap对象。后者可用于在请求之间传递数据,通常是在请求重定向的情境下使用。

DispatcherServlet.properties文件

这个Bean列表保存在包org.springframework.web.servlet下的DispatcherServlet.properties文件中。

2021-07-12-14-33-24

DispatcherServlet的处理流程

  1. 首先,搜索应用的上下文对象WebApplicationContext并把它作为一个属性(attribute)绑定到该请求上,以便控制器和其他组件能够使用它。属性的键名默认为DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE

  2. 将地区(locale)解析器绑定到请求上,以便其他组件在处理请求(渲染视图、准备数据等)时可以获取区域相关的信息。如果你的应用不需要解析区域相关的信息,忽略它即可

  3. 将主题(theme)解析器绑定到请求上,以便其他组件(比如视图等)能够了解要渲染哪个主题文件。同样,如果你不需要使用主题相关的特性,忽略它即可

  4. 如果你配置了multipart文件处理器,那么框架将查找该文件是不是multipart(分为多个部分连续上传)的。若是,则将该请求包装成一个MultipartHttpServletRequest对象,以便处理链中的其他组件对它做进一步的处理。

  5. 为该请求查找一个合适的处理器。如果可以找到对应的处理器,则与该处理器关联的整条执行链(前处理器、后处理器、控制器等)都会被执行,以完成相应模型的准备或视图的渲染

  6. 如果处理器返回的是一个模型(model),那么框架将渲染相应的视图。若没有返回任何模型(可能是因为前后的处理器出于某些原因拦截了请求等,比如,安全问题),则框架不会渲染任何视图,此时认为对请求的处理可能已经由处理链完成了

如果在处理请求的过程中抛出了异常,那么上下文WebApplicationContext对象中所定义的异常处理器将会负责捕获这些异常。通过配置你自己的异常处理器,你可以定制自己处理异常的方式。

Spring的DispatcherServlet也允许处理器返回一个Servlet API规范中定义的最后修改时间戳(last-modification-date) 值。决定请求最后修改时间的方式很直接:DispatcherServlet会先查找合适的处理器映射来找到请求对应的处理器,然后检测它是否实现了LastModified接口。若是,则调用接口的long getLastModified(request)方法,并将该返回值返回给客户端。

SpringBoot中配置DispatcherServlet时的一些配置类

这是我看视频课程时看到的,记录一下,方便以后查看项目的源码。

DispatcherServletAutoConfiguration
HttpEncodingAutoConfiguration
MultipartAutoConfiguration
ServletWebServerFactoryAutoConfiguration
WebMvcAutoConfiguration

参考资料

  1. Spring MVC DispatcherServlet详解