Libreria di tag personalizzati JSP (impossibile trovare il metodo setter per l'attributo)

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

  •  03-07-2019
  •  | 
  •  

Domanda

Sto riscontrando problemi con un tag personalizzato: -

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Impossibile trovare il metodo setter per l'attributo: nome

Questa è la mia 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;
    }


}

Questo è il mio file 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 questa è la mia pagina JSP:

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

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

Ho verificato che il codice sia ricompilato e distribuito correttamente, ecc. ecc.

Quindi, la domanda è: perché non riesce a trovare il metodo setter ???

È stato utile?

Soluzione

Controlla il caso degli attributi nell'elemento tag: dovrebbero corrispondere al caso del setter, non al caso delle variabili membro (che probabilmente dovrebbero essere private, comunque).

La regola è che il nome dell'attributo ha la prima lettera maiuscola e quindi il risultato è preceduto da 'set', per arrivare al nome del setter.

Nel tuo caso, hai chiamato l'attributo 'firstname' , quindi la regola porta il compilatore JSP a cercare il metodo 'setFirstname'. Come hai chiamato il tuo setter 'setFirstName' (con la 'N' maiuscola), dovresti usare 'firstName' (Anche con la 'N' maiuscola) per il nome dell'attributo.

Applica la stessa regola all'attributo 'lastname' , per arrivare a 'lastName' , e dovresti essere in affari.

P.S. L'uso di un buon IDE, come IntelliJ , avrebbe aiutato in questo caso, poiché avrebbe suggerito i nomi validi per i tuoi attributi, risparmiando un sacco di grattacapi.

Altri suggerimenti

Il file TLD nel tuo esempio sembra una sciocchezza, non so se è perché non l'hai formattato correttamente.

L'elemento tag per il tuo tag personalizzato dovrebbe avere un elemento attributo che corrisponde a ciascun attributo che vuoi esporre. Qualcosa del tipo:

<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>

Nota che per impostazione predefinita gli attributi sono Stringhe. Questo può essere ignorato aggiungendo un elemento type all'interno dell'elemento attributo .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top