笔记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,事实上,我们在培训中就用这个举例,很多零基础的程序员能 ...
随机推荐
- HttpClient 之Fluent API 简单使用
相比于HttpClient 之前的版本,HttpClient 4.2 提供了一组基于流接口(fluent interface)概念的更易使用的API,即Fluent API. 为了方便使用,Fluen ...
- 五分钟学GIS | 快速生成地图瓦片秘籍
什么是地图瓦片? 地图瓦片是包含了一系列比例尺.一定地图范围内的地图切片文件.地图瓦片按照金字塔结构组织,每张瓦片都可通过级别.行列号唯一标记.在平移.缩放地图时,浏览器根据金字塔规则,计算出所需的瓦 ...
- KiCAD输出生产文件
KiCAD输出生产文件 本文包括PCB生产制造的所有文件的输出方法,包括:BOM.坐标.锡膏层.GERBER.钻孔.丝印和装配图 一.KiCAD导出BOM KiCAD导出BOM有以下几种办法: 注意: ...
- 【CSS】input 框的一些事情
1.input框光标太长与不居中的问题 如果input框height:40px 为了字体垂直居中line-height也设为40px 问题来了,这样光标在刚刚focus时候是占据整个input框并且输 ...
- 使用springBoot和mybatis整合时出现如下错误:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)解决方案
在pom.xml文件中添加如下: <build> <resources> <resource> & ...
- php时间时间戳
/* *+ ------------------------------- * 计算当天起始点和结束点时间戳 取出当天的数据 *+ ------------------------------ */ ...
- springboot 在配置文件写参数注入到类中
@Configuration//配置文件位置@PropertySource("classpath:city.properties")//前缀@ConfigurationProper ...
- springboot使用自带连接池连接postgre
Application配置spring.datasource.url=jdbc:postgresql://***:5432/postgresspring.datasource.username=pos ...
- CSS:CSS 图像透明/不透明
ylbtech-CSS:CSS 图像透明/不透明 1.返回顶部 1. CSS 图像透明/不透明 使用CSS很容易创建透明的图像. 注意:CSS Opacity属性是W3C的CSS3建议的一部分. 更多 ...
- python Map()和reduce()函数
Map()和reduce()函数 map() 会根据提供的函数对指定序列做映射. 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函 ...