第十六章_动态注册和Servlet容器初始化

2024-08-22 23:48

本文主要是介绍第十六章_动态注册和Servlet容器初始化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

16.1、动态注册

为了使动态注册成为可能,ServletContext接口中还添加了以下方法,用来动态地创建Web对象:

<T extends Filter>createFilter(java.lang.Class<T> clazz)

<T extends java.util.EventListener> createListener(java.lang.Class<T> clazz)

<T extends Servlet> createServlet(java.lang.Class<T> clazz)

例如,假设MyServlet是一个可以直接或间接实现javax.servlet.Servlet的类,那么可以通过调用createServlet方法将MyServlet实例化:

Servlet myServlet = createServlet(MyServlet.class)

创建好一个Web对象之后,可以利用以下任意一个方法将它添加到ServletContext中,这也是Servlet3的一项新特性。

FilterRegistration.Dynamic addFilter(java.lang.String filterName, Filter filter)

<T extends java.util.EventListener> void addListener(T t)

ServletRegistration.Dynamic addServlet(java.lang.String servletName, Servlet servlet)

同样地,也可以通过在ServletContext中调用以下任意一个方法,在创建Web对象的同时,将它添加到ServletContext中。

在创建或添加监听器时,传给第一个addListener覆盖方法的类必须实现以下其中一个或多个接口:

1、ServletContextAttributeListener

2、ServletRequestListener

3、ServletRequestAttributeListener

4、HttpSessionListener

5、HttpSessionAttributeListener

如果将ServletContext传给ServletContextInitializeronStartup方法,那么监听器类也可以实现ServletContextListener接口。

下面这个例子没有用注解,也没有用部署描述符进行声明。

 FirstServlet.java

package servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class FirstServlet extends HttpServlet {private static final long serialVersionUID = 1L;private String name ;@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter() ;writer.println("<html><head><title>First servlet" + "</title></head><body>" + name);writer.println("</body></html>") ;}public void setName(String name) {this.name = name ;}}

DynRegListener.java

package listener;import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.WebListener;import servlet.FirstServlet;
@WebListener
public class DynRegListener implements ServletContextListener {@Overridepublic void contextDestroyed(ServletContextEvent arg0) {}@Overridepublic void contextInitialized(ServletContextEvent sce) {ServletContext servletContext = sce.getServletContext() ;Servlet firstServlet = null ;try {firstServlet = servletContext.createServlet(FirstServlet.class) ;} catch (ServletException e) {e.printStackTrace();}if(firstServlet != null && firstServlet instanceof FirstServlet){((FirstServlet) firstServlet).setName("Dynamically registered servlet");}ServletRegistration.Dynamic dynamic = servletContext.addServlet("firstServlet", firstServlet) ;dynamic.addMapping("/dynamic") ;}}

当应用程序启动时,容器会调用监听器的contextInitialized方法,结果是创建了一个FirstServlet实例,并注册和映射到/dynamic。可以利用下面这个路径访问FirstServlet

http://localhost:8080/filedowmload/dynamic


16.2Servlet容器初始化

如果你使用过像StrutsStruts2这类Java Web框架,就应该知道,在使用框架之前必须先配置应用程序。一般来说,需要通过修改部署描述符,告诉Servlet容器你正在使用一个框架。例如,要想在应用程序中使用Struts2,可以将以下标签添加到部署描述符中:

<filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

但在Servlet3中,就不再需要这些了。框架可以进行打包,自动完成Web对象的首次注册。

Servlet容器初始化的核心是javax.servlet.ServletContainerInitializer接口。这是一个简单的接口,它只有一个方法:onStartup。在执行任何ServletContext监听器之前,由Servlet容器调用这个方法。

实现ServletContainerInitializer的类必须用@HandleTypes注解进行标注,以便声明初始化程序可以处理这些类型的类。

下面是个例子。要把下面的类和文件打成jar包。

FirstServlet.java

package servlet;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class FirstServlet extends HttpServlet {private static final long serialVersionUID = 1L;private String name  = "wuhaixu" ;@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {response.setContentType("text/html");PrintWriter writer = response.getWriter() ;writer.println("<html><head><title>First servlet" + "</title></head><body>" + name);writer.println("</body></html>") ;}}

javax.servlet.ServletContainerInitializer

initializer.MyServletContainerInitializer

MyServletContainerInitializer.java

package initializer;import java.util.Set;import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;
import javax.servlet.annotation.HandlesTypes;import servlet.FirstServlet;
@HandlesTypes({FirstServlet.class})
public class MyServletContainerInitializer implements ServletContainerInitializer {@Overridepublic void onStartup(Set<Class<?>> classes, ServletContext servletContext)throws ServletException {System.out.println("onStartup");ServletRegistration registration = servletContext.addServlet("firstServlet", "servlet.FirstServlet");registration.addMapping("/f");System.out.println("leaving onStartup");}}

把这些文件和类放在下面的包中,在cmd进行jar包压缩



结果为:



这篇关于第十六章_动态注册和Servlet容器初始化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097751

相关文章

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

MySQL中动态生成SQL语句去掉所有字段的空格的操作方法

《MySQL中动态生成SQL语句去掉所有字段的空格的操作方法》在数据库管理过程中,我们常常会遇到需要对表中字段进行清洗和整理的情况,本文将详细介绍如何在MySQL中动态生成SQL语句来去掉所有字段的空... 目录在mysql中动态生成SQL语句去掉所有字段的空格准备工作原理分析动态生成SQL语句在MySQL

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.