タイトル
TOPJavaJSP → This Page

JSP暗黙オブジェクト

前置き

ここではJavaJSP(JavaServer Pages)の暗黙オブジェクトについてふれていきます。

暗黙オブジェクトとは

暗黙オブジェクトはJSPページ内のスクリプトレットや式構文内で事前の宣言を行うことなく
使用することが可能なオブジェクトである。

暗黙オブジェクトの種類

暗黙オブジェクトオブジェクト型概要
application javax.servlet.ServletContext コンテナ単位に生成され、ユーザー間で共有可能な情報を管理
config javax.servlet.ServletConfig 初期化パラメータにアクセスする手段を提供
exception java.lang.Throwable 例外(エラー)情報を管理
out javax.servlet.jsp.JspWriter クライアントにコンテンツを出力する手段を提供
page javax.servlet.jsp.HttpJspPage JSPページそのもの
JSPページ内で使用することはほとんどない
pageContext javax.servlet.jsp.PageContext 各暗黙オブジェクトにアクセスする手段を提供
JSPページ内で使用することはほとんどない
request javax.servlet.http.HttpServletRequest リクエスト(要求)情報にアクセスする手段を提供
response javax.servlet.http.HttpServletResponse レスポンス(応答)情報を制御する手段を提供
session javax.servlet.http.HttpSession セッション内で共有可能な情報を管理

application オブジェクト

アプリケーション単位の共通情報を管理するために用いる。
メソッド 戻り型 概要
getAttribute(String) Object 指定された名前のアプリケーション属性値を返す
属性がない場合は null を返す
getAttributeNames() Enumeration 全てのアプリケーション属性名を返す
getContext(String) ServletContext 指定された URI の ServletContext オブジェクトを返す
getInitParameter(String) String 指定された名前の初期化パラメータを返す
パラメータがない場合は null を返す
getInitParameterNames() Enumeration 全ての初期化パラメータ名を返す
初期化パラメータ名がない場合は空の Enumeration オブジェクトを返す
getMajorVersion() int サーブレットのメジャーバージョンを返す
getMinorVersion() int サーブレットのマイナーバージョンを返す
getRealPath(String) String 指定された仮想相対パスを仮想絶対パスに変換して返す
getServerInfo() String J2EE コンテナの名前、バージョンを返す
log(String) void 指定されたメッセージを J2EE コンテナ標準のログに記録
log(String, Throwable) void 指定されたメッセージと例外情報を J2EE コンテナ標準のログに記録
removeAttribute(String) void 指定された名前のアプリケーション属性を application スコープから削除
setAttribute(String, Object)
(属性名, 属性値)
void 指定された名前のアプリケーション属性に指定された属性値を application スコープに設定

例 簡易アクセスカウンタ(ただし J2EE コンテナを再起動させるとデータはクリアされる)
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
	String strCount = application.getAttribute("count");
	if (strCount == null)
	{
		strCount = "1";
	}
	else
	{
		strCount = Integer.toString(Integer.parseInt(strCount) + 1);
	}
	application.setAttribute("count", strCount);
%>
<html>
<body>
アクセス数は<%= strCount %>です
</body>
</html>

アプリケーションルートの配下に /WEB-INF/web.xml というファイルを配置することで
アプリケーションに共通な初期化パラメータを設定することが可能である。
このファイルをデプロイメント・ディスクリプタ(もしくは配備記述子)という。
例 初期化パラメータよりページの作者名を取得して表示
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
	String strAuthName = application.getInitParameter("authName");
%>
<html>
<body>
このページの作者は<%= strAuthName %>です
</body>
</html>

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>authName</param-name>
		<param-value>みっちー</param-value>
	</context-param>
</web-app>

config オブジェクト

デプロイメント・ディスクリプタで定義された初期化パラメータにアクセスするために用いる。
メソッド 戻り型 概要
getInitParameter(String) String 指定された名前の初期化パラメータを返す
パラメータがない場合は null を返す
getInitParameterNames() Enumeration 全ての初期化パラメータ名を返す
初期化パラメータ名がない場合は空の Enumeration オブジェクトを返す
getServletContext() ServletContext JSPが実行されている ServletContext オブジェクトを返す
getServletName() String 現在のサーブレット論理名(servlet-name 要素)を返す

例 初期化パラメータよりページのタイトルを取得して表示
<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
	String strTitle = (String)(config.getInitParameter("pageTitle"));
%>
<html>
<body>
<h1><%= strTitle %></h1>
</body>
</html>

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>
	<servlet>
		<servlet-name>menu</servlet-name>
		<jsp-file>/java/menu.jsp</jsp-file>
		<init-param>
			<param-name>pageTitle</param-name>
			<param-value>Java のコーナー</param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>menu</servlet-name>
		<url-pattern>/java/menu.jsp</url-pattern>
	</servlet-mapping>
</web-app>

exception オブジェクト

ページ内で発生した例外(エラー)情報参照するために用いる。
ただし、page ディレクティブの isErrorPage 属性が true になっている必要がある。
メソッド 戻り型 概要
getMessage() String 詳細なエラーメッセージを返す
getLocalizedMessage() String 地域対応されたエラーメッセージを返す
printStackTrace() void スタックトレースを出力
toString() String 例外クラス名とエラーメッセージを返す

例 calc.jspページで例外が発生した場合に error.jspにリダイレクトする

calc.jsp
<%@ page contentType="text/html;charset=Shift_JIS" errorPage="error.jsp" %>
<html>
<body>
<%= 10 + "abc"; %>
</body>
</html>

error.jsp
<%@ page contentType="text/html;charset=Shift_JIS" isErrorPage="true" %>
<html>
<body>
<h1>エラーが発生しました</h1>
<pre>
<%= exception.toString() %>
</pre>
</body>
</html>

out オブジェクト

クライアントにコンテンツを出力するために用いる。
メソッド 戻り型 概要
clear() void バッファのデータをクリア
バッファの内容が出力済み、バッファ処理が無効の場合はエラー
clearBuffer() void バッファのデータをクリア
バッファの内容が出力済みでも使用可
close() void 出力を終了
flush() void バッファの内容を強制的に出力
getBufferSize() int 現在確保されているバッファのサイズを返す
バイト単位
getRemaining() int 未使用バッファのサイズを返す
バイト単位
isAutoFlush() boolean true の場合、出力サイズがバッファを超えたタイミングで自動出力
false の場合はエラー
newLine() void 改行文字を出力 Windows では \n、UNIX では \n\r
print(文字列) void 文字列を出力
println(文字列) void 文字列の末尾に改行を付けて出力

pageContext オブジェクト

JSPで使われる全オブジェクトを管理することができる。
メソッド 戻り型 概要
findAttribute(String) Object 指定された名前に対するデータ値を返す
データは page スコープ、request スコープ、session スコープ、application スコープの順に検索される
該当するデータがない場合は null が返される
forward(String) void 指定された URI にリダイレクトする
このメソッドの前に何らかの値を出力処理が行われている場合はエラーとなる
getAttribute(String, int)
(名前, スコープ)
Object 指定された名前、スコープに対するデータ値を返す
該当するデータがない場合は null が返される
getAttributeNamesInScope(int) Enumeration 指定されたスコープの全データ名を返す
getAttributesScope(String) int 指定された名前のデータが属するスコープを返す
該当するデータがない場合は 0 が返される
getException() Exception exception オブジェクトを返す
getOut() JspWriter out オブジェクトを返す
getPage() Object page オブジェクトを返す
getRequest() ServletRequest request オブジェクトを返す
getResponse() ServletResponse response オブジェクトを返す
getServletConfig() ServletConfig ServletConfig オブジェクトを返す
getServletContext() ServletContext ServletContext オブジェクトを返す
getSession() HttpSession session オブジェクトを返す
include(String) void 指定された URI のリソースを実行し、処理結果を転送元に戻す
removeAttribute(String, int)
(名前, スコープ)
void 指定された名前、スコープに対するデータを削除する
該当するデータがない場合は何もしない
setAttribute(String, Object, int)
(データ名, データ値, スコープ)
void 指定された名前、スコープに対するデータを設定する

スコープは以下の定数が定義されている。
・pageContext.APPLICATION_SCOPE
・pageContext.SESSION_SCOPE
・pageContext.REQUEST_SCOPE
・pageContext.PAGE_SCOPE

例
<%
	pageContext.setAttribute("userid", "101102", pageContext.SESSION_SCOPE);
	pageContext.setAttribute("value", 100, pageContext.REQUEST_SCOPE);
	pageContext.include("/include.jsp");
%>

request オブジェクト

メソッド 戻り型 概要
getAttribute(String) void 指定された名前のリクエスト属性を返す
getAttributeNames() Enumeration 全てのリクエスト属性名を返す
getAuthType() String 認証の種類を返す
getCookies() Cookie[] 全てのクッキー情報を返す
getContentLength() int データ本体のバイト長を返す
getContextPath() String コンテキストパスを返す
getHeader(String) String 指定された名前のヘッダ情報値を返す
ヘッダーが存在しない場合は null が返される
getHeaderNames() Enumeration 全てのヘッダ情報名を返す
指定された名前のヘッダ情報値を返す
getHeaders(String) Enumeration 指定された名前のヘッダ情報値を返す
getLocale() Locale ロケールを返す
getMethod() String HTTP メソッドの種類を返す
getPathInfo() String 拡張パス情報を返す
getParameter(String) String 指定された名前のリクエストパラメータ値を返す
ただし、1つのキーで複数の値を持つ場合(xxx.jsp?prm=aaa&prm=bbb)は最初の値のみ返す
リクエストパラメータが存在しない場合は null が返される
getParameterMap() Map 全てのリクエストパラメータを Map オブジェクトで返す
getParameterNames() Enumeration 全てのリクエストパラメータ名を返す
getParameterValues(パラメータ名) String[] 指定された名前のリクエストパラメータ値を文字列配列として返す
1つのキーで複数の値を持つ場合(xxx.jsp?prm=aaa&prm=bbb)に用いる
リクエストパラメータが存在しない場合は null が返される
getRemoteAddr() String クライアントの IP アドレスを返す
getRemoteUser() String ログインユーザー名を返す
setCharacterEncoding(String) void リクエストパラメータ値をエンコードするエンコード方式を指定
リクエストパラメータ値を取得する前に指定する必要がある
getServletPath() String サーブレットパスを返す
isRequestedSessionIdFromCookie() boolean セッション ID が Cookie 経由で授受しているかを返す
isUserInRole(String) boolean カレントユーザーが指定ロール権限を持っているかを返す
removeAttribute(String) void リクエスト属性を削除
setAttribute(String, Object)
(パラメータ名, パラメータ値)
void 指定されたパラメータ名に指定されたパラメータ値を設定
setCharacterEncoding(String) void リクエスト情報の文字コードを設定

例 リクエストデータを一覧表示する
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<html>
<body>
<table>
<tr>
	<th>キー名</th>
	<th>値</th>
</tr>
<%
request.setCharacterEncoding("Shift_JIS");
Enumeration objEnm = request.getParameterNames();
while (objEnm.hasMoreElements())
{
	String strKeyName = (String)(objEnm.nextElement());
	String[] strValue = request.getParameterValues(strKeyName);
	String strValues = "";
	for (int i = 0; i < strValue.length; i++)
	{
		if (i != 0)
		{
			strValues += ",";
		}
		strValues += strValue[i];
	}
%>
	<tr>
		<td><%= strKeyName %></td>
		<td><%= strValues %></td>
	</tr>
<%
}
%>
</table>
</body>
</html>


例 ヘッダ情報を一覧表示する
<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<html>
<table>
<%
	Enumeration objEnm = request.getHeaderNames();
	while(objEnm.hasMoreElements())
	{
		String strKeyName = (String)(objEnm.nextElement());
%>
	<tr>
	<th nowrap><%= strKeyName %></th>
	<td nowrap><%= request.getHeader(strKeyName) %></td>
	</tr>
<%
	}
%>
</table>
</html>

response オブジェクト

レスポンス(応答)情報を制御する際に用いる
メソッド 戻り型 概要
addCookie(Cookie) void 指定した Cookie オブジェクトをクライアントに返す
呼び出すごとに Cookie オブジェクトが追加され、複数の Cookie オブジェクトを指定することが可能
addDateHeader(String, long)
(ヘッダ名, ヘッダ値)
void 指定された名前のヘッダを指定値(日付型)で追加
addHeader(String, String)
(ヘッダ名, ヘッダ値)
void 指定された名前のヘッダを指定値(文字列型)で追加
addIntHeader(String, int)
(ヘッダ名, ヘッダ値)
void 指定された名前のヘッダを指定値(数値型)で追加
containsHeader(String) boolean 指定された名前のヘッダがすでに発行されているかどうかを返す
encodeURL(String) String URLにセッションIDを付加
encodeRedirectURL(String) String URLにセッションIDを付加(sendRedirect メソッド用)
isCommitted() boolean ヘッダが出力済みかどうかを返す
sendError(int) void 指定された HTTP プロトコルのエラーステータスコードをクライアントに返す
sendRedirect(String) void 指定 URI にリダイレクト
setContentLength(int) void 指定された長さにコンテンツ長をセット
setDateHeader(String, long) void 指定のヘッダ名、ヘッダ値(日付型)よりヘッダーデータをクライアントに返す
ヘッダー値は 1970/01/01 からの経過時間をミリ秒で指定
setHeader(String, String) void 指定のヘッダ名、ヘッダ値(文字列型)よりヘッダーデータをクライアントに返す
setDateHeader(String, long) void 指定のヘッダ名、ヘッダ値(日付型)よりヘッダーデータをクライアントに返す
setIntHeader(String, int) void 指定のヘッダ名、ヘッダ値(数値型)よりヘッダーデータをクライアントに返す
setStatus(int) void HTTP ステータスコードをクライアントに返す

例 クライアントのキャッシュを無効化

<%@ page contentType="text/html;charset=Shift_JIS" import="java.util.*" %>
<%
	Calendar objCal1 = Calendar.getInstance();
	Calendar objCal2 = Calendar.getInstance();
	objCal2.set(1970, 0, 1, 0, 0, 0);
	response.setDateHeader("Last-Modified", objCal1.getTime().getTime());
	response.setDateHeader("Expires", objCal2.getTime().getTime());
	response.setHeader("progma", "no-cache");
	response.setHeader("Cache-Control", "no-cache");
%>

session オブジェクト

セッション内で共有可能な情報を管理するために用いる。
ただし、page ディレクティブの session 属性が false の場合は使用出来ない。
(デフォルトは true)
メソッド 戻り型 概要
getAttribute(String) Object 指定された名前のセッション属性値を返す
getAttributeNames() Enumeration 全てのセッション属性名を返す
getCreationTime() long セッションの生成時刻を返す
getId() String セッションを一意に識別するセッション ID を返す
getLastAccessedTime() long セッションへの最終アクセス時刻を返す
getMaxInactiveInterval() int セッションのタイムアウト時間を秒で返す
getServletContext() ServletContext セッションが属している ServletContext オブジェクトを返す
invalidate() void セッションを破棄
isNew() boolean 新しく生成されたセッションかどうかを返す
removeAttribute(String) void 指定された名前のセッション属性を削除
setAttribute(String, Object)
(セッション属性名, セッション属性値)
void 指定された属性名に指定された属性値を設定
setMaxInactiveInterval(int) void セッションのタイムアウトを指定秒に設定

例 2回目以降のアクセスを検知

<%@ page contentType="text/html;charset=Shift_JIS" %>
<%
	if (session.getAttribute("comeon") != null)
	{
		out.print("アクセス済みです");
		out.close();
	}
	session.setAttribute("comeon", "1");
%>
<html>
<body>
	一回目です
</body>
</html>

更新履歴

2013/12/09 記述ミス修正
2007/12/01 Javaのコーナー細分化に伴い、URL の変更


TOPJavaJSP → This Page