タグライブラリを利用すると、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> |