JSP カスタム タグ ライブラリ (属性のセッター メソッドが見つかりません)

StackOverflow https://stackoverflow.com/questions/224748

  •  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', そしてあなたはビジネスをしているはずです。

追伸優れた 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>

デフォルトでは、属性は文字列であることに注意してください。これは、 attribute 要素内に type 要素を追加することでオーバーライドできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top