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

15カスタムタグ(タグハンドラクラスの作成)

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

カスタムタグ(タグハンドラクラスの作成)

タグハンドラクラスはカスタムタグの具体的な動作を定義するクラスファイルです。ここでは、タグハンドラクラスの作成方法について解説します。

tagextパッケージ

タグハンドラクラスの作成に関連するインタフェース、クラスはjavax.servlet.jsp.tagextパッケージに含まれています。ここではtagextパッケージに含まれているインターフェース、クラスのうち主なものを紹介します。

tagextパッケージのインタフェース・クラス

インタフェースクラス 内容
Tag タグハンドラクラスを作成する上で基本となるインタフェースです。単純なカスタムタグの作成に適しています。タグハンドラクラスは直接的・間接的にこのインタフェースを実装している必要があります。
IterationTag Tagインタフェースを継承したインタフェースです。タグの本体を繰返し処理するカスタムタグの作成に適しています。
BodyTag IterationTagインタフェースを継承したインタフェースです。タグの本体をバッファし、操作するメソッドが定義されています。
TagSupport Iteratorインタフェースを実装したクラスです。データをハッシュテーブルで管理できる簡易メソッドなどが定義されています。
BodyTag
Support
BodyTagインタフェースを実装したクラスです。バッファされたデータを操作する簡易メソッドなどが定義されています。

Tagインタフェース

ここでは、タグハンドラクラスを作成する上でもっとも基本となるTagインタフェースについて解説します。以下はTagインタフェースで定義されているメソッドです。

Tagインタフェースのメソッド

戻り型 メソッド 説明
void setPageContext(PageContext) JSPのpageContextオブジェクトへの参照を保存するメソッドです。pageContextオブジェクトはJSPで使われるすべてのオブジェクトを管理することができます。詳細はJavaの道:暗黙オブジェクト(pageContext)を参照してください。
void setParent( ) 入れ子になっているタグで、親タグへの参照を設定するメソッドです。
Tag getParent( ) 入れ子になっているタグで、親タグへの参照を取得するメソッドです。
void setXxx(
String
など)
タグに属性が設定されている際に、その属性の値を設定するsetメソッドです。Xxxには属性名が入ります。属性名の最初の文字は大文字にする必要があります。
int doStart
Tag( )
開始タグが呼び出されたときに実行されるメソッドです。カスタムタグの具体的な処理内容を記載します。戻り値としてEVAL_BODY_INCLUDEを返すとタグの本体を評価することを表します。SKIP_BODYを返すとタグの本体を評価しないことを表します。
int doEnd
Tag( )
終了タグが呼び出されたときに実行されるメソッドです。カスタムタグの終了処理を記載します。戻り値としてEVAL_PAGEを返すと終了タグ以降のJSPページを実行することを表します。SKIP_PAGEを返すと残りのJSPページを実行しないことを表します。
void release( ) タグハンドラクラスのオブジェクトが不要と判断された時にJSPコンテナから呼び出されるメソッドです。不要と判断されるまで、タグハンドラクラスのオブジェクトは繰返し再利用されます。

Tagインタフェースで定義されているメソッドは以下の順番で実行されます。

Javaの道_Tagインタフェース_実行順

使用例

タグハンドラクラスの作成例を例示します。カスタムタグの属性を指定すると指定された値と"Hello"を表示するカスタムタグです。

helloNameTag.java

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

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

//(2)Tagインタフェースを実装します。
public class helloNameTag implements Tag {
    private PageContext pageContext;
    private Tag parentTag;
    private String name;

    //(3)setPageContextメソッド、setParentメソッド、getParent
    //   メソッドはほぼ決まりきった記述です。特別な処理の行わ
    //   ない場合は、この記述を行います。
    public void setPageContext(PageContext pageContext) {
        this.pageContext = pageContext;
    }

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

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

    //(4)属性に指定された値を保存するsetメソッドです。
    public void setName(String name) {
        this.name = name;
    }

    //(5)開始タグが呼び出されるときに実行されるdoStartTagメソ
    //   ッドです。"Hello"という値と属性に指定された値を表示
    //   する処理を記載します。処理が終わるとSKIP_BODYを返し、
    //   タグの本体を評価しないことを表します。
    public int doStartTag() throws JspException {
        try {
            JspWriter out = pageContext.getOut();
            out.print("Hello " + name);
        } catch(Exception e) {
         throw new JspException(e.getMessage());
        }
        return SKIP_BODY;
    }

    //(6)終了タグが呼び出されるときに実行されるdoEndTagメソッ
    //   ドです。EVAL_PAGEを返し、終了タグ以降のJSPページを実
    //   行することを表します。
    public int doEndTag() throws JspException {
        return EVAL_PAGE;
    }

    //(7)タグハンドラクラスのオブジェクトが不要と判断されたと
    //   きに実行されます。
    public void release() {}
}

タグハンドラクラスに該当するtldファイルを以下に記載します。tldファイルの説明の詳細はJavaの道:カスタムタグ(tldファイルの作成)を参照してください。

helloName.tld

<?xml version="1.0" ?>

<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>
    <jsp-version>2.0</jsp-version>
    <short-name>helloNameTag</short-name>
    <tag>
        <!-- (1)JSPプログラムで使用されるタグの名前です。 -->
        <name>helloNameTag</name>
        <!-- (2)タグハンドラクラスをパッケージ名から指定します。 -->
        <tag-class>tags.helloNameTag</tag-class>
        <body-content>empty</body-content>
        <!-- (3)属性を定義します。 -->
        <attribute>
            <name>name</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
</taglib>

カスタムタグを使用するJSPプログラムは以下のようになります。

exHelloNameTag.jsp

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

<HTML>
<BODY>

<%-- (1)タグ名にtldファイルで指定したタグ名"helloNameTag"を、
    属性名に同じくtldファイルで指定した属性名"name"を、
    属性値に"java"を指定しています。 --%>
<hello:helloNameTag name="java" />

</BODY>
</HTML>

【実行結果】カスタムタグの実行例を以下に記載します。カスタムタグの実行方法の詳細はJavaの道:カスタムタグ(概要)を参照してください。

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

15カスタムタグ(タグハンドラクラスの作成)