Listener & Filter
Listener
监听器,能做什么事?
监听某一个事件的发生,状态的改变。
监听器的内部原理:其实就是接口回调。
1、接口回调
需求:A在执行循环,当循环到5的时候,通知B。
事先先把一个对象传递给 A,当A 执行到5的时候,通过这个对象,来调用B中的方法。
注意,不是直接传递B的实例,而是传递一个接口的实例过去。
2、Web监听器
总共有8个,划分成三种类型:3 + 3 + 2
ServletContextListener
ServletRequestListener
HttpSessionListener
ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener
HttpSessionBindingListener
HttpSessionActivationListener
如何创建监听器?
- 定义一个类,实现接口
- 注册 | 配置监听器
3、第一类:监听三个作用域创建和销毁。
哪三个作用域?
request — httpServletRequest
session — httpSession
application — ServletContext
(1)监听ServletContext创建销毁:ServletContextListener
servletContext创建:启动服务器。
servletContext销毁:关闭服务器,或者从服务器移除项目。
(2)监听request创建销毁:ServletRequestListener
request创建:访问服务器上的任意资源都会有请求出现。
例如:访问jsp,html,servlet等。
request销毁:服务器对这次请求作出了响应后。
测试代码:
public class MyRequestListener implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("servletrequest 销毁了");
}
@Override
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("servletrequest 初始化了");
}
}
在web.xml中注册监听器的代码:
<listener>
<listener-class>com.itheima.listener.MyRequestListener</listener-class>
</listener>
(3)监听session创建销毁:HttpSessionListener
session创建:只要调用getSession
访问html:不会创建session。
访问jsp:会,jsp中9个有内置对象,其中就包括了session。
访问servlet:会创建session。
session销毁:超时,默认是30分钟。
服务器非正常关闭,销毁session。
正常关闭服务器(序列化)。
测试代码:
public class MySessionListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建session了");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁session了");
}
}
监听三个作用域创建销毁的作用:
ServletContextListener的作用:
在servletcontext创建的时候,完成自己想要的初始化工作。
执行自定义任务调度,执行某一个任务。
ServletRequestListener很少用到,来了数据请求服务器本身就知道。
HttpSessionListener的作用:
统计在线人数。
4、第二类:监听三个作用域属性状态变更
可以监听在作用域中值, 添加 | 替换 | 移除的动作。
(1)servletContext — ServletContextAttributeListener
(2)request — ServletRequestAttributeListener