JSP中查询结果分页

发表于:2007-07-04来源:作者:点击数: 标签:
先把所有的结果放到一个数组,或者一个collection中,存放在session里。 然后查询结果输出界面:result.jsp 比如每页20个结果 result.jsp自动重定向到result.jsp?page=1 result.jsp?page=1前20个:0。。19 result.jsp?page=2输出:20。。39 result.jsp?page=
先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。

然后查询结果输出界面: result.jsp
比如每页 20 个结果

result.jsp 自动重定向到 result.jsp?page=1


result.jsp?page=1 前 20 个: 0。。19

result.jsp?page=2 输出 : 20。。39

result.jsp?page=3 输出 : 40。。59

...

不知道有没有更好的方法。


  startunix 回复于:2002-12-11 16:53:45
我做的时候是把输出放在ArrayList中间(由于vector费资源。。),但是如果把rs返回到jsp中间的话,是不太好的,不利于组件话思想。


  RoadStar 回复于:2002-12-11 17:00:33
startunix
能不能把你的POST出来一个看看?


  cinc 回复于:2002-12-11 17:12:39
结构就是:

jsp -> java bean -> database

java bean 里通过 jdbc 查询数据库,并把结果存放成 result[] 的形式
每个 result 对象表示数据库里的一个记录。

jsp 页面里把 这个 result[] 取出来显示。

这样 jsp 就没有直接和 数据库做操作,比较节省资源。



  johnx 回复于:2002-12-11 17:26:13
板主弄个源代码出来看看萨


  imagegarden 回复于:2002-12-11 18:26:11
[quote][b]下面引用由[u]cinc[/u]在 [i]2002/12/11 04:32pm[/i] 发表的内容:[/b]
先把所有的结果放到一个数组,或者一个 collection 中,存放在 session 里。
然后查询结果输出界面: result.jsp
比如每页 20 个结果
result.jsp 自动重定向到 result.jsp?page=1
...
[/quote]
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊


  cinc 回复于:2002-12-12 08:43:20
[quote][b]下面引用由[u]imagegarden[/u]在 [i]2002/12/11 06:26pm[/i] 发表的内容:[/b]
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊
[/quote]

我现在也只能做到,查询出所有符合条件的记录(result set)
然后把中间的 20 个放在一个数组里,让 jsp 来取。

如何让查询时就只返回 20 个还是没办法做到的。好像 sql 不支持。


  eclipse 回复于:2002-12-12 09:10:06
不能回贴,就贴图吧


  eclipse 回复于:2002-12-12 09:13:33
 
JSP数据库操数据分页显示  

--------------------------------------------------------------------------------
源作者:何志强                   人气:3614  
 
<%@ page contentType="text/html;charset=8859_1" %>
<%
//变量声明
java.sql.Connection sqlCon; //数据库连接对象
java.sql.Statement sqlStmt; //SQL语句对象
java.sql.ResultSet sqlRst; //结果集对象
java.lang.String strCon; //数据库连接字符串
java.lang.String strSQL; //SQL语句
int intPageSize; //一页显示的记录数
int intRowCount; //记录总数
int intPageCount; //总页数
int intPage; //待显示页码
java.lang.String strPage;
int i;
//设置一页显示的记录数
intPageSize = 2;
//取得待显示页码
strPage = request.getParameter("page";
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//装载JDBC驱动程序
java.sql.DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
//设置数据库连接字符串
strCon = "jdbcracle:thin:@linux:1521ra4cweb";
//连接数据库
sqlCon = java.sql.DriverManager.getConnection(strCon,"hzq","hzq";
//创建一个可以滚动的只读的SQL语句对象
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,java.sql.ResultSet.CONCUR_READ_ONLY);
//准备SQL语句
strSQL = "select name,age from test";
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>JSP数据库操作例程 - 数据分页显示 - JDBC 2.0 - Oracle</title>
</head>
<body>
<table border="1" cellspacing="0" cellpadding="0">
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
if(intPageCount>0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
i = 0;
while(i<intPageSize && !sqlRst.isAfterLast()){
%>
<tr>
<td><%=sqlRst.getString(1)%></td>
<td><%=sqlRst.getString(2)%></td>
</tr>
<%
sqlRst.next();
i++;
}
}
%>
</table>
第<%=intPage%>页  共<%=intPageCount%>页  <%if(intPage<intPageCount){%><a href="jdbc20-oracle.jsp?page=<%=intPage+1%>">下一页</a><%}%>  <%if(intPage>1){%><a href="jdbc20-oracle.jsp?page=<%=intPage-1%>">上一页</a><%}%>
</body>
</html>
<%
//关闭结果集
sqlRst.close();
//关闭SQL语句对象
sqlStmt.close();
//关闭数据库
sqlCon.close();
%>  
 
 


  eclipse 回复于:2002-12-12 09:18:42
http://www.ambysoft.com/persistenceLayer.pdf


  9命怪猫 回复于:2002-12-12 09:22:40
偶用过ASP,那里边从数据库里读出数据来(放在recordset对象里边),就可以在对象里边直接设置pagesize属性,用以分页。不知道jsp是不是也可以如此。


  cinc 回复于:2002-12-12 09:44:01
[这个贴子最后由cinc在 2002/12/12 09:48am 编辑]

[quote][b]下面引用由[u]eclipse[/u]在 [i]2002/12/12 09:13am[/i] 发表的内容:[/b]

JSP数据库操数据分页显示  
--------------------------------------------------------------------------------
源作者:何志强                   人气:3614  
...
[/quote]

对。没错。
下面是从别人那里抄来的一段代码。用来返回某一页上显示的部分帖子:

/**
     *  Get the top-level threads under the given category from start index
     *
     *  @param category - The category
     *  @param startIndex - The start index for retrieveing the records
     *  @param length - The number of records to be tretieved
     *  @return Collection - A collection of threads under the given category
     */
    public Collection findByCategory( final int category,
                                      final int startIndex,
                                      final int endIndex 
                      throws SQLException, CategoryNotFoundException {
        final Connection conn = getConnection();
        final ArrayList result = new ArrayList();
        final PreparedStatement stat
            = conn.prepareStatement( "select * from threads where category_id=" + category
      + "order by last_update DESC" ;
        final ResultSet resultSet = stat.executeQuery();
        if( resultSet.absolute( startIndex  
        {
            do{
                result.add( new Thread( resultSet.getString("id",
                                        resultSet.getString("title" ,
                                        resultSet.getString("content",
                                        resultSet.getString("author",
                                        resultSet.getLong("last_update")
            }while( resultSet.next() && (resultSet.getRow() <= endIndex) ;
        }
        stat.close();
        conn.close();
        return result;
    }

Thread 表示一个帖子
category 是论坛编号 
resultSet.absolute( startIndex  用于定位到开始的那个帖子
结果存放在 ArrayList 中返回。

然后在 jsp 里用 while 循环把 collection 里的内容一个一个输出。




  cinc 回复于:2002-12-12 09:46:36
[这个贴子最后由cinc在 2002/12/12 09:49am 编辑]

[quote][b]下面引用由[u]imagegarden[/u]在 [i]2002/12/11 06:26pm[/i] 发表的内容:[/b]
这种好像是常用的办法。可是,我一直有个疑问?如果查询结果很大的话,怎么办?难道也一起放入数组?
而且,结果太大的select文,在查询时就花时间啊
[/quote]

ResultSet 在执行完 execute 后好像还不会把数据库中的记录都读入内存。

只有在 resultSet.next(), resultSet.getXXX("column_name" 的时候才会去读数据库里的数据

这样说来,查询结果比较多应该不会造成性能的下降。
看我上面的代码段。




  pwair 回复于:2002-12-13 10:58:04
[这个贴子最后由pwair在 2002/12/13 11:00am 编辑]

各位:我试了一下,
Select top 20 * from table;
不过好像不好用?标准sql支持select top么?

原文转自:http://www.ltesting.net