servlet 3 通过编程的方式来配置ServletContext
你是否再为配置文件web.xml容易出错而烦恼?是否为web.xml文件存放位置而不知所措?是否为web.xml为什么要这样配?怎么才能更好的配置web.xml而烦恼?那么一种新的方式出现了:
spring提供了支持servlet 3+以上的编程方式,它可以替换或者和web.xml共存的方式工作。其相关类如下:
WebApplicationInitializer
传统上,我们基于web.xml这种方式来配置web应用,而WebApplicationInitializer的实现支持在servlet 3.0以上的环境里通过编程的方式来配置ServletContext,这种方式既可以替换web.xml这种方式,也可以和web.xml这种方式共存。
这种SPI的实现通常由SpringServletContainerInitializer来自动发现,SpringServletContainerInitializer可以被servlet 3.0以上的容器自动启动。详细请参考下面的章节。示例如下:
传统基于xml的方式
绝大多数spring开发者构建web应用时需要注册spring DispatcherServlet到WEB/web.xml如下方式:
- <servlet>
- <servlet-name>dispatcher</servlet-name>
- <servlet-class>
- org.springframework.web.servlet.DispatcherServlet
- </servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/spring/dispatcher-config.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>dispatcher</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
基于编程方式的WebApplicationInitializer
下面基于WebApplicationInitializer样式的代码等同于DispatcherServlet的注册逻辑:
- public class MyWebAppInitializer implements WebApplicationInitializer {
- @Override
- public void onStartup(ServletContext container) {
- XmlWebApplicationContext appContext = new XmlWebApplicationContext();
- appContext.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml");
- ServletRegistration.Dynamic dispatcher =
- container.addServlet("dispatcher", new DispatcherServlet(appContext));
- dispatcher.setLoadOnStartup(1);
- dispatcher.addMapping("/");
- }
- }
上面的实现,还可以通过扩展org.springframework.web.servlet.support.AbstractDispatcherServletInitializer实现。
如上所示,归功于servlet3.0的ServletContext#addServlet方法,我们注册一个DispatcherServlet的实例,这意味着DispatcherServlet可以如其他Object一样,接受在应用上下文中通过构造器进行注入。
这种方式不但简单还很明了。不需要关注init-param的处理等等,仅有通常的javaBean样式的属性和构造参数。可以在DispatcherServlet注入之前,尽可能的自由的创建spring context、使用spring context。
绝大部分spring web组件已经更新来支持这种注册方式,你会发现DispatcherServlet、FrameworkServlet、ContextLoaderListener和DelegatingFilterProxy现在都支持构造参数。
尽管个别组件(非spring的,其他第三方的)没有更新到支持WebApplicationInitializer的使用,它们仍然可以使用。servlet 3.0的ServletContext api支持编码式设置init-params,context-param等的属性。
基于编码式的配置
上例中,WEB/web.xml可以通过WebApplicationInitializer样式的代码完全替换掉,但真正的dispatcher-config.xml spring配置文件仍然是基于xml方式的。WebApplicationInitializer也是一个很棒的方式来进行spring的基于编程方式的配置类,详情参考org.springframework.context.annotation.Configuration。
下面的例子中,将使用spring的
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
类来替代XmlWebApplicationContext,用户自定义的@Configuration配置类AppConfig和DispatcherConfig来替换spring的xml文件来重构上面的例子。这个示例也有一些超出部分,用来展示root application context的的通用配置和ContextLoaderListener的注册:
- public class MyWebAppInitializer implements WebApplicationInitializer {
- @Override
- public void onStartup(ServletContext container) {
- // Create the 'root' Spring application context
- AnnotationConfigWebApplicationContext rootContext =
- new AnnotationConfigWebApplicationContext();
- rootContext.register(AppConfig.class);
- // Manage the lifecycle of the root application context
- container.addListener(new ContextLoaderListener(rootContext));
- // Create the dispatcher servlet's Spring application context
- AnnotationConfigWebApplicationContext dispatcherContext =
- new AnnotationConfigWebApplicationContext();
- dispatcherContext.register(DispatcherConfig.class);
- // Register and map the dispatcher servlet
- ServletRegistration.Dynamic dispatcher =
- container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
- dispatcher.setLoadOnStartup(1);
- dispatcher.addMapping("/");
- }
- }
servlet 3 通过编程的方式来配置ServletContext的更多相关文章
- JDBC编程的方式
JDBC编程的方式,我们以一个简单的查询为例,使用JDBC编程,如下: 从上面可以看出JDBC编程一般要如下步骤: 1. 加载数据库驱动 2. 创建并获取数据库连接 3. 创建jdbc stateme ...
- 利用SparkLauncher 类以JAVA API 编程的方式提交Spark job
一.环境说明和使用软件的版本说明: hadoop-version:hadoop-2.9.0.tar.gz spark-version:spark-2.2.0-bin-hadoop2.7.tgz jav ...
- springmvc基础篇—通过注解的方式去配置项目
学习了通过xml方式去配置项目后,当然要掌握更简单更灵活的注解方式哟,这是官方推荐使用的方式. 一.修改配置文件,建议大家直接使用我的配置文件 <?xml version="1.0&q ...
- Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)
Java Filter过滤器+Listen监听器 啥是过滤器 顾名思义即过滤掉一些东西,比如我们经历的高考中考都是过滤器,他过滤掉一些在学习这一方面不是很好的人,而那些成绩好的人则升入高中,大学. 但 ...
- 关于SpringAOP的XML方式的配置
AOP(XML)[理解][应用][重点] 1.AOP基础实例 A.导入jar包 核心包(4个) 日志(2个) AOP(4个) Spring进行AOP开发(1个) ...
- Oracle BEQ方式连接配置
Oracle BEQ方式连接配置 服务端和客户端在同一台机器上,可以使用BEQ连接,BEQ连接可以理解为进程间直接通信,不需要走网络监听,性能更高. 可以参考MOS:How To Connect Us ...
- 在C语言中以编程的方式获取函数名
仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧. 对象反射库.调试工具及代码分析器,经常会需要在运行时访问 ...
- Spring(二十):Spring AOP(四):基于配置文件的方式来配置 AOP
基于配置文件的方式来配置 AOP 前边三个章节<Spring(十七):Spring AOP(一):简介>.<Spring(十八):Spring AOP(二):通知(前置.后置.返回. ...
- 接口项目servlet的一种处理方式,将异常返回给调用者【我】
接口项目servlet的一种处理方式,其他层有异常全部网上抛,抛到servlet层,将异常返回给调用者: Servlet层: private void processRequest(HttpServl ...
随机推荐
- 黑马oracle_day01:02.oracle的基本操作
01.oracle体系结构 02.oracle的基本操作 03.oracle的查询 04.oracle对象 05.oracle编程 02.oracle的基本操作 PLSQL中文乱码问题解决1.查看服务 ...
- HDU - 2602 Bone Collector(01背包讲解)
题意:01背包:有N件物品和一个容量为V的背包.每种物品均只有一件.第i件物品的费用是volume[i],价值是value[i],求解将哪些物品装入背包可使价值总和最大. 分析: 1.构造二维数组: ...
- 每天一点点之vue框架开发 - vue组件之间传值(父向子传值)
路由文件 { path: '/productListBase', name: 'productListLink', component: ProductListBase, redirect: '/pr ...
- C++ 设置自动启动
WCHAR pFileName[MAX_PATH] = {}; //得到程序自身的全路径 DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PA ...
- Git - 版本管理 - 版本回退
1 在历史里找到 SHA-1 的值 0c6ab03dbbfe61e39af92dfe5450bf693a72b7d9 2 命令行里执行:git reset --hard 0c6ab03dbbfe61e ...
- 自学Java第五章——《面向对象的基本特征》
面向对象的基本特征: 1.封装 2.继承 3.多态 6.1 封装 1.好处: (1)隐藏实现细节,方便使用者使用 (2)安全,可以控制可见范围 2.如何实现封装? 通过权限修饰符 面试题:请按照可见范 ...
- java课程课后作业190612之Beta版总结会议
1.每个成员在beta 阶段的实践和alpha 阶段有何改进? 陈阳:在编程的时候学习广播知识,了解了Android的广播机制完成了上课静音以及课前提醒的功能,在代码的美观上也有了一定的提升 2. 团 ...
- 网络基础:OSI 七层模型、TCP/IP 四层模型
1.Internet历史 1. 1968年由美国ARPA机构提出"资源共享计算机网络”,让ARPA的计算机互联起来,叫做阿帕网;2. 1974年,第一个TCP协议详细说明发布了.3. 一个 ...
- Java并发基础类AbstractQueuedSynchronizer的实现原理简介
1.引子 Lock接口的主要实现类ReentrantLock 内部主要是利用一个Sync类型的成员变量sync来委托Lock锁接口的实现,而Sync继承于AbstractQueuedSynchroni ...
- LeetCode做题笔记之动态规划
LeetCode之动态规划 时间有限只做了下面这几道:70.338.877.96.120.95.647,后续会继续更新 70:爬楼梯 先来道简单的练练手,一道经典的动态规划题目 可以采用动态规划的备忘 ...