tags:

views:

1928

answers:

3

I'm having trouble with a custom tag:-

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Unable to find setter method for attribute : firstname

This is my TagHandler class:

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( "Frist name:  "+firstname+ "Last name: "+lastname);

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


}

This is my TLD file:

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

And this is my JSP page:

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

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

I have checked that the code is recompiled and deployed correctly etc etc....

So, the question is , why can't it find the setter method???

A: 

The TLD file in your example looks like nonsense, I don't know if it's because you've not formatted it correctly.

The tag element for your custom tag should have an attribute element that corresponds to each attribute you want to expose. Something like:

<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 that by default attributes are Strings. This can be overridden by adding a type element within the attribute element.

John Topley
I have done all the formatting has u specified..But the problem still persists.
Vinayak.B
+3  A: 

Check the case of the attributes in your tag element - they should match the case of the setter, not the case of the member variables (Which should probably be private, by the way).

The rule is that the attribute name has its first letter capitalised and then the result is prefixed by 'set', to arrive at the setter name.

In your case, you've called the attribute 'firstname', so the rule results in the the JSP compiler looking for the 'setFirstname' method. As you've named your setter 'setFirstName' (with a capital 'N'), you should use 'firstName' (Also with a capital 'N') for the attribute name.

Apply the same rule to the 'lastname' attribute, to arrive at 'lastName', and you should be in business.

P.S. Using a good IDE, like IntelliJ, would have helped in this case, as it would have suggested the valid names for you attributes, saving you a lot of head scratching.

belugabob
Fantastic.. Its working.. I spend a lot of time in searching the right thing.. now I got where the exact mistake is happening..Thank you very much for u kind information
Vinayak.B
Would you mind accepting my answer as the correct one, please?
belugabob
Your suggested answer rectified my problem...
Vinayak.B
guess I was a little slow updating my response to your last question. http://stackoverflow.com/questions/224637/jsp-custom-tag-library-passing-attributes#224690
ShaneB
A: 

Thanks a lot @belugabob

it worked for me...

there was spelling mistake when defining the variable in taghandler class..

the first letter of private variable in taghandler class should be small..