监听器(Listener)
监听器(Listener)
什么是监听器
Listener监听器是Javaweb的三大组件之一, Javaweb的三大组件分别是servlet程序,filter过滤器,listener监听器。
Listener监听器类似于前端的事件绑定,java中的监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。
监听器的功能
监听事件发生,在事件发生前后能够做出相应处理的 web 应用组件。
Listener实现了 javax.servlet.ServletContextListener 接口的服务器端程序;随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。且并不是直接注册在事件源上,而是由 servlet 容器负责注册,开发只需在部署描述符中进行配置,servlet 容器会自动将监听器注册到事件源中。
主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
监听器的分类及种类
按监听的对象划分
- ServletContext对象监听器
- HttpSession对象监听器
- ServletRequest对象监听器
按监听的事件划分
- 对象自身的创建和销毁的监听器
- 对象中属性的创建和消除的监听器
- session中的某个对象的状态变化的监听器
监听器的种类及每种监听器处理的事情
java中一共给我们提供了八个监听器接口,分别用于监听三个域对象,每个监听器都有专门监听的事件
Request
- ServletRequestListener (处理request对象创建和销毁)
- ServleRequestAttributeListener (处理域对象中的数据添加 替换 删除)
Session
- HttpSessionListener (处理session对象创建和销毁)
- HttpSessionAttributeListener 处理session域对象中的数据添加 修改删除)
- HttpSessionBindingListener (处理session对象监听器绑定和解绑定接口)
- HttpSessionActivationListener (处理session对象钝化和活化状态接口)
Application
- ServletContextListener (处理application对象创建和销毁)
- ServletContextAttributeListener (处理application域对象中的数据添加 修改 删除)
监听器的使用
两步走使用
- 定义监听器,根据需求实现对应接口
- 在web.xml中配置监听器,让监听器工作
例子:监听网站在线人数
- 定义监听器,根据需求实现对应接口,重写接口的方法
//统计网站在线人数监听器:一个用户对应一个session,则统计session的数量即可统计在线人数
public class OnlineCountListener implements HttpSessionListener {
@Override
//创建session的监听:一旦创建session,就会触发一次这个事件
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
ServletContext context = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
System.out.println(httpSessionEvent.getSession().getId());
if (onlineCount == null) {
onlineCount = new Integer(1);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count + 1);
}
context.setAttribute("OnlineCount", onlineCount);
}
@Override
//销毁session的监听:一旦销毁session就会触发一次这个事件
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext context = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
if (onlineCount == null) {
onlineCount = new Integer(0);
} else {
int count = onlineCount.intValue();
onlineCount = new Integer(count - 1);
}
context.setAttribute("OnlineCount", onlineCount);
}
}
- 注册监听器:
<!--注册监听器-->
<listener>
<listener-class>com.yue.listener.OnlineCountListener</listener-class>
</listener>
在前端页面显示在线人数:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>当前有<span style="color: brown"><%=application.getAttribute("OnlineCount")%></span>在线</h1>
</body>
</html>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!