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 中,删除了一个。有什么问题?
Jsp 通过 getter 访问字段,而不是直接访问。
这就是异常告诉您的内容。未找到具有该名称的属性。将名称更改为
theYearOfPublishing
小写。模型可能根本没有字段,但可能有方法
getSome()
,那么在jsp中就可以引用字段some
但是在 java 中,习惯上使用 CamelCase 作为名称。虽然你可能知道
只需替换
${book.the_year_of_publishing}
为${book.theYearOfPublishing}
. 表达式语言解析器将替换为调用book.getTheYearOfPublishing()
.有必要区分字段和属性的概念。
正如维基百科所暗示的
属性后面甚至不一定是类字段。
这是一个非常常见的案例。
Java 并没有提出用于定义属性的特殊语法。相反,他们提出了一个 JavaBean 约定,该约定规范用于设置、获取属性值的方法的名称,以及相应地如何命名属性。
如果你有一个方法
Integer getTheYearOfPublishing()
,那么你就有一个属性theYearOfPublishing
。即使这种方法是
或者像这样
仍然会有财产
theYearOfPublishing
。在最后一个例子中,不是字段名与属性名不匹配,而是各种胡说八道。
所有支持 JavaBean 的工具和框架都只使用这些属性。和 JSP 一样。
不要看字段名,看方法名。