1. 程式人生 > >事件監聽之統計登錄用戶人數(含用戶名)案例

事件監聽之統計登錄用戶人數(含用戶名)案例

用戶名 登錄名 lsp eat 不同 over eve utf-8 put

(一)創建一個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 }

(七)使用不同瀏覽訪問,呈現效果如下:

技術分享

技術分享

技術分享

技術分享

事件監聽之統計登錄用戶人數(含用戶名)案例