搜尋
首頁Javajava教程Java如何實現統計線上人數功能

    1. 監聽器的簡介

    監聽器就是一個實作特定介面的普通java程序,這個程式專門用來監聽另一個java物件的方法呼叫或屬性改變,當被監聽物件發生上述事件後,監聽器某個方法將會立即被執行。

    2. Java監聽器的類型

    (1)ServletContextListener

    用於監聽WEB,應用啟動和銷毀的事件

    public void contextInitialized( ServletContextEvent sce):在初始化web應用時執行

     public void contextDestroyed(ServletContextEvent sce) {}:在銷毀web應用時執行

    (2)HttpSessionListener

    #用於用於監聽Session物件的創建和銷毀

    public void sessionCreated(HttpSessionEvent se) {}:session創建的時候執行

    public void sessionDestroyed(HttpSessionEvent se) {}: session被銷毀的時候執行

    (3)ServletRequestListener

    用於監聽Requset物件的建立和銷毀

    public void requsetCreated(HttpSessionEvent se) {}:requset建立的時候執行

    #public void requestDestroyed(HttpSessionEvent se) {}: requset被銷毀的時候執行

    (4)ServletContextAttributeListener

    用於監聽WEB作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性

    attributeAdded(ServletContextEvent sce):在ServletContext中新增屬性時執行

    attributeAdded(ServletContextRemoved sce):ServletContext中刪除屬性時執行

    #Serv sce):ServletContext中修改屬性時執行

    (5)HttpSessionAttributeListener

    用於監聽Session作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性

    (6)ServletRequestAttributeListener

    用於監聽Requset作用域屬性的改動,包括:增加屬性、刪除屬性、修改屬性 

    (7)HttpSessionActivationListener

    用於監聽某個物件在Session中的序列化與反序列化

    3.監聽器Listener實作統計人數功能 

    (1)先建立監聽器套件listener在新建OnlineListener類別

    package listener;
    import javax.servlet.ServletContext;
    import javax.servlet.ServletContextEvent;
    import javax.servlet.ServletContextListener;
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    import javax.servlet.http.HttpSessionBindingEvent;
     
    @WebListener()
    public class OnlineListener implements ServletContextListener,HttpSessionListener, HttpSessionAttributeListener {
    
        private static int count=0;
     
        public OnlineListener() {//构造函数
        }
     
        // ServletContextListener的实现方法,在初始化web应用时执行,你可以在此处初始化server上下文相关数据
        public void contextInitialized(ServletContextEvent sce) {//应用初始化完成
       
        }
       
        // ServletContextListener的实现方法,在web应用关闭时执行
        public void contextDestroyed(ServletContextEvent sce) {
         
        }
     
        // HttpSessionListener的实现方法,session被创建的时候执行
        public void sessionCreated(HttpSessionEvent se) {//创建
            count++;
            ServletContext app = se.getSession().getServletContext();
            app.setAttribute("count",count);
        }
    
    
       // HttpSessionListener的实现方法,session被销毁的时候执行
        public void sessionDestroyed(HttpSessionEvent se) {
            count--;
            ServletContext app = se.getSession().getServletContext();
            app.setAttribute("count",count);
        }
    }

    (2)創建監聽器servlet的介面

    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
     
    @WebServlet(name = "OnlineServlet",urlPatterns = "/online")
    public class OnlineServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         this.doGet(request, response);
        }
     
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          String op=request.getParameter("op");
          String result="";
          switch (op){
              case "login":
                  //request.getSession()触发监听器的sessionCreated
                  ServletContext app=request.getSession().getServletContext();
                  int count= (int) app.getAttribute("count");
                  result=String.format("当前%d人在线",count);
                  break;
              case "logout":
                  //销毁session,触发监听器的sessionDestroy
                  request.getSession().invalidate();//销毁session
                  result="您已经退出了!";
          }
            response.setContentType("text/html;charset=utf-8");
            PrintWriter out=response.getWriter();
            out.write(result);
            out.close();
        }
    }

    4.Redis實作統計人數功能 

    需求:平均存取時常,平均同時線上人數,最高同時線上人數

    (1)先設計資料表:

    開始存取頁面時間,離開頁面時間表:(id,place,ip,user_id,user_name, begin_time, end_time, env, info,len_min)

    統計表:平均造訪時常,平均同時線上人數,最高同時線上人數(id,day,age_len_visit_min, acu, pcu)

    統計記錄表:每分鐘的同時線上人數。 (id,min_time, num)

    (2)使用redis儲存目前線上用戶,每次呼叫可以看作瀏覽了一分鐘(根據業務可以再細化,只需要定時任務記錄上次一分鐘和當前一分鐘的用戶,即可算出,某一個用戶在某個頁面的訪問時常。

    (3)同時記錄用戶開始訪問頁面時間,離開頁面時間,即可分析出後續。

    (4)為方便資料處理,可以記錄每個頁面每分鐘的存取量。

    (5)redis, 儲存2個hash:

    begin,計時器儲存到的hash集合,記錄詳細資料

    now,介面傳遞過來的使用者存取集合,記錄刷新時間

    透過計時器來更新,刷新操作。

    ps: hash中單獨的key不可以自動設定過期,或使用redis監聽,使用String類型的key,監聽是過濾,配對到自己需要處理的再進行處理即可。

    以上是Java如何實現統計線上人數功能的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    陳述
    本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
    為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

    javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

    討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

    在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

    與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

    Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

    Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

    Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

    說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

    JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

    是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

    新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

    JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

    不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

    平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

    平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

    See all articles

    熱AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智慧驅動的應用程序,用於創建逼真的裸體照片

    AI Clothes Remover

    AI Clothes Remover

    用於從照片中去除衣服的線上人工智慧工具。

    Undress AI Tool

    Undress AI Tool

    免費脫衣圖片

    Clothoff.io

    Clothoff.io

    AI脫衣器

    Video Face Swap

    Video Face Swap

    使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

    熱工具

    EditPlus 中文破解版

    EditPlus 中文破解版

    體積小,語法高亮,不支援程式碼提示功能

    Dreamweaver Mac版

    Dreamweaver Mac版

    視覺化網頁開發工具

    記事本++7.3.1

    記事本++7.3.1

    好用且免費的程式碼編輯器

    MantisBT

    MantisBT

    Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

    Dreamweaver CS6

    Dreamweaver CS6

    視覺化網頁開發工具