微软的.NET平台上面的数据访问有一个特点,就是数据查询的结果,可以放在内存中,以XML格式进行描述,不需要一直与数据库保持在线连接,用DataSet + Data Adapter来实现!
而在JDBC中,我们通常使用javax.sql.ResultSet类来存放放回的数据,它的流程和生命周期如下: 
| 使用ResultSet来返回数据库查询结果 | 
| Client | --> | Connection | --> | Statement | --> | JDBC Driver | --+ | 
|  | Database | 
| Client | <-- | Parsing | <-- | ResultSet | <-- | JDBC Driver | --+ | 
|  |  |  |  |  |  |  |  | 
|  | Connection lifecycle | 
|  |  | 
|  |  | 
|  | 
|  | ResultSet lifecycle |  | 
|  | 
我们可以看到,这样会长期占用数据库连接的资源,是一个有点不爽的问题...
其实,在JSTL中提供了另外一种机制,让我们在返回查询结果到表示层的时候,可以做到离线使用!它就是javax.servlet.jsp.jstl.sql.Result类!
|  1 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>2 <%@page contentType="text/html; charset=UTF-8"%>
 3 <%@page import="java.sql.Connection"%>
 4 <%@page import="java.sql.DriverManager"%>
 5 <%@page import="java.sql.ResultSet"%>
 6 <%@page import="java.sql.SQLException"%>
 7 <%@page import="java.sql.Statement"%>
 8 <%@page import="javax.servlet.jsp.jstl.sql.Result"%>
 9 <%@page import="javax.servlet.jsp.jstl.sql.ResultSupport"%>
 10 <%
 11   // 暂且把这个下面的内容看作多层架构中的DAO好了,我偷懒了!
 12   Connection conn = null;
 13   Statement stmt = null;
 14   ResultSet rs = null;
 15   String strDbUrl
 16       = "jdbc:mysql://localhost/tutorial?user=tutorial&password=tutpwd";
 17   try {
 18     //开始与数据库作查询
 19     Class.forName("com.mysql.jdbc.Driver").newInstance();
 20     conn = DriverManager.getConnection(strDbUrl);
 21     stmt = conn.createStatement();
 22     String strSql = "SELECT * FROM R_TUT_USERS";
 23     rs = stmt.executeQuery(strSql);
 24     //把ResultSet转化成Result
 25     Result userData = ResultSupport.toResult(rs);
 26     //当我们把结果放到某个Model bean后,就可以关闭数据库连接了.
 27     //为了简化,我们暂且把pageContext看作Model Bean好了!
 28     pageContext.setAttribute("userData", userData);
 29   }
 30   catch (Exception ex) {
 31     // handle any errors
 32     System.out.println("SQLException: " + ex.getMessage());
 33   }
 34   finally {
 35     try {
 36       if (rs != null) {
 37         rs.close();
 38       }
 39       if (stmt != null) {
 40         stmt.close();
 41       }
 42       if (conn != null) {
 43         conn.close();
 44       }
 45     }
 46     catch (SQLException ex) {
 47       System.out.println("SQL Exception: " + ex.getMessage());
 48     }
 49   }
 50   //DAO的逻辑结束
 51 %>
 52 <html>
 53 <head>
 54 <title>test</title>
 55 </head>
 56 <body>
 57 <!--// 下面当作是表示层吧 //-->
 58 <c:forEach items="${userData.rows}" var="user">
 59   <c:out value='${user.name}'/>
 60 </c:forEach>
 61 </body>
 62 </html>
 |