Estou com um erro na crição de uma taglib e ficaria agradecido se alguem pudesse me dar uma ajuda.
Estou lendo um tutorial sobre taglib e fazendo um testes. Fui fazer um teste para criar uma tab lib de iteração chamada iterate para funcionar de forma similar a da iterate do struts. Escrevi a seguinte classe para a tag lib:
[code]
package tag;
import …
…
…
public class IterateTag implements BodyTag{
Tag parent;
PageContext pageContext;
BodyContent bodyContent;
Collection collection;
Iterator iterator;
String id;
String name;
public IterateTag( ){
}
public int doStartTag( ){
collection = (Collection)pageContext.getRequest( ).getAttribute( name );
if( collection == null ) return SKIP_BODY;
return EVAL_BODY_INCLUDE;
}
public void doInitBody( ){
Object object;
iterator = collection.iterator( );
if( iterator.hasNext( ) ){
object = iterator.next( );
pageContext.getRequest( ).setAttribute( id, object );
}
}
public int doAfterBody( ){
Object object;
if( iterator.hasNext( ) ){
object = iterator.next( );
pageContext.getRequest( ).setAttribute( id, object );
return EVAL_BODY_AGAIN;
}
else{
return SKIP_BODY;
}
}
public int doEndTag( ){
return EVAL_PAGE;
}
public void release( ){
/*Object obj = pageContext.getRequest( ).getAttribute( id );
if( obj != null ){
pageContext.getRequest( ).removeAttribute( id );
}*/
}
public void setId( String id ){
this.id = id;
}
public String getId( ){
return id;
}
public void setName( String name ){
this.name = name;
}
public String getName( ){
return name;
}
public void setParent( Tag parent ){
this.parent = parent;
}
public void setBodyContent( BodyContent bodyContent ){
this.bodyContent = bodyContent;
}
public void setPageContext( PageContext pageContext ){
this.pageContext = pageContext;
}
public Tag getParent( ){
return parent;
}
}[/code]
Criei o arquivo tld:
~<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>hbo</shortname>
<uri>mytag</uri>
<info>My Tag</info>
<tag>
<name>iterate</name>
<tagclass>tag.IterateTag</tagclass>
<bodycontent>jsp</bodycontent>
<info>Iteração para uma Collection</info>
<attribute>
<name>id</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
Mapeei no arquivo xml da aplicação o meu arquivo taglib normal com a uri “mytag”.
Aí criei uma página jsp para fazer um teste, que recebe uma collection de usuários (tipo User que criei) na request e exibe o conteúdo em uma tabela:
<%@page contentType="text/html; charset=ISO-8859-1"%>
<%@taglib uri="mytag" prefix="hbo"%>
<html>
<head><title>TesteTagLib</title>
</head>
<body>
<table>
<hbo:iterate id="user" name="usuarios">
<tr>
<td><jsp:getProperty name="user" property="login"/></td>
<td><jsp:getProperty name="user" property="password"/></td>
</tr>
</hbo:iterate>
</table>
</body>
</html>
A intenção aqui é dada a collection que está na request (como “usuarios”) a tag realiza a iteração dessa collection e a cada iteração
ela coloca o objeto no contexto de request como “user” para eu poder utilizá-lo com getProperty.
Quando eu executo ele exibe a seguinte mensagem: “Attempted a bean operation on a null object”
Pelo que eu entendi ele está tentando pegar um bean (“user”) que está nulo quando executa a tag getProperty.
Já verifiquei e a collection (“usuarios”) está vindo certo na request, então creio que o problema seja com a minha tag.
Só para esclarecer, a minha classe bean do tipo User contém os métodos getters e setters no padrão para eu poder utilizar getProperty (atributos privados “login” e “password” e métodos “getLogin”, “getPassword”, “setLogin” e “setPassword”).
Já verifiquei várias vezes e não consegui encontrar o erro. Como estou começando agora com taglibs acredito que eu esteja cometendo um erro besta e alguém mais experientes possa me ajudar.
obrigado