JSP页面查询显示常用模式[转贴]

转载 2005年04月23日 16:45:00

JSP页面查询显示常用模式- -

背景
1. 需要将数据库查询结果在JSP中以列表方式显示
2. 在一个良好的J2EE模式中数据库查询一般用DAO实现(Data Access Object), JSP仅用于显示数据

问题
通过JDBC ResultSet可获取查询结果(存在于数据库缓冲区内),但在Statement、Connection关闭后ResultSet即不可用。因此需要一种方式取出所有查询结果并传递至JSP页面。

解决方法一
使用Value Object。将每条记录均封装成JavaBean对象,把这些对象装入Collection传送给JSP显示。这种方法的缺点是每一种查询都需要定义一个java class,并且将记录数据封装成java对象时也需要很多额外的代码。
示例代码:



Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
ResultSet rs = pst.executeQuery();
List list = new ArrayList();
Employee emp;
while (rs.next()){
emp = new Employee();
emp.setReakName(rs.getString(“real_name”));
emp.setEmpCode(rs.getString(“emp_code”));

list.add(emp);
}
return list;
}finally{
DBUtil.close(rs, pst ,conn);
}



<%
List empList = (List)request.getAttribute(“empList”);
if (empList == null) empList = Collections.EMPTY_LIST;
%>

<table cellspacing= width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
Employee emp;
for (int i=0; i< empList.size(); i++){
emp = (Employee) empList.get(i);
%>
<tr>
<td><%= emp.getEmpCode()%></td>
<td><%= emp.getRealName()%></td>
</tr>
<%
}
%>
</table>


解决方法二
遍历ResultSet取出所有数据封装进Collection。
具体做法:
1. 生成一个List对象(List list = new ArrayList() )。
2. 生成一个Map对象(Map map = new HashMap() )。使用Map封装一行数据,key为各字段名,value为对应的值。(map.put(“USER_NAME”), rs.getString(“USER_NAME”))
3. 将第2 步生成的Map对象装入第1步的list对象中(list.add(map) )。
4. 重复2、3步直到ResultSet遍历完毕
在DBUtil. resultSetToList(ResultSet rs)方法中实现了上述过程(所有列名均使用大写),可参考使用。

示例代码




Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
List list = DBUtil. resultSetToList(ResultSet rs);
return list;
}finally{
DBUtil.close(rs, pst ,conn);
}




<%
List empList = (List)request.getAttribute(“empList”);
if (empList == null) empList = Collections.EMPTY_LIST;
%>

<table cellspacing= width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
Map colMap;
for (int i=0; i< empList.size(); i++){
colMap = (Map) empList.get(i);
%>
<tr>
<td><%=colMap.get(“EMP_CODE”)%></td>
<td><%=colMap.get(“REAL_NAME”)%></td>
</tr>
<%
}
%>
</table>


解决方法三
使用RowSet。
RowSet是JDBC2.0中提供的接口,Oracle对该接口有相应实现,其中很有用的是oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法,但与ResultSet不同的是,OracleCachedRowSet中的数据在Connection关闭后仍然有效。

oracle的rowset实现在http://otn.oracle.com/software/content.html的jdbc下载里有,名称是ocrs12.zip

示例代码


import javax.sql.RowSet;
import oracle.jdbc.rowset.OracleCachedRowSet;

Connection conn = DBUtil.getConnection();
PreparedStatement pst = null;
ResultSet rs = null;
try{……
String sql=“select emp_code, real_name from t_employee where organ_id=?”;
pst = conn.preparedStatement(sql);
pst.setString(1, “101”);
rs = pst.executeQuery();
OracleCachedRowSet ors = newOracleCachedRowSet();

ors.populate(rs);
return ors;
}finally{
DBUtil.close(rs, pst, conn);
}



<%
javax.sql.RowSet empRS = (javax.sql.RowSet) request.getAttribute(“empRS”);
%>

<table cellspacing= width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr>
<%
if (empRS != null) while (empRS.next() ) {
%>
<tr>
<td><%= empRS.get(“EMP_CODE”)%></td>
<td><%= empRS.get(“REAL_NAME”)%></td>
</tr>
<%
}
%>
</table>


适用场合
方法一使用于定制的查询操作
方法二适用于多条查询语句或需要对查询结果进行处理的情况。
方法三适合于单条查询语句,适用于快速开发。


相关链接
如果需要分页显示请参考:JSP分页技术实现
如果查询结果需要生成WORD或者EXCEL,请参考:使用jsp实现word、excel格式报表打印

附:DBUtil代码
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
import java.util.Properties;
import java.util.Collections;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.sql.PreparedStatement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import javax.sql.DataSource;

public class DBUtil{

private static final String JDBC_DATA_SOURCE = ;


private static boolean enableLocalDebug = false;

static{
enableLocalDebug = Boolean.getBoolean ();
}


private static Context ctx = null;
private static javax.sql.DataSource ds = null;


private static void initDataSource() throws Exception{



if (ctx == null) {
ctx = new InitialContext();
}
if (ds == null) {
ds = (javax.sql.DataSource) ctx.lookup(JDBC_DATA_SOURCE);
}
}


public static Connection getConnection() throws SQLException{
try{
initDataSource();
return ds.getConnection();
}catch(SQLException sqle){
throw sqle;
}catch(Exception ne){
if (enableLocalDebug){
return getTestConn();
}else{
throw new RuntimeException(ne.toString());
}
}
}



private static Connection getTestConn(){
try {
String driver = System.getProperty();
System.out.println(+driver);

String url = System.getProperty();
System.out.println(+url);

String userName = System.getProperty();
System.out.println(+userName);

String password = System.getProperty();
System.out.println(+password);

Class.forName(driver).newInstance();
return java.sql.DriverManager.getConnection(url, userName, password);
}
catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex.getMessage());
}
}


public static List resultSetToList(ResultSet rs) throws java.sql.SQLException{
if (rs==null) return Collections.EMPTY_LIST;

ResultSetMetaData md = rs.getMetaData();
int columnCount = md.getColumnCount();

List list = new ArrayList();
Map rowData;
while (rs.next()){
rowData = new HashMap(columnCount);
for (int i=1; i<=columnCount; i++){
rowData.put(md.getColumnName(i),rs.getObject(i));
}
list.add(rowData);
}
return list;
}


public static void close(ResultSet rs, Statement stmt, Connection conn){
if (rs != null) try{
rs.close();
}catch(java.sql.SQLException ex){
ex.printStackTrace();
}
if (stmt != null) try{
stmt.close();
}catch(java.sql.SQLException ex){
ex.printStackTrace();
}
if (conn != null) try{
conn.close();
}catch(java.sql.SQLException ex){
ex.printStackTrace();
}
}

}

JSP页面查询显示常用模式

title: JSP页面查询显示常用模式author: evanemail: evan_zhao@hotmail.com    背景:1.    需要将数据库查询结果在JSP中以列表方式显示2.   ...
  • tolys
  • tolys
  • 2007年09月29日 14:13
  • 35168

JSP页面查询显示常用模式 (附源代码)

JSP页面查询显示常用模式 title: JSP页面查询显示常用模式author: evanemail: evan_zhao@hotmail.com    背景:1.    需要将数据库查询结果在JS...
  • pharaohsprince
  • pharaohsprince
  • 2005年07月07日 00:31
  • 6786

JSP页面查询显示常用模式 (附源代码)

背景:1.    需要将数据库查询结果在JSP中以列表方式显示2.    在一个良好的J2EE模式中数据库查询一般用DAO实现(Data Access Object), JSP仅用于显示数据问题:  ...
  • banqingyang
  • banqingyang
  • 2011年02月26日 15:26
  • 513

jsp页面查询显示 急!!!

我写的一个jsp的查询页面,如下:               queryResult1.jsp                  -->             Result page  ...
  • tailegongshi
  • tailegongshi
  • 2008年05月26日 18:08
  • 298

jsp+MVC分页读取数据库中的数据

今天要用到分页,以前没写过,我是个菜鸟,再网上找了,有的确实好,但不会用,最后在网上找了一个自己再修改了一下,顺便记录下来,以考初学者们参考用法很简单,只要你修改一下DbUtil这个类中的数据库名和用...
  • hnbcjzj
  • hnbcjzj
  • 2007年11月21日 18:08
  • 4168

如何在JSP页面显示Oracle数据库内容

/*引用数据库连接类*/    /*引用资源关闭类*/            从数据库中的某个表拿到该表所有的数据            table {       ...
  • mzd8341
  • mzd8341
  • 2017年08月08日 19:56
  • 2054

jsp显示一对多的数据

SSH框架(Struct2+Spring3+Hivernate4) 有tel_type表(type,typename)\ tel_info(id,type,comName,comTel) 使用My...
  • janefir
  • janefir
  • 2013年12月11日 17:54
  • 1358

Jsp页面常用的显示方

${role.roleName } 启用 禁用 --%>
  • CHBSRZF
  • CHBSRZF
  • 2015年10月08日 09:20
  • 1074

根据数据库查询结果JSP展示甘特图(进度条)

接着上的刚写的《JavaScript实现JSP日历》,日历已经有了,剩下的就是点击日期后打开会议申请的时间分布图,时间的分布使用类似甘特图的形式展示 :如图(测试数据)提示信息是鼠标放上去显示的。方...
  • zhangchu_63
  • zhangchu_63
  • 2010年12月31日 17:46
  • 3968

几个常用的jsp页面

一个是显示列表的jsp显示所有数据库中一张表的所有数据.@ page language="java" pageEncoding="utf-8"%>@ taglib uri="http://jakart...
  • suncheng_hong
  • suncheng_hong
  • 2007年07月13日 13:04
  • 761
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP页面查询显示常用模式[转贴]
举报原因:
原因补充:

(最多只允许输入30个字)