Javaweb——监听器

目录:

一. 定义
二. 步骤
三. 启动顺序
四. 分类
五. Servlet3.0下使用
六. 统计在线人数实例

一、定义:

是指专门用于对其他对象身上发生的事件或状态改变进行监听和处理相应的对象,当被监视的对象发生状态变化时,立即采取相应的行动

二、创建步骤:

1、创建一个实现监听器接口的类
Javaweb——监听器_第1张图片
2、配置web.xml
这里写图片描述

三、启动顺序

监听器启动顺序根据在web.xml中注册的顺序
优先级:监听器>过滤器>Servlet

四、分类

按监听的对象划分:
    1、用于监听应用程序环境对象:ServletContext
    2、用于监听用户会话对象:HttpSession
    3、用于监听请求消息对象:ServletRequest
按监听的事件划分:
    1、监听器自身的创建和销毁的事件监听器 
    2、监听域对象中属性的增加和删除的事件监听器
    3、监听绑定到HttpSession域中的某个对象的状态的事件监听器

1、监听器自身的创建和销毁的事件监听器

ServletContextListener
Javaweb——监听器_第2张图片
用途:定时器,定义全局属性变量
初始化:启动Tomcat时
销毁:关闭Tomcat时


HttpSessionListener
Javaweb——监听器_第3张图片
用途:统计在线人数、记录访问日志
创建:用户第一次打开浏览器访问此应用时
销毁:关闭服务器、session过期

注:设置Session有效时间:默认为30分钟
1、session.setMaxInactiveInterval(10);//单位秒
2、在web.xml中定义:单位分钟
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>

ServletRequestListener
Javaweb——监听器_第4张图片
用途:读取参数、记录访问历史
初始化:用户请求
销毁:用户请求结束

2、监听域对象中属性的增加和删除的事件监听器

ServletContextAttributeListener
Javaweb——监听器_第5张图片


HttpSessionAttributeListener
Javaweb——监听器_第6张图片


ServletRequestAttributeListener
Javaweb——监听器_第7张图片

3、监听绑定到HttpSession域中的某个对象的状态的事件监听器

  • HttpSession中的对象状态:

绑定(set)–>解除绑定(remove)
钝化–>活化

  • Session的钝化机制:

Javaweb——监听器_第8张图片

  • 钝化本质:

本质就在于把服务器中不经常使用的session对象暂时序列化到系统文件或者数据库系统中,当被使用时反序列化到内存中,整个过程由服务器自动完成

  • Tomcat中两种session钝化管理器:session钝化由sessionManager管理

org.apache.catalina.session.standardManager


 - 当tomcat服务器被关闭或者重启时,tomcat服务器会将当前内存中的session对象钝化到服务器文件系统中
 - 另一种情况是,web应用程序被重新加载时,内存中的session对象也会钝化到服务器的文件系统中
 - 钝化后的文件系统被保存到:
     Tomcat安装路径/work/Catalina/hostname/applicationname/SESSION.ser

org.apache.catalina.session.Persistentmanager


 - 首先在钝化的基础上进行了扩张,第一种情况是如上面1,第二种情况如上面2,第三种情况,可以配置主流的内存的session对象数目,将不经常使用的session对象保存到文件系统或数据库,当用时在加载
 - 默认情况下,tomcat提供了两个钝化驱动类:
     org.apache.Catallina.FileStore/org.apache.Catallina.JDBCStore
  • 具体实现:两个接口

HttpSessionBindingListener:
绑定:valueBound
解除绑定:valueUnbound


HttpSessionActivationListener
钝化:sessionWillPassivate
活化:sessionDidActive

用实体类实现这两个接口:

package entity;

import java.io.Serializable;

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

public class User implements HttpSessionBindingListener, HttpSessionActivationListener, Serializable {

    private static final long serialVersionUID = 1L;

    private String name;

    public String getName() {
        return name;
    }

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

    public void valueBound(HttpSessionBindingEvent event) {
        System.out.println("valueBound Name: " + event.getName());
    }

    public void valueUnbound(HttpSessionBindingEvent event) {
        System.out.println("valueUnbound Name: " + event.getName());
    }

    public void sessionWillPassivate(HttpSessionEvent se) {
        System.out.println("sessionWillPassivate: " + se.getSource());
    }

    public void sessionDidActivate(HttpSessionEvent se) {
        System.out.println("sessionDidActivate: " + se.getSource());
    }

}

五、Servlet3.0下使用

不需要在web.xml中注册,只需要在类前声明
这里写图片描述

六、统计在线人数实例:

Javaweb监听器实例——统计在线人数


你可能感兴趣的:(JavaWeb)