タグライブラリを利用すると、JSPの記述性を向上させることができます。 タグライブラリには、以下の機能があります。
タグライブラリには、標準的なJSTL(JSP Standard Tag Library)と、自由に拡張できるカスタムタグがあります。
カスタムタグには、以下の種類があります。
<プレフィックス:タグ名 属性名="属性値" /> |
<プレフィックス:タグ名 属性名="属性値"> BODYの内容 </プレフィックス:タグ名> |
<プレフィックス:タグ名 属性名="属性値">
<プレフィックス:ネストタグ名 属性名="属性値">
BODYの内容
</プレフィックス:ネストタグ名>
</プレフィックス:タグ名>
|
タグライブラリを利用するためは、JSPファイルの上の方にtaglibディレクティブを記述する必要があります。
プレフィックスは、JSPソースでタグとして参照します。
URIは、コンテナがweb.xmlからTLDファイル名を検索するために使われます。
<%@ taglib prefix="プレフィックス" uri="タグライブラリのURI" %> |
デプロイメント記述子は、Webアプリケーションの環境情報を設定するファイルで、WEB-INF/web.xmlという名前です。 サーブレットの登録などを行いますが、タグライブラリの登録も行います。 タグライブラリの登録には、TLD(Tag Library Discriptor)ファイルを指定します。
<?xml version="1.0" ?>
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<taglib>
<taglib-uri>タグライブラリのURI</taglib-uri>
<taglib-location>TLDファイル名</taglib-location>
</taglib>
</web-app>
|
タグライブラリ記述子は、TLD(Tag Library Discriptor)ファイルのことで、カスタムタグについての情報を記述したファイルです。
<?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/j2ee/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>タグライブラリのバージョン</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>名前(プレフィックス)</short-name>
<description>タグライブラリの説明</description>
<tag>
<name>タグ名</name>
<tag-class>タグクラス名</tag-class>
<body-content>BODYの処理方法(empty|JSP|tagdependent)</body-content>
<description>タグの説明</description>
<attribute>
<name>属性名</name>
<required>必須(true|false)</required>
<rtexprvalue>実行時の評価(true|false)</rtexprvalue>
</attribute>
</tag>
</taglib>
|
カスタムタグを実装する場合は、javax.servlet.jsp.tagext.* パッケージを使います。 カスタムタグを作成する場合は、以下のクラスを利用します。
TagSupportクラスでは、JSPコンテナから、doStartTag()、doAfterBody()、doEndTag()などのメソッドが呼び出されますので、これらのメソッドを実装し、pageContext.getOut()に出力します。
また、各メソッドの戻り値を利用して続行方法を指示します。
以下に、各メソッドの流れを示します。
BodyTagSupportクラスでは、JSPコンテナから、doStartTag()、doInitBody()、doAfterBody()、doEndTag()などのメソッドが呼び出されますので、これらのメソッドを実装します。
出力ライタは、2種類あり、doStartTag()、doEndTag()では、pageContext.getOut()に出力しますが、doInitBody()、doAfterBody()では、BODYの内容が格納されるbodyContentに出力します。
doEndTag()では、bodyContentの内容を取得することができます。
また、各メソッドの戻り値を利用して続行方法を指示します。
以下に、各メソッドの流れを示します。
タグ拡張情報(Tag Extra Information)は、TEIファイルと呼ばれるJavaソースで記述します。 TEIファイルは、JSPの変数を定義する場合に必要で、TagExtraInfoクラス、VariableInfoクラス、TagDataクラスなどを利用して作成します。
住所オブジェクトの配列から、表を作成する場合の例です。 以下のような画面を作成する場合を考えてみます。
| 名前 | 住所 | 電話 |
|---|---|---|
| 升村 丞 | 金沢市菊川 | 076-261-4921 |
| 北陸 太郎 | 金沢市大手町 | 076-221-1429 |
| 金沢 花子 | 金沢市片町 | 090-2377-2056 |
上記のような画面を作成するためには、JSPにJavaソースを記述する必要があります。 この例では、データは、addrsという配列にデータを格納されているものとします。
<table border="2">
<tr><th>名前</th><th>住所</th><th>電話</th></tr>
<%
jp.ash.webapp.AddrData addr;
Iterator iterator = Arrays.asList(array).iterator();
while (iterator.hasNext()) {
addr = iterator.next();
%>
<tr>
<td><%= addr.name %></td>
<td><%= addr.address %></td>
<td><%= addr.tel %></td>
</tr>
<%
}
%>
</table>
|
タグライブラリを利用すると、以下のようなJSPを記述するだけで、簡単に繰り返し表示が可能となります。 このタグライブラリについては、繰り返しカスタムタグで紹介しています。
<%@ taglib prefix="ash" uri="http://ash.jp/taglib_1_0" %>
<table border="2">
<tr><th>名前</th><th>住所</th><th>電話</th></tr>
<ash:forEach var="addr" type="jp.ash.webapp.AddrData" items="<%= addrs %>">
<tr>
<td><%= addr.name %></td>
<td><%= addr.address %></td>
<td><%= addr.tel %></td>
</tr>
</ash:forEach>
</table>
|
タグライブラリとしては、標準タグライブラリ(JSTL)がリリースされています。
ただし、標準タグライブラリが動作しない環境では、独自にカスタムタグを作成するも使えるように、必要があります。
ASHで作成しているタグライブラリとして、以下のようなカスタムタグがあります。
各カスタムタグのソースも公開しています。
envタグでは、リクエストヘッダの内容を表示します。
また、paramタグでは、リクエストパラメータの内容を表示します。
これらのタグライブラリは、デバッグに便利です。
<ash:env /> <ash:param /> |
forEachカスタムタグは、繰り返し型のデータを順に表示します。 BODYで利用する変数名とそのクラスを設定できます。
<ash:forEach var="変数名" type="変数クラス名" items="繰り返し型変数"> <%=変数名%>を使ったJSPの記述 </ash:forEach> |
forカスタムタグは、回数を指定して、繰り返し処理を行います。
変数の値を開始値から終了値を越えるまで、増分値だけ増加させながら処理します。
増分値に負の数は指定できません。
配列を繰り返す場合は、配列サイズを指定することもできます。
<ash:for var="変数名" begin="開始値" end="終了値" step="増分値" length="配列サイズ"> <%=変数名%>を使ったJSPの記述 </ash:for> |
if条件を指定し、trueの場合のみ出力します。 elseや、elsifの記述は、できませんので、choose/whenタグを利用する必要があります。
<ash:if test="条件式"> 条件が真の場合のJSPの記述 </ash:if> |
choose/when条件カスタムタグは、XSLと同じ様な形式で、多分岐条件を指定します。
最初に真となったwhen条件のJSPの記述が評価されます。
Java言語とは異なりますが、JSPの場合は、XMLと同様に開始タグと終了タグで囲む必要がありますので、このような形式が一般的です。
<ash:choose>
<ash:when test="条件式">
条件が真の場合のJSPの記述
</ash:when>
</ash:choose>
|