サーブレットのクリックカウンター


Web ページのクリック カウンタ

Web サイトの特定のページの合計クリック数を知りたいと思うことがよくあるでしょう。サーブレットのライフサイクルはサーブレットが実行されるコンテナによって制御されるため、サーブレットを使用してこれらのヒットをカウントするのは非常に簡単です。

サーブレットのライフサイクルに基づいて単純な Web ページのクリック カウンタを実装するために必要な手順は次のとおりです:

  • init() メソッドでグローバル変数を初期化します。

  • doGet() または doPost() メソッドが呼び出されるたびに、グローバル変数をインクリメントします。

  • 必要に応じて、データベーステーブルを使用してグローバル変数の値を destroy() に保存できます。この値は、次回サーブレットが初期化されるときに init() メソッド内で読み取ることができます。このステップはオプションです。

  • セッションで 1 ページのクリックのみをカウントしたい場合は、isNew() メソッドを使用して、そのセッションで同じページがクリックされたかどうかを確認します。このステップはオプションです。

  • グローバルカウンターの値を表示することで、Webサイト上のページクリックの合計数を表示できます。このステップはオプションです。

ここでは、Web コンテナが再起動できないと仮定します。再起動が行われるか、サーブレットが破棄されると、カウンタはリセットされます。

この例は、単純な Web ページのクリック カウンタを実装する方法を示しています:

import java.io.*;
import java.sql.Date;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PageHitCounter extends HttpServlet{
    
  private int hitCount; 
               
  public void init() 
  { 
     // 重置点击计数器
     hitCount = 0;
  } 

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 设置响应内容类型
      response.setContentType("text/html");
      // 该方法在 Servlet 被点击时执行 
      // 增加 hitCount 
      hitCount++; 
      PrintWriter out = response.getWriter();
      String title = "总点击量";
      String docType =
      "<!doctype html public \"-//w3c//dtd html 4.0 " +
      "transitional//en\">\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 的值写入到数据库
  } 
}

次に、上記のサーブレットをコンパイルし、web.xml ファイルに次のエントリを作成しましょう:

....
 <servlet>
     <servlet-name>PageHitCounter</servlet-name>
     <servlet-class>PageHitCounter</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>PageHitCounter</servlet-name>
     <url-pattern>/PageHitCounter</url-pattern>
 </servlet-mapping>
....

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

合計クリック数

6


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

ウェブサイト全体の合計ヒット数を知りたいと思うことがよくあるでしょう。サーブレットではこれも非常に簡単で、フィルターを使用してこれを行うことができます。

フィルターのライフサイクルに基づいて簡単なウェブサイトのクリックカウンターを実装するために必要な手順は次のとおりです:

  • フィルターの init() メソッドでグローバル変数を初期化します。

  • doFilter メソッドが呼び出されるたびに、グローバル変数が増加します。

  • 必要に応じて、データベース テーブルを使用して、フィルターの destroy() にグローバル変数の値を保存できます。この値は、次回フィルタが初期化されるときに init() メソッド内で読み取ることができます。このステップはオプションです。

ここでは、Web コンテナが再起動できないと仮定します。再起動が行われるか、サーブレットが破棄されると、クリック カウンタはリセットされます。

この例は、単純なウェブサイトのクリックカウンターを実装する方法を示しています:

// 导入必需的 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 的值写入到数据库
  } 
}

次に、上記のサーブレットをコンパイルし、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>

....

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

网站访问统计: 1
网站访问统计: 2
网站访问统计: 3
网站访问统计: 4
网站访问统计: 5
..................