(一)創建一個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 16 <input type="text" name="username"/> 17 </td> 18 </tr> 19 <tr> 20 <td height="35" align="center">密 碼</td> 21 <td> 22 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 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 }
(七)使用不同瀏覽訪問,呈現效果如下: