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"> > <tr><td>This 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" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> > <taglib> > <tlibversion>1.0</tlibversion> > <jspversion>1.1</jspversion> > <shortname>test</shortname> > <uri></uri> > <info>Iterate Tag Lib.</info> > <tag> > <name>iterate</name> > <tagclass>es.caib.dembs.tags.IterateTag</tagclass> > <teiclass>es.caib.dembs.tags.IterateTEI</teiclass> > <bodycontent>JSP</bodycontent> > <info>a simple iterator</info> > <attribute> > <name>collection</name> > <required>true</required> > <rtexprvalue>true</rtexprvalue> > </attribute> > <attribute> > <name>name</name> > <required>true</required> > </attribute> > <attribute> > <name>type</name> > <required>true</required> > </attribute> > </tag> > </taglib> > --- > > ___________________________________________________ > Yahoo! Móviles > Personaliza tu móvil con tu logo y melodía favorito > en http://moviles.yahoo.es > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]