`
tolys
  • 浏览: 112229 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

JSP页面查询显示常用模式

阅读更多
title: JSP页面查询显示常用模式

author: evan

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

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

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

  1.  
  2. //查询数据代码
  3.   Connection conn = DBUtil.getConnection();
  4.   PreparedStatement pst = null;
  5.   ResultSet rs = null;
  6.   try{
  7.     String sql=“select emp_code, real_name from t_employee where organ_id=?”;
  8.     pst = conn.preparedStatement(sql);
  9.     pst.setString(1, “101”);
  10.     ResultSet rs = pst.executeQuery();
  11.     List list = new ArrayList();
  12.     Employee emp;
  13.     while (rs.next()){
  14.       emp = new Employee();
  15.       emp.setReakName(rs.getString(“real_name”));
  16.       emp.setEmpCode(rs.getString(“emp_code”));
  17.       …
  18.       list.add(emp);
  19.     }
  20.     return list;
  21.   }finally{
  22.     DBUtil.close(rs, pst ,conn);
  23.   }
  24.  
  25.  
  26. //jsp显示部分代码
  27. <%
  28.   List empList = (List)request.getAttribute(“empList”);
  29.   if (empList == null) empList = Collections.EMPTY_LIST;
  30. %>
  31. <table  cellspacing="0" width=”90%”>
  32.     <tr>  <td>代码</td> <td>姓名</td>  </tr>
  33. <%
  34.   Employee emp;
  35.   for (int i=0; i< empList.size(); i++){
  36.     emp = (Employee) empList.get(i);
  37. %>
  38.     <tr>  
  39.       <td><%= emp.getEmpCode()%></td> 
  40.       <td><%= emp.getRealName()%></td>  
  41.     </tr>
  42. <%
  43.   }// end for
  44. %>
  45. </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)方法中实现了上述过程(所有列名均使用大写),可参考使用。

示例代码

  1.  
  2. //查询数据部分代码:
  3.   …
  4.   Connection conn = DBUtil.getConnection();
  5.   PreparedStatement pst = null;
  6.   ResultSet rs = null;
  7.   try{
  8.     String sql=“select emp_code, real_name from t_employee where organ_id=?”;
  9.     pst = conn.preparedStatement(sql);
  10.     pst.setString(1, “101”);
  11.     rs = pst.executeQuery();
  12.     List list = DBUtil. resultSetToList(ResultSet rs);
  13.     return list;
  14.   }finally{
  15.     DBUtil.close(rs, pst ,conn);
  16.   }
  17.  
  18.  
  19.  
  20. //JSP显示部分代码
  21. <%
  22.   List empList = (List)request.getAttribute(“empList”);
  23.   if (empList == null) empList = Collections.EMPTY_LIST;
  24. %>
  25. <table  cellspacing="0" width=”90%”>
  26.     <tr>  <td>代码</td> <td>姓名</td>  </tr>
  27. <%
  28.   Map colMap;
  29.   for (int i=0; i< empList.size(); i++){
  30.     colMap = (Map) empList.get(i);
  31. %>
  32.   <tr>  
  33.     <td><%=colMap.get(“EMP_CODE”)%></td> 
  34.     <td><%=colMap.get(“REAL_NAME”)%></td>  
  35.   </tr>
  36. <%
  37.   }// end for
  38. %>
  39. </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

示例代码

  1. //查询数据部分代码:
  2.   import javax.sql.RowSet;
  3.   import oracle.jdbc.rowset.OracleCachedRowSet;
  4.   …
  5.   Connection conn = DBUtil.getConnection();
  6.   PreparedStatement pst = null;
  7.   ResultSet rs = null;
  8.   try{……
  9.     String sql=“select emp_code, real_name from t_employee where organ_id=?”;
  10.     pst = conn.preparedStatement(sql);
  11.     pst.setString(1, “101”);
  12.     rs = pst.executeQuery();
  13.     OracleCachedRowSet ors = newOracleCachedRowSet();
  14.     //将ResultSet中的数据封装到RowSet中
  15.     ors.populate(rs);
  16.     return ors;
  17.   }finally{
  18.     DBUtil.close(rs, pst, conn);
  19.   }
  20.  
  21.  
  22. //JSP显示部分代码
  23. <%
  24.   javax.sql.RowSet empRS = (javax.sql.RowSet) request.getAttribute(“empRS”);
  25. %>
  26. <table  cellspacing="0" width=”90%”>
  27.     <tr>  <td>代码</td> <td>姓名</td>  </tr>
  28. <%
  29.   if (empRS != nullwhile (empRS.next() ) {
  30. %>
  31.   <tr>  
  32.     <td><%= empRS.get(“EMP_CODE”)%></td> 
  33.     <td><%= empRS.get(“REAL_NAME”)%></td>  
  34.   </tr>
  35. <%
  36.   }// end while
  37. %>
  38. </table>


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


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

附:DBUtil代码
  1. import java.util.List;
  2. import java.util.ArrayList;
  3. import java.util.Map;
  4. import java.util.HashMap;
  5. import java.util.Properties;
  6. import java.util.Collections;
  7.  
  8. import java.sql.Connection;
  9. import java.sql.SQLException;
  10. import java.sql.ResultSet;
  11. import java.sql.ResultSetMetaData;
  12. import java.sql.Statement;
  13. import java.sql.PreparedStatement;
  14.  
  15. import javax.naming.Context;
  16. import javax.naming.InitialContext;
  17. import javax.naming.NamingException;
  18.  
  19. import javax.sql.DataSource;
  20.  
  21. public class DBUtil{
  22.  
  23.     private static final String JDBC_DATA_SOURCE = "java:comp/env/jdbc/DataSource";
  24.  
  25.     /**
  26.      enableLocalDebug: 是否在本地调试。<br>
  27.      值为true时如果查找数据源失败则使用DriverManager与数据库建立连接;
  28.      如果为false则只查找数据源建立数据库连接。
  29.      默认为false。<br>
  30.      可通过系统属性jdbc.enable_local_debug=true设置enableLocalDebug为true,启用本地调试:<br>
  31.      增加JVM parameter: -Djdbc.enable_local_debug=true
  32.      */
  33.     private static boolean enableLocalDebug = false;
  34.  
  35.     static{
  36.         enableLocalDebug = Boolean.getBoolean ("jdbc.enable_local_debug");
  37.     }
  38.  
  39.  
  40.     private static Context ctx = null;
  41.     private static javax.sql.DataSource ds = null;
  42.  
  43.  
  44.     private static void initDataSource() throws Exception{
  45.         // Put connection properties in to a hashtable.
  46.  
  47.  
  48.         if (ctx == null) {
  49.             ctx = new InitialContext();
  50.         }
  51.         if (ds == null) {
  52.             ds = (javax.sql.DataSource) ctx.lookup(JDBC_DATA_SOURCE);
  53.         }
  54.     }        
  55.  
  56.     /**
  57.      * 查找应用服务器数据源,从数据源中获得数据库连接。<br><br>
  58.      * 在本地调试时如果查找数据源失败并且enableLocalDebug==true
  59.      * 则根据系统属性使用java.sql.DriverManager建立连接。<br>
  60.      * 本地调试时可配置的系统属性如下:<br>
  61.      * <p>
  62.      *     #jdbc驱动程序名 <br>
  63.      *     jdbc.driver=<i>oracle.jdbc.driver.OracleDriver</i> <br> <br>
  64.      *     #数据库连接串<br>
  65.      *     jdbc.url=<i>jdbc:oracle:thin:@10.1.1.1:1521:ocrl</i> <br> <br>
  66.      *     #数据库用户名<br>
  67.      *     jdbc.username=<i>scott</i> <br> <br>
  68.      *     #数据库用户密码<br>
  69.      *     jdbc.password=<i>tiger</i> <br>
  70.      * </p>
  71.      * 可通过JVM参数设置上述系统属性:<br>
  72.      * -Djdbc.driver=oracle.jdbc.driver.OracleDriver 
  73.      *  -Djdbc.url=jdbc:oracle:thin:@10.1.1.1:1521:ocrl
  74.      *  -Djdbc.username=scott -Djdbc.password=tiger
  75.      * @return Connection
  76.      * @throws NamingException 如果数据源查找失败
  77.      * @throws SQLException 如果建立数据库连接失败
  78.      */
  79.     public static Connection getConnection() throws  SQLException{
  80.         try{
  81.             initDataSource();
  82.             return ds.getConnection();
  83.         }catch(SQLException sqle){
  84.             throw sqle;
  85.         }catch(Exception ne){
  86.             if (enableLocalDebug){
  87.                 return getTestConn();
  88.             }else{
  89.                 throw new RuntimeException(ne.toString());
  90.             }
  91.         }
  92.     }
  93.  
  94.  
  95.     //通过DriverManager建立本地测试连接
  96.     private static Connection getTestConn(){
  97.       try {
  98.           String driver = System.getProperty("jdbc.driver");
  99.           System.out.println("jdbc.driver="+driver);
  100.  
  101.           String url = System.getProperty("jdbc.url");
  102.           System.out.println("jdbc.url="+url);
  103.  
  104.           String userName = System.getProperty("jdbc.username");
  105.           System.out.println("jdbc.username="+userName);
  106.  
  107.           String password = System.getProperty("jdbc.password");
  108.           System.out.println("jdbc.password="+password);
  109.  
  110.           Class.forName(driver).newInstance();
  111.           return java.sql.DriverManager.getConnection(url, userName, password);
  112.       }
  113.       catch (Exception ex) {
  114.         ex.printStackTrace();
  115.         throw new RuntimeException(ex.getMessage());
  116.       }
  117.     }
  118.  
  119.     /**
  120.      * 将查询结果封装成List。<br>
  121.      * List中元素类型为封装一行数据的Map,Map key为字段名(大写),value为相应字段值
  122.      * @param rs ResultSet
  123.      * @return List
  124.      * @throws java.sql.SQLException
  125.      */
  126.     public static List resultSetToList(ResultSet rs) throws java.sql.SQLException{
  127.         if (rs==nullreturn Collections.EMPTY_LIST;
  128.  
  129.         ResultSetMetaData md = rs.getMetaData();
  130.         int columnCount = md.getColumnCount();
  131.  
  132.         List list = new ArrayList();
  133.         Map rowData;
  134.         while (rs.next()){
  135.             rowData = new HashMap(columnCount);
  136.             for (int i=1; i<=columnCount; i++){
  137.                 rowData.put(md.getColumnName(i),rs.getObject(i));
  138.             }
  139.             list.add(rowData);
  140.         }
  141.         return list;
  142.     }
  143.  
  144.     /**
  145.      * 关闭ResultSet、Statement和Connection
  146.      * @param rs ResultSet to be closed
  147.      * @param stmt Statement or PreparedStatement  to be closed
  148.      * @param conn Connection  to be closed
  149.      */
  150.     public static void close(ResultSet rs, Statement stmt, Connection conn){
  151.             if (rs != nulltry{
  152.                 rs.close();
  153.             }catch(java.sql.SQLException ex){
  154.                 ex.printStackTrace();
  155.             }
  156.             if (stmt != nulltry{
  157.                  stmt.close();
  158.             }catch(java.sql.SQLException ex){
  159.                 ex.printStackTrace();
  160.             }
  161.             if (conn != nulltry{
  162.                 conn.close();
  163.             }catch(java.sql.SQLException ex){
  164.                 ex.printStackTrace();
  165.             }
  166.     }
  167.  
  168. }// end of DBUtil

 

文章标题链接

Struts 学习笔记1 -Struts Framework 概览
Struts 学习笔记2 -ActionServlet深入探讨 
J2EE Server下的第一个EJB程序(图文进阶篇)
Java程序员的推荐阅读书籍
编写php的extension实例 
“茴字有六种写法”式的C语言笔试题 
Java 程序员面试题目(经典)^_^
巧用注册表保安全
如何修复注册表!
C++ 开发常用工具“群英会”
特酷的打开窗口方法
网页制作中如何改变鼠标的形状!
最详细的计算机命令
最详细的SQL注入相关的命令整理
如何人工给电脑加速?(经典知识) 
关于六种Java异常处理程序的陋习
jsp乱码解决大全
常用的Eclipse快捷键
一个有趣的JAVASCRIPT代码!
安装和配置BEA WorkShop JSP Editor
BEA Workshop™ for JSF 3.0
JavaScript技术讲座-使用内部对象系统
35种网站常用Javascript技巧
.NET中获取电脑名、IP及用户名方法 
.NET中Form之间的互相调用 
.NET下基于API封装的DirectUIHWND窗体访问 
JSP页面查询显示常用模式

分享到:
评论

相关推荐

    jsp页面常用的查询及显示方法分析

    本文实例讲述了jsp页面常用的查询及显示方法。分享给大家供大家参考,具体如下: 背景: 1. 需要将数据库查询结果在JSP中以列表方式显示 2. 在一个良好的J2EE模式中数据库查询一般用DAO实现(Data Access Object)...

    JSP 程序设计从入门到精通 PDF 教程

     1.3.1 JSP页面中的元素 14  1.3.2 JSP语法概要 15  1.3.3关于模板文本(静态HTML) 16  1.4 运行第一个Jsp程序 16  1. 5本章小结 20  第2章Jsp 基础学习 20  2.1 JSP基本语法 20  2.1.1 JSP 语法之...

    第2版_第7章_Java_Web常用开发模式.ppt

    本章主要介绍Java Web应用程序开发常采用的开发模式,首先介绍Web程序中各组件之间的关系,...单纯的JSP页面编程 JSP+JavaBean设计模式 JSP+Servlet设计模式 JSP+Servlet+JavaBean设计模式 DAO设计模式与数据库访问

    韩顺平sevlet,jsp视频教程知识点.txt

    视频描述: (一) 在同一jsp页面提交和接收数据 (二) eclipse(myeclipse)开发工具 1.0介绍 1.1安装 1.2配置 1.3使用 (三) model1模式 (四) 一个简单的用户登录系统 韩顺平 j2ee视频实战教程jsp第2讲(中集).wmv 视频...

    JSP高级编程

    前言 第一部分 JSP入门 第1章 概述 1.1 Java技术 1.1.1 Java技术的发展 1.1.2 JavaBeans 1.1.3 JDBC 1.1.4 J2EE 1.1.5 EJB 1.1.6 Java Servlet 1.2 JSP技术 1.2.1 JSP...

    常用js大全,javascript校验大全

    2.07 避免多次提交页面 在jsp中嵌入该文件,在每个jsp页面的提交语句 前执行该方法.. 121 2.08 检查EMail格式. 122 2.09 电话号码由数字和-组成. 123 2.10 检验IP地址 . 124 2.11 校验忽略样式内容后文本域中的内容...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...

    JSP高级教程

    前言 第一部分 JSP入门 第1章 概述 1.1 Java技术 1.1.1 Java技术的发展 1.1.2 JavaBeans 1.1.3 JDBC 1.1.4 J2EE 1.1.5 EJB 1.1.6 Java Servlet 1.2 JSP技术 1.2.1 JSP技术概述 ...附录C 常用JSP相关网址

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...

    jsp servlet 入门学习资料-新手一看就懂

    前言 第一部分 JSP入门 第1章 概述 1.1 Java技术 1.1.1 Java技术的发展 1.1.2 JavaBeans 1.1.3 JDBC 1.1.4 J2EE 1.1.5 EJB 1.1.6 Java Servlet 1.2 JSP技术 1.2.1 JSP技术概述 ...附录C 常用JSP相关网址

    泛微OA 二次开发指南

    二、 说明一个JSP页面,一个JAVA程序的基本组成,如何阅读JSP页面 三、 页面权限控制的说明,怎样在页面中引用权限,怎么样新增一个权限,如何在新开发的模块上引入权限控制 四、 系统的人员组织结构的介绍 五、 对...

    百度编辑器UEditor v1.4.3.2 JSP版 GBK.zip

    百度编辑器UEditor v1.4.3.2 更新日志: 更新 video-js 以修复 XSS 安全漏洞 百度编辑器UEditor简介 百度编辑器Ueditor是由百度web前端研发部开发所见即所得的编辑器,具有轻量,可定制,...同类推荐:站长常用源码

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    1.4.1 xml将数据与显示分开 5 1.4.2 xml对文档的格式要求更加严格 6 1.4.3 xml有且只能有一个根元素 6 1.5 xml的编辑工具 7 1.6 xml文档 8 1.6.1 xml声明 9 1.6.2 文档类型声明 10 1.6.3 元素 11 1.6.4 注释...

    Java知识拾遗:三大框架的技术起源

    Struts、Hibernate和Spring是我们Java开发中...但是这种结构仍然存在问题:如JSP页面中需要使用符号嵌入很多的 Java代码,造成页面结构混乱,Servlet和Javabean负责了大量的跳转和运算工作,耦合紧密,程序复用度低等等

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    10.3 利用Spring在JSP页面输出“HelloWorld”的示例 10.3.1 建立myHelloWorld工程 10.3.2 编写JSP页面helloWorld.jsp 10.3.3 编写控制器HelloWorldController.java 10.3.4 建立Spring的配置文档dispatcherServlet-...

Global site tag (gtag.js) - Google Analytics