1 DispatcherServlet
1.5 处理过程
DispatcherServlet 处理请求的方式如下所诉:
- 在请求中搜索WebApplicationContext并将其绑定为控制器和流程中的其他元素可以使用的属性。默认情况下,它被绑定到DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE键值下。
- 本地化解析器绑定到请求,以便让流程中的元素解析处理请求时使用的本地化环境(渲染视图,准备数据,等等)。如果不需要区域设置解析,则不需要区域设置解析器。
- 主题解析器被绑定到请求以便让诸如视图这样的元素决定使用什么主题。如果不使用主题,可以忽略它。
- 如果指定了多部分文件解析器,将检查请求是否包含多部分。如果找到了多部分,则将请求包装在MultipartHttpServletRequest中,以便进程中的其他元素进行进一步处理。
- 寻找合适的处理程序。如果找到处理程序,则执行与处理程序(前处理器、后处理器和控制器)关联的执行链,以便准备模型或呈现视图。另外,对于带注释的控制器,可以(在HandlerAdapter中)呈现响应,而不是返回视图。
- 如果返回模型,则呈现视图。如果没有返回模型(可能是由于预处理程序或后处理程序拦截了请求,也可能是出于安全原因),就不会呈现视图,因为请求可能已经被满足了。
在WebApplicationContext中声明的HandlerExceptionResolver bean用于解决请求处理期间抛出的异常。这些异常解决程序允许定制处理异常的逻辑。
Spring DispatcherServlet还支持返回Servlet API指定的last-modification-date。
确定特定请求的最后修改日期的过程非常简单:DispatcherServlet查找适当的处理程序映射,并测试找到的处理程序是否实现LastModified接口。如果是,则将LastModified接口的long getLastModified(request)方法的值返回给客户端。
可以通过向web.xml文件中的Servlet声明添加Servlet初始化参数(init-param元素)来定制各个DispatcherServlet实例。下表列出了支持的参数:
参数 | 解释 |
---|---|
contextClass | 实现ConfigurableWebApplicationContext的类,由这个Servlet实例化并在本地配置。默认情况下,使用XmlWebApplicationContext。 |
contextConfigLocation | 传递给上下文实例(由contextClass指定)的字符串,以指示在何处可以找到上下文。字符串可能由多个字符串(使用逗号作为分隔符)组成,以支持多个上下文。对于定义了两次的多个上下文位置的bean,最新位置优先 |
namespace | WebApplicationContext的命名空间。默认为[servlet-name]-servlet。 |
throwExceptionIfNoHandlerFound | 当没有为请求找到处理程序时,抛出NoHandlerFoundException。然后可以使用HandlerExceptionResolver(例如,通过使用@ExceptionHandler控制器方法)捕获异常,并像处理其他任何异常一样处理它。默认情况下设置为false,在这种情况下,DispatcherServlet将响应状态设置为404 (NOT_FOUND),而不会引发异常。注意,如果还配置了默认的servlet处理,未解析的请求总是会被转发到默认的servlet,并且不会返回404。 |