У меня есть 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.el.PropertyNotFoundException: свойство "rssFeedURLs" не найдено для типа RSSFeedOccurrenceMiner
Что правильно, учитывая мое использование наследования. Так может ли кто-нибудь сказать мне, допускает ли JSTL наследование или в моем коде чего-то не хватает?
Я действительно не хочу использовать скриптлет в JSP.
Ответ 1 · рейтинг 23 · Vivin Paliath
Ваш метод получения не соответствует соглашению об именах JavaBeans. Оно должно называться getRssFeedURLs (даже если у вас есть аббревиатура, она должна быть написана с большой буквы, как обычное слово). В EL, когда вы указываете имя свойства, фактически вызывается геттер для этого свойства. Чтобы выяснить имя геттера, он делает первую букву в имени свойства, которое вы указали, заглавной (так что rssFeedURLs преобразуется в RssFeedURLs) и добавляет get к его началу. Таким образом, вы получите getRssFeedURLs. Однако вы назвали свой метод getRSSFeedURLs. Java не может найти метод, поэтому вы получаете исключение PropertyNotFoundException.
Если вы неправильно назовете свои геттеры, вы не сможете получить к ним доступ с помощью EL.
Ответ 2 · рейтинг 11 · BalusC
Если имя свойства начинается с двух или более заглавных букв, то к нему следует обращаться так же и в EL. Итак, для доступа к геттеру getRSSFeedURLs() нужен ${rssfom.RSSFeedURLs}.
Это также указано в спецификации JavaBeans.
8.8 Использование заглавных букв в предполагаемых именах.
Когда мы используем шаблоны проектирования для вывода имени свойства или события, нам нужно решить, каким правилам следует следовать для написания выведенного имени с заглавной буквы. Если мы извлечем имя из середины обычного имени Java в стиле MixCase, то имя по умолчанию будет начинаться с заглавной буквы. Программисты Java привыкли к тому, что обычные идентификаторы начинаются со строчных букв. Энергичный вклад рецензентов убедил нас в том, что мы должны следовать тому же общепринятому правилу для имен свойств и событий.
Таким образом, когда мы извлекаем имя свойства или события из середины существующего имени Java, мы обычно преобразуем первый символ в нижний регистр. Однако для поддержки случайного использования всех имен в верхнем регистре мы проверяем, являются ли первые два символа имени заглавными, и если да, то оставляем их в покое. Так, например,
"FooBah" становится "fooBah"
"Z" становится "z"
"URL" становится "URL"
Мы предоставляем метод Introspector.decapitalize, реализующий это правило преобразования.
JSP EL (язык выражений, эти ${} вещи) придерживается спецификации JavaBeans. Таким образом, это не имеет прямого отношения к JSTL (те теги <c:xxx>).
Ответ 3 · рейтинг -1 · Ankur Mehrotra
Мой ВО имеет следующий код
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: свойство "Id" не найдено для типа DocumentPolicyVO
<select name="settingsListExcludingEnvironmentList" class="selectComboboxCheck">
<c:forEach var="settingsType" items="${settingsListExcludingEnvironmentList}">
<option value="${settingsType.Id}">${settingsType.Name}</option>
</c:forEach>
</select>
Пожалуйста, кто-нибудь может объяснить причину.