JSP ругается на поле с нижним подчеркиванием, но информации о том, что так делать нельзя, я не нашел.
Стек Tomcat:
SEVERE: Servlet.service() for servlet [jsp] threw exception
javax.el.PropertyNotFoundException: Property [the_year_of_publishing] not found on type [com.core.newbie.model.Book]
...
21:50:32.693 [http-nio-8080-exec-5] DEBUG
org.springframework.web.servlet.DispatcherServlet - Could not complete request
org.apache.jasper.JasperException: An exception occurred processing [/WEB-
INF/book/showBook.jsp] at line [84]
81: <td><a href="#">${book.name}</a></td>
82: <td>${book.author}</td>
83: <td></td>
84: <td>${book.the_year_of_publishing}</td>
Book.java, часть кода:
public String getPublishingHouse() {
return publishing_house;
}
public void setPublishingHouse(final String publishing_house) {
this.publishing_house = publishing_house == null ? null : publishing_house.trim();
}
public Integer getTheYearOfPublishing() {
return the_year_of_publishing;
}
public void setTheYearOfPublishing(final Integer the_year_of_publishing) {
this.the_year_of_publishing = the_year_of_publishing;
}
На эти оба поля ругается в JSP, одно убрал. В чем может быть дело?
Следует различать понятия поля и свойства.
Как подсказывает википедия
Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.
За свойством даже не обязательно стоит какие-то поле класса.
И это очень даже распространённый случай.
В Java не стали придумывать специальный синтаксис для определения свойств. Вместо этого придумали соглашение JavaBean, которое регламентирует названия методов установки, получения значения свойств и соответственно как будут именоваться свойства.
Если у вас есть метод Integer getTheYearOfPublishing()
, значит у вас есть свойство theYearOfPublishing
.
Пусть даже этот метод такой
public Integer getTheYearOfPublishing() {
return the_year_of_publishing;
}
Или такой
public Integer getTheYearOfPublishing() {
return new Random.nextInt();
}
всё равно будет свойство theYearOfPublishing
.
В последнем примере не то что название поля не совпадает с название свойства, а вообще всякая чушь.
Все инструменты, фреймвёрки, поддерживающие JavaBean, работают именно с такими свойствами. И JSP в том числе.
Не смотрите как называются поля, смотрите как называются методы.
Jsp обращается к полю через геттер, а не напрямую.
Об этом вам и сообщает exception. Не найдено property с таким именем. Поменяйте имя на theYearOfPublishing
именно с маленькой буквы.
В модели может вообще не быть поля, но быть метод getSome()
, тогда в jsp можно будет обратиться к полю some
Но в java принято использовать CamelCase для имен. Хотя возможно вы это знаете
Просто замените ${book.the_year_of_publishing}
на ${book.theYearOfPublishing}
. Expression Language Parser подменит это вызовом book.getTheYearOfPublishing()
.
ЗдравствуйтеУ меня возник вопрос насчет таймеров в Java, как мне сделать так, чтобы вывод сообщения производился через одну секунду? В инете...