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
ダウンロードは次のサイトから行ってください。
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ディレクトリの中に入れます。
「WEB-INF」フォルダで右クリックメニューから「JSPタグライブラリを追加」を選択します。
「リポジトリ中のタグライブラリ」で「standard」を選択して「了解」を押します。
「lib」フォルダーにこのように2つのjarが追加されます。
値を出力します。もっとも利用することになるタグです。
| 属性
| 必須 |
説明
|
| value |
○ |
表示する値 |
| escapeXml |
|
「<」などのHTML特殊文字を「<」のようにエスケープするかどうか |
| 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>
「<%=〜%>」の形の「式」では、「<」などがそのまま出力されるため、「<u>」の効果が現れて下線が引かれています。
<c:out>では、「<」や「>」は「<」や「>」にエスケープされているので、「<u>」などがそのまま表示されています。
ただ、その下の行では
escapeXmlを
falseに設定しているので、「式」の場合と同じように「<」などがそのまま出力されて「<u>」の効果が現れています。
<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>
式言語では演算子を使って計算することができます。
| 演算 |
演算子 |
別名 |
| 加算 |
+ |
|
| 減算 |
− |
|
| 乗算 |
* |
|
| 除算 |
/ |
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 < 123 = <c:out value="${234 < 123}"/><br>
234 lt 123 = <c:out value="${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>
<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つの式言語を同時に利用しています。
「配列[添字]」の形で配列や
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>
式言語では、以下のような暗黙のオブジェクトがつかえます。
| 暗黙オブジェクト |
概要 |
| 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>
もちろんフォームの値も送信されます。
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>
パラメータ「title」を受け取って表示するようにしてみてください。
入力項目に「title」を追加してください
開始値から終了値まで繰り返すときは、次のように記述します。
<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>
<%@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>
集合をもとに繰り返すことにできます。
<c:forEach items="集合" var="値を格納する変数名">
繰り返す処理
</c:forEach>
集合をもとに繰り返す場合の属性(forEachのすべての属性)
| 属性 |
必須 |
説明 |
| var |
|
変数名 |
| items |
|
集合 |
| begin |
|
開始値 |
| end |
|
終了値 |
| step |
|
増分 |
| varStatus |
|
ステータス変数名 |
扱うことのできる集合は、配列・
java.util.Collection・
java.util.Iterator・
java.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>
<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>
<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>の属性は次のとおりです。
<%@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>
<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>
<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>