Have you considered using the struts logic tags
(http://jakarta.apache.org/struts/index.html) or the JSTL
(http://jakarta.apache.org/taglibs/index.html) rather than implementing this
stuff yourself? There are some useful custom tags (like the iterate tag
you're trying to implement).
Hamish
-Original Message-
From: Switch [mailto:[EMAIL PROTECTED]]
Sent: Tuesday, February 04, 2003 11:10 AM
To: Tomcat User Group
Subject: Could this be a Tag Libs implementation bug?
Hello everybody.
I've just signed up this list, then I must present myselft first.
My name is Paco. I'm a J2EE developer for a local SW copany
at Balearic
Islands (Spain - Europe).
I apologize me for my english. I write as well as I can :-)
I've read the etiquette and I've read the FAQ and I've read the mail
archieve, without having found an explanation to my problem.
Here it goes:
I've developed a small iterate TagLib. This Tag Lib works
fine with WL and
Oracle iAS and I'm currently migrating to jboss + tomcat.
At the end of this e-mail I'will paste some code to explain
properly why I
think there's a bug.
I've created a very simple JSP that tests my IterateTag and I get a
NullPointerException because of the EVAL_BODY_INCLUDE returned by
doStartTag.
I've been looking .java generated file from .jsp and I
can see this
piece of code:
int _jspx_eval_bit_iterate_0 = _jspx_th_bit_iterate_0.doStartTag();
if (_jspx_eval_bit_iterate_0 !=
javax.servlet.jsp.tagext.Tag.SKIP_BODY) {
String str = null;
if (_jspx_eval_bit_iterate_0 !=
javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE) {
javax.servlet.jsp.tagext.BodyContent _bc =
pageContext.pushBody();
_bc.clear();
out = _bc;
_jspx_th_bit_iterate_0.setBodyContent(_bc);
_jspx_th_bit_iterate_0.doInitBody();
str = (String) pageContext.findAttribute(str);
}
do {
...
if (evalDoAfterBody !=
javax.servlet.jsp.tagext.BodyTag.EVAL_BODY_AGAIN)
break;
} while (true);
if (_jspx_eval_bit_iterate_0 !=
javax.servlet.jsp.tagext.Tag.EVAL_BODY_INCLUDE)
out = pageContext.popBody();
}
I can't undestand why this generated .java file executes if !=
EVAL_BODY_INCLUDE and I think it should be if ==
EVAL_BODY_INCLUDE (May
be I'm wrong).
I've read the following at J2EE 1.3 javadoc about BodyTagSupport class
(http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/j
sp/tagext/Tag.
html#EVAL_BODY_INCLUDE):
EVAL_BODY_INCLUDE
public static final int EVAL_BODY_INCLUDE
Evaluate body into existing out stream. Valid return value
for doStartTag
I can workarround this by returning EVAL_BODY_BUFFERED (so
this isn't a
critical error)
Could anybody explain why is _jspx_eval_bit_iterate_0 being
compared to be
not EVAL_BODY_INCLUDE?
Tell me if you need something else.
Thanks in advance for your help.
Some source code for ItareateTag.java
---
public int doStartTag() throws JspTagException
{
if(iterator==null) return SKIP_BODY;
if(iterator.hasNext())
{
pageContext.setAttribute(name,iterator.next(),PageContext.PAGE_SCOPE);
Enumeration en =
pageContext.getAttributeNamesInScope(PageContext.PAGE_SCOPE);
while (en.hasMoreElements())
System.out.println(Attributute: +
en.nextElement());
return EVAL_BODY_INCLUDE;
}
else return SKIP_BODY;
}
public int doAfterBody() throws JspTagException
{
System.out.println(IterateTag.doAfterBody. name: + name +
Iteratior: + iterator + Type: + type);
if(iterator.hasNext())
{
pageContext.setAttribute(name,iterator.next(),PageContext.PAGE_SCOPE);
return EVAL_BODY_AGAIN;
}
else
{
return SKIP_BODY;
}
}
public int doEndTag() throws JspTagException
{
System.out.println(IterateTag.doEndTag. name: + name +
Iteratior:
+ iterator + Type: + type);
try
{
if(bodyContent != null)
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
catch(java.io.IOException e)
{
throw new JspTagException(IO Error: + e.getMessage());
}
System.out.println(Fin IterateTag.doEndTag. );
return EVAL_PAGE;
}
---
Some source code for a JSP test file:
---
%@ page contentType=text/html;charset=ISO-8859-15%
%@ page import=java.util.* %
%@ taglib uri=mytags prefix=bit %
%
Vector v = new Vector();
v.addElement(First Element);
v.addElement(Second Element);
v.addElement(Third Element);
v.addElement(Fourth Element);
%
html
head/head
body
table
bit:iterate name=str collection=%=v% type=String
trtdThis items contains %=str.length()%
characters and its
value is %=str%/td/tr
/bit:iterate
/table
/body
---
taglib.tld contents:
---
?xml version=1.0 encoding=ISO-8859-1 ?
!DOCTYPE taglib PUBLIC -//Sun Microsystems, Inc.//DTD JSP
Tag Library
1.1//EN