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

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

好的,我的技术堆栈我正在使用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 getClaimInfo() throws SQLException { List claimList = new ArrayList(); 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 claimList = claimData.getClaimInfo(); Iterator claimListIterator = claimList.iterator(); ClaimInfoBean claim; while ( claimListIterator.hasNext() ) { claim = ( ClaimInfoBean ) claimListIterator.next(); //call getXXX to plug into a table 

对于这个servlet,我关心的是运行x查询,以便在用户单击链接时显示y表。 这个servlet应该接受任何查询并显示任何类型的表,所以我上面显示的方式是非常严格的。

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

这是一个简单的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集合中的列标题,然后迭代结果中的每一行以及每行的每一列。

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" %>     Report Results   

Report Results

您可以使用ResultSetMetaData来获取列名称,并使用它来构建列标题。 获得ResultSetMetaData后,您可以迭代它以获取如下列名:

 List colNames=new ArrayList(); ResultSetMetaData rsMetaData = rs.getMetaData(); int numberOfColumns = rsMetaData.getColumnCount(); for (int i = 1; i <= numberOfColumns; i++) { colNames.add(rsMetaData.getColumnName(i)); } 

您还可以从结果集中提取数据,粘贴到地图列表(或自定义对象列表)中,然后将其发送到JSP。 通常,将ResultSet传递给JSP并不是一个好主意。

  List> data=new ArrayList>(); while (results.next()) { Map map=new HashMap(); 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