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>