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'
, そしてあなたはビジネスをしているはずです。
追伸優れた 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 要素を追加することでオーバーライドできます。