2008-10-22 10 views
8

Tengo problemas con una etiqueta personalizada: -biblioteca de etiquetas JSP (No es posible encontrar un método seleccionador para el atributo)

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) No se puede para encontrar un método seleccionador del atributo: Nombre

Ésta es mi clase TagHandler:

package com.cg.tags; 

import javax.servlet.jsp.JspException; 
import javax.servlet.jsp.JspWriter; 
import javax.servlet.jsp.tagext.TagSupport; 

public class NameTag extends TagSupport{ 

    public String firstname; 
    public String lastname; 

    public void setFirstName(String firstname){ 

     this.firstname=firstname; 
     } 
    public void setLastName(String lastname){ 

     this.lastname=lastname; 
     } 

    public int doStartTag() throws JspException { 
     try { 
      JspWriter out=pageContext.getOut(); 
      out.println("First name: "+firstname+ "Last name: "+lastname); 

     } catch (Exception ex) { 
      throw new JspException("IO problems"); 
     } 
     return SKIP_BODY; 
    } 


} 

Este es mi archivo TLD:

?xml version="1.0" encoding="UTF-8"?> 
<taglib> 
    <tlibversion>1.1</tlibversion> 
    <jspversion>1.1</jspversion> 
    <shortname>utility</shortname> 
    <uri>/WEB-INF/nametagdesc.tld</uri> 
    <info> 
     A simple tag library for the examples 
    </info> 
    <tag> 
     <name>name</name> 
     <tagclass>com.cg.tags.NameTag</tagclass> 
     <bodycontent>empty</bodycontent> 
     <attribute> 
     <name>firstname</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
     </attribute> 
     <attribute> 
     <name>lastname</name> 
     <required>true</required> 
     <rtexprvalue>true</rtexprvalue> 
    </attribute> 
</tag> 
</taglib> 

Y esta es mi página JSP:

<%@ taglib uri="/WEB-INF/nametagdesc.tld" prefix="cg" %> 

<cg:name firstname="fname" lastname="lname"/> 

He comprobado que el código se vuelve a compilar y desplegado correctamente, etc, etc ....

Entonces, la pregunta es, por qué no puede encontrar el método setter ???

+0

El código sería más legible si utilizó las etiquetas "Code Sample" –

Respuesta

18

Compruebe el caso de los atributos en su elemento de etiqueta: deben coincidir con el caso del colocador, no el caso de las variables miembro (que, por cierto, deberían ser privadas).

La regla es que el nombre del atributo tiene su primera letra en mayúscula y luego el resultado está prefijado por 'conjunto', para llegar al nombre del colocador.

En su caso, ha llamado al atributo 'firstname', por lo que la regla da como resultado el compilador JSP que busca el método 'setFirstname'. Como ha llamado a su setter 'setFirstName' (con una "N" mayúscula), debe usar 'firstName' (también con una "N" mayúscula) para el nombre del atributo.

Aplica la misma regla al atributo 'lastname', para llegar al 'lastName', y deberías estar en el negocio.

P.S. Usar un IDE bueno, como IntelliJ, habría sido útil en este caso, ya que habría sugerido los nombres válidos para sus atributos, lo que le ahorraría muchos arañazos en la cabeza.

+1

Fantástico ... Funciona ... Dedico mucho tiempo a buscar lo correcto ... ahora llego donde está pasando el error exacto ... Muchas gracias por su amable información –

+0

La respuesta que ha sugerido rectificó mi problema. .. –

+0

Supongo que fui un poco lento actualizando mi respuesta a tu última pregunta.http://stackoverflow.com/questions/224637/jsp-custom-tag-library-passing-attributes#224690 – LizB

2

El archivo TLD en su ejemplo parece una tontería, no sé si es porque no lo ha formateado correctamente.

La etiqueta elemento para su etiqueta personalizada debe tener un elemento deatributo que corresponde a cada atributo que desea exponer. Algo como:

<tag> 
    <name>...</name> 
    <tag-class>...</tag-class> 
    <body-content>...</body-content> 
    <display-name>...</display-name> 
    <description>...</description> 

    <attribute> 
    <name>firstName</name> 
    <required>true</required> 
    <rtexprvalue>true</rtexprvalue> 
    <description>...</description> 
    </attribute> 
</tag> 

Tenga en cuenta que los atributos predeterminados son Cadenas. Esto puede anularse agregando un elemento tipo dentro del elemento de atributo.

+0

He hecho todo el formateo que ha especificado ... Pero el problema persiste. –

Cuestiones relacionadas