カスタム タグは、ユーザー定義の JSP 言語要素です。 JSP ページにサーブレットに変換されるカスタム タグが含まれている場合、そのタグはタグ ハンドラと呼ばれるオブジェクトに対する操作に変換されます。タグ ハンドラは、サーブレットの実行時に Web コンテナが呼び出すものです。
JSP タグ拡張機能を使用すると、新しいタグを作成し、JSP ページに直接挿入できます。これらのカスタム タグを記述するために、シンプル タグ ハンドラーが JSP 2.0 仕様で導入されました。
SimpleTagSupport クラスを継承し、doTag() メソッドをオーバーライドして、最も単純なカスタム タグを開発できます。
次に、次の形式で <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("こんにちは、カスタムタグ!");
次のコードは doTag() メソッドを書き換えます。このメソッドは getJspContext() メソッドを使用して現在の JspContext オブジェクトを取得し、「Hello Custom Tag!」を JspWriter オブジェクトに渡します。
上記のクラスをコンパイルし、環境変数 CLASSPATH ディレクトリにコピーします。最後に、タグ ライブラリを作成します: <Tomcat インストール ディレクトリ> webappsROOTWEB-INFcustom.tld。
<taglib> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>TLD の例</short-name> <tag> <name>Hello</name > <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>空</body-content> </tag></taglib>
次に、JSP ファイルで Hello タグを使用できます。
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>カスタム タグのサンプル</title> </head> <body> <ex:Hello /> </body></html>
上記のプログラムの出力は次のとおりです。
こんにちはカスタムタグです!
標準のタグ ライブラリと同様に、メッセージ コンテンツをタグに含めることができます。カスタマイズされた Hello にコンテンツを含める場合、形式は次のとおりです。
<ex:Hello> これはメッセージ本文です</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(); ) 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>本文を含む TLD の例</short-name> <tag> <name>Hello< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>スクリプトレス</body-content> </tag></taglib>
これで、以下に示すように、変更したタグを JSP で使用できるようになります。
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>カスタム タグのサンプル</title> </head> <body> <ex:Hello > これはメッセージ本文です </ex:Hello> </body></html>
上記のプログラムの出力は次のとおりです。
これはメッセージ本文です
カスタム標準ではさまざまな属性を設定できます。属性を受け取るには、JavaBean の setter メソッドを実装する必要があります。
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() がスローされます。 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>本文を含む TLD の例</short-name> <tag> <name>Hello< /name> <tag-class>com.tutorialspoint.HelloTag</tag-class> <body-content>スクリプトレス</body-content> <attribute> <name>メッセージ</name> </attribute> </tag></taglib>
これで、次のように JSP ファイルで message 属性を使用できるようになります。
<%@ taglib prefix="ex" uri="WEB-INF/custom.tld"%><html> <head> <title>カスタム タグのサンプル</title> </head> <body> <ex:Hello message="これはカスタムタグです" /> </body></html>
上記のデータ例の出力結果は次のとおりです。
これはカスタムタグです
次の属性を含めることもできます。
財産 | 説明する |
---|---|
名前 | 属性の名前を定義します。属性名はタグごとに一意である必要があります。 |
必須 | 属性が必須かオプションかを指定します。 false に設定すると、オプションになります。 |
rexprvalue | 式の実行時にラベル属性が有効かどうかを宣言します。 |
タイプ | このプロパティを定義する Java クラス タイプ。デフォルトは文字列として指定されます |
説明 | 説明情報 |
断片 | この属性が宣言されている場合、属性値は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>....