タグハンドラのオーサリング

Java 開発者は、タグハンドラの開発時に、次のタスクを行う責任があります。

次のセクションでは、クラスとインターフェイス、およびタグハンドラの作成方法について説明します。

クラスとインターフェイス

カスタムタグやタグライブラリのコーディングには、javax.servlet.jsp.tagext パッケージのクラスとインターフェイスを使用します。次の図は、これらのクラスとインターフェイスの関係を示しています。

tagext パッケージのクラス、アブストラクトクラス、およびインターフェイスを示しています。

次の表で、プライマリクラスおよびインターフェイスについて説明します。
クラス/
インターフェイス

説明
Tag インターフェイス
関連する開始タグと終了タグによって呼び出される基本的な開始メソッドと終了メソッドを定義します。これらのメソッドには、doStartTag と doEndTag が含まれます。
IterationTag
インターフェイス
Tag インターフェイスを拡張します。カスタムタグを使用
して本文テキスト上でループ処理を行う場合に使用する追加メソッドを定義します。このメソッドは doAfterBody と呼びます。
BodyTag
インターフェイス
IterationTag インターフェイスを拡張します。カスタムタグを使用して本文テキストと対話する場合や、必要に応じて doInitBody メソッド などの結果の変更を行う場合に使用する追加メソッドを定義します。
TagSupport クラス
Tag インターフェイスを実装します。これは、本文テキストと対話しないタグハンドラに応じて拡張可能なオプションのヘルパークラスです。
BodyTagSupport
クラス
BodyTag インターフェイスを実装します。これは TagSupport のサブクラスです。これは、本文テキストと対話するタグハンドラに応じて拡張可能なオプションのヘルパークラスです。

各インターフェイスにより、前のインターフェイスが拡張されます。その結果
IterationTag インターフェイスには、Tag のメソッドだけでなく追加の機能も含まれます。BodyTag インターフェイスには、他の 2 つのインターフェイスに含まれるすべてのメソッドと追加機能が含まれます。

タグライブラリのプログラミングで使用するクラスとインターフェイスの詳細については、JRun/docs ディレクトリにある JavaDocs を参照してください。

使用するインターフェイスの決定

javax.servlet.jsp.tagext パッケージを拡張する各インターフェイスは、その前にパッケージを拡張します。その結果、IterationTag インターフェイスには Tag インターフェイスのすべての機能と追加メソッドが、BodyTag インターフェイスには IterationTag インターフェイスのすべての機能と追加メソッドが含まれます。

カスタムタグハンドラのあらゆる実装で、BodyTag インターフェイスは排他的に使用され、機能やパフォーマンスに影響を及ぼすことはありません。これにより、最大限の柔軟性と複雑さが同時に実現されます。Tag インターフェイスと IterationTag インターフェイスが含まれることにより、あまり多くのメソッドを使用しない、より明解な実装を実現できます。

BodyTag を使用する利点の 1 つに、インターフェイスを変更せずに Web アプリケーションに機能を追加できる点があります。Tag インターフェイスを使用する場合は、タグハンドラが使用するインターフェイスを変更しないかぎり、タグハンドラを使用して本文テキストのループ処理はできません。IterationTag インターフェイスを使用する場合は、インターフェイスを変更しないかぎり、タグハンドラを使用して本文コンテンツのバッファリングや変更はできません。

簡単なタグハンドラのコーディング

簡単なタグハンドラでは、次の処理を行います。

TagSupport を拡張すると、doStartTag メソッドおよび doEndTag メソッドは、次の戻り値 (定数として定義済み) を使用します。

次のタグハンドラは、doStartTag メソッドと doEndTag メソッドから HTML を出力します。この HTML は JSP ページのタグの内容を形成します。

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.IOException;
public class SimpleTag extends TagSupport {
  /**
  * タグが開始されたら実行します。
  */
public int doStartTag() throws JspException {
  try {
    pageContext.getOut().print("<h2>Hello from doStartTag()</h2>");
    // タグの本文でテキストを使用できるようにします。
    return EVAL_BODY_INCLUDE;
  } catch(IOException ioe) {
    throw new JspException(ioe.getMessage());
  }
}
/**
* 終了タグを実行します。
*/
public int doEndTag() throws JspException {  try {
    pageContext.getOut().print("<h2>Hello from doEndTag()</h2>");
    // ページの評価を継続します。
    return EVAL_PAGE;
  } catch(IOException ioe) {
    throw new JspException(ioe.getMessage());
  } 
}
}

このカスタムタグハンドラをコンパイルして JRun 環境に追加すると、次の行を JSP に追加することによって、このタグを呼び出すことができます。

<prefix:simpletag />

タグハンドラの保存

コンパイル済みのタグハンドラクラスは、次のいずれかの格納場所に保存します。

推奨されている TLD ファイルの配置方法など、その他のパッキング情報については、 「タグライブラリのパッケージング」 を参照してください。

タグハンドラの使用

JSP でタグハンドラのクラスを使用するには、web.xml ファイルに taglib 要素を追加し、TLD ファイルでタグを定義し、JSP の TLD の URI にリンクする必要があります。

web.xml ファイルへの taglib 要素の追加の詳細については、 「タグライブラリのパッケージング」 を参照してください。

TLD ファイルの作成の詳細については、 「TLD ファイルの作成」 を参照してください。JSP の TLD へのリンクの詳細については、 「タグライブラリの使用」 を参照してください。