熟悉标签库的朋友进来帮忙看一下,急

MopeLeo 2004-09-07 08:20:58
我用标签库写了一个简单的循环标签,
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class LoopTag extends BodyTagSupport{
private int maxCount = 0;
private int currentCount = 0;

public void setCount(int count){
this.maxCount = count;
}

public int doStartTag(){
if(currentCount < maxCount){
return EVAL_BODY_BUFFERED;
}else
return SKIP_BODY;
}

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

public int doEndTag() throws JspException{
try{
if(bodyContent != null){
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
}catch(java.io.IOException ioe){
throw new JspException("IO Error" + ioe.getMessage());
}
return EVAL_PAGE;
}

public void release(){
super.release();
currentCount = 0;
}
}

调用标签库的jsp如下:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="/bad" prefix="bad"%>
<html>
<head>
<title>
test
</title>
</head>
<body bgcolor="#ffffff">

<table>
<% int i = 0 ;%>
<bad:loop count="5">
<tr>
<bad:loop count="6">
<td bgcolor=#ccccff><%= i++ %></td>
</bad:loop>
</tr>
</bad:loop>
</table>
</body>
</html>
可是打印出来的结果却是:
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

重第2行开始就没有递增了,请熟悉的朋友解答一下!!!
...全文
364 点赞 收藏 34
写回复
34 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
MopeLeo 2004-10-19
up
回复
MopeLeo 2004-10-10
共同学习,up
回复
马前小卒 2004-10-08
up
回复
risker2004 2004-10-08
To:MopeLeo(烂迹天涯):这个问题还没有解决,看来是有些难点。我刚想了一下,有两了地方是难点。

一、就是i得值在每轮内层循环做完后应重新获得一个新的起点,这个不是太难办到。

二、是最难的地方了,因为,在作外层循环时内层的标签必须解析完毕(做完循环),而这就是问题的

症结。当第二次外层循环开始时,外层的标签读入的内容将是第一次解析后的静态文本内容,也就

是说,内层标签得值在第一次循环后就不会在被解析了。

我会帮你想这个问题的,也希望有这方面的高手或是对自定义标签了解的朋友参与进来。

我的QQ;23770708

回复
lippea 2004-09-27
不懂 不能把i的声明提到外层循环中,然后在内层进行加法么?
顺便帮你up一下
回复
MopeLeo 2004-09-27
自己顶一下!
回复
MopeLeo 2004-09-23
为这个问题烦死了~~~
回复
Rhett 2004-09-21
public int doStartTag(){
if(currentCount < maxCount){
return EVAL_BODY_BUFFERED;
}else
return SKIP_BODY;
}

那么你把这个doStartTag也改为 return EVAL_BODY_AGAIN,试试看!
回复
MopeLeo 2004-09-20
To risker2004(亮亮) :谢谢你的关注,我觉得你分析的很有道理,望继续支持
回复
risker2004 2004-09-19
To:MopeLeo(烂迹天涯) 抱歉,我这一段比较忙,没来得及考虑这个问题,回头给你一个答案。也希望有更多的朋友参与解决这个问题。
回复
MopeLeo 2004-09-16
To: Rhett(Rhett) 这种改法不行啊!

继续关注,望高人指点!!!
回复
Rhett 2004-09-15
public int doAfterBody() throws JspException{
currentCount++ ;
if(currentCount < maxCount){
return EVAL_BODY_AGAIN;
}else{
return SKIP_BODY;
}
回复
stonecsdn 2004-09-15
这涉及到了标签的嵌套和跌代,和父标签通信可用方法:

parent=(LoopTag)this.findAncestorWithClass(this,LoopTag.class);
因为很长一段时间都没有用标签了,对其中的一些概念有些模糊了,立刻参考相关的标签的书籍
www.infoxa.com上面就有
回复
MopeLeo 2004-09-15
没人看了么???郁闷!!!
回复
MopeLeo 2004-09-12
TO stonecsdn(东东) :

多谢你的指点!如果我想要以上的效果,不知该做如何修改呢???
回复
MopeLeo 2004-09-12
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

该怎么做呢???
回复
stonecsdn 2004-09-10
out = _jspx_page_context.pushBody();//可能是out压入和弹出造成的原因
out = _jspx_page_context.popBody();//
to: yunxiang(*****) ,标签之间可以相互通讯,不然那些嵌套的标签怎么使用?
回复
yunxiang 2004-09-10
我觉得你想要的结果根本实现不了。
标签之间是不能相互通讯的。

个人想法。
回复
MopeLeo 2004-09-10
.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");

望高人指点!
回复
risker2004 2004-09-10
其实这个结果的输出是完全正确的。从打印结果可一看出:你所要得结果
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

最后我要说的是两个标签体控制的显示的内容是不同的。




回复
加载更多回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-09-07 08:20
社区公告
暂无公告