如果在自訂標籤時,事先並無法得知標籤的屬性個數與名稱,則您可以實作DynamicAttributes介面,這是JSP2.0之後加入的新介面,該介
面只有一個方法必須實作setDynamicAttribute(),在處理標籤如果遇到一個屬性時,就會呼叫該方法一次,並傳入標籤名稱與標籤值,您可
以將這些名稱與值儲存下來,以在標籤處理類別中作進一步處理,例如:
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,例如:
... <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網頁來進行測試:
<%@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>
|