JSP-カスタムタグ

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

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

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

「こんにちは」タグを作成する

<ex:Hello>という名前のカスタムタグを定義し、本文なしで次のように使用するとします。

<ex:Hello />

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

package com.tutorialspoint;

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() メソッドは、を使用して現在のJspContextオブジェクトを取得します getJspContext() メソッドとそれを使用して送信 "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.tutorialspoint.HelloTag</tag-class>
      <body-content>empty</body-content>
   </tag>
</taglib>

上記で定義したカスタムタグを使用してみましょう Hello 次のようにJSPプログラムで-

<%@ 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.tutorialspoint;

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());
   }
}

ここでは、呼び出しの結果の出力が最初にキャプチャされます。 StringWriterタグに関連付けられたJspWriterに書き込まれる前。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.tutorialspoint.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

カスタムタグ属性

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

package com.tutorialspoint;

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"、したがって、セッターメソッドは setMessage()。ここで、を使用してこの属性をTLDファイルに追加しましょう。<attribute> 次のような要素-

<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.tutorialspoint.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. プロパティと目的
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>
.....