0 AbstractAnnotationConfigDispatcherServletInitializer剖析,在Servlet 3.0环境中,容器会在类路径中查找实现ServletContainerInitializer接口的类,如果能发现的话,就用他来配置SErvlet容器。

Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类会查找实现了WebApplicationInitializer接口的类,并将配置任务交给他们来完成。Spring 3.2引入了 便利的WebApplicationInitializer的实现类,就是AbstractAnnotationConfigDispatcherServletInitializer 。如果一个类继承了AbstractAnnotationConfigDispatcherServletInitializer 同时也就实现了WebApplicationInitializer 接口。当部署到Servlet 3.0容器中的时候,容器会自动发现他,并用来配置Servlet 上下文。

说明:支持Servlet3.0 服务器,如tomcat 7版本及以上

0.1 两个应用上下文,DispatcherServlet 和 ContextLoaderListener

DispatcherServlet 加载包含web组件的bean,如控制器、视图解析器以及处理器映射。

ContextLoaderListener 加载应用中其他的bean,通常是驱动应用后端的中间层和数据层组件。

DispatcherServlet 在启动的时候会加载重写的如下方法中的配置类中的bean。

protected Class<?>[] getServletConfigClasses() {
return new Class[];
}

0.2 自定义 DispatcherServlet  配置

AbstractAnnotationConfigDispatcherServletInitializer 将 DispatcherServlet 注册到Servlet 容器后,会调用 customizeRegistration(ServletRegistration.Dynamic registration) ,我们可以对该方法进行重载,从而实现额外的配置。

传进来的Dynamic 对象可以设置 setMultipartConfig() 对 muitipart 的支持,setInitParameter()设置初始化参数。

1 添加其他的Servlet和Filter,按照AbstractAnnotationConfigDispatcherServletInitializer的定义,它会创建DispatcherServlet和 ContextLoaderListener。如果你想注册其他的Servlet, Filter, Listener。只需创建一个新的初始化器即可。最简单的方式是实现 spring 的 WebApplicationInitializer 接口。

在方法中

1)注册Filter/Servlet/Listener

2)添加映射路径

public class MyServletInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
ServletRegistration.Dynamic myServlet = servletContext.addServlet("myServlet", MyServlet.class);
myServlet.addMapping("/custome/**"); } }

例如:添加 characterEncodingFilter 使用如下方法

public class CharacterEncodingFilterInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("CharacterEncodingFilter", CharacterEncodingFilter.class);
characterEncodingFilter.setInitParameter("encoding","utf-8");
characterEncodingFilter.addMappingForUrlPatterns(null, false,"/*"); }
}

2 如果将应用部署到支持Servlet 3.0的容器中,那么注册Filter/Servlet/Listener有更简单的方式。

比如要注册Filter,并且该Filter映射到DispatcherServlet,仅需要重载AbstractAnnotationConfigDispatcherServletInitializer的getServletFilters方法。该方法没有为filter配置映射路径,返回的所有Filter都会映射到DispatcherServlet

@Override
protected Filter[] getServletFilters() {
return new Filter[] {new MyFilter()};
}

spring in action 7.1 小结的更多相关文章

  1. spring in action 7.2 小结

    1 对于二进制文件上传功能的实现.在spring中使用multipart来处理,处理方式有两种. CommonsMultipartResolver:使用Jakarta Commons FileUplo ...

  2. spring in action 5.1 小结 spring mvc起步

    0 配置 DispatcherServlet 是 spring mvc的核心,常规配置方法可以查看之前博客.springMVC简单例子 在此使用servlet 3 规范和 spring3.1 功能增强 ...

  3. spring in action第一章小结1

    1 spring基本理念是简化java开发. 使用以下4个策略简化java开发 1) 基于POJO的轻量级和最小侵入性编程 2)通过使用DI和AOP实现松耦合 3)基于切面和惯例进行声明式编程 4)通 ...

  4. 1、Spring In Action 4th笔记(1)

    Spring In Action 4th笔记(1) 2016-12-28 1.Spring是一个框架,致力于减轻JEE的开发,它有4个特点: 1.1 基于POJO(Plain Ordinary Jav ...

  5. spring in action 4th --- quick start

    读spring in action. 环境搭建 quick-start依赖注入 面向切面 1.环境搭建 jdk1.8 gradle 2.12 Intelij idea 2016.2.1 1.1创建一个 ...

  6. ssh整合随笔(注解方式,Spring 管理action)

    Web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=" ...

  7. Spring in action记录

    最近一段时间重新学习了一遍SPRING,现在对这些笔记整理一下,一来算是对之前的学习有一个交代,二来当是重新学习一次,三来可以留下备份 这次学习中以SPRING IN ACTION 4这学习资料,整书 ...

  8. Spring in Action 4th 学习笔记 之 AOP

    前提:本文中的AOP仅限于Spring AOP. 先说说为什么需要AOP 最简单的一个例子就是日志记录,如果想记录一些方法的执行情况,最笨的办法就是修改每一个需要记录的方法.但这,真的很笨... 好的 ...

  9. 学习spring in action 第一天

    这段时间,开始学习java吧,因为C sharp 学习了java的大量语法格式,所以,留意下,就不会错了,java 有的c sharp也有,而且之前我也学习过java的桌面开发,但是一下子上来就要自己 ...

随机推荐

  1. ArcGIS For Android ExportTileCache应用

    说明:从ArcGIS For Android10.2.4 ,開始支持下载在线地图服务切片缓存到移动设备本地.以便离线时进行地图浏览.本文章摘要介绍,使用自己公布的服务时,须要注意的内容. 一.首先公布 ...

  2. [转]Oracle dblink调用函数报ORA-00904 标识符无效

    新建oracle的database link时,提示错误“ORA-12169: TNS: 指定为连接标识符的 Net 服务名太长”, 网上查了下,是因为目标oracle是集群,连接字符串过长,超过25 ...

  3. Guava API - FluentIterable Predicate Function Odering Range Splitter

    这写API可解决的问题 1. 集合元素的过滤 - FluentIterable Predicate Range Function 1) 先说Predicate<T>,这个相当与一个过滤原则 ...

  4. PostgreSql 合并多行记录

    需求描述: A表有如下数据 id 1 2 3 4 B表有如下数据 id name 1 aaa 1 bbb 1 ccc 2 aa 2 bb 3 c A表和B表通过id关联,需要查询结果如下: id na ...

  5. Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

    上一篇我们介绍了怎样由uri转换成String ,本文就用到了上篇文章的方法.以下我们介绍一下怎样设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务. 看一下代码:(布局文件和前两篇文章 ...

  6. 使用webService时,gsoap数据类型注意事项

    今天在使用gsoap生成webservice客户端文件时,发现我的参数类型全被改了,比如string型变成了char*,原来有STL的地方也变没了,经过研究发现,原来和我生成的头文件时使用的参数有关, ...

  7. Toast.makeText 方法出错 java.lang.RuntimeException

    接手以前同事留下的代码,今天突然出现了一个bug: java.lang.RuntimeException: Can't create handler inside thread that has no ...

  8. SCU 4313 把一棵树切成每段K个点 (n%k)剩下的点不管

    题目链接:http://cstest.scu.edu.cn/soj/problem.action?id=4313 判断是不是存在拆图得到新连通分支的点个数是K的倍数 注意一个点所连的边只能被切一条 # ...

  9. 初识 NoSQL Databases RethinkDB

    初识 NoSQL Databases RethinkDB rethinkDB所有数据都是基于 json的Document; 官网:http://rethinkdb.com/ github: https ...

  10. 安全的远程登录(SSH)

    Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层) ...