Listener监听器
1.1 基本概念
- Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理。
- 底层原理是采用接口回调的方式实现。
1.2 基本分类
| 监听器类型 | 作用 |
|---|---|
| javax.servlet.ServletRequestListener | 监听request作用域的创建和销毁 |
| javax.servlet.ServletRequestAttributeListener | 监听request作用域的属性状态变化 |
| javax.servlet.http.HttpSessionListener | 监听session作用域的创建和销毁 |
| javax.servlet.http.HttpSessionAttributeListener | 监听session作用域的属性状态变化 |
| javax.servlet.ServletContextListener | 监听application作用域的创建和销毁 |
| javax.servlet.ServletContextAttributeListener | 监听application作用域的属性状态变化 |
| javax.servlet.http.HttpSessionBindingListener | 监听对象与session的绑定和解除 |
1.3 监听器详解
1.3.1 ServletRequestListener
- 在ServletRequest创建和关闭时都会通知ServletRequestListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void requestInitialized(ServletRequestEvent sre) | 实现ServletRequest对象的初始化 |
| void requestDestroyed(ServletRequestEvent sre) | 实现ServletRequest对象的销毁 |
代码示例
RequestListener
package cn.guardwhy.listener;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class RequestListener01 implements ServletRequestListener {
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("请求销毁了....");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("创建请求...");
}
}
10.3.2 ServletRequestAttributeListener
- 向ServletRequest添加、删除或者替换一个属性的时候,将会通知ServletRequestAttributeListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void attributeAdded(ServletRequestAttributeEvent srae) | 增加属性时触发 |
| void attributeReplaced(ServletRequestAttributeEvent srae) | 修改属性时触发 |
| void attributeRemoved(ServletRequestAttributeEvent srae) | 删除属性时触发 |
代码示例
RequestAttributeListener
package cn.guardwhy.listener;
import javax.servlet.ServletRequestAttributeEvent;
import javax.servlet.ServletRequestAttributeListener;
public class RequestAttributeListener02 implements ServletRequestAttributeListener {
@Override
public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("增加了属性:" + servletRequestAttributeEvent.getName());
}
@Override
public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("属性:" + servletRequestAttributeEvent.getName() + "被删除了");
}
@Override
public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
System.out.println("修改属性:" + servletRequestAttributeEvent.getName());
}
}
requestAttribute.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>属性状态的改变</title>
</head>
<body>
<%
// 1.实现属性的添加
request.setAttribute("name", "Curry");
// 2.修改属性修改
request.setAttribute("name", "Kobe");
// 3.删除属性
request.removeAttribute("name");
%>
</body>
</html>
web.xml
<listener>
<listener-class>cn.guardwhy.listener.RequestAttributeListener02</listener-class>
</listener>
执行结果

1.3.3 HttpSessionListener
当一个HttpSession刚被创建或者失效(invalidate)的时候,将会通知HttpSessionListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void sessionCreated(HttpSessionEvent se) | 当一个HttpSession对象被创建时会调用这个方法 |
| voidsessionDestroyed(HttpSessionEvent se) | 当一个HttpSession超时或者调用HttpSession的invalidate()方法让它销毁时,将会调用这个方法 |
SessionListener
package cn.guardwhy.listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class SessionListener03 implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("创建了session");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("销毁了session");
}
}
web.xml
<!--监听器-->
<listener>
<listener-class>cn.guardwhy.listener.SessionListener03</listener-class>
</listener>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
1.3.4 HttpSessionAttributeListener
- HttpSession中添加、删除或者替换一个属性的时候,将会通知HttpSessionAttributeListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void attributeAdded(HttpSessionBindingEvent se) | 当往会话中加入一个属性的时候会调用这个方法 |
| void attributeRemoved(HttpSessionBindingEvent se) | 当从会话中删除一个属性的时候会调用这个方法 |
| void attributeReplaced(HttpSessionBindingEvent se) | 当改变会话中的属性的时候会调用这个方法 |
代码示例
SessionAttributeListener
package cn.guardwhy.listener;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
public class SessionAttributeListener04 implements HttpSessionAttributeListener {
@Override
public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("增加了属性:" + httpSessionBindingEvent.getName());
}
@Override
public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("属性:" + httpSessionBindingEvent.getName() + "删除");
}
@Override
public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("修改属性:" + httpSessionBindingEvent.getName());
}
}
requestAttribute.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>属性状态的改变</title>
</head>
<body>
<%
// 1.实现属性的添加
request.setAttribute("name", "Curry");
// 2.修改属性修改
request.setAttribute("name", "Kobe");
// 3.删除属性
request.removeAttribute("name");
%>
</body>
</html>
web.xml
<listener>
<listener-class>cn.guardwhy.listener.SessionAttributeListener04</listener-class>
</listener>
执行结果

1.3.5 ServletContextListener
在ServletContext创建和关闭时都会通知ServletContextListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void contextInitialized(ServletContextEvent sce) | 当ServletContext创建的时候,将会调用这个方法 |
| void contextDestroyed(ServletContextEvent sce) | 当ServletContext销毁的时候(例如关闭应用服务器或者重新加载应用),将会调用这个方法 |
代码示例
package cn.guardwhy.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ContextListener05 implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象创建");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象销毁");
}
}
1.3. 6 ServletContextAttributeListener
向ServletContext添加、删除或者替换一个属性的时候,将会通知ServletContextAttributesListener监听器。
常用方法
| 方法类型 | 作用 |
|---|---|
| void attributeAdded(ServletContextAttributeEvent scae) | 往ServletContext中加入一个属性的时候触发 |
| void attributeRemoved(ServletContextAttributeEvent scae) | 从ServletContext中删除一个属性的时候触发 |
| void attributeReplaced(ServletContextAttributeEvent scae) | 改变ServletContext中属性的时候触发 |
代码示例
ServletContextAttributeListener
package cn.guardwhy.listener;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
public class ContextAttributeListener06 implements ServletContextAttributeListener {
@Override
public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("增加了属性" + servletContextAttributeEvent.getName());
}
@Override
public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("属性" + servletContextAttributeEvent.getName() + "删除!");
}
@Override
public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
System.out.println("修改属性" + servletContextAttributeEvent.getName());
}
}
contextAttribute.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>ServletContext对象属性</title>
</head>
<body>
<%
// 1.添加属性
application.setAttribute("userName", "Curry");
// 2.修改属性
application.setAttribute("userName", "Kobe");
// 3.删除属性
application.removeAttribute("userName");
%>
</body>
</html>
web.xml
<listener>
<listener-class>cn.guardwhy.listener.ContextAttributeListener06</listener-class>
</listener>
执行结果

1.3.7 HttpSessionBindingListener
HttpSession中绑定和解除绑定时,将会通知HttpSessionListener监听器。
| 方法类型 | 作用 |
|---|---|
| void valueBound(HttpSessionBindingEvent event) | 有对象绑定时调用该方法 |
| void valueUnbound(HttpSessionBindingEvent event) | 有对象解除绑定时调用该方法 |
代码示例
package cn.guardwhy.listener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
public class Student implements HttpSessionBindingListener {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("对象绑定到session中" + httpSessionBindingEvent.getName());
}
@Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
System.out.println("解除绑定...");
}
}
sessionBind.jsp
<%@ page import="cn.guardwhy.listener.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>session中对象的绑定和解除</title>
</head>
<body>
<%
// 创建Student对象
Student student = new Student();
student.setName("Curry");
student.setAge(21);
// 将对象与Session对象进行绑定
session.setAttribute("student", student);
// 解除绑定
session.removeAttribute("student");
%>
</body>
</html>
1.4 监听器混合使用
代码示例
OnlineUser
package cn.guardwhy.online;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class OnlineUser implements HttpSessionListener, ServletContextListener {
// 1.声明全局变量
private ServletContext servletContext = null;
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
servletContext = servletContextEvent.getServletContext();
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
servletContext = null;
}
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("新用户上线");
Object count = servletContext.getAttribute("count");
// 2.若当前用户为第一,将全局对象中的属性设置为1
if (null == count){
servletContext.setAttribute("count", 1);
}else {
// 当前用户不是第一个用户,则将全局对象中原有的数据取出来加1后再设置进去
Integer integer = (Integer) count;
integer++;
servletContext.setAttribute("count", integer);
}
System.out.println("当前在线用户数量:" + servletContext.getAttribute("count"));
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("用户已下线...");
}
}
onlineUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>当前在线的用户数量</title>
</head>
<body>
<h3>在线用户人数:${applicationScope.count}</h3>
</body>
</html>
web.xml
<listener>
<listener-class>cn.guardwhy.online.OnlineUser</listener-class>
</listener>
执行结果


浙公网安备 33010602011771号