この章では、カスタムJSPタグの機能、フォーマット、およびコンポーネントの概要、ならびにタグ・ライブラリの作成と構成の手順について説明します。
この章には次の項が含まれます:
カスタムJSPタグを作成するには、タグ・ハンドラと呼ばれるJavaクラスを作成します。
JSP 2.1 APIには、JSP 2.1仕様での説明どおりhttp://java.sun.com/products/jsp/reference/api/index.html
で、カスタム・タグ・ハンドラの作成に使用するクラスとインタフェースのセットが説明されます。
javax.servlet.jsp.tagext
APIに関するドキュメントは、http://docs.oracle.com/docs/cd/E17802_01/products/products/jsp/2.1/docs/jsp-2_1-pfd2/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()
メソッドをサポートするのではなく、simple 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
属性を照合することによって、タグ・ライブラリ記述子ファイルを見つけようとします。
注意: .tld ファイルがデフォルトの場所(/WEB-INF/ または/WEB-INF/tags/ )にある場合、<%@ taglib uri='myTLD' prefix='mytaglib' %> であるuri値が.tld ファイルで指定されているuriと同じであれば、web.xmlで<taglib> を記載する必要はありません。詳細は、JSP 2.1仕様を参照してください。 |
たとえば、上の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>
詳細は、第3章「タグ・ライブラリ記述子の作成」を参照してください。
カスタム・タグのフォーマットは、空タグと呼ばれる空のものか、本体付きタグと呼ばれる本体を含むものです。どちらのタイプのタグも、そのタグを実装するJavaクラスに渡される複数の属性を受け付けます。詳細は、「タグ本体内の例外処理」を参照してください。
空タグの形式は次のとおりです。
<mytaglib:newtag attr1="aaa" attr2="bbb" ... />
本体付きタグの形式は次のとおりです。
<mytaglib:newtag attr1="aaa" attr2="bbb" ... > body </mytaglib:newtag>
タグ本体には、多くのJSP構文、およびネストされた本体を持つ別のカスタムJSPタグを入れることができます。タグは、お互いの内部で任意のレベルにネストできます。例:
<mytaglib:tagA> <h2>This is the body of tagA</h2> You have seen this text <mytaglib:counter /> times! <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でカスタム・タグを使用する場合、このクラスはそのタグの機能を実行します。タグ・ハンドラ・クラスでは、次の3つのインタフェースのいずれかが実装されます。
javax.servlet.jsp.tagext.BodyTag javax.servlet.jsp.tagext.Tag javax.servlet.jsp.tagext.SimpleTag
タグ・ハンドラ・クラスは、タグ・ライブラリの一部として実装されます。詳細は、第4章「タグ・ハンドラの実装」を参照してください。
JSPソース内で、JSP <taglib>
ディレクティブを使用してタグ・ライブラリを参照します。タグ・ライブラリは、JSPタグを集めたものです。このディレクティブをJSPソースの先頭に挿入します。詳細は、「JSPタグ・ライブラリの構成」を参照してください。
タグ・ライブラリ記述子(TLD)を記述します。TLDは、タグ・ライブラリを定義し、タグ・ハンドラ・クラス名、属性、タグに関するその他の情報など、各タグに関する追加情報を提供します。詳細は、第3章「タグ・ライブラリ記述子の作成」を参照してください。
TLDを、Webアプリケーション・デプロイメント記述子(web.xml)で参照してください。
JSPでカスタム・タグを使用します。詳細は、「JSPタグ・ライブラリの構成」を参照してください。