2008-10-22 5 views
8

Je vais avoir du mal avec une étiquette personnalisée: -JSP bibliothèque de balises personnalisées (Impossible de trouver la méthode setter pour l'attribut)

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Impossible pour trouver la méthode setter pour l'attribut: prenom

Ceci est ma 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; 
    } 


} 

Ceci est mon fichier 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> 

Et voici ma page JSP:

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

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

J'ai vérifié que le code est recompilé et déployé correctement etc etc ....

Ainsi, la question est, pourquoi ne peut-il trouver le méthode de setter ???

+0

Le code serait plus lisible si vous avez utilisé les balises « code exemple » –

Répondre

18

Vérifiez le cas des attributs dans votre élément de balise - ils devraient correspondre à la casse du setter, pas le cas des variables membres (qui devrait probablement être privé, soit dit en passant).

La règle est que le nom de l'attribut a sa première lettre en majuscule et que le résultat est préfixé par 'set', pour arriver au nom du setter.

Dans votre cas, vous avez appelé l'attribut 'firstname'. La règle génère donc le compilateur JSP qui recherche la méthode 'setFirstname'. Comme vous avez nommé votre setter 'setFirstName' (avec un 'N' majuscule), vous devez utiliser 'firstName' (également avec un 'N' majuscule) pour le nom de l'attribut.

Appliquez la même règle à l'attribut 'lastname', pour arriver à 'lastName', et vous devriez être en affaires.

P.S. Utiliser un bon IDE, comme IntelliJ, aurait aidé dans ce cas, car il aurait suggéré les noms valides pour vos attributs, vous épargnant beaucoup de grattage de la tête.

+1

Fantastique .. Son travail .. Je passe beaucoup de temps à chercher la bonne chose .. maintenant je suis où l'erreur exacte se produit .. Merci beaucoup pour votre aimable information –

+0

Votre suggestion de réponse a rectifié mon problème. .. –

+0

Je suppose que j'étais un peu lent à mettre à jour ma réponse à votre dernière question.http://stackoverflow.com/questions/224637/jsp-custom-tag-library-passing-attributes#224690 – LizB

2

Le fichier TLD dans votre exemple ressemble à un non-sens, je ne sais pas si c'est parce que vous ne l'avez pas formaté correctement.

La balise élément tag pour votre commande devrait avoir un élément d'attribut correspondant à chaque attribut que vous souhaitez exposer. Quelque chose comme:

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

Notez que les attributs par défaut sont les chaînes. Cela peut être remplacé en ajoutant un élément de typedans le attribut élément.

+0

Je l'ai fait tout le formatage a u spécifié .. Mais le problème persiste. –

Questions connexes