【问题标题】:JSP - error java.lang.String does not have propertyJSP - 错误 java.lang.String 没有属性
【发布时间】:2015-03-12 21:50:10
【问题描述】:

我仍然收到此错误:

org.apache.jasper.JasperException:javax.el.PropertyNotFoundException:类“java.lang.String”没有属性“motoId”。

但我已经创建了 setter 和 getter。

这是我的简单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>

这里有 setter 和 getter 类:

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,但我不知道在哪里。感谢帮助。

【问题讨论】:

  • 不是说这是问题,但我注意到没有setMotoId
  • 当“motoId”是int 时,错误提到String 属性似乎很奇怪。 MotoBO.getAll() 背后的代码是什么?
  • 我知道但现在是个问题,我不想设置 MotoId,它在做 sql。
  • MotoBo.getAll() 有这个代码:public static List&lt;MotorBykes&gt; getAll() { List&lt;MotorBykes&gt; ret; MotoDAO dao = new MotoDAO(); dao.open(); ret = dao.getAll(); dao.close(); return ret; }

标签: java jsp jstl


【解决方案1】:

问题出在这一行:

<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 视图中删除 &lt;c:set&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-09
    • 2011-11-11
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 2011-12-01
    相关资源
    最近更新 更多