第十六章_动态注册和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

相关文章

Servlet中配置和使用过滤器的步骤记录

《Servlet中配置和使用过滤器的步骤记录》:本文主要介绍在Servlet中配置和使用过滤器的方法,包括创建过滤器类、配置过滤器以及在Web应用中使用过滤器等步骤,文中通过代码介绍的非常详细,需... 目录创建过滤器类配置过滤器使用过滤器总结在Servlet中配置和使用过滤器主要包括创建过滤器类、配置过滤

如何用Python绘制简易动态圣诞树

《如何用Python绘制简易动态圣诞树》这篇文章主要给大家介绍了关于如何用Python绘制简易动态圣诞树,文中讲解了如何通过编写代码来实现特定的效果,包括代码的编写技巧和效果的展示,需要的朋友可以参考... 目录代码:效果:总结 代码:import randomimport timefrom math

Java中JSON字符串反序列化(动态泛型)

《Java中JSON字符串反序列化(动态泛型)》文章讨论了在定时任务中使用反射调用目标对象时处理动态参数的问题,通过将方法参数存储为JSON字符串并进行反序列化,可以实现动态调用,然而,这种方式容易导... 需求:定时任务扫描,反射调用目标对象,但是,方法的传参不是固定的。方案一:将方法参数存成jsON字

.NET利用C#字节流动态操作Excel文件

《.NET利用C#字节流动态操作Excel文件》在.NET开发中,通过字节流动态操作Excel文件提供了一种高效且灵活的方式处理数据,本文将演示如何在.NET平台使用C#通过字节流创建,读取,编辑及保... 目录用C#创建并保存Excel工作簿为字节流用C#通过字节流直接读取Excel文件数据用C#通过字节

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF