Java Web(五) 监听器Listener

监听器概述

在上一篇里介绍了过滤器Filter,而Listener是Servlet的另一个高级特性。Listener用于监听Java Web程序中的事件,例如创建,修改,删除Session,request,context等,并触发相应的事件。Listener主要用于对Session,request,context等进行监控,目前共有8种Listener,分别完成对不同事件的监听。

使用Listener不需要关注事件是怎样触发的或者怎么调用相应的Listener,只要记住该类事件触发时一定会调用相应的Listener。你只需要在Lisener里编写相关的代码就可以。

Servlet3.0以前需要在web.xml中配置,之后直接用@WebListener()注解即可。

<listener>
  <listener-class>listener.TestListener</listener-class>
</listener>

监听对象的创建与销毁

HttpSessionListener,ServletContextListener,ServletRequestListener分别用来监控Session,context,request的创建于销毁。触发时机为:

  • HttpSessionListener:创建Session时执行sessionCreatedf方法,超时或者执行session.invalidate()时执行sessionDestroy方法。该Listener可用于收集在线者信息。
  • ServletContextListener:服务器启动或者热部署war包时执行contextInitialized方法。服务器关闭时执行contextDestroyed方法。该Listener可用于启动时获取web.xml里配置的初始化参数。
  • ServletRequest:用户每次请求时都会执行requestInitialized方法。request处理完毕自动销毁前执行requestDestroyed方法。

实例:因为java可以继承多个接口,所以用一个类继承这三个接口即可。

package listener; 

/**
 * Created by kindleheart happily.
 */
import javax.servlet.*;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class TestListener implements ServletContextListener, HttpSessionListener, ServletRequestListener {
    public TestListener() {
    }

    //加载context上下文时被调用
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("即将启动" + servletContext.getContextPath());
    }
    //销毁context上下文时被调用
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContext servletContext = sce.getServletContext();
        System.out.println("即将关闭" + servletContext.getContextPath());
    }
    //创建Session时被调用
    public void sessionCreated(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("新创建一个Session,ID为:" + session.getId());
    }
    //销毁Session时被调用
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println("销毁一个Session,ID为:" + session.getId());
    }
    //创建request时被调用
    public void requestInitialized(ServletRequestEvent sre) {
        //存储创建request时的时间
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        request.setAttribute("dateCrated", System.currentTimeMillis());
    }
    //销毁request时被调用
    public void requestDestroyed(ServletRequestEvent sre) {
        //计算该请求所需时间
        HttpServletRequest request = (HttpServletRequest) sre.getServletRequest();
        long time = System.currentTimeMillis() - (Long)request.getAttribute("dateCrated");
        System.out.println("请求处理结束,用时" + time + "毫秒");
    }

}

监听对象属性的变化

HttpSessionAttributeListener,ServletContextAttributeListener,ServletRequestAttributeListener分别用来监控Session,context,request的属性变化。在向监听对象添加,更新,移除属性时,会分别执行xxxAdded(),xxxReplaced(),xxxRemoved()方法,xxx分别代表Session,context,request。

/**
 * Created by kindleheart happily.
 */
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.*;

@WebListener
public class SessionAttributeListenerTest implements HttpSessionAttributeListener {
    public SessionAttributeListenerTest() { }

    public void attributeAdded(HttpSessionBindingEvent sbe) {
        HttpSession session = sbe.getSession();
        String name= sbe.getName();    //新添加的属性名
        System.out.println("新建Session属性:" + name + ",值为:" + sbe.getValue());
    }

    public void attributeRemoved(HttpSessionBindingEvent sbe) {
        HttpSession session = sbe.getSession();
        String name= sbe.getName();    //即将删除的属性名
        System.out.println("删除Session属性:" + name + ",值为:" + sbe.getValue());
    }

    public void attributeReplaced(HttpSessionBindingEvent sbe) {
        HttpSession session = sbe.getSession();
        String name= sbe.getName();    //发生修改的属性名
        Object oldValue = sbe.getValue();   //原来的属性值
        System.out.println("修改Session属性:" + name + ",旧值为:" + oldValue +"新值为:" + session.getAttribute(name));
    }
}

监听Session内的对象

除了上面6种Listener,另外还有两种Listener用于监控Session内的对象,分别是HttpSessionBindingListener与HttpSessionActivationListener。他们触发的时机为:

  • HttpSessionBindingListener:当监听对象与Session绑定时执行valueBound方法,解绑时执行valueUnbound方法。
  • HttpSessionActivationListener:服务器关闭时,会将Session里的内容保存到硬盘上,这个过程称为钝化,执行sessionWillPassivate方法。服务器重新启动时,会将Session内容从硬盘上重新加载,会执行sessonDidActivate方法。

案例:把User对象与Session绑定时,就会执行相应的方法。

package model;
/**
 * Created by kindleheart happily.
 */

import javax.servlet.http.*;

public class User implements HttpSessionBindingListener, HttpSessionActivationListener {
    private String name;
    private int age;

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

    public User() {
    }

    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 sessionWillPassivate(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println(this + "已经成功从硬盘加载。SessionId:" + session.getId());
    }

    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        HttpSession session = se.getSession();
        System.out.println(this + "即将保存到硬盘。SessionId:" + session.getId());
    }

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        HttpSession session = event.getSession();
        String name = event.getName();
        System.out.println(this + "被绑定到Session" + session.getId() + "的" + name + "属性上");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        HttpSession session = event.getSession();
        String name = event.getName();
        System.out.println(this + "被从Session" + session.getId() + "的" + name + "属性上移除");
    }
}

应用:统计在线人数

用户第一次访问服务器时,服务器会创建一个Session,用户结束访问时会销毁这个Session,那么可以使用HttpSessionListener来统计在线人数。

package util;
/**
 * Created by kindleheart happily.
 */

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionBindingEvent;

@WebListener()
public class OnlineNumListener implements HttpSessionListener {
    private static int userNum = 0;

    public OnlineNumListener() {
    }

    public static int getUserNum() {
        return userNum;
    }

    public void sessionCreated(HttpSessionEvent se) {
        userNum++;
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        userNum--;
    }
}

 在主页显示在线人数:

<%@ page import="util.OnlineNumListener" %>
<%@page pageEncoding="utf-8" contentType="text/html; utf-8" language="java" isELIgnored="false" %>
<html>
<body>
<h2>我是主页</h2>
<%
    int num = OnlineNumListener.getUserNum();
%>
<h3>在线人数为:</h3>><%=num%>
</body>
</html>

原文地址:https://www.cnblogs.com/kindleheart/p/9780787.html

时间: 2024-10-03 10:20:53

Java Web(五) 监听器Listener的相关文章

java web用监听器listener简单的实现在线统计人数

今天又重新学习了java web的基础 监听器技术,用sessionListener简单的实现了网页统计在线人数 (有一个bug就是当关闭网页的时候 session不会关闭依旧存在,除非关闭服务器),代码如下(前端网页代码就不显示了): LoginServlet.java: 1 import javax.servlet.ServletException; 2 import javax.servlet.annotation.WebServlet; 3 import javax.servlet.ht

【java web】监听器listener

一.简介 Java的监听器,也是系统级别的监听.监听器随web应用的启动而启动.Java的监听器在c/s模式里面经常用到,它会对特定的事件产生产生一个处理.监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数. 1.1 监听器分类 1) 按监听的对象划分,可以分为: ServletContext对象监听器 HttpSession对象监听器 ServletRequest对象监听器 2)按监听的事件划分 对象自身的创建和销毁的监听器 对象中属性的创建和消除的监

Java Web 之 Servlet - Listener、Filter、Decorator 精辟

Listener-监听器 Listener为在Java Web中进行事件驱动编程提供了一整套事件类和监听器接口.Listener监听的事件源分为ServletContext/HttpSession/ServletRequest三个级别: ServletContext级别 Listener 场景 ServletContextListener 响应ServletContext生命周期事件(创建/销毁),在ServletContext创建/销毁时分别调用其相应的方法. ServletContextAt

javaweb学习总结(四十五)——监听器(Listener)学习二

一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换

java中的监听器(listener)

监听器在java应用中比较广泛,记得web启动的时候的监听器吗,记得spring配置中的监听器吗?,记得消息传输中的监听器吗? 没错,这就是listener的应用,无处不在,身为一个java程序员,你如果不懂的监听器的原理是不是很可悲啊,没错我感觉挺可悲的(因为我刚刚才了解到监听器的工作原理), 为了纪念自己取得的一点小小的success,写篇博文记录一下自己的一些不成熟的意见和理解 监听器,就我理解就和我们日常生活中的原始概念一样,就是监听事物的一些行为.举个例子,抗战时期,发现一个国民党特务

JavaWeb学习 (二十五)————监听器(Listener)

一.监听器介绍 1.1.监听器的概念 监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动.监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行. 1.2.监听器案例--监听window窗口的事件监听器 1 package me.gacl.listener.demo; 2 3 import java.awt.Fram

Java Web之监听器

监听器的使用: * 作用: * 监听作用域对象request.session.application的创建.销毁和内容的改变 * 使用: * 创建一个实现了指定接口的java类 * 监听request--->ServletRequestListener 监听request对象的创建和销毁 * requestInitialized(ServletRequestEvent sre)//创建 * requestDestroyed(ServletRequestEvent sre)//销毁 * 注意: *

Java Web(五) JSP详解(四大作用域九大内置对象等)

前面讲解了Servlet,了解了Servlet的继承结构,生命周期等,并且在其中的ServletConfig和ServletContext对象有了一些比较详细的了解,但是我们会发现在Servlet中编写一些HTML代码,是很不方便的一件事情,每次都需要out.println(HTML); 因此就出现了JSP,来解决这样的问题,JSP中的内容就是html,但是能够嵌套java语言,现在来详细了解一下JSP. --WH 一.JSP 1.什么是JSP? JSP(Java Server Pages):是

web.xml监听器 - listener

(面向事件编程概念) <listener> <listener-class>com.kiqi.listener.MyListener</listener-class> </listener> 一.监听器类型 1.Listener是Servlet的监听器 2.可以监听客户端的请求.服务端的操作等. 3.通过监听器,可以自动激发一些操作,如监听在线用户数量,当增加一个HttpSession时,给在线人数加1. 4.编写监听器需要实现相应的接口 5.编写完成后在w