ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

タグライブラリについて

タグライブラリとは

 タグライブラリを利用すると、JSPの記述性を向上させることができます。 タグライブラリには、以下の機能があります。

タグライブラリの種類

 タグライブラリには、標準的なJSTL(JSP Standard Tag Library)と、自由に拡張できるカスタムタグがあります。
 カスタムタグには、以下の種類があります。

タグライブラリの作成方法

taglibディレクティブ

 タグライブラリを利用するためは、JSPファイルの上の方にtaglibディレクティブを記述する必要があります。
 プレフィックスは、JSPソースでタグとして参照します。 URIは、コンテナがweb.xmlからTLDファイル名を検索するために使われます。

<%@ taglib prefix="プレフィックス" uri="タグライブラリのURI" %>

デプロイメント記述子(web.xml)

 デプロイメント記述子は、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)

 タグライブラリ記述子は、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>

タグハンドラクラス(*Tag.java)

 カスタムタグを実装する場合は、javax.servlet.jsp.tagext.* パッケージを使います。 カスタムタグを作成する場合は、以下のクラスを利用します。

TagSupportクラス

 TagSupportクラスでは、JSPコンテナから、doStartTag()、doAfterBody()、doEndTag()などのメソッドが呼び出されますので、これらのメソッドを実装し、pageContext.getOut()に出力します。 また、各メソッドの戻り値を利用して続行方法を指示します。
 以下に、各メソッドの流れを示します。

Flow of TagSupport class

BodyTagSupportクラス

 BodyTagSupportクラスでは、JSPコンテナから、doStartTag()、doInitBody()、doAfterBody()、doEndTag()などのメソッドが呼び出されますので、これらのメソッドを実装します。 出力ライタは、2種類あり、doStartTag()、doEndTag()では、pageContext.getOut()に出力しますが、doInitBody()、doAfterBody()では、BODYの内容が格納されるbodyContentに出力します。 doEndTag()では、bodyContentの内容を取得することができます。 また、各メソッドの戻り値を利用して続行方法を指示します。
 以下に、各メソッドの流れを示します。

Flow of BodyTagSupport class

タグ拡張情報クラス(*TEI.java)

 タグ拡張情報(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タグ

 envタグでは、リクエストヘッダの内容を表示します。 また、paramタグでは、リクエストパラメータの内容を表示します。
 これらのタグライブラリは、デバッグに便利です。

<ash:env />
<ash:param />

forEach繰り返しタグ

 forEachカスタムタグは、繰り返し型のデータを順に表示します。 BODYで利用する変数名とそのクラスを設定できます。

<ash:forEach var="変数名" type="変数クラス名" items="繰り返し型変数">
  <%=変数名%>を使ったJSPの記述
</ash:forEach>

for繰り返しタグ

 forカスタムタグは、回数を指定して、繰り返し処理を行います。
 変数の値を開始値から終了値を越えるまで、増分値だけ増加させながら処理します。 増分値に負の数は指定できません。
 配列を繰り返す場合は、配列サイズを指定することもできます。

<ash:for var="変数名" begin="開始値" end="終了値" step="増分値" length="配列サイズ">
  <%=変数名%>を使ったJSPの記述
</ash:for>

if条件カスタムタグ

 if条件を指定し、trueの場合のみ出力します。 elseや、elsifの記述は、できませんので、choose/whenタグを利用する必要があります。

<ash:if test="条件式">
  条件が真の場合のJSPの記述
</ash:if>

choose/when条件カスタムタグ(多分岐条件)

 choose/when条件カスタムタグは、XSLと同じ様な形式で、多分岐条件を指定します。 最初に真となったwhen条件のJSPの記述が評価されます。
 Java言語とは異なりますが、JSPの場合は、XMLと同様に開始タグと終了タグで囲む必要がありますので、このような形式が一般的です。

<ash:choose>
  <ash:when test="条件式">
    条件が真の場合のJSPの記述
  </ash:when>
</ash:choose>


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp