Processing

  • 加载必要的上下文元素,包括 WebApplicationContext 和解析器(语言环境、主题、多部分文件)。

  • 搜索并执行适当的处理器,并准备一个模型进行渲染。

  • 处理异常,使用 HandlerExceptionResolver 进行自定义解析。

  • 提供 HTTP 缓存支持,允许处理器控制缓存行为。

  • 通过 Servlet 初始化参数来自定义 DispatcherServlet 实例,包括上下文配置、命名空间和异常处理行为。

DispatcherServlet 处理请求的步骤如下:

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

  • 区域信息解析器将绑定至请求,以允许流程中的元素解决在处理请求(渲染视图、准备数据,等等)时所使用的区域信息。如果您不需要解析区域信息,那么您同样不需要区域信息解析器。

  • 主题解析器将绑定至请求,以允许视图等元素确定要使用哪个主题。如果您没有使用主题,您可以忽略它。

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

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

  • 如果返回一个模型,则会渲染该视图。如果未返回一个模型(可能是因为拦截请求的预处理器或后处理器,出于安全原因),则不会渲染任何视图,因为该请求可能已经得到满足。

在`WebApplicationContext`中声明的`HandlerExceptionResolver`Bean 用于解析请求处理期间引发的异常。那些异常解析器允许自定义处理异常的逻辑。有关更多详细信息,请参阅Exceptions

为了支持 HTTP 缓存,处理器可以使用 WebRequestcheckNotModified 方法,以及 HTTP Caching for Controllers 中所述的带注释控制器的其他选项。

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

Table 1. DispatcherServlet initialization parameters
Parameter Explanation

contextClass

实现了 ConfigurableWebApplicationContext 的类,可以被 Servlet 实例化并本地配置。默认情况下,使用 XmlWebApplicationContext

contextConfigLocation

传递给上下文实例的字符串(由 contextClass 指定)以指示可以在何处找到上下文。该字符串可能由多个字符串组成(使用逗号作为分隔符)以支持多个上下文。在定义了两次的 bean 的多个上下文位置的情况下,最新位置优先。

namespace

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

throwExceptionIfNoHandlerFound

如果没有找到某个请求的处理程序时,是否抛出 NoHandlerFoundException。然后,可以使用 HandlerExceptionResolver 捕获此异常(例如,通过使用 @ExceptionHandler 控制器方法),并将其作为其他异常进行处理。此属性自 6.1 起已设置为 true,并且已弃用。请注意,如果还配置了 默认 servlet 处理,则始终将未解析的请求转发到默认 servlet,并且绝不会引发 404。