リファレンストップへ Java | カスタムタグの作成【動的な属性】使用した環境 JDK 6 Update 11 Tomcat 6.0.18 DynamicAttributesを実装する事で、tldに記述されていない属性も受け取る事が可能になります。まずtldファイルでDynamicAttributesの設定を有効にします。 <dynamic-attributes>true</dynamic-attributes>とする事でDynamicAttributesを有効にします。 <?xml version="1.0" encoding="UTF-8"?> tldファイルの詳細な情報についてはtldファイルを参照してください。<taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xml="http://www.w3.org/XML/1998/namespace" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd" version="2.1"> <tlib-version>1.0</tlib-version> <uri>/sample</uri> <tag> <name>sample</name> <tag-class>sample.SampleTag</tag-class> <body-content>empty</body-content> <dynamic-attributes>true</dynamic-attributes> </tag> </taglib> 対象のタグクラスでは、DynamicAttributesインターフェイスをimplementsし setDynamicAttributeメソッドを実装します。 サンプルとして、受け取った属性値を全て出力するタグを作成してみます。 package sample; import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.DynamicAttributes; import javax.servlet.jsp.tagext.TagSupport; /** * 動的に属性値を受け取るタグクラス */ public class SampleTag extends TagSupport implements DynamicAttributes { /** 属性値を保持するマップ */ private Map<String, Object> attributes = new HashMap<String, Object>(); @Override public int doStartTag() throws JspException { // 属性値を全て出力 for (String name : attributes.keySet()) { try { pageContext.getOut().println(name + "=" + attributes.get(name) + "<br />"); } catch (IOException e) { throw new JspException(e); } } return SKIP_BODY; } @Override public void setDynamicAttribute(String uri, String name, Object value) throws JspException { attributes.put(name, value); } } setDynamicAttributeメソッドの引数は以下のようになっています。
引数uriは、属性に名前空間を使用した場合に、そのタグ名前空間に該当するURIが取得できます。 例えば、JSPで以下のようにタグの属性値を指定した場合 <%@ taglib uri="/sample" prefix="s" %> attrAに関しては名前空間を指定していないので引数uriはnullです。<s:sample attrA="xxx" s:attrB="xxx" /> attrBに関しては名前空間「s:」を指定しているので引数uriには"/sample"がセットされています。 上記のサンプルソースにおいては、タグのURIを得る事によって何らかの処理を行うタグでは無いので setDynamicAttributeの処理において第一引数uriは無視しています。 上記のサンプルタグを実行するために以下のようなJSPを作成します。 tldに定義されていない属性「aaa」と「bbb」を使用していますが、JSPエラーとはなりません。 <%@ page contentType="text/html; charset=Windows-31J" pageEncoding="Windows-31J" %> <%@ taglib uri="/sample" prefix="s" %> <s:sample aaa="AAA" bbb="${1 + 1}" /> 実行結果は以下のようになります。 aaa=AAA bbb=2 |
|