监听器Listener

监听器(Listener)

概述

监听器(Listener)是一种特殊的Servlet技术, 它可以监听Web应用的上下文信息、Servlet请求信息和Servlet会话信息, 即ServletContext、ServletRequest、HTTPSession。并根据不同情况, 在后台调用响应的处理程序。 利用监听器对Web应用进行监听和控制,来增强Web应用的事件处理能力。

分类

按监听对象划分:

  • ServletContext对象监听器
  • ServletRequest对象监听器
  • HTTPSession对象监听器

按监听事件划分:

  • 对象自身的创建和销毁的监听器
  • 对象中属性的增加、消除和替换的监听器
  • session中的某个对象的状态变化的监听器
1.监听ServletContext对象(对应application对象)

可以监听到ServletContext对象中属性的创建、删除和修改操作。常用监听方法:

接口名称接口方法激发条件
ServletContextAttributeListenerpublic void attributeAdded(ServletContextAttributeEvent scab);增加属性
public void attributeRemoved(ServletContextAttributeEvent scab);删除属性
public void attributeRepalced(ServletContextAttributeEvent scab);修改属性
ServletContextListenerpublic void contextInitialized(ServletContextEvent sce);创建对象
public void contextDestroyed(ServletContextEvent sce);销毁对象
2.监听会话(HTTPSession对象)(对应session对象)

可以监听到HTTPSession对象中属性的创建、删除和修改操作.也可以监听HTTPSession对象本身的创建和销毁,以及

接口名称接口方法激发条件
HttpSessionAttributeListenerpublic attributeAdded(HttpSessionBindingEvent se);增加属性
public void attributeRemoved(HttpSessionBindingEvent se);删除属性
public void attributeReplaced(HttpSessionBindingEvent se);修改属性
HttpSessionListenerpublic void sessionCreated(HttpSessionEvent se);创建对象
public void sessionDestroyed(HttpSessionEvent se);销毁对象
HttpSessionActivationListenerpublic void sessionDidActivate(HttpSessionEvent se);会话刚被激活
public void sessionWillPssivate(HttpSessionEvent se)会话将要钝化
HttpSessionBindingListenerpublic void valueBound(HttpSessionBindingEvent se);调用setAttribute()
public void valueUnbound(HttpSessionBindingEvent se);调用removeAttribute()
注意:

活化(Activate)和钝化(Passivate)是Web容器为了更好地利用系统资源或者进行服务器负载平衡等原因而对特定对象采取的措施。
会话对象的钝化是指暂时将会话对象通过序列化的方法存储到硬盘上;
活化与钝化相反,是把硬盘上存储的会话对象重新加载到Web容器中。
session的销毁有两种情况
(1)session超时,web.xml配置:

<session-config>
        <session-timeout>120</session-timeout><!--session120分钟后超时销毁-->
    </session-config>

(2)手动方式:

public void invalidate();//使session失效方法。session.invalidate();
3.监听请求( ServletRequest对象 )( 对应request对象)

能够监听到ServletRequest对象中属性的增加、删除和修改操作, 也可以监听到ServletRequest对象本身的增加和删除, 常用方法:

接口名称接口方法激发条件
ServletRequestAttributeListenerpublic void attributeAdded(ServletRequestAttributeEvent srae);增加属性
public void attributeRemoved(ServletRequestAttributeEvent srae);删除属性
public void attributeReplaced(ServletRequestAttributeEvent srae);修改属性
ServletRequestListenerpublic void requestInitialized(ServletRequestEvent sre);创建对象
public void requestDestroyed(ServletRequestEvent sre);销毁对象

监听器的启动顺序

1)当有多个监听器时,按各监听器在web.xml中配置的顺序进行先后顺序启动。
2)相较于过滤器、Servlet的启动顺序是:监听器>过滤器>Servlet

实例:

实现在线人数的统计

实现对应接口的监听器类:

package com.xzk.web;

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

/**
 * @Author: lqk
 * @Description:
 * @Date Created in 2020-07-04 9:03
 * @Modified By:
 */
public class ListenerServlet implements HttpSessionListener {

    //存储当前在线人数
    private static int count = 0;

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        count++;
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        if(count>0) {
            count--;
        }
    }

    public static int getCount(){
        return count;
    }
}

web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <listener>
        <listener-class>com.xzk.web.ListenerServlet</listener-class>
    </listener>
</web-app>

jsp页面:

<%@ page import="com.xzk.web.ListenerServlet" %><%--
  Created by IntelliJ IDEA.
  User: lqk
  Date: 2020/7/4
  Time: 9:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.xzk.web.*" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  在线人数:<%=ListenerServlet.getCount()%>
  </body>
</html>

问题

使用IDEA自动启动浏览器 显示在线人数是3 ??
解决 关掉自动启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值