クラス WebCountServlet

java.lang.Object
  上位を拡張 javax.servlet.GenericServlet
      上位を拡張 javax.servlet.http.HttpServlet
          上位を拡張 WebCountServlet
すべての実装されたインタフェース:
java.io.Serializable, javax.servlet.Servlet, javax.servlet.ServletConfig

public class WebCountServlet
extends javax.servlet.http.HttpServlet

  Web アクセスカウンタサーブレット

  $Id: WebCountServlet.java,v 1.1 2008/01/11 15:34:34 isao Exp $
  Copyright(c) 2005, isao yasuda, All Rights Reserved.
 ----
 1.仕様
 (1)初期パラメータ値を取得する
   - カウンタファイルディレクトリ
   - 画像ファイルディレクトリURL
   - ログファイル名 (絶対パス)
   - 更新インターバル (同一IP更新設定時間)
   - 参照管理テーブルパケット数 (カウンタの総数が目安)
   - URLチェック用正規表現
 (2)リクエストパラメータ (get/post メソッド)
   - id=カウンタID 
   - ty=画像ファイルプレフィックス
      指定あり "*": カウンタ画像出力 (数値からカウンタ画像を生成する) 
      指定あり 他 : 指定値+数字.gif でカウンタ画像出力 (gif) 
      指定なし    : テキスト出力 (JSP,SSI でページに挿入する)
   - md=要求モード 
      r: 参照モード      カウンティングしない - カウンタ表示あり
      n: カウントモード  カウンティングする   - カウンタ表示なし
      *: カウントモード  カウンティングする   - カウンタ表示あり
     (* 上記以外)
 (3)カウンタファイルが存在しない場合初期作成する.
 (4)リファラが URL チェック用正規表現にマッチしない場合処理を中止する.
 (5)カウンタ値の read, 更新, write はスレッドセーフとする.
 (6)要求IP,IDが直前と同じ,かつ前回から設定時間内の場合カウントアップしない.
 (7)リファラ,日時をログに記録する.

 2.使用方法例
 (1)画像出力の場合
   HTML でカウンタを表示したいところに以下を記述する.:
   <img src="http://host/webcount/counter?id=xxx&ty=y&md=z">
   - id, ty, md は仕様を参照.URLは tomcat 設定に依存する.
   <img src="http://host/webcount/counter?id=000&ty=s&md=r">
   - カウンタID 000 を参照のみ.カウンタは s0.gif〜s9.gifで合成表示する.
   <img src="http://host/webcount/counter?id=abc&ty=*&md=x">
   - カウンタID abc をカウントアップ.値はシステムフォントで生成する.
   <img src="http://host/webcount/counter?id=a01&&md=r">
   - カウンタID a01 をカウントアップ.カウンタは表示しない.
 (2)テキスト出力の場合
   JSP でカウンタを表示したいところに以下のような記述を挿入する.
   <jsp:include page="counter" flush="true">
     <jsp:param name="id" value="c00" />
     <jsp:param name="md" value="r" />
   </jsp:include>
   - カウンタID c00 を参照のみで, テキスト表示する(ty 省略).

 3.Tomcat 設定
 - 配備パス(例)
   $CATALINA_HOME/webapps
     |
     +- /webcount -+- /WEB-INF -+- web.xml
                   |            +- classes -+- WebCountServlet.class
                   |            |           +- WebCounter.class
                   |            |           +- WebAccess.class
                   |            +- lib     --- Acme.jar
                   +- /img  ------------------ s0.gif ~ s9.gif (samples)
                   +- /api  ------------------ documents

 - server.xml
   <Context path="/webcount" docBase="webcount" debug="0"
            reloadable="true" crossContext="true" />
    (モジュールが更新されたらリロードされる設定)
 
 - web.xml
   サンプル参照

 4.環境設定の注意事項
 (1)ACME Labs の Acme.JPM パッケージが gif 画像生成のため必要である.
   http://www.acme.com/java/software/
 (2)awt パッケージを用いて画像出力を行うため,ディスプレイ設定が必要
   UNIX では tomcat 起動の前に以下のいずれかを行う必要がある.
 - X11 起動後 "xhost +" を実行し, DISPLAY 環境変数を設定しておく.
 - Xvfb を設定し, 起動しておく.

 5.参考文献
 (1)カウンタ画像合成方法など:
   J. Hunter, W. Crawford 著, 中田 秀基 訳,
   『Javaサーブレットプログラミング 第2版』, オライリー・ジャパン(2002.1)
 

バージョン:
$Id: WebCountServlet.java,v 1.1 2008/01/11 15:34:34 isao Exp $
作成者:
安田 功 (Isao YASUDA)
関連項目:
直列化された形式

フィールドの概要
(package private) static java.io.BufferedWriter clog
          ログライタ
(package private) static java.lang.String cntDebug
          デバッグモード
(package private) static java.lang.String cntEntry
          参照管理テーブル(HashMap)パケット数 ≒ 格納IDエントリ総数
(package private) static java.lang.String cntFileDir
          カウンタファイルディレクトリ
(package private) static java.lang.String cntImgDirURL
          イメージファイル URL
(package private) static java.lang.String cntLogFile
          ログファイル名 (絶対パス)
(package private) static java.lang.String cntTime
          カウンターインターバル:秒 (同一ID,IP要求のカウンタ更新間隔)
(package private) static java.lang.String cntUrlChk
          チェックURL文字列
(package private) static boolean dbgflg
          デバッグフラグ
(package private) static int entries
          HashMap パケット数
(package private) static java.lang.String FONTNAME
          カウンタ画像フォント名
(package private) static int FONTSIZE
          カウンタ画像フォントサイズ
(package private) static int FONTSTYLE
          カウンタ画像フォントスタイル
(package private) static int HEIGHT
          カウンタ画像領域 高
(package private) static java.util.Map hm
          HashMap 参照管理テーブル
(package private) static long interval
          カウンターインターバル
(package private) static java.util.regex.Pattern[] ptns
          チェックURL文字列正規表現パターン
(package private) static int urlnum
          チェックURL文字列格納トークン数
(package private) static java.lang.String[] urls
          チェックURL文字列
(package private) static java.util.StringTokenizer urltoken
          チェックURL文字列格納トークン
(package private) static int WIDTH
          カウンタ画像領域 幅
(package private) static int XP
          カウンタ画像フォント描画 X座標
(package private) static int YP
          カウンタ画像フォント描画 Y座標
 
コンストラクタの概要
WebCountServlet()
           
 
メソッドの概要
 void destroy()
           Destroyメソッド: ログのクローズを行う.
 void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
           Getメソッドの要求パラメータに従い, カウンタ更新, カウンタ表示を行う
 void doPost(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp)
           Postメソッドの要求パラメータに従い, カウンタ更新, カウンタ表示を行う.
 void init()
           サーブレット初期化を行う
 void outImageDmyCounter(javax.servlet.ServletOutputStream out)
           ダミーカウンタ画像を出力する.
 void outImageExtCounter(java.lang.String count, javax.servlet.ServletOutputStream out, java.lang.String prefix)
           指定画像を合成してカウンタ出力する.
 void outImageGenCounter(java.lang.String count, javax.servlet.ServletOutputStream out)
           カウンタ画像を生成して出力する.
 int renewCounter(long nT, java.lang.String ip, WebAccess wa, WebCounter wc)
           カウンタを更新する.
 void writeCLog(java.lang.String mesg)
           カウンタログを出力する.
 
クラス javax.servlet.http.HttpServlet から継承されたメソッド
doDelete, doHead, doOptions, doPut, doTrace, getLastModified, service, service
 
クラス javax.servlet.GenericServlet から継承されたメソッド
getInitParameter, getInitParameterNames, getServletConfig, getServletContext, getServletInfo, getServletName, init, log, log
 
クラス java.lang.Object から継承されたメソッド
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

cntFileDir

static java.lang.String cntFileDir
カウンタファイルディレクトリ


cntImgDirURL

static java.lang.String cntImgDirURL
イメージファイル URL


cntLogFile

static java.lang.String cntLogFile
ログファイル名 (絶対パス)


cntEntry

static java.lang.String cntEntry
参照管理テーブル(HashMap)パケット数 ≒ 格納IDエントリ総数


cntTime

static java.lang.String cntTime
カウンターインターバル:秒 (同一ID,IP要求のカウンタ更新間隔)


cntUrlChk

static java.lang.String cntUrlChk
チェックURL文字列


cntDebug

static java.lang.String cntDebug
デバッグモード


entries

static int entries
HashMap パケット数


interval

static long interval
カウンターインターバル


hm

static java.util.Map hm
HashMap 参照管理テーブル


dbgflg

static boolean dbgflg
デバッグフラグ


clog

static java.io.BufferedWriter clog
ログライタ


urltoken

static java.util.StringTokenizer urltoken
チェックURL文字列格納トークン


urlnum

static int urlnum
チェックURL文字列格納トークン数


urls

static java.lang.String[] urls
チェックURL文字列


ptns

static java.util.regex.Pattern[] ptns
チェックURL文字列正規表現パターン


WIDTH

static final int WIDTH
カウンタ画像領域 幅

関連項目:
定数フィールド値

HEIGHT

static final int HEIGHT
カウンタ画像領域 高

関連項目:
定数フィールド値

FONTNAME

static final java.lang.String FONTNAME
カウンタ画像フォント名

関連項目:
定数フィールド値

FONTSTYLE

static final int FONTSTYLE
カウンタ画像フォントスタイル

関連項目:
定数フィールド値

FONTSIZE

static final int FONTSIZE
カウンタ画像フォントサイズ

関連項目:
定数フィールド値

XP

static final int XP
カウンタ画像フォント描画 X座標

関連項目:
定数フィールド値

YP

static final int YP
カウンタ画像フォント描画 Y座標

関連項目:
定数フィールド値
コンストラクタの詳細

WebCountServlet

public WebCountServlet()
メソッドの詳細

init

public void init()
          throws javax.servlet.ServletException
 サーブレット初期化を行う.
 (1)初期パラメータを取得する.
 (2)更新インターバル, 参照管理テーブルの初期化, ログ割当てを行う.
 

オーバーライド:
クラス javax.servlet.GenericServlet 内の init
例外:
javax.servlet.ServletException

doGet

public void doGet(javax.servlet.http.HttpServletRequest req,
                  javax.servlet.http.HttpServletResponse resp)
           throws java.io.IOException,
                  javax.servlet.ServletException
 Getメソッドの要求パラメータに従い, カウンタ更新, カウンタ表示を行う.
 (1)要求パラメータ, ブラウザ情報を取得する.
 (2)参照管理テーブルからカウンタID情報を取得する.
 (3)指定モードによりカウンタ更新を行う.
 (4)指定タイプによりカウンタ画像を生成しブラウザに出力する.
 (5)ログを出力する. 
 

オーバーライド:
クラス javax.servlet.http.HttpServlet 内の doGet
例外:
java.io.IOException
javax.servlet.ServletException

doPost

public void doPost(javax.servlet.http.HttpServletRequest req,
                   javax.servlet.http.HttpServletResponse resp)
            throws java.io.IOException,
                   javax.servlet.ServletException
 Postメソッドの要求パラメータに従い, カウンタ更新, カウンタ表示を行う.
 (Getメソッドと内容は同じ)
 

オーバーライド:
クラス javax.servlet.http.HttpServlet 内の doPost
例外:
java.io.IOException
javax.servlet.ServletException

destroy

public void destroy()
 Destroyメソッド: ログのクローズを行う. 
 

定義:
インタフェース javax.servlet.Servlet 内の destroy
オーバーライド:
クラス javax.servlet.GenericServlet 内の destroy

renewCounter

public int renewCounter(long nT,
                        java.lang.String ip,
                        WebAccess wa,
                        WebCounter wc)
                 throws java.io.IOException
 カウンタを更新する.
 

例外:
java.io.IOException

outImageGenCounter

public void outImageGenCounter(java.lang.String count,
                               javax.servlet.ServletOutputStream out)
                        throws java.io.IOException
 カウンタ画像を生成して出力する.
 

例外:
java.io.IOException

outImageExtCounter

public void outImageExtCounter(java.lang.String count,
                               javax.servlet.ServletOutputStream out,
                               java.lang.String prefix)
                        throws java.io.IOException
 指定画像を合成してカウンタ出力する.
 

例外:
java.io.IOException

outImageDmyCounter

public void outImageDmyCounter(javax.servlet.ServletOutputStream out)
                        throws java.io.IOException
 ダミーカウンタ画像を出力する.
 

例外:
java.io.IOException

writeCLog

public void writeCLog(java.lang.String mesg)
               throws java.io.IOException
 カウンタログを出力する.
 

例外:
java.io.IOException


Copyright © 2005-2007, isao yasuda, All Rights Reserved.