大可制作:QQ群:31564239(asp|jsp|php|mysql)

JSP/Servlet: 自订动态标签属性

如果在自订标签时,事先并无法得知标签的属性个数与名称,则您可以实现DynamicAttributes接口,这是JSP2.0之后加入的新接口,该接 口只有一个方法必须实现setDynamicAttribute(),在处理标签如果遇到一个属性时,就会调用该方法一次,并传入标签名称与标签值,您可 以将这些名称与值储存下来,以在标签处理类中作进一步处理,例如:
  • DyAttrTag.java
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,例如:
  • 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>