概要

このチュートリアルでは、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ページの実行中にアクションを評価するのに役立つサーバーサイドオブジェクト

    タグライブラリ記述子

    タグ名とタグ属性を定義するXMLファイル

    JSP

    タグライブラリは、JSPページで次のものを使用して利用可能になります。taglibディレクティブ

    インストールとデプロイ

    既存のタグライブラリをインストールする方法

    コードの例

タグハンドラー

タグハンドラーは、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

JavaServer Pagesは、タグライブラリアクションにカプセル化されたXMLコンテンツを処理できます。

  <%@ taglib uri="identifier" prefix="prefix" %>

タグライブラリを使用するには、ディレクティブを使用してJSPコンテナに場所を通知する必要があります。ディレクティブは、アクションの前に記述する必要があります。taglibdirective. The directive must come before any actions.

インストールとデプロイ

a) 一般的なタグライブラリの作成

タグライブラリをインストールするには、次の手順を実行する必要があります。

  1. タグクラスをjarファイルにバンドルします。taglib{library}.tldファイルが/WEB-INFディレクトリ
  2. にあることを確認してください。{library}.jarファイルをCLASSPATH
  3. にコピーし、次のものをコピーします{library}.jarファイルを/WEB-INF/libディレクトリ
  4. タグライブラリ要素を次のファイルで定義します/WEB-INF/web.xmlfile. 例えば
      <taglib>
        <taglib-uri>http://jakarta.apache.org/taglibs/{library}</taglib-uri>
        <taglib-location>/WEB-INF/{library}.tld</taglib-location>
      </taglib>
        
  5. JSPページでタグ拡張を定義します。ディレクティブ<taglib-uri>uriディレクティブは一致する必要があります。プレフィックスは、JSPページ内のタグライブラリ内のタグを識別します。例えば
  6.   <%@ taglib uri="http://jakarta.apache.org/taglibs/{library}" prefix="x" %>
        

b) Jakarta-Taglibsライブラリの追加

Jakarta-Taglibsにタグライブラリサブプロジェクトを追加するには、次のことを行う必要があります。

  1. プロジェクトの最上位ディレクトリを作成します。
  2. 既存のサブプロジェクトの1つから次の最上位ファイルをコピーします
    • build.sh
    • build.bat
    • build.xml
  3. taglib.nameプロパティを新しいカスタムタグライブラリサブプロジェクト名に変更しますプロパティを新しいカスタムタグライブラリサブプロジェクト名に変更します
  4. 既存のサブプロジェクトの1つからディレクトリ構造を複製します
  5. 新しいライブラリを含めるように最上位のJakarta-Taglibsbuild.xmlファイルを変更します

c) タグライブラリのデプロイ

プロジェクトのビルドスクリプトを使用します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タグハンドラー

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の値は、タグボディの評価が行われないようにします。

Hello World タグライブラリ記述子

  <?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 タグの説明。

  • tagclass 要素は、Hello World タグハンドラーを Hello World タグに関連付けます
  • bodycontenttag は、タグがボディを含まないことを示します
  <!-- Hello tag -->
    <tag>
      <name>Hello</name>
      <tagclass>basic.Hello</tagclass>
      <bodycontent>empty</bodycontent>
      <info>
        Print Hello World
      </info>
    </tag>

web.xml ファイル

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>

Hello World jsp

次のディレクティブは、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」条件付きタグの例です。属性の値に基づいて、含まれるスクリプトレットが評価されるかスキップされます。

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 タグライブラリ記述子

  <!-- 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>  

web.xml ファイル

class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。web.xmlファイルは、taglib 間のマッピングを記述しますuriおよびタグライブラリ記述子の場所。

ここで、ユニークなtaglib-uri "http://jakarta.apache.org/taglibs/utilitytags" は、以下のタグライブラリ記述子に関連付けられています/WEB-INF/tld/utilitytags.tld.

If JSP

If タグには 1 つの属性が必要です。predicate 属性には、実行時に評価されるスクリプトレットが含まれています。predicate 属性の値に基づいて、jLib:Helloタグが評価されるかスキップされます。

  <jlib:if predicate="<%= x==5 %>">
    <jLib:Hello/>   
  </jlib:if>

UtilityTags タグライブラリのドキュメント

1. はじめに

class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。utilitytagsカスタムタグライブラリには、いくつかの基本的なタグの例が含まれています。これは、いくつかの簡単なカスタムタグライブラリのコーディングテクニックを示しています。

2. 前提ソフトウェア

このカスタムタグライブラリは、JavaServer Pages 仕様、バージョン 1.1をサポートするサーブレットコンテナ以外のソフトウェアは必要ありません。

3. 構成情報

このタグライブラリを使用して Web アプリケーションを構成するには、次の手順に従います

  • タグライブラリ記述子ファイル (utilitytags/utilitytags.tld) を/WEB-INFWeb アプリケーションのサブディレクトリにコピーします。
  • タグライブラリ JAR ファイルをコピーします (utilitytags/utilitytags.jar) を/WEB-INF/libWeb アプリケーションのサブディレクトリにコピーします。
  • を追加します<taglib>要素を、以下のような Web アプリケーションのデプロイメント記述子に追加します/WEB-INF/web.xml次のようになります。
        <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" %>
ここで、「x」は、このライブラリのタグに使用するタグ名のプレフィックスです。この値は、任意のプレフィックスに変更できます。

4. タグのドキュメント

class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。utilitytagsタグライブラリには、次のタグが含まれています

Hello タグ

class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Helloタグは、「Hello World」というテキストを出力します。属性はありません。

属性
説明
必須
-
-
-
  • Copy タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。MacroCopyタグは、属性テキストをライターにコピーします。

    属性
    説明
    必須
    name
    コピーするテキストに関連付けられた名前。任意の文字列値。
    はい
  • Paste タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。MacroPasteタグは、ライターで指定されたテキストを貼り付けます。

    属性
    説明
    必須
    name
    貼り付けるテキストに関連付けられた名前。任意の文字列値。
    はい
  • ShowSource タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。ShowSourceタグは jspFile を受け取り、その内容をライターにコピーします。

    属性
    説明
    必須
    jspFile
    jsp ファイルのファイル名と相対パス。任意の文字列値。
    はい
  • Include タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Includeタグは、指定された URL の出力をインラインで含めます。

    属性
    説明
    必須
    url
    有効な URL。
    はい
  • If タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Ifタグは基本的な条件付きタグです。

    属性
    説明
    必須
    predicate
    任意の文字列値。
    はい
  • For タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Forタグは基本的なループタグです。

    属性
    説明
    必須
    iterations
    完了するループの反復回数。任意の文字列の整数値。
    はい
    varName
    For ループに関連付けられた変数名。任意の文字列値。
    いいえ
    begin
    ループの開始値。任意の文字列の整数値。
    いいえ
  • useBean タグ

    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 互換性。
    いいえ
  • Validate タグ

    class は、インターフェースを実装し、次のものを含む便利な追加メソッドを追加するユーティリティクラスです。Validateタグは、HTML フォームを検証するための Javascript を生成します。

    属性
    説明
    必須
    name
    フォームの名前。任意の文字列値。
    はい
    method
    生成される Javascript 関数の名前。任意の文字列値。
    はい
    reqdFields
    コンマ区切りの必須フィールドリスト。任意の文字列値。
    はい