読者です 読者をやめる 読者になる 読者になる

感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

カスタムタグとJSTLについてまとめ

<スポンサーリンク>

カスタムタグというのは、JSP内での処理をタグの形で定義し、処理できるようにしたものです。

<%
if (i > 10) {
	//
}
%>

みたいな処理を、

<c:if test="${i > 10}">
  10以上です
</c:if>

みたいに、再利用しやすくしたものがカスタムタグです。
JSPのコードが見やすくなり、Javaプログラマ以外にもJSPの作成が容易になります。

「カスタムタグ」はユーザーが独自に記述できるものですが、共通の処理はたくさんあります。
そこで、Javaの標準に近い位置付けでカスタムタグを利用できるようにしたのが、JSTLです。

JavaServer Pages Standard Tag Libraryの略です。
Standardとついていますね。

JSTLの使い方

以下の2つのJARファイルをダウンロードします。
・jstl-impl-1.2.jar
http://sourceforge.jp/projects/sfnet_hpclc/downloads/trunk/WebContent/WEB-INF/lib/jstl-impl-1.2.jar/

jstl-api-1.2.jar
http://sourceforge.jp/projects/sfnet_hpclc/downloads/trunk/WebContent/WEB-INF/lib/jstl-api-1.2.jar/

上記でダウンロードしたJARファイルを、WEB-INF/libディレクトリ以下に配置し、ビルドパスを通します。
これでJSTLを使う準備は完了です。

シンプルなサンプルを使ってみます。

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<head>
<title>JSTL</title>
</head>
<body>

<c:out value="Hello! JSTL!"/>

</body>
</html>

ブラウザでは以下のように表示されます。
f:id:sho322:20140517110312j:plain

ディレクトリ体系は以下のとおりです。
f:id:sho322:20140517110322j:plain

Coreタグの使い方

・スコープ変数に値をセットする

<!-- スコープ変数に値をセットする -->
<c:set var="name" value="Yamada Tarou"/>

<!-- 表示する -->
${name}

・スコープ変数が参照しているインスタンスのプロパティに値をセットする

Friendインスタンス(自作)をインスタンス化して、taglibでそのプロパティに値をセットしています。

<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@page import="domain.*" %>

<html>
<head>
<title>JSTL</title>
</head>
<body>

<%
Friend friend = new Friend();
request.setAttribute("friend", friend);
%>

<c:set target="${friend}" property="name" value="sarumizu"/>

<!-- 表示する -->
<c:out value="${friend.name}"/>
</body>
</html>

使っているのは以下。
・domain.Friend

package domain;

public class Friend {
	private String name;
	private int age;
	private float height;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public float getHeight() {
		return height;
	}
	public void setHeight(float height) {
		this.height = height;
	}
	
}

画面には以下のように表示されます。
f:id:sho322:20140517110333j:plain

・if文を作ってみる
JSTLでif文をつくるためには、ifタグを使います。

<c:set var="age" value="19"/>
<c:if test="${age < 20 }">
20歳未満は禁止です。
</c:if>

ブラウザには「20歳未満は禁止です。」と表示されます

・if~elseみたいな文を作る
JSTLでif~else文をつくるためには、chooseタグを使います。

<c:set var="age" value="45"/>
<c:choose>
	<c:when test="${age >= 40}">
		おばちゃん
	</c:when>
	<c:when test="${age >= 20}">
		成人
	</c:when>
	<c:otherwise>
		おこちゃま
	</c:otherwise>
</c:choose>

ブラウザには「おばちゃん」と表示されます。

・コレクションをループする
JSTLを使ってListなどのコレクションをループさせるには、forEachタグを使う。

<%
List list = new ArrayList();
list.add(new Friend("hanako"));
list.add(new Friend("momoko"));
list.add(new Friend("yukiko"));
request.setAttribute("list",list);
%>

<ul>
<c:forEach var="friend" items="${list}">
	<li>${friend.name}</li>
</c:forEach>
</ul>

これはブラウザでは、

・hanako
・momoko
・yukiko

と表示される。


・Mapを使う
MapのkeyとValueを表示してみます。

<%
Map map = new HashMap();
map.put("football","Honda");
map.put("baseball","Tanaka");
map.put("basketball","Tabuse");
request.setAttribute("map",map);
%>

<ul>
<c:forEach var="item" items="${map}">
	<li>
	${item.key}-${item.value}<br>
	</li>
</c:forEach>
</ul>

ブラウザでは以下のように表示されます。

・basketball-Tabuse
・football-Honda
・baseball-Tanaka

<参考文献>

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

基礎からのサーブレット/JSP 第3版 (基礎からのシリーズ)

とりあえず何かの基礎を勉強したい時、「基礎からの~」シリーズは非常に使い勝手がいい。
自分はとりあえず、最初の一歩は「基礎からの~」シリーズから入る。
それで、わかってきた後も、基礎に戻りたくなった時は、基礎からのシリーズを参照する。
特に、JSP サーブレットの本はすごく有用だと思う。