2 カスタムJSPタグの理解と作成
タグ・ハンドラのAPIおよび実装
カスタムJSPタグを作成するには、タグ・ハンドラと呼ばれるJavaクラスを作成します。
JSP 2.3 APIは、カスタムのタグ・ハンドラの作成に使用するクラスとインタフェースのセットです。
JSP 2.3仕様(http://java.sun.com/products/jsp/reference/api/index.html)を参照してください。
javax.servlet.jsp.tagext APIのドキュメントは、https://docs.oracle.com/javaee/7/api/overview-summary.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タグの理解と作成
カスタム・タグ・ライブラリ
JSPタグ・ライブラリは、1つ以上のカスタムJSPタグを格納しており、タグ・ライブラリ記述子(.tld)ファイルで定義されます。JSPページからカスタム・タグ・ライブラリを使用するには、以下のように<%@ taglib %>ディレクティブを使用してそのタグ・ライブラリ記述子を参照します。
たとえば:
<%@ taglib uri="myTLD" prefix="mytaglib" %>
-
uriJSPエンジンは、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.3仕様を参照してください。たとえば、上の
taglibディレクティブのmyTLDは、次のようにWebアプリケーション・デプロイメント記述子のタグ・ライブラリ記述子(library.tld)を参照します。<taglib> <taglib-uri>myTLD</taglib-uri> <taglib-location>library.tld</taglib-location> </taglib>
-
prefixprefix属性は、タグ・ライブラリにラベルを割り当てます。カスタムJSPタグを使用してページを作成する場合は、このラベルを使って関連するタグ・ライブラリを参照します。たとえば、上の例のライブラリ(mytaglib)が
newtagという新しいタグを定義した場合、このタグをJSPページで使用するには、以下のように記述します。<mytaglib:newtag>
「タグ・ライブラリ記述子の作成」を参照してください。
親トピック: カスタムJSPタグの理解と作成
カスタム・タグのフォーマット
カスタム・タグのフォーマットは、空タグと呼ばれる空のものか、本体付きタグと呼ばれる本体を含むものです。どちらのタイプのタグも、そのタグを実装する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ページの出力が親スコープとなります。
-
そのタグが別の親タグ内でネストされている場合、その出力はその親タグの評価済み本体の一部になります。
-
-
JSPページの中でスクリプト変数として参照および使用できる新しいオブジェクトを定義します。タグは、固定名前付きスクリプト変数を導入するか、
id属性を備えた動的名前付きスクリプト変数を定義できます。 -
一定の条件が満たされるまで、そのタグ本体のコンテンツの処理を繰り返します。これは、出力を反復的に生成するため、またはサーバー側アクションを繰返し呼び出すために使用します。
-
そのJSPページの残りの部分を要求の一部として処理するか、それともスキップするかを決定します。
-
空タグは、そのタグの属性に基づいてサーバー側の作業を実行できます。そのタグが実行するアクションによって、ページの残りの部分を解釈するか、それともリダイレクトなどの別のアクションを実行するかが決められます。この機能は、ユーザーがページにアクセスする前にログインしたかどうかをチェックし、ログインしていなければログイン・ページにリダイレクトする場合に役立ちます。
-
空タグは、その属性に基づいてページにコンテンツを挿入できます。このようなタグを使用すると、ページのヒット数を数える単純なカウンタや、その他のテンプレート・ベースの挿入を実装できます。
-
空タグは、その属性に基づいて、ページの残りの部分で使用可能なサーバー側オブジェクトを定義できます。このタグを使用すると、同じJSPページ内の他の場所でデータの問合せを受けることができるEJBへの参照を作成することができます。
-
本体付きタグは、ブラウザに送信されるHTMLページの一部となる前にその出力を処理し、その出力を評価して、ブラウザに送信するHTMLを決定できます。この機能は、「引用HTML」、つまり再フォーマットされたコンテンツを生成するために、またはSQL問合せなどの他の関数に渡すパラメータとして使用できます(SQL問合せの場合、タグの出力はフォーマットされた結果セットとなります)。
-
本体付きタグは、特定の条件が満たされるまで、その本体を繰返し処理できます。
親トピック: カスタムJSPタグの理解と作成