WebLogic JSP Tag Extensions プログラマーズ ガイド
カスタム JSP タグの概要と作成
以下の節では、カスタム JSP タグの機能、フォーマット、およびコンポーネントの概要、ならびにタグ ライブラリの作成とコンフィグレーションの手順について説明します。
タグ ハンドラの API および実装
カスタム JSP タグを作成するには、タグ ハンドラと呼ばれる Java クラスを作成します。
JSP 2.0 API には、カスタム タグ ハンドラの作成に使用するクラスとインタフェースのセットが定義されています。javax.servlet.jsp.tagext
API に関するドキュメントは、http://java.sun.com/j2ee/j2sdkee/techdocs/api/index.html にあります。
タグ ハンドラは、次の 2 つのタイプのどちらかである必要があります。
以下の 3 つのインタフェースのいずれかを実装する従来のタグ ハンドラ。
Tag
インタフェースにアクセスする必要のないカスタム タグを作成している場合は、javax.servlet.jsp.tagext.Tag
インタフェースを実装します。この API は、コンビニエンス クラス TagSupport
も提供します。このクラスは、Tag
インタフェースを実装し、このインタフェース内で定義されているメソッド用のデフォルトの空メソッドを提供します。
BodyTag
カスタム タグが本体を使用する必要がある場合、javax.servlet.jsp.tagext.BodyTag
インタフェースを実装します。この API は、コンビニエンス クラス BodyTagSupport
も提供します。このクラスは、BodyTag
インタフェースを実装し、このインタフェース内で定義されているメソッド用のデフォルトの空メソッドを提供します。BodyTag
は Tag
を拡張したものであり、インタフェース メソッドのスーパーセットです。
IterationTag
本体の再評価を制御する追加のメソッド doAfterBody()
を定義して、Tag
を拡張する、javax.servlet.jsp.tagext.IterationTag
インタフェースを実装します。
シンプル タグ ハンドラ (SimpleTag
インタフェース)。
大幅に簡素化された呼び出しプロトコルを使用する場合は、javax.servlet.jsp.tagext.SimpleTag
インタフェースを実装します。SimpleTag
インタフェースでは、BodyTag
インタフェースのように javax.servlet.jsp.tagext.Tag
インタフェースを拡張しません。したがって、SimpleTag
インタフェースは doStartTag() および doEndTag() メソッドをサポートするのではなく、単純な doTag() メソッドを提供します。このメソッドは各タグ呼び出しごとに一度だけ呼び出されます。
タグ ハンドラは、以下のいずれかの方法で作成します。
タグのライフサイクルの間に呼び出されるメソッドを定義する SimpleTag
、Tag
または BodyTag
インタフェースを実装する。
SimpleTag
、Tag
、または BodyTag
インタフェースを実装する抽象基本クラスを拡張する。
抽象基本クラスを拡張すると、タグ ハンドラ クラスがそのインタフェース内のすべてのメソッドを実装する必要がなくなります。また、他の便利な機能を使用できるようになります。SimpleTagSupport
、TagSupport
、および BodyTagSupport
クラスが、SimpleTag
、Tag
、または BodyTag
インタフェースを実装し、API に組み込まれます。
タグ ライブラリには、1 つ以上のカスタム JSP タグを格納することができます。タグ ライブラリは、タグ ライブラリ記述子 (.tld
) ファイルで定義します。TLD は各タグの構文を記述し、その機能を実行する Java クラスにそのタグを関連付けます。
カスタム タグ ライブラリ
JSP タグ ライブラリは、1 つ以上のカスタム JSP タグを格納しており、タグ ライブラリ記述子 (.tld
) ファイルで定義されます。JSP ページからカスタム タグ ライブラリを使用するには、以下のように <%@ taglib %>
ディレクティブを使用してそのタグを参照します。次に例を示します。
<%@ taglib uri="myTLD" prefix="mytaglib" %>
uri
JSP エンジンは、Web アプリケーション デプロイメント記述子 (web.xml)
の <taglib-uri>
要素で定義した uri
と、この uri
属性を照合することによって、タグ ライブラリ記述子ファイルを見つけようとします。たとえば、上の taglib
ディレクティブの myTLD
は、次のように Web アプリケーション デプロイメント記述子のタグ ライブラリ記述子 (library.tld)
を参照します。
<taglib>
<taglib-uri>myTLD</taglib-uri>
<taglib-location>library.tld</taglib-location>
</taglib>
prefix
prefix
属性は、タグ ライブラリにラベルを割り当てます。カスタム JSP タグを使用してページを作成する場合は、このラベルを使って関連するタグ ライブラリを参照します。たとえば、上の例のライブラリ (mytaglib
) が newtag
という新しいタグを定義した場合、このタグを JSP ページで使用するには、以下のように記述します。
<mytaglib:newtag>
詳細については、「タグ ライブラリ記述子の作成」を参照してください。
カスタム タグのフォーマット
カスタム タグのフォーマットは、空タグと呼ばれる空のものか、本体付きタグと呼ばれる本体を含むものです。どちらのタイプのタグも、そのタグを実装する Java クラスに渡される複数の属性を受け付けます。詳細については、「タグ本体内の例外処理」を参照してください。
空タグの形式は次のとおりです。
<mytaglib:newtag attr1="aaa" attr2="bbb" ... />
本体付きタグの形式は次のとおりです。
<mytaglib:newtag attr1="aaa" attr2="bbb" ...>
body
</mytaglib:newtag>
タグ本体には、多くの JSP 構文、およびネストされた本体を持つ別のカスタム JSP タグを入れることができます。タグは、お互いの内部で任意のレベルにネストできます。次に例を示します。
<mytaglib:tagA>
<h2>これは tagA の本体です</h2>
このテキストはこれまでに <mytaglib:counter /> 回現れました !
<p>
<mytaglib:repeater repeat=4>
<p>Hello World!
</mytaglib:repeater>
</mytaglib:tagA>
上の例では、3 つのカスタム タグを使用して、本体付きタグの中にタグをネストする方法が示されています。これらのタグは、以下のように機能します。
本体付きタグ <mytaglib:tagA>
は、その評価済み本体からの HTML 出力しか認識しません。つまり、ネストされた JSP タグの <mytaglib:counter>
と <mytaglib:repeater>
がまず評価され、それらの出力が <mytaglib:tagA>
タグの評価済み本体の一部になります。
本体付きタグの本体がまず JSP として評価され、ネストされた本体付きタグも含め、その中に入っているすべてのタグが変換され、さらにそれらの本体が再帰的に評価されます。評価済み本体の結果が本体付きタグの出力として直接使用されるか、本体付きタグがその評価済み本体のコンテンツに基づいて出力を決定します。
本体付きタグの JSP から生成される出力は、通常の HTML として取り扱われます。つまり、出力はさらに JSP として解釈されることはありません。
カスタム タグの機能
カスタム タグは、以下のタスクを実行できます。
出力を生成します。タグの出力はその親スコープに送られます。スコープは以下のいずれかです。
そのタグが JSP ページに直接含まれる場合には、その JSP ページの出力が親スコープとなります。
そのタグが別の親タグ内でネストされている場合、その出力はその親タグの評価済み本体の一部になります。
JSP ページの中でスクリプト変数として参照および使用できる新しいオブジェクトを定義します。タグは、固定名前付きスクリプト変数を導入するか、id
属性を備えた動的名前付きスクリプト変数を定義できます。
一定の条件が満たされるまで、そのタグ本体のコンテンツの処理を繰り返します。これは、出力を反復的に生成するため、またはサーバサイド アクションを繰り返し呼び出すために使用します。
その JSP ページの残りの部分を要求の一部として処理するか、それともスキップするかを決定します。
空タグは、そのタグの属性に基づいてサーバサイドの作業を実行できます。そのタグが実行するアクションによって、ページの残りの部分を解釈するか、それともリダイレクトなどの別のアクションを実行するかが決められます。この機能は、ユーザがページにアクセスする前にログインしたかどうかをチェックし、ログインしていなければログイン ページにリダイレクトする場合に役立ちます。
空タグは、その属性に基づいてページにコンテンツを挿入できます。このようなタグを使用すると、ページのヒット数を数える単純なカウンタや、その他のテンプレート ベースの挿入を実装できます。
空タグは、その属性に基づいて、ページの残りの部分で使用可能なサーバサイド オブジェクトを定義できます。このタグを使用すると、同じ JSP ページ内の他の場所でデータのクエリを受けることができる EJB への参照を作成することができます。
本体付きタグは、ブラウザに送信される HTML ページの一部となる前にその出力を処理し、その出力を評価して、ブラウザに送信する HTML を決定できます。この機能は、「引用 HTML」、つまり再フォーマットされたコンテンツを生成するために、または SQL クエリなどの他の関数に渡すパラメータとして使用できます (SQL クエリの場合、タグの出力はフォーマットされた結果セットとなる)。
本体付きタグは、特定の条件が満たされるまで、その本体を繰り返し処理できます。
JSP タグ ライブラリの作成とコンフィグレーション : 手順の例
カスタム JSP タグを作成および使用するには、以下の手順を実行します。
タグ ハンドラ クラスを記述します。JSP でカスタム タグを使用する場合、このクラスはそのタグの機能を実行します。タグ ハンドラ クラスでは、次の 3 つのインタフェースのいずれかが実装されます。
javax.servlet.jsp.tagext.BodyTag
javax.servlet.jsp.tagext.Tag
javax.servlet.jsp.tagext.SimpleTag
タグ ハンドラ クラスは、タグ ライブラリの一部として実装されます。詳細については、「タグ ハンドラの実装」を参照してください。
JSP ソース内で、JSP <taglib>
ディレクティブを使用してタグ ライブラリを参照します。タグ ライブラリは、JSP タグを集めたものです。このディレクティブを JSP ソースの先頭に挿入します。詳細については、「JSP タグ ライブラリのコンフィグレーション」を参照してください。
タグ ライブラリ記述子 (TLD) を記述します。TLD は、タグ ライブラリを定義し、タグ ハンドラ クラス名、属性、タグに関するその他の情報など、各タグに関する追加情報を提供します。詳細については、「タグ ライブラリ記述子の作成」を参照してください。
TLD を、Web アプリケーション デプロイメント記述子 (web.xml) で参照します。