如何使用Javaservlet和Jsp将数据库查询显示到表中?
我对web开发非常陌生,所以请容忍我=) 好的,这是我正在使用的技术堆栈 SQL Server 2008 R2, Tomcat服务器6.0, Java 1.6, jQuery 这是我的问题 我需要运行一系列报告类型的查询,并且需要在JSP页面上将这些结果显示为一个表,供用户查看。我遇到的问题是如何做到这一点的方法 大多数在线示例显示如何将查询结果存储在ResultSet中,并使用JavaBeans setters/getter将其放入ArrayList,然后在JSP中调用该ArrayList 另一个问题是,所有这些查询都有不同的列标题,这些示例没有显示如何动态创建列标题(大多数示例都是硬编码的) 下面是一个示例,说明我目前可以做些什么来生成报告:如何使用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 另
//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。例如