如果在自订标签时,事先并无法得知标签的属性个数与名称,则您可以实现DynamicAttributes接口,这是JSP2.0之后加入的新接口,该接 口只有一个方法必须实现setDynamicAttribute(),在处理标签如果遇到一个属性时,就会调用该方法一次,并传入标签名称与标签值,您可
以将这些名称与值储存下来,以在标签处理类中作进一步处理,例如:
package onlyfun.caterpillar; import java.util.*; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class DyAttrDemo extends TagSupport implements DynamicAttributes { private ArrayList attrUris = new ArrayList(); private ArrayList attrNames = new ArrayList(); private ArrayList attrValues = new ArrayList(); public int doStartTag() { try { JspWriter out = pageContext.getOut(); for(int i = 0; i < _attrUris.size(); i++) { out.println("URI: " + attrUris.get(i) + "<br>"); out.println("Name: " + attrNames.get(i) + "<br>"); out.println("Value: " + attrValues.get(i) + "<br>"); } } catch(Exception e) {} return SKIP_BODY; } public void setDynamicAttribute(String uri, String name, Object value) throws JspException { attrUris.add(uri); attrNames.add(name); attrValues.add(value); } }
这个标签处理类会将标签属性名与标签值储存至ArrayList中,然后只是单纯的将之显示出来,为了要能使用动态属性,您必须在tld文件中指定 <dynamic-attributes>为true,例如:
... <tag> <description>Dynamic Attribute</description> <name>dyattr</name> <tag-class>onlyfun.caterpillar.DyAttrTag</tag-class> <body-content>empty</body-content> <dynamic-attributes>true</dynamic-attributes> </tag> ...
web.xml中的设定不再重复说明了,接下来使用下面这个JSP网页来进行测试:
<%@taglib prefix="caterpillar" uri="http://caterpillar.onlyfun.net/"%> <html> <body> <caterpillar:dyattr att1="value1" att2="value2" att3="value3"/> </body> </html>
这个标签只传入了三个属性,您可以传入任意个属性,结果将会像是以下:
<html>
<body>
URI: null<br>
Name: att1<br>
Value: value1<br>
URI: null<br>
Name: att2<br>
Value: value2<br>
URI: null<br>
Name: att3<br>
Value: value3<br>
</body>
</html>
|