JSP - 错误 java.lang.String 没有 属性
JSP - error java.lang.String does not have property
我仍然收到此错误:
org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: The class 'java.lang.String' does not have the property 'motoId'.
但我已经创建了 setters 和吸气剂。
这是我的简单 jsp 代码:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:set var="list" value=" <%=eng.selectFromDb.appLayer.MotoBO.getAll() %> " />
<table>
<tr>
<th>ID</th>
<th>Značka</th>
<th>Model</th>
<th>Kategoria</th>
<th>Objem</th>
<th>Maximalna rychlost</th>
</tr>
<c:forEach var= "moto" items=" ${list} " >
<tr>
<td>${moto.motoId}</td>
<td>${moto.znacka}</td>
<td>${moto.Model}</td>
<td>${moto.Kategoria}</td>
<td>${moto.Objem}</td>
<td>${moto.Max_rychlost}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
并且 class 与 setter 和 getters 在这里:
public class MotorBykes {
static final int EMPTY_ID = -1;
private int motoId = EMPTY_ID;
private String znacka;
private String model;
private String kategoria;
private int objem;
private int max_rychlost;
public MotorBykes(String znacka, String model, String kategoria, int objem, int max_rychlost) {
this.znacka = znacka;
this.model = model;
this.kategoria = kategoria;
this.objem = objem;
this.max_rychlost = max_rychlost;
}
public MotorBykes(int motoId, String znacka, String model, String kategoria, int objem, int max_rychlost) {
this.motoId = motoId;
this.znacka = znacka;
this.model = model;
this.kategoria = kategoria;
this.objem = objem;
this.max_rychlost = max_rychlost;
}
public int getMotoId() {
return motoId;
}
public String getZnacka() {
return znacka;
}
public void setZnacka(String znacka) {
this.znacka = znacka;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getKategoria() {
return kategoria;
}
public void setKategoria(String kategoria) {
this.kategoria = kategoria;
}
public int getObjem() {
return objem;
}
public void setObjem(int objem) {
this.objem = objem;
}
public int getMax_rychlost() {
return max_rychlost;
}
public void setMax_rychlost(int max_rychlost) {
this.max_rychlost = max_rychlost;
}
@Override
public String toString() {
return "MotorBykes{" + "motoId=" + motoId + ", znacka=" + znacka + ", model=" + model + ", kategoria=" + kategoria + ", objem=" + objem + ", max_rychlost=" + max_rychlost + '}';
}
}
dao.getAll() 的后面是:
ensureOpenConnection();
List<MotorBykes> ret = new ArrayList<>();
String textSql = "SELECT * FROM motobykes";
try {
PreparedStatement ps = connection.prepareCall(textSql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
int motoId = rs.getInt(1);
String znacka = rs.getString(2);
String model = rs.getString(3);
String kategoria = rs.getString(4);
int objem = rs.getInt(5);
int max_rychlost = rs.getInt(6);
MotorBykes moto = new MotorBykes(motoId, znacka, model, kategoria, objem, max_rychlost);
ret.add(moto);
}
rs.close();
ps.close();
} catch (SQLException ex) {
processException("Failed to get all motos", ex);
}
return ret;
我知道问题出在 jstl 上,但我不知道出在哪里。感谢帮助。
这一行有问题:
<c:set var="list" value=" <%=eng.selectFromDb.appLayer.MotoBO.getAll() %> " />
您不能在 JSTL 属性中使用 scriptlet 表达式。您根本不应该使用 scriptlet 表达式。应该在 Java 中从控制器访问数据库。结果(模型)应该存储在请求属性中,以便视图访问和显示它。这就是MVC的基本原理。
将以下代码放入您的控制器(例如 servlet)中:
List<MotorBykes> list = MotoBO.getAll();
request.setAttribute("list", list);
从您的 JSP 视图中删除 <c:set>
。
我仍然收到此错误:
org.apache.jasper.JasperException: javax.el.PropertyNotFoundException: The class 'java.lang.String' does not have the property 'motoId'.
但我已经创建了 setters 和吸气剂。
这是我的简单 jsp 代码:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<c:set var="list" value=" <%=eng.selectFromDb.appLayer.MotoBO.getAll() %> " />
<table>
<tr>
<th>ID</th>
<th>Značka</th>
<th>Model</th>
<th>Kategoria</th>
<th>Objem</th>
<th>Maximalna rychlost</th>
</tr>
<c:forEach var= "moto" items=" ${list} " >
<tr>
<td>${moto.motoId}</td>
<td>${moto.znacka}</td>
<td>${moto.Model}</td>
<td>${moto.Kategoria}</td>
<td>${moto.Objem}</td>
<td>${moto.Max_rychlost}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
并且 class 与 setter 和 getters 在这里:
public class MotorBykes {
static final int EMPTY_ID = -1;
private int motoId = EMPTY_ID;
private String znacka;
private String model;
private String kategoria;
private int objem;
private int max_rychlost;
public MotorBykes(String znacka, String model, String kategoria, int objem, int max_rychlost) {
this.znacka = znacka;
this.model = model;
this.kategoria = kategoria;
this.objem = objem;
this.max_rychlost = max_rychlost;
}
public MotorBykes(int motoId, String znacka, String model, String kategoria, int objem, int max_rychlost) {
this.motoId = motoId;
this.znacka = znacka;
this.model = model;
this.kategoria = kategoria;
this.objem = objem;
this.max_rychlost = max_rychlost;
}
public int getMotoId() {
return motoId;
}
public String getZnacka() {
return znacka;
}
public void setZnacka(String znacka) {
this.znacka = znacka;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public String getKategoria() {
return kategoria;
}
public void setKategoria(String kategoria) {
this.kategoria = kategoria;
}
public int getObjem() {
return objem;
}
public void setObjem(int objem) {
this.objem = objem;
}
public int getMax_rychlost() {
return max_rychlost;
}
public void setMax_rychlost(int max_rychlost) {
this.max_rychlost = max_rychlost;
}
@Override
public String toString() {
return "MotorBykes{" + "motoId=" + motoId + ", znacka=" + znacka + ", model=" + model + ", kategoria=" + kategoria + ", objem=" + objem + ", max_rychlost=" + max_rychlost + '}';
}
}
dao.getAll() 的后面是:
ensureOpenConnection();
List<MotorBykes> ret = new ArrayList<>();
String textSql = "SELECT * FROM motobykes";
try {
PreparedStatement ps = connection.prepareCall(textSql);
ResultSet rs = ps.executeQuery();
while(rs.next()){
int motoId = rs.getInt(1);
String znacka = rs.getString(2);
String model = rs.getString(3);
String kategoria = rs.getString(4);
int objem = rs.getInt(5);
int max_rychlost = rs.getInt(6);
MotorBykes moto = new MotorBykes(motoId, znacka, model, kategoria, objem, max_rychlost);
ret.add(moto);
}
rs.close();
ps.close();
} catch (SQLException ex) {
processException("Failed to get all motos", ex);
}
return ret;
我知道问题出在 jstl 上,但我不知道出在哪里。感谢帮助。
这一行有问题:
<c:set var="list" value=" <%=eng.selectFromDb.appLayer.MotoBO.getAll() %> " />
您不能在 JSTL 属性中使用 scriptlet 表达式。您根本不应该使用 scriptlet 表达式。应该在 Java 中从控制器访问数据库。结果(模型)应该存储在请求属性中,以便视图访问和显示它。这就是MVC的基本原理。
将以下代码放入您的控制器(例如 servlet)中:
List<MotorBykes> list = MotoBO.getAll();
request.setAttribute("list", list);
从您的 JSP 视图中删除 <c:set>
。