监听器

作者: liangxifeng833 | 来源:发表于2017-02-12 17:48 被阅读25次

一.监听器定义

Paste_Image.png Paste_Image.png Paste_Image.png

二.web监听器的用途

Paste_Image.png

三.创建监听器

  • 创建一个实现监听器接口类( 实现的是ServletContextListener -javax.servlet接口)
package lxf.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class FirstListener implements ServletContextListener {

    @Override
    //web服务器关闭时候执行销毁方法
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        
        System.out.println("contextDestroyed");
    }

    @Override
    //web服务器启动时候执行创建初始化方法
    public void contextInitialized(ServletContextEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("contextInitialized");
    }
}
  • 注意:ServletContext是上下文对象,当web应用服务器启动时创建,当web应用服务器关闭时销毁;
  • 配置web.xml进行注册
  <listener>
    <listener-class>lxf.listener.FirstListener</listener-class>
  </listener>

四.监听器的启动顺序

  • 当web.xml中注册多个监听器,会按着注册的先后顺序启动
  • 当web.xml中注册监听器/servlet/过滤器,优先级: 监听器>过滤器>Servlet
Paste_Image.png

五.监听器的分类

  • 按着监听对象划分


    Paste_Image.png
  • 按着监听事件划分


    Paste_Image.png

ServletContext实现的是ServletContextListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/ContextListener.java

Paste_Image.png

HttpSession实现的是HttpSessionListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/MyHttpSessionListener.java

Paste_Image.png

ServletRequest监听实现的是ServletRequestListener -javax.servlet接口
具体代码请查看https://github.com/liangxifeng833/my_program/blob/master/java/jsp/firstListener/src/lxf/listener/MyServletRequestListener.java

Paste_Image.png Paste_Image.png

具体代码请查看
ServletContextAttributeListener
HttpSessionAttributeListener
ServletRequestAttributeListener

Paste_Image.png

具体代码请点击

session钝化是指将内存数据存到硬盘(内存->硬盘)
session活化是指从数据从( 硬盘->内存 )

Paste_Image.png

tomcat中两种sesssion钝化管理器

Paste_Image.png Paste_Image.png Paste_Image.png

因为是监听绑定到HttpSession域中的某个对象状态,所以要在具体的实体类中去实现HttpSessionBindingListener和HttpSessionActivationListener,所以也就不需要在web.xml中注册了,以下是对象绑定/解除绑定到session中,以及钝化活化的例子

1.在lxf.entity包下创建User实体类

package lxf.entity;
/*
 * 练习监听User对象绑定到HttpSession域中的事件状态
 */

import java.io.Serializable;

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

//session要活化必须实现Serializable接口
public class User implements HttpSessionBindingListener, HttpSessionActivationListener, Serializable{
    private String uName;
    private String passWord;
    
    public String getuName() {
        return uName;
    }
    public void setuName(String uName) {
        this.uName = uName;
    }
    public String getPassWord() {
        return passWord;
    }
    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    //将本类实例化后getSession().setAttibute()时触发
    public void valueBound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("User对象被绑定session中,key="+arg0.getName());
    }
    @Override
    //将本类实例化后getSession().removeAttibute()时触发
    public void valueUnbound(HttpSessionBindingEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("User对象在session中被解除绑定,key="+arg0.getName());
    }

    @Override
    //session钝化触发(也就是数据从内存 -> 硬盘),也就是session中已setAttribute值后,关闭tomcat会触发
    //输出:session钝化org.apache.catalina.session.StandardSessionFacade@58443af6
    //同时会在/usr/local/tomcat/work/Catalina/localhost/firstListener中生成SESSION.ser文件
    public void sessionWillPassivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("session钝化"+arg0.getSource());   
    }
    
    @Override
    //session活化触发(也就是数据从硬盘 ->内存 ),以上关闭tomcat后再启动tomcat会触发,
    //输出:session活化org.apache.catalina.session.StandardSessionFacade@689ac6da
    //同时/usr/local/tomcat/work/Catalina/localhost/firstListener/SESSION.ser文件销毁
    public void sessionDidActivate(HttpSessionEvent arg0) {
        // TODO Auto-generated method stub
        System.out.println("session活化"+arg0.getSource());
        
    }
}

session钝化活化总结:
1.session钝化(数据从内存 -> 硬盘),也就是session中已setAttribute值后,关闭tomcat后,tomcat会在/usr/local/tomcat/work/Catalina/localhost/firstListener/生成SESSION.ser文件,用服务器系统文件来保存session信息;
2.session活化(数据从硬盘 ->内存 ),以上关闭tomcat后再启动tomcat会,数据从硬盘系统文件/usr/local/tomcat/work/Catalina/localhost/firstListener/SESSION.ser,恢复到内存,并删除该文件;

六.servler3.0下监听器的使用

  • 使用servler3.0的前提条件


    Paste_Image.png
  • servler3.0下监听器的使用( @WebListener注解的使用,就不需要注册web.xml文件 )


    Paste_Image.png
    Paste_Image.png

    比如:

@WebListener("This is My Servlet 3.0 Lisener")
public class Servlet3WebListener implements ServletContextListener {

详细代码请点击

七.使用HttpSession和Servlet监听器实现在线人数统计及列表

点击查看

相关文章

  • SpringBoot--监听器解析

    监听器模式 监听器模式有要素 事件 监听器 广播器 触发机制 系统监听器 监听器 ApplicationListe...

  • 监听器

    一、监听器定义 现实生活 -web监听器 二、web监听器应用 三、创建监听器 1、创建一个实现监听器接口的类。 ...

  • JavaWeb - Listener

    监听器 实现一个监听器的接口. 编写一个监听器实现监听器的接口 web.xml 中注册监听器 看情况是否使用

  • Spring 监听器listener原理-基本使用(一)

    Spring 监听器listener原理-基本使用(一) Spring 监听器listener原理-手写监听器(二...

  • JavaEE_day23_Listener(监听器)

    一、监听器(Listener): 1.什么是监听器? 监听器就是监听某个对象的的状态变化的组件 监听器的相关概念:...

  • tomcat内存马Listener篇

    什么是监听器 监听器类型 java共有三种类型的监听器 ServletContext对象的监听器 它能够监听 Se...

  • 监听器

    一.监听器定义 二.web监听器的用途 三.创建监听器 创建一个实现监听器接口类( 实现的是ServletCont...

  • Bukkit插件开发教程 - 监听器

    监听器 - Listener 学习目标 理解监听器的意义 了解监听器的注册 @EventHandler注解的作用 ...

  • 2019-02-26 web监听器(慕课网学习笔记)

    1 监听器的定义 2 web中监听器的定义 3 web监听器的常用用途 4 创建第一个监听器 常规的web项目,需...

  • 23. 监听器

    12 监听器 实现一个监听器的接口 编写一个监听器package com.karl.listener;import...

网友评论

      本文标题:监听器

      本文链接:https://www.haomeiwen.com/subject/xakgittx.html