笔记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,如下所示:
@Override
protected void customizeRegistration(Dynamic registration) {
// TODO Auto-generated method stub
super.customizeRegistration(registration);
registration.setMultipartConfig(new MultipartConfigElement("/tmp/spittr/uploads"));
}
设置了对multipart的支持,将上传文件的临时存储 目录设置在“/tmp/spittr/uploads”中。
二、添加其他的Servlet和Filter
按 照AbstractAnnotationConfigDispatcherServletInitializer 的定义,它会创建DispatcherServlet和 ContextLoaderListener。但是,如果你想注册其他的Servlet、 Filter或Listener的话,就需要创建一个新的初始化器就可以了。基于Java的初始化器(initializer)的一个好处就在于可以定义任 意数量的初始化器类。最简单的方式就是实现 Spring的WebApplicationInitializer接口。
如下的程序清单展现了如何创建 WebApplicationInitializer实现并注册一个Servlet。
package myspittr.config; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration.Dynamic; import org.springframework.web.WebApplicationInitializer; public class MyServletInitializer implements WebApplicationInitializer { @Override
public void onStartup(ServletContext arg0) throws ServletException {
// TODO Auto-generated method stub
// 注册Servlet
Dynamic myServlet = arg0.addServlet("myServlet", MyServlet.class);
// 映射Servlet
myServlet.addMapping("/custom/**"); } }
三、在web.xml中声明DispatcherServlet
在典型的Spring MVC应用中,需要DispatcherServlet和 Context-Loader Listener。AbstractAnnotationConfigDispatcherServletInitializer 会自动注册它们,但是如果需要在web.xml中注册的话,就需要手动配置了。
以传统方式搭建DispatcherServlet和ContextLoaderListener。
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- 设置根据上下文配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- 注册ContextLoaderListener -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 注册DispatcherServlet -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup></load-on-startup>
</servlet>
<!-- 将DispatcherServlet映射到“/” -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping> </web-app>
ContextLoaderListener和 DispatcherServlet各自都会加载一个Spring应用上下文。上下文 参数contextConfigLocation指定了一个XML文件的地址,这个 文件定义了根应用上下文,它会被ContextLoaderListener加 载,并且会从“/WEB-INF/spring/root-context.xml”中加载bean定义。
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- Root Context: defines shared resources visible to all other web components --> </beans>
DispatcherServlet会根据Servlet的名字找到一个文件,并基于该 文件加载应用上下文。在上边的代码中,Servlet的名字 是appServlet,因此DispatcherServlet会从“/WEBINF/appServlet-context.xml”文件中加载其应用上下文。
如果指定DispatcherServlet配置文件的位置的话,那么 可以在Servlet上指定一个contextConfigLocation初始化参数。 例如,如下的配置中,DispatcherServlet会从“/WEBINF/spring/appServlet/servlet-context.xml”加载它的bean:
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring/appServlet/servlet-context.xml
</param-value>
</init-param>
<load-on-startup></load-on-startup>
</servlet>
四、设置web.xml使用基于Java的配置


笔记33 Spring MVC的高级技术——Spring MVC配置的替代方案的更多相关文章
- 第07章-Spring MVC 的高级技术
Spring MVC 的高级技术 1. Spring MVC配置的替代方案 1.1 自定义DispatcherServlet配置 AbstractAnnotationConfigDispatcherS ...
- Spring学习(七)--Spring MVC的高级技术
一.Spring MVC配置的替代方案 我们已经了解如何通过AbstractAnnotationConfigDispatcherServlet- Initializer快速搭建了Spring MVC环 ...
- 笔记34 Spring MVC的高级技术——处理multipart形式的数据
一.需求介绍: Spittr应用在两个地方需要文件上传.当新用户注册应用的时候,我 们希望他们能够上传一张图片,从而与他们的个人信息相关联.当用 户提交新的Spittle时,除了文本消息以外,他们可能 ...
- 【Spring】Spring MVC高级技术
前言 前面学习了简单的Spring Web知识,接着学习更高阶的Web技术. 高级技术 Spring MVC配置的替换方案 自定义DispatcherServlet配置 在第五章我们曾编写过如下代码. ...
- Spring MVC & Boot & Cloud 技术教程汇总(长期更新)
昨天我们发布了Java成神之路上的知识汇总,今天继续. Java成神之路技术整理(长期更新) 以下是Java技术栈微信公众号发布的关于 Spring/ Spring MVC/ Spring Boot/ ...
- Java 横向技术 Spring框架【笔记】
Java横向技术 spring框架[笔记] Spring 的两大特性是什么? AOP(Aspect Oriented Programming,面向切面编程)与 IOC(Inverse of Contr ...
- Spring学习之旅(九)--SpringMVC高级技术
文件上传 在 Web 应用中,允许用户上传文件是很常见的需求.文件上传通常是采用 multipart 格式,而 DispatcherServlet 并没有任何解析 multipart 请求数据的功能, ...
- Spring 事务管理高级应用难点剖析--转
第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...
- 从一个简单案例上手Spring MVC,同时分析Spring MVC面试问题
很多公司都会用Spring MVC,而且初级程序员在面试时,一定会被问到这方面的问题,所以这里我们来通过一个简单的案例来分析Spring MVC,事实上,我们在培训中就用这个举例,很多零基础的程序员能 ...
随机推荐
- JSON 和 xml 浅读
1. JSON数据格式 JSON 语法是 JavaScript 对象表示法语法的子集. 数据在名称/值对中:名称是字符串,使用双引号表示.值可以是:数字(整数或浮点数),字符串(在双引号中),数组(在 ...
- nginx匹配以XXX结尾的
匹配以do结尾的所有文件:如http://192.168.126.168:8080/delivery/transportPlanData.do?startRelease=2019-07-06& ...
- PHP通过KMP算法实现strpos
起因 昨天看了阮一峰老师的一篇博客<字符串匹配的KMP算法>,讲的非常棒.这篇文章也是解决了: 有一个字符串"BBC ABCDAB ABCDABCDABDE",里面是否 ...
- svndumpfilter - 过滤一个 Subversion 仓库的转储文件 `dumpfile'。
SYNOPSIS 总览 svndumpfilter command [options & args] OVERVIEW 概述 Subversion 是一个版本控制系统,允许保存旧版本的文件和目 ...
- KeepLived + nginx 高可用
. 环境准备 1. VMware; 2. 4台CentOs7虚拟主机:192.168.122.217, 192.168.122.165 3. 系统服务:LVS, Keepalived 4. Web服务 ...
- Database - 数据库隔离级别
总结 数据库在并发的情况下,可能会出现: 脏读 不可重复读 --> 原因:UPDATE操作 幻读 --> 原因:INSERT/DELETE操作 为了避免以上问题,数据库事务增加隔离级别,来 ...
- Java刷题笔记
能用StringBuffer的时候坚决不要用String,因为前者的时间和空间效率都更高. 牛顿法求平方根:随便找一个K,然后不断让 k=(k+x/k)/2;直到K的平方与x之间的差距小于限定值. 斐 ...
- SQl 分组后按照某一列拼接字符串
/* 分组之后拼接字符串 */ ;with t as( SELECT WorkflowId,Remark FROM dbo.OperatorAutomationProcess GROUP BY Wor ...
- 云原生数据库崛起,阿里云POLARDB当选世界互联网领先科技成果!
第六届世界互联网大会来了!千年水乡古镇乌镇又一次吸引了全世界的目光. 刚刚,阿里云自研数据库POLARDB在会上当选世界互联网领先科技成果.POLARDB解决了企业在云时代的数据库难题,帮助企业在数小 ...
- CSS3布局篇(多列布局)
我们通过学习 CSS3,能够创建多个列来对文本进行布局 ,就像报纸那样排版那样! 可以参考详细说明:http://www.w3school.com.cn/css3/css3_multiple_colu ...