2.8.7 动态属性的标签
前面介绍带属性标签时,那些标签的属性个数是确定的,属性名也是确定的,绝大部分情况下这种带属性的标签能处理得很好,但在某些特殊情况下,需要传入自定义标签的属性个数是不确定的,属性名也不确定,这就需要借助于动态属性的标签了.
动态属性标签比普通标签多了如下两个额外要求。
- 标签处理类还需要实现
DynamicAttributes
接口
- 配置标签时通过
<dynamic-attributes>
子元素指定该标签支持动态属性
下面是一个动态属性标签的处理类。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| package lee;
import javax.servlet.jsp.tagext.*; import javax.servlet.jsp.*; import java.io.*; import java.util.*;
public class DynaAttributesTag extends SimpleTagSupport implements DynamicAttributes { private ArrayList<String> keys = new ArrayList<String>(); private ArrayList<Object> values = new ArrayList<Object>();
@Override public void doTag() throws JspException, IOException { JspWriter out = getJspContext().getOut(); out.println("<ol>"); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); Object value = values.get(i); out.println("<li>" + key + " = " + value + "</li>"); } out.println("</ol>"); }
@Override public void setDynamicAttribute(String uri, String localName, Object value) throws JspException { keys.add(localName); values.add(value); } }
|
上面的标签处理类实现了DynamicAttributes
接口,就是动态属性标签处理类必须实现的接口,实现该接口必须实现setDynamicAttribute()
方法,该方法用于为该标签处理类动态地添加属性名和属性值。
标签处理类使用ArrayList<String>
类型的keys
属性来保存标签的所有属性名,使用ArrayList<Object>
类型的values
属性来保存标签的所有属性值。
配置该标签时需要额外地指定<dynamic-attributes>
子元素,表明该标签是带动态属性的标签。
下面是该标签的配置片段。
1 2 3 4 5 6 7 8
| <tag> <name>dynaAttr</name> <tag-class>lee.DynaAttributesTag</tag-class> <body-content>empty</body-content> <dynamic-attributes>true</dynamic-attributes> </tag>
|
上面的配置片段指定该标签支持动态属性。
一旦定义了动态属性的标签,接下来在页面中使用该标签时将十分灵活,完全可以为该标签设置任意的属性,如以下页面片段所示。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <%@ page contentType="text/html; charset=UTF-8" language="java" errorPage="" %> <!-- 导入标签库,指定mytag前缀的标签, 由http: <%@ taglib uri="http://www.crazyit.org/mytaglib" prefix="mytag"%> <!DOCTYPE html> <html> <head> <title>自定义标签示范</title> </head> <body bgcolor="#ffffc0"> <h2>下面显示的是自定义标签中的内容</h2> <h4>指定两个属性</h4> <mytag:dynaAttr name="crazyit" url="crazyit.org"/><br/> <h4>指定四个属性</h4> <mytag:dynaAttr 书名="疯狂Java讲义" 价格="99.0" 出版时间="2008年" 描述="Java图书"/><br/> </body> </html>
|
上面的页面片段中使用mytag:dynaAttr
标签时十分灵活:可以根据需要动态地传入任意多个属性,如以上代码所示。不管传入多少个属性,这个标签都可以处理得很好,使用浏览器访问该页面将看到如图2.38所示的效果