一、自定义DispatcherServlet配置
AbstractAnnotationConfigDispatcherServletInitializer所完成 的事情其实比看上去要多。在SpittrWebAppInitializer中,原来所编写的三个方法仅仅是必须要重载的abstract方法。但实际上还 有更多的方法可以进行重载,从而实现额外的配置。 此类的方法之一就是customizeRegistration()。 在AbstractAnnotationConfigDispatcherServletInitializer 将DispatcherServlet注册到Servlet容器中之后,就会调 用customizeRegistration(),并将Servlet注册后得到的 Registration.Dynamic传递进来。通过重 载customizeRegistration()方法,我们可以对 DispatcherServlet进行额外的配置。
需求:在Spring MVC中处理multipart请求和文件上传
需要使用DispatcherServlet的 registration来启用multipart请求。可以重 载customizeRegistration()方法来设 置MultipartConfigElement,如下所示:
1 @Override 2 protected void customizeRegistration(Dynamic registration) { 3 // TODO Auto-generated method stub 4 super.customizeRegistration(registration); 5 registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads")); 6 }
设置了对multipart的支持,将上传文件的临时存储 目录设置在“/tmp/spittr/uploads”中。
二、添加其他的Servlet和Filter
按 照AbstractAnnotationConfigDispatcherServletInitializer 的定义,它会创建DispatcherServlet和 ContextLoaderListener。但是,如果你想注册其他的Servlet、 Filter或Listener的话,就需要创建一个新的初始化器就可以了。基于Java的初始化器(initializer)的一个好处就在于可以定义任 意数量的初始化器类。最简单的方式就是实现 Spring的WebApplicationInitializer接口。
如下的程序清单展现了如何创建 WebApplicationInitializer实现并注册一个Servlet。
1 package myspittr.config; 2 3 import javax.servlet.ServletContext; 4 import javax.servlet.ServletException; 5 import javax.servlet.ServletRegistration.Dynamic; 6 7 import org.springframework.web.WebApplicationInitializer; 8 9 public class MyServletInitializer implements WebApplicationInitializer { 10 11 @Override 12 public void onStartup(ServletContext arg0) throws ServletException { 13 // TODO Auto-generated method stub 14 // 注册Servlet 15 Dynamic myServlet = arg0.addServlet("myServlet", MyServlet.class); 16 // 映射Servlet 17 myServlet.addMapping("/custom/**"); 18 19 } 20 21 }
三、在web.xml中声明DispatcherServlet
在典型的Spring MVC应用中,需要DispatcherServlet和 Context-Loader Listener。AbstractAnnotationConfigDispatcherServletInitializer 会自动注册它们,但是如果需要在web.xml中注册的话,就需要手动配置了。
以传统方式搭建DispatcherServlet和ContextLoaderListener。
web.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 5 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 6 7 <!-- 设置根据上下文配置文件位置 --> 8 <context-param> 9 <param-name>contextConfigLocation</param-name> 10 <param-value>/WEB-INF/spring/root-context.xml</param-value> 11 </context-param> 12 <!-- 注册ContextLoaderListener --> 13 <listener> 14 <listener-class> 15 org.springframework.web.context.ContextLoaderListener 16 </listener-class> 17 </listener> 18 <!-- 注册DispatcherServlet --> 19 <servlet> 20 <servlet-name>appServlet</servlet-name> 21 <servlet-class> 22 org.springframework.web.servlet.DispatcherServlet 23 </servlet-class> 24 <load-on-startup>1</load-on-startup> 25 </servlet> 26 <!-- 将DispatcherServlet映射到“/” --> 27 <servlet-mapping> 28 <servlet-name>appServlet</servlet-name> 29 <url-pattern>/</url-pattern> 30 </servlet-mapping> 31 32 </web-app>
ContextLoaderListener和 DispatcherServlet各自都会加载一个Spring应用上下文。上下文 参数contextConfigLocation指定了一个XML文件的地址,这个 文件定义了根应用上下文,它会被ContextLoaderListener加 载,并且会从“/WEB-INF/spring/root-context.xml”中加载bean定义。
root-context.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> 5 6 <!-- Root Context: defines shared resources visible to all other web components --> 7 8 </beans>
DispatcherServlet会根据Servlet的名字找到一个文件,并基于该 文件加载应用上下文。在上边的代码中,Servlet的名字 是appServlet,因此DispatcherServlet会从“/WEBINF/appServlet-context.xml”文件中加载其应用上下文。
如果指定DispatcherServlet配置文件的位置的话,那么 可以在Servlet上指定一个contextConfigLocation初始化参数。 例如,如下的配置中,DispatcherServlet会从“/WEBINF/spring/appServlet/servlet-context.xml”加载它的bean:
1 <servlet> 2 <servlet-name>appServlet</servlet-name> 3 <servlet-class> 4 org.springframework.web.servlet.DispatcherServlet 5 </servlet-class> 6 <init-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value> 9 /WEB-INF/spring/appServlet/servlet-context.xml 10 </param-value> 11 </init-param> 12 <load-on-startup>1</load-on-startup> 13 </servlet>
四、设置web.xml使用基于Java的配置