事件监听之统计登录用户人数(含用户名)案例

2024-06-20 01:18

本文主要是介绍事件监听之统计登录用户人数(含用户名)案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

(一)创建一个User类,用于封装一个用户信息,该类实现了HttpSessionBindingListener接口中的valueBound()方法
和valueUnbound()方法


1
package entity; 2 3 import javax.servlet.annotation.WebListener; 4 import javax.servlet.http.*; 5 6 @WebListener() 7 public class User implements HttpSessionBindingListener { 8 9 private String username; 10 private String password; 11 private String id; 12 13 public String getUsername() { 14 return username; 15 } 16 17 public void setUsername(String username) { 18 this.username = username; 19 } 20 21 public String getPassword() { 22 return password; 23 } 24 25 public void setPassword(String password) { 26 this.password = password; 27 } 28 29 public String getId() { 30 return id; 31 } 32 33 public void setId(String id) { 34 this.id = id; 35 } 36 37 @Override 38 public void valueBound(HttpSessionBindingEvent event) { 39 //将user存入列表 40 OnlineUser.getInstance().addUser(this); 41 } 42 43 @Override 44 public void valueUnbound(HttpSessionBindingEvent event) { 45 OnlineUser.getInstance().removeUser(this); 46 } 47 }

 (二)创建OnlineUser类,用于存储和获取在用户的列表,而这个列表对于所有的页面来说应该是同一个,故为单例模式。

 1 package entity;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 public class OnlineUser {
 7     private OnlineUser() {}
 8     private static OnlineUser instance = new OnlineUser ();
 9     public static OnlineUser getInstance() {
10         return instance;
11     }
12     private Map userMap = new HashMap();
13     //将用户添加到列表中
14     public void addUser(User user){
15         userMap.put (user.getId (),user.getUsername ());
16     }
17     //将用户移除列表
18     public void removeUser(User user){
19         userMap.remove (user.getId ());
20     }
21     //返回用户列表
22     public Map getOnlineUser() {
23         return userMap;
24     }
25 }

(三)编写一个login.jsp页面,该页面输入用户的登录名和密码,完成用户登录功能 

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4     <title>Title</title>
 5 </head>
 6 <body>
 7     <center>
 8         <h3>用户登录</h3>
 9     </center>
10 <form action="${pageContext.request.contextPath}/LoginServlet" method="post">
11     <table border="1" width="550px" cellpadding="0" cellspacing="0" align="center">
12         <tr>
13             <td height="35" align="center">用户名</td>
14             <td>
15                 &nbsp;&nbsp;&nbsp;
16                 <input type="text" name="username"/>
17             </td>
18         </tr>
19         <tr>
20             <td height="35" align="center">&nbsp;</td>
21             <td>
22                 &nbsp;&nbsp;&nbsp;
23                 <input type="password" name="password"/>
24             </td>
25         </tr>
26         <tr>
27             <td height="35" colspan="2" align="center">
28                 <input type="submit" value="登录"/>
29                 &nbsp;&nbsp;&nbsp;&nbsp;
30                 <input type="reset" name="重置"/>
31             </td>
32         </tr>
33     </table>
34 </form>
35 </body>
36 </html>

 (四)创建LoginServlet类,用于处理用户登录请求,如果用户登录成功就将该用户的信息封装到User中存入Session对象。

 1 package servlet;
 2 
 3 import entity.OnlineUser;
 4 import entity.User;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.annotation.WebServlet;
 8 import javax.servlet.http.HttpServlet;
 9 import javax.servlet.http.HttpServletRequest;
10 import javax.servlet.http.HttpServletResponse;
11 import java.io.IOException;
12 import java.util.Map;
13 import java.util.UUID;
14 
15 @WebServlet(name = "LoginServlet",urlPatterns = "/LoginServlet")
16 public class LoginServlet extends HttpServlet {
17     protected void doPost(HttpServletRequest request, HttpServletResponse response)
18             throws ServletException, IOException {
19         request.setCharacterEncoding ("utf-8");
20         response.setContentType ("text/html;charset=utf-8");
21         String username = request.getParameter ("username");
22         String password = request.getParameter ("password");
23         if (username !=null && !username.trim ().equals ("")){
24             //登录成功
25             User user = new User ();
26             user.setId (UUID.randomUUID ().toString ());
27             user.setUsername (username);
28             user.setPassword (password);
29             request.getSession ().setAttribute ("user",user);
30             Map users = OnlineUser.getInstance ().getOnlineUser ();
31             request.setAttribute ("users",users);
32             request.getRequestDispatcher ("/showuser.jsp").forward (request,response);
33         } else {
34             request.setAttribute ("errorMsg","用户名或密码错误");
35             request.getRequestDispatcher ("/login.jsp").forward (request,response);
36         }
37     }
38 
39     protected void doGet(HttpServletRequest request, HttpServletResponse response)
40             throws ServletException, IOException {
41         this.doPost (request,response);
42     }
43 }

 (五)编写一个showuser.jsp,该页面用于显示所有用户登录信息以及当前的登录的用户。

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
 3 <html>
 4 <head>
 5     <title>Title</title>
 6 </head>
 7 <body>
 8   <c:choose>
 9   <c:when test="${sessionScope.user==null}">
10   <a href="${pageContext.request.contextPath}/login.jsp">登录</a>
11       <br/>
12   </c:when>
13       <c:otherwise>
14               欢迎你,${sessionScope.user.username}
15           <a href="${pageContext.request.contextPath}/LogoutServlet">退出</a>
16       </c:otherwise>
17   </c:choose>
18 <hr/>
19 在线用户列表
20 <br/>
21 <c:forEach var="user" items="${requestScope.users}">
22     ${user.value}
23 </c:forEach>
24 </body>
25 </html>

 (六)编写一个LogoutServlet类,用于注销用户登录信息,用户注销后跳转到showuser.jsp页面

 1 package servlet;
 2 
 3 import entity.OnlineUser;
 4 
 5 import javax.servlet.ServletException;
 6 import javax.servlet.annotation.WebServlet;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 import java.io.IOException;
11 import java.util.Map;
12 
13 @WebServlet(name = "LogoutServlet",urlPatterns = "/LogoutServlet")
14 public class LogoutServlet extends HttpServlet {
15     protected void doPost(HttpServletRequest request, HttpServletResponse response)
16             throws ServletException, IOException {
17         request.setCharacterEncoding ("utf-8");
18         response.setContentType ("text/html;charset=utf-8");
19         request.getSession ().removeAttribute ("user");
20         Map users = OnlineUser.getInstance ().getOnlineUser ();
21         request.setAttribute ("users",users);
22         request.getRequestDispatcher ("/showuser.jsp").forward (request,response);
23     }
24     protected void doGet(HttpServletRequest request, HttpServletResponse response)
25             throws ServletException, IOException {
26         this.doPost (request,response);
27     }
28 }

(七)使用不同浏览访问,呈现效果如下:

 

这篇关于事件监听之统计登录用户人数(含用户名)案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076690

相关文章

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp

SpringBoot实现动态插拔的AOP的完整案例

《SpringBoot实现动态插拔的AOP的完整案例》在现代软件开发中,面向切面编程(AOP)是一种非常重要的技术,能够有效实现日志记录、安全控制、性能监控等横切关注点的分离,在传统的AOP实现中,切... 目录引言一、AOP 概述1.1 什么是 AOP1.2 AOP 的典型应用场景1.3 为什么需要动态插

数据库oracle用户密码过期查询及解决方案

《数据库oracle用户密码过期查询及解决方案》:本文主要介绍如何处理ORACLE数据库用户密码过期和修改密码期限的问题,包括创建用户、赋予权限、修改密码、解锁用户和设置密码期限,文中通过代码介绍... 目录前言一、创建用户、赋予权限、修改密码、解锁用户和设置期限二、查询用户密码期限和过期后的修改1.查询用

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

opencv实现像素统计的示例代码

《opencv实现像素统计的示例代码》本文介绍了OpenCV中统计图像像素信息的常用方法和函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 统计像素值的基本信息2. 统计像素值的直方图3. 统计像素值的总和4. 统计非零像素的数量

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不