当前位置: 首页 > 图文教程 > 网络编程 > JSP > JSP页面查询显示常用模式

JSP
GET 方式提交的含有特殊字符的参数
java big5到gb2312的编码转换
java Lucene 中自定义排序的实现
hibernate中的增删改查实现代码
jsp 定制标签(Custom Tag)
jsp基础速成精华讲解
IE cache缓存 所带来的问题收藏
关于JSP的一点疑问小结
JSP 多条SQL语句同时执行的方法
jsp include文件时的一个乱码解决方法
在JSTL EL中处理java.util.Map,及嵌套List的情况
jsp 页面显示的一些用法
根据Hibernte的cfg文件生成sql文件
五种 JSP页面跳转方法详解
JSP 防范SQL注入攻击分析
JSP 连接MySQL配置与使用
java eclipse 启动参数
jsp 页面上图片分行输出小技巧
解决jsp开发中不支持EL问题
JSP 页面中使用FCKeditor控件(js用法)

JSP页面查询显示常用模式


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-03   浏览: 152 ::
收藏到网摘: n/a

title: JSP页面查询显示常用模式

author: evan

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

"