Java JSPの構成要素と基本

前回の入門記事に引き続き、今回はJava JSPの構成要素について見ていきます。

前回はServletの使い方に主軸を置いて説明しましたが、今回はJSP側の基礎知識やJSPの使い方を説明していきます。

JSPの構成要素

JSPは、記述したまま出力されるテンプレートテキスト要素と、Webコンテナによって処理し出力されるJSP要素の2つで構成されます。

テンプレートテキスト要素は、html要素やbody要素、もしくはp要素など、書いたままにブラウザが出力する要素のことです。対して、JSP要素はWebコンテナ(サーバ側)で処理し、出力する要素です。

JSP要素には以下の5種類があります。

  • コメント
    <%-- コメント --%>という書式で記述することで、コメントの扱いになります。非常に使い方が簡単なので、本記事ではこれ以上の解説は行いません。
  • ディレクティングタグ
    ディレクティングタグは、JSPのページ全体に作用するような定義を行うタグです。詳しくは後述します。
  • スクリプティング
    <% Javaコード %><%! 変数またはメソッド %><%= 式 %>のような書式で記述することができます。詳しくは後述します。
  • EL式(式言語)
    式言語とも呼ばれるJSP記述言語です。詳しくは後述します。
  • アクションタグ
    アクションタグを使用することにより、オブジェクトの生成など特定の動作を行うことができます。本記事では扱いません。

ディレクティングタグ

ディレクティングタグは、JSPのページ全体に作用するような定義を行うタグです。
ディレクティングタグで指定した指示は、JSPファイル変換時にJSPサーブレットのソースコードに埋め込まれます。ディレクティングタグには3種類のタグがあります。

pageディレクティングタグ

pageディレクティングタグは、JSPファイル全体に関する属性を定義します。
ページ内の文字コードの設定やMIMEタイプ、セッションの有無等、様々な定義を行うことができます。書式は以下の通りです。

<%@ page 属性="値" %>

例えば、以下のように記述すると、使用する言語を記述し、ここでは、Java言語となります。なお、初期値もJavaなので、省略しても構いません。

<%@ page language="java" %>

また、レスポンスの文書形式及び文字コードを指定する場合は、以下になります。

<%@ contentType="text/html; charset=UTF-8" %>

これは重要なディレクティブです。初期値のLatin1では日本語を表示できないため、必ず日本語を表示できる文字コードを指定する必要があります。

includeディレクティングタグ

ncludeディレクティングタグは、JSPファイルに静的なインクルードを行うときに使用します。
includeディレクティングタグの書式は以下のようになります。

<%@ include file="ファイルパス" %>

taglibディレクティングタグ

taglibディレクティングタグは、JSPファイル内でカスタムタグを利用するときに使用します。
taglibディレクティングタグの書式は以下のようになります。

<%@ taglib prefix="プレフィックス" uri="URI" %> 

includeディレクティングタグとtaglibディレクティングタグについて本記事では紹介のみに留めます。

スクリプティング

スクリプティングは、JSPファイルでJavaプログラムを記述する際に使用します。記述方法は、スクリプトレット、宣言、式の3種類があります。

スクリプトレット

スクリプトレットは、JSP内のスクリプトでJavaコードを記述します。繰り返し文や条件式などを記述できます。スクリプトレットの書式は以下のようになります。

<% Javaコード %>

例えば、以下のように記述することができます。

<select name="year">
<%
for (int i = 2009; i >= 1900; i--) {
out.println("<option value=" + i + ">" + i + "</option>");
}
%> </select>年

宣言

宣言は、JSP内のスクリプトで使用する変数やメソッドの宣言を記述します。Java言語の構文に基づいた変数、メソッドを宣言できます。宣言の書式は以下のようになります。

<%! 変数またはメソッド %>

なお、変数宣言は宣言(<%! ~ %>)だけではなく、スクリプトレット(<% ~ %>)でも可能です。

式は、JSP内のスクリプトで有効なJava言語の式を記述します。式の書式は以下のようになります。

<%= 式 %>

式で処理された結果は、String型となります。なお、式では、末尾に;(セミコロン)は不要です。セミコロンを記述するとエラーになります。

特徴としては、outオブジェクトとprintlnメソッドを使用せずに、変数名のみの記述で表示できるので、スクリプトレットの記述に比べて簡単な記述ができるようになっています。

EL式(Expression Language)

EL式(Expression Language)とは、式言語とも呼ばれるJSP記述言語です。
式と同様にスクリプトレットなしで記述することができ、スリムな記述ができます。EL式の機能は表示のみではなく、データの取得も行います。EL式の書式は以下の通りです。

${ 式 }

EL式はJava言語ではなく、EL式独自の文法で記述します。

なお、EL式は、スクリプトレット、式、宣言のスクリプティングには記述ができず、JSPのHTMLタグ内に記述可能となります。また、他のJSP要素の属性値として記述できます。

スクリプトレットや式は、あらかじめrequestオブジェクトのgetParameterメソッドで、データの取得をしておく必要があります。しかし、EL式では暗黙オブジェクト、または、スコープに格納されているデータの取得と表示を行うことができます。書式は以下の通りです。

${ オブジェクト.名前 }

例えば、以下のような処理を実行すると、

<% int a = 100; %>
a : ${ a }

<% int b = 100;
session.setAttribute("b",b); %>
b : ${ b }

実行結果は以下のようになります。

a :
b : 100

まず、スクリプトレットで変数aを宣言し、値の代入を行い、EL式で表示しようとしていますが、何も表示されていません。
次に、スクリプトレットで変数bを宣言し、値の代入を行い、セッションスコープに格納しています。その後で、EL式で表示していますが、こちらは値が表示されています。

このようにEL式で扱う値は暗黙オブジェクトまたは、スコープに格納されている必要があります。
言い換えると、EL式では、暗黙オブジェクトやスコープに格納されている値を変数に格納しなおすことなく直接取得することができます。

以下が暗黙オブジェクトとスコープオブジェクトの一覧になります。

暗黙オブジェクト 説明
pageContext JSPの暗黙的オブジェクトと唯一同じオブジェクトです。JSPの暗黙オブジェクトを参照できます。
param リクエストパラメータを取得します。
paramValues 1つの名前に対して複数の値があるリクエストパラメータを取得します。
header HTTPリクエストヘッダーを取得します。
headerValues 1つの名前に対して複数の値があるリクエストヘッダーを取得します。
cookie クッキー情報を取得します。
initParam web.xmlのcontext-param要素で設定された初期化パラメータを取得します。
スコープオブジェクト 説明
pageScope 該当するページでのみ有効な値のスコープです。そのページのみで参照する値に使用します。
requestScope 転送元と転送先のページで有効な値のスコープです。ページ間で値を共有する場合に使用します。
sessionScope ブラウザを閉じる、もしくは一定時間経過するまで保持される値のスコープです。ID、Passなどブラウザを閉じるまで値を保持したい場合に使用します。
applicationScope JSPコンテナが停止、再起動するまで保持される値のスコープです。アプリケーション内で共通に使用したい値に使用します。

それでは練習として、スクリプトレット、式、EL式を使って日付を表示するプログラムを作ってみましょう。

日付を表示するプログラムを作る

IDEのEclipseを起動します。パースペクティブをJava EEに切り替え、Birthdayという名前で動的Webプロジェクトを作成します。サーバータブにTomcat v6.0が表示されることを確認し、右クリックから「追加および削除」を選択し、サーバーの構成にBirthday動的Webプロジェクトを追加してください(サーバタブにTomcat v6.0が存在しない場合は新規作成を行ってください)。

続いて、以下の2つのJSPファイルを作成してください。

  • inputBirthday.jsp
    セレクトボックスから誕生日を入力する画面です。
  • displayBirthday.jsp
    inputBirthday.jspから渡された誕生日を表示する画面です。

inputBirthday.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>誕生日を入力</title>
</head>
<body>
<h1>誕生日を入力</h1>
<ul>
<li>誕生日を入力してください。</li>
</ul>
<form method="post" action="/Birthday/displayBirthday.jsp">
<select name="year">
<%
for (int i = 2009; i >= 1900; i--) {
out.println("<option value=" + i + ">" + i + "</option>");
}
%>
</select>年
<select name="month">
<%
for(int i = 1; i <= 12; i++){
out.println("<option value=" + i + ">" + i + "</option>");
}
%>
</select>月
<select name="day">
<%
for(int i = 1; i <= 31; i++){
out.println("<option value=" + i + ">" + i + "</option>");
}
%>
</select>日
<input type="submit" value="登録">
</form>
</body>
</html>

displayBirthday.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
int year = Integer.parseInt(request.getParameter("year"));
int month = Integer.parseInt(request.getParameter("month"));
int day = Integer.parseInt(request.getParameter("day"));
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- スクリプトレット -->
<p><% out.println(year + "年" + month + "月" + day + "日"); %></p>
<!-- 式 -->
<p><%= year + "年" + month + "月" + day + "日<br>" %></p>
<!-- EL式 -->
<p>${ param.year }年${ param.month }月${ param.day }日</p>
</body>
</html>

2つのJSPファイルを作成したら、サーバーを起動(再起動)し、http://localhost:8080/Birthday/inputBirthday.jspにアクセスしてみてください。

以下のような画面が表示されれば、成功です。

inputBirthday

登録ボタンを押すと、inputBirthday.jspからdisplayBirthday.jspに画面が遷移することも確認してください。

displayBirthday

プログラムの解説

inputBirthday.jspで誕生日を選択し、「登録」ボタンをクリックすると、displayBirthday.jspで表示するプログラムです。

inputBirthday.jspでは、スクリプトレット(<% %>)によって、form要素の内部にJavaのfor文を書くことで、年月日にあたるoption要素を繰り返し処理で記述しています。

displayBirthday.jspでは、スクリプトレット、式、EL式の3つの表示方法でinputBirthday.jspから受け取った誕生日を表示しています。

今回の場合はスクリプトレットが一番長く、EL式が一番短く記述することができていることが分かります。今回のように暗黙オブジェクトやスコープオブジェクトから直接値を受け取れる場合には、EL式が便利です。

参考資料
スクールの教科書