首页 > 编程语言 >Java登陆第三十一天——监听器

Java登陆第三十一天——监听器

时间:2024-01-19 23:44:46浏览次数:39  
标签:Java 第三十一 对象 scae 应用 public context 监听器

逻辑上与JS中的事件差不多。

被监视的对象触发某些情况,自动执行监听器。

不同于JS的事件,监听器只负责监听三大域对象的相关事件,例如:

  1. 域对象的创建

  2. 域对象的销毁

  3. 域对象数据增删改

八个监听器

Tomcat提供了八个监听器接口作为监听器的规范。

  1. 应用域域监听器

    • ServletContextListener ServletContextAttributeListener
  2. 会话域监听器

    • HttpSessionListener HttpSessionAttributeListener

    • HttpSessionBindingListener HttpSessionActivationListener

  3. 请求域监听器

    • ServletRequestListener ServletRequestAttributeListener

EventListener

所有监听器的父接口。(自定监听器要继承该接口)

监听器

监听器主要分为如下两类:

三大域对象 域对象创建与销毁监听器 域对象数据增删改
ServletContext ServletContextListener ServletContextAttributeListener
HttpSession HttpSessionListener HttpSessionAttributeListener
HttpServletRequest ServletRequestListener ServletRequestAttributeListener

之所以分为两类,是因为每一类监听器的功能都相似。择其一解析。

ServletContextListener

应用域对象创建与销毁的监听器

ServletContextListener 监听ServletContext对象的创建与销毁

public interface ServletContextListener extends EventListener {
    //应用域对象 创建(初始化) 执行的方法
    default void contextInitialized(ServletContextEvent sce) {
    }
    //应用域对象 销毁 执行的方法
    default void contextDestroyed(ServletContextEvent sce) {
    }
}

ServletContextEvent对象

ServletContextEvent主要是为了获取应用域对象。常用方法:

方法名 描述
public ServletContext getServletContext() 获取应用域对象

ServletContextAttributeListener

应用域对象数据增删改的监听器

ServletContextAttributeListener 监听ServletContext中数据的添加、移除和修改

public interface ServletContextAttributeListener extends EventListener {
    //应用域对象 添加 数据执行的方法
    default void attributeAdded(ServletContextAttributeEvent scae) {
    }
    //应用域对象 删除 数据执行的方法
    default void attributeRemoved(ServletContextAttributeEvent scae) {
    }
    //应用域对象 修改 数据执行的方法
    default void attributeReplaced(ServletContextAttributeEvent scae) {
    }
}

ServletContextAttributeEvent对象

ServletContextAttributeEvent主要是为了获取应用域对象中的数据。

同时,ServletContextAttributeEvent继承ServletContextEvent。
常用方法:

方法名 描述
public String getName() 获取数据名
public Object getValue() 获取数据值

在web.xml中配置监听器

   <listener>
       <listener-class>监听器全类名</listener-class>
   </listener>

使用注解配置监听器

单纯 @WebListener 即可

@WebListener
public class Test8scListener implements ServletContextListener{}

应用域对象创建与销毁的监听器栗子

Test8scListener

@WebListener
public class Test8scListener implements ServletContextListener{
    //应用域对象 创建(初始化) 执行的方法
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        System.out.println(context.hashCode()+"应用域对象初始化");
    }
    //应用域对象 销毁 执行的方法
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        System.out.println(context.hashCode()+"应用域对象销毁");
    }
}

启动并关闭一次项目,并查看控制台

//控制台输出,过滤了某些信息
1288035353应用域对象初始化
1288035353应用域对象销毁

应用域对象域对象数据增删改的监听器栗子

Test8scListener

@WebListener
public class Test8scListener implements ServletContextListener, ServletContextAttributeListener {
    //应用域对象 添加 数据执行的方法
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        ServletContext context = scae.getServletContext();
        System.out.println(context.hashCode()+"应用域添加了数据"+scae.getName()+":"+scae.getValue());
    }
    //应用域对象 删除 数据执行的方法
    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        ServletContext context = scae.getServletContext();
        System.out.println(context.hashCode()+"应用域删除了数据"+scae.getName()+":"+scae.getValue());
    }
    //应用域对象 修改 数据执行的方法
    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        ServletContext context = scae.getServletContext();
        Object oldValue = scae.getValue();//获取老数据
        Object newValue = context.getAttribute(scae.getName());//获取最新数据
        System.out.println(context.hashCode()+"应用域修改了数据"+scae.getName()+":"+oldValue+
        "为"+scae.getName()+":"+newValue);
    }
}

TestServlet8,新增数据

@WebServlet("/Test8add")
public class TestServlet8 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        context.setAttribute("temp","2023拜拜");
    }
}

TestServlet8B,修改数据

@WebServlet("/Test8replace")
public class TestServlet8B extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        context.setAttribute("temp","2024快乐");
    }
}

TestServlet8C,删除数据

@WebServlet("/Test8remove")
public class TestServlet8C extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = getServletContext();
        context.removeAttribute("temp");
    }
}

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test8add

//控制台输出
476940799应用域添加了数据temp:2023拜拜

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test8replace

//控制台输出
476940799应用域修改了数据temp:2023拜拜为temp:2024快乐

客户端请求URL:http://localhost:8080/JavaWeb_war_exploded/Test8remove

//控制台输出
476940799应用域删除了数据temp:2024快乐

特殊的监听器

会话域还有两个特殊的监听器这里不做介绍

  • HttpSessionBindingListener

  • HttpSessionActivationListener

标签:Java,第三十一,对象,scae,应用,public,context,监听器
From: https://www.cnblogs.com/rowbed/p/17975854

相关文章

  • 《Java实战(第2版)》PDF
    现代Java应用充分利用了微服务、反应式架构以及流式数据等创新设计。现代Java特性,譬如Lambda、流以及大家期待已久的Java模块系统让这些设计的实现极其便利。是时候更新技能工具箱了,只有这样,你才能从容应对迎面而来的种种挑战!本书通过透彻的示例和通俗的语言讲解了Java语言这些最激......
  • 《Java并发实现原理:JDK源码剖析》PDF
    《Java并发实现原理:JDK源码剖析》全面而系统地剖析了JavaConcurrent包中的每一个部分,对并发的实现原理进行了深刻的探讨。全书分为8章,第1章从最基础的多线程知识讲起,理清多线程中容易误解的知识点,探究背后的原理,包括内存重排序、happen-before、内存屏障等;第2~8章,从简单到复杂,逐......
  • java面向对象基础语法之两个对象的内存图
    一:概述在相关文章前面说明了一下一个对象的内存图,在这里将继续说明两个对象的内存图。二:具体说明<1>实例代码Student类publicclassStudent{Stringname;intage;Stringaddress;publicvoidstudy(){......
  • JAVA8 - 流 - 查找和匹配
    查找和匹配Dish类:packagecom.demo3;publicclassDish{privatefinalStringname;privatefinalbooleanvegetarian;//素食注意privatefinalintcalories;privatefinalTypetype;publicDish(Stringname,booleanvegetarian,intca......
  • Java多线程
    Java多线程名词解释程序(program)是为完成特定任务、用某种语言编写的一组指令集合。简单而言:就是自己写的代码进程(Process)进程是指运行中的程序,比如启动迅雷时,就启动了一个进程,操作系统就会为该进程分配内存空间。进程是程序的一次执行过程,或是正在运行的一个程序。是......
  • 《Java并发实现原理:JDK源码剖析》PDF
    《Java并发实现原理:JDK源码剖析》全面而系统地剖析了JavaConcurrent包中的每一个部分,对并发的实现原理进行了深刻的探讨。全书分为8章,第1章从最基础的多线程知识讲起,理清多线程中容易误解的知识点,探究背后的原理,包括内存重排序、happen-before、内存屏障等;第2~8章,从简单到复杂,逐......
  • Java学习日记 Day5 今天开始十点准时下班,身体是革命的本钱。。
    JavaSE:今天终于把集合结束了,这周尽量看完IO、多线程和网络编程吧。①Map的常用方法:基本还是增删改查的那些东西,挑重要的讲了。一个是keySet(),能过获取map中所有的key值,values()方法能够获取map中所有的数据值。但其实获取了key之后通过get(key)遍历也能获得属性值。②HashMap、Ta......
  • 细说JavaScript对象(JavaScript对象详解)
    在JavaScript中对象作为数据类型之一,它的数据结构区别于其余5中数据类型,从数据结构角度看对象就是数据值的几个,其书就结构就是若干组名值对,类似于其他语言中的哈希、散列关联数组等,但对象在JavaScript中不仅仅扮演着数据类型的角色,同时也是JavaScript语言的实现基础,可通过内置对......
  • 细说JavaScript函数(JavaScript函数详解)
    函数的作用就是封装一段JavaScript代码,让开发者可以通古简单的方式使用这段代码![细说JavaScript函数(JavaScript函数详解)](https://img-blog.csdnimg.cn/direct/9f5c340fdb0d4540a3bcb8e5e251e96b.png)一、函数的分类在几乎所有的编程语言中,都有函数这一概念,并且没中语言本身......
  • 细说JavaScript内置对象(JavaScript内置对象详解)
    ![细说JavaScript内置对象(JavaScript内置对象详解)](https://img-blog.csdnimg.cn/direct/69e530474ccf4835b58ecf810db1f348.png#pic_center)一、String对象任何一门语言都会有关于js字符串的介绍,一连串的字符组成一串,就构成了字符串。字符串的处理不存在生活中还是在计算机应......