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页面查询显示常用模式

  • 2009年01月09日 11:36
  • 10KB
  • 下载

JSP页面查询显示常用模式

你时常被客户抱怨JSP页面响应速度很慢吗?你想过当客户访问次数剧增时,你的WEB应用能承受日益增加的访问量吗?本文讲述了调整JSP和servlet的一些非常实用的方法,它可使你的servlet和JSP...

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

JSPJDBCSQLOracleExcel JSP页面查询显示常用模式   title: JSP页面查询显示常用模式 author: evan email: evan_zha...
  • loukwen
  • loukwen
  • 2012年09月18日 21:06
  • 236

springmvc中自定义日期转换器及其jsp页面日期显示的一个常用标签

在默认情况下,springmvc不能将String类型转成Date类型,必须自定义类型转换器

JSP页面显示list的常用方法

方法-:直接在action设置get和set方法,然后在jsp页面中使用iterator迭代输出,但是一定要注意格式。就是被这个格式搞了一下午。 //使用标签 ${id.name} //使用E...

完美解决jsp页面在IE8下文本模式自动为(杂项Quirks)导致页面显示错位的情况

现象描述:最近在遇到的问题就是在在Chrome,火狐页面都正常,唯独在IE8下页面显示错位。 查找过程:经过ie8的F12调试,发现在文本模式中会自动变为 杂项Quirks,而不是变为 标准模式,所...

JAVA WEB开发从数据库中查询到的数据用list怎么在JSP页面整齐的显示出来,请写代码,

整齐地输出可以用table。 不知道你用的是原始的jsp还是struts之类的框架,如果是后者,有相应的标记库,直接绑定就可以了。 再不会google些例子程序自己学习下。整齐地输出可以用tabl...

magic-web常用的jsp页面

  • 2011年11月13日 21:28
  • 19.81MB
  • 下载

JSP页面常用控件及操作

1.点击按钮返回 上一页:   2.点击按钮跳转到另一个jsp页面:   3.复选框 : 保存登录名   4.背景图片超链接: 评价...

jsp页面常用控件

1.点击按钮返回 上一页:   2.点击按钮跳转到另一个jsp页面:   3.复选框 : 保存登录名   4.背景图片超链接: 评价...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JSP页面查询显示常用模式[转贴]
举报原因:
原因补充:

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