笔记33 Spring MVC的高级技术——Spring MVC配置的替代方案

一、自定义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的配置

 

 

 

 

 

 

 

 

 

posted @ 2018-05-07 22:20  雨落忧伤-  阅读(322)  评论(0编辑  收藏  举报