JSPカスタムタグ
カスタム タグは、ユーザー定義の JSP 言語要素です。 JSP ページにカスタム タグが含まれている場合、そのタグはサーブレットに変換され、タグは タグ ハンドラーと呼ばれるオブジェクトに対する操作は、サーブレットの実行時に Web コンテナが呼び出す操作です。
JSP タグ拡張機能を使用すると、新しいタグを作成し、JSP ページに直接挿入できます。これらのカスタム タグを記述するために、シンプル タグ ハンドラーが JSP 2.0 仕様で導入されました。
SimpleTagSupport クラスを継承し、doTag() メソッドをオーバーライドして、最も単純なカスタム タグを開発できます。
「Hello」タグを作成します
次に、タグ形式で <ex:Hello> という名前のカスタム タグを作成します:
<ex:Hello />
カスタム JSP タグを作成するには、最初に処理タグを作成する必要がありますJava クラス。したがって、次のように HelloTag クラスを作成しましょう:
package com.php; 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!"); } }
次のコードは、getJspContext() メソッドを使用して現在の JspContext オブジェクトを取得し、「Hello Custom Tag!」を渡します doTag() メソッドをオーバーライドします。
上記のクラスをコンパイルし、環境変数 CLASSPATH ディレクトリにコピーします。最後に、タグ ライブラリ
<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.php.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.php; 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.php.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.php; 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.php.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
次の属性を含めることもできます:
property | description |
---|---|
name | は、プロパティの名前を定義します。属性名はタグごとに一意である必要があります。 |
required | false に設定されている場合、属性が必須であるかオプションであるかを指定します。 |
rtexprvalue | 式の実行時に label 属性が有効かどうかを宣言します。 |
type | このプロパティを定義する Java クラスのタイプ。デフォルトではString |
description | Description information |
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> .....