`
234390216
  • 浏览: 10192436 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
A5ee55b9-a463-3d09-9c78-0c0cf33198cd
Oracle基础
浏览量:460762
Ad26f909-6440-35a9-b4e9-9aea825bd38e
springMVC介绍
浏览量:1771696
Ce363057-ae4d-3ee1-bb46-e7b51a722a4b
Mybatis简介
浏览量:1395359
Bdeb91ad-cf8a-3fe9-942a-3710073b4000
Spring整合JMS
浏览量:393865
5cbbde67-7cd5-313c-95c2-4185389601e7
Ehcache简介
浏览量:678192
Cc1c0708-ccc2-3d20-ba47-d40e04440682
Cas简介
浏览量:529251
51592fc3-854c-34f4-9eff-cb82d993ab3a
Spring Securi...
浏览量:1178665
23e1c30e-ef8c-3702-aa3c-e83277ffca91
Spring基础知识
浏览量:461733
4af1c81c-eb9d-365f-b759-07685a32156e
Spring Aop介绍
浏览量:150098
2f926891-9e7a-3ce2-a074-3acb2aaf2584
JAXB简介
浏览量:66819
社区版块
存档分类
最新评论

通过ServletContainerInitializer注册Servlet对象

阅读更多

通过ServletContainerInitializer注册Servlet对象

Servlet3通过SPI的机制允许我们自定义一个ServletContainerInitializer的实现类,Servlet容器会在启动的时候自动调用实现类的onStartup方法,我们可以在该方法中进行一些Servlet对象的注册。ServletContainerInitializer接口的定义如下:

public interface ServletContainerInitializer {

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

在下面的代码中自定义了一个ServletContainerInitializer的实现类,叫MyServletContainerInitialier。在其onStartup方法中我们通过入参ServletContext分别注册了一个Servlet、一个监听器和一个Filter。

public class MyServletContainerInitializer implements ServletContainerInitializer {

    @Override
    public void onStartup(Set<Class<?>> c, ServletContext ctx) throws ServletException {
        //注册Servlet
        javax.servlet.ServletRegistration.Dynamic servletRegistration = ctx.addServlet("hello", HelloServlet.class);
        servletRegistration.addMapping("/servlet3/hello");
        servletRegistration.setLoadOnStartup(1);
        servletRegistration.setAsyncSupported(true);
        
        //注册监听器
        ctx.addListener(StartupListener.class);
        
        //注册Filter
        javax.servlet.FilterRegistration.Dynamic filterRegistration = ctx.addFilter("hello", HelloFilter.class);
        filterRegistration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/servlet3/*");
    }

}

它是基于SPI发现的,这需要我们在classpath下面的META-INF/services下新建一个名为javax.servlet.ServletContainerInitializer的文件,然后在里面加上我们自定义的ServletContainerIntializer的全路径名称。如果有多个实现类,每一个实现类写一行。

HandlesTypes

在上面的示例中我们在onStartup的实现中完全没有使用第一个参数classes,它是干什么用的呢?Servlet3允许我们在定义自定义的ServletContainerInitializer的时候通过@HandlesTypes注解指定在自定义的ServletContainerInitializer初始化的时候,也就是调用onStartup时需要自动检测的类型,然后把它们作为onStartup的第一个参数。这在我们搭建框架的时候非常有用,我们可以通过它对外定义一个接口,让有需要通过它来动态注册Servlet对象的人都可以只需要实现我们开放的接口来注册Servlet对象,他们不需要实现完整的ServletContainerInitializer接口,并按照SPI规范在javax.servlet.ServletContainerInitailizer文件中定义。

下面示例中我们通过@HandlesTypes(WebInitializer.class)指定了在容器初始化的时候需要自动检测WebInitializer类型的Class,然后在onStartup方法体中利用反射一一实例化WebInitializer接口实现类,并调用它们的onStartup方法进行Servlet对象的注册。

@HandlesTypes(WebInitializer.class)
public class MyServletContainerInitializer2 implements ServletContainerInitializer {

	@Override
	public void onStartup(Set<Class<?>> classes, ServletContext ctx) 
			throws ServletException {
		// classes就是自动检测到的类路径下的该初始化类上的@HandlesTypes指定的类,
		// 在本示例中就是WebInitializer接口的实现类

		if (classes != null && !classes.isEmpty()) {
			for (Class<?> initializerClass : classes) {
				if (!initializerClass.isInterface() 
						&& !Modifier.isAbstract(initializerClass.getModifiers())) {
					WebInitializer initializer;
					try {
						initializer = (WebInitializer) initializerClass.newInstance();
						initializer.onStartup(ctx);
					} catch (InstantiationException e) {
						e.printStackTrace();
					} catch (IllegalAccessException e) {
						e.printStackTrace();
					}
				}
			}
		}
	}

}



public interface WebInitializer {

    void onStartup(ServletContext ctx) throws ServletException; 
    
}

(注:本文是基于Servlet3.1所写,由Elim写于2018年6月23日)

0
0
分享到:
评论

相关推荐

    servlet 内置对象

    servlet 内置对象 servlet内置对象 servlet内置对象

    SpringBoot 注册自己的Servlet(三种方式)(源代码)

    SpringBoot 注册自己的Servlet(三种方式)(源代码) SpringBoot 注册自己的Servlet(三种方式)(内含源代码) 方法1:使用servlet3.0规范提供的注解方式注册 Servlet 1,声明servlet及映射 2,加上@...

    jsp 注册<servlet>方法说明

    它与&lt;servlet-mapping/&gt;必须注册同样的注册名 --&gt; &lt;servlet-class&gt;test.HelloWorld&lt;/servlet-class&gt; &lt;!-- 此处说明定义的java类文件"*.class",系统默认是从%CATALINA_HOME%\WEB-INF\classes\找类文件 值得...

    登录和注册的jsp页面+servlet+javaBean

    登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+...

    servlet如何将对象传给JSP,看完必懂

    里面对servlet和JSP,传值有着详细的讲解

    Servlet中对象的作用范围.pdf

    资料总详细说明了Servlet的域对象的生命周期的解释。  何时创建和销毁的  如何存取数据  作用范围

    tomcat中Servlet对象池介绍及如何使用

    Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端...

    servlet注册登陆和数据库操作.

    servlet 注册登陆 里面有login register showinfo errorPage 等JSP的基本范例.

    Jsp+JavaBean循序渐进教程+Servlet工作原理实例

    JSP+JavaBean+Servlet三层结构的...通过web.XML配置文件可以找到用户请求和特定的Servlet的对应关系,每个Servlet都有一个特定的Servlet对象与之对应,所以说处理用户请求的就是一个继承自HttpServlet的Servlet对象。

    JSP+Servlet + JDBC+MySQL 注册和登录

    JSP+Servlet + JDBC+MySQL 注册和登录

    Servlet+mysql+tomcat实现简单登录和注册

    用Servlet和jsp写的一个实现简单的登录和注册界面。用到的工具和技术有eclipse2017,tomcat7.0,mysql5.6,JDBC,jdk1.8,html,css

    jsp servlet+sqlserver简单登录注册

    jsp servlet+sqlserver简单登录注册jsp servlet+sqlserver简单登录注册jsp servlet+sqlserver简单登录注册

    说一说servlet的生命周期

     当客户第一次请求时,首先判断是否存在servlet对象,第一次请求时不存在,则由tomcat创建对象,调用init()方法对其初始化,用service()方法判断是post请求还是get请求,调用对应的方法返回给客户。  当客户第...

    Servlet编程--实现用户注册

    有提交注册和重置按钮,当单击“提交注册”按钮后,将所注册的信息交给servlet程序CheckValue.java进行处理。 2)servlet程序CheckValue.java:对提交的注册信息进行有效性检查,如性别是否正确,密码是否一致、电话...

    (Servlet+JSP+JavaBean实现)用户注册和登陆

    Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此...

    servlet登陆和注册例子

    servlet登陆和注册例子 数据库:sqlserver2008

    ajax+servlet 用户注册

    ajax servlet ¥¥¥¥¥¥¥注册

    用户登陆注册码生成Servlet

    用servlet生成用户登陆或者注册时的验证码

    采用Java Servlet +Service+DAO实现用户登陆注册

    采用Service+Service+DAO实现...(3)对数据库的增删改查操作进行封装,提供统一的访问对象DAO类; (4)以用户注册与登陆案例的实现为例。 教学重点与难点 (1)Servlet+Service+DAO开发模式的理解; (2)DAO的封装。

Global site tag (gtag.js) - Google Analytics