ITEEDU

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) + "
"); 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>