【问题标题】:How To Display Database Queries Into Table Using Java Servlets And Jsp?如何使用 Java Servlet 和 Jsp 将数据库查询显示到表中?
【发布时间】:2011-11-17 21:08:48
【问题描述】:

我是 Web 开发的新手,所以请耐心等待 =)

好的,这是我正在使用的技术堆栈 SQL Server 2008 R2, Tomcat 服务器 6.0, Java 1.6, jQuery,

这是我的问题。

我有一堆需要运行的报告类型查询,我需要将这些结果显示为 JSP 页面上的表格以供用户查看。我遇到的问题是如何做到这一点。

大多数在线示例显示将查询结果存储在 ResultSet 中,并将其放入带有 JavaBeans setter/getter 的 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 应该接受任何查询并显示任何类型的表,所以我上面显示的方式非常严格。

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

【问题讨论】:

标签: java servlets


【解决方案1】:

这是一个简单的 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 Result,然后转发到 JSP。请注意,当它创建 Result 对象时,它将加载到查询的所有行中。 100 行没什么大不了的,1M 行的潜在问题。

您可以看到它显示 Result 的 columnNames 集合中的列标题,然后它遍历 Result 中的每一行以及每一行的每一列。

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>

【讨论】:

  • 所以一个问题,这个设置真的不需要在 javabean 中使用 setter 和 getter 吗?
  • 不,它根本不使用 Java bean——它只是转储一个 ResultSet。
  • 太棒了!这是一个好的开始,这段代码在调整了一些东西并在 Eclipse 中添加了 JSTL 库之后就可以工作了!谢谢!
【解决方案2】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多