Rainbow Planet (GT×IT×SP×SA)

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

01_IT技術 (Technology) 03_Java

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審査用広告コード


-01_IT技術 (Technology), 03_Java

執筆者:


comment

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

関連記事

Linux基礎コマンド(第4回) viエディタの操作・ログの取得

初めてLinuxを触る人向けにTeraTermのログイン方法からコマンドを入力する方法まで数回にわたり解説していきます。本記事はその第4弾で、viエディタの使い方を簡単に紹介します。第1弾の記事はこち …

WindowsでCドライブの空き容量を監視するバッチプログラムについて

(0)目次&概説 今回はWindowsマシンのCドライブ空き容量をチェックし、閾値との比較によってアラートメッセージを出したりするバッチプログラムの作成について紹介します。このバッチを使ってタスクスケ …

Python開発環境にPandasライブラリをインストールする手順

(0)目次&概説 (1) Pandasの導入  (1-1) Pandasとは? (2) オフラインインストール  (2-1) インストール資源の入手  (2-2) インストール時の諸注意  (2-3) …

JSPとは?役割や基本文法およびHelloWorldのサンプルプログラムの紹介

(0)目次&概説 (1) JSPの基本  (1-1) JSPとは?  (1-2) JSPのHelloWorld (2) JSPの基本文法  (2-1) ディレクティブ  (2-2) アクションタグ   …

【PL/SQL】”UTL_FILE”パッケージを利用して”.TXT”を読み込む方法

今回はPL/SQLのUTL_FILEパッケージを利用して、サーバ内にあるテキストファイルを読み込むプロシージャを作成したいと思います。 (0) 目次 (1) 事前準備:ディレクトリオブジェクトの作成( …

Top