Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

Java JSP/Servlet

JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート1:仕様説明編)

投稿日:2020年1月31日 更新日:

(0)目次&概説

(1) 仕様について
 (1-1) アーキテクチャ(アプリ/DB)
 (1-2) アプリの仕様概要
 (1-3) データベースの仕様概要
(2) ソースコード
(3) エラー対応

(1) 仕様について

(1-1) アーキテクチャ(アプリ/DB)

(1-1-1) やり方1:アプリ内で完結させる(一時的)

こちらは本記事では深くは扱いませんのでさわり程度に書きます。
アプリ内に閉じたカウンタ(DB接続なし)の場合はサーブレット内でカウンタ用の変数を定義して、初回呼出し(initメソッド)や二回目以降呼出し(doGetメソッド)が呼ばれる度にカウンタをインクリメントして行きます。処理の概要としては次のようになるイメージです。

分類 モジュール名
 ∟メソッド名
処理概要
初回呼出し XXXXX.java
 ∟init()
①カウンタ用の変数(int型)を定義します。
②ServeltConfigオブジェクトの「getServletContext()」メソッドを用いてServletContext型のインスタンスを作り、上記で定義したカウンタ変数をsetAttributeでセットします。
2回目以降呼出し XXXXX.java
 ∟doGet()
①カウンタ用の変数(int型)を定義し、getAttributeで現在のカウンタの値を取得します。
②カウンタをインクリメントします。
③setAttributeでインクリメントしたカウンターをセットします。

 (図1)

目次にもどる

(1-1-2) やり方2:データベースと連動させる(恒久的)

こちらが今回のメインテーマです。以降に記載する仕様等は全てこの「やり方2」に関する記載となります。
ユーザ画面のjsp(例:XXXX.jsp)からアクセスカウンターの役割をするサーブレット(例:AccessCounter2.java)のアクセスカウント用メソッドを呼び出します。そのメソッドの中でDBアクセスを行い、指定した画面IDのカウンターを更新・値取得を行います。

 (図2)

目次にもどる

(1-2) アプリの仕様概要

アプリケーション側の処理の概要を記載します。流れとして、大きく3つに分解しています。

① ユーザー画面
ユーザー画面のjspでアクセスカウンタ用のメソッドをコール

②サーブレット(アクセスカウンター)
アクセスカウンタ用のServletでDB接続用の各種メソッド(Connection・Statement・ResultSet・Close)をコールし、指定した画面のアクセスカウンター数を取得&更新する。

③DBアクセス部品
DB接続用メソッド(Connection返却)とStatement作成メソッド(Statement返却)とSQL発行&結果取得メソッド(ResultSet返却)とリソース解放メソッド(上記3つのClose)の4つを用意します。

(表)

分類 モジュール名
 ∟メソッド名
処理概要
ユーザー画面 [ 画面ID ].jsp (1) AccessCounterクラスをインスタンス化し、GetAccessCountメソッドを実行する事で、DBにある指定した画面のアクセス数をインクリメント(+1)

(2) getAttribute(“ABCD”)で、セットしたインクリメント後のカウンタの値を取得します。

サーブレット
(アクセスカウンタ)
AccessCounter2.java
 ∟GetAccessCount2
(0) DB接続&ステートメント作成
DB接続(Connection)とステートメント作成(Statement)を行います。

(1) カウンタの現在の値取得
SQL(SELECT文)を発行して、指定した画面IDの「現在のアクセスカウンタ値」を取得します。

(2) カウンタのインクリメント
SQL(UPDATE文)を発行して、指定した画面IDの「現在のカウンタ値」をインクリメント(+1)します。

(3) カウンタの更新後の値取得
再度SQL(SELECT文)を発行して、指定した画面IDの「更新後のカウンタ値」を取得します。

(4) 更新後の値をセット
取得した更新後の値をsetAttributeで、指定した画面IDの名前の属性にセットします(例えば画面名が”ABCD”なら、setAttribute(“ABCD”,[カウンタ値])をセット)

DBアクセス部品 DbConnectUtil.java
 ∟DbConnect
 ∟DbStatement
 ∟DbQuery
 ∟DbClose
DbConnect → Connectionオブジェクトをインスタンス化
DbStatement → Statementオブジェクトをインスタンス化
DbQuery → クエリを発行してResultSetをインスタンス化

(図3):(図2)を詳細化したもの


目次にもどる

(1-3) データベースの仕様概要

DB側でやる事は、アプリからアクセスされて更新をするための、アクセスカウンターテーブルの作成です。レコードは画面単位で作成し、アクセスカウントもその単位でカウントします。

<作業の流れ>

①SEQUENCEオブジェクトの作成
工夫した点として、SEQUENCEオブジェクトを用いて「一意な連番を付与」するカラムを作成しました。目的としては、UPDATE文の作成にあたって「どのカウンターを更新すれば良いか?」のWHERE句に指定するカラムとして使うためです。例えば画面「EGDGRPMN」の連番IDは「2」なので(図3)、UPDATE文の実行時に「WHERE COUNTER_ID=’2’のような形に指定する事で、狙った画面のカウンターを更新します(実際は’2’の部分は動的に変化させますが)

CREATE SEQUENCE ACCESS_SEQ;


②テーブルの作成
上記で作ったSEQUENCEオブジェクトを用いて、各画面のアクセスカウンターを保持するテーブルを作成します(CREATE TABLE文の発行)。
以下に実際のCREATE TABLE文の例を紹介します。

CREATE TABLE ACCESS_COUNTER
(
  COUNTER_ID NUMBER(8)
  ,FUNCTION_ID VARCHAR2(8) NOT NULL
  ,ACCESS_COUNT NUMBER(11) NOT NULL
  ,CONSTRAINT PK_ACCESS_COUNTER_0 PRIMARY KEY (COUNTER_ID)
) TABLESPACE RBWEGTBS;


③レコードの登録
作成したテーブルに「INSERT文」でアクセスカウンターのレコードを挿入します。(図3)のように画面毎にレコードを作り、カウンターの初期値は当然ですが「0」を設定します。またCOUNTER_IDカラムには「ACCESS_SEQ.NEXTVAL」でINSERTする事で、先ほど作ったSEQUENCEに沿った連番を付与しています。

INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGDLDNPG',0);
INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGDGRPMN',0);
INSERT INTO ACCESS_COUNTER (COUNTER_ID,FUNCTION_ID,ACCESS_COUNT) VALUES (ACCESS_SEQ.NEXTVAL,'EGSGRPMN',0);

 

(図3)

目次にもどる

(2) ソースコード

別記事「JSP/Servletで画面毎のアクセスカウンターを作成してみた(パート2:ソース解説編)」をご参照下さい。

目次にもどる

(3) エラー対応

(3-1) Java.sql.SQLRecoverableException: Closed Connection

このエラーが発生した際の対応については、下記の記事にて解説しているため割愛。
Java.sql.SQLRecoverableException: Closed Connectionの対応 
目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-Java, JSP/Servlet

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Javaでハッシュ値を計算する方法について

<目次> (1) Javaでハッシュ値を計算する方法について  (1-1) ハッシュを使った探索の概要  (1-2) ハッシュからアドレスを計算する方法  (1-3) サンプルプログラム (1) Ja …

Javaのフォーム認証でログインを行うと数回で固まってしまう事象の対処記録

<目次> (1) Javaのフォーム認証でログインを行うと数回で固まってしまう事象の対処記録  (1-1) 発生事象・エラーメッセージ  (1-2) 原因  (1-3) 対策 (1) Javaのフォー …

Twitter APIのRate Limit Exceedエラー(code – 88)を回避するための簡易的な対策について

<目次> (1) Twitter APIのRate Limit Exceedエラー(code – 88)を回避するための簡易的な対策について  (1-1) 対策①:APIの使用回数に閾値を設ける  ( …

JavaScriptのAddEventListenerの用途や使用例について

<目次> (1) JavaScriptのAddEventListenerの用途や使用例について  (1-1) 概要  (1-2) 構文  (1-3) サンプルプログラム (1) JavaScriptの …

JSP/Servletでウェルカムページが認証されない事象について

<目次> (1) JSP/Servletでウェルカムページが認証されない事象について  (1-1) 発生状況・エラーメッセージ  (1-2) 原因  (1-3) 対処 (1) JSP/Servletで …

  • English (United States)
  • 日本語
Top