Servlet クリックカウンター

ウェブページクリックカウンター

多くの場合、Webサイトの特定のページの総クリック数を知りたいと思うことがあります。Servletを使用してこれらのクリック数を計算するのは非常に簡単です。Servletのライフサイクルは、それが実行されているコンテナによって制御されるからです。

以下は、Servletのライフサイクルに基づくシンプルなウェブページクリックカウンターを実装するために必要な手順です。

  • init() メソッドでグローバル変数を初期化します。
  • doGet() または doPost() メソッドが呼び出されるたびに、グローバル変数をインクリメントします。
  • 必要に応じて、destroy() 内でデータベーステーブルを使用してグローバル変数の値を保存できます。次回Servletを初期化するときに、その値を init() メソッド内で読み取ることができます。この手順は任意です。
  • セッションごとにページクリックを1回だけカウントしたい場合は、isNew() メソッドを使用して、そのセッションが同じページをクリック済みかどうかを確認してください。この手順は任意です。
  • グローバルカウンターの値を表示することで、Webサイト上にページの総クリック数を表示できます。この手順は任意です。

ここでは、Webコンテナが再起動されないことを想定しています。再起動されるか、Servletが破棄されると、カウンターはリセットされます。

実例

この実例では、シンプルなウェブページクリックカウンターの実装方法を示します。

package com.サンプル.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PageHitCounter
 */
@WebServlet("/PageHitCounter")
public class PageHitCounter extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private int hitCount; 
    
    public void init() 
    { 
        // 重置点击计数器
        hitCount = 0;
    } 
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        // 增加 hitCount 
        hitCount++; 
        PrintWriter out = response.getWriter();
        String title = "总点击量";
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#F0F0F0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<h2 align=\"center\">" + hitCount + "</h2>\n" +
            "</body></html>");
    }
    
    public void destroy() 
    { 
        // 这一步是可选的,但是如果需要,您可以把 hitCount 的值写入到数据库
    } 

}

それでは、上記のServletをコンパイルし、web.xml ファイルに次のエントリを作成しましょう。

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>PageHitCounter</servlet-name>
    <servlet-class>com.サンプル.test.PageHitCounter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PageHitCounter</servlet-name>
    <url-pattern>/TomcatTest/PageHitCounter</url-pattern>
  </servlet-mapping>
</web-app>

次に、http://localhost:8080/TomcatTest/PageHitCounter にアクセスして、このServletを呼び出します。ページが更新されるたびにカウンターの値が1増加し、結果は次のようになります。

総クリック数

6


ウェブサイトクリックカウンター

多くの場合、Webサイト全体の総クリック数を知りたいと思うことがあります。Servletではこれも非常に簡単で、フィルタを使用して実現できます。

以下は、フィルタのライフサイクルに基づくシンプルなウェブサイトクリックカウンターを実装するために必要な手順です。

  • フィルタの init() メソッドでグローバル変数を初期化します。
  • doFilter メソッドが呼び出されるたびに、グローバル変数をインクリメントします。
  • 必要に応じて、フィルタの destroy() 内でデータベーステーブルを使用してグローバル変数の値を保存できます。次回フィルタを初期化するときに、その値を init() メソッド内で読み取ることができます。この手順は任意です。

ここでは、Webコンテナが再起動されないことを想定しています。再起動されるか、Servletが破棄されると、クリックカウンターはリセットされます。

実例

この実例では、シンプルなウェブサイトクリックカウンターの実装方法を示します。

// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class SiteHitCounter implements Filter{
    
  private int hitCount; 
               
  public void  init(FilterConfig config) 
                    throws ServletException{
     // 重置点击计数器
     hitCount = 0;
  }

  public void  doFilter(ServletRequest request, 
              ServletResponse response,
              FilterChain chain) 
              throws java.io.IOException, ServletException {

      // 把计数器的值增加 1
      hitCount++;

      // 输出计数器
      System.out.println("网站访问统计:"+ hitCount );

      // 把请求传回到过滤器链
      chain.doFilter(request,response);
  }
  public void destroy() 
  { 
      // 这一步是可选的,但是如果需要,您可以把 hitCount 的值写入到数据库
  } 
} 

それでは、上記のServletをコンパイルし、web.xml ファイルに次のエントリを作成しましょう。

....
<filter>
   <filter-name>SiteHitCounter</filter-name>
   <filter-class>SiteHitCounter</filter-class>
</filter>

<filter-mapping>
   <filter-name>SiteHitCounter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

....

次に、http://localhost:8080/ など、Webサイトの任意のページにアクセスします。任意のページがクリックされるたびにカウンターの値が1増加し、ログに次のメッセージが表示されます。

网站访问统计: 1
网站访问统计: 2
网站访问统计: 3
网站访问统计: 4
网站访问统计: 5
..................
その他の拡張