JSP2.0的标签库引入一个新特性——动态属性,该特性通过接口javax.servlet.jsp.tagext.DynamicAttributes来实现。实现该接口需要实现setDynamicAttribute()方法,该方法用于接收动态属性。使用动态属性这个新特性后,标签类对应属性的get、set方法就可以去掉了,tld文件也可以去掉相应的属性配置。
如果需要使用JSP2语法,其web.xml文件必须使用Servlet 2.4以上版本的配置文件。
1、标签类TestTag的源码:
Java代码
public class TestTag extends BodyTagSupport implements DynamicAttributes {
private User user;
public TestTag(){
this.user = new User();
}
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
try{
//此处获取动态属性名和值
BeanUtils.setProperty(user, localName, value);
}catch(IllegalAccessException e){
throw new JspException("该UI不存在该属性");
}catch(InvocationTargetException e){
throw new JspException("该UI不存在该属性");
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
public class TestTag extends BodyTagSupport implements DynamicAttributes {
private User user;
public TestTag(){
this.user = new User();
}
public void setDynamicAttribute(String uri, String localName, Object value) throws JspException {
try{
//此处获取动态属性名和值
BeanUtils.setProperty(user, localName, value);
}catch(IllegalAccessException e){
throw new JspException("该UI不存在该属性");
}catch(InvocationTargetException e){
throw new JspException("该UI不存在该属性");
}
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2、自定义标签在标签库描述符文件中的声明:
dynamic-attributes参数设置为true就是表示该标签支持动态属性特性。
Xml代码
<tag>
<name>test</name>
<tag-class>com.cjm.web.tag.TestTag</tag-class>
<dynamic-attributes>true</dynamic-attributes>
</tag>
<tag>
<name>test</name>
<tag-class>com.cjm.web.tag.TestTag</tag-class>
<dynamic-attributes>true</dynamic-attributes>
</tag>
3、自定义标签的使用:
Html代码
<%@ taglib prefix="cjm" uri="/WEB-INF/cjm.tld"%>
<cjm:test p1="v1" p2="v2"/> <!-- p1、p2标签属性在标签类和描述符文件中都没有定义 -->
<cjm:test>
<jsp:attribute name="uid" trim="true"><%=request.getParameter("uid")%></jsp:attribute>
<jsp:attribute name="pwd" trim="true"><%=request.getParameter("pwd")%></jsp:attribute>
</cjm:test>
<%@ taglib prefix="cjm" uri="/WEB-INF/cjm.tld"%>
<cjm:test p1="v1" p2="v2"/> <!-- p1、p2标签属性在标签类和描述符文件中都没有定义 -->
<cjm:test>
<jsp:attribute name="uid" trim="true"><%=request.getParameter("uid")%></jsp:attribute>
<jsp:attribute name="pwd" trim="true"><%=request.getParameter("pwd")%></jsp:attribute>
</cjm:test>