Listener监听器

1.1 基本概念

  • Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
  • 底层原理是采用接口回调的方式实现。

1.2 基本分类

监听器类型 作用
javax.servlet.ServletRequestListener 监听request作用域的创建和销毁
javax.servlet.ServletRequestAttributeListener 监听request作用域的属性状态变化
javax.servlet.http.HttpSessionListener 监听session作用域的创建和销毁
javax.servlet.http.HttpSessionAttributeListener 监听session作用域的属性状态变化
javax.servlet.ServletContextListener 监听application作用域的创建和销毁
javax.servlet.ServletContextAttributeListener 监听application作用域的属性状态变化
javax.servlet.http.HttpSessionBindingListener 监听对象与session的绑定和解除

1.3 监听器详解

1.3.1 ServletRequestListener

  • 在ServletRequest创建和关闭时都会通知ServletRequestListener监听器。

常用方法

方法类型 作用
void requestInitialized(ServletRequestEvent sre) 实现ServletRequest对象的初始化
void requestDestroyed(ServletRequestEvent sre) 实现ServletRequest对象的销毁

代码示例

RequestListener

package cn.guardwhy.listener;

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

public class RequestListener01 implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("请求销毁了....");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("创建请求...");
    }
}

10.3.2 ServletRequestAttributeListener

  • 向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器。

常用方法

方法类型 作用
void attributeAdded(ServletRequestAttributeEvent srae) 增加属性时触发
void attributeReplaced(ServletRequestAttributeEvent srae) 修改属性时触发
void attributeRemoved(ServletRequestAttributeEvent srae) 删除属性时触发

代码示例

RequestAttributeListener

package cn.guardwhy.listener;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;

public class RequestAttributeListener02 implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("增加了属性:" + servletRequestAttributeEvent.getName());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("属性:" + servletRequestAttributeEvent.getName() + "被删除了");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("修改属性:" + servletRequestAttributeEvent.getName());
    }
}

requestAttribute.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>属性状态的改变</title>
</head>
<body>
<%
// 1.实现属性的添加
request.setAttribute("name", "Curry");
// 2.修改属性修改
request.setAttribute("name", "Kobe");
// 3.删除属性
request.removeAttribute("name");
%>
</body>
</html>

web.xml

<listener>
    <listener-class>cn.guardwhy.listener.RequestAttributeListener02</listener-class>
</listener>

执行结果

1.3.3 HttpSessionListener

当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener监听器。

常用方法

方法类型 作用
void sessionCreated(HttpSessionEvent se) 当一个HttpSession对象被创建时会调用这个方法
voidsessionDestroyed(HttpSessionEvent se) 当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法

SessionListener

package cn.guardwhy.listener;

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

public class SessionListener03 implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        System.out.println("创建了session");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("销毁了session");
    }
}

web.xml

<!--监听器-->
<listener>
    <listener-class>cn.guardwhy.listener.SessionListener03</listener-class>
</listener>
<session-config>
    <session-timeout>1</session-timeout>
</session-config>

1.3.4 HttpSessionAttributeListener

  • HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器。

常用方法

方法类型 作用
void attributeAdded(HttpSessionBindingEvent se) 当往会话中加入一个属性的时候会调用这个方法
void attributeRemoved(HttpSessionBindingEvent se) 当从会话中删除一个属性的时候会调用这个方法
void attributeReplaced(HttpSessionBindingEvent se) 当改变会话中的属性的时候会调用这个方法

代码示例

SessionAttributeListener

package cn.guardwhy.listener;

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

public class SessionAttributeListener04 implements HttpSessionAttributeListener {
    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("增加了属性:" + httpSessionBindingEvent.getName());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("属性:" + httpSessionBindingEvent.getName() + "删除");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("修改属性:" + httpSessionBindingEvent.getName());
    }
}

requestAttribute.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>属性状态的改变</title>
</head>
<body>
<%
// 1.实现属性的添加
request.setAttribute("name", "Curry");
// 2.修改属性修改
request.setAttribute("name", "Kobe");
// 3.删除属性
request.removeAttribute("name");
%>
</body>
</html>

web.xml

<listener>
    <listener-class>cn.guardwhy.listener.SessionAttributeListener04</listener-class>
</listener>

执行结果

1.3.5 ServletContextListener

在ServletContext创建和关闭时都会通知ServletContextListener监听器。

常用方法

方法类型 作用
void contextInitialized(ServletContextEvent sce) 当ServletContext创建的时候,将会调用这个方法
void contextDestroyed(ServletContextEvent sce) 当ServletContext销毁的时候(例如关闭应用服务器或者重新加载应用),将会调用这个方法

代码示例

package cn.guardwhy.listener;

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

public class ContextListener05 implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象创建");
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext对象销毁");
    }
}

1.3. 6 ServletContextAttributeListener

向ServletContext添加、删除或者替换一个属性的时候,将会通知ServletContextAttributesListener监听器。

常用方法

方法类型 作用
void attributeAdded(ServletContextAttributeEvent scae) 往ServletContext中加入一个属性的时候触发
void attributeRemoved(ServletContextAttributeEvent scae) 从ServletContext中删除一个属性的时候触发
void attributeReplaced(ServletContextAttributeEvent scae) 改变ServletContext中属性的时候触发

代码示例

ServletContextAttributeListener

package cn.guardwhy.listener;

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

public class ContextAttributeListener06 implements ServletContextAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("增加了属性" + servletContextAttributeEvent.getName());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("属性" + servletContextAttributeEvent.getName() + "删除!");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println("修改属性" + servletContextAttributeEvent.getName());
    }
}

contextAttribute.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>ServletContext对象属性</title>
</head>
<body>
<%
// 1.添加属性
application.setAttribute("userName", "Curry");
// 2.修改属性
application.setAttribute("userName", "Kobe");
// 3.删除属性
application.removeAttribute("userName");
%>
</body>
</html>

web.xml

<listener>
    <listener-class>cn.guardwhy.listener.ContextAttributeListener06</listener-class>
</listener>

执行结果

1.3.7 HttpSessionBindingListener

HttpSession中绑定和解除绑定时,将会通知HttpSessionListener监听器。

方法类型 作用
void valueBound(HttpSessionBindingEvent event) 有对象绑定时调用该方法
void valueUnbound(HttpSessionBindingEvent event) 有对象解除绑定时调用该方法

代码示例

package cn.guardwhy.listener;

import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;

public class Student implements HttpSessionBindingListener {
    private String name;
    private int age;

    public Student() {

    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("对象绑定到session中" + httpSessionBindingEvent.getName());
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("解除绑定...");
    }
}

sessionBind.jsp

<%@ page import="cn.guardwhy.listener.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>session中对象的绑定和解除</title>
</head>
<body>
<%
// 创建Student对象
Student student = new Student();
student.setName("Curry");
student.setAge(21);
// 将对象与Session对象进行绑定
session.setAttribute("student", student);
// 解除绑定
session.removeAttribute("student");
%>
</body>
</html>

1.4 监听器混合使用

代码示例

OnlineUser

package cn.guardwhy.online;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class OnlineUser implements HttpSessionListener, ServletContextListener {
    // 1.声明全局变量
    private ServletContext servletContext = null;
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        servletContext = servletContextEvent.getServletContext();
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        servletContext = null;
    }

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("新用户上线");
        Object count = servletContext.getAttribute("count");
        // 2.若当前用户为第一,将全局对象中的属性设置为1
        if (null == count){
            servletContext.setAttribute("count", 1);
        }else {
            // 当前用户不是第一个用户,则将全局对象中原有的数据取出来加1后再设置进去
            Integer integer = (Integer) count;
            integer++;
            servletContext.setAttribute("count", integer);
        }
        System.out.println("当前在线用户数量:" + servletContext.getAttribute("count"));
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("用户已下线...");
    }
}

onlineUser.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>当前在线的用户数量</title>
</head>
<body>
<h3>在线用户人数:${applicationScope.count}</h3>
</body>
</html>

web.xml

<listener>
  <listener-class>cn.guardwhy.online.OnlineUser</listener-class>
</listener>

执行结果

posted @ 2021-10-28 18:36  guardwhy  阅读(54)  评论(0)    收藏  举报