【问题标题】:How to iterate through ResultSet from JSP file?如何从 JSP 文件中迭代 ResultSet?
【发布时间】:2014-08-11 09:35:33
【问题描述】:

我在 servlet 文件中有一个简单的语句,它将通过数据库并获取结果集

ResultSet AssignmentList = stmt.executeQuery("SELECT * FROM Assignments WHERE " + projectID + "= Pid;");
request.setAttribute("assignmentList", AssignmentList);

如您所见,我将ResultSet 发送到JSP 文件。在那个 JSP 文件中,我尝试像这样遍历它。

<table class="CSSTableGenerator">
    <thead>
    <tr>
        <th>Aid</th>
        <th>Title</th>
        <th>Task</th>
        <th>ID of User Responsible</th>
    </tr>
    </thead>
    <tbody>

    <c:forEach items="${assignmentList}" var="item">
        <tr>
            <td>${item.Aid}</td>
            <td>${item.Title}</td>
            <td>${item.Task}</td>
            <td> ${item.UserID}</td>            
        </tr>
    </c:forEach>

    </tbody>
</table>

但是当我这样做时,我得到一个错误。 我是否想以错误的方式进行迭代,还是无法通过 ResultSet 进行迭代。

【问题讨论】:

  • A ResultSet 没有实现 Iterable。此外,这些字段不是 bean 属性。您需要将结果复制到某种值对象中(您是否有 Item Bean 类)?
  • 顺便说一句,您的查询以SQL Injection为准
  • 搜索项目1; DROP TABLE Assignments; --

标签: java sql jsp servlets resultset


【解决方案1】:

在 JSP 中的某个地方有一个名为 Results 的类,它完全可以满足您的需要。您从 ResultSet 构造它,您可以关闭 ResultSet 和连接,Results 有一个 Iterable 行数组,这些行本身就是映射。

【讨论】:

  • 这很酷。结果集 rs = statement.executeQuery(sql);结果结果 = ResultSupport.toResult(rs); request.setAttribute("columnNames", Arrays.asList(result.getColumnNames())); request.setAttribute("rows", Arrays.asList(result.getRows()));
    ${columnNames}
    ${rows}
【解决方案2】:

读取ResultSet后,我们需要关闭数据库连接。因为在 JSP 中读取了 ResultSet,所以只能在 JSP 中关闭连接。在我看来,这不是一个好习惯。

在 servlet 中查询数据库后,读取 ResultSet,将结果存储在 List 中,然后关闭数据库连接。然后,将此列表传递给请求属性中的 JSP。您的 JSP 使用 EL 从请求属性中检索列表。你可以使用 JSTL 来遍历这个 List。

【讨论】:

    【解决方案3】:

    您可以尝试使用专为访问 JSP 页面中的数据库而设计的 SQL Tag Library

    我已经分享了@98​​7654322@) 的方法以及可能对您有所帮助的示例代码。

    逻辑: 只需在 Servlet 中从数据库中获取数据,并将数据填充到 POJO 类中,并将所有记录的最终列表设置为请求属性,最后将请求转发到 JSP 页面.

    【讨论】:

      【解决方案4】:

      假设您有一个相当标准的ItemBean(我将所有内容都设为字符串,除了 projectId)。然后,我可能会在像这样的 DAO 辅助方法中从 PreparedStatement 开始

      private static List<ItemBean> queryForItems(
          Connection conn, int projectId) {
        PreparedStatement ps = null;
        ResultSet rs = null;
        // The Query is using a bind parameter
        final String ITEM_SQL = "SELECT * FROM Assignments WHERE Pid = ?";
      
        // This is the Diamond Operator... if pre Java 7, use new ArrayList<ItemBean>();
        List<ItemBean> al = new ArrayList<>();
        try {
          // Prepare the statement
          ps = conn.prepareStatement(ITEM_SQL);
          ps.setInt(1, projectId); // <-- bind the parameter
          rs = ps.executeQuery();
          while (rs.next()) { // <-- "Iterate" the ResultSet
            ItemBean ib = new ItemBean();
            ib.setPid(projectId);
            ib.setAid(rs.getString("Aid"));
            ib.setTitle(rs.getString("Title"));
            ib.setTask(rs.getString("Task"));
            ib.setUserId(rs.getString("UserID"));
          }
        } catch (SQLException se) {
          System.err.println("Error with " + ITEM_SQL + " and projectId = " + projectId);
          se.printStackTrace(System.err);
        } finally {
          // Clean up!
          try {
            rs.close();
          } catch (SQLException ignored) {
          }
          try {
            ps.close();
          } catch (SQLException ignored) {
          }
        }
        return al;
      }
      

      【讨论】:

        猜你喜欢
        • 2020-06-23
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2013-03-13
        • 2019-05-01
        • 2023-04-05
        • 1970-01-01
        • 2018-01-17
        相关资源
        最近更新 更多