处理过程

DispatcherServlet 按如下方式处理请求

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

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

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

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

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

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

WebApplicationContext 中声明的 HandlerExceptionResolver bean 用于解析请求处理期间抛出的异常。这些异常解析器允许定制处理异常的逻辑。更多详情请参阅 异常

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

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

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

contextClass

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

contextConfigLocation

传递给 context 实例(由 contextClass 指定)的字符串,用于指示可以在何处找到 contexts。该字符串可能由多个字符串组成(使用逗号作为分隔符),以支持多个 contexts。如果多个 context 位置中定义了两次 bean,则以最新位置为准。

namespace

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

throwExceptionIfNoHandlerFound

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

从 6.1 版本起,该属性设置为 true 并已弃用。

请注意,如果同时配置了 默认 servlet 处理,未解析的请求将始终转发到默认 servlet,并且永远不会抛出 404。