监听器是什么?
监听器(Listener)是一种运行在后台的程序,它主要用于监控某些事件在系统中的发生,并且根据这些事件做一些特定的处理。在Web应用程序中,监听器可以观察ServletContext、HttpSession以及ServletRequest等对象的变化,以便于在这些对象变化时进行相应的处理。监听器是Servlet规范中的一部分,在Java EE应用程序中广泛使用。
监听器通常定义了以下三个接口:
1. ServletContextListener:用于监听ServletContext的创建和销毁事件。
2. HttpSessionListener:用于监听HttpSession的创建和销毁事件。
3. ServletRequestListener:用于监听ServletRequest的创建和销毁事件。
除了上述三种标准的监听器接口,开发者也可以实现自己的监听器接口。监听器接口通常包含了多个方法,在对应的事件发生时会自动调用这些方法,以便监听器可以完成相应的处理逻辑。
常见的监听器应用包括:
1. 统计在线用户数
2. 初始化应用程序环境参数
3. 实现缓存管理
4. 监听Spring框架中Bean的生命周期
5. 监听消息队列中消息的到达等。
监听器是Java EE中非常重要的一部分,在Web应用程序中广泛应用,能够有效地提高应用程序性能和安全性。
监听器的用途
监听器的主要用途是监控Web应用程序中某些特定的事件的发生,并在这些事件发生时执行预定义的操作或处理逻辑。常用的监听器包括:
1. ServletContextListener:用于监控Web应用程序启动和关闭事件,例如一些应用程序启动时的初始化工作和应用程序关闭时的清理工作等。
2. HttpSessionListener:用于监控会话的创建和销毁事件,并记录在线用户数,例如对于在线商城等需要统计在线用户数的场景非常有用。
3. ServletRequestListener:用于监控Web请求的创建和销毁事件,例如对于每个请求都需要进行身份认证的场景,可以使用ServletRequestListener来实现登录拦截。
4. 监听JNDI服务的变化并更新应用程序数据源等服务。
除了上述标准的监听器,开发者也可以自定义监听器来监听特定的事件,这也是监听器的优秀之处。监听器可以增强Web应用程序的功能和安全性,提供更好的用户体验和管理。
listener在线监听用户数量
UserCounterListener代码
package com.qing;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class UserCounterListener implements HttpSessionListener {
private ServletContext ctx = null;
@Override
public void sessionCreated(HttpSessionEvent se) {
ctx=se.getSession().getServletContext();
if (ctx.getAttribute("onlineCount")!=null){
ctx.setAttribute("onlineCount",(Integer)ctx.getAttribute("onlineCount")+1);
}
else {
ctx.setAttribute("onlineCount", 1);
}
System.out.println("=====有一位用户上线了=====");
System.out.println("Id: "+se.getSession().getId()+"=====");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
ctx=se.getSession().getServletContext();
if (ctx.getAttribute("onlineCount")!=null){
ctx.setAttribute("onlineCount", 0);
}
else {
ctx.setAttribute("onlineCount",(Integer)ctx.getAttribute("onlineCount")-1);
}
System.out.println("=====用户下线了=====");
System.out.println("Id: "+se.getSession().getId()+"=====");
}
}
index.jsp代码,如下图,浏览器默认进index.jsp页面,我的默认路径是localhost:8080;当进入jsp页面,因为getAttribute取到了键,就可以拿到值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<h1>当前网站的有<%=request.getSession().getServletContext().getAttribute("onlineCount")%>人访问</h1>
</body>
</html>
web.xml配置
<servlet>
<servlet-name>ListenerTest</servlet-name>
<servlet-class>com.qing.ListenerTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ListenerTest</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
<listener>
<listener-class>com.qing.UserCounterListener</listener-class>
</listener>
<!--设置session过期时间,1分钟销毁-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
效果图:
默认是3个人访问
后端打印的结果
一分钟后,session会过期,在web.xml中设置了session的过期时间,刷新浏览器,访问人数为1
用不同的浏览器访问,会增加访问人数,并且后端的控制台也会监听,并打印信息