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

47287 ワード

サーブレットクリックカウンタ
ホームページクリックカウンター
多くの場合、サイトの特定のページの総クリック数を知ることに興味があるかもしれません.これらのクリック数を計算するには、サーブレットのライフサイクルが実行されるコンテナによって制御されるため、サーブレットを使用します.
サーブレットライフサイクルに基づく簡単なWebクリックカウンタを実現するには、次の手順に従います.
Init()メソッドでグローバル変数を初期化します.
doGet()メソッドまたはdoPost()メソッドを呼び出すたびに、グローバル変数が増加します.
必要に応じて、データベース・テーブルを使用して、destroy()にグローバル変数の値を格納できます.この値は、次回サーブレットの初期化時にinit()メソッド内で読み出すことができます.このステップはオプションです.
1つのセッションに対して1回のページクリックをカウントしたい場合は、isNew()メソッドを使用して、セッションが同じページをクリックしたかどうかを確認します.このステップはオプションです.
グローバルカウンタの値を表示することで、ページの総クリック数をWebサイトに表示できます.このステップはオプションです.
ここでは、Webコンテナが再起動できないと仮定します.再起動またはサーブレットが破棄された場合、カウンタはリセットされます.
≪インスタンス|Instance|emdw≫
この例では、簡単な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\">
"
; out.println(docType + "<html>
"
+ "<head><title>" + title + "</title></head>
"
+ "<body bgcolor=\"#f0f0f0\">
"
+ "<h1 align=\"center\">" + title + "</h1>
"
+ "<h2 align=\"center\">" + hitCount + "</h2>
"
+ "</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
サイトクリックカウンター
多くの場合、サイト全体の総クリック数を知ることに興味があるかもしれません.サーブレットでは、これも非常に簡単で、フィルタを使用してこれを行うことができます.
フィルタライフサイクルに基づいた簡単なWebサイトクリックカウンタを実現するには、次の手順に従います.
フィルタのinit()メソッドでグローバル変数を初期化します.
doFilterメソッドが呼び出されるたびに、グローバル変数が増加します.
必要に応じて、データベース・テーブルを使用して、フィルタのdestroy()にグローバル変数の値を格納できます.この値は、次回フィルタを初期化するときにinit()メソッド内で読み取ることができる.このステップはオプションです.
ここでは、Webコンテナが再起動できないと仮定します.再起動またはサーブレットが破棄された場合は、カウンタをクリックするとリセットされます.
≪インスタンス|Instance|emdw≫
この例では、簡単な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
..................