处理

DispatcherServlet 处理请求的过程如下:

  • 搜索WebApplicationContext,并将其绑定到请求中作为属性,以便控制器和流程中的其他元素可以使用它。它默认情况下绑定在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键下。

  • 区域设置解析器绑定到请求,以便流程中的元素在处理请求时(渲染视图、准备数据等)解析要使用的区域设置。如果您不需要区域设置解析,则不需要区域设置解析器。

  • 主题解析器绑定到请求,以便视图等元素确定要使用的主题。如果您不使用主题,可以忽略它。

  • 如果您指定了多部分文件解析器,则会检查请求中的多部分内容。如果找到多部分内容,则请求将被包装在MultipartHttpServletRequest中,以便流程中的其他元素进一步处理。有关多部分处理的更多信息,请参见多部分解析器

  • 搜索合适的处理器。如果找到处理器,则运行与处理器关联的执行链(预处理器、后处理器和控制器)以准备渲染模型。或者,对于带注解的控制器,可以渲染响应(在HandlerAdapter中),而不是返回视图。

  • 如果返回模型,则渲染视图。如果没有返回模型(可能是由于预处理器或后处理器拦截了请求,可能是出于安全原因),则不渲染视图,因为请求可能已经完成。

WebApplicationContext中声明的HandlerExceptionResolver Bean 用于解析请求处理期间抛出的异常。这些异常解析器允许自定义处理异常的逻辑。有关更多详细信息,请参见异常

对于 HTTP 缓存支持,处理器可以使用WebRequestcheckNotModified方法,以及控制器的 HTTP 缓存中描述的带注解控制器的其他选项。

您可以通过向web.xml文件中 Servlet 声明添加 Servlet 初始化参数(init-param 元素)来自定义单个DispatcherServlet实例。下表列出了支持的参数

表 1. DispatcherServlet 初始化参数
参数 说明

contextClass

实现ConfigurableWebApplicationContext的类,由此 Servlet 实例化和本地配置。默认情况下,使用XmlWebApplicationContext

contextConfigLocation

传递给上下文实例(由contextClass指定)的字符串,指示可以在哪里找到上下文。该字符串可能由多个字符串组成(使用逗号作为分隔符)以支持多个上下文。对于具有重复定义 bean 的多个上下文位置,最新的位置优先。

namespace

WebApplicationContext的命名空间。默认为[servlet-name]-servlet

throwExceptionIfNoHandlerFound

如果未为请求找到处理器,是否抛出NoHandlerFoundException异常。然后可以使用HandlerExceptionResolver(例如,通过使用@ExceptionHandler控制器方法)捕获该异常并像处理其他异常一样处理它。

从 6.1 开始,此属性设置为true并已弃用。

请注意,如果还配置了默认 Servlet 处理,则未解析的请求始终转发到默认 Servlet,并且永远不会引发 404 错误。