このチュートリアルでは、Jakarta-Taglibsライブラリの基本的なタグがどのように作成されたかの概要を説明します。タグライブラリを使用すると、カスタムアクションを作成し、機能をカプセル化できます。カスタムタグは、プレゼンテーション層をビジネスロジックから明確に分離できます。これらは、JSPページで使用可能なすべてのオブジェクトにアクセスできる、保守が容易な再利用可能なコンポーネントです。詳細については、JavaServer Pages Specification, version 1.2 を参照してください。
JSP v1.1以降を実装するサーバーはタグライブラリをサポートしています。さまざまなサーバーとその現在のサポート状況については、JavaServer Pages Industry Momentum ページで確認できます。また、SunのWebサイトには、Java Web Services Tutorial があり、その中にカスタムタグとJSP Standard Tag Library (JSTL)に関するセクションが含まれています。
タグハンドラーは、JSPページと追加のサーバーサイドオブジェクト間の相互作用を担当します。ハンドラーは、カスタムタグが検出されるとJSPページの実行中に呼び出されます。doStartTag()およびdoEndTag()メソッドは、それぞれ開始および終了カスタムタグが検出されたときに呼び出されます。release()メソッドは、タグハンドラーによって割り当てられたリソースを解放します。
タグハンドラーを記述する2つのインターフェースがあります。
Tag | 本体コンテンツの操作に関心のない単純なタグハンドラーに使用 |
BodyTag | Tagの拡張であり、ハンドラーにその本体へのアクセスを提供します |
タグハンドラーには、2つの主要なアクションメソッドがあります。
doStartTag() |
このアクションの開始タグを処理します。 |
doEndTag() | このアクションの終了タグを処理します。doStartTagから戻った後に呼び出されます。 |
release() | リソースを解放します |
doStartTag() は以下を返します。
- EVAL_BODY_INCLUDE
- アクションの本体を処理しますが、新しいBodyContentを作成しません。本体を操作せずに渡します。これは、インターフェースを実装していない場合にのみ有効です。BodyTaginterface.
- EVAL_BODY_TAG
- アクションの本体を処理し、新しいBodyContentを作成します。これは、インターフェースを実装している場合にのみ有効です。BodyTaginterface.
- SKIP_BODY
- タグの本体を評価しません
doEndTag() は以下を返します。
- EVAL_PAGE
- 残りのJSPページが評価されます
- SKIP_PAGE
- 残りのJSPページは評価されません
戻り値は、JSPコンテナに残りのJSPページを評価する方法を指示します。release()メソッドは、タグハンドラーによって割り当てられたリソースを解放します。
TagSupportおよびBodyTagSupportは次のサブクラスです。Tag新しいタグハンドラーを作成するときに、基本クラスとして使用できます。
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。TagSupportinterfaceTaggetterメソッド for
タグハンドラーがアクションの本体を操作する場合は、次のものを実装する必要があります。BodyTaginterface.doStartTag() は以下を返す必要があります。EVAL_BODY_TAGタグの本体を評価するために。が返されると、本体は無視されます。本体コンテンツを操作するメソッドには、次のものがあります。SKIP_BODYis returned, the body will be ignored. Methods that interact with the body content include
doInitBody() | タグの本体が評価される前、ただし本体コンテンツが設定された後に呼び出されます |
doAfterBody() | 本体コンテンツが評価された後に呼び出されます |
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。BodyTagSupportclass は、インターフェースを実装し、便利な追加メソッドを追加します。これらのメソッドの一部には、次のものがあります。BodyTaginterface and adds additional convenience methods. Some of these methods include
Webアプリケーションでは、ハンドラーはJavaクラスの次の標準の場所のいずれかに存在する必要があります。
タグハンドラーは、セッターメソッドを使用してJSPコンテナによって設定されるいくつかのプロパティにアクセスできます。これには、次のものが含まれます。pageContextおよびparentオブジェクト。タグハンドラーは、サーバーサイドオブジェクトと囲みアクションにもアクセスできます。タグがネストされている場合、囲みタグの親ハンドラーには、次のいずれかを使用してアクセスできます。
親オブジェクトを取得すると、親ハンドラーの静的および動的に作成されたオブジェクトを取得できます。
タグライブラリ記述子(TLD)は、JSPコンテナが、そのタグライブラリを参照するtaglibディレクティブを含むページを解釈するために使用されます。これは、アクションタグをタグハンドラークラスにマッピングするXMLドキュメントです。TLDは2つの方法で検索できます。
web.xmlの詳細については、Servlet 2.2およびJSP 1.1仕様を参照してください。taglibelement in the Servlet 2.2 and JSP 1.1 specifications.
検証パーサーを呼び出す最近の変更により、外部DOCTYPEを明示的に参照する必要があります
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
TLDtaglib要素はドキュメントルートです。次のサブ要素があります
tlibversion | タグライブラリの実装バージョン |
jspversion | タグライブラリに必要なJSP仕様のバージョン |
shortname | JSPページからタグライブラリを参照するために使用できる名前 |
uri | タグライブラリを一意に識別するURI - タグライブラリの「使用法」を記述する情報文字列 |
info | タグライブラリの「使用法」を記述する文字列 |
tag要素は、タグライブラリ内のアクションを定義します。アクションを定義するいくつかのサブ要素を持つ場合があります
name | 一意のアクション名 |
tagclass | 次のものを実装するタグハンドラークラスjavax.servlet.jsp.tagext.Tag |
teiclass | 次のオプションのサブクラスjavax.servlet.jsp.tagext.TagExtraInfo |
bodycontent |
3つの本体コンテンツタイプのいずれか |
info |
オプションのタグ固有の情報 |
attribute |
アクションのすべての属性 |
bodycontentタグに本体がある場合に含められます。これは、ページ構成ツールによって使用されるため、本体の構成には影響しません。次の3つのタイプのいずれかになります
- JSP(デフォルト)
- JSPコンテナはタグの本体を評価する必要がありますが、空にすることもできます
- tagdependent
- タグの本体はタグ自体によって処理されますが、空にすることもできます
- empty
- 本体は空である必要があります
は、スクリプト変数とその情報を含むものを定義しますteiclassdefines the scripting variable and includes the following information
- name
- type
- 変数を生成する必要があるかどうか
- scope
属性には、次のフィールドを含めることができます
- name(必須)
- 属性名
- required
- 属性が必須かオプションか
- rtexprvalue
- 属性値がスクリプトレットによって実行時に動的に計算される可能性がある場合。注:デフォルト値は「false」です。つまり、属性には静的な値があります。属性値が要求時に決定される場合は、必ず「true」に設定してください。
すべての属性について、タグハンドラーにJavaBeansスタイルのgetおよびsetメソッドが必要です。属性の名前がidの場合、クラスは次のものを定義しますTagSupportclass defines thesetId() とgetId() メソッド。
JavaServer Pagesは、タグライブラリアクションにカプセル化されたXMLコンテンツを処理できます。
<%@ taglib uri="identifier" prefix="prefix" %>
タグライブラリを使用するには、ディレクティブを使用してJSPコンテナに場所を通知する必要があります。ディレクティブは、アクションの前に記述する必要があります。taglibdirective. The directive must come before any actions.
タグライブラリをインストールするには、次の手順を実行する必要があります。
<taglib> <taglib-uri>http://jakarta.apache.org/taglibs/{library}</taglib-uri> <taglib-location>/WEB-INF/{library}.tld</taglib-location> </taglib>
<%@ taglib uri="http://jakarta.apache.org/taglibs/{library}" prefix="x" %>
Jakarta-Taglibsにタグライブラリサブプロジェクトを追加するには、次のことを行う必要があります。
プロジェクトのビルドスクリプトを使用しますjakarta-taglibswarファイルを作成するプロジェクト。warファイルを作成したら、そのファイルを$TOMCAT_HOME/webappsディレクトリ。Tomcatはクラスをロードし、新しいコンテキストを作成します。
warファイルには、次の構造が必要です。
META-INF/ META-INF/MANIFEST.MF WEB-INF/ WEB-INF/classes/ WEB-INF/lib/ WEB-INF/lib/{tagLibrary}.jar WEB-INF/web.xml WEB-INF/{tagLibrary}.tld
jarファイルを使用しない場合は、すべてのクラスファイルを/WEB-INF/classesディレクトリに配置できます。
warファイルの詳細については、Java Servlet Specification, v2.2を参照してください。
この基本的なタグは「Hello World」の例です。タグが検出されるたびに、テキスト「Hello World」が出力されます。
Hello Worldタグのタグハンドラーは、次の場所にあります。/WEB-INF/classes/basic基本パッケージの一部であるため、ディレクトリにあります。
package basic;
JSP およびタグクラスをインポートします。
import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*;
Hello World タグハンドラーは、以下を実装します。doStartTag開始タグが現れたときに呼び出される()メソッド。
public int doStartTag() throws JspException { try { pageContext.getOut().print("Hello World"); } catch (Exception ex) { throw new JspException("IO problems"); } return SKIP_BODY; }
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。pageContextは JSP コンテナによって設定され、タグハンドラーで使用できます。SKIP_BODYの値は、タグボディの評価が行われないようにします。
<?xml version="1.0" encoding="ISO-8859-1" ?>
デプロイメント記述子DOCTYPEを記述するXMLヘッダー。デプロイメント記述子には、Webアプリケーションの要素と構成情報が含まれています。
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">
最初のタグライブラリの説明
<taglib> <!-- The version number of this tag library --> <tlibversion>1.0</tlibversion> <!-- The JSP specification version required to function --> <jspversion>1.1</jspversion> <!-- The short name of this tag library --> <shortname>utility</shortname> <!-- Public URI that uniquely identifies this version of the tag library --> <uri>http://jakarta.apache.org/taglibs/utilitytags</uri> <!-- General information about this tag library --> <info> A simple tag library for the examples </info>
Hello World タグの説明。
<!-- Hello tag --> <tag> <name>Hello</name> <tagclass>basic.Hello</tagclass> <bodycontent>empty</bodycontent> <info> Print Hello World </info> </tag>
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。web.xmlファイルは、taglib 間のマッピングを記述しますuriおよびタグライブラリ記述子の場所。
ここで、ユニークなtaglib-uri "http://jakarta.apache.org/taglibs/utilitytags" は、以下のタグライブラリ記述子に関連付けられています/WEB-INF/tld/utilitytags.tld.
<web-app> <taglib> <taglib-uri> http://jakarta.apache.org/taglibs/utilitytags </taglib-uri> <taglib-location> /WEB-INF/tld/utilitytags.tld </taglib-location> </taglib> </web-app>
次のディレクティブは、JSP コンテナに "を使用するように指示します。http://jakarta.apache.org/taglibs/utilitytags" uriで定義されたweb.xml. "jLib" は、タグのプレフィックス値として定義されています。
<%@ taglib uri="http://jakarta.apache.org/taglibs/utilitytags" prefix="jLib" %>
Hello World タグが呼び出されます。タグ名 "Hello" は、タグライブラリ記述子で定義されています。
<jLib:Hello/>
この入れ子になったタグは、「If」条件付きタグの例です。属性の値に基づいて、含まれるスクリプトレットが評価されるかスキップされます。
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。BodyTagSupportclass は、インターフェースを実装し、便利な追加メソッドを追加します。これらのメソッドの一部には、次のものがあります。BodyTagインターフェースであり、以下のゲッターメソッドを持っていますbodyContentプロパティ。
public class IfTag extends BodyTagSupport {
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。doStartTag()開始タグが現れたときに呼び出されるメソッドで、ローカルgetPredicate()メソッドを呼び出します。戻り値が true の場合、タグボディの残りの部分が評価され、それ以外の場合はスキップされます。
public int doStartTag() { if (getPredicate()) return EVAL_BODY_TAG; else return SKIP_BODY; }
doAfterBody()は、一部のボディが評価された後に呼び出されます。空のタグや
を返すタグでは呼び出されません。SKIP_BODYindoStartTag().public int doAfterBody() throws JspException { try { bodyContent.writeOut(bodyContent.getEnclosingWriter()); return SKIP_BODY; } catch (IOException ex) { throw new JspTagException(ex.toString()); } }
<!-- IF tag --> <tag> <name>If</name> <tagclass>lang.IfTag</tagclass>
If タグには必須の属性が 1 つあります。以下のためrtexprvalueが true に設定されているため、属性の値としてスクリプトレット式を使用できます。値は、リクエスト時に動的に計算できます。
<attribute> <name>predicate</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <info> Conditional Tag. </info> </tag>
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。web.xmlファイルは、taglib 間のマッピングを記述しますuriおよびタグライブラリ記述子の場所。
ここで、ユニークなtaglib-uri "http://jakarta.apache.org/taglibs/utilitytags" は、以下のタグライブラリ記述子に関連付けられています/WEB-INF/tld/utilitytags.tld.
If タグには 1 つの属性が必要です。predicate 属性には、実行時に評価されるスクリプトレットが含まれています。predicate 属性の値に基づいて、jLib:Helloタグが評価されるかスキップされます。
<jlib:if predicate="<%= x==5 %>"> <jLib:Hello/> </jlib:if>
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。utilitytagsカスタムタグライブラリには、いくつかの基本的なタグの例が含まれています。これは、いくつかの簡単なカスタムタグライブラリのコーディングテクニックを示しています。
このカスタムタグライブラリは、JavaServer Pages 仕様、バージョン 1.1をサポートするサーブレットコンテナ以外のソフトウェアは必要ありません。
このタグライブラリを使用して Web アプリケーションを構成するには、次の手順に従います
<taglib> <taglib-uri>http://jakarta.apache.org/taglibs/utilitytags</taglib-uri> <taglib-location>/WEB-INF/utilitytags.tld</taglib-location> </taglib>
このライブラリのタグを JSP ページで使用するには、各ページの先頭に次のディレクティブを追加します
<%@ taglib uri="http://jakarta.apache.org/taglibs/utilitytags" prefix="x" %>
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。utilitytagsタグライブラリには、次のタグが含まれています
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Helloタグは、「Hello World」というテキストを出力します。属性はありません。
属性
|
説明
|
必須
|
---|---|---|
-
|
-
|
-
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。MacroCopyタグは、属性テキストをライターにコピーします。
属性
|
説明
|
必須
|
---|---|---|
name
|
コピーするテキストに関連付けられた名前。任意の文字列値。
|
はい
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。MacroPasteタグは、ライターで指定されたテキストを貼り付けます。
属性
|
説明
|
必須
|
---|---|---|
name
|
貼り付けるテキストに関連付けられた名前。任意の文字列値。
|
はい
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。ShowSourceタグは jspFile を受け取り、その内容をライターにコピーします。
属性
|
説明
|
必須
|
---|---|---|
jspFile
|
jsp ファイルのファイル名と相対パス。任意の文字列値。
|
はい
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Includeタグは、指定された URL の出力をインラインで含めます。
属性
|
説明
|
必須
|
---|---|---|
url
|
有効な URL。
|
はい
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Ifタグは基本的な条件付きタグです。
属性
|
説明
|
必須
|
---|---|---|
predicate
|
任意の文字列値。
|
はい
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Forタグは基本的なループタグです。
属性
|
説明
|
必須
|
---|---|---|
iterations
|
完了するループの反復回数。任意の文字列の整数値。
|
はい
|
varName
|
For ループに関連付けられた変数名。任意の文字列値。
|
いいえ
|
begin
|
ループの開始値。任意の文字列の整数値。
|
いいえ
|
class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。useBeanタグは、Java オブジェクトのインスタンスを特定の ID に関連付けます。
属性
|
説明
|
必須
|
---|---|---|
id
|
JSP コンテナおよびページに対して Bean を一意に識別します。任意の文字列値。
|
はい
|
scope
|
page|request|session|application
|
いいえ
|
classname
|
オブジェクトの実装を定義するクラスの名前。
|
いいえ
|
type
|
定義されたスクリプト変数のタイプ
|
いいえ
|
beanName
|
java.beans.Beans クラスの instantiate() メソッドで予期される Bean の名前
|
はい
|
processRequest
|
true|false。JSP 0.92 互換性。
|
いいえ
|