1.什么是监听器
监听器(Listener),监听器就是监听某个对象的的状态变化的组件。
Java Web中的监听器概念与Javase中是事件监听器概念类似,包含以下三方面: 事件源:被监听的对象 ,包括三个域对象 request、 session、 servletContext 监听器:监听事件源对象 事件源对象的状态的变化都会触发监听器 。 注册监听器:将监听器与事件源进行绑定。
2.监听器的分类
| ServletContext域 | HttpSession域 | ServletRequest域 | |
|---|---|---|---|
| 域对象的创建与销毁 | ServletContextListener | HttpSessionListener | ServletRequestListener |
| 域对象的属性变化 | ServletContextAttributeListener | HttpSessionAttributeListener | ServletRequestAttributeListener |
3.实例
使用HttpSessionListener统计在线人数。
1)创建com.listener包,创建OnlineNumberListener。
package com.listener;
import javax.servlet.ServletContext;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@WebListener("onLineNumberListener")
public class OnlineNumberListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session created...");
Integer onlineNumber = 0;
ServletContext application = httpSessionEvent.getSession().getServletContext();
if(application.getAttribute("onlineNumber")!=null){
onlineNumber = (Integer) application.getAttribute("onlineNumber");
}
onlineNumber++;
application.setAttribute("onlineNumber",onlineNumber);
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session destroyed...");
Integer onlineNumber = 0;
ServletContext application = httpSessionEvent.getSession().getServletContext();
if(application.getAttribute("onlineNumber")!=null){
onlineNumber = (Integer) application.getAttribute("onlineNumber");
}
onlineNumber--;
application.setAttribute("onlineNumber",onlineNumber);
}
}
2)创建index.jsp,在欢迎页中使用el表达式显示在线人数。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<style>
#footer{
margin: 0px auto;
width: 280px;
text-align: center;
}
</style>
</head>
<body>
<h1>欢迎页面</h1>
<hr>
<div id="footer">
在线人数是:${applicationScope.onlineNumber}
</div>
</body>
</html>
3)测试
启动tomcat,测试项目首页。

注意:Tomcat服务器如果仅仅只是访问静态页面(html)或者Servlet都不认为是创建新会话(session),只有在访问了jsp页面时才认为是创建了新会话。所以,这个测试案例不可以使用静态页面(HTML)测试。