【问题标题】:JSP custom tag library (Unable to find setter method for the attribute)JSP自定义标签库(找不到属性的setter方法)
【发布时间】:2010-09-18 11:50:23
【问题描述】:

我在使用自定义标签时遇到问题:-

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

【问题讨论】:

  • 如果您使用“代码示例”标签,代码将更具可读性

标签: jsp-tags


【解决方案1】:

检查标签元素中属性的大小写 - 它们应该与 setter 的大小写匹配,而不是成员变量的大小写(顺便说一下,这应该是私有的)。

规则是属性名首字母大写,结果加上'set'前缀,得到setter名。

在您的例子中,您调用了属性'firstname',因此该规则导致JSP 编译器寻找“setFirstname”方法。由于您已将 setter 命名为 'setFirstName'(带有大写“N”),因此您应该使用 'firstName'(也带有大写“N”)作为属性名称。

将相同的规则应用于'lastname' 属性,以到达'lastName',您应该会做生意。

附:在这种情况下,使用像 IntelliJ 这样好的 IDE 会有所帮助,因为它会建议您的属性的有效名称,从而为您省去很多麻烦。

【讨论】:

  • 太棒了.. 它的工作.. 我花了很多时间寻找正确的东西.. 现在我知道确切的错误发生在哪里.. 非常感谢你提供的信息
  • 猜我更新对您上一个问题的回答有点慢。 stackoverflow.com/questions/224637/…
  • 在我的例子中,这是因为我调用了像 aVarname 这样的变量,而那个单个小写字母后跟一个大写字母破坏了事情。
【解决方案2】:

你的例子中的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>

请注意,默认情况下属性是字符串。这可以通过在 attribute 元素中添加 type 元素来覆盖。

【讨论】:

  • 我已经完成了你指定的所有格式。但问题仍然存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2014-05-11
  • 2011-03-09
  • 1970-01-01
  • 2011-12-13
相关资源
最近更新 更多