【问题标题】:Keep Getting PropertyNotFoundException when populating a JSP table with Hashmap Data [duplicate]使用 Hashmap 数据填充 JSP 表时继续获取 PropertyNotFoundException [重复]
【发布时间】:2017-01-25 03:59:31
【问题描述】:

我正在尝试使用 HashMap 的内容填充 JSP 表,但在第一次尝试在 JSP(firstName 属性)中引用它时,我不断收到 PropertyNotFoundExceptions。我尝试使用 var['key'] 和 var.value.key 在 EL 中引用它的方式,每次我得到一个 PropertyNotFoundException。这是我正在使用的代码:

JSP:

<c:forEach var="orders" items="${ orderList }">
            <tr>
                <td class="name">
                    <a href="">${ orders.firstName }</a>
                </td>
                <td>${ orders.date }</td>
                <td>${ orders.product }</td>
                <td>${ orders.comments }</td>
            </tr>
        </c:forEach>

设置属性的Servlet:

FormManager fm = new FormManager();
HashMap hm = fm.getOrder();
request.setAttribute("orderList", hm);

来自 FormManager 类:

public HashMap getOrder() {
        dbm = new DatabaseManager();
        Statement stmt = null;
        String sql = "SELECT * FROM orders";
        HashMap<String, String> itemMap = new HashMap<String, String>();
        String[] keys = { "firstName", "lastName", "phone", "email" , "date", "product", "comments", "id" };

        dbm.setUrl("jdbc:mysql://localhost:3306/pattycakes");
        dbm.connect();
        try {
            stmt = dbm.getConn().createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            ResultSetMetaData rsmd = rs.getMetaData();

            int columns = rsmd.getColumnCount();
            for (int i = 0; i < columns; i++) {
                rs.beforeFirst();
                rs.next();
                itemMap.put(keys[i], rs.getString(i + 1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            dbm.disconnect(stmt, dbm.getConn());
        }
        return itemMap;
    }

到目前为止,该代码可能存在一些问题,因为我仍在为家庭成员编写此代码。我所关心的是如何克服异常。谢谢!

【问题讨论】:

    标签: java jsp servlets


    【解决方案1】:

    JSP 似乎假定orderList 属性将是映射的Collection,但您提供的其他代码显示它被设置为具有String 键和String 值的单个映射,表示单个订单。由于orderListMap,因此通过JSTL foreach 对其进行迭代会产生Map.Entry 的实例,对应于映射中的每个条目。这些条目确实没有firstName 属性,也没有您尝试提取的任何其他属性。

    由于命名不当的orderList 属性实际上只为一个订单提供数据,因此您对它的迭代没有意义。我倾向于认为您为该属性设置了错误的值,但如果它确实是您想要的,那么您可能会按照以下几行使用 JSP 代码显示一个订单:

    <!-- no foreach -->
    <tr>
        <td class="name">
            <a href="">${ orderList["firstName"] }</a>
        </td>
        <td>${ orderList["date"] }</td>
        <td>${ orderList["product"] }</td>
        <td>${ orderList["comments"] }</td>
    </tr>
    

    【讨论】:

    • 感谢您的帮助,我知道我的代码中存在不一致之处,但没有看到。它是地图的集合和订单表。我犯了大错。
    猜你喜欢
    • 2012-05-13
    • 2013-02-01
    • 2012-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多