在WebApplicationContext中一些特别的bean类型
Spring中的DispatcherServlet使用一些特殊的bean来处理request请求和渲染合适的视图。这些bean就是Spring MVC中的一部分。你能够通过在WebApplicationContext中的一个或多个配置来使用这些特殊的bean。但是,你不需要在Spring MVC在维护这些默认要使用的bean时,去把那些没有配置过的bean都去初始化一道。在下一部分中,首先让我们看看在DispatcherServlet依赖的那些特殊bean类型:
表21.1在WebApplicationContext中的特殊bean类型
bean类型 | 解释(注:此处的处理器若无特别说明,均指handler) |
HandlerMapping 处理器映射 | 基于在HandlerMapping具体实现中的各种标准,把进入的request请求映射到处理器和一系列前processor处理器和后processor处理器(处理器的interceptor(拦截器)) 最常用的就是基于注解的controller的具体实现,同时,其它方式的实现也是同样存在的。 |
HandlerAdapter 处理器适配器 | 辅助DispatcherServlet去直接调用request请求映射到的处理器,并忽略真正调用到的处理器。例如:调用一个有很多注解的controller控制器,就需要去解析大量注解,而处理器适配器能够避免DispatcherServlet去处理这些解析细节。 |
HandlerExceptionResolver 处理器异常解析器 | 可以映射异常到视图中,同时,也支持复杂的异常处理代码 |
ViewResolver 视图解析器 | 可以把基于字符串的视图名解析到对应的view类型 |
LocaleResolver & LocaleContextResolver 地区解析器和地区Context解析器 | 解析客户端中使用的地区和时区,用来提供不同的国际化的view视图。 |
ThemeResolver 主题解析器 | 解析web应用中能够使用的主题,比如提供个性化的网页布局。 |
MultipartResolver 多部件解析器 | 处理multi-part(多部件)request请求,例如:在HTML表 格中处理文件上传。 |
FlashMapManager FlashMap管理器 | 储存并检索在"input"和"output"的FlashMap中可以在request请求间(通常是通过重定向)传递属性的FlashMap |
默认的DispatcherServlet配置
依上所述,每一个在DispatcherServlet中的特别的bean都会默认地在其中被维持。这些信息都在org.springframework.web.servlet包中的DispatcherServlet.properties中。
所有这些特别的bean都有它们自己一个比较合理的默认值。当然,你去自己改变这些bean的默认值也是迟早的事。例如:在InternalResourceViewResolver中配置prefix路径到你的视图文件的上级目录是十分普遍的事。
在"21.16配置Spring MVC"中,你能学到关于配置Spring MVC的知识,包括MVC Java配置和MVC XML命名空间这两种方式,这些方式能够让你找到入手点,并且展示一些关于Spring MVC如何运行的知识。不管你如何选择在你应用中的配置方式,在这一部分中的这些概念都能帮助你了解Spring MVC的基本原理。
DispatcherServlet的处理顺序
在你配置好一个DispatcherServlet之后,一个request请求传入到了特定的DispatcherServlet,DispatcherServlet就开始处理这个request,处理过程如下所示:
- 搜索对应的WebApplicationContext,并且作为一个属性被绑定到这个request请求上,这样,controller控制器和在这个处理过程中的一些其他元素就能够使用这些被绑定的属性。默认绑定到Key为DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE之上。
- 地区解析器被绑定到request请求上,在此绑定过程上的一些元素会被激活,用来在request请求的处理过程中去使用(渲染视图,准备数据等等)。如果你不需要地区解析,那就不需使用地区解析器。
- 主题解析器被绑定到request请求,用来决定在视图中使用何种主题,如果你不需要主题,就不必使用主题解析器。
- 如果你定制了一个multipart(多部件)文件解析器,request请求会被检查是否是multipart(多部件的),如果request被检测到是多部件的,这个request请求将被其他元素封装成一个MultipartHttpServletRequest去做更多的处理,如果需要了解关于多部件处理的信息,请参阅"21.10 Spring的多部件(文件上传)支持"。
- 搜索合适的处理器,如果这个处理器被找到,则与这个处理器关联的一串执行链(前processor处理器,后processor处理器和控制器)将被执行,用来准备model模型或者准备渲染。
- 如果一个model模型被上述过程返回,则视图会被渲染,如果没有model模型返回(可能是因为前processor处理器或者后processor处理器拦截了这个请求,有可能是由于安全原因等),则没有视图被渲染,因为这个request有可能已经被回馈了。
在WebApplicationContext中定义的处理器异常解析器,能够抓取到在请求过程中抛出的异常,使用异常解析器,你能够自定义不同异常的不同行为。
Spring的DispatcherServlet同样支持返回一个已经在Servlet API中定义好的last-modification-date(最后修改日期)。为特定request请求定义一个最后修改日期,这样的处理,目的是十分直接的——DispatcherServlet寻找一个合适的处理器映射,并且检测这个被找到的处理器是否实现了LastModified接口,如果实现了,LastModified接口下面的getLastModified(request)方法的long型值将会被返回给客户端。
你能够通过在web.xml中的Servlet声明中添加Servlet初始化参数(init-param元素)来自定义任意个独立的DispatcherServlet实体。
表21.2DispatcherServlet初始化参数
parameter参数 | 解释 |
contextClass context类 | 实现了WebApplicationContext的类,能够实例化被这个Servlet所使用的context,在默认情况下,XmlWebApplicationContext会被使用。 |
contextConfigLocation context配置路径 | 将会把这个参数下声明的字符串,传递到已在ContextClass中定义过的对应的context实体中,来表示哪些context能被其找到。这个字符串里面可能由多个以逗号分隔的字符串组成,以支持多个context,如果有些bean在多个路径下被定义了多次,最新的路径下的bean将被优先找到。 |
Namespace 命名空间 | 在WebApplicationCOntext中的命名空间,默认是[servlet名]-servlet这种格式。 |