题
我在使用自定义标签时遇到问题: -
org.apache.jasper.JasperException:/custom_tags.jsp(1,0)无法找到属性的setter方法:firstname
这是我的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方法???
解决方案
检查标记元素中属性的大小写 - 它们应该与setter的大小写相匹配,而不是成员变量的大小写(顺便说一句,它应该是私有的)。
规则是属性名称的首字母大写,然后结果以'set'为前缀,以得到setter名称。
在您的情况下,您已将属性'firstname'
调用,因此该规则会导致JSP编译器查找'setFirstname'方法。当你命名你的setter 'setFirstName'
(大写'N')时,你应该使用'firstName'
(也有一个大写'N')属性名称。
将相同的规则应用于'lastname'
属性,以获得'lastName'
,您应该开始营业。
P.S。使用一个好的IDE,比如 IntelliJ
,在这种情况下会有所帮助,因为它会为你的属性建议有效的名称,为你节省很多时间。
其他提示
你的例子中的TLD文件看起来像废话,我不知道是不是因为你没有正确格式化它。
自定义标记的标记元素应具有属性元素,该元素对应于您要公开的每个属性。类似的东西:
<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>
请注意,默认情况下属性是字符串。这可以通过在属性元素中添加类型元素来覆盖。
不隶属于 StackOverflow