JSTL(標準タグライブラリ)

2004年5月9日

1.JSTLについて

JSPでは、カスタムタグという仕組みを使ってタグを自由に作成することができます。ただ、最初に作成し多く使うタグは、ほとんど共通しています。
JSTL(標準タグライブラリ)は、そのような、よく使われるようなタグを標準化したものです。
JSTLの実装は、Jakartaプロジェクトで開発されています。
http://jakarta.apache.org/taglibs/index.html
最新版もこちらから入手できます。

標準タグライブラリには4つのタグライブラリが含まれ、それぞれprefixとuriは次の表のようになります。
prefix uri 説明
c http://java.sun.com/jstl/core よく使う基本的なタグ
fmt http://java.sun.com/jstl/fmt 国際化へ対応した書式化
sql http://java.sun.com/jstl/sql データベースアクセス
x http://java.sun.com/jstl/xml XML文書の操作

ただし、ここでは、JSPとサーブレットで処理を分担することを前提にするため、coreタグとfmtタグを紹介します。
JSPだけでプログラムを書く場合でも、前半に処理、後半にHTMLという記述になるようにする場合には、coreタグとfmtタグ以外を使うことはあまりありません。

Tomcat5などでJSP2.0を使うときのuriは次のようになります。
prefix uri
c http://java.sun.com/jsp/jstl/core
fmt http://java.sun.com/jsp/jstl/fmt
sql http://java.sun.com/jsp/jstl/sql
x http://java.sun.com/jsp/jstl/xml

以降のサンプルでは、特に記述のない限りTomcat4のJSP1.2を対象にしたものになっています。
また、TLDファイルは特に必要ないようです。

JSPで標準タグライブラリを利用するときは以下のようなtaglibディレクティブを追加します。
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
注意
実際のhttp://java.sun.com/jstl/coreになにかファイルがあるわけではありません。
タグライブラリを利用するさいに通信も行いません。

JSTLタグのリファレンスはこちらです。
http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html

2.ダウンロードと組み込み

ダウンロードは次のサイトから行ってください。
http://jakarta.apache.org/site/binindex.cgi
TaglibsのLibrary Releasesをクリックすると、ライブラリのディレクトリ一覧が表示されます。
JSTLはstandard-1.0です。
(standardは開発中のバージョンです)
jakarta-taglibs-standard-current.zipをダウンロードしてください。

NetBeansをインストールしたディレクトリ(標準ではC:\program files\NetBeans IDE 3.5.1)のsystemディレクトリの中にTagLibraryディレクトリを作成します。
その中にstandardディレクトリを作成します。
解凍して出来たlibディレクトリの中のstandard.jarをTagLibraryディレクトリの中に、jstl.jarをstandardディレクトリの中に入れます。
fortejsp06/jstl16.png

「WEB-INF」フォルダで右クリックメニューから「JSPタグライブラリを追加」を選択します。
fortejsp06/jstl01.png

「リポジトリ中のタグライブラリ」で「standard」を選択して「了解」を押します。
fortejsp06/jstl02.png

「lib」フォルダーにこのように2つのjarが追加されます。
fortejsp06/jstl03.png

3.出力のタグ

3.1.<c:out>

値を出力します。もっとも利用することになるタグです。
属性 必須 説明
value 表示する値
escapeXml   「<」などのHTML特殊文字を「&lt;」のようにエスケープするかどうか
default   valueの値がnullだったときに表示される値

jstlsample1.jsp

<%@page contentType="text/html"%>

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>

<html> <head><title>JSP Page</title></head> <body>

<h1>c:out</h1> test:<c:out value="writing"/><br> <br> expression:<%="t<u>es</u>t"%><br> tag:<c:out value="t<u>es</u>t"/><br> tag(not escape):<c:out value="t<u>es</u>t" escapeXml="false"/><br>

</body> </html>

fortejsp06/jstl04.png

「<%=〜%>」の形の「式」では、「<」などがそのまま出力されるため、「<u>」の効果が現れて下線が引かれています。
<c:out>では、「<」や「>」は「&lt;」や「&gt;」にエスケープされているので、「<u>」などがそのまま表示されています。
ただ、その下の行ではescapeXmlfalseに設定しているので、「式」の場合と同じように「<」などがそのまま出力されて「<u>」の効果が現れています。

4.式言語

4.1.式言語(EL Expression Language)

<c:out>で、固定の文字列の出力を例として挙げましたが、固定の文字列しか表示できないとしたら、このようなタグを使う意味はほとんどありません。
標準タグライブラリでは、タグの属性として変数などを扱うために「式言語(EL Expression Language)」という記述方法が用意されています。
式言語は「${式言語}」という書式で使います。
参照できるのは、pageContext、request、session、applicationなどでsetAttributeした属性です。

また、Tomcat5などのJSP2.0からは、JSTLタグの属性以外でも式言語を使うことができます。

jstlsample1.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>
test:<c:out value="writing"/><br>
<br>

<% String s = "t<u>es</u>t"; request.setAttribute("sss",s); %>

expression:<%=request.getAttribute("sss")%><br> tag:<c:out value="${sss}"/><br> tag(not escape):<c:out value="${sss}" escapeXml="false"/><br> </body> </html>

JSPの式を使った場合に比べて簡潔な記述になっています。

JSP2.0では次のようにタグの属性以外でも式言語を使った記述ができます。

jstlsample1.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>
test:<c:out value="writing"/><br>
<br>
<%
String s = "t<u>es</u>t";
request.setAttribute("sss",s);
%>
expression:<%=request.getAttribute("sss")%><br>
tag:<c:out value="${sss}"/><br>
tag(not escape):<c:out value="${sss}" escapeXml="false"/><br>

EL:${sss}<br>

</body> </html>

4.2.表記法

演算子

式言語では演算子を使って計算することができます。
演算 演算子 別名
加算  
減算  
乗算  
除算 / div
剰余 mod
等しい == eq
異なる != ne
演算 演算子 別名
より小さい < lt
以下 <= le
より大きい > gt
以上 = ge
かつ && and
または || or
否定 ! not

jspsample1.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>

234 + 123 = <c:out value="${234 + 123}"/><br> 234 / 123 = <c:out value="${234 / 123}"/><br> 234 div 123 = <c:out value="${234 div 123}"/><br> 234 &lt; 123 = <c:out value="${234 < 123}"/><br> 234 lt 123 = <c:out value="${234 lt 123}"/><br>

</body> </html>

fortejsp06/jstl05.png
また、属性の一部分だけを式言語とすることもできるので、このようなときは次のような表記も使えます。

jspsample1.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>

<c:out value="234 + 123 = ${234 + 123}"/><br> <c:out value="234 / 123 = ${234 / 123}"/><br> <c:out value="234 div 123 = ${234 div 123}"/><br> <c:out value="234 < 123 = ${234 < 123}"/><br> <c:out value="234 lt 123 = ${234 lt 123}"/><br>

</body> </html>

プロパティ

jspsample1.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>

<%@page import="java.util.*"%> <%@page import="java.text.*"%> <%! public class Test{ Calendar c = Calendar.getInstance(); public String getDate(){ return DateFormat.getInstance().format(new Date()); } public long getYear(){ return c.get(Calendar.YEAR); } public long getMonth(){ return c.get(Calendar.MONTH); } } %> <% Test t = new Test(); request.setAttribute("ttt",t); %> <c:out value="${ttt.date}"/><br> <c:out value="${ttt.year}/${ttt.month}"/><br>

</body> </html>

2つめの<c:out>の属性では、2つの式言語を同時に利用しています。
fortejsp06/jstl06.png

配列・Map

「配列[添字]」の形で配列やListなどの値を参照できます。
また、Mapのときには、キーを添字に指定することができます。

jstlsample2.jsp

<%@page contentType="text/html"%>

<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>

<html> <head><title>JSP Page</title></head> <body>

<h1>c:out</h1> <%@page import="java.util.*"%> <% String[] sa = {"first","second"}; request.setAttribute("aaa",sa); List v = new ArrayList(); v.add("top"); v.add("bottom"); request.setAttribute("bbb",v); Map m = new HashMap(); m.put("kishida","naoki"); m.put("degawa","tetsuro"); m.put("mino","monta"); request.setAttribute("ccc",m); %> <c:out value="${aaa[0]}"/><br> <c:out value="${bbb[1]}"/><br> <c:out value="${ccc['degawa']}"/><br>

</body> </html>

fortejsp06/jstl07.png

4.3.暗黙オブジェクト

式言語では、以下のような暗黙のオブジェクトがつかえます。
暗黙オブジェクト 概要
param ブラウザから送信されたパラメータ
paramValues ブラウザから送信されたパラメータ(複数の値をもつ)
header ブラウザから送信されたヘッダー情報
cookie ブラウザから送信されたクッキー

jstlsample03.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>param</h1>
author:<c:out value="${param.author}"/><br>
message:<c:out value="${param.message}"/><br>
</body>
</html>
fortejsp06/jstl08.png fortejsp06/jstl09.png
もちろんフォームの値も送信されます。

jstlsample3.jsp

<%@page contentType="text/html; charset=Windows-31J"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>

<% request.setCharacterEncoding("Windows-31J"); %>

<h1>param</h1> author:<c:out value="${param.author}"/><br> message:<c:out value="${param.message}"/><br>

<hr> <form action="jstlsample.jsp" method="post"> author:<input type=text name=author><br> message:<input type=text name=message><br> <input type=submit value="send"> </form>

</body> </html>
fortejsp06/jstl10.png fortejsp06/jstl11.png
パラメータ「title」を受け取って表示するようにしてみてください。
入力項目に「title」を追加してください
fortejsp06/jstl12.png

5.繰り返しのタグ

5.1.<c:forEach>

開始値から終了値まで繰り返すときは、次のように記述します。
<c:forEach begin="初期値" end="終了値" var="値を格納する変数名">
  繰り返す処理
</c:forEach>

開始値から終了値まで繰り返す場合の属性
属性 必須 説明
var   変数名
begin   開始値
end   終了値
step   増分
varStatus   ステータス変数名

繰り返し

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>

<h1>forEach</h1>
<c:forEach begin="1" end="9" var="i">
<c:out value="${i}"/><br>
</c:forEach>

</body>
</html>
fortejsp06/jstl14.png

九九の表

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>

<h1>forEach</h1>
<table border=1>
<td></td>

<c:forEach begin="1" end="9" var="i">

<c:forEach begin="1" end="9" var="j">
<td><c:out value="${i * j}"/></td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
fortejsp06/jstl13.png

配列

集合をもとに繰り返すことにできます。
<c:forEach items="集合" var="値を格納する変数名">
  繰り返す処理
</c:forEach>
集合をもとに繰り返す場合の属性(forEachのすべての属性)
属性 必須 説明
var   変数名
items   集合
begin   開始値
end   終了値
step   増分
varStatus   ステータス変数名
扱うことのできる集合は、配列・java.util.Collectionjava.util.Iteratorjava.util.Map・カンマ区切りの文字列などです。

注意
itemsに配列やListを指定する場合は、式言語を使う必要があります。
また、varには、変数名を指定するので式言語を使う必要はありません。

jstlsample2.jsp

<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>
<h1>c:out</h1>
<%@page import="java.util.*"%>
<%
String[] sa = {"first","second"};
request.setAttribute("aaa",sa);

List v = new ArrayList();
v.add("top");
v.add("bottom");
request.setAttribute("bbb",v);

Map m = new HashMap();
m.put("kishida","naoki");
m.put("degawa","tetsuro");
m.put("mino","monta");
request.setAttribute("ccc",m);
%>

<c:forEach items="${aaa}" var="i"> <c:out value="${i}"/><br> </c:forEach> <c:forEach items="${bbb}" var="j"> <c:out value="${j}"/><br> </c:forEach> <c:forEach items="${ccc}" var="k"> <c:out value="${k.key} - ${k.value}"/><br> </c:forEach>

</body> </html>
fortejsp06/jstl15.png

6.条件分岐のタグ

6.1.<c:if>

<c:if test="条件">
  条件が成り立ったときの処理
</c:if>
属性 必須 説明
test 条件
var   結果を格納する変数
scope   変数のスコープ
<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>

<h1>if</h1>
<c:forEach begin="1" end="9" var="i">
<c:out value="${i}"/><c:if test="${i % 2 == 1}">:odd</c:if><br>
</c:forEach>

</body>
</html>

6.2.<c:choose> <c:when> <c:otherwise>

<c:choose>
  <c:when test="条件1">
    条件1がなりたったとき
  </c:when>
  <c:when test="条件2">
    条件1がなりたたず条件2がなりたったとき
  </c:when>
    ・
    ・
    ・
  <c:otherwise>
    どの条件もなりたたないとき
  </c:otherwise>
</c:choose>
<c:when>の属性は次のとおりです。
属性 必須 説明
test 条件
<%@page contentType="text/html"%>
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head><title>JSP Page</title></head>
<body>

<h1>choose</h1>
<c:forEach begin="1" end="9" var="i">
<c:out value="${i}"/>is
<c:choose>
<c:when test="${i <= 3}">small</c:when>
<c:when test="${i <= 7}">large</c:when>
<c:otherwise>great</c:otherwise>
</c:choose><br>
</c:forEach>

</body>
</html>

7.文字列整形のタグ

7.1.<fmt:formatDate>

<fmt:formatDate>の属性は次のとおりです。
属性 必須 説明
value
type   date/time/both
dateStyle   short/medium/long/full
timeStyle   short/medium/long/full
pattern   java.text.SimpleDateFormatと同様のパターン
timeZone   タイムゾーン
var   フォーマット結果を格納する属性名
scope   フォーマット結果を格納する属性のスコープ

type属性では表示する対象をdate(日付)/time(時間)/both(日付と時間)のうちから選びます。
日付・時間のそれぞれの表示形式はdateStyle属性・timeStyle属性で指定します。
用意された表示形式以外の形式でフォーマットしたいときにはpattern属性にパターンを指定します。
<%@page contentType="text/html; charset=Windows-31J"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<html>
<head><title>日付のフォーマット</title></head>
<body>
<h1>日付のフォーマット</h1>
<%
java.util.Date d = new java.util.Date();
request.setAttribute("now",d);
%>
<fmt:formatDate value="${now}" type="both" dateStyle="short" timeStyle="short"/><br>
<fmt:formatDate value="${now}" type="both" dateStyle="medium" timeStyle="medium"/><br>
<fmt:formatDate value="${now}" type="both" dateStyle="long" timeStyle="long"/><br>
<fmt:formatDate value="${now}" type="both" dateStyle="full" timeStyle="full"/><br>
<fmt:formatDate value="${now}" pattern="yyyy年M月d日 h時m分"/><br>
</body>
</html>
fortejsp06/jstl17.png

7.2.<fmt:formatNumber>

<fmt:formatNumber>の属性は次のとおりです。
なんでvalueも必須じゃないんだろうか。
属性 必須 説明
value  
type   number/currency/(percentage)
pattern   java.text.DecimalFormatと同様のパターン
currencyCode   通貨コード
currencySymbol   通貨記号
groupingUsed   カンマ区切りにするかどうか
maxIntegerDigits   整数部の最大桁数
minIntegerDigits   整数部の最小桁数
maxFractionDigits   小数部の最大桁数
minFractionDigits   小数部の最小桁数
var   フォーマット結果を格納する属性名
scope   フォーマット結果を格納する属性のスコープ

percentageが使えないですねぇ・・・
<%@page contentType="text/html; charset=Windows-31J"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"%>
<html>
<head><title>数字のフォーマット</title></head>
<body>
<h1>数字のフォーマット</h1>
<fmt:formatNumber value="123456789.2564"/><br>
<fmt:formatNumber value="123456789.2564" type="number"/><br>
<fmt:formatNumber value="123456789.2564" type="currency" currencySymbol="\\"/><br>
<%-- <fmt:formatNumber value="123456789.2564" type="percentage"/><br> --%>
<fmt:formatNumber value="123456789.2564" groupingUsed="false"/><br>
<fmt:formatNumber value="123456789.2564" maxIntegerDigits="6" maxFractionDigits="2"/><br>
<fmt:formatNumber value="3.1415" minIntegerDigits="3" minFractionDigits="6"/><br>
</body>
</html>
fortejsp06/jstl18.png

Copyright (c) 2001-2004 Naoki Kishida All Rights Reserved.
http://www.fk.urban.ne.jp/home/kishida/