我对网络开发很新,所以忍受我=)
好的,这是我正在使用的技术堆栈 SQL Server 2008 R2, Tomcat Server 6.0, Java 1.6, jQuery的,
这是我的问题。
我需要运行一堆报告类型查询,我需要将这些结果显示为JSP页面上的一个表供用户查看。我遇到的问题是如何执行此操作的方法。
大多数在线示例显示将查询结果存储在ResultSet中,并将其放入带有JavaBeans setter / getters的ArrayList中,然后在JSP中调用该Arraylist。
另一个问题是,所有这些查询都有不同的列标题,这些示例没有显示如何动态创建列标题(大多数示例都是硬编码的)。
以下是我到目前为止生成报告的示例:
//inside the servlet and sets stuff inside a JavaBean
public List<ClaimInfoBean> getClaimInfo() throws SQLException {
List<ClaimInfoBean> claimList = new ArrayList<ClaimInfoBean>();
while (results.next()) {
ClaimInfoBean claim = new ClaimInfoBean();
claim.setClaimNum(results.getString(1));
//set more stuff for the bean
}
claimList.add(claim);
}
在JSP页面上
//scriptlet (I know this isnt the best way, but only relevant example I can find)
List<ClaimInfoBean> claimList = claimData.getClaimInfo();
Iterator<ClaimInfoBean> claimListIterator = claimList.iterator();
ClaimInfoBean claim;
while ( claimListIterator.hasNext() ) {
claim = ( ClaimInfoBean ) claimListIterator.next();
//call getXXX to plug into a table
对于这个servlet,我关心的是运行x查询,以便在用户单击链接时显示y表。这个servlet应该接受任何查询并显示任何类型的表,所以我上面显示的方式是非常严格的。
对于正确方向的任何帮助都将不胜感激!
答案 0 :(得分:3)
这是一个简单的Servlet的内容。 getConnection返回与数据库的连接,buildDBRequest返回设置为执行SQL查询的PreparedStatement。两者都留作练习供读者实施。
这是JSTL的关键驱动因素。在JSP中,JSTL用于迭代和呈现数据。 JSTL中的一个接口是javax.servlet.jsp.jstl.sql.Result接口。它通常由JSTL SQL标签创建,没有人使用它们(它们非常有趣且非常灵活 - 用于快速和脏的东西,它们工作得很好)。
JSTL还提供了一个ResultSupport类,可以方便地将JDBC ResultSet转换为兼容的JSTL Result对象。因此,在这种情况下,所有Servlet真正需要做的是将结果集链接到JSTL结果,然后转发到JSP。注意,当它创建Result对象时,它将加载查询的所有行。 100行没什么大问题,1M行的潜在问题。
您可以看到它显示Result的columnNames集合中的列标题,然后迭代结果中的每一行以及每行的每一列。
ReportServlet:
import javax.servlet.jsp.jstl.sql.Result;
import javax.servlet.jsp.jstl.sql.ResultSupport;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Connection c = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
c = getConnection();
ps = buildDBRequest(request);
rs = ps.executeQuery();
Result result = ResultSupport.toResult(rs);
request.setAttribute("result", result);
RequestDispatcher rd = request.getRequestDispatcher("/showResult.jsp");
rd.forward(request, response);
} catch(SQLException ex) {
throw new ServletException(ex);
} finally {
close(c, ps, rs);
}
}
showResult.jsp
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Report Results</title>
</head>
<body>
<h1>Report Results</h1>
<table border="1">
<!-- column headers -->
<tr>
<c:forEach var="columnName" items="${result.columnNames}">
<th><c:out value="${columnName}"/></th>
</c:forEach>
</tr>
<!-- column data -->
<c:forEach var="row" items="${result.rowsByIndex}">
<tr>
<c:forEach var="column" items="${row}">
<td><c:out value="${column}"/></td>
</c:forEach>
</tr>
</c:forEach>
</table>
</body>
</html>
答案 1 :(得分:0)
您可以使用ResultSetMetaData获取列名称,并使用它构建列标题。获得ResultSetMetaData后,您可以迭代它以获取如下列名称:
List<String> colNames=new ArrayList<String>();
ResultSetMetaData rsMetaData = rs.getMetaData();
int numberOfColumns = rsMetaData.getColumnCount();
for (int i = 1; i <= numberOfColumns; i++) {
colNames.add(rsMetaData.getColumnName(i));
}
您还可以从结果集中提取数据,粘贴在地图列表(或自定义对象列表)中,然后将其发送到JSP。通常,将ResultSet传递给JSP不是一个好主意。
List<Map<Integer,String>> data=new ArrayList<Map<Integer,String>>();
while (results.next()) {
Map<Integer,String> map=new HashMap<Integer,String>();
for (int i=1;i<=numberOfColumns ;i++ ) {
String colData=results.getString(i);
map.put(i,colData);
}
data.add(map);
}
http://download.oracle.com/javase/1,5.0/docs/api/java/sql/ResultSetMetaData.html