- ·上一篇站长学习:J2SDK和TOMCAT的安装及配置
- ·下一篇站长学习:用jsp动态输出excel文档和中文乱码问题的解决
JSP页面查询显示常用模式
1.直接使用ResultSet 2.Value Object 3.hashmap key,value 4.RowSet ------------------------ 1.直接使用ResultSet 最大众化的方法, 原文中忽略了这一方法,偶给加上了 代码略 2. 使用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); } //jsp显示部分代码 <% List empList = (List)request.getAttribute(“empList”); if (empList == null) empList = Collections.EMPTY_LIST; %> … <table cellspacing="0" 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> <% }// end for %> </table> 3. 使用hashmap作为数据容器。 具体做法: 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)方法中实现了上述过程(所有列名均使用大写),可参考使用。 HashMap map = null; while(rs.next(){ map = new HashMap(); map.put("Field1",rs.getString("Field1")); map.put("Field2",rs.getString("Field2")); ***** map.put("fieldn",rs.getString("fieldn")); } 以上是写死的, 可以使用ResultSetMetadata进行干净彻底的一次性封装, 可以取到rs中所有字段名 String name = null; ResultSetMetaData rsmd = rs.getMetaData(); int num = rsmd.getColumnCount(); int i = 0; while(rs.next()){ for(i=1;i<=num;i++){ name = rsmd.getColumnName(i); map.put("name",rs.getString("rs")); }/*end for*/ }/*end while*/ 示例代码: //查询数据部分代码: … 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); } //JSP显示部分代码 <% List empList = (List)request.getAttribute(“empList”); if (empList == null) empList = Collections.EMPTY_LIST; %> … <table cellspacing="0" 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> <% }// end for %> </table> 4. 使用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(); //将ResultSet中的数据封装到RowSet中 ors.populate(rs); return ors; }finally{ DBUtil.close(rs, pst, conn); } //JSP显示部分代码 <% javax.sql.RowSet empRS = (javax.sql.RowSet) request.getAttribute(“empRS”); %> … <table cellspacing="0" 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> <% }// end while %> </table> 适用场合: 1.ResultSet适合于短平快项目,纯JSP方案最适合 2.value object 使用于定制的查询操作,个人认为该方法比较SB,而许多人却乐此不疲, 如果使用struts,ibatis,hibernate等开发基本上属于此中模式, 使用value object其实还是一个比较重量级的方案,如果不使用 EJB或web sevice等分布式方案,确实没有使用value object的必要, 大家都倡导轻量级的解决方案,为何不更轻松些,使用方法1或3, 写一大堆value bean,无论是从开发工作量和维护上都是一个噩梦 3.HashMap充当数据容器 适用于多条查询语句或需要对查询结果进行处理的情况。 该方法比较不错,灵活机动,适用范围广, 纯JSP,EJB,WEB SERVICE均适用 4.RowSet 适合于单条查询语句,适用于快速开发。 RowSet本身就是一种数据容器,其功能与hashmap差不多, 方法3可以取代方法4 |






