Servlet3.0的动态

动态的创建是为了简化配置文件的.对于我们创建的servlet,filter和listener后可以使用。这也是注解的另外一种替代方式。

动态的添加有两种,一种是基于ContextListener的,另外一种是基于servlet3.0新增接口的ServletContainerInitializer的

动态的主要类是Dynamic

代码:

package com.hotusm.dynamic;

import javax.servlet.FilterRegistration;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebListener;

@WebListener
public class DynamicInitContextListener implements ServletContextListener{

    public void contextInitialized(ServletContextEvent sce) {

        ServletContext context = sce.getServletContext();
        ServletRegistration.Dynamic dynamicServlet=context.addServlet("dynamicServlet", DynamicServlet.class);
        dynamicServlet.addMapping("/dynamicServlet");
        dynamicServlet.setAsyncSupported(true);
        dynamicServlet.setLoadOnStartup(1);

        FilterRegistration.Dynamic dynamicFilter = context.addFilter("dynamicFilter", DynamicFilter.class);

        context.addListener("com.hotusm.dynamic.DynamicListener");

    }

    public void contextDestroyed(ServletContextEvent sce) {

    }

}

ServletContainerInitializer的:

package com.hotusm.dynamic;

import java.util.Set;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.HandlesTypes;
import javax.servlet.http.HttpServlet;
public class ServletContainerInitializerImpl implements ServletContainerInitializer{

    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {

        System.out.println("ServletContainerInitializer");

        if(c!=null){
            for(Class<?> clazz:c){
                System.out.println(clazz.getClass().getName());
            }
        }

//        ServletContext context = sce.getServletContext();
//        ServletRegistration.Dynamic dynamicServlet=context.addServlet("dynamicServlet", DynamicServlet.class);
//        dynamicServlet.addMapping("/dynamicServlet");
//        dynamicServlet.setAsyncSupported(true);
//        dynamicServlet.setLoadOnStartup(1);
//
//        FilterRegistration.Dynamic dynamicFilter = context.addFilter("dynamicFilter", DynamicFilter.class);
//
//        context.addListener("com.hotusm.dynamic.DynamicListener");

    }
}

对于ServletContainerInitializer的方式,是基于SPI来做的,所以我们需要编辑几个文件:

里面的内容就是我们的实现类

另一方面在springmvc中我们可以使用WebApplicationInitializer的,因为我们可以在spring-web的架包下面看到:

里面的内容是:

其中的类实现有这样一句的代码:

@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {

表示的就是凡是实现或者继承WebApplicationInitializer的都会被加载

@HandlesTypes指定的类的子类和本类都会传进来。(onStartup的第一个参数)

ServletContext 为动态配置 Servlet 增加了如下方法:

  • ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)
  • ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
  • ServletRegistration.Dynamic addServlet(String servletName, String className)
  • <T extends Servlet> T createServlet(Class<T> clazz)
  • ServletRegistration getServletRegistration(String servletName)
  • Map<String,? extends ServletRegistration> getServletRegistrations()

其中前三个方法的作用是相同的,只是参数类型不同而已;通过 createServlet() 方法创建的 Servlet,通常需要做一些自定义的配置,然后使用 addServlet() 方法来将其动态注册为一个可以用于服务的 Servlet。两个 getServletRegistration() 方法主要用于动态为 Servlet 增加映射信息,这等价于在 web.xml( 抑或 web-fragment.xml) 中使用 <servlet-mapping> 标签为存在的 Servlet 增加映射信息。

以上 ServletContext 新增的方法要么是在 ServletContextListener 的 contexInitialized 方法中调用,要么是在 ServletContainerInitializer 的 onStartup() 方法中调用。

ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口,容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer 的实现类,并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理,我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类,过滤掉不希望给 onStartup() 处理的类

时间: 2024-08-10 00:05:53

Servlet3.0的动态的相关文章

框架学习前基础加强 泛型,注解,反射(泛型&注解)应用案例,IOC,Servlet3.0,动态代理,类加载器

泛型 1. 泛型类 :具有一个或多个类型变量的类,称之为泛型类! class A<T> { } 2. 在创建泛型类实例时,需要为其类型变量赋值 A<String> a = new A<String>(); * 如果创建实例时,不给类型变量赋值,那么会有一个警告! 3. 泛型方法 :具有一个或多个类型变量的方法,称之为泛型方法! class A<T> { public T fun(T t1) {} } fun()方法不是泛型方法!它是泛型类中的一个方法! pu

log4j+slf4j迁移到log4j2+slf4j (Servlet3.0)

最近对系统中的旧项目实现log升级,选择了log4j2来代替log4j,作为最新一代的log实现,log4j2好在那里可以直接看log4j2性能章节. 这里写写如何从log4j升级到log4j2. 1. maven依赖的变化,对log4j的依赖变成了对log4j2的依赖,在实际使用过程中发现过旧的jboss logging会有问题,使用了3.3.0.Final支持log4j2的版本. <dependency> <groupId>org.apache.logging.log4j<

spring boot基础之servlet3.0和spring4.x零配置相关文章

Servlet 3 + Spring MVC零配置:去除所有xml Spring4中的WebApplicationInitializer理解 servlet3注解替代web.xml 利用WebApplicationInitializer配置SpringMVC取代web.xml servlet3.0 ServletContainerInitializer初始化器 servlet 3.0笔记之servlet的动态注册 一个基于注解配置的Web项目的启动流程分析 SpringMVC4零配置 servl

Servlet3.0的异步

servlet之前的操作同时同步的,就是按照这样的一个流程来走的: 1.请求根据一个路径路由到一个servlet中, 2.servlet获取一系列的参数 3.执行一系列的逻辑(花费时间所占的比重也更大) 4.返回结果 上面的问题出现在这一系列的操作都是同步的,所以这个请求必定是堵塞到所以任务都完成之后才返回的, 这样将会很浪费资源,因为线程堵塞在那里,仅仅是等待任务的完成.但是在servlet3.0之后,我们基本上可以 是这样做的 1.请求根据一个路径路由到一个servlet中, 2.将逻辑放入

【Servlet】利用Servlet3.0标准与JSTL表达式实现文件上传系统,支持图片上传后显示

伴随着JDK1.6一起出现的Servlet3.0标准,使得JSP的文件上传系统不再艰难,此前在JSP的文件上传系统需要<[Jsp]使用jspsmartupload完成简单的文件上传系统>(点击打开链接)类似这样的插件才能完成的文件上传系统,还不支持中文,使得各位程序猿掏空心思才能解决这个问题.现在Servlet3.0对文件上传的方法进行封装,无须分块就可以实现.而且Servlet3.0还不用类似<[Servlet]最简单的Servlet JavaWeb程序>(点击打开链接)在web

Java基础加强-(注解,类加载器,servlet3.0新特性)

1.   Annotation注解 1.1.  Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annotation就是提供了一种为程序元素设置元数据的方法,可用于修饰包.类.构造器.方法.成员变量.参数和局部变量的声明,这些信息被存储在Annotation的“name=value”对中. Annotation能被用来为程序元素(类.方法.成员变量等)设置元数据,比如一段代码的作者或者告诉编译器禁止一些特

【Maven】Maven的下载与配置,修改其本地仓库,并挂在到Eclipse for javeee建立一个Servlet3.0的Helloworld

首先说一下Maven是什么.经常听Maven项目好像很高大上的样子,其实Maven只是一个jar的下载工具.配置了Maven的项目,在程序猿的开发机器能够联网的时候,能够自己上网下载程序猿需要的jar包,省去程序猿自己上各个国外官网,忍受着卡爆的网速,找jar包的蛋疼.由于Maven是Apache的项目,Apache在全世界都配有服务站点,因此通过Maven下jar包,是很不错的.同时,现在一些Struts2等国外项目也开始傲娇起来,在官网上通通都只提供自己的Maven依赖,让程序猿自己通过这条

基于Servlet3.0+IBatis+BootStrip技术构建简单会议管理系统

网盘地址:https://pan.baidu.com/s/1i65cPSD 密码: 63ia网盘地址:https://pan.baidu.com/s/1kXmqkM7 密码: v4ry 本系统是应用于企业会议管理的系统,实现自动管理会议室,及时准确得知会议室空闲.预定情况,规范公司会议管理,实现公司信息资源在各部门之间快速有效传递,避免资源的冲突.提高了会议室的使用率,节省会议组织者的时间,妥善保管了会议记录. 学习目标本系列讲座主要讲述如何利用Servlet3.0+mybatis+bootst

Servlet3.0与springmvc那些事

官方文档:https://docs.spring.io/spring/docs/5.0.2.RELEASE/spring-framework-reference/web.html#mvc-servlet-context-hierarchy 以前开发web工程:servlet.filter.listener都需要在web.xml进行注册,包括springmvc的前端控制器DispatcherServlet也需要在web.xml进行注册,现在用[注解]方式快速搭建一个web应用: 1.servlet