Javaに関する様々な情報をご紹介します。

14カスタムタグ(tldファイルの作成)

Javaに関する様々な情報をご紹介します。

カスタムタグ(tldファイルの作成)

tldファイルはカスタムタグの動作を定義するXML形式のファイルです。ここでは、tldファイルの作成方法について解説します。

XMLの定義方法

JSP2.0からXMLの定義方法がDTDからXMLスキーマに変わりました。DTDも使えますが、JSP2.0の新機能を使用するためにはXMLスキーマを使用する必要があります。

XMLスキーマを使用する場合は、tldファイルに以下の記述を記載します。
<?xml version="1.0" ?>

<!-- XMLスキーマの定義を記載 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
        web-jsptaglibrary_2_0.xsd"
    version="2.0">

-------カスタムタグの定義-------
-------カスタムタグの定義-------

</taglib>
DTDを使用する場合は、tldファイルに以下の記述を記載します。
<?xml version="1.0" ?>

<!-- DTDの定義を記載 -->
<!DOCTYPE taglib PUBLIC
    "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

-------カスタムタグの定義-------
-------カスタムタグの定義-------

</taglib>

タグ要素

tldファイルで定義できる主なタグ要素について解説します。すべてのタグ要素についてはJSP2.1の仕様書を参照してください。JSP2.1の仕様書(JavaServer Pages 仕様)は以下のURLからダウンロードできます。

URL: http://jcp.org/aboutJava/communityprocess/final/jsr245/index.html

<taglib>タグ

<taglib>タグはtldファイルで定義する最上位のタグです。タグライブラリのバージョン、JSPのバージョンなどカスタムタグの総体的な情報を定義します。

<taglib>タグのサブ要素

要素 内容 要素数
description カスタムタグの説明を記載します。 0以上
display-name GUIツールで表示されるカスタムタグの名前を記載します。 0以上
icon GUIツールで表示される画像を指定します。 0以上
small-icon <icon>タグのサブ要素です。GUIツールで表示される小さなアイコンを指定します。 0か1
large-icon <icon>タグのサブ要素です。GUIツールで表示される大きなアイコンを指定します。 0か1
tlib-version カスタムタグのバージョンを指定します。必ず1.0を指定します。 1
short-name GUIツールで使われるカスタムタグの略称を指定します。カスタムタグのプレフィックス値などに使用されます。 1
uri JSPプログラムがtldファイルの配置場所を認識するために使用します。JSPプログラムのtaglibディレクティブのuri属性で指定される値を指定します。web.xmlの<taglib-uri>タグ、<taglib-location>タグが指定されている場合はそちらが優先されます。 0か1
listener カスタムタグのリスナークラスを指定します。サブ要素の詳細はJSP2.0の仕様書を参照してください。 0以上
tag 個々のタグの動作を定義します。詳細は以下で解説します。 0以上

※ 要素数1は必須項目を表します。

<tag>タグ

<tag>タグは<taglib>タグのサブ要素で、カスタムタグの個々のタグの動作を定義します。タグ名や、タグハンドラクラスのクラス名などを指定します。

<tag>タグのサブ要素

要素 内容 要素数
description タグの説明を記載します。 0以上
display-name GUIツールで表示されるタグの名前を記載します。 0以上
icon GUIツールで表示される画像を指定します。 0以上
small-icon <icon>タグのサブ要素です。GUIツールで表示される小さなアイコンを指定します。 0か1
large-icon <icon>タグのサブ要素です。GUIツールで表示される大きなアイコンを指定します。 0か1
name JSPプログラムで使用するタグの名前を指定します。 1
tag-class カスタムタグの動作を定義したタグハンドラクラスをパッケージ名から指定します。 1
body-content 開始タグと終了タグの間の本体を定義します。
「empty」はタグの本体が空でなければなりません。
「JSP」はタグの本体にJSPが理解できるコードを記述できます。テキスト、HTML、JSPプログラムなどです。本体が空でも許容されます。
「tagdependent」はタグの本体にJSPが理解できないコードを記述できます。記載されたコードはそのままタグハンドラクラスに渡されます。SQL文などがあたります。
1
attribute タグに指定できる属性を定義します。詳細は以下で解説します。 0以上
example タグの使用例を記載します。 0か1

※ 要素数1は必須項目を表します。

<attribute>タグ

<attribute>タグは<tag>タグのサブ要素で、タグの属性を定義します。属性の名前、属性のデータ型などを指定します。

<attribute>タグのサブ要素

要素 内容 要素数
description 属性の説明を記載します。 0以上
name 属性の名前を指定します。 1
required 属性が必須かどうかをtrueかfalseで指定します。trueの場合は属性が必須であることを表します。デフォルトはfalseです。 0か1
rtexprvalue 属性値の指定に式が使用できるかどうかをtrueかfalseで指定します。trueの場合は式が使用できることを表します。属性値に<%=xxx %>といった式を指定し、属性値を動的に変更できます。デフォルトはfalseです。 0か1
type rtexprvalue要素が定義されているときに定義します。属性値に式を指定したときに式から返されるデータのデータ型を指定します。デフォルトや属性値に式を指定しない場合はString型になります。 0か1

※ 要素数1は必須項目を表します。

使用例

【例1】属性なし、タグの本体を許容しないカスタムタグの定義です。

tldファイル例

<?xml version="1.0" ?>

<!-- (1)XMLスキーマの定義を記載 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
            web-jsptaglibrary_2_0.xsd"
        version="2.0">
    <tlib-version>1.0</tlib-version>

    <!-- (2)JSPのバージョンを指定 -->
    <jsp-version>2.0</jsp-version>
    <short-name>hello</short-name>

    <tag>
        <!-- (3)JSPプログラムで使用するタグ名を指定 -->
        <name>sayHello</name>
        <!-- (4)タグの動作を定義したタグハンドラクラスを指定 -->
        <tag-class>tags.helloTag</tag-class>
        <!-- (5)タグの本体は空を指定 -->
        <body-content>empty</body-content>
    </tag>
</taglib>

JSPプログラム例

<%@ page contentType="text/html; charset=windows-31j"
    import="tags.*" %>
<%@ taglib uri="http://www.javaroad.jp/tags/hello"
    prefix="hello" %>

---------------------
---------------------

<%-- (1)カスタムタグを使用します。タグのプレフィックスに
        taglibディレクティブで指定した値を使用します。タ
        グ名にはtldファイルの<name>タグで指定した値を使
        用します。<body-content>タグでemptyを指定してい
        るため、タグの本体は記載しません。 --%>
<hello:sayHello />

---------------------
---------------------

【例2】属性あり、タグの本体にコードの記載を許容するカスタムタグの定義です。

tldファイル例

<?xml version="1.0" ?>

<!-- (1)XMLスキーマの定義を記載 -->
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
            web-jsptaglibrary_2_0.xsd"
        version="2.0">

    <tlib-version>1.0</tlib-version>
    <!-- (2)JSPのバージョンを指定 -->
    <jsp-version>2.0</jsp-version>
    <short-name>helloFirst</short-name>
    <tag>
        <!-- (3)JSPプログラムで使用するタグ名を指定 -->
        <name>sayHelloFirst</name>
        <!-- (4)タグの動作を定義したタグハンドラクラスを指定 -->
        <tag-class>tags.helloFirstTag</tag-class>
        <!-- (5)タグの本体にJSPが理解できるコードの記載を許容 -->
        <body-content>JSP</body-content>
        <!-- (6)属性の名前がcount、必須の属性で、
                   属性値に式が許容できる属性を宣言 -->
        <attribute>
            <name>count</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

JSPプログラム例

<%@ page contentType="text/html; charset=windows-31j"
    import="tags.*" %>
<%@ taglib uri="http://www.javaroad.jp/tags/helloFirst"
    prefix="hello2" %>

---------------------
---------------------

<%-- (1)カスタムタグの属性としてtldファイルの<attribute>タグ
        で指定したcount属性を使用しています。<body-content>
        タグでJSPを指定し、本体にコードの記載を許容している
        ため、本体にprintlnメソッドを記載しています。 --%>
<hello2:sayHelloFirst count="<%= check %>">
    out.println("Hello World!");
</hello2:sayHelloFirst>

---------------------
---------------------

14カスタムタグ(tldファイルの作成)