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

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();
}
}

}

阅读更多
个人分类: java相关
想对作者说点什么? 我来说一句

JSP页面查询显示常用模式

2009年01月09日 10KB 下载

Login_Regist

2013年01月12日 107KB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭