【问题标题】:How do I make a Java ResultSet available in my jsp? [duplicate]如何使 Java ResultSet 在我的 jsp 中可用? [复制]
【发布时间】:2010-09-27 21:42:52
【问题描述】:

我想将 sql:query 替换为一些 Java 代码,该代码构建具有多个参数的复杂查询。当前的sql是一个简单的select。

查询>

我如何获取我的 Java ResultSet(即 rs = stmt.executeQuery(sql);)并在我的 JSP 中提供结果,以便我可以使用这个教科书 JSP?

为了更清楚,我想删除上面的查询并用Java替换它。

我是在 Java 部分设置会话/页面变量,还是可以使用一些 EL 技巧来访问该变量?

【问题讨论】:

  • 多么可悲的是,所有的答案都向各个方向发展,但只是回答了问题。我在做J2EE的时候问过同样的问题并回答过,但我不记得了。可能没有办法让标签使用你的 rs 变量,但我认为有办法。

标签: java jsp jdbc jstl


【解决方案1】:

模型(行):

public class Row { 
    private String name;
    // Add/generate constructor(s), getters and setters.
}

道:

public List<Row> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Row> rows = new ArrayList<Row>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            Row row = new Row();
            row.setName(resultSet.getString("name"));
            // ...
            rows.add(row);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return rows;
}

控制器(servlet):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        List<Row> rows = someDAO.list();
        request.setAttribute("rows", rows);
    } catch (SQLException e) {
        request.setAttribute("error", "Retrieving rows failed.");
        e.printStackTrace();
    }
    request.getRequestDispatcher("page.jsp").forward(request, response);
}

查看(page.jsp):

<c:forEach items="${rows}" var="row">
    <c:out value="${row.name}" />
    ...
</c:forEach>
<c:if test="${not empty error}">Error: ${error}</c:if>

【讨论】:

    【解决方案2】:

    您从 Java 代码中设置了会话/请求属性。

    但是,我建议不要使用 ResultSet,因为它存在一些生命周期问题(即需要关闭)。我建议在 Java 代码中获取 ResultSet 对象,对其进行迭代构建,比如说一个 List,关闭 ResultSet 并将 List 传递给 JSP。

    如果您使用的是 Spring,JdbcTemplates 提供的方法接受一个 SQL 字符串和参数并返回一个带有查询结果的 List>,这可能会非常方便。

    【讨论】:

    • 在 JSP 中使用 ResultSet 没有任何问题,只要用户在 try / catch / finally 之外声明它及其 PreparedStatement 并确保关闭并清空最后。
    【解决方案3】:

    如果您使用的是诸如 spring mvn 或 struts 之类的 Web 框架,则您有一个控制器类,它在实际的 jsp 之前执行。这可以有一个方法

    ResultSet getResult()
    

    此方法将在您的 jsp 中以 ${result} 的形式提供。

    如果您不使用这些框架中的任何一个,您仍然可以使用 jsp usebean 并将 javaclass 绑定到变量(查看 usebean 文档)。如果您使用 bean 到 myBean 的变量,您可以使用 ${myBean.result}

    访问它

    最后,您还可以将结果绑定到“其他地方”的请求参数。在这种情况下,您将其称为 ${param.result}

    【讨论】:

      【解决方案4】:

      你没有。

      首先,将 SQL 放到 JSP 中,即使是通过标签,也意味着一个糟糕的设计选择。 JSP 页面是模型视图控制器模式中的“视图”。它的工作是展示你的模型,除了展示它,它实际上并没有做任何事情。

      在您的控制器类中,执行您的 SQL 并检索可以通过 JSP 显示的实际 Java 对象。然后,在您的 JSP 中显示它们。将 SQL 留给控制器,让 JSP 专注于简单地显示数据。您不仅获得了清晰的关注点分离,而且您的 JSP 也因此变得更加简单,并且如果需要重构 Java 代码,那么以后重构 Java 代码比 JSP 代码容易得多(测试 Java 要简单得多)代码)。

      【讨论】:

      • 我没有要求上 MVC 的课程,我问的是如何解决我在 JSP 代码中遇到的特定问题。我们可能都应该为 squeak.org">Squeak</a> 和 Seaside 转储 Java/JSP,但有时我们只是想完成工作。
      猜你喜欢
      • 2017-01-23
      • 2016-05-28
      • 2018-01-17
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      • 2023-03-05
      • 2012-10-06
      • 1970-01-01
      相关资源
      最近更新 更多