我是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)不支持此功能。
答案 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。