如何使用Java Servlet和Jsp将数据库查询显示到表中?

时间:2011-11-17 21:08:49

标签: java servlets

我对网络开发很新,所以忍受我=)

好的,这是我正在使用的技术堆栈 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应该接受任何查询并显示任何类型的表,所以我上面显示的方式是非常严格的。

对于正确方向的任何帮助都将不胜感激!

2 个答案:

答案 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