From Gossip@caterpillar

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>