我刚才看了我书上得标签例子,他很简单就是循环,jsp页面如下:<%@ taglib uri="/demotag" prefix="bodytag"%>
<html>
<head>
</head>
<body>
<bodytag:loop counts="5">
现在时间是:<%=new java.util.Date()%> <br>
</bodytag:loop>
</body>
</html>它输出得结果是: 现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003你看时间都是相同得,所以我估计是第一层循环的值是都是一样的,所以都是i=0开始具体深层次原因我也不知道,期待能有人回答了~~
<html>
<head>
</head>
<body>
<bodytag:loop counts="5">
现在时间是:<%=new java.util.Date()%> <br>
</bodytag:loop>
</body>
</html>它输出得结果是: 现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003
现在时间是:Tue Sep 16 23:07:08 CST 2003你看时间都是相同得,所以我估计是第一层循环的值是都是一样的,所以都是i=0开始具体深层次原因我也不知道,期待能有人回答了~~
<bad:loop count="5">
<%= i++ %>
<tr>
<bad:loop count="6">
<td bgcolor=#ccccff><%= i++ %></td>
</bad:loop>
</tr>
</bad:loop>
你不就是要这样的效果吗? 何必那么麻烦呢????
-------------------------------------------------------
/*
* 创建日期 2004-9-9
*
* 更改所生成文件模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
package com.hair.sh.jett.tagclass;import java.io.IOException;import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;/**
* @author db2admin
*
* 更改所生成类型注释的模板为
* 窗口 > 首选项 > Java > 代码生成 > 代码和注释
*/
public class Loop extends TagSupport {
private int maxCount;
private int count;
private int i; /**
*
*/
public Loop() {
super();
// TODO 自动生成构造函数存根
}
public int doStartTag(){
i = 0;
return EVAL_PAGE;
}
public int doAfterBody(){
System.out.println("标签111==="+i);
JspWriter out = pageContext.getOut();
String str = "";
if(i<maxCount){
try {
for(int j=0;j<6;j++){
int tmp = i + j;
str = str + tmp +";";
out.println(tmp);
}
out.println("<br>");
System.out.println("标签==="+i);
i++;
} catch (IOException e) {
e.printStackTrace();
}
return EVAL_BODY_AGAIN;
}else{
return SKIP_BODY;
}
}
public int doEndTag(){
return EVAL_PAGE;
}
/**
* @return
*/
public int getCount() {
return count;
} /**
* @param i
*/
public void setCount(int i) {
count = i;
this.maxCount = i;
}}
====================================
JSP里
==========================
<%@ taglib uri="/WEB-INF/taglib/util.tld" prefix="util" %>
<util:loop count="6"></util:loop>
原因可能就是调用标签时,传入的参数i始终为0。
本来想调试一把,但是没有时间,自己看看jsp对应产生的java文件吧
int i = 0 ;
// bad:loop
Test.LoopTag _jspx_th_bad_loop_0 = (Test.LoopTag) _jspx_tagPool_bad_loop_count.get(Test.LoopTag.class);
_jspx_th_bad_loop_0.setPageContext(_jspx_page_context);
_jspx_th_bad_loop_0.setParent(null);
_jspx_th_bad_loop_0.setCount(5);
int _jspx_eval_bad_loop_0 = _jspx_th_bad_loop_0.doStartTag();
if (_jspx_eval_bad_loop_0 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
if (_jspx_eval_bad_loop_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
out = _jspx_page_context.pushBody();
_jspx_th_bad_loop_0.setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);
_jspx_th_bad_loop_0.doInitBody();
}
do {
out.write("\n");
out.write(" <tr>\n");
out.write(" ");
// bad:loop
Test.LoopTag _jspx_th_bad_loop_1 = (Test.LoopTag) _jspx_tagPool_bad_loop_count.get(Test.LoopTag.class);
_jspx_th_bad_loop_1.setPageContext(_jspx_page_context);
_jspx_th_bad_loop_1.setParent((javax.servlet.jsp.tagext.Tag) _jspx_th_bad_loop_0);
_jspx_th_bad_loop_1.setCount(6);
int _jspx_eval_bad_loop_1 = _jspx_th_bad_loop_1.doStartTag();
if (_jspx_eval_bad_loop_1 != javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
if (_jspx_eval_bad_loop_1 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
out = _jspx_page_context.pushBody();
_jspx_th_bad_loop_1.setBodyContent((javax.servlet.jsp.tagext.BodyContent) out);
_jspx_th_bad_loop_1.doInitBody();
}
do {
out.write("\n");
out.write("\t<td bgcolor=#ccccff>");
out.print( i++ );
out.write("</td>\n");
out.write(" ");
int evalDoAfterBody = _jspx_th_bad_loop_1.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
if (_jspx_eval_bad_loop_1 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)
out = _jspx_page_context.popBody();
}
if (_jspx_th_bad_loop_1.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
return;
_jspx_tagPool_bad_loop_count.reuse(_jspx_th_bad_loop_1);
out.write("\n");
out.write(" </tr>\n");
int evalDoAfterBody = _jspx_th_bad_loop_0.doAfterBody();
if (evalDoAfterBody != javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
if (_jspx_eval_bad_loop_0 != javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)
out = _jspx_page_context.popBody();
}
if (_jspx_th_bad_loop_0.doEndTag() == javax.servlet.jsp.tagext.Tag.SKIP_PAGE)
return;
_jspx_tagPool_bad_loop_count.reuse(_jspx_th_bad_loop_0);
out.write("\n");
out.write("</table>\n");望高人指点!
out = _jspx_page_context.popBody();//
to: yunxiang(*****) ,标签之间可以相互通讯,不然那些嵌套的标签怎么使用?
<logic:iterate id="" name="" >
<bean:write name="" property="" />
</logic:iterate>
不过自己写的标签还不知道怎么实现嵌陶。
学习中。。都说了个人想法,不要骂我了。。
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
就是这样。为什么呢?
第一个<bad:loop count="5">是用与控制<bad:loop count="5"></bad:loop>之间的循环的,
当JSP解析这个标签时知道要对标签体的内容进行处理,当他读入的是发现在还有另一个<bad:loop count="6"><bad:loop>这样的标签所以,JSP会先去处理内层的标签,因此显示结果是0 1 2 3 4 5 ,处理完内层的标签后外层的标签读入的实际内容是:
<tr>
<td bgcolor=#ccccff>0 1 2 3 4 5 </td>
</tr>
这样外层会把这个内容读进。外层开始做第一次doAfterBody();并把内容写进这个缓冲中。然后连续再4次。最后输出就是:
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5
0 1 2 3 4 5 最后我要说的是两个标签体控制的显示的内容是不同的。
0 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该怎么做呢???
因为很长一段时间都没有用标签了,对其中的一些概念有些模糊了,立刻参考相关的标签的书籍
www.infoxa.com上面就有
currentCount++ ;
if(currentCount < maxCount){
return EVAL_BODY_AGAIN;
}else{
return SKIP_BODY;
}
if(currentCount < maxCount){
return EVAL_BODY_BUFFERED;
}else
return SKIP_BODY;
}那么你把这个doStartTag也改为 return EVAL_BODY_AGAIN,试试看!
顺便帮你up一下