自定义了一个标签 它的功能很简单,在属性中指定显示次数,就可以以该次数来显示标签体的内容。==CycTag.java==package com.jin.ch11.tags;import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;public class CycTag extends BodyTagSupport{

private int k = 0;
private int count;

public void setCount(int count) {
this.count = count;
} public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;
}

public int doAfterBody() throws JspException {
if(k < (count-1)) {
k ++;
return EVAL_BODY_AGAIN;
} else {
k = 0;
count = 0;
return SKIP_BODY;
}

} public int doEndTag() throws JspException {
return EVAL_PAGE;
}

}
==cyc.jsp==<%@ page language="java" contentType="text/html; charset=gbk" %>
<%@ taglib uri="/WEB-INF/tlds/MyTaglib.tld" prefix="t"%><html>
<body>重复展示5次下面标签里的话<br>
<t:cyc count="5">牛年来了!</t:cyc></body>
</html>
以上的代码可以正常工作,不会出问题。可我想练习一下当doStartTag()返回 EVAL_BODY_BUFFERED的状况,于是改写了
CycTag.java。 (当doStartTag()返回 EVAL_BODY_BUFFERED时,是不会自动将标签体内容写入输出流中的,需要自行输出.)
==CycTag.java==package com.jin.ch11.tags;import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;public class CycTag extends BodyTagSupport{

private int k = 0;
private int count;

public void setCount(int count) {
this.count = count;
} public int doStartTag() throws JspException {
return EVAL_BODY_BUFFERED;
}

public int doAfterBody() throws JspException {
if(k < (count-1)) {
k ++;
                        JspWriter out = bodyContent.getEnclosingWriter();
try {
out.println(bodyContent.getString()); //A
//out.println(bodyContent);    B
//out.println(" 怪怪的  ");    C
} catch (IOException e) {
System.err.println(e.toString());
}
return EVAL_BODY_AGAIN;
} else {
k = 0;
count = 0;
return SKIP_BODY;
}

} public int doEndTag() throws JspException {
return EVAL_PAGE;
}

}
使用这个改过的CycTag.java后,问题出现了。 自定义标签将显示出许多个“牛年来了!”.而不再是JSP中使用者想要的5次显示。开始我认为可能是逻辑错了。于是多次试验,但最后验证的结果证明,我的逻辑并没有错。当把上面的代码中的A句注掉,换为C句时,就会乖乖地显示5次了。可要是用A句或C句,都会发生无故产生多超多条输出的结果。我想是不是在使用bodyContent时和缓存有什么关系呢? 希望深入研究过BodyTag类的朋友能够解答一下这个问题。