我想换一个sql:query来查找一些用几个参数构建复杂查询的Java代码。当前的sql是一个简单的选择。
<sql:query var="result" dataSource="${dSource}" sql="select * from TABLE "> </sql:query>
如何使用我的Java ResultSet(即rs = stmt.executeQuery(sql);)并在我的JSP中提供结果,以便我可以使用这个教科书JSP?
为了更清楚,我想删除上面的查询并将其替换为Java。
<% ResultSet rs = stmt.executeQuery(sql); // Messy code will be in some Controller %>
<c:forEach var="row" items="${result.rows}"> <c:out value="${row.name}"/> </c:forEach>
我是否在Java部分设置了session / page变量,或者是否有一些我可以用来访问变量的EL技巧?
答案 0 :(得分:7)
模型(行):
public class Row {
private String name;
// Add/generate constructor(s), getters and setters.
}
DAO:
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;
}
Controller(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>
答案 1 :(得分:1)
您可以从Java代码中设置会话/请求属性。
但是,我建议不使用ResultSet,因为它有一些生命周期问题(即需要关闭)。我建议在Java代码中获取ResultSet对象,迭代它构建,比如说List,关闭ResultSet并将List传递给JSP。
如果您使用的是Spring,那么JdbcTemplates会提供采用SQL字符串和参数并返回List&gt;的方法。查询的结果,这可能非常方便。
答案 2 :(得分:0)
如果您正在使用像spring mvn或struts这样的Web框架,那么您将拥有一个在实际jsp之前执行的控制器类。这可以有一个方法
ResultSet getResult()
此方法将在您的jsp中以$ {result}的形式提供。
如果您没有使用任何这些框架,您仍然可以使用jsp usebean并将javaclass绑定到变量(请参阅usebean文档)。如果将bean用于myBean的变量,则可以使用$ {myBean.result}
访问它最后,您还可以将结果绑定到“其他地方”的请求参数。在这种情况下,您将其称为$ {param.result}
答案 3 :(得分:0)
你没有。
首先,将SQL放入JSP,甚至通过标签,都表明了一种可怕的设计选择。 JSP页面是模型视图控制器模式中的“视图”。它的工作是显示你的模型,除了显示它之外,实际上并没有做任何事情。
在您的控制器类中,执行SQL并检索可以通过JSP显示的实际Java对象。然后,在JSP中显示它们。将SQL留给控制器,让JSP专注于简单地显示数据。您不仅可以清楚地分离关注点,而且您的JSP因此变得更加简单,如果需要完成,则比以后的JSP代码更容易重构Java代码(测试Java要简单得多)代码也是如此。