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

如何使用Javaservlet和Jsp将数据库查询显示到表中?,java,servlets,Java,Servlets,我对web开发非常陌生,所以请容忍我=) 好的,这是我正在使用的技术堆栈 SQL Server 2008 R2, Tomcat服务器6.0, Java 1.6, jQuery 这是我的问题 我需要运行一系列报告类型的查询,并且需要在JSP页面上将这些结果显示为一个表,供用户查看。我遇到的问题是如何做到这一点的方法 大多数在线示例显示如何将查询结果存储在ResultSet中,并使用JavaBeans setters/getter将其放入ArrayList,然后在JSP中调用该ArrayList 另

我对web开发非常陌生,所以请容忍我=)

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

这是我的问题

我需要运行一系列报告类型的查询,并且需要在JSP页面上将这些结果显示为一个表,供用户查看。我遇到的问题是如何做到这一点的方法

大多数在线示例显示如何将查询结果存储在ResultSet中,并使用JavaBeans setters/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);

    }
//在servlet中,并在JavaBean中设置内容
public List getClaimInfo()引发SQLException{
List claimList=new ArrayList();
while(results.next()){
ClaimInfoBean声明=新ClaimInfoBean();
claim.setClaimNum(results.getString(1));
//为豆子设置更多的内容
}
索赔清单。添加(索赔);
}
在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
//scriptlet(我知道这不是最好的方法,但我能找到的唯一相关示例)
List claimList=claimData.getClaimInfo();
迭代器claimListIterator=claimList.Iterator();
索赔信息;
while(claimListIterator.hasNext()){
claim=(ClaimInfoBean)claimListIterator.next();
//调用getXXX以插入到表中
对于这个servlet,我所关心的是在用户单击链接时运行x查询,以显示y表。这个servlet应该接受任何查询并显示任何类型的表,因此我上面所示的方式非常严格


如果有任何方向正确的帮助,我们将不胜感激!

您可以使用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)); 
} 
List colNames=new ArrayList();
ResultSetMetaData rsMetaData=rs.getMetaData();
int numberOfColumns=rsMetaData.getColumnCount();

对于(int i=1;i,您可以使用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)); 
} 
List colNames=new ArrayList();
ResultSetMetaData rsMetaData=rs.getMetaData();
int numberOfColumns=rsMetaData.getColumnCount();

对于(int i=1;i,这里是一个简单Servlet的核心。getConnection返回到数据库的连接,buildDBRequest返回一个为执行SQL查询而设置的PreparedStatement。这两者都作为练习留给读者实现

这方面的关键驱动程序是JSTL。在JSP中,JSTL用于迭代和显示数据。JSTL中的一个接口是javax.servlet.JSP.JSTL.sql.Result接口。它通常由JSTL sql标记创建,没有人使用它(它们非常有趣而且非常灵活——对于快速和肮脏的东西,它们工作得非常好)

JSTL还提供了一个ResultSupport类,可以方便地将JDBC ResultSet转换成兼容的JSTL结果对象。因此,在这种情况下,Servlet真正需要做的就是将结果集链接到JSTL结果,然后转发给JSP。注意,当它创建结果对象时,它将加载查询的所有行。没什么大不了的对于100行,潜在问题是100万行

您可以看到它显示结果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>

报告结果
报告结果

以下是一个简单Servlet的核心。getConnection返回到数据库的连接,buildDBRequest返回一个PreparedStatement,该语句被设置为执行SQL查询。这两个语句都作为练习留给读者实现

这方面的关键驱动程序是JSTL。在JSP中,JSTL用于迭代和显示数据。JSTL中的一个接口是javax.servlet.JSP.JSTL.sql.Result接口。它通常由JSTL sql标记创建,没有人使用它(它们非常有趣而且非常灵活——对于快速和肮脏的东西,它们工作得非常好)

JSTL还提供了一个ResultSupport类,可以方便地将JDBC ResultSet转换成兼容的JSTL结果对象。因此,在这种情况下,Servlet真正需要做的就是将结果集链接到JSTL结果,然后转发给JSP。注意,当它创建结果对象时,它将加载查询的所有行。没什么大不了的对于100行,潜在问题是100万行

您可以看到它显示结果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>

报告结果
报告结果

这就是为什么存在带有代码生成器的ORM框架和IDE。例如,这就是为什么存在带有代码生成器的ORM框架和IDE。例如