07.使用Tomcat實現在線人數的監聽


通過監聽Session對象的方式來實現在線人數的統計和在線人信息展示。

1.web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>MvcPro</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
    <listener>
      <listener-class>com.sxt.mvcpro.listener.RequestListener</listener-class>
  </listener>
  <!-- 在容器中配置出路徑對應的servlet -->
  <servlet>
      <servlet-name>listenerOnlineNumber</servlet-name>
      <servlet-class>com.sxt.mvcpro.controller.OnlineNumberServlet</servlet-class>
  </servlet>
  <!-- 定義出上面的servlet處理的路徑 這個路徑叫做servlet的映射路徑 -->
  <servlet-mapping>
      <servlet-name>listenerOnlineNumber</servlet-name>
      <url-pattern>/online/*</url-pattern>
  </servlet-mapping>
</web-app>

2.online.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<base href="/MvcPro/">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <h1>在線人數為:${count==null? 0:count}</h1>
     ${users}
     <form action="online/login"  method="post">
         <fieldset>
           <legend>請登錄</legend>
             用戶名:<input  type="text" name="username"><br><br>
             <input type="submit" value="登陸">
         </fieldset>
     </form>
     <a  href="online/logout">注銷</a>
</body>
</html>

3.OnlineNumberServlet.java

  對Session對象實現監聽,首先必須繼承HttpSessionListener類,該程序的基本原理就是當瀏覽者訪問頁面的時候必定會產生一個session對象;當關閉該頁面的時候必然會刪除該session對象。所以每當產生一個新的session對象就讓在線人數加1,當刪除一個session對象就讓在線人數減1。

  實現登錄的方法

public void login(HttpServletRequest req, HttpServletResponse resp) throws Exception {
        
        String username = req.getParameter("username");
        
        //    如果為null則表示還沒登陸
        if (req.getSession().getAttribute("username")==null) {
            if (!"".equals("username")) {//    只有輸入的用戶名不為空才能進行操作
                req.getSession().setAttribute("username", username);
                //    將用戶名保存到set集合中
                names.add(username);
                //    再將names集合保存到application內置對象中去
                req.getServletContext().setAttribute("users", names);
                req.getServletContext().setAttribute("count", names.size());
            }
        }
        resp.sendRedirect("/MvcPro/pages/online.jsp");
    }

  實現注銷的方法

public void logout(HttpServletRequest req, HttpServletResponse resp) {
        names.remove(req.getSession().getAttribute("username"));
        //    銷毀當前用戶的session內置對象
        req.getSession().invalidate();
        try {
            req.getServletContext().setAttribute("count", names.size());
            resp.sendRedirect("/MvcPro/pages/online.jsp");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

  獲取服務器信息,並將其作為響應返回給客戶端

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,IOException{
        req.setCharacterEncoding("UTF-8");
        String pathInfo = req.getPathInfo();
        if ("/login".equals(pathInfo)) {
            try {
                this.login(req, resp);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else if("/logout".equals(pathInfo)) {
            this.logout(req, resp);
        }
    }

  客戶端把數據傳送到服務器端

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }

  創建集合保存用戶名

//    保存用戶名
    private Set<String> names = new HashSet<String>();

4.測試

(1)登錄界面

(2)輸入用戶名進行登錄

(3)注銷

點擊注銷之后頁面重新返回登錄界面

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com