PGBox
P
G
Box

カスタムタグの作成【動的な属性】

JSPのメニューへ戻る



使用した環境
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"?>
<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>
tldファイルの詳細な情報についてはtldファイルを参照してください。


対象のタグクラスでは、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。デフォルトの名前空間の場合はnull。
name属性の名前。
value属性の値。


引数uriは、属性に名前空間を使用した場合に、そのタグ名前空間に該当するURIが取得できます。
例えば、JSPで以下のようにタグの属性値を指定した場合
<%@ taglib uri="/sample" prefix="s" %>
<s:sample attrA="xxx" s:attrB="xxx" />
attrAに関しては名前空間を指定していないので引数uriはnullです。
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






JSPのメニューへ戻る