22.2.3 DispatcherServlet的处理顺序

在设立了一个DispatcherServlet并且收到一个对该特定DispatcherServlet的请求之后,这个DispatcherServlet将按如下顺序开始处理该请求:

  • 搜索WebApplicationContext,并将其绑定为请求中的一个属性,以使控制器和进程中的其他元素能够使用它。默认情况下,绑定在DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键下。
  • 区域解析器被绑定到请求中,以使进程中的元素在处理请求(渲染视图、准备数据等等)时能解析要使用的区域。如果不需要区域解析则不需要该解析器。
  • 主题解析器被绑定到请求中,以使诸如视图之类的元素确定使用哪个主题。如果不使用主题则可以忽略它。
  • 如果指定了一个multipart文件解析器,则在该请求中检查multipart;如果找到了,则将请求包装在MultipartHttpServletRequest中,以便进程中的其他元素后续处理。有关multipart处理的更多信息,请参见22.10节“Spring的multipart(文件上传)支持”
  • 搜索合适的处理程序。如果找到了,则执行与处理程序(预处理程序、后处理程序和控制器)关联的执行链,以便准备model或渲染。
  • 如果返回了model,则渲染视图。如果没有返回model(可能由于预处理程序或后处理程序出于安全原因拦截了该请求),不会渲染任何视图,因为该请求可能已经被完成了。

WebApplicationContext中声明的程序异常解析器收集处理请求过程中抛出的异常。使用这些异常解析器允许您定义自定义的行为来处理异常。

Spring的DispatcherServlet还支持返回由Servlet API指定的最后修改日期。确定特定请求的最后修改日期的过程很简单:DispatcherServlet查找一个适当的处理程序映射,并检验发现的处理程序是否实现了LastModified接口,如果实现了,LastModified接口的long getLastModified(request)方法的值将返回给客户端。

可以通过将Servlet初始化参数(init-param元素)添加到web.xml文件的Servlet声明中来自定义单独的DispatcherServlet实例。支持的参数列表请参见下表。

Table 22.2. DispatcherServlet initialization parameters

参数 说明
contextClass 实现了WebApplicationContext的类,它实例化了该Servlet所使用的上下文。默认情况下使用XmlWebApplicationContext
contextConfigLocation 传递给上下文实例(由contextClass指定)的字符串,以指示什么位置可以找到上下文。该字符串可能包含多个字符串(使用逗号分隔)来支持多个上下文。在多个上下文的情况下,如果一个bean被定义了两次,那么以最后的上下文为准。
namespace WebApplicationContext的命名空间。默认为[servlet-name]-servlet

书籍推荐