Processing

    DispatcherServlet 处理请求的方式如下:

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

    • locale 解析器被绑定到请求上,以便让进程中的元素在处理请求时(渲染视图、准备数据等)解析要使用的 locale。如果你不需要 locale 解析,你就不需要 locale 解析器。

    • 主题解析器被绑定到请求上,以让元素(如视图)决定使用哪个主题。如果你不使用主题,你可以忽略它。

    • 如果你指定了一个多部件文件解析器,请求会被检查为多部件文件。如果发现了多部件,请求会被包裹在 MultipartHttpServletRequest 中,以便由流程中的其他元素进一步处理。关于多部件处理的进一步信息,请参见 Multipart Resolver

    • 一个适当的处理程序被搜索到。如果找到一个处理程序,与该处理程序相关的执行链(预处理程序、后处理程序和控制器)被运行以准备渲染的模型。另外,对于有注解的控制器,响应可以被渲染(在 HandlerAdapter 中),而不是返回一个视图。

    • 如果返回了一个模型,视图就会被渲染。如果没有返回模型(可能是由于预处理程序或后处理程序拦截了请求,也许是出于安全原因),就不会渲染视图,因为请求可能已经被满足了。

    在 WebApplicationContext 中声明的 HandlerExceptionResolver Bean 被用来解决请求处理过程中抛出的异常。这些异常解析器允许自定义处理异常的逻辑。更多细节请参见 异常

    对于 HTTP 缓存支持,处理程序可以使用 WebRequest 的 checkNotModified 方法,以及在 HTTP Caching for Controllers 中描述的注解控制器的进一步选项。

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

    Parameter Explanation
    contextClass 实现 ConfigurableWebApplicationContext 的类,将由该 Servlet 实例化和本地配置。默认情况下,使用 XmlWebApplicationContext。
    contextConfigLocation 传递给上下文实例(由 contextClass 指定)的字符串,表示可以在哪里找到上下文。该字符串可能由多个字符串组成(使用逗号作为分隔符)以支持多个上下文。如果多个上下文位置的 bean 被定义了两次,那么最新的位置优先。
    namespace WebApplicationContext 的命名空间。默认为[servlet-name]-servlet。
    throwExceptionIfNoHandlerFound 当一个请求没有找到处理程序时,是否会抛出 NoHandlerFoundException。然后,该异常可以被 HandlerExceptionResolver 捕获(例如,通过使用 @ExceptionHandler控制器方法),并像其他的一样处理。

    默认情况下,这被设置为 false,在这种情况下,DispatcherServlet 将响应状态设置为 404(NOT_FOUND)而不引发异常。

    注意,如果 默认的 servlet 处理 也被配置了,未解决的请求总是被转发到默认的 servlet,并且永远不会引发 404。