处理

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。