1/7: 这个标签用得怎么时错时对?

wafeng 2004-05-06 12:13:08
循环标签源代码,用于循环输出一个数组的元素,编译后在页面里调用,执行,为什么当第奇数次执行的时候正常显示,第偶数次执行时就报错:
标签代码:
package com.wrox.ch10;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class iterateTag extends TagSupport
{
private int arrayCount=0;
private String[] strings=null;
public int doStartTag(){
strings=(String[])pageContext.getAttribute("strings");
return EVAL_BODY_INCLUDE;
}
public int doAfterBody() throws JspException{
try{
pageContext.getOut().print(" "+strings[arrayCount]+"<br>");
}catch (Exception e){
throw new JspException(e.toString());
}
arrayCount++;
if ( arrayCount>=strings.length)
{
return SKIP_BODY;
}
return EVAL_BODY_AGAIN;
}
}
页面调用:
<%@ taglib prefix="example" uri="WEB-INF/exampleTags.tld"%>
<%
String[] strings=new String[]{"Alpha","Bruce Lee","Omega"};
pageContext.setAttribute("strings",strings);
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>无标题文档</title>
</head>

<body>
<example:iterate>
the string is
</example:iterate>
</body>
</html>
报错信息:
type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.lang.ArrayIndexOutOfBoundsException: 3
org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:867)
org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:800)
org.apache.jsp.iterate_jsp._jspService(iterate_jsp.java:81)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)


root cause

javax.servlet.jsp.JspException: java.lang.ArrayIndexOutOfBoundsException: 3
com.wrox.ch10.iterateTag.doAfterBody(iterateTag.java:16)
org.apache.jsp.iterate_jsp._jspx_meth_example_iterate_0(iterate_jsp.java:100)
org.apache.jsp.iterate_jsp._jspService(iterate_jsp.java:71)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:133)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:311)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:301)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:248)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)


note The full stack trace of the root cause is available in the Tomcat logs.


--------------------------------------------------------------------------------

Apache Tomcat/5.0.19
...全文
82 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wafeng 2004-05-09
  • 打赏
  • 举报
回复
和jsp没有关系?我是初学者,可我认为好像tomcat只是一个解释器啊,真正实现销毁对象这些工作的应该是jsp或者是java本身,不知这样说对不对
wafeng 2004-05-08
  • 打赏
  • 举报
回复
我也是说的打开新的页面,我说的奇数和偶数次都说的是打开全新的页面。而且,页面执行完系统不是会自动调用默认的析构函数吗?难道pageContext里面的东西还在呀,要是还在,编起程来还不麻烦死,每次都要把它销毁.
fuzuyuan 2004-05-08
  • 打赏
  • 举报
回复
这也许和tomcat的机制有关,我用jb做了你这个例子,用的是tomcat4.0运行起来很正常,无论刷新多少次都是一样的效果,至于tomcat5.0为什么会有这样的问题,等我仔细研究一下
wafeng 2004-05-07
  • 打赏
  • 举报
回复
楼上说的这种办法固然可以,但是页面执行完后这个类为何还是会存在 呢,它们应该被自动释放啊,难道还要写一个release()吗,况且,我每次在一个新的页面里执行的时候,也有这个问题而不是像你说的。
fuzuyuan 2004-05-07
  • 打赏
  • 举报
回复
哦,是这样的,自定义标签实际就是调用你定义的类,你的程序在不断刷新的时候会出现数组越界的错误,但是重新打开页面时,没有这个错误!我估计是你刷新时,以前实例化的那个类仍还存在,所以arrayCount已经有一个值5,不是你所期待的1了,解决的办法,把这里改成这样
if ( arrayCount>=strings.length)
{
arrayCount=0;//加上这条语句后,才能强制在刷新的时候,给arrayCount重新赋值
return SKIP_BODY;
}
在试试看,还会有你说的错吗
fuzuyuan 2004-05-07
  • 打赏
  • 举报
回复
我说的是打开新的页面,但不刷新,刷新这个动作和重新请求是有点不一样的,比如刷新时session还存活着,而重新请求却产生了一个新的session等,至于我说你调用的那个类还存在,也可能是这个原因,所以你可以试试将你的那个类销毁,在看看还有你的那个错吗
wafeng 2004-05-06
  • 打赏
  • 举报
回复
我up
wafeng 2004-05-06
  • 打赏
  • 举报
回复
不会吧,你多刷新几次试试。
fuzuyuan 2004-05-06
  • 打赏
  • 举报
回复
晕倒,你搞错了没有,我将你的程序原封不动的拷了过去,但无论是奇数还是偶数都可以正确的运行,唯一改了的就是指令中的<uri="/demotag">
wafeng 2004-05-06
  • 打赏
  • 举报
回复
up

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧