Biblioteca de etiquetas personalizadas JSP (No se puede encontrar el método de establecimiento para el atributo)

StackOverflow https://stackoverflow.com/questions/224748

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo problemas con una etiqueta personalizada: -

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) No se puede encontrar el método de establecimiento para el atributo: primer nombre

Esta es mi clase de 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 ha compilado e implementado correctamente, etc., etc.

Entonces, la pregunta es, ¿por qué no puede encontrar el método de establecimiento ???

¿Fue útil?

Solución

Verifique el caso de los atributos en su elemento de etiqueta: deben coincidir con el caso del establecedor, no con el caso de las variables miembro (lo que probablemente debería ser privado, por cierto).

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

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

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

P.S. El uso de un buen IDE, como IntelliJ , hubiera ayudado en este caso, ya que habría sugerido los nombres válidos para sus atributos, ahorrándole una gran cantidad de rascarse la cabeza.

Otros consejos

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

El elemento tag para su etiqueta personalizada debe tener un elemento attribute que corresponda a cada atributo que desee 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, por defecto, los atributos son cadenas. Esto puede anularse agregando un elemento tipo dentro del elemento atributo .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top