JSP biblioteca de tag personalizado (Incapaz de encontrar o método setter para o atributo)

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

  •  03-07-2019
  •  | 
  •  

Pergunta

Estou tendo problemas com uma marca personalizada: -

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Incapaz de encontrar o método setter para o atributo: firstname

Esta é minha classe 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 é meu arquivo 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>

E esta é a minha página JSP:

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

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

Tenho verificado que o código é compilado e implantado corretamente etc etc ....

Assim, a pergunta é, por que não pode encontrar o método setter ???

Foi útil?

Solução

Verifique o caso dos atributos no seu elemento tag -. Eles devem corresponder ao caso do setter, não é o caso das variáveis ??de membro (que provavelmente deve ser privado, por sinal)

A regra é que o nome do atributo tem a sua primeira letra maiúscula e, em seguida, o resultado é prefixado por 'set', para chegar ao nome setter.

No seu caso, você chamou a 'firstname' atributo, portanto, os resultados da regra na o compilador JSP procurando o método 'setFirstName'. Como você nomeou seu 'setFirstName' setter (com um capital 'N'), você deve usar 'firstName' (também com um capital 'N') para o nome do atributo.

Aplicar a mesma regra para o atributo 'lastname', para chegar a 'lastName', e você deve estar no negócio.

P.S. Usando um bom IDE, como IntelliJ, teria ajudado neste caso, uma vez que teria sugerido os nomes válidos para os seus atributos, poupando-lhe um monte de coçar a cabeça.

Outras dicas

O arquivo TLD no seu exemplo olhares como absurdo, eu não sei se é porque você não tiver formatado corretamente.

O tag elemento para o seu tag personalizado deve ter um atributo elemento que corresponde a cada atributo que você deseja expor. 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>

Note que, por padrão atributos são Strings. Isso pode ser substituído pela adição de um tipo elemento dentro do atributo elemento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top