处理
DispatcherServlet 按以下方式处理请求:
-
WebApplicationContext会在请求中被查找并绑定,作为控制器及流程中其他组件可以使用的属性。默认情况下,它会被绑定在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键下。 -
本地化解析器(locale resolver)会被绑定到请求上,以便流程中的组件在处理请求时能够确定使用哪种本地化设置(如渲染视图、准备数据等)。如果你不需要本地化解析功能,那么就不需要这个解析器。
-
如果你指定了一个多部分数据解析器(multipart file resolver),请求会会被检查是否包含多部分数据。如果发现有多部分数据,该请求会被封装到一个
MultipartHttpServletRequest对象中,以便流程中的其他组件进一步处理。有关多部分数据处理的更多信息,请参见 Multipart Resolver。 -
会查找合适的处理器。如果找到了处理器,与之关联的执行链(预处理器、后处理器和控制器)将会被执行,以准备用于渲染的模型数据。或者,对于带有注解的控制器,可以直接在
HandlerAdapter内部生成响应内容,而无需返回视图。 -
如果返回了模型数据,那么就会渲染视图。如果没有返回模型数据(可能是由于预处理器或后处理器截取了请求,或者出于安全考虑),则不会渲染视图,因为请求可能已经得到了处理。
在WebApplicationContext中声明的HandlerExceptionResolver bean用于解决在请求处理过程中抛出的异常。这些异常解析器允许自定义逻辑来处理异常。有关更多详细信息,请参阅Exceptions。
为了支持HTTP缓存,处理器可以使用WebRequest的checkNotModified方法,同时对于带有注释的控制器,还可以使用其他选项,具体说明请参见控制器的HTTP缓存。
您可以通过在web.xml文件中的Servlet声明中添加Servlet初始化参数(init-param元素)来自定义各个DispatcherServlet实例。下表列出了支持的参数:
表1. DispatcherServlet初始化参数
| 参数 | 说明 |
|---|---|
contextClass | 实现 ConfigurableWebApplicationContext 的类,由此 Servlet 实例化并进行本地配置。默认使用 XmlWebApplicationContext。 |
contextConfigLocation | 传递给上下文实例(由 contextClass 指定)的字符串,用于指示上下文的所在位置。该字符串可能包含多个由逗号分隔的子字符串,以支持多个上下文。如果存在多个上下文位置且某些 Bean 被定义了多次,则以最后一个位置的配置为准。如果在多个上下文位置中都存在同一个 Bean 的定义,那么将使用最近一次定义的配置。 |
namespace | WebApplicationContext 的命名空间。默认值为 [servlet-name]-servlet。 |
throwExceptionIfNoHandlerFound | 当请求找不到处理程序时是否抛出 NoHandlerFoundException 异常。该异常可以通过 HandlerExceptionResolver(例如,使用 @ExceptionHandler 控制器方法)进行捕获,并像处理其他异常一样进行处理。从 Spring MVC 6.1 版本开始,此属性被设置为 true,但现已弃用。请注意,如果还配置了 默认 Servlet 处理,那么未处理的请求将始终被转发给默认 Servlet,且不会抛出 404 错误。 |