Hi:
I am getting the error message "Attribute of type 'java.util.Collection'
must be a request time attribute" when Orion attempts to parse my JSP. This
seems weird because I do set <rtexprvalue> to true in my taglib.tld (see
below). I was attempting to create an iterator similar to the one defined in
the orion taglib tutorial at http://www.orionserver.com/taglibtut/index.jsp
and include it in my web application.
My JSP contains:
<%@ taglib uri="tags" prefix="model" %>
<jsp:useBean id="library" type="com.mongoosetech.model.Library"
scope="application"/>
...
<model:iterator name="book" type="com.mongoosetech.model.Book"
collection="<% library.getBooks() %>">
<jsp:getProperty name="book" property="name"/><br/>
</model:iterator>
where library.getBooks() returns a java.util.Collection of Book. I have 2
classes:
public class NestedTagInfo extends TagExtraInfo
{
public VariableInfo[] getVariableInfo(TagData data)
{
return new VariableInfo[]
{
new VariableInfo(data.getAttributeString("name"),
data.getAttributeString("type"), true, VariableInfo.NESTED)
};
}
}
and
public class IteratorTag extends BodyTagSupport
{
public int doStartTag()
{
if (iterator == null || !iterator.hasNext()) return SKIP_BODY;
pageContext.setAttribute(name, iterator.next(),
PageContext.PAGE_SCOPE);
return EVAL_BODY_TAG;
}
public int doAfterBody() throws JspException
{
if( !iterator.hasNext()) return SKIP_BODY;
pageContext.setAttribute(name, iterator.next(),
PageContext.PAGE_SCOPE);
return EVAL_BODY_TAG;
}
public int doEndTag() throws JspException
{
try
{
if(bodyContent != null)
bodyContent.writeOut(bodyContent.getEnclosingWriter());
}
catch(java.io.IOException e)
{
throw new JspException(e.getMessage());
}
return EVAL_PAGE;
}
public void setName(String name)
{
this.name = name;
}
public void setCollection(Collection collection)
{
if (collection.size() > 0) iterator = collection.iterator();
}
public void setType(String type)
{
this.type = type;
}
private String name;
private String type;
private Iterator iterator;
}
defined in the com.mongoosetech.tags package and a taglib.tld that looks
like:
<taglib>
...
<tag>
<name>iterator</name>
<tagclass>com.mongoosetech.tags.IteratorTag</tagclass>
<teiclass>com.mongoosetech.tags.IteratorTagInfo</teiclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>name</name>
<required>true</required>
</attribute>
<attribute>
<name>type</name>
<required>false</required>
</attribute>
<attribute>
<name>collection</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
and is a part of WEB-INF/lib/tags.jar which has the structure:
com/mongoosetech/tags/IteratorTag.class
com/mongoosetech/tags/IteratorTagInfo.class
META-INF/taglib.tld
Finally, I have a web.xml with an entry to point to the tag library:
<taglib>
<taglib-uri>tags</taglib-uri>
<taglib-location>/WEB-INF/lib/tags.jar</taglib-location>
</taglib>
Anyone have any ideas why this is happening? Thanks...
Kit Cragin
VP of Product Development
Mongoose Technology, Inc.
www.mongoosetech.com