如果在自订标签时,事先并无法得知卷标的属性个数与名称,则您可以实作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>