Tomcat8.x 中对ServletContainerInitializer接口的实现类的检测和自动调用
来源:互联网 发布:大连光洋 知乎 编辑:程序博客网 时间:2024/05/16 14:09
import java.util.Set;import javax.servlet.ServletContainerInitializer;// ************** ServletContainerInitializer接口 的使用 ************** // 1、在jar包中创建META-INF/services/javax.servlet.ServletContainerInitializer文件// 2、在文件中写入实现的类路径,如:org.apache.jasper.servlet.JasperInitializer// ************** Tomcat中对ServletContainerInitializer接口的实现类的检测和自动调用 **************// 检测实现ServletContainerInitializer接口的类---------------------------1class org.apache.catalina.core.StandardContext{protected synchronized void startInternal() throws LifecycleException { // 读取并解析“d:/a/c/d/tomcat/conf/web.xml”,读取并解析"d:/a/b/tomcat/conf/Catalina/localhost/web.xml.default" // 取得输入流 "d:/a/b/c/tomcat/webapps/dir1/WEB-INF/web.xml" // 合并配置文件内容 // 合并全局配置 // 使用 org.apache.jasper.servlet.JspServlet 包装 <jsp-file>/a/b/c/file.jsp</jsp-file>的文件 // 把解析处理的内容设置到 context 中 ,如:context.addFilterMap(filterMap); // 在org.apache.catalina.core.NamingContextListener事件处理器中,内部调用了createNamingContext()创建 envCtx // Notify our interested LifecycleListeners 触发事件监听器 org.apache.catalina.startup.ContextConfig fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null); // 配置启动事件 "configure_start"----------------------}// 添加初始化器public void addServletContainerInitializer( ServletContainerInitializer sci, Set<Class<?>> classes) { initializers.put(sci, classes); }}class org.apache.catalina.startup.ContextConfig{public void lifecycleEvent(LifecycleEvent event) {context = (Context) event.getLifecycle(); // 取得触发者 org.apache.catalina.core.StandardContextconfigureStart();} protected synchronized void configureStart() {// 读取并解析“d:/a/c/d/tomcat/conf/web.xml”,读取并解析"d:/a/b/tomcat/conf/Catalina/localhost/web.xml.default" // 取得输入流 "d:/a/b/c/tomcat/webapps/dir1/WEB-INF/web.xml" // 合并配置文件内容 // 合并全局配置 // 使用 org.apache.jasper.servlet.JspServlet 包装 <jsp-file>/a/b/c/file.jsp</jsp-file>的文件 // 把解析处理的内容设置到 context 中 ,如:context.addFilterMap(filterMap); webConfig();//!!!! 核心 } protected void webConfig() { // org.apache.jasper.servlet.JasperInitializer jasper.jar // org.apache.tomcat.websocket.server.WsSci tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer"文件内容 // 创建文件中声明的类型对象,并把创建对象转成ServletContainerInitializer类型的引用// initializerClassMap{// 'MyServletContainerInitializer1_Obj'=>[],// 'MyServletContainerInitializer2_Obj'=>[],// }// typeInitializerMap{// 'MyAnnotation1.class'=>[MyServletContainerInitializer1_Obj ],// 'MyAnnotation2.class'=>[MyServletContainerInitializer2_Obj ]// } processServletContainerInitializers(); // 查看实现ServletContainerInitializer的初始化器 if (ok) { // org.apache.jasper.servlet.JasperInitializer jasper.jar // org.apache.tomcat.websocket.server.WsSci tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer"文件内容 // 创建文件中声明的类型对象,并把创建对象转成ServletContainerInitializer类型的引用// initializerClassMap{// 'MyServletContainerInitializer1_Obj'=>[],// 'MyServletContainerInitializer2_Obj'=>[],// }// typeInitializerMap{// 'MyAnnotation1.class'=>[MyServletContainerInitializer1_Obj ],// 'MyAnnotation2.class'=>[MyServletContainerInitializer2_Obj ]// } for (Map.Entry<ServletContainerInitializer,Set<Class<?>>> entry : initializerClassMap.entrySet()) { if (entry.getValue().isEmpty()) { // 添加Servlet容器初始化器到StandardContext // 添加初始化器 // context === org.apache.catalina.core.StandardContext // StandardContext.initializers.put(entry.getKey(), null); context.addServletContainerInitializer( entry.getKey(), null); } else { context.addServletContainerInitializer( entry.getKey(), entry.getValue()); } } } protected void processServletContainerInitializers() { // 容器初始化器 WebappServiceLoader<ServletContainerInitializer> loader = new WebappServiceLoader<>(context); // org.apache.jasper.servlet.JasperInitializer jasper.jar // org.apache.tomcat.websocket.server.WsSci tomcat-websocket.jar // 解析类路径中"META-INF/services/javax.servlet.ServletContainerInitializer"文件内容 // 创建文件中声明的类型对象,并把创建对象转成ServletContainerInitializer类型的引用 detectedScis = loader.load(ServletContainerInitializer.class); // 检测到的 ServletContainerInitializer for (ServletContainerInitializer sci : detectedScis) { initializerClassMap.put(sci, new HashSet<Class<?>>()); // 要调用的初始化器 } } } // 调用实现ServletContainerInitializer接口的类的方法,进行初始化---------------------------2 class org.apache.catalina.core.StandardContext{protected synchronized void startInternal() throws LifecycleException {// fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null);// ....// org.apache.jasper.servlet.JasperInitializer jasper.jar // org.apache.tomcat.websocket.server.WsSci tomcat-websocket.jar// Call ServletContainerInitializers for (Map.Entry<ServletContainerInitializer, Set<Class<?>>> entry : initializers.entrySet()) { // 调用容器初始化器 , // 如:org.apache.jasper.servlet.JasperInitializer.onStartup(); try { // 执行初始化器 entry.getKey().onStartup(entry.getValue(),getServletContext()); } catch (ServletException e) { log.error(sm.getString("standardContext.sciFail"), e); ok = false; break; } }}}}
0 0
- Tomcat8.x 中对ServletContainerInitializer接口的实现类的检测和自动调用
- Tomcat8.x Servlet的创建和调用
- 接口、实现类和方法的调用
- c#中接口实现类的动态调用实现
- tomcat8.X.X的 配置记录
- 对java 接口和实现的理解
- InstallShield中IIS服务的检测和组件自动安装的实现
- tomcat7和tomcat8 对 资源路径的解析
- 对java中的接口和实现类的深入理解
- Tomcat8.x web.xml监听器的配置的解析->监听器的实例化->监听器的调用
- Tomcat8.x web.xml过滤器的配置的解析->过滤器的实例化->过滤器的调用
- 利用接口类实现对多个实现子类的初始化,并调用子类中的方法
- quick-cocos2d-x lua中碰撞检测的实现
- 对Java中接口和抽象类的一些认识
- 对Java中抽象类和接口的理解
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- (转)如何在linux C/C++语言中调用 sqlite 的函数接口来实现对数据库的管理
- Java中repaint方法清除原来图像问题
- 图解onInterceptTouchEvent , onTouchEvent及onTouch区别
- 使用AXIS2开发Webservice成功输出版本信息——小白入门
- Spring的事物分析(1):统一的事物接口
- SVN 期望文件格式在X到X之间;发现格式X
- Tomcat8.x 中对ServletContainerInitializer接口的实现类的检测和自动调用
- 机器学习实战-K-近邻算法
- mysql5.7.13下载安装使用
- 趣好玩开发日志 03-day
- Oracle数据库备份与恢复之完全攻略
- 直男版简单的springAop例子
- HTML区块和布局
- LintCode:统计比给定整数小的数的个数
- [hihocoder 1181 欧拉路 二] Fleury 算法求欧拉回路