我们之前了解了传统标签开发和简单标签开发,但是我们开发的标签都是没有属性的标签,我们接下来里了解一下带属性的标签的开发。
开发带属性的标签:
自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。
记得我们之前写的让一段标签体循环5次,那么我们能不能在标签中设置一个属性,动态的设置循环的次数呢?当然是可以的,类似于:
想要让一个自定义标签带有属性,通常需要完成两个任务:
(1)在标签处理器中编写每个属性对应的setter方法。
(2)在TLD文件中描述标签的属性。
为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收JSP页面中调用自定义标签时传递进来的属性值。例如属性url,在标签处理器类中就要定义相应的setUrl(Strung url)方法。
在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签之前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。
下面我们来完成<zyg2:repeat count="8">标签的开发,作为例子。
首先创建一个标签处理器类:
然后编写该类,将参数作为类中的参数,并设置set方法:
然后在zygSimple.tld中注册这个标签(以前的repeat注释掉,以免冲突):
然后前台页面就如刚刚那么写:
重启Web项目,访问页面测试:
我们将count改为4,结果:
所以我们的带属性的标签开发成功!
我们之前说过,tld配置文件中rtexprvalue设定是否接受运行时表达式,我们来测试一下,我们在repeat中在设置一个属性,里面传输的是date日期:
然后在tld中设置:
然后重启Web项目,访问该页面:
发现我们是可以接受运行时语句作为参数的,如果我们的rtexprvalue设置的是false,那么我们上面那种参数设置就会报错。
开发带属性的标签:
自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性。
记得我们之前写的让一段标签体循环5次,那么我们能不能在标签中设置一个属性,动态的设置循环的次数呢?当然是可以的,类似于:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>带属性的标签</title>
</head>
<body>
<zyg2:repeat count="8">
10Hello !
</zyg2:repeat>
</body>
</html>
想要让一个自定义标签带有属性,通常需要完成两个任务:
(1)在标签处理器中编写每个属性对应的setter方法。
(2)在TLD文件中描述标签的属性。
为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的setter方法,用来接收JSP页面中调用自定义标签时传递进来的属性值。例如属性url,在标签处理器类中就要定义相应的setUrl(Strung url)方法。
在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签之前,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性。
下面我们来完成<zyg2:repeat count="8">标签的开发,作为例子。
首先创建一个标签处理器类:
然后编写该类,将参数作为类中的参数,并设置set方法:
package org.zyg.web.simpletag;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class RepeatWithParSimpleTag extends SimpleTagSupport {
private int count;
public void setCount(int count) {
this.count = count;
}
@Override
public void doTag() throws JspException, IOException {
JspFragment jf=this.getJspBody();
for (int i = 0; i < count; i++) {
jf.invoke(this.getJspContext().getOut());
}
}
}
然后在zygSimple.tld中注册这个标签(以前的repeat注释掉,以免冲突):
<tag>
<name>repeat</name><!-- 标签名 -->
<tag-class>org.zyg.web.simpletag.RepeatWithParSimpleTag</tag-class>
<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->
<attribute>
<name>count</name>
<required>true</required>
<!--rtexprvalue设定是否接受运行时表达式(EL表达式或其他代码) -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
然后前台页面就如刚刚那么写:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@taglib uri="/simpleTag" prefix="zyg2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>带属性的标签</title>
</head>
<body>
<zyg2:repeat count="8">
Hello !
</zyg2:repeat>
</body>
</html>
重启Web项目,访问页面测试:
我们将count改为4,结果:
所以我们的带属性的标签开发成功!
我们之前说过,tld配置文件中rtexprvalue设定是否接受运行时表达式,我们来测试一下,我们在repeat中在设置一个属性,里面传输的是date日期:
<zyg2:repeat count="4" date="<%=new Date() %>">
Hello !
</zyg2:repeat>
可以看到,我们的date属性中放置的正是运行时语句(在编译时才会体现真正值),这里我们的rtexprvalue设置的是true,所以我们可以得到它:
package org.zyg.web.simpletag;
import java.io.IOException;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class RepeatWithParSimpleTag extends SimpleTagSupport {
private int count;
public void setCount(int count) {
this.count = count;
}
private Date date;
public void setDate(Date date) {
this.date = date;
}
@Override
public void doTag() throws JspException, IOException {
JspFragment jf=this.getJspBody();
this.getJspContext().getOut().write(date.toLocaleString()+"<br/>");
for (int i = 0; i < count; i++) {
jf.invoke(this.getJspContext().getOut());
}
}
}
然后在tld中设置:
<tag>
<name>repeat</name><!-- 标签名 -->
<tag-class>org.zyg.web.simpletag.RepeatWithParSimpleTag</tag-class>
<body-content>scriptless</body-content><!-- 有无标签体(单标签还是成对标签) -->
<attribute>
<name>count</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>date</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
然后重启Web项目,访问该页面:
发现我们是可以接受运行时语句作为参数的,如果我们的rtexprvalue设置的是false,那么我们上面那种参数设置就会报错。
注:tld配置文件的attribute属性下还有一个type标签,定义的是属性的java类型。
转载请注明出处:http://blog.csdn.net/acmman/article/details/51118897