启动Tomcat服务器,在浏览器地址栏中输入“http://localhost:8080/chapter01/iteratjsp”访问iteratjsp页面,可以发现,在浏览器中标签体内容“hello,itcast!”显示了5遍。说明编写的自定义标签实现了重复执行标签体的功能。
在mytatld文件中增加一个Tag元素,对标签处理器类进行注册,注册信息如下所示。
iterate
cn.itcast.chante-01.c1assisctaa.Iterate
JSP
num
true
intdoAfterBody()方法
EVAL_BODY_AGAIN常量是doAfterBody()方法的返回值,如果doAfterBody()方法返回该常量,JSP容器会把标签体的内容重复执行一次。
JSP容器在每次执行完标签体后会调用doAfterBody()方法,该方法可以返回常量SKIP_BODY和EVAL_BODY_AGAIN。如果方法返回SKIP_BODY常量,JSP容器回执行代表结束的标签的doEndTag()方法,如果返回EVAL_BODY_AGAIN,则重复执行标签体。
编写JSP页面iteratjsp。
建Web工程chapter并在工程下编写标签处理器类Iteratjava。由于TagSupport类实现了IterationTag接口,为了简化程序的编写,我们定义的标签处理器类只需继承TagSupport类即可,Iteratjava类的实现代码如下代码所示。
package cn.itcast.chapter01.classisctag;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.*;
public class Iterate extends TagSupport {
//定义变量
private int num;
//提供num属性的setter方法
public void setNum(int num) {
this.num = num;
}
//执行一次标签体
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
}
//根据属性值对标签体进行执行
public int doAfterBody() throws JspException {
num--;
if (num > 0) {
return EVAL_BODY_AGAIN;
} else {
return SKIP_BODY; //跳过标签体
}
}
}
编写标签处理器类。
在上面代码中,成员变量num用于接收标签num属性的值,用来决定标签体的执行次数。由于doStartTag()方法的返回值为EVAL_BODY_INCLUDE,在执行doAfterBody()方法之前,标签体已经执行了一次,因此在doAfterBody()方法中判断if条件之前先将num的值自减一次。
注册标签处理器类。
为了让读者更好地学习IterationTag接口,接下来通过一个案例演示如何使用IterationTag接口实现重复执行标然休的功能,具体步骤如下。
文章为作者独立观点,不代表股票交易接口观点