ホームページ > Java > &#&チュートリアル > Javaでオンライン人数をカウントする機能を実装する方法

Javaでオンライン人数をカウントする機能を実装する方法

WBOY
リリース: 2023-04-19 09:13:02
転載
1860 人が閲覧しました

    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) {}: セッションの作成時に実行されます

    public void sessionDestroyed(HttpSessionEvent se) {}: セッションの作成時に実行されますdestroy

    (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 から属性を削除するときに実行されます

    attributeReplaced( ServletContextRemoved sce): ServletContext の属性を変更するときに実行されます

    (5)HttpSessionAttributeListener

    は、属性の追加、属性の削除、属性の変更など、セッション スコープの属性の変更を監視するために使用されます

    (6)ServletRequestAttributeListener

    は、属性の追加、属性の削除、属性の変更など、Requset スコープの属性の変更を監視するために使用されます。

    (7)HttpSessionActivationListener

    が使用されますセッションでのオブジェクトのシリアル化と逆シリアル化

    3. リスナーは人数をカウントする機能を実装します

    (1) まずリスナー パッケージのリスナーを作成し、次に新しい 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) リスナー サーブレットのインターフェイスを作成します

    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)

    統計記録テーブル: 1 分あたり同時にオンラインになった人の数。 (id, min_time, num)

    (2) redis を使用して現在のオンライン ユーザーを保存します。各呼び出しは 1 分間の閲覧とみなされます (ビジネスに応じてさらに絞り込むことができ、スケジュールされたユーザーのみが参照されます)タスクは最後の 1 分を記録する必要がある) と現在の 1 分間のユーザーを記録する必要があるため、ユーザーが特定のページにアクセスする頻度を計算できます。

    (3) 同時に、ユーザーがページにアクセスし始めた時刻も記録します。

    (4) データ処理を容易にするために、1 分あたりのページごとの訪問数を記録できます。

    (5) redis、2 つのハッシュを保存します:

    begin、タイマー 保存されたハッシュ セットには詳細情報が記録されます

    now、インターフェイスによって渡されたユーザー アクセス セット、および更新時刻が記録されます

    更新およびリフレッシュ操作はタイマーを通じて実行されます。

    ps: ハッシュ内の個々のキーの有効期限を自動的に設定することはできません。または、Redis モニタリングを使用して文字列タイプのキーを使用できます。モニタリングはフィルタリングです。マッチング後に処理すべきものを処理します。

    以上がJavaでオンライン人数をカウントする機能を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    関連ラベル:
    ソース:yisu.com
    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    人気のチュートリアル
    詳細>
    最新のダウンロード
    詳細>
    ウェブエフェクト
    公式サイト
    サイト素材
    フロントエンドテンプレート