10

クラスのメモリ内インスタンスからデータを表示するために JSTL タグを使用しようとしている JSP があります。データは一連の文字列で構成され、各文字列は RSS フィードのアドレスです。

JSP には、次のコードがあります。

<table border = "1">
    <tr>
        <c:forEach var = "rssFeedURL" items = "${rssfom.rssFeedURLs}">
            <td align = "left">${rssFeedURL}</td>
        </c:forEach>
    </tr>
</table>

基本的に、rssfom は次のクラスのインスタンスです。

public class RSSFeedOccurrenceMiner extends RSSFeedMiner {

   private HashMap<String, Counter> keywordFrequencies;

   public RSS_Feed_OccurrenceMiner() {
      super();
      this.keywordFrequencies = new HashMap();
   }
   ...
}

これは、次の変数とメソッドを含むクラス RSSFeedMiner から継承します。

private ArrayList<String> rssFeedURLs;

public ArrayList<String> getRSSFeedURLs() {
    return rssFeedURLs;
}

public void setRSSFeedURLs(ArrayList<String> rssFeedURLs) {
    this.rssFeedURLs = rssFeedURLs;
}

したがって、JSP では、上記のコードを使用できると思っていましたが、ページを実行すると、空のテーブルを受け取るだけです。サーバーログには、次のメッセージが表示される傾向があります。

javax.el.PropertyNotFoundException: プロパティ 'rssFeedURLs' がタイプ RSSFeedOccurrenceMiner で見つかりません

私の継承の使用を考えると、これは正しいです。JSTL で継承が許可されているかどうか、またはコードに何かが欠けているかどうかを教えてもらえますか?

JSP でスクリプトレットを使用したくありません。

4

3 に答える 3

23

getterメソッドは、JavaBeansの命名規則に従っていません。名前を付ける必要がありますgetRssFeedURLs(頭字語がある場合でも、通常の単語のように大文字にする必要があります)。ELでは、プロパティ名を指定すると、実際にはそのプロパティのゲッターを呼び出すことになります。ゲッターの名前を理解するために、指定したプロパティ名の最初の文字を大文字にして(rssFeedURLs変換されますRssFeedURLs)、getその前に貼り付けます。したがって、最終的にはgetRssFeedURLs。ただし、メソッドに。という名前を付けていますgetRSSFeedURLs。Javaはメソッドを見つけることができないため、PropertyNotFoundException例外が発生します。

ゲッターに正しく名前を付けないと、ELでゲッターにアクセスできません。

于 2010-11-07T16:40:58.080 に答える
11

プロパティ名が 2 つ以上の大文字で始まる場合、EL でも同様にアクセスする必要があります。getRSSFeedURLs()したがって、必要なゲッターにアクセスするには${rssfom.RSSFeedURLs}.

それはJavaBeans Specでも指定されています。

8.8 推測された名前の大文字化。

デザイン パターンを使用してプロパティまたはイベント名を推測する場合、推測された名前を大文字にするために従うべき規則を決定する必要があります。通常の混合ケース スタイルの Java 名の途中から名前を抽出すると、名前はデフォルトで大文字で始まります。Java プログラマーは、通常の識別子が小文字で始まることに慣れています。精力的なレビュアーの意見により、プロパティとイベントの名前については、これと同じ従来のルールに従う必要があると確信しました。

したがって、既存の Java 名の途中からプロパティまたはイベント名を抽出する場合、通常は最初の文字を小文字に変換します。ただし、すべて大文字の名前を時折使用できるようにするため、名前の最初の 2 文字が両方とも大文字かどうかを確認し、大文字の場合はそのままにしておきます。たとえば、

「FooBah」は「fooBah」になります<br>「Z」は「z」になります<br>「URL」は「URL」になります

この変換規則を実装するメソッド Introspector.decapitalize を提供します。

JSP EL (式言語など${}) は JavaBeans 仕様に準拠しています。したがって、これは特に JSTL (これらの<c:xxx>タグ) とは関係ありません。

于 2010-11-07T17:19:04.917 に答える
-1

私のVOには次のコードがあります

 public class DocumentPolicyVO {
          @JsonProperty("Id")
            private String Id;
            @JsonProperty("Id")
            public String getId() {
                return Id;
            }
     @JsonProperty("Id")
            public void setId(String Id) {
                this.Id = Id;
            }
    }

以下のようにjspページでアクセスしようとすると、次のエラーが発生します javax.el.PropertyNotFoundException: Property 'Id' not found on type DocumentPolicyVO

<select name="settingsListExcludingEnvironmentList" class="selectComboboxCheck">
                                                  <c:forEach var="settingsType" items="${settingsListExcludingEnvironmentList}">
                                                      <option value="${settingsType.Id}">${settingsType.Name}</option>
                                                  </c:forEach>
                                        </select>

どなたか理由を教えてください。

于 2016-06-09T06:11:56.393 に答える