Jsp-custom-tags

提供:Dev Guides
移動先:案内検索

JSP-カスタムタグ

この章では、JSPのカスタムタグについて説明します。 カスタムタグは、ユーザー定義のJSP言語要素です。 カスタムタグを含むJSPページがサーブレットに変換されると、タグはタグハンドラーと呼ばれるオブジェクトの操作に変換されます。 JSPページのサーブレットが実行されると、Webコンテナはこれらの操作を呼び出します。

JSPタグ拡張機能を使用すると、JavaServer Pageに直接挿入できる新しいタグを作成できます。 JSP 2.0仕様では、これらのカスタムタグを記述するためのシンプルタグハンドラが導入されました。

カスタムタグを作成するには、 SimpleTagSupport クラスを拡張し、* doTag()*メソッドをオーバーライドするだけで、タグのコンテンツを生成するコードを配置できます。

「Hello」タグを作成

<ex:Hello>という名前のカスタムタグを定義し、本文なしで次のように使用することを検討してください-

<ex:Hello/>

カスタムJSPタグを作成するには、最初にタグハンドラーとして機能するJavaクラスを作成する必要があります。 次のように HelloTag クラスを作成しましょう-

package com.finddevguides;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   public void doTag() throws JspException, IOException {
      JspWriter out = getJspContext().getOut();
      out.println("Hello Custom Tag!");
   }
}

上記のコードには、* doTag()メソッドが getJspContext()メソッドを使用して現在のJspContextオブジェクトを取得し、それを使用して *"Hello Custom Tag!" を現在の JspWriter オブジェクトに送信する単純なコーディングがあります。

上記のクラスをコンパイルし、環境変数CLASSPATHで利用可能なディレクトリにコピーしてみましょう。 最後に、次のタグライブラリファイルを作成します: <Tomcat-Installation-Directory> webapps \ ROOT \ WEB-INF \ custom.tld

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD</short-name>

   <tag>
      <name>Hello</name>
      <tag-class>com.finddevguides.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

次に、JSPプログラムで上記のカスタムタグ Hello を次のように使用します。

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>

   <body>
      <ex:Hello/>
   </body>
</html>

上記のJSPを呼び出すと、これは次の結果を生成するはずです-

Hello Custom Tag!

タグ本文へのアクセス

標準タグで見たように、タグの本文にメッセージを含めることができます。 あなたが <ex:Hello> という名前のカスタムタグを定義し、あなたがボディで次のようにそれを使用したいと考えていることを考慮してください-

<ex:Hello>
   This is message body
</ex:Hello>

上記のタグコードに次の変更を加えて、タグの本文を処理します-

package com.finddevguides;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   StringWriter sw = new StringWriter();
   public void doTag()

   throws JspException, IOException {
      getJspBody().invoke(sw);
      getJspContext().getOut().println(sw.toString());
   }
}

ここで、呼び出しの結果の出力は、タグに関連付けられたJspWriterに書き込まれる前に、最初に StringWriter にキャプチャされます。 次のようにTLDファイルを変更する必要があります-

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>

   <tag>
      <name>Hello</name>
      <tag-class>com.finddevguides.HelloTag</tag-class>
      <body-content>scriptless</body-content>
   </tag>
</taglib>

次のように適切なボディで上記のタグを呼び出しましょう-

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>

   <body>
      <ex:Hello>
         This is message body
      </ex:Hello>
   </body>
</html>

次の結果が表示されます-

This is message body

カスタムタグ属性

カスタムタグとともにさまざまな属性を使用できます。 属性値を受け入れるために、カスタムタグクラスは、以下に示すように、JavaBeanのセッターメソッドと同じ*セッター*メソッドを実装する必要があります-

package com.finddevguides;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
import java.io.*;

public class HelloTag extends SimpleTagSupport {
   private String message;

   public void setMessage(String msg) {
      this.message = msg;
   }
   StringWriter sw = new StringWriter();
   public void doTag()

   throws JspException, IOException {
      if (message != null) {
        /*Use message from attribute*/
         JspWriter out = getJspContext().getOut();
         out.println( message );
      } else {
        /*use message from the body*/
         getJspBody().invoke(sw);
         getJspContext().getOut().println(sw.toString());
      }
   }
}

属性の名前は "message" であるため、setterメソッドは* setMessage()です。 次のように *<attribute> 要素を使用してTLDファイルにこの属性を追加しましょう-

<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>2.0</jsp-version>
   <short-name>Example TLD with Body</short-name>

   <tag>
      <name>Hello</name>
      <tag-class>com.finddevguides.HelloTag</tag-class>
      <body-content>scriptless</body-content>

      <attribute>
         <name>message</name>
      </attribute>

   </tag>
</taglib>

次のようにメッセージ属性を使用してJSPをフォローしましょう-

<%@ taglib prefix = "ex" uri = "WEB-INF/custom.tld"%>

<html>
   <head>
      <title>A sample custom tag</title>
   </head>

   <body>
      <ex:Hello message = "This is custom tag"/>
   </body>
</html>

これにより、次の結果が生成されます–

This is custom tag

属性の次のプロパティを含めることを検討してください-

S.No. Property & Purpose
1

name

name要素は、属性の名前を定義します。 各属性名は、特定のタグに対して一意である必要があります。

2

required

これは、この属性が必須かオプションかを指定します。 オプションの場合はfalseになります。

3

rtexprvalue

タグ属性のランタイム式の値が有効かどうかを宣言します

4

type

この属性のJavaクラスタイプを定義します。 デフォルトでは、 String と見なされます

5

description

情報の説明を提供できます。

6

fragment

この属性値を JspFragment として扱うかどうかを宣言します。

以下は、属性に関連するプロパティを指定する例です-

.....
   <attribute>
      <name>attribute_name</name>
      <required>false</required>
      <type>java.util.Date</type>
      <fragment>false</fragment>
   </attribute>
.....

あなたが2つの属性を使用している場合、次のようにTLDを変更することができます-

.....
   <attribute>
      <name>attribute_name1</name>
      <required>false</required>
      <type>java.util.Boolean</type>
      <fragment>false</fragment>
   </attribute>

   <attribute>
      <name>attribute_name2</name>
      <required>true</required>
      <type>java.util.Date</type>
   </attribute>
.....