Web监听器
监听器
是指专门用于对其他对象身上发生的事件或状态进行监听和相应处理的对象,
当被监听的对象发生变化时,立即采取相应的行动。
Web监听器
Servlet规范中定义的一种特殊类
用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件
用于监听域对象的属性发生修改的事件
可以在事件发生前、发生后做一些必要的处理
用途
统计在线人数和在线用户
系统启动时加载初始化信息
统计网站访问量
跟Spring结合
优先级:监听器大于过滤器,过滤器大于Servlet
分类(根据监听的对象划分)
用于监听应用程序环境对象(ServletContext)的事件监听器
用于监听用户会话对象(HttpSession)的事件监听器
用于监听请求消息对象(ServletRequest)的事件监听器
(根据监听对象划分)
监听域对象自身的创建和销毁的事件监听器
监听域对象中的属性的增加和删除的事件监听器
页面:
是指专门用于对其他对象身上发生的事件或状态进行监听和相应处理的对象,
当被监听的对象发生变化时,立即采取相应的行动。
Web监听器
Servlet规范中定义的一种特殊类
用于监听ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件
用于监听域对象的属性发生修改的事件
可以在事件发生前、发生后做一些必要的处理
用途
统计在线人数和在线用户
系统启动时加载初始化信息
统计网站访问量
跟Spring结合
优先级:监听器大于过滤器,过滤器大于Servlet
分类(根据监听的对象划分)
用于监听应用程序环境对象(ServletContext)的事件监听器
用于监听用户会话对象(HttpSession)的事件监听器
用于监听请求消息对象(ServletRequest)的事件监听器
(根据监听对象划分)
监听域对象自身的创建和销毁的事件监听器
监听域对象中的属性的增加和删除的事件监听器
监听绑定到HttpSession域中的某个对象的状态的事件监听器
监听器实现的获取在线人数案例:
public class User {
private String sessionIdString;
private String ipString;
private String firstTimeString;
public String getSessionIdString() {
return sessionIdString;
}
public void setSessionIdString(String sessionIdString) {
this.sessionIdString = sessionIdString;
}
public String getIpString() {
return ipString;
}
public void setIpString(String ipString) {
this.ipString = ipString;
}
public String getFirstTimeString() {
return firstTimeString;
}
public void setFirstTimeString(String firstTimeString) {
this.firstTimeString = firstTimeString;
}
}
@WebListener
public class MyHttpSessionListener implements HttpSessionListener{
private int userNumber;
public void sessionCreated(HttpSessionEvent se) {
userNumber++;
se.getSession().getServletContext().setAttribute("userNumber", userNumber);
}
public void sessionDestroyed(HttpSessionEvent se) {
userNumber--;
se.getSession().getServletContext().setAttribute("userNumber", userNumber);
ArrayList<User> userList =null;
userList = (ArrayList<User>) se.getSession().getServletContext().getAttribute("userList");
if(SessionUtil.getUserBySessionId(userList, se.getSession().getId()) != null){
userList.remove(SessionUtil.getUserBySessionId(userList, se.getSession().getId()));
}
}
}
@WebListener
public class MyServletRequestListener implements ServletRequestListener {
private ArrayList<User> userList;
@Override
public void requestDestroyed(ServletRequestEvent arg0) {
}
@Override
public void requestInitialized(ServletRequestEvent arg0) {
userList = (ArrayList<User>)arg0.getServletContext().getAttribute("userList");
if(userList == null){
userList = new ArrayList<User>();
}
HttpServletRequest request = (HttpServletRequest) arg0.getServletRequest();
String sessionIdString = request.getSession().getId();
if(SessionUtil.getUserBySessionId(userList, sessionIdString) == null){
User user = new User();
user.setSessionIdString(sessionIdString);
user.setFirstTimeString(new SimpleDateFormat("yyyy-MM-ddd HH:mm:ss").format(new Date()));
user.setIpString(request.getRemoteAddr());
userList.add(user);
}
arg0.getServletContext().setAttribute("userList", userList);
}
}
public class SessionUtil {
public static Object getUserBySessionId(ArrayList<User> userList,String sessionIdString){
for(int i = 0; i < userList.size(); i++){
User user =userList.get(i);
if(user.getSessionIdString().equals(sessionIdString)){
return user;
}
}
return null;
}
}
页面:
<body>
当前在线用户人数:${userNumber}<br>
<%
ArrayList<User> userList = (ArrayList<User>)request.getServletContext().getAttribute("userList");
if(userList != null){
for(int i = 0; i < userList.size(); i++){
User user = userList.get(i);
%>
IP:<%=user.getIpString() %>,FirstTime:<%=user.getFirstTimeString() %>,SessionId:<%=user.getSessionIdString() %><br/>
<%
}
}
%>
</body>
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理