通过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日)
相关推荐
servlet 内置对象 servlet内置对象 servlet内置对象
SpringBoot 注册自己的Servlet(三种方式)(源代码) SpringBoot 注册自己的Servlet(三种方式)(内含源代码) 方法1:使用servlet3.0规范提供的注解方式注册 Servlet 1,声明servlet及映射 2,加上@...
它与<servlet-mapping/>必须注册同样的注册名 --> <servlet-class>test.HelloWorld</servlet-class> <!-- 此处说明定义的java类文件"*.class",系统默认是从%CATALINA_HOME%\WEB-INF\classes\找类文件 值得...
登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+servlet+javaBean登录和注册的jsp页面+...
里面对servlet和JSP,传值有着详细的讲解
资料总详细说明了Servlet的域对象的生命周期的解释。 何时创建和销毁的 如何存取数据 作用范围
Servlet在不实现SingleThreadModel的情况下运行时是以单个实例模式,如下图,这种情况下,Wrapper容器只会通过反射实例化一个Servlet对象,对应此Servlet的所有客户端请求都会共用此Servlet对象,而对于多个客户端...
servlet 注册登陆 里面有login register showinfo errorPage 等JSP的基本范例.
JSP+JavaBean+Servlet三层结构的...通过web.XML配置文件可以找到用户请求和特定的Servlet的对应关系,每个Servlet都有一个特定的Servlet对象与之对应,所以说处理用户请求的就是一个继承自HttpServlet的Servlet对象。
JSP+Servlet + JDBC+MySQL 注册和登录
用Servlet和jsp写的一个实现简单的登录和注册界面。用到的工具和技术有eclipse2017,tomcat7.0,mysql5.6,JDBC,jdk1.8,html,css
jsp servlet+sqlserver简单登录注册jsp servlet+sqlserver简单登录注册jsp servlet+sqlserver简单登录注册
当客户第一次请求时,首先判断是否存在servlet对象,第一次请求时不存在,则由tomcat创建对象,调用init()方法对其初始化,用service()方法判断是post请求还是get请求,调用对应的方法返回给客户。 当客户第...
有提交注册和重置按钮,当单击“提交注册”按钮后,将所注册的信息交给servlet程序CheckValue.java进行处理。 2)servlet程序CheckValue.java:对提交的注册信息进行有效性检查,如性别是否正确,密码是否一致、电话...
Servlet+JSP+JavaBean(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此...
servlet登陆和注册例子 数据库:sqlserver2008
ajax servlet ¥¥¥¥¥¥¥注册
用servlet生成用户登陆或者注册时的验证码
采用Service+Service+DAO实现...(3)对数据库的增删改查操作进行封装,提供统一的访问对象DAO类; (4)以用户注册与登陆案例的实现为例。 教学重点与难点 (1)Servlet+Service+DAO开发模式的理解; (2)DAO的封装。