你可以将查询结果保存到request中,再forward到jsp页面显示,如果关闭了数据库链接后,结果集还能使用,那么就使用离线的数据集,下面有详细的介绍:
如果在开发应用的时候没有使用任何持久层框架,而是直接使用jdbc 的api编程的话,大家最长使用的就是ResultSet接口进行数据的读取了,但是大家也会觉得很不方便,因为ResultSet是在线的数据集,在读取数据的过程中不能断开数据库联接,只有读取数据完成后才能close掉相关对象。    其实java也提供了离线的数据集,那就是RowSet接口以及相关的 子接口。而且sun在jdk里面提供一个默认的实现,而且象oracle这样比较大型的数据库驱动里面也提供自己的RowSet实现。    下面以sun的默认 实现来说明离线数据的使用吧,数据库为sql Server 2000,连接的数据库为Northwind。  import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.RowSet;
import com.sun.rowset.CachedRowSetImpl;
public class RowSetDemo {
    public static RowSet query(Connection connection, String sql)
            throws SQLException {
        //使用sun的默认RowSet实现
        CachedRowSetImpl rowset = new CachedRowSetImpl();
        //查询没有任何变化
        Statement statement = connection.createStatement();
        ResultSet rs = statement.executeQuery(sql);
        //这里就是填充离线集
        rowset.populate(rs);
        //都可以关闭了,爽吧
        rs.close();
        statement.close();
        return rowset;
    }
    public static void main(String[] args) throws Exception {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;database=Northwind;user=sa;password=huhuiyu";
        Connection connection = DriverManager.getConnection(connectionUrl);
        RowSet rs = query(connection, "select * from Customers order by CustomerID;");
        //关闭连接也没有关系了。
        connection.close();
        //和ResultSet使用一样。
        while (rs.next()) {
            System.out.print(rs.getString(1) + " : ");
            System.out.println(rs.getString("CompanyName"));
        }
    }
}运行上面的例子就会将Customers的前两列的数据显示出来。其实RowSet还可以完成分页的功能。请看下面的方法。
public static RowSet query(Connection connection, String sql, int pageSize,
            int pageNumber) throws SQLException {
        CachedRowSetImpl rowset = new CachedRowSetImpl();
        //要是可以滚动的结果集
        Statement statement = connection.createStatement(
                ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
        ResultSet rs = statement.executeQuery(sql);
        //设定分页大小
        rowset.setPageSize(pageSize);
        //计算一下开始游标位置
        int skip=(pageNumber - 1) * pageSize + 1;
        //可以填充了
        rowset.populate(rs, skip);
        rs.close();
        statement.close();
        return rowset;
    }
    public static void main(String[] args) throws Exception {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        String connectionUrl = "jdbc:sqlserver://127.0.0.1:1433;database=Northwind;user=sa;password=huhuiyu";
        Connection connection = DriverManager.getConnection(connectionUrl);
        //分页查询
        RowSet rs = query(connection, "select * from Customers order by CustomerID;",5,2);
        //关闭连接也没有关系了。
        connection.close();
        //和ResultSet使用一样。
        while (rs.next()) {
            System.out.print(rs.getString(1) + " : ");
            System.out.println(rs.getString("CompanyName"));
        }
    }
如果你不使用持久层,那么使用离线数据集可以很好的解决分页和数据库连接的问题。

解决方案 »

  1.   

    不建议保存Result,将结果转成一个ArrayList,再存到Request中,接着用Struts的标签显示出来就可以了,这要,在将Result转成ArrayList之后,就可以关闭数据库连接了。(建议用连接池做。)
      

  2.   

    ArrayList存放多个对象,并进行传值。
      

  3.   

    非常感谢大家,我没使用过ArrayList,能否给我一个把result的值转换到ArrayList的简单例子?
    另外,把ArrayList保存到Request的语句是什么?
      

  4.   

    将result封装成List
    request.setAttribute("List", List);
    在页面上迭代出来就是了
      

  5.   

    难道传说中的三大框架,你也不知道吗?hibernate就是对象化数据库啊!一般好用!
      

  6.   

    将ResultSet转成ArrayList:比如说反回用户列表ArrayList list = new ArrayList();
    While(rs.next){
      User u = new User();
      u.setName = rs.getString("name");
      list.add(u);
    }User 这个类是和你数据库的表结构对应的,就是VO,
    保存完成之后,request.setArrribte("List",list)就可以了。在页面使用时:
    ArrayList list = request.getAttribute(list)
    Iterator i = list.Iterator();while(i.hasnext){
      User u = i.next();
      System.out.println(u.getName());}自己写的,可能有错误的关键字,但大概是这样的。
      

  7.   

    谢谢小强,我的查询是关联几个表的复杂sql语句,你例子里的User类是怎么样和数据库对应的?是一个form类吗?
      

  8.   

    我是这样做的,可是不行,相关代码如下:
    action:
    ArrayList list = new ArrayList();
    rs = stmt.executeQuery(ls_sql);
    while (rs.next()){
    list.add(rs);}
    jsp:
    <%
    ArrayList list1 = (ArrayList)request.getAttribute("List");
    ResultSet rs;
    rs = (ResultSet)list1.get(1);
    %>
    请高手详细指点,谢谢
      

  9.   

    只要保存在request作用域中然后forward就可以了~当然session也可以~application更是没问题~但是有人会说你是神经病的~
      

  10.   

    一般不建议将resultSet直接传入JSP中,如果硬是要传则把PS和CONN一起传过去~
      

  11.   

    大家不建议将resultSet直接传入JSP中,那到底应该怎么把action中提取的数据传到jsp文件中显示出来呢??请详细说说,最好有代码。
    楼上有人建议先把resultset转换成ArrayList再传入JSP中,可是该怎样写代码呢?我写的出错,请高手给个例子,我写的相关代码如下: 
    action: 
    ArrayList list = new ArrayList(); 
    rs = stmt.executeQuery(ls_sql); 
    while (rs.next()){ 
    list.add(rs);} 
    jsp: 
    <% 
    ArrayList list1 = (ArrayList)request.getAttribute("List"); 
    ResultSet rs; 
    rs = (ResultSet)list1.get(1); 
    %> 
    请高手详细指点,谢谢
      

  12.   

    将ResultSet 转成 List 或者 Map 进行传值, session关闭只是关闭与数据库的连接,但是数据还是会加载到缓存的,
    当值传到页面,一个传值的生命周期结束,JAVA的垃圾回收机制会自动处理
      

  13.   

    bufeng711,谢谢你,你能提供具体的代码吗?