Библиотека пользовательских тегов JSP (Не удалось найти метод установки атрибута)
-
03-07-2019 - |
Вопрос
У меня возникли проблемы с пользовательским тегом:-
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"/>
Я проверил, что код перекомпилирован и развернут правильно и т.д. и т.п....
Итак, вопрос в том, почему он не может найти метод setter???
Решение
Проверьте регистр атрибутов в вашем элементе тега - они должны соответствовать регистру установщика, а не регистру переменных-членов (которые, кстати, вероятно, должны быть частными).
Правило состоит в том, что первая буква имени атрибута пишется заглавной, а затем результат дополняется префиксом "set", чтобы получить имя установщика.
В вашем случае вы вызвали атрибут 'firstname'
, таким образом, правило приводит к тому, что компилятор JSP ищет метод 'setFirstName'.Как вы назвали своего сеттера 'setFirstName'
(с большой буквы "N"), вы должны использовать 'firstName'
(Также с заглавной буквы "N") для имени атрибута.
Примените то же правило к 'lastname'
атрибут, чтобы прийти к 'lastName'
, и вы должны заниматься бизнесом.
P.S.Используя хорошую IDE, например IntelliJ
, помогло бы в этом случае, так как предложило бы допустимые имена для ваших атрибутов, избавив вас от необходимости ломать голову.
Другие советы
Файл 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 .