【Java Web入門 #6】JSPを利用した動的な表示(1)|暗黙オブジェクトとスクリプトレット
2025.01.17
JSPはテンプレートエンジンとして動的なコンテンツ生成を行うために、様々な標準機能が準備されています。当記事では、スクリプトレットや式の出力など、JSPの動的表示の最も基本的な「<%」で始まるタグの利用方法と、そこで利用できるJSPの暗黙オブジェクトについて説明します。
◆Java Web入門の過去記事はこちら
◆Java入門 記事一覧はこちら
目次
JSPの暗黙オブジェクト
スクリプトレットや式の中では、暗黙オブジェクトと呼ばれる変数が非常に多く利用されます。ここでは、タグの利用方法の前にこの暗黙オブジェクトについて簡単に説明します。
暗黙オブジェクトとは
JSPでは、記述するスクリプトレットまたは式の中で、特別に宣言を行わなくても利用できる変数がいくつか準備されています。
これらの変数に格納されているオブジェクトは、宣言を行わなくとも「暗黙のうちに」利用できることもあり、「暗黙オブジェクト」と呼ばれます。
暗黙オブジェクトはリクエストオブジェクト、レスポンスオブジェクトをはじめとした、Webアプリケーション内の処理でアクセスする頻度が高いオブジェクトに対して準備されています。
暗黙オブジェクトに対してはインポートや変数の宣言を省略可能とすることができるため、簡潔なJSPの記述に役立ちます。
暗黙オブジェクトの一覧
変数名 | オブジェクトのクラス /インターフェイス | オブジェクトの内容 |
request | HttpServletRequest(※1) | クライアントから受信したリクエストの情報 サーブレットで利用するリクエストオブジェクトと同一 |
response | HttpServletResponse(※1) | クライアントへ返却するレスポンスの情報 サーブレットで利用するレスポンスオブジェクトと同一 |
session | HttpSession(※1) | requestに紐づくセッションオブジェクト |
application | ServletContext(※2) | requestに紐づくアプリケーションオブジェクト |
pageContext | PageContext(※3) | JSPのページスコープオブジェクト JSP内で利用するオブジェクトを管理 |
out | JspWriter(※3) | JSPの実行結果を出力するオブジェクト |
config | ServletConfig(※2) | 初期化パラメータ情報オブジェクト web.xmlに定義したWebアプリケーションの初期化パラメータ(init-param)を参照可能 |
page | (java.lang.Object) | JSPページ自身を示すオブジェクト (javaコードにおけるthisと同様) |
exception | java.lang.Throwable | JSPページで発生した例外オブジェクト エラーページを作成する場合に利用 |
※2 Java/Jakarta EE 8 まではjavax.servletパッケージ、Jakarta EE 9 以降はjakarta.servletパッケージ
※3 Java/Jakarta EE 8 まではjavax.servlet.jspパッケージ、Jakarta EE 9 以降はjakarta.servlet.jspパッケージ
暗黙オブジェクトの利用
暗黙オブジェクトは、スクリプトレットおよび式の中で、定められた変数名を記述するだけで利用することができます。EL式の中では利用できません。(EL式には別の暗黙オブジェクトが存在します)
前回の記事(【Java Web入門 #5】オブジェクトの保持とスコープ)では、スコープの説明のためのコードの中で、request、session、application、pageContext の4つの暗黙オブジェクトを利用していました。(サンプル③ scopedata.jsp)
他の暗黙オブジェクトも同様に変数名を記述することでアクセスできますが、page や pageContext は、JSPページ自体やそのコンテキストに関する情報を取得するオブジェクトであり、カスタムタグを作成したり、特定の状況下で情報を取得したい場合などに利用されることが多く、共通部品などの開発以外ではあまり利用されることはありません。
また、exception はエラーが発生した際に例外情報を取得するオブジェクトで、エラーページを作成する際に主に利用されます。
<% で始まるJSPの構成要素
JSPのスクリプトレットは<% ~ %>の間に記述しますが、Javaの式の結果をコンテンツに出力させる<%= %>など、JSPには同じように「<%」で始まる要素が他にもあります。これらはJSPで利用される最も基本的な構成要素ですので、ここで順に説明します。
スクリプトレット
スクリプトレットは、JSPにJavaのコードを記述する場合に利用します。
記述形式:
<% [実行するコード] %>
開始タグ「<%」から終了タグ「%>」の間にコードを記述することができます。コード内では改行しても問題ありません。
暗黙オブジェクトの out を利用して、処理結果を出力することもできます。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<%
int a = 1;
int b = 2;
int sum = a + b;
%>
<head>
<meta charset="UTF-8">
<title>スクリプトレットの利用</title>
</head>
<body>
<% out.print( a + " + " + b + " = " + sum + " です。"); %>
</body>
</html>
実行結果:
式
JSPではJavaの式をそのまま出力することが可能です。プロパティの値を単独で出力したり、連結や計算した結果を出力することも可能です。
暗黙オブジェクトの他、スクリプトレットの中で宣言した変数なども利用できます。(式による出力を記述する位置より前に宣言されている必要があります)
スクリプトレットのように複雑な処理を記述することはできませんが、下記のサンプルコードのように式として表現できる範囲であれば、簡単な処理も記述できます。但し、可読性が下がる可能性があるため、画面仕様に関わる処理の呼出などはスクリプトレットでの記述が望ましいでしょう。
記述形式:
<%= [出力する式] %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta charset="UTF-8">
<title>式の利用</title>
</head>
<body>
ポート番号を2倍すると <%= (double) (request.getLocalPort() * 2) %> です。
</body>
</html>
実行結果:
(8080 × 2 の double型の結果を出力)
式の中では文字列以外にも、数値型やオブジェクトを利用することが可能ですが、出力対象がString以外のオブジェクトである場合は、対象オブジェクトのtoStringメソッドの実行結果(nullの場合は文字列「null」)が出力されます。
(ただし直接 <%= null %> と記述した場合はエラーとなります)
コメント
JSPファイル上には、コメントを記述することも可能です。コメント内で改行も可能ですので、複数行のコメントも記述することができます。
記述形式:
<%-- [コメント文字列] --%>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta charset="UTF-8">
<title>コメントの利用</title>
</head>
<body>
<p>↓ 次の行にJSPコメントを設定</p>
<p><%-- JSPコメントの書式を利用 --%></p>
<p>↓ 次の行にHTMLコメントを設定</p>
<p><!-- HTMLコメントの書式を利用 --></p>
<%
// スクリプトレットの中ではJavaコードと同じコメント(//)を利用可能
/* このコメントの書式も利用可能 */
%>
</body>
</html
JSPコメントは他と異なり終了タグが「--%>」であることに注意してください。
また、スクリプトレットのコード内でコメントアウトをする場合は、通常のJavaソースと同様に「//」や「/*」を使用します。
JSPコメントで記述されたコメントは、HTMLのコメント(<!-- [コメント文字列] -->)と異なり、Webブラウザ上に表示された画面のHTMLソースを確認しても、何も表示されません。
上記のJSPをブラウザ表示した結果と、そのHTMLコードは以下のようになります。
実行結果:
(WebブラウザでHTMLソースを表示)
宣言
JSPで利用する変数を宣言します。
通常、スクリプトレットの中で変数を宣言した場合は、メソッド変数として扱われ、JSPにアクセスするたびに初期化されますが、宣言のタグを利用した場合はメンバー変数(クラス変数)として扱われ、アプリケーションの終了または再起動まで初期化されません。
記述形式:
<%! 変数の宣言 %>
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta charset="UTF-8">
<title>変数宣言の利用</title>
</head>
<body>
<%! String access = ""; %>
<%
// アクセスごとに"★"を追加
access = access + "★";
%>
アクセス回数:<%= access %>
</body>
</html
上記のコードの8行目で宣言している変数「access」は、アプリケーションの起動中は初期化されないため、ページにアクセスするごとに「★」の数が増えることになります。
実行結果:
(1回目のアクセス)
(2回目のアクセス)
(3回目のアクセス)
ディレクティブ
ディレクティブは「<%@ 」で始まり、JSPの設定に関する以下の3種類の情報を記述できます。
pageディレクティブ
pageディレクティブでは、JSPページ自体の設定に関する情報を記述します。
記述形式:
<%@ page 属性名="[属性の設定値]" %> (属性は複数設定可能)
比較的使用頻度が高いもの:
以下の属性のうち、特にcontentTypeはコンテンツの種類と文字コードの指定を行うため、最も使用される属性と言えます。importはスクリプトレットを記述する際に多く使用されます。pageEncoding、sessionの2つは、主にデフォルト値以外を指定する必要がある場合に使用されます。
属性 | 設定内容 |
contentType | JSPから生成されるコンテンツの設定を "MIMEタイプ" または ”MIMEタイプ; charset=[コンテンツの文字コード]” のいずれかの形式で記述します。 MIMEタイプには「text/html」や「application/xml」「application/json」など、生成されるコンテンツのデータの種類を記述します。 記述例: contentType="text/html; chraset=utf-8" |
import | JSP内のコードで利用するJavaのクラスを記述します。Javaのコードと同様に、java.langパッケージのクラスは記述不要です。(暗黙オブジェクトのクラスも記述不要) 複数クラスをインポートする場合は、クラス名をカンマ区切りで記述します。 |
pageEncoding | JSPファイル自体のエンコーディング(文字コード)を記述します。 省略した場合はContentType属性に設定した「charset」の値が利用されます。 (charsetが指定されていない場合のデフォルト値は "ISO-8859-1"です) |
session | HTTPセッションに参加するかどうかを指定します。 「true」を指定した場合は、JSPページは参加中(セッションが未生成だった場合は新規)のHttpSessionオブジェクトにアクセスできます。 「false」を指定した場合はセッションに参加せず、暗黙オブジェクトsessionも利用できません。 省略した場合のデフォルト値は「true」です。 |
これらのディレクティブは必要な分だけ記述すれば良く、デフォルト値で利用する場合は省略することができます。
以下のJSPの例では、contentType属性でMIMEタイプと文字コード、import属性でスクリプトレットの中で利用するクラスのインポートを行っていますが、pageEncoding属性とsession属性は省略しています。
<%@ page contentType="text/html; charset=UTF-8"
import="java.util.Date, java.text.SimpleDateFormat"%>
<!DOCTYPE html>
<%
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String datetimeStr = df.format(new Date());
%>
<html>
<head>
<meta charset="UTF-8">
<title>現在日時の表示</title>
</head>
<body>
現在日時は <%= datetimeStr %> です。
</body>
</html>
使用頻度が低いもの:
以下の属性は上記の4つの属性に比べ使用頻度は低く、中でもlanguage属性は現時点ではJSP上で指定することはないと考えて問題ありません。
特にWebアプリケーションについて学び始めたばかりの方は、これらの属性について利用することはほとんどないと思いますが、このような指定ができるということだけご紹介します。
属性 | 設定内容 |
autoFlush | ページ出力オブジェクトのバッファがいっぱいになった時の動作を指定します。 「true」の場合は自動的にフラッシュ(出力先に送信)し、「false」の場合は例外を発生させます。 省略した場合のデフォルト値は「true」です。 ※buffer 属性の値が「none」である場合は、autoFlushの値は「true」である必要があります。 |
buffer | JSPのページ出力オブジェクト(JspWriter)のバッファリングモデルを指定します。 指定する場合はキロバイト単位の指定となり、サイズに「kb」を付けて指定する必要があります。 「none」を指定した場合は、JSPはバッファリングを行わず、ページの出力はクライアントに直接書き込まれます 省略した場合のデフォルト値は「8kb」(8キロバイト)です。 |
errorPage | JSPで例外が発生した際に表示するエラーページのURLを指定します。 エラーページに指定されたJSPは、isErrorPage属性の値が「true」である必要があります。 |
extends | JSPページがサーブレットクラスに変換される際のスーパークラスを指定します。 (通常は利用されません) |
info | JSPページに組み込まれる任意の文字列を定義します。 この文字列には、ページのServlet.getServletInfoメソッドからアクセスすることができます。 |
isErrorPage | 自身のJSPがエラーページとして作成されたページであるかどうかを指定します。 「true」の場合はエラーページとして作成されたページであり、暗黙オブジェクトのexceptionを利用して、発生した例外の情報を利用することができます。 「false」の場合は通常のページであり、暗黙オブジェクトexceptionには例外の情報は設定されません。 省略した場合のデフォルト値は「false」です。 |
isThreadSafe | ページに実装されているスレッドセーフのレベルを指定します。 (※servlet2.4以降では利用が推奨されていないため、詳細は割愛します) |
language | JSPファイルで扱うプログラム(スクリプトレット、式、宣言)で利用する言語を指定します。(省略した場合は「java」) ※現時点では「java」以外は指定できないため、実質的に利用されていません。 |
(参考)Jakarta Server Pages 3.0 ドキュメント(英語・外部サイト) 1.10.1. The page Directive
taglibディレクティブ
taglibディレクティブでは、JSPページの中で利用するタグライブラリの定義を記述します。(タグライブラリとは、JSPページの動的表示のための機能の1つです。タグライブラリについては次回以降の記事で説明します)
記述形式:
<%@ taglib 属性名="[属性の設定値]" %> (属性は複数設定可能)
属性 | 設定内容 |
uri | タグライブラリ記述子(TLDファイル)の一意に識別するための絶対URI、または相対URIを定義します。 prefix属性で指定したプレフィックスを利用するときは、このuriで指定したTLDファイルに定義されたタグを利用できます。 |
tagdir | 拡張タグライブラリのタグライブラリ記述子の格納先を指定するために、uri属性にかわり指定することができます。(JSP2.0以降) tagdir属性を使用する場合は「/WEB-INF/tags/」で始まるディレクトリを指定する必要があります。 通常、uri属性とtagdir属性はどちらか1つのみ指定します。 |
prefix | タグを識別する接頭辞(プレフィックス)を指定します。 例えば「prefix="mypref"」と定義した場合、このタグライブラリをJSP内で利用する場合は「<mypref:[タグ名] ~ >」と記述します。 |
(参考)Jakarta Server Pages 3.0 ドキュメント(英語・外部サイト) 1.10.2. The taglib Directive
includeディレクティブ
includeディレクティブは、JSPのファイル内に他のJSPファイルの内容を含ませる(インクルードさせる)場合に利用するディレクティブです。
記述形式:
<%@ include file="[インクルードするファイルのパス]" %>
例えば複数画面共通のヘッダーやフッターを表示したい場合など、各々の部分を共通パーツのHTMLやJSPとして作成し、各画面のJSPにそれらのファイルをインクルードすることができます。
例えば、共通ヘッダーのHTMLファイル「header.html」と共通フッターのHTMLファイル「footer.html」を作成して、各ページのヘッダーとフッターに設定するには、以下のようなコードで実現できます。
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<meta charset="UTF-8">
<title>インクルードディレクティブの利用</title>
</head>
<body>
<%-- ヘッダーのHTMLをインクルード -->
<%@ include file="header.html"%>
<%-- ページコンテンツ -->
<div>ここにページ固有のコンテンツを記述</div>
<%-- フッターのHTMLをインクルード -->
<%@ include file="footer.html"%>
</body>
</html>
このように共通的な表示部分をパーツ化することで、共通部分のデザインや仕様が変更された際に、修正対象を共通部品のファイルのみに限定するなど、アプリケーションの保守性を高めることも可能です。
(参考)Jakarta Server Pages 3.0 ドキュメント(英語・外部サイト) 1.10.3. The include Directive
当記事ではJSPの暗黙オブジェクトと、JSPの動的表示のための最も基本的な要素について説明しました。JSPでは、他にもEL式やタグライブラリといった、動的コンテンツ生成のための機能が準備されていますので、これらの機能についても次回以降の記事で説明していきたいと思います。