JavaWeb-监听器Listener

简介: 监听器Listener 1.功能 2.监听器分类 3.监听器的配置 4.ServletContext监听 5.HttpSession监听 6.ServletRequest监听

 

监听器Listener

1.功能

    1. 用于监听域对象ServletContext、HttpSession和ServletRequest的创建,与销毁事件
    2. 监听一个对象的事件,如果发生了某事件则可以执行相应的代码

    默认的优先级别:Listener>Filter>Servlet


    2.监听器分类

    由于事件的复杂性,监听器也有许多对应的监听器。总体上按照作用域可以分为以下三类

      1. Servlet上下文相关监听接口,包括ServletContextListener、ServletAttributeListener
      2. HTTP会话监听接口,包括HttpSessionListener、HttpActivationListener等
      3. Servlet请求监听接口,包括ServletRequestListener、ServletRequestAttributeListener

      3.监听器的配置

      1.通过xml配置

      <listener>
      <!--        在listener-class中输入具体的类的位置-->
              <listener-class>com.company.Listener.ListenerDemo1</listener-class>
          </listener>

      image.gif

      2.通过注解类配置

      @WebListener

      image.gif

      只需要填写@WebListener即可


      4.ServletContext监听

      通过实现ServletContext接口实现监听器功能

      1.生命周期监听

      ServletContext的生命周期监听,监听ServletContext对象的创建与销毁方法如下

      方法名 描述
      contextInitialized() 当ServletContext对象被创建时,容器会自动调用该方法。在这个方法中,你可以执行一些初始化操作,比如加载配置文件、建立数据库连接等。
      contextDestroyed() 当ServletContext对象被销毁时,容器会自动调用该方法。在这个方法中,你可以执行一些清理操作,比如释放资源、关闭数据库连接等。
      package com.company.Listener;
      import javax.servlet.ServletContextEvent;
      import javax.servlet.ServletContextListener;
      import javax.servlet.annotation.WebListener;
      //使用注解类配置
      @WebListener
      public class ListenerDemo1 implements ServletContextListener {
      //    在创建出ServletContext对象时候自动调用函数
          @Override
          public void contextInitialized(ServletContextEvent servletContextEvent) {
              System.out.println("监听到有ServletContext对象创建");
          }
      //    检测到ServletContext对象被销毁
          @Override
          public void contextDestroyed(ServletContextEvent servletContextEvent) {
              System.out.println("监听到有ServletContext对象被销毁");
          }
      }

      image.gif

      具体案例代码:

      创建ServletContext对象代码:

      package com.company;
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      @WebServlet("/ServletContextDemo1")
      public class ServletContextDemo1 extends HttpServlet{
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //        创建ServletContext对象
              ServletContext context = req.getServletContext();
              System.out.println("ServletContextDemo1被调用");
          }
      //        实现方法统一
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              this.doPost(req, resp);
          }
      }

      image.gif

      image.gif编辑

      image.gif编辑

      2.属性监听

      通过实现ServletContextAttributeListener接口实现监听属性的添加、替换、修改的功能,方法如下

      方法名 描述
      attributeAdded() 当向ServletContextHttpSessionServletRequest添加属性时,容器会自动调用该方法。在这个方法中,你可以对添加的属性进行处理。
      attributeReplaced() ServletContextHttpSessionServletRequest中的属性被替换时,容器会自动调用该方法。在这个方法中,你可以对替换后的属性进行处理。
      attributeRemoved() ServletContextHttpSessionServletRequest中的属性被移除时,容器会自动调用该方法。在这个方法中,你可以对移除的属性进行处理

      案例代码:

      监听器类代码

      package com.company.Listener;
      import javax.servlet.ServletContext;
      import javax.servlet.ServletContextAttributeEvent;
      import javax.servlet.ServletContextAttributeListener;
      import javax.servlet.annotation.WebListener;
      @WebListener
      public class ListenerDemo2 implements ServletContextAttributeListener {
      //    当新创建一个ServletContext对象时候调用
          @Override
          public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
      //        获取域对象
              ServletContext context = servletContextAttributeEvent.getServletContext();
      //        获取新增的域 名和值
              String name = servletContextAttributeEvent.getName();
              Object value = servletContextAttributeEvent.getValue();
      //        输出修改对象
              System.out.println("域对象"+context+"范围内增加了"+name+"值为"+value);
          }
      //    当ServletContext对象被移除的时候执行
          @Override
          public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
              ServletContext context = servletContextAttributeEvent.getServletContext();
              String name = servletContextAttributeEvent.getName();
              Object value = servletContextAttributeEvent.getValue();
              System.out.println("域对象"+context+"范围内删除了"+name+"值为"+value);
          }
          @Override
          public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
              ServletContext context = servletContextAttributeEvent.getServletContext();
              String name  = servletContextAttributeEvent.getName();
              Object value = servletContextAttributeEvent.getValue();
              System.out.println("域对象"+context+"范围内替换了"+name+"值为"+value);
          }
      }

      image.gif

      Servlet属性类代码

      package com.company;
      import javax.servlet.ServletContext;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import java.io.IOException;
      @WebServlet("/ServletContextDemo3")
      public class ServletContextDemo3 extends HttpServlet{
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
              ServletContext context = req.getServletContext();
      //        创建context域对象值
              context.setAttribute("msg","Hello");
      //        替换对象内容
              context.setAttribute("msg","你好");
      //        销毁对象
              context.removeAttribute("msg");
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              this.doPost(req, resp);
          }
      }

      image.gif

      image.gif编辑


      5.HttpSession监听

      通过实现接口HttpSessionListener实现HttpSession。HttpSession对象监听有三种方式,1.生命周期监听、2.属性监听、3.session监听

      1.生命周期监听

      方法名 描述
      sessionCreated() 当一个新的HttpSession对象被创建时,容器会自动调用该方法。在这个方法中,你可以对新创建的HttpSession对象进行处理。
      sessionDestroyed() 当一个HttpSession对象被销毁时,容器会自动调用该方法。在这个方法中,你可以对销毁的HttpSession对象进行处理。

      监听类代码

      package com.company.Listener;
      import javax.servlet.annotation.WebListener;
      import javax.servlet.http.HttpSessionEvent;
      import javax.servlet.http.HttpSessionListener;
      @WebListener
      public class ListenerDemo3 implements HttpSessionListener {
      //    当session被创建时候调用
          @Override
          public void sessionCreated(HttpSessionEvent httpSessionEvent) {
              System.out.println("监听到有session的创建");
          }
      //    当session被销毁时候调用
          @Override
          public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
              System.out.println("session已被销毁");
          }
      }

      image.gif

      Servlet实现代码

      package com.company;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      @WebServlet("/SessionListenerDemo1")
      public class SessionListenerDemo1 extends HttpServlet{
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      //        创建session
              HttpSession session = req.getSession();
              session.setAttribute("name","AlphaMilk");
      //        销毁session
              session.invalidate();
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              this.doPost(req, resp);
          }
      }

      image.gif

      image.gif编辑

      image.gif编辑

      2.属性监听

      案例代码:

      监听类

      package com.company.Listener;
      import javax.servlet.annotation.WebListener;
      import javax.servlet.http.HttpSessionAttributeListener;
      import javax.servlet.http.HttpSessionBindingEvent;
      @WebListener
      public class ListenerDemo4 implements HttpSessionAttributeListener {
      //    当session属性增加时候调用
          @Override
          public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
              System.out.println("Session添加了一个新的属性");
          }
      //    当session属性销毁时候调用
          @Override
          public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
              System.out.println("Session销毁了一个属性");
          }
      //    当session属性替换时候调用
          @Override
          public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
              System.out.println("Session替换了一个属性");
          }
      }

      image.gif

      Servlet实现类

      package com.company;
      import javax.servlet.ServletException;
      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      import java.io.IOException;
      @WebServlet("/SessionDemo5")
      public class SessionDemo5 extends HttpServlet{
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              HttpSession session = req.getSession();
      //        增加属性
              session.setAttribute("userName","AlphaMilk");
      //        属性覆盖
              session.setAttribute("userName","alpha");
      //        属性删除
              session.removeAttribute("userName");
          }
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              this.doPost(req, resp);
          }
      }

      image.gif

      image.gif编辑


      6.ServletRequest监听

      与上述几个接口类似,分别由生命周期监听与属性监听

      1.生命周期监听

      方法名 描述
      requestInitialized() 当一个ServletRequest对象被创建并初始化时,容器会自动调用该方法。在这个方法中,你可以对新创建的ServletRequest对象进行处理。
      requestDestroyed() 当一个ServletRequest对象被销毁时,容器会自动调用该方法。在这个方法中,你可以对销毁的ServletRequest对象进行处理。

      2.属性监听


      目录
      相关文章
      |
      2月前
      |
      设计模式 Java 关系型数据库
      【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
      本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
      431 37
      |
      1月前
      |
      前端开发 Java 应用服务中间件
      Javaweb学习
      【10月更文挑战第1天】Javaweb学习
      33 2
      |
      1月前
      |
      安全 Java Android开发
      JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
      JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
      54 5
      |
      1月前
      |
      分布式计算 Java Hadoop
      Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
      Hadoop-30 ZooKeeper集群 JavaAPI 客户端 POM Java操作ZK 监听节点 监听数据变化 创建节点 删除节点
      62 1
      |
      2月前
      |
      缓存 前端开发 Java
      【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
      Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
      【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
      |
      2月前
      |
      安全 Java Android开发
      JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
      JavaWeb解压缩漏洞之ZipSlip与Zip炸弹
      111 2
      |
      1月前
      |
      Java C#
      Java的监听处理事件--小球移动案例
      Java的监听处理事件--小球移动案例
      13 0
      |
      2月前
      |
      SQL JSON JavaScript
      JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
      Vue 指令、生命周期、this和$、vue脚手架进行模块化开发/ElementUI框架、综合案例,element商品列表展示增删改查
      JavaWeb基础9——VUE,Element&整合Javaweb的商品管理系统
      |
      8天前
      |
      Java 开发者
      Java多线程编程中的常见误区与最佳实践####
      本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
      |
      7天前
      |
      安全 Java 开发者
      Java 多线程并发控制:深入理解与实战应用
      《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
      下一篇
      无影云桌面