JavaWeb—监听器Listener

时间:2023-03-09 16:00:47
JavaWeb—监听器Listener

1.简介

Listener是Servlet的监听器,Servlet 监听器用于监听一些重要事件的发生,监听器对象在事情发生前、发生后可以做一些必要的处理。

JavaWeb里面的listener是通过观察者设计模式进行实现的。

观察者模式又叫发布订阅模式或者监听器模式。在该模式中有两个角色:观察者和被观察者(通常也叫做主题)。观察者在主题里面注册自己感兴趣的事件,当这个事件发生时,主题会通过回调接口的方式通知观察者。

举个生活中的例子:订阅报纸。任何一个家庭或个人都可以向报社订阅报纸。这里报社就是“主题”,家庭就是“观察者”。比如家庭需要订阅明天早晨的报纸,这个就是“事件”。到了第二天早晨,报纸生产出来了,这个就是“事件发生”。当事件发生时,送报员将报纸送到家庭的信箱里面,这里的信箱就是“回调接口”。

aaarticlea/png;base64,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" alt="" />

对于JavaWeb里面的监听器,Servlet规范定义了一些列的Listener接口类,通过接口类的方式将事件暴露给应用程序,应用程序如果想监听其感兴趣的事件,那么不必去直接注册对应的事件,而是编写自己的listener实现相应的接口类,并将自己的listener注册到servlet容器。当程序关心的事件发生时,servlet容器会通知listener,回调listener里面的方法。这里自定义的listener就是观察者,servlet容器就是主题。

aaarticlea/png;base64,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" alt="" />

2.分类

现在我们分析下,servlet规范为我们定义了哪些事件。更准确的说是定义了哪些监听接口。下面的介绍都是以servlet3.0规范为准。

servlet3.0为我们提供了8个监听器接口,按照它们的作用域来划分的话可以分为三类:

1.servlet上下文相关监听接口:

  • ServletContextListener
  • ServletContextAttributeListener

2.http session相关监听接口:

  • HttpSessionListener
  • HttpSessionActivationListener
  • HttpSessionAttributeListener
  • HttpSessionBindingListener

3.servlet request相关监听接口:

  • ServletRequestListener
  • ServletRequestAttributeListener

3.Java编写Listener实例

Listener编写分为两步:

  1. 编写自己的listener,实现特定的Listener接口
  2. 在web.xml里面注册自己的listener(也可以通过注解的方式,道理是一样的)

ListenerDemo.java(这里继承ServletContextListener接口):

public class ListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("----------ServletContextListener.contextInitialized-----------");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("----------ServletContextListener.contextDestroyed----------");
}
}

web.xml:

<listener>
<listener-class>com.xzh.ListenerDemo</listener-class>
</listener>

效果图:

JavaWeb—监听器Listener

注意:结果中可以看到listener比filter先执行。

4.源码分析

4.1 ServletContextListener

public interface ServletContextListener extends EventListener {
void contextInitialized(ServletContextEvent var1); void contextDestroyed(ServletContextEvent var1);
}

servlet上下文监听器接口,对应着两个事件:servlet上下文初始化事件和servlet上下文即将关闭事件。

当web应用初始化的时候,servlet容器会构造ServletContextEven实例,并回调contextInitialize方法。当servlet上下文即将关闭时,一般是关闭服务器之前,servlet容器会构造ServletContextEven实例,并回调contextDestroyed方法。这里需要注意的是,contextDestroyed方法的执行会在所有的servlet和filter执行完destroy方法之后。

4.2 ServletContextAttributeListener

public interface ServletContextAttributeListener extends EventListener {
void attributeAdded(ServletContextAttributeEvent var1); void attributeRemoved(ServletContextAttributeEvent var1); void attributeReplaced(ServletContextAttributeEvent var1);
}

当servlet上文属性发生增、删、改的时候,servlet容器构造ServletContextAttributeEvent事件对象,分别回调attributeAdded、attributeRemoved、attributeReplaced方法。

这里需要注意的是attributeReplaced方法,当属性的值被替换的时候回调。这个时候如果调用ServletContextAttributeEvent.getValue()方法返回的是替换之前的属性值。

4.3 HttpSessionListener

public interface HttpSessionListener extends EventListener {
void sessionCreated(HttpSessionEvent var1); void sessionDestroyed(HttpSessionEvent var1);
}

当session被创建和销毁的时候,servlet容器构造HttpSessionEvent事件对象,并回调sessionCreated和sessionDestroyed方法。

4.4 HttpSessionActivationListener

public interface HttpSessionActivationListener extends EventListener {
void sessionWillPassivate(HttpSessionEvent var1); void sessionDidActivate(HttpSessionEvent var1);
}

当session将要钝化或已被激活时,servlet容器构造HttpSessionEvent事件对象,回调sessionWillPassivate和sessionDidActivate方法。

这里解释下钝化和激活:钝化是指服务器内存不够了或者session的活动超时时间到了,把最近不活动的session序列化到磁盘。激活是指某个钝化的session又被访问了,从磁盘将session反序列化到内存。

这里可以看出要想钝化和激活,首先session得可序列化和反序列化。同时我们在编程过程中,session尽量用String、Integer等简单的对象,尽量不要用list、map等集合。3.5

4.5 HttpSessionAttributeListener

public interface HttpSessionAttributeListener extends EventListener {
void attributeAdded(HttpSessionBindingEvent var1); void attributeRemoved(HttpSessionBindingEvent var1); void attributeReplaced(HttpSessionBindingEvent var1);
}

当session属性发生增、删、改的时候,servlet容器构造HttpSessionBindingEvent事件对象,分别回调attributeAdded、attributeRemoved、attributeReplaced方法。

这里需要注意的是attributeReplaced方法,当属性的值被替换的时候回调。这个时候如果调用ServletContextAttributeEvent.getValue()方法返回的是替换之前的属性值。

当调用session的invalidate方法或者session失效时,也会回调attributeRemoved方法。

4.6 HttpSessionBindingListener

public interface HttpSessionBindingListener extends EventListener {
void valueBound(HttpSessionBindingEvent var1); void valueUnbound(HttpSessionBindingEvent var1);
}

这个监听器也是监听session的属性变化。当session属性发生增和删,也就是属性值绑定和属性值解绑的时候,servlet容器构造HttpSessionBindingEvent事件对象,分别回调valueBound、valueUnbound方法。

这么一看和HttpSessionAttributeListener没什么区别,其实不是这样。两者有个本质的区别就是事件触发的条件。

当session的属性有任何的变化,servlet容器都会通知HttpSessionAttributeListener。但是对于HttpSessionBindingListener,只有当绑定或解绑的属性值是监听器的实例时,servlet容器才会通知。

4.7 ServletRequestListener

public interface ServletRequestListener extends EventListener {
void requestDestroyed(ServletRequestEvent var1); void requestInitialized(ServletRequestEvent var1);
}

当请求初始化或者销毁时,即客户端请求进入web应用(进入servlet或者第一个filter)或web应用返回响应给客户端(退出servlet或者第一个filter)。servlet容器构造ServletRequestEvent实例,回调requestInitialized和requestDestroyed方法。

4.8 ServletRequestAttributeListener

public interface ServletRequestAttributeListener extends EventListener {
void attributeAdded(ServletRequestAttributeEvent var1); void attributeRemoved(ServletRequestAttributeEvent var1); void attributeReplaced(ServletRequestAttributeEvent var1);
}

当请求的属性发生增、删、改的时候,servlet容器构造ServletRequestAttributeEvent事件对象,分别回调attributeAdded、attributeRemoved、attributeReplaced方法。

这里需要注意的是attributeReplaced方法,当属性的值被替换的时候回调。这个时候如果调用ServletRequestAttributeEvent.getValue()方法返回的是替换之前的属性值。

参考:

JavaWeb——Listener

java常用的Listener分类