14. JavaWeb 三大组件之监听器 Listener


14.1 官方文档

14.1.1 文档:java_ee_api_中英文对照版.chm

14.2 Listener 监听器介绍

  1. Listener 监听器它是 JavaWeb 的三大组件之一
  2. JavaWeb 的三大组件分别是:Servlet 程序、Listener 监听器、Filter 过滤器
  3. Listener 是 JavaEE 的规范,就是接口
  4. 监听器的作用是,监听某种变化(一般就是对象创建/销毁, 属性变化),触发对应方法完成相应的任务
  5. JavaWeb 中的监听器(共八个),目前最常用的是 ServletContextListener,后面案例演示

14.3 JavaWeb 的监听器

14.3.1 ServletContextListener 监听器

  1. 作用:监听 ServletContext 创建或销毁(当我们 Web 应用启动时,就会创建 ServletContext),即生命周期监听,应用场景:

    ① 加载初始化的配置文件,比如 spring 的配置文件
    ② 任务调度(配合定时器 Timer/TimerTask)

  2. 相关方法

void contextInitialized(ServletContextEvent sce) 创 建 Servletcontext 时 触 发 void
contextDestroyed(ServletContextEvent sce) 销毁 Servletcontext 
  1. 应用实例 创建 XjsServletContextListener.java
package com.xjs.listener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/**
 * @Author: 谢家升
 * @Date: 2022/3/13-03-13-22:57
 * @Version: 1.0
 */

/**
 * 解读:
 * 1.当一个类实现了 ServletContextListener
 * 2.该类就是一个监听器
 * 3.该类可以监听的事件 由该类实现的监听接口决定,比如 实现了 ServletContextListener ,
 *   则该类就可以监听 ServletContext 对象的创建和销毁,以此类推
 * 4.ServletContextListener 就是一个监听者
 * 5.当web应用启动时,就会产生 ServletContextEvent 事件,会调用监听器的对应的事件处理方法
 *   contextInitialized,同时会传递 事件对象
 * 6.程序员可以通过 ServletContextEvent 事件对象,来获取需要的信息,然后再进行业务处理
 * 7.tomcat怎么知道监听器存在? 因为我们需要在web.xml中配置
 */
public class XjsServletContextListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("XjsServletContextListener 监听到 " +
                servletContextEvent.getServletContext() + "被创建...");
        //如果我们获取到 ServletContext 对象,可以进行业务处理
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("XjsServletContextListener 监听到 " +
                servletContextEvent.getServletContext() + "被销毁...");
        //可以对 ServletContext 数据进行处理, 或者日志的管理...
    }
}

  1. 配置 web.xml

在这里插入图片描述

<listener>
        <listener-class>com.xjs.listener.XjsServletContextListener</listener-class>
</listener>
  1. 完成测试

14.3.2 ServletContextAttributeListener 监听器

  1. 作用:监听 ServletContext 属性变化
  2. 相关方法
void attributeAdded(ServletContextAttributeEvent event) 添加属性时调用
void attributeReplaced(ServletContextAttributeEvent event) 替换属性时调用
void attributeRemoved(ServletContextAttributeEvent event) 移除属性时调用
  1. 使用少,再举个例 (后面的监听器类似)
  • 创建 XjsServletContextAttributeListener
package com.xjs.listener;

import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;

/**
 * @Author: 谢家升
 * @Date: 2022/3/13-03-13-23:16
 * @Version: 1.0
 */
public class XjsServletContextAttributeListener implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("XjsServletContextAttributeListener" + "监听到添加属性: " +
                servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("XjsServletContextAttributeListener" + "监听到删除属性: " +
                servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("XjsServletContextAttributeListener" + "监听到替换/修改属性: " +
                servletContextAttributeEvent.getName() + "=" + servletContextAttributeEvent.getValue());
    }
}

  • 配置 web.xml
<listener>
        <listener-class>com.xjs.listener.XjsServletContextAttributeListener</listener-class>
    </listener>
  • 创建 HiServlet.java
package com.xjs.servlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * @Author: 谢家升
 * @Date: 2022/3/13-03-13-23:21
 * @Version: 1.0
 */
public class HiServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HiServlet 被调用...");

        //给servletContext 对象操作属性
        ServletContext servletContext = request.getServletContext();
        servletContext.setAttribute("name","谢家升");
        servletContext.setAttribute("name","小谢");
        servletContext.removeAttribute("name");

        //操作session
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(30);
        session.setAttribute("age",18);
        session.setAttribute("age",23);
        session.removeAttribute("age");

        //操作request
        request.setAttribute("job","java工程师");
        request.setAttribute("job","老板~~");
        request.removeAttribute("job");

        System.out.println("hiServlet 处理完毕...");

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}

  • 完成测试

14.3.3 其它监听器-使用较少

14.3.3.1 HttpSessionListener 监听器
  1. 作用:监听 Session 创建或销毁,即生命周期监听
  2. 相关方法
void sessionCreated(HttpSessionEvent se) 创 建 session 时 调 用 void
sessionDestroyed(HttpSessionEvent se)销毁 session 时调
  1. 使用方法和前面一样, 可以用于监控用户上线,离线
package com.xjs.listener;

import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/**
 * @Author: 谢家升
 * @Date: 2022/3/14-03-14-8:41
 * @Version: 1.0
 */
public class XjsHttpSessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        System.out.println("XjsHttpSessionListener 监听到创建session,id= " +
                session.getId());
        System.out.println(session.getId() +"用户上线");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        HttpSession session = httpSessionEvent.getSession();
        System.out.println("XjsHttpSessionListener 监听到销毁session,id= " +
                session.getId());
        System.out.println(session.getId() +"用户下线");
    }
}

14.3.3.2 HttpSessionAttributeListener 监听
  1. 作用:监听 Session 属性的变化
  2. 相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae) 移除属性时

  1. 使用少 , 使用方法和前面一样
package com.xjs.listener;

import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;

/**
 * @Author: 谢家升
 * @Date: 2022/3/14-03-14-8:52
 * @Version: 1.0
 */
public class XjsHttpSessionAttributeListener implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("XjsHttpSessionAttributeListener 监听到添加属性" +
                httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("XjsHttpSessionAttributeListener 监听到删除属性" +
                httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("XjsHttpSessionAttributeListener 监听到修改属性" +
                httpSessionBindingEvent.getName() + "=" +httpSessionBindingEvent.getValue());
    }
}

14.3.3.3 ServletRequestListener 监听器
  1. 作用:监听 Request 创建或销毁,即 Request 生命周期监听
  2. 相关方法
void requestInitialized(ServletRequestEvent sre) 创建 request 时
void requestDestroyed(ServletRequestEvent sre) 销毁 request 时
  1. 可以用来监控, 某个 IP 访问我们网站的频率, 日志记录 ,访问资源的情况
package com.xjs.listener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

/**
 * @Author: 谢家升
 * @Date: 2022/3/14-03-14-8:58
 * @Version: 1.0
 */
public class XjsHttpRequestListener implements ServletRequestListener {


    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        ServletRequest servletRequest = servletRequestEvent.getServletRequest();
        System.out.println("XjsHttpRequestListener 监听到 request对象被创建.." +
                servletRequest);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        ServletRequest servletRequest = servletRequestEvent.getServletRequest();
        System.out.println("XjsHttpRequestListener 监听到 request对象被销毁.." +
                servletRequest);
    }
}

14.3.3.4 ServletRequestAttributeListener 监听器
  1. 作用:监听 Request 属性变化
  2. 相关方法
void attributeAdded(ServletRequestAttributeEvent srae) 添加属性时
void attributeReplaced(ServletRequestAttributeEvent srae) 替换属性时
void attributeRemoved(ServletRequestAttributeEvent srae)移除属性时

  1. 使用方法和前面类似
package com.xjs.listener;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;

/**
 * @Author: 谢家升
 * @Date: 2022/3/14-03-14-9:06
 * @Version: 1.0
 */
public class XjsHttpRequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        ServletRequest servletRequest = servletRequestAttributeEvent.getServletRequest();
        System.out.println("XjsHttpRequestAttributeListener 监听到添加属性" +
                servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
        System.out.println("访问的IP= " + servletRequest.getRemoteAddr());
        System.out.println("访问的资源:" + ((HttpServletRequest)servletRequest).getRequestURI());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("XjsHttpRequestAttributeListener 监听到删除属性" +
                servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("XjsHttpRequestAttributeListener 监听到修改属性" +
                servletRequestAttributeEvent.getName() + "--"+ servletRequestAttributeEvent.getValue());
    }
}

14.3.3.5 HttpSessionBindingListener 感知监听器
14.3.3.6 HttpSessionActivationListener 感知监听
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要学就学灰太狼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值