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

13カスタムタグ(概要)

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

カスタムタグ(概要)

JSPでは、<jsp:forward>、<jsp:useBean>などあらかじめ用意されているアクションタグがあります。これらのタグを使用することにより、JSPのコードを簡潔に記述することができます。アクションタグをプログラマが独自に定義することもできます。これらのタグをカスタムタグといいます。ここでは、タグを指定すると、「Hello World!」と表示するカスタムタグを例にとり、カスタムタグの作成方法について解説します。
なお、Jakarta Projectでは、頻繁に使用する動作をあらかじめカスタムタグとして定義し、Taglibsとして公開しています。Taglibsについては、Javaの道:Taglibs(インストール)を参照してください。

カスタムタグの作成

カスタムタグは以下の手順により作成されます。

  1. タグハンドラクラスの作成

    カスタムタグの動作を定義するクラスファイルを作成します。

  2. tldファイルの作成

    カスタムタグの使用方法をJSPコンテナに知らせるため、カスタムタグの動作を定義したXML形式の定義ファイルを作成します。

  3. web.xmlファイルの設定

    web.xmlファイルにJSPプログラムがtldファイルの配置場所を認識するための配置情報を指定します。

  4. JSPプログラムの作成

    JSPプログラムのtaglibディレクティブでカスタムタグを指定します。指定したカスタムタグを使用して、JSPプログラムを作成します。

タグハンドラクラスの作成

タグを指定すると「Hello World!」と表示するカスタムタグのタグハンドラクラスは以下のようになります。詳細な説明は別のページで行いますため、ここでは概要のみ説明します。タグハンドラクラスをコンパイルする際はCLASSPATHにjsp-api.jarを指定します。

helloTagServlet.java

//(1)J2SDK1.4からデフォルトパッケージをインポートすることはできなくなったため、JSPプログラムからインポートできるようにパッケージを宣言します。

package tags;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

//(2)タグハンドラクラスを作成するために、Tagインタフェースを実装します。
public class helloTagServlet implements Tag {
    private PageContext pageContext;
    private Tag parentTag;

    public void setPageContext(PageContext pageContext) {
        this.pageContext = pageContext;
    }

    public void setParent(Tag parentTag) {
        this.parentTag = parentTag;
    }

    public Tag getParent() {
        return this.parentTag;
    }

    //(3)開始タグが呼び出されたときにを実行される
    //   doStartTagメソッドです。このメソッドに
    //   実行させたい処理を記述します。
    public int doStartTag() throws JspException {
        try {
            JspWriter out = pageContext.getOut();
            //(4)タグが実行されたときに画面に
            //   "Hello World!"と表示します。
            out.print("Hello World!");
        } catch(Exception e) {
            throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

    //(5)終了タグが呼び出されたときに実行される
    //   doEndTagメソッドです。このメソッドに
    //   実行させたい後処理を記述します。
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    public void release() {}
}

tldファイルの作成

カスタムタグの動作を定義するtldファイルを作成します。詳細な説明は別のページで行いますため、ここでは概要のみ説明します。

hello.tld

<?xml version="1.0" ?>
<!-- (1)JSP2.0よりXMLの定義方法がDTDからXMLスキーマに変わりました。
        DTDも使用できるようですが、XMLスキーマを使用する場合は
        以下のような宣言を行います。DTDを使用する場合は<!DOCTYPE 
        ---- >といった宣言を行います。 -->

<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>helloTag</short-name>
    <tag>
        <!-- (3)JSPで使用するタグ名を指定します。 -->
        <name>helloTag</name>
        <!-- (4)タグの動作を定義したタグハンドラクラスを
                パッケージ名から記述します。 -->
        <tag-class>tags.helloTagServlet</tag-class>
        <body-content>empty</body-content>
    </tag>
</taglib>

web.xmlの設定

web.xmlにはJSPプログラムがtldファイルを参照するための設定を行います。tldファイルの参照は<taglib>タグで行います。Servlet2.4から<taglib>タグは<jsp-config>タグのサブ要素として設定するようになりました。

<taglib>タグ内に<taglib-uri>タグ、<taglib-location>タグを設定します。<taglib-uri>タグにはJSPファイルのtaglibディレクティブのuri属性で指定した値を設定します。<taglib-location>タグにはtldファイルが配置されている場所をコンテキストルートからの相対パスで指定します

<jsp-config>タグのサブ要素

要素 内容 要素数
taglib JSPプログラムからtldファイルを参照する設定を記載します。 0以上
taglib-uri <taglib>タグのサブ要素です。JSPプログラムのtaglibディレクティブのuri属性に指定される値を設定します。 1
taglib-location <taglib>タグのサブ要素です。tldファイルの配置場所をコンテキストルートからの相対パスで指定します。 1
jsp-property-group 指定したURLパターンに合致するJSPプログラムの個別の設定(エンコード方式、式言語(EL)の使用可否など)を指定できます。 0以上

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- (1)Servlet2.4よりXMLの定義方法がDTDからXMLスキーマに変わり
        ました。DTDも使用できるようですが、XMLスキーマを使用す
        る場合は以下のような宣言を行います。DTDを使用する場合は
        <!DOCTYPE ---- >といった宣言を行います。 -->

<web-app 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-app_2_4.xsd"
        version="2.4">
    <jsp-config>
        <taglib>
            <!-- (2)JSPプログラムのtaglibディレクティブのuri属性で指
                        定した値を設定します。設定したURLに実際のファイル
                        が配置されているわけではありません。このタグで設
                        定した値は単にtaglibディレクティブのuri属性で指定
                        された値と紐付けする値として使用されます。 -->
            <taglib-uri>http://www.javaroad.jp/tags/hello</taglib-uri>
            <!-- (3)tldファイルの配置場所をコンテキストルートからの相
                        対パスで指定します。 -->
            <taglib-location>/WEB-INF/lib/hello.tld</taglib-location>
        </taglib>
    </jsp-config>
</web-app>

JSPプログラムの作成

カスタムタグを使用するJSPプログラムを作成します。JSPプログラムにどのカスタムタグを使用するかの設定を行う必要があります。l設定はtaglibディレクティブで行います。

<%@ taglib uri="属性値" prefix="属性値" %>

taglibディレクティブの属性

属性名 説明 デフォルト
uri 該当するweb.xmlの<taglib-uri>タグに設定された値を指定します。
prefix JSPプログラムでカスタムタグを使用する際のタグのプレフィックスを指定します。

今回作成するJSPファイルは以下のようになります。

exHelloTag.jsp

<%-- (1)pageディレクティブでタグハンドラクラスが属するパッケージをインポートします。 --%>
<%@ page contentType="text/html; charset=windows-31j"
    import="tags.*" %>

<%-- (2)taglibディレクティブでJSPプログラムでカスタムタグを使用するための設定を行います。 --%>
<%@ taglib uri="http://www.javaroad.jp/tags/hello"
    prefix="hello" %>

<HTML>
<BODY>
<%-- (3)カスタムタグを使用します。タグのプレフィックスに
    taglibディレクティブで指定した値を使用します。
    タグ名にはtldファイルで指定した値を使用します。 --%>
<hello:helloTag />

</BODY>
</HTML>

使用例

カスタムタグの使用例を例示します。各ファイルは以下のように配置します。コンテキストルートとは、各アプリケーションごとに作成された領域のルートディレクトリです。ここでは、コンテキストルートとして$CATALINA_HOME\webappsディレクトリの配下にserTestディレクトリを作成し、コンテキストルートとします。

Javaの道_カスタムタグ_配置例

【実行結果】JSPプログラムの実行方法に関しては、Javaの道:Tomcat(プログラム配置・実行)を参照してください。

Javaの道_カスタムタグ_実行結果

13カスタムタグ(概要)