Listener监听器

Listener 的作用是用于监听 web应用的创建和销毁,以及在其上attribute发生的变化。

web应用即ServletContext对象(jsp的隐式对象application)

除了对web应用的监听外,还能监听session和request的生命周期,以及他们的attribute发生的变化。

监听Context

对Context的监听分生命周期的监听,和Context上Attribute变化的监听两种。

监听Context

实现接口ServletContextListener

package listener;

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

public class ContextListener implements ServletContextListener{

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        System.out.println("web 应用销毁");
    }

    @Override
    public void contextInitialized(ServletContextEvent arg0) {
        System.out.println("web 应用初始化");
    }
}

web.xml 配置

    <listener>
        <listener-class>listener.ContextListener</listener-class>
    </listener>

测试

在启动tomcat以及当前web应用重载的时候可以观察到
web应用的自动重载需要如下前提:
1. 配置: server.xml中对应的<context配置 的属性 @reloadable="true"

<Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="true" />
  1. 某个servlet 发生了变化,导致这个web应用自动重启

编写ContextAttributeListener

package listener;

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

public class ContextAttributeListener implements ServletContextAttributeListener {

    @Override
    public void attributeAdded(ServletContextAttributeEvent e) {
        System.out.println("增加属性 ");
        System.out.println("属性是" + e.getName());
        System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent e) {
        System.out.println("移除属性");
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent e) {
        System.out.println("替换属性");
    }

}

配置web.xml

<listener>
    <listener-class>listener.ContextAttributeListener</listener-class>
</listener>

测试Context属性的增加、替换、移除

此处注意项目由过滤器过滤,需要先登录login.html

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>

<%
    // 故意造成Context 属性的增加、替换和移除
    application.setAttribute("test", 1);
    application.setAttribute("test", 2);
    application.removeAttribute("test");
%>

测试

http://127.0.0.1/testContext.jsp

监听Session(会话)

对Session的监听分生命周期的监听,和Session上Attribute变化的监听两种。

编写SessionListenter

package listener;

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

public class SessionListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent e) {
        System.out.println("监听到 session 创建,sessionid 是:" + e.getSession().getId());
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent e) {
        System.out.println("监听到session销毁,sessionid是:" + e.getSession().getId());
    }
}

web.xml 配置

<listener>
    <listener-class>listener.SessionListener</listener-class>
</listener>

测试

随意访问任意页面
如果是第一次访问,都会触发session创建,后续访问不会触发session的创建

关闭浏览器,再访问,也会触发session的创建。 但是有的浏览器,即便是关闭了,下一次打开,也会发送以前sessionid到服务器,这样服务器就不会创建新的session。

session的销毁不易观察到,一般说来服务器会设置session存活时间为30分钟。所以需要等待才能观察到销毁。

测试session情况,可以删掉以前的session文件(tomcat目录work\Catalina\localhost_\SESSIONS.ser)

编写 SessionAttributeListener

package listener;

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

public class SessionAttributeListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent e) {
        System.out.println("session 增加属性 ");
        System.out.println("属性是" + e.getName());
        System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent e) {
        System.out.println("session 移除属性 ");
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent e) {
        System.out.println("session 替换属性 ");
    }
}

配置web.xml

<listener>
    <listener-class>listener.SessionAttributeListener</listener-class>
</listener>   

测试testSession.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" %>

<%
    session.setAttribute("test", 1);
    session.setAttribute("test", 2);
    session.removeAttribute("test");
%>

测试

http://127.0.0.1/testSession.jsp

监听Request

对Request的监听分生命周期的监听,和Request上Attribute变化的监听两部分。

RequestListener

package servlet;

import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;

public class RequestListener implements ServletRequestListener, ServletRequestAttributeListener {

    @Override
    public void attributeAdded(ServletRequestAttributeEvent e) {
        System.out.println("request 增加属性 ");
        System.out.println("属性是" + e.getName());
        System.out.println("值是" + e.getValue());
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent arg0) {
        System.out.println("request 移除属性 ");
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent arg0) {
        System.out.println("request 替换属性 ");
    }

    @Override
    public void requestDestroyed(ServletRequestEvent arg0) {
        System.out.println("销毁了一个Request ");
    }

    @Override
    public void requestInitialized(ServletRequestEvent arg0) {
        System.out.println("创建了一个Request ");
    }

}

配置web.xml

<listener>
    <listener-class>listener.RequestListener</listener-class>
</listener>

测试

测试testRequest.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setAttribute("test", 1);
    request.setAttribute("test", 2);
    request.removeAttribute("test");
%>

访问

http://127.0.0.1/testRequest.jsp

借助Session监听器统计当前在线人数

OnlineNumberListener

package listener;

import javax.servlet.ServletContext;

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

public class OnlineNumberListener implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent e) {

        ServletContext application = e.getSession().getServletContext();

        Integer online_number = (Integer) application.getAttribute("online_number");

        if (null == online_number)
            online_number = 0;
        online_number++;
        application.setAttribute("online_number", online_number);

        System.out.println("新增一位在线用户");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent e) {

        ServletContext application = e.getSession().getServletContext();

        Integer online_number = (Integer) application.getAttribute("online_number");

        if(null==online_number){
            online_number = 0;
        }
        else
            online_number--;
        application.setAttribute("online_number", online_number);
        System.out.println("一位用户离线");
    }
}

web.xml

    <listener>
        <listener-class>listener.OnlineNumberListener</listener-class>
    </listener>

checkOnlineNumber.jsp

使用EL表达式

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="false"%>

 当前 在线人数 : ${online_number}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值