JSP Поле с нижним подчеркиванием

186
30 марта 2018, 12:53

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, одно убрал. В чем может быть дело?

Answer 1

Следует различать понятия поля и свойства.

Как подсказывает википедия

Свойство — способ доступа к внутреннему состоянию объекта, имитирующий переменную некоторого типа. Обращение к свойству объекта выглядит так же, как и обращение к структурному полю (в структурном программировании), но, в действительности, реализовано через вызов функции. При попытке задать значение данного свойства вызывается один метод, а при попытке получить значение данного свойства — другой.

За свойством даже не обязательно стоит какие-то поле класса.
И это очень даже распространённый случай.

В Java не стали придумывать специальный синтаксис для определения свойств. Вместо этого придумали соглашение JavaBean, которое регламентирует названия методов установки, получения значения свойств и соответственно как будут именоваться свойства.

Если у вас есть метод Integer getTheYearOfPublishing(), значит у вас есть свойство theYearOfPublishing.

Пусть даже этот метод такой

public Integer getTheYearOfPublishing() {
    return the_year_of_publishing;
}

Или такой

public Integer getTheYearOfPublishing() {
    return new Random.nextInt();
}

всё равно будет свойство theYearOfPublishing.

В последнем примере не то что название поля не совпадает с название свойства, а вообще всякая чушь.

Все инструменты, фреймвёрки, поддерживающие JavaBean, работают именно с такими свойствами. И JSP в том числе.

Не смотрите как называются поля, смотрите как называются методы.

Answer 2

Jsp обращается к полю через геттер, а не напрямую.

Об этом вам и сообщает exception. Не найдено property с таким именем. Поменяйте имя на theYearOfPublishing именно с маленькой буквы.

В модели может вообще не быть поля, но быть метод getSome(), тогда в jsp можно будет обратиться к полю some

Но в java принято использовать CamelCase для имен. Хотя возможно вы это знаете

Answer 3

Просто замените ${book.the_year_of_publishing} на ${book.theYearOfPublishing}. Expression Language Parser подменит это вызовом book.getTheYearOfPublishing().

READ ALSO
Не видна зависимость, добавленная gradle

Не видна зависимость, добавленная gradle

У меня есть следующий buildgradle файл:

170
Как в java выполнить код через секунду?

Как в java выполнить код через секунду?

ЗдравствуйтеУ меня возник вопрос насчет таймеров в Java, как мне сделать так, чтобы вывод сообщения производился через одну секунду? В инете...

174
Как узнать завершился ли пул потоков ExecutorService?

Как узнать завершился ли пул потоков ExecutorService?

Доброго времени сутокЕсть код:

214
SpringMVC контроллер вызывается 3 раза

SpringMVC контроллер вызывается 3 раза

Доброго времени сутокЕсть код:

188