监听器-Servlets(三)

2024-04-07 10:32
文章标签 监听器 servlets

本文主要是介绍监听器-Servlets(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

Servlet API提供了一系列的事件和事件监听器接口。上层的servlet/JSP应用能够通过调用这些API进行事件驱动的开发。这里监听的所有事件都继承自java.uitl.Event对象。监听器接口可以分为三类:ServletContext、HttpSession、ServletRequest。

监听器接口和注册

监听器接口主要在javax.servlet和javax.servlet.http包中,有以下接口:

  • javax.servlet.ServletContextListener:它能够响应ServletContext生命周期事件,它提供了ServletContext创建之后和ServletContext关闭之前的会被调用的方法。
  • javax.servlet.ServletContextAttributeListener:它能够响应ServletContext范围的属性添加、删除、替换事件。
  • javax.servlet.http.HttpSessionListener:它能够响应HttpSession的创建、超时和失效事件。
  • javax.servlet.http.HttpSessionAttributeListener:它能响应HttpSession范围的属性添加、删除、替换事件。
  • javax.servlet.http.HttpSessionActivationListener:它在一个HttpSession激活或失效时被调用。
  • javax.servlet.http.HttpSessionBindingListener:可以实现这个接口来保存HttpSession范围的属性。当有属性从HttpSession添加或删除时,HttpSessionBindingListener接口能够做出响应。
  • javax.servlet.ServletRequestListener:它能够响应一个ServletRequest的创建或删除。
  • javax.servlet.ServletRequestAttributeListener:它能响应ServletRequest范围的属性值添加、删除、修改事件。
  • javax.servlet.AsyncListener:一个用于异步操作的监听器。
    编写一个监听器,只需要写一个Java类来实现对应的监听器接口就可以看了。在Servlet3.0和Servlet3.1中提供了两种注册监听器的方法。第一种是使用WebListener注解,例如:
@WebListener
public class ListenerClass implements ListenerInterface {
}

第二种方法是在部署描述文档中添加一个listener元素。

<listener><listener-class>fully-qualified listener class</listener-class>
</listener>

你可以在一个应用中添加多个监听器。

Servlet Context 监听器

ServletContext的监听器接口有两个:ServletContextListener和ServletContextAttributeListener。

ServletContextListener

ServletContextListener能对ServletContext的创建和销毁做出响应。当ServletContext初始化时,容器会掉调用所有注册的ServletContextListeners的contextInitialized方法。该方法如下:

void contextInitialized(ServletContextEvent event);

当ServletContext将要销毁时,容器会调用所有注册的ServletContextListeners的contextDestroyed方法。该方法如下:

void contextDestroyed(ServletContextEvent event);

contextInitialized方法和contextDestroyed方法都会从容器获取到一个ServletContextEvent。javax.servlet.ServletContextEvent是一个java.util.EventObject的子类,它定义了一个访问ServletContext的getServletContext方法:

ServletContext getServletContext();

通过这个方法能够轻松获取到ServletContext。

@WebListener
public class AppListener implements ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {}@Overridepublic void contextDestroyed(ServletContextEvent sce) {ServletContext servletContext = sce.getServletContext();Map<String, String> countries = new HashMap<>();countries.put("ca", "Canada");countries.put("us", "United States");servletContext.setAttribute("countries", countries);}
}

ServletContextAttributeListener

当一个ServletContext范围的属性被添加、删除或者替换时,ServletContextAttributeListener接口的实现类会接收到消息。这个接口定义了如下三个方法:

void attributeAdded(ServletContextAttributeEvent event);void attributeRemoved(ServletContextAttributeEvent event);void attributeReplaced(ServletContextAttributeEvent event);

attributeAdded方法在一个ServletContext范围属性被添加时被容器调用。attributeRemoved方法在一个ServletContext范围属性被删除时被容器调用。而attributeReplaced方法在一个ServletContext范围属性被新的替换时被容器调用。
这三个方法都能获取到一个ServletConextAttributeEvent对象,通过这个对象可以后期属性的名称和值。
ServletContextAttributeEvent类继承自ServletContextAttribue,并且增加了下面两个方法,分别用于获取该属性的名称和值:

java.lang.String getName();java.lang.Object getValue();

Session Listeners

一共有4个HttpSession相关的监听器接口:HttpSessionListener,HttpSessionActivationListener,HttpSessionAttributeListener和HttpSessionBindingListener。这四个接口都在javax.servlet.http包中。

HttpSessionListener

当一个HttpSession创建或者销毁时,容器都会通知所有的HttpSessionListener监听器,HttpSessionListener接口有两个方法:SessionCreated和sessionDestroyed:

void sessionCreated(HttpSessionEvent event);
void sessionDestroyed(HttpSessionEvent event);

这两个方法都可以接收到一个继承与java.util.Event的HttpSessionEvent对象。可以通过调用HttpSessionEvent对象的getSession方法来获取当前的HttpSession。getSession方法如下:

HttpSession getSession();

下面的示例是一个HttpSessionListener监听器。这个监听器来统计HtttpSession的数量。它使用了一个AtomiInteger对象来统计,并且将这个对象保存成ServletContext范围的属性。每当有一个HttpSession被创建时,这个AtomicInteger对象都会加一。每当有一个HttpSession被销毁时,这个AtomicInteger对象就会减一。所以这个对象会保存着当前存活的HttpSession数量。这里使用了AtomicInteger来代替Integer类型是为了保证能同步进行加减的操作。

package com.study.servletstudy;import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import java.util.concurrent.atomic.AtomicInteger;/*** @Description : Session监听器* @Version : V1.0.0* @Date : 2021/11/30 21:20*/
@WebListener
public class SessionListener implements HttpSessionListener, ServletContextListener {@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {ServletContext servletContext = servletContextEvent.getServletContext();servletContext.setAttribute("userCount", new AtomicInteger());}@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {}@Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();ServletContext servletContext = session.getServletContext();AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCount");int userCount = userCounter.incrementAndGet();System.out.println("userCount incremented to :" + userCount);}@Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {HttpSession session = httpSessionEvent.getSession();ServletContext servletContext = session.getServletContext();AtomicInteger userCounter = (AtomicInteger) servletContext.getAttribute("userCount");int userCount = userCounter.decrementAndGet();System.out.println("userCount decremented to :" + userCount);}
}

sessionCreated方法在每个HttpSession创建时被调用。
sessionDestroyed方法会在HttpSession销毁之前被调用。

浏览器调用URL:http://localhost:8080/servletStudy/
控制台打印如下信息:

userCount incremented to :1

用同一个浏览器再次访问这个URL并不会改变userCounter,因为这属于同一个HttpSession。使用不同的浏览器访问才能增加userCounter的值。
如果你所有时间等待HttpSession过期的话,在控制台也能看到HttpSession销毁时打印的信息。

HttpSessionAttributeListener

HttpSessionAttributeListener接口和ServletContextAttributeListener类似,它响应的是HttpSession范围属性的添加、删除和替换。
HttpSessionAttributeListener接口有一下方法:

void attributeAdded(HttpSessionBindingEvent event);
void attributeRemoved(HttpSessionBindingEvent event);
void attributeReplaced(HttpSessionBindingEvent event);

attributeAdded方法在一个HttpSession范围属性被添加时被容器调用。attributeRemoved方法在一个HttpSession范围属性被删除时被容器调用。而attributeReplaced方法在一个HttpSession范围属性被新的替换时被容器调用。
这三个方法都能获取到一个HttpSessionBindingEvent的对象,通过对象可以获取获取属性的名称和值:

java.lang.String getName();
java.lang.Object getValue();

由于HttpSessionBindingEvent是HttpSessionEvent的子类,因此也可以在HttpSessionAttributeListener实现类中获得HttpSession。

HttpSessionActivationListener

在分布式环境下,会用多个容器来进行负载均衡,有可能需要将session保存起来,在容器之间传递。
例如当一个容器内存不足时,会把很少用到的对象转存到其他容器上。这时候,容器就会通知所有HttpSessionActivationListener接口的实现类。
HttpSessionActivationListener接口有两个方法:

// 激活
void sessionDidActivate(HttpSessionEvent event);// 去激活
void sessionWillPassivate(HttpSessionEvent event);

当HttpSession被转移到其他容器之后,sessionDidActive方法会被调用。容器将一个HttpSessionEvent方法传递到方法里,可以从这个对象获得HttpSessiion。
当一个HttpSession将要失效时,容器会调用sessionWillPassivate方法。和sessionDidActivate方法一样,容器将一个HttpSessionEvent方法传递到方法里,可以从这个对象获得HttpSession。

HttpSessionBindingListener

当有属性绑定或者解绑定到HttpSession上时,HttpSessionBindingListener监听器会被调用,如果对HttpSession属性的绑定和解绑懂得感兴趣,就可以实现HttpSessionBindingListener来监听。例如可以在HttpSession属性绑定时更新状态,或者在属性解绑是释放资源。
HttpSessionBindingListener接口有两个方法:

void valueBound(HttpSessionBindingEvent event);
void valueUnBound(HttpSessionBindingEvent event);

ServletRequest Listeners

ServletRequest范围的监听器接口有三个:ServletRequestListener、ServletRequestAttributeListener和AsyncListener。

ServletRequestListener

ServletRequestListener监听器会对ServletRequest的创建和销毁事件进行响应。容器会通过一个池来存放并重复利用多个ServletRequest,ServletRequest的创建时从容器池里被分配出来的时刻开始,而它的销毁时刻是放回容器池里的时间。
ServletRequestListener接口有两个方法,requestInitialized和requestDestroyed:

void requestInitialized(ServletRequestEvent event);
void requestDestroyed(ServletRequestEvent event);

当一个 ServletRequest创建(从容器池里取出)时,requestInitialized方法会被调用,当ServletRequest销毁(被容器回收)时,requestDestroyed方法会被调用。这两个方法都会接收到一个ServletRequestEvent对象,可以通过使用这个对象的getServletRequest方法来获取ServletRequest对象:

ServletRequest getServletRequest();

另外,ServletRequestEvent接口也提供了一个getServletContext方法来获取ServletContext,如下所示:

ServletContext getServletContext();

ServletRequstAttributeListener

当一个ServletRequest范围的属性被添加、删除或替换时,ServletRequestAttributeListener接口会被调用。ServletRequestAttributeListener接口提供了三个方法:attributeAdded、attributeReplaced、attributeRemoved。

void attributeAdded(ServletRequestAttributeEvent event);
void attributeRemoved(ServletRequestAttributeEvent event);
void attributeReplaced(ServletRequestAttributeEvent event);

这些方法都可以获得一个继承自ServletRequestEvent的ServletRequestAttributeEvent对象。通过ServletRequestAttributeEvent类提供的getName和getValue方法可以访问到属性的名称和值:

java.lang.String getName();
java.lang.Object getValue();

小结

Servlet API提供了多个监听器类型。这些监听器可以分层三类:application范围、session范围和request范围。监听器的使用很简单,可以通过两种方式注册监听器:在实现类上使用@WebListener注解或者在部署描述文件中增加listener元素。
Servlet3.0新增了一个监听器接口javax.servlet.AsycListener。

这篇关于监听器-Servlets(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

监听器(Listener)使用详情

https://www.cnblogs.com/xdp-gacl/p/3969249.html 孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十五)——监听器(Listener)学习二 一、监听域对象中属性的变更的监听器   域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest

JavaWeb 监听器和过滤器

超详细的Java知识点路线图 监听器 可以监听Web项目中各种对象的状态变化,如:网站的启动和停止、Session的创建和销毁、Session中属性的添加和删除,然后根据对象的状态变化自动调用监听器中的方法。 应用场景: 网站启动后做预先工作,如:加载缓存加载配置文件,如:Spring通过监听器对配置进行加载 常用的监听器: ServletContextListener 监听网站的

class 4: vue.js 3监听器 watch

某些情况下需要监听某个响应式数据的变化,这时就需要使用监听器(watch)来实现了 watch的使用语法如下 选项:watch类型:{ [key: string]: string | Function | Object | Array}详解:watch属性是一个对象,该对象的键(key)是需要观察的表达式, 值(value)可以是回调函数、方法名等。Vue.js 3实例会在实例化时调用$wat

JavaWeb-Session、cookie、过滤器、监听器

文章目录 1 Session和Cookie1.1 Cookie1.1.2 Cookie的应⽤1.1.2.1 保持⽤户登录状态1.1.2.2 记录⽤户名 1.1.3 具体方法1.1.4 实现案例1.1.5 cookie的相关方法 1.2 Session1.3 session和cookie的区别(面试会考) 2 Filter过滤器2.1 定义2.2 语法格式2.3 使用场景2.3.1 设置每个r

SpringBoot基础篇(六)监听器Listener使用

待完善................................ 根据监听的事件,可以把监听器分为三类: (1)监听对象创建与销毁,如ServletContextListener ; (2)监听对象域中属性的增加和删除,如:HttpSessionListener和ServletRequestListener; (3)监听绑定到Session上的某个对象的状态,如ServletCont

JAVAWEB开发之分页显示、批量删除、条件查询 以及Listener监听器

customer信息操作  添加 批量删除 简单条件查询 分页显示 (1)添加操作   问题:id是varchar类型,如何获取?          使用UUID工具类获取 完成添加操作  1.在showCustomer.jsp页面上添加一个连接,可以直接访问到添加页面 add.jsp  2.创建add.jsp 2.1.关于生日的日历组件 2.2.1.

springboot监听器的使用,为什么不直接调用或开异步

结论:使用监听器是为了更好的实现观察者模式,实现代码的解耦 参考:SpringBoot事件监听机制及观察者/发布订阅模式详解

【规范】Servlets和JSP的比较

SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML非常不方便。后来SUN推出了类似于ASP的镶嵌型的JSP,把JSPTAG镶嵌到HTML语中,这样,就大大简化和方便了网页的设计和修改。新型的网络语言ASP,PHP,JSP都是镶嵌型的SCRIPT语言。     从网络三层结构的

SpringBoot集成kafka-监听器手动确认接收消息(主要为了保证业务完成后再确认接收)

SpringBoot集成kafka-监听器手动确认接收消息 1、说明2、示例2.1、application.yml2.2、消费者2.3、生产者2.4、测试类2.5、测试 1、说明 kafak中默认情况下是自动确认消息接收的,也就是说先启动消费者监听程序,再启动生产者发送消息,此时消费者监听到生产者发送的消息后,程序会自动确认接收成功,偏移量会自动下移,此时再启动消费者,偏移量会

JavaWeb学习——Listner监听器

一、监听器Listener 1.什么是监听器?   监听器就是监听某个对象的的状态变化的组件   监听器的相关概念:     事件源:被监听的对象 ----- 三个域对象 request session servletContext     监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 ---- 6+2       注册监听器:将监听器与事件源进行绑定       响应行为:监听器