如果在自订标签时,事先并无法得知卷标的属性个数与名称,则您可以实作DynamicAttributes接口,这是JSP2.0之后加入的新接口,该介 面只有一个方法必须实作setDynamicAttribute(),在处理标签如果遇到一个属性时,就会呼叫该方法一次,并传入卷标名称与卷标值,您可 以将这些名称与值储存下来,以在标签处理类别中作进一步处理,例如:
DyAttrTag.javapackage 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) + "
");
out.println("Name: " +
attrNames.get(i) + "
");
out.println("Value: " +
attrValues.get(i) + "
");
}
}
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,例如:
dyattr.tld
... <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网页来进行测试: test.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>