Библиотека пользовательских тегов JSP (невозможно найти метод установки для атрибута)

У меня проблемы с настраиваемым тегом: -

org.apache.jasper.JasperException: /custom_tags.jsp(1,0) Невозможно найти метод установки для атрибута: имя

Это мой класс 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;
    }


}

Это мой файл 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>

А это моя страница JSP:

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

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

Я проверил, что код перекомпилирован и правильно развернут и т. Д. И т. Д.

Итак, вопрос, почему он не может найти метод установки ???


person Vinayak Bevinakatti    schedule 22.10.2008    source источник
comment
Код был бы более читабельным, если бы вы использовали теги Code Sample.   -  person Chris Kimpton    schedule 22.10.2008


Ответы (2)


Проверьте регистр атрибутов в вашем элементе тега - они должны соответствовать регистру установщика, а не регистру переменных-членов (которые, кстати, должны быть частными).

Согласно правилу, первая буква имени атрибута должна начинаться с заглавной буквы, а затем к результату добавляется префикс «набор», чтобы получить имя установщика.

В вашем случае вы вызвали атрибут 'firstname', поэтому правило приводит к тому, что компилятор JSP ищет метод setFirstname. Поскольку вы назвали свой установщик 'setFirstName' (с заглавной буквы «N»), вы должны использовать 'firstName' (также с заглавной буквой «N») в качестве имени атрибута.

Примените то же правило к атрибуту 'lastname', чтобы получить 'lastName', и у вас должен быть бизнес.

P.S. В этом случае помогло бы использование хорошей IDE, такой как IntelliJ, поскольку она предложила бы допустимые имена для ваших атрибутов, избавив вас от лишней головной боли.

person belugabob    schedule 22.10.2008
comment
Потрясающе .. Это работает .. Я трачу много времени на поиск нужной вещи .. теперь я понял, где именно происходит ошибка .. Большое спасибо за вашу любезную информацию - person Vinayak Bevinakatti; 22.10.2008
comment
Думаю, я немного медленно обновлял свой ответ на ваш последний вопрос. stackoverflow.com/questions/ 224637 / - person LizB; 23.10.2008
comment
В моем случае это произошло из-за того, что я вызвал переменную типа aVarname, и эта единственная строчная буква, за которой следует заглавная, сломала ситуацию. - person reallynice; 07.03.2018

Файл TLD в вашем примере выглядит чепухой, я не знаю, потому что вы неправильно его отформатировали.

Элемент tag для вашего пользовательского тега должен иметь элемент attribute, который соответствует каждому атрибуту, который вы хотите раскрыть. Что-то типа:

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

Обратите внимание, что по умолчанию атрибуты - это строки. Это можно изменить, добавив элемент type в элемент attribute.

person John Topley    schedule 22.10.2008
comment
Я выполнил все форматирование, указанное в u .. Но проблема все еще сохраняется. - person Vinayak Bevinakatti; 22.10.2008