JSTLとは何か?JSTLを使ったサンプル。

JSTLとは、JavaServer Pages Standard Tag Libraryの略。
JSTLは、JSPで利用される標準的なカスタムタグをまとめたもの。

JSTLを使ってドロップダウンリストを作成する
JSTLを使う準備の部分。
JSPの先頭部分の書き方。

コード
<pre><code>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
・・・
</code></pre>
ここで

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
と書くことによって、インターネット上のJSTLを使うことができる。
これを消すと正しく動作しない。

prefix属性は、JSPページ内でタグライブラリを使う場合の接頭辞(プレフィックス)を指定する。
指定する値は任意だが、JSTLのCoreタグでは慣習的にcを利用する。

次に、年月日時刻をoptionタグでJSTLを使って出力する例。
この部分は、「作ればわかる!」のコードをまるまる引用させていただいております。

コード
<pre><code>
<form action="/index" method="post">
<h1>JSTLを使ってみる</h1>
メールアドレスと、通知の時間を設定してください
<dl>
<dd>
<!-- 年 -->
<select name="year">
<c:forEach begin="0" end="3" var="i">
  <option <c:if test="${i + currentYear == year }">selected</c:if>>
  <c:out value="${i + currentYear}" /></option>
</c:forEach>
</select>年
<!-- 月 -->
<select name="month">
<c:forEach begin="0" end="11" var="i">
  <option <c:if test="${i == month }">selected</c:if>>
  <c:out value="${i + 1}" /></option>
</c:forEach>
</select>月
<!-- 日 -->
<select name="date">
  <c:forEach begin="1" end="31" var="i">
  <option <c:if test="${i == date }">selected</c:if>>
  <c:out value="${i}" /></option>
</c:forEach>
</select>日
<!-- 時間 -->
<select name="hourOfDay">
  <c:forEach begin="0" end="23" var="i">
  <option <c:if test="${i == hourOfDay }">selected</c:if>>
  <c:out value="${i}" /></option>
</c:forEach>
</select>時
<!-- 分 -->
<select name="minute">
<c:forEach begin="0" end="59" step="5" var="i">
  <option <c:if test="${i == minute }">selected</c:if>>
  <c:out value="${i}" /></option>
</c:forEach>
</select>分
</dd>
</dl>
<input type="submit" value="送信"/>
</form>
</code></pre>

まず、タグの説明。
ifタグは条件によって、子要素を評価するかしないかを決めるタグ。

コード
<pre><code>
<c:if test="${i == month }">selected</c:if>
</code></pre>

というのは、i == monthかどうかの結果(true,false)を判定する。
ここでは、iがmonthだったら、optionをselectedにする。

つまり、month変数の値をデフォルトで選択されるようにしている。

コード
<code>
<c:forEach begin="0" end="59" step="5" var="i">
  <option <c:if test="${i == minute }">selected</c:if>>
  <c:out value="${i}" /></option>
</c:forEach>
</code>

forEachタグはループを行う。
beginが取り出す先頭要素のインデックス。最初は0。
endは取り出す最後のインデックス。省略した場合は最後の要素。
stepは1ループで進める要素数を示す。
varは取り出した要素を格納する変数の名前。ここではiを使っている。
つまり、0から59まで、5おきに取り出してiに格納している。

ちなみに、ここで見ているmonthとかyearは、以下のように、サーブレット側で、リクエストオブジェクトに保持している。

コード

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
	Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Asia/Tokyo"));
	req.setAttribute("currentYear", calendar.get(Calendar.YEAR));
	if (calendar.get(Calendar.HOUR_OF_DAY) >= 7) {
		calendar.add(Calendar.DATE, 1);
	}
	req.setAttribute("year", calendar.get(Calendar.YEAR));
	req.setAttribute("month",calendar.get(Calendar.MONTH));
	req.setAttribute("date", calendar.get(Calendar.DATE));
	req.setAttribute("hourOfDay", 7);
	req.setAttribute("minute", 0);
	RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/WEB-INF/index.jsp");
	dispatcher.forward(req,res);
}
このように使うことで、optionタグのドロップダウンリストを作成することができる。