連載
» 2003年06月20日 00時00分 公開

基礎から学ぶサーブレット/JSP(6):JSPの基本「暗黙オブジェクト」をさらに極める (1/3)

[山田祥寛,@IT]

 今回もJSP 1.2の暗黙オブジェクトについて解説します。前回「JSPの基本「暗黙オブジェクト」を使う」では本連載で紹介する予定の7つの暗黙オブジェクトのうち、3つまでを紹介しました。今回は下表のapplicationオブジェクト以降を解説します(*のものは除く)。

表1 JSP 1.2における暗黙オブジェクト
暗黙オブジェクト 概要
out コンテンツを出力する手段を提供
request リクエスト(要求)情報にアクセスする手段を提供
session セッション内で共有可能な情報を管理
application コンテナ単位に生成され、ユーザー間で共有可能な情報を管理
response レスポンス(応答)情報を制御する手段を提供
exception JSPページ内で発生した例外(エラー)情報を管理
config 初期化パラメータにアクセスする手段を提供
page * JSPページそのもの(JSPページ内で使用することはほとんどありません)
pageContext * 各暗黙オブジェクトにアクセスする手段を提供(JSPページ内で使用することはほとんどありません)

アプリケーション共通のデータをつかさどる−applicationオブジェクト−

 sessionオブジェクトがユーザー単位の共通情報を管理するものであったのに対し、applicationオブジェクトはアプリケーション単位の共通情報を管理します。つまり、applicationオブジェクトを使用することで、複数ユーザー間で共通して使用する情報を管理することが可能です。

アプリケーション情報の参照・設定

 例えば、以下の例ではapplicationオブジェクトを介して、簡単なアクセスカウンタを作成します。ファイルやデータベースにデータを格納するわけではありませんので、コンテナ(Tomcat)を再起動させたらデータはクリアされてしまいますが、コンテナが稼働している間は情報が保持されることを確認してみてください。

application.jsp
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
String strCnt=(String)(application.getAttribute("cnt"));
if(strCnt==null){
strCnt="1";
}else{
strCnt=Integer.toString(Integer.parseInt(strCnt)+1);
}
application.setAttribute("cnt",strCnt);
%>
<html>
<head>
<title>簡易アクセスカウンタ(applicationオブジェクト)</title>
</head>
<body>
現在のアクセス数は<%=strCnt%>です。
</body>
</html>
アクセス数がカウントされる アクセス数がカウントされる

 getAttributeメソッドは指定されたアプリケーション情報(属性)を取得します。ここでは、アクセスカウント数を格納したアプリケーション属性「cnt」を取得し、null(空)である場合には初期値として1を、そうでない場合にはカウンタに1を加算したものをセットします(setAttributeメソッド)。

 なお、setAttributeメソッドは属性値としてint型のようなプリミティブ型(クラスでない基本データ型)は受け取ることができない点に注意してください。ここでは、いったんカウンタ値をStringオブジェクトに変換してからセットしています。

初期化パラメータの活用

 JSPでは、アプリケーションルートの配下に「/WEB-INF/web.xml」(「配備記述子」または「デプロイメント・ディスクリプタ」ともいいます)というファイルを配置することで、アプリケーション共通の初期化パラメータを設定することが可能です。

 以下のサンプルでは、web.xml上で定義された初期化パラメータ「driverName」と「connectString」を引用し、データベースへの接続を確立してみることにしましょう。データベース接続情報など、環境に依存する情報は直接にコード中に記述するのではなく、web.xml上で一元管理することでメンテナンス性を向上させることができます。

application_init.jsp
<%@ page contentType="text/html;charset=Shift_JIS" import="java.sql.*" %>
<%
Class.forName(application.getInitParameter("driverName"));
Connection db=DriverManager.getConnection(
application.getInitParameter("connectString"));
/* ...データベースへの一連の処理が行われる... */
db.close();
%>
web.xml
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <context-param>
    <param-name>driverName</param-name>
    <param-value>org.gjt.mm.mysql.Driver</param-value>
  </context-param>
  <context-param>
    <param-name>connectString</param-name>
    <param-value>jdbc:mysql://localhost/dbName?user=userName&password=
passwordNumber&useUnicode=true&characterEncoding=Shift_JIS</param-value>
  </context-param>
</web-app> 

 application.getInitParameterメソッドは、web.xmlの要素で定義された初期化パラメータを取得します。getInitParameterメソッドは指定されたパラメータ名をピンポイントで取得しますが、もしも定義されたすべての初期化パラメータ(名)を取得したいという場合には、getInitParameterNamesメソッドを使用します。

 要素は必ず1組の 要素を含みます。複数の初期化パラメータを定義したい場合には、複数の要素を列挙してください。ここでは、データベース接続に必要なドライバクラス名(driverName)と接続に必要なURL情報(connectString)を定義しています。

 なお、個別のサーブレット/JSP固有のパラメータを指定したいという場合には、要素ではなく、要素で定義する必要があります。要素による初期化パラメータの定義方法については、configオブジェクトの項でご紹介することにしましょう。

applicationオブジェクトのそのほかのメソッド

 以下に、ここまで紹介したgetAttribute、setAttributeメソッドのほか、applicationオブジェクトに用意されている主なメソッドを挙げておきます。

表2 applicationオブジェクトの主なメソッド
メソッド 概要
getAttributeNames() すべてのアプリケーション属性名を取得
getMajorVersion() サーブレットのメジャーバージョンを取得
getMinorVersion() サーブレットのマイナーバージョンを取得
getRealPath(path) 指定された仮想パスを物理パスに変換
getServerInfo() コンテナの名前、バージョンを取得
getInitParameter(name) 指定された初期化パラメータを取得
getInitParameterNames() すべての初期化パラメータ名を取得
log(msg) 指定されたメッセージをコンテナ標準のログに記録
removeAttribute(name) 指定されたアプリケーション属性(name)を削除

applicationオブジェクトは、アプリケーション共通情報の操作や実行環境に関する情報を取得する場合に使用します。


       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。