English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
カスタムタグはユーザーが定義するJSP言語の要素です。JSPページにカスタムタグが含まれている場合、タグはservletに変換され、タグはその変換されたservletに対する操作に変換されます。 tag handlerオブジェクトの操作と呼ばれるもの、つまりservletの実行中にWeb containerがその操作を呼び出すもの
JSPタグ拡張により、新しいタグを作成し、JSPページに直接挿入することができます。JSP 2JSP 2.0規格では、これらのカスタムマークアップを書き込むためにSimple Tag Handlersを導入しました。
SimpleTagSupportクラスを継承し、doTag()メソッドをオーバーライドすることで、最もシンプルなカスタムタグを開発できます。
次に、<ex:Hello>という名前のカスタムタグを作成したいと考えています。タグの形式は以下のようになります:
<ex:Hello />
カスタムのJSPタグを作成するには、まずタグを処理するJavaクラスを作成する必要があります。したがって、以下のようにHelloTagクラスを作成しましょう:
package com.w3codebox; 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インストールディレクトリ>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.w3codebox.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>
上記のプログラムの出力結果は以下のようになります:
Hello Custom Tag!
標準のタグライブラリのように、タグにメッセージ内容を含めることができます。例えば、カスタムのHelloに内容を含めたい場合は、以下の形式で構成します:
<ex:Hello> This is message body </ex:Hello>
タグ処理クラスファイルを以下のように修正できます:
package com.w3codebox; 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()); } }
次に、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.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
今や、修正したタグを使用してJSPで以下のようにすることができます:
<%@ 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のsetterメソッドは以下のようになります:
package com.w3codebox; 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) { /* 属性からメッセージを使用します */ JspWriter out = getJspContext().getOut(); out.println( message ); } else { /* コンテンツボディからメッセージを使用します */ getJspBody().invoke(sw); getJspContext().getOut().println(sw.toString()); } } }
属性の名前は"message"で、そのためsetterメソッドは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.w3codebox.HelloTag</tag-class> <body-content>scriptless</body-content> <attribute> <name>message</name> </attribute> </tag> </taglib>
現在ではJSPファイルでmessage属性を使用することができます。以下のようになります:
<%@ 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
以下の属性も含めることができます:
属性 | 説明 |
---|---|
name | 属性の名前を定義します。各タグの属性名はユニークでなければなりません。 |
required | 属性が必須であるか、またはオプションであるかを指定します。falseに設定された場合、オプションです。 |
rtexprvalue | タグ属性が実行時の表現で有効であるかどうかを宣言します。 |
type | この属性のJavaクラスのタイプを定義します。デフォルトでは指定されます: String |
description | 情報 |
fragment | この属性が宣言されている場合、属性値は JspFragment。 |
以下は指定された属性の例です:
..... <attribute> <name>attribute_name</name> <required>false</required> <type>java.util.Date</type> <fragment>false</fragment> </attribute> .....
もし二つの属性を使用している場合、以下のように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> .....