现在我想要做一个jsp的分页,但是我不知道从何下手.最主要就是这个过程是如何的,请各位不要笑,我是一个jsp刚入门的新手.因为我知道搞java这行,这个分页技术是不可少的,请多提高见.

解决方案 »

  1.   

    分页技术 按数据库的不同也有很大的不同,
    目前比较广泛使用的分页方式是将查询结果缓存在HttpSession(一般为List数据集中)或有状态bean中,翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间,并且缓存的数据也会占用大量内存,效率明显下降。
      其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录,实验证明在记录数很大时速度非常慢。
      至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭,如果要使ResultSet有效势必长时间占用数据库连接。  因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库,但查询出的记录数很少,网络传输数据量不大,如果使用连接池更可以略过最耗时的建立数据库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度,比在应用服务器层做缓存有效多了。  在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from employee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的,所以查询employee按birthday排序的第100到120条记录应该这么写:
            select * from (
                select my_table.*, rownum as my_rownum from (
                    select name, birthday from employee order by birthday
                ) my_table where rownum <120
            ) where my_rownum>=100  mySQL可以使用LIMIT子句:
        select name, birthday from employee order by birthday LIMIT 99,20
      DB2有rownumber()函数用于获取当前行数。
    SqlServer最好给表加上递增的主键,可以这样查出每页的数据:
             Select top 20 * from ("
            +"Select top 20  * from ("
            +"Select top "+20*cpage+" * from table order by indexId asc"
            +")temptab1 order by indexId desc"
            +")temptab2 order by indexId asc";
        这样可以查询出20条记录,cpage为页码
    注:对以上问题有什么看法,和批评欢迎讨论[email protected]
      

  2.   

    这种方法到是第一次听到,
    我一般用的是:
    其它常见的方法还有每次翻页都查询一次数据库,从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数,使用rs.absolute()定位到本页起始记录)。不过经你一提到是有点想法。谢谢!
      

  3.   

    hibernate和mysql都有自己的查询分页机制
      

  4.   

    楼主  
    我刚写了个C语言提交系统。用到分页。
    可以参考下
    import java.sql.*;
    import java.util.*; public class PageCt
    {
    private long l_start; //开始纪录
    private long l_end; //结束纪录
    private long l_curpage; //当前页数
    private long l_totalnum;//总记录数
    private int int_num=5; //每页10条
    private long l_totalpage; //总的页数
    public void Init(long currentpage,long totalnum)
    {
    l_curpage = currentpage;
    l_totalnum = totalnum;
    if (currentpage>=0)
    {
    if (currentpage>=(long)Math.ceil((double)l_totalnum/(double)int_num))
    l_curpage = (long)Math.floor((double)l_totalnum/(double)int_num);
    else
    l_curpage = currentpage;
    }
    else
    {
    l_curpage = 0;
    }
    l_start = l_curpage * int_num;
    l_end = l_start + int_num;
    if (l_end > l_totalnum)
    l_end = l_totalnum;
    l_totalpage = (long)Math.ceil((double)l_totalnum/(double)int_num);
    }
    public long getCurpage()
    {
    return l_curpage;
    }
    public long getPrepage()
    {
    if (l_curpage-1>=0)
    {
    return l_curpage-1;
    }
    else
    {
    return 0;
    }
    }
    public long getNextpage()
    {
    if (l_curpage+1<=l_totalpage)
    {
    return l_curpage+1;
    }
    else
    {
    return l_totalpage;
    }
    }
    public long getTotalnum()
    {
    return l_totalnum;
    }
    public long getTotalpage()
    {
    return l_totalpage;
    }
    public long getStart()
    {
    return l_start;
    }
    public long getEnd()
    {
    return l_end;
    }
    };
    ===============================================
    //调用例子
    <%
    /*
    *** @author 马毅 ***********
    *** @version ***********
    *** Created on 2001年6月12日, 下午17:13
    **************************************
    */
    <%@ page import="java.sql.*"%>
    <%@ page import="java.lang.*"%>
    <%@ page contentType="text/html;charset=gb2312" %>
    <JSP:useBean id="PageCount" scope="page" class="kstest.PageCt" />
    <jsp:useBean id="sqlbean" scope="page" class="vod.sql_data" />
    <html>
    <head>
    <TITLE>测试</TITLE>
    <STYLE>
    body,table{font-size:9pt}
    A:link {
    COLOR: #000084; TEXT-DECORATION: none
    }
    A:visited {
    COLOR: #000084; TEXT-DECORATION: none
    }
    A:hover {
    COLOR: black; TEXT-DECORATION: underline
    }
    .ourfont {
    FONT-SIZE: 9pt
    }
    </STYLE>
    </head>
    <body bgcolor=#eff3ff>
    <center>
    <font color=#000084><h3>Test for Test</h3></font>
    <hr width=600 color=#b5dbff>
    <br>
    <%
    ResultSet rs0 = sqlbean.executeQuery("select count(*) from UserList );
    rs0.next();
    long data_num=rs0.getLong(1);
    long Current_Page = 0;
    String currentpage=(String)request.getParameter("currentpage");
    if (currentpage != null && !currentpage.equals(""))
    {
    Current_Page = Integer.parseInt(request.getParameter("currentpage"));
    }
    String Query_Page=(String)request.getParameter("Query_Page");
    if (Query_Page!=null && !Query_Page.equals(""))
    {
    Current_Page = Integer.parseInt(request.getParameter("Query_Page"))-1;
    }
    PageCt.Init(Current_Page,data_num);
    long l_start = PageCt.getStart();
    long l_end = PageCt.getEnd();
    //查询记录
    ResultSet rs = sqlbean.executeQuery("select * from UserList " );
    long i=0;
    while((i<l_start) && rs.next())
    {
    i++;

    //输出查询结果
    long j=0;
    while(rs.next() && (i<l_end))
    {
    j=i+1;
    String col2 = rs.getString(2);
    String col3 = rs.getString(3);
    String col4 = rs.getString(4);
    String col5 = rs.getString(5);
    String col6 = rs.getString(6);
    String col7 = rs.getString(7);
    String col8 = rs.getString(8);
    //打印所显示的数据
    out.println("<table border=0 width=600>");
    out.println("<tr><td colspan=2><font color=#000084>" + j + "、"+(col2==null?"":col2)+"</font></td></tr><tr><td colspan=2>答案:"+(col3==null?"":col3)+"</td></tr>");
    out.println("<tr><td>&nbsp;&nbsp;选项1:"+(col4==null?"":col4)+"</td><td>&nbsp;&nbsp;选项2:"+(col5==null?"":col5)+"</td></tr>");
    out.println("<tr><td>&nbsp;&nbsp;选项3:"+(col6==null?"":col6)+"</td><td>&nbsp;&nbsp;选项4:"+(col7==null?"":col7)+"</td></tr>");
    if (col8!=null && !col8.equals(""))
    {
    out.println("<tr><td colspan=2>备注:"+col8+"</td></tr>");
    }
    out.println("</table><br>");
    i++;
    }
    %>
    <table width=600>
    <tr bgcolor=#b5dbff>
    <form method=GET action=index.jsp>
    <td width=80 align=center valign=bottom>共 <%=PageCt.getTotalnum()%> 条</td>
    <td width=80 align=center valign=bottom><%=PageCt.getCurpage()+1%>/<%=PageCt.getTotalpage()%> 页</td>
    <td width=120 align=center>查看第 <input type=text name=Query_Page size=3> 页</td>
    <td width=50 align=center valign=bottom><a href=index.jsp?currentpage=<%=PageCt.getPrepage()%>>上页</a></td>
    <td width=50 align=center valign=bottom><a href=index.jsp?currentpage=<%=PageCt.getNextpage()%>>下页</a>
    </td>
    </tr>
    </table>
    <br><br><br>
    <table cellspacing=20>
    <tr>
    <td>问题包含<input type=text name=question_str size=10 value=<% if (question_str != null) out.println(question_str); %> ></td>
    <td>答案包含<input type=text name=answer_str size=10 value=<% if (answer_str != null) out.println(answer_str); %> ></td>
    <td>选项包含<input type=text name=sel_str size=10 value=<% if (sel != null) out.println(sel); %> ></td>
    </tr>
    <tr>
    <td colspan=3 align=center><input type=submit value=查询></td>
    </tr>
    </form>
    </table>
    <br><br>
    <a href="insert.jsp">添加</a>
    <center>
    </body>
    </html> 
      

  5.   

    这个是个好办法,不过还有优化的余地,不说呵呵,先看看别人的意见。大侠还是直接说出来嘛,发扬java开源精神
      

  6.   

    上面这个其实是当时我写分页时参考的例子
    因为整和成我的jsp后,代码很乱,怕楼主卡不懂,所以
    建议楼主参考我以前参考过的例子,主要是思路。
      

  7.   

    也可以提供网址
    http://dev.21tx.com/2003/07/18/10081.html
      

  8.   

    那Sybase数据库,有谁知道利用Sql分页的Sql代码
      

  9.   

    J2EE的优势就在于有众多的优秀框架和工具,放着hibernate现成的分页不用是不是优点舍本逐末了呢,这些框架和工具的用处就在于把程序员从繁杂的重复代码中解放出来,而把重点转移到业务逻辑的思考上,诚然,不会写SQL不算个好的程序员,但是要看到,当别人一天完成N个有效模块而有些人还在为SQL头痛,又是什么感觉?个人认为实在不必去追求某个数据库对应的分页如何解决。。况且你要找的 SQL可以直接到hibernate的源代码中找,呵呵保证实用,高效
      

  10.   

    呵呵,1K用户?你以为现在的服务器都是吃素的?你要做IK拥护的东西用个PC去当服务器?拜托,SSH就这么不禁折腾还要他干屁,有方便的东西干嘛不用,再说你要自己写SQL也未见得比hibernat的写的好,你不愿意用HIBERNATE,也可以把人家的SQL拿来看看,你4颗星了不起是吧,笑死了,老子用JDBC写税务系统的时候你还不知道干什么呢
      

  11.   

    再说两句,HIBERNATE已经成为EJB3.0的标准之一,难道你认为为分布式准备的EJB应付不了1K用户?笑话!!
    HIBERNATE这类的ORM工具已经成为趋势,.NET也在向这方面靠拢,你难道认为,人家都傻了啊
      

  12.   

    CPLiu(老了),你倒说说用HIBERNATE你如何进行这个优化?
    我想听听你的高见,请说明一些详细的步骤
      

  13.   

    一个将数据分页的存储过程    
     CREATE PROCEDURE sp_page
      @tb         varchar(50), --表名
      @col        varchar(50), --按该列来进行分页
      @coltype    int,         --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
      @orderby    bit,         --排序,0-顺序,1-倒序
      @collist    varchar(800),--要查询出的字段列表,*表示全部字段
      @pagesize   int,         --每页记录数
      @page       int,         --指定页
      @condition  varchar(800),--查询条件
      @pages      int OUTPUT   --总页数
    AS
    /*
    功能描述:对指定表中满足条件的记录按指定列进行分页查询,分页可以顺序、倒序以前看过的
      

  14.   

    想求一个SQL分页的存储过程。本人是对sql语句不数,望多给出注释!!!