Java高级组件之监听器

98 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第24天,点击查看活动详情 >>

介绍

监听器:3大类,8种

  • Request:2种监听
  • pageContext:2种监听
  • session:2种监听
  • application:2种监听

问题

在Servlet技术中有request、session、application作用域对象,其主要作用是实现数据的在不同场景中的灵活流转。但是数据的具体流转过程我们是看不到的,比如作用域对象是什么时候创建和销毁的,数据是什么时候存取,改变和删除的。因为具体的流转过程看不到,所以也无法在指定的时机对数据和对象进行操作.

比如:

  • session销毁的时候,在线人数-1

解决

使用监听器

监听器

Servlet监听器是Servlet规范中定义的一种特殊类,用于监听ServletContext、HttpSession和ServletRequest等作用域对象的创建与销毁事件,以及监听这些作用域对象中属性发生修改的事件

监听对象

  • pageContext
  • Request
  • Session
  • Application

监听内容

  • 创建
  • 销毁
  • 属性改变事件

监听作用

监听作用于对象Request、session、application的创建、销毁和内容的改变

在事件发生之前、之后进行一些处理,比如统计在线人数

使用

  • 创建一个实现了指定接口的Java类
  • 在web.xml中配置监听类(注解更方便)

监听Request

监听Request对象的创建与销毁

  • 实现的接口:ServletRequestListener

  • 重写方法:

    • requestInitialized(ServletRequestEvent sre):创建
    • requestDestroyed(ServletRequestEvent sre):销毁
  • 方法:

    • sre.getServletRequest();:获取监听的Request对象

监听Request作用域数据的变更

  • 实现的接口:ServletRequestAttributeListener

  • 重写的方法

    • attributeAdded(ServletRequestAttributeEvent srae):监听添加

      • 每添加一条信息,都会出发该监听器
    • attributeRemoved(ServletRequestAttributeEvent srae):监听删除

    • attributeReplaced(ServletRequestAttributeEvent srae):监听修改

  • 参数

    • srae.getName():获取添加的Attribute的键值
    • srae.getValue():获取添加的Attribute的value值

实例代码

@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
    //ServletRequestEvent:servlet的Request请求事件
    //该事件会加载到Request请求的所有内容
    ServletRequest servletRequest = servletRequestEvent.getServletRequest();
    HttpServletRequest request = (HttpServletRequest) servletRequest;

    //获取用户的IP地址
    String ip = request.getRemoteAddr();
    //获取用户请求的资源路径URL
    StringBuffer URL = request.getRequestURL();
    //获取当前用户是否登录
    String username = "";
    User user = (User) request.getSession().getAttribute("user");
    if (user == null) {
        username = "游客";
    }else {
        username = user.getUsername();
    }
    System.out.println("监听用户名:" + username + "IP:" + ip + "URL:" + URL+"请求开始");
}

监听Session

监听Session对象的创建与销毁

  • 实现接口:HttpSessionListener

  • 重写的方法

    • sessionCreated(HttpSessionEvent se):监听Session的创建
    • sessionDestroyed(HttpSessionEvent se):监听Session的销毁
  • 参数

    • se.getSession();:获取监听的session对象

监听Session作用域数据的变更

  • 实现接口:HttpSessionAttributeListener

  • 重写的方法

    • attributeAdded(HttpSessionBindingEvent se):监听session数据的添加
    • attributeRemoved(HttpSessionBindingEvent se):监听session数据的删除
    • attributeReplaced(HttpSessionBindingEvent se):监听session数据的修改
  • 参数

    • se.getName():获取session数据的键值
    • se.getValue():获取session数据的value值

监听Application(ServletContext)

application是ServletContext的别称

在服务器已启动,就会创建一个application,也就是ServletContext

服务器一关闭,就会销毁该application,也就是ServletContext

监听application的创建与销毁

  • 实现接口:ServletContextListener

  • 重写的方法

    • contextInitialized(ServletContextEvent sce):监听application的初始化,服务器启动执行
    • contextDestroyed(ServletContextEvent sce) :监听application的销毁,服务器关闭执行
  • 参数

    • sce.getServletContext();:获取监听的application对象,也就是ServletContext对象

监听application作用域数据的变更

  • 实现接口:ServletContextAttributeListener

  • 重写的方法

    • attributeAdded(ServletContextAttributeEvent scae) :监听application数据的添加
    • attributeRemoved(ServletContextAttributeEvent scae):监听application数据的删除
    • attributeReplaced(ServletContextAttributeEvent scae):监听application数据的修改
  • 参数

    • scae.getName():获取application数据的键值,也就是ServletContext数据中的键值
    • scae.getValue():获取application数据的value值,也就是ServletContext数据中的value值