我刚才看了我书上得标签例子,他很简单就是循环,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开始具体深层次原因我也不知道,期待能有人回答了~~

解决方案 »

  1.   

    试一下这个看看:<% int i = 0 ;%>
    <bad:loop count="5">
       <%= i++ %>
      <tr>
        <bad:loop count="6">
    <td bgcolor=#ccccff><%= i++ %></td>
        </bad:loop>
      </tr>
    </bad:loop>
      

  2.   

    ---------------------------------------------------
    你不就是要这样的效果吗? 何必那么麻烦呢????
    -------------------------------------------------------
    /*
     * 创建日期 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>
      

  3.   

    如果详查原因,请研究jsp对应产生的java文件,
    原因可能就是调用标签时,传入的参数i始终为0。
    本来想调试一把,但是没有时间,自己看看jsp对应产生的java文件吧
      

  4.   

    .jsp对应的.java文件的主要部分是这样的,好象也看不出什么问题啊?      out.write("<table>\n");
          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");望高人指点!
      

  5.   

    out = _jspx_page_context.pushBody();//可能是out压入和弹出造成的原因
    out = _jspx_page_context.popBody();//
    to: yunxiang(*****) ,标签之间可以相互通讯,不然那些嵌套的标签怎么使用?
      

  6.   

    To yunxiang:谁说标签之间不能相互通讯???
      

  7.   

    不好意思。你们说得也是。像struts中的
    <logic:iterate id="" name="" >
    <bean:write name="" property="" />
    </logic:iterate>
    不过自己写的标签还不知道怎么实现嵌陶。
    学习中。。都说了个人想法,不要骂我了。。
      

  8.   

    其实这个结果的输出是完全正确的。从打印结果可一看出:你所要得结果
    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 最后我要说的是两个标签体控制的显示的内容是不同的。
      

  9.   

    TO risker2004(亮亮):我想要的结果是:
    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该怎么做呢???
      

  10.   

    TO stonecsdn(东东) :多谢你的指点!如果我想要以上的效果,不知该做如何修改呢???
      

  11.   

    这涉及到了标签的嵌套和跌代,和父标签通信可用方法:  parent=(LoopTag)this.findAncestorWithClass(this,LoopTag.class);
    因为很长一段时间都没有用标签了,对其中的一些概念有些模糊了,立刻参考相关的标签的书籍
    www.infoxa.com上面就有
      

  12.   

    public int doAfterBody() throws JspException{
    currentCount++ ;
    if(currentCount < maxCount){
    return EVAL_BODY_AGAIN;
    }else{
    return SKIP_BODY;
    }
      

  13.   

    To: Rhett(Rhett) 这种改法不行啊!继续关注,望高人指点!!!
      

  14.   

    To:MopeLeo(烂迹天涯)  抱歉,我这一段比较忙,没来得及考虑这个问题,回头给你一个答案。也希望有更多的朋友参与解决这个问题。
      

  15.   

    To risker2004(亮亮) :谢谢你的关注,我觉得你分析的很有道理,望继续支持
      

  16.   

    public int doStartTag(){
    if(currentCount < maxCount){
    return EVAL_BODY_BUFFERED;
    }else
    return SKIP_BODY;
    }那么你把这个doStartTag也改为 return EVAL_BODY_AGAIN,试试看!
      

  17.   

    不懂 不能把i的声明提到外层循环中,然后在内层进行加法么?
    顺便帮你up一下
      

  18.   

    To:MopeLeo(烂迹天涯):这个问题还没有解决,看来是有些难点。我刚想了一下,有两了地方是难点。一、就是i得值在每轮内层循环做完后应重新获得一个新的起点,这个不是太难办到。二、是最难的地方了,因为,在作外层循环时内层的标签必须解析完毕(做完循环),而这就是问题的症结。当第二次外层循环开始时,外层的标签读入的内容将是第一次解析后的静态文本内容,也就是说,内层标签得值在第一次循环后就不会在被解析了。我会帮你想这个问题的,也希望有这方面的高手或是对自定义标签了解的朋友参与进来。我的QQ;23770708