класса javax.Эль.PropertyNotFoundException: использование JSTL в JSP

у меня есть JSP, где я пытаюсь использовать теги JSTL для отображения данных из экземпляра класса в памяти. Данные состоят из ряда строк, каждая из которых является адресом 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.Эль.PropertyNotFoundException: свойство "rssFeedURLs" не найдено на типе RSSFeedOccurrenceMiner

что правильно, учитывая мое использование наследования. Так может ли кто-нибудь сказать мне, разрешает ли JSTL наследование или что-то отсутствует в моем коде?

Я действительно не хотите использовать сценарий в JSP.

3 ответов


ваш метод getter не следует соглашению об именах JavaBeans. Он должен быть назван getRssFeedURLs (даже если у вас есть аббревиатура, то она должна быть заглавной, как обычное слово). В EL, когда вы указываете имя свойства, это фактически заканчивается вызовом геттера для этого свойства. Чтобы выяснить имя геттера, он заглавной буквой в имени свойства, которое вы предоставили (так rssFeedURLs преобразуется к виду RssFeedURLs) и гвозди на get перед ней. Так что в итоге ты getRssFeedURLs. Однако вы назвали свой метод как getRSSFeedURLs. Java не может найти метод, и поэтому вы получаете PropertyNotFoundException исключения.

если вы не назовете своих геттеров правильно, вы не можете получить к ним доступ с помощью EL.


если имя свойства начинается с двух или более последующих заглавных букв, то к нему также должен быть доступ в EL. Итак, чтобы получить доступ к getter getRSSFeedURLs() вам нужно ${rssfom.RSSFeedURLs}.

это указано в JavaBeans Spec как хорошо.

8.8 капитализация выведенных имен.

когда мы используем шаблоны проектирования для вывода имени свойства или события, нам нужно решить, какие правила для преобразования выведено имя. Если мы извлечь имя из середины нормального mixedCase стиль Java имя, то имя будет, по умолчанию, начинается с заглавной буквы. Программисты Java привыкли к тому, что обычные идентификаторы начинаются с букв нижнего регистра. Энергичный вклад рецензента убедил нас, что мы должны следовать этому же обычному правилу для имен свойств и событий.

таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы нормально преобразовать первый символ в нижнем регистре. однако для поддержки случайного использования всех имена в верхнем регистре, мы проверяем, являются ли первые два символа имени верхним регистром и если так что оставь его в покое. Так, например,

"FooBah" становится "fooBah"
"Z" становится "z"
"Адрес" в "адрес"

мы предоставляем метод Introspector.капитализации, который реализует данное правило преобразования.

JSP EL (язык выражения, те ${} вещи) придерживается спецификации JavaBeans. Таким образом, это не связано конкретно с JSTL (those <c:xxx> теги).


мой 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.Эль.PropertyNotFoundException: свойство "Id" не найдено на типе DocumentPolicyVO

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

пожалуйста, кто-нибудь может объяснить причину.