在jsp中使用jstl访问结果集

时间:2015-03-03 19:29:52

标签: java jsp servlets

我是Servlets/JSP的新手。我已经构建了一个Web应用程序,我根据用户输入查询db并将resultset存储为session属性。 现在,当我尝试使用JSTL标记访问每个给定错误的结果集时。我使用Derby作为我的数据库。 以下是代码段。

<c:forEach var="row" items="${sessionScope.borrow_list.rows}">
        <li>Name : <c:out value="${row.book}" /></li>
        <li>Author : <c:out value="${row.author}" /></li>
</c:forEach>

这是例外。

JspPropertyNotFoundException: /member_home.jsp(20,2) '${sessionScope.borrow_list.rows}' Property 'rows' not found on type org.apache.derby.client.net.NetResultSet42

但是我确实看到了使用上述代码的示例。 我做错了什么或我的db(ResultSet)不支持此功能。

2 个答案:

答案 0 :(得分:0)

从您的代码和错误消息的方式来看,似乎已经给出了borrow_list.rows来自代码的某些位置的会话。但borrow_list并未包含任何名为rows的属性。

希望它会有所帮助 非常感谢。

答案 1 :(得分:0)

执行JDBC语句后,会有一个ResultSet。应该处理该结果集,然后关闭ResultSet和Statement。

这样的事情:

public static class Tb {
    String a;
    int b;
    BigDecimal c;
}

List<Tb> borrowList = new ArrayList<>();

String sql = "SELECT a, b, c FROM tb WHERE a LIKE ? ORDER BY a"
try (PreparedStatement stmt = connection.prepareStatement(sql)) {
    stmt.setString(1, searchKey + "%"); // First ?.
    try (ResultSet rs = stmt.executeQuery()) {
         while (rs.next()) {
             Tb record = new Tb();
             record.a = rs.getString("a");
             record.b = rs.getInt("b");
             record.c = rs.getBigDecimal("c");
             borrowList.add(record);
         }
    } // Closes rs.
} // Closes stmt.

request.setAttribute("borrow_list", borrowList);
getServletContext().getRequestDispatcher("/view.jsp").forward();

在JSP中,您可以正常工作。

在您找到的示例中可能会使用RowSet。尽管ResultSet类似于迭代器,但JdbcRowSet就像一个列表,对数据更重。

属性可以在其他范围内进行操作:请求范围仅适用于此单个请求。

当定义为servlet类的内部类时,使类Tb static。这可以防止存在ServletClass.this在Tb。