zoukankan      html  css  js  c++  java
  • 笔记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的配置

     

     

     

     

     

     

  • 相关阅读:
    C++:变量声明和定义的关系
    Docker 方式搭建 zookeeper + kafka 集群
    Centos7.6系统下docker的安装
    CentOS7服务器下安装配置SSL
    《深入浅出密码学》|ing
    车联网入侵检测技术(持续更新)
    Hive的安装及交互方式
    Centos7中安装MySQL5.7记录
    Zookeeper-分布式锁代码实现
    【Java】String字符串的最大长度
  • 原文地址:https://www.cnblogs.com/lyj-gyq/p/9005382.html
Copyright © 2011-2022 走看看