黑马程序员技术交流社区

标题: 【求助】JSP分页有谁会啊?<已解决> [打印本页]

作者: 王晓新    时间: 2012-6-12 22:17
标题: 【求助】JSP分页有谁会啊?<已解决>
本帖最后由 王晓新 于 2012-6-12 22:39 编辑

我在做一个新闻发布系统,首页显示新闻标题,由于数据库中新闻数量较多,页面不好看,所以想用分页技术来处理一下。请问谁会分页?jsp做的。
作者: 刘笑    时间: 2012-6-12 22:22
有两种思路:
1.查询数据库时就把所有的查询结果作为一个结果集返回到页面,然后在页面级进行分页,取若干条作为一页呈现出来,换页时就是取结果集中的下一批数据。
在结果集记录很多的时候不适用。

2.在数据库查询时就加上分页限制,例如页面大小为20(即每页显示20条),当前查询的是第1页,那么查数据库的时候SQL语句就限定查询记录数为1到20行。类似,页面翻页到第2页,其实就是查询第21到40条记录。关于如何限定查询记录数量,各种数据库写法不一样,有的用top(例如SQL Server),有的用limit(例如MySQL),有的用rownum(例如Oracle),这种查查资料就知道了。

代码实现:首先要定义四个变量:
int pageSize:每页显示多少条记录
int pageNow:希望显示第几页
int pageCount:一共有多少页
int rowCount:一共有多少条记录
说明:
pageSize是指定的 pageNow是用户选择的
rowCount是计算出来的 该计算式为
if(rowCount%pageSize==0){
pageCount=rowCount/pageSize;
}else{
pageCount=rowCount/pageSize+1;
}
(技巧:
数据库插入:
insert into 表名(字段1,2,。。。)select 字段1,2,...from 表名
)
查询语句
select top pageSize字段名列表from表名where id not in
(select top pageSize*(pageNow-1)id from 表名)
以我们前面的users表为例,显示第二页,该查询语句就是:
select top 3 * from users where userId not in(select top 3 userId from users)
(select top 3 userId from users):选出这个表的前三条 前面再选三条

<h1>用户信息列表</h1>
<%
//定义四个分页会用到的变量
int pageSize=3;
int pageNow=1;//默认显示第一页
int rowCount=0;//该值从数据库中查询
int pageCount=0;//该值是通过pageSize和rowCount
//接受用户希望显示的页数(pageNow)
String s_pageNow=request.getParameter("pageNow");
if(s_pageNow!=null){
//接收到了pageNow
pageNow=Integer.parseInt(s_pageNow);
}
//查询得到rowCount
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=System","sa","");
Statement sm=ct.createStatement();
ResultSet rs=sm.exeuteQuery("select count(*) form users ");
if(rs.next()){
rowCount=rs.getInt(1);
}
//计算pageCount
if(rowCount%pageSize==0){
pageCount=rowCount/pageSize;
}else{
pageCount=rowCount/pageSize+1;
}
//查询出需要显示的记录
rs=sm.exeuteQuery("select top "+pageSize
+" * from users where userId not in(select top "
+pageSize*(pageNow-1)+" userId from users) ");
%>
//显示

<table border="1">
<tr><td>用户ID</td><td>用户名字</td><td>密码</td><td>电邮</td><td>级别</td></tr>
<%
while(rs.next()){
%>

<tr><td><%=rs.getInt(1)%></td><td><%=rs.getString(2)%></td>
<td><%=rs.getString(3)%></td><td><%=rs.getString(4)%></td><td><%=rs.getInt(5)%></td></tr>
<%}%>
</table>
<%
//上一页
if(pageNow!=1){
out.println("<a href=wel.jsp?pageNow="+(pageNow-1)+">上一页</a>");
}
//显示超链接
for(int i=1;i<=pageCount;i++){
out.println("<a href=wel.jsp?pageNow="+i+">["+i+"]</a>");
}
//下一页
if(pageNow!=pageCount){
out.println("<a href=wel.jsp?pageNow="+(pageNow+1)+">下一页</a>");
}
%>
作者: 王晓新    时间: 2012-6-12 22:27
刘笑 发表于 2012-6-12 22:22
有两种思路:
1.查询数据库时就把所有的查询结果作为一个结果集返回到页面,然后在页面级进行分页,取若干 ...

我用的Access:Q
作者: 郑传庆    时间: 2012-6-12 22:28
LZ,我把我做的分页步骤给你了哈,代码的实现具体怎么做你根据步骤来弄就OK了,做的时候仔细点.....
分页显示的步骤:
1、查询数据库
2、获取数据库表里面的总记录数 (m)
   移动数据库表里面的指针到最后一行rs.last()、获取最后一行的行号m=rs.getRow()
3、计算总共的页数(n)
   没有要求显示的记录数q(用户说的算,证明是一个常量)
   n=(m%q==0)?m/q:(m/q+1)  11
4、计算每页的显示记录行号p y代表用户要求选择的页数  
   41-50
   p=(y-1)*q+1
5、显示用户选择的页数信息
   移动指针到用户选定的行号p  rs.absolute(int p),循环显示q次 用for循环
   判断指针是否到最后一行  rs.isLast(),跳出循环 if break   rs.isFirst()
6、怎样给用户一个选择页数的窗口?
   超链接 123456789
   文本框输入数据
   上一页 下一页 最后一页 首页
   request.getParameter()
7、用户选择的页数或者记录数超过数据库表里面记录数的范围?
   报错到页面
   给他提示,我们只有的页数
   异常处理
   直接跳到最后一页或者第一页 直接通过赋值
   用javaScript代码控制显示的页数
8、默认用户显示的页数(第一页)rs.first()让指针到第一行

作者: 李元峰    时间: 2012-6-12 22:30
我用的是 预处理语句 preparedStatement 请注意下面的 语句创建的时候  要用重载的方法 加上如下字段 可以是 结果集指定 任意移动 以用来确定显示 指定的 结果集范围
在 ptmt = con.prepareStatement(preparedSql,ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);//允许结果集指针移动
代码参考如下:

<%@ page language ="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import ="bankel.lyf.*,java.sql.*" %>
<html>
   <% request.setCharacterEncoding("UTF-8");
      int originalPage = 1;
      String serverPage = request.getParameter("disPage");
      
      try{
      originalPage = Integer.parseInt(serverPage);
      }catch(NumberFormatException e){
           
             originalPage = 1;
      }
   %>

   <head>
      <title>分页显示查询到的图书</title>
      <link rel="stylesheet" type="text/css" href="template.css"/>
   </head>
   <body>
         <%
             ResultSet rs = null;
             BookDao bookDao = new BookDao();
             bookDao.getConnection("localhost", "orcl", "scott", "tiger");
             String sql = "select * from book";
            
             rs = bookDao.executeQuery(sql,null);
         %>
         
         <%
            int allPageCount;   //总页数
            int everyPageRecord=5; //每页的记录
            int currentPage = originalPage;    //当前页页码
            
            
            int allRecord;      //总记录条数
         
            rs.last();
            allRecord=rs.getRow();
         
            if(allRecord%everyPageRecord==0){
                    allPageCount=allRecord/everyPageRecord;
            }
            else{
                    allPageCount = allRecord/everyPageRecord + 1;
            }
           //移动记录指针到当前页之前
           
           if(currentPage==1){
                   rs.beforeFirst();
           }
           else{
                   rs.absolute((currentPage-1)*5);
           }
         %>
         <table id="coustom">
                  <tr >
                       <td colspan="6" style="text-align:center">
                                                                            一共查询到<%=allRecord %>条记录
                       </td>
                    
                  </tr>
                  <tr>
                         <td>序号</td><td>书名</td><td>出版社</td><td>简介</td><td>价格</td><td>数量</td>
                  </tr>
                  <%
                      int recordNumber=(currentPage-1)*5+1;
                      int first = recordNumber;
                      while(rs.next())
                      {
                  %>
                  <tr>
               <td><%=recordNumber++%></td>
               <td><%=rs.getString("bookname")%></td>
               <td><%=rs.getInt("publisherid")%></td>
               <td><%=rs.getString("description")%></td>
               <td><%=rs.getDouble("price")%></td>
               <td><%=rs.getInt("count")%></td>
          </tr>
          <%
                    if(recordNumber-first>=5){
                            break;
                            }
                      }
          %>
                <tr>
                     <td colspan="6" style="text-align:center">有<%=allRecord %>条记录 ,每页<%=everyPageRecord%>条记录,   共<%=allPageCount %>页
                                                                                                                                                                        当前是第<%=currentPage %>页
                      <%
                          if(currentPage==1)
                          {
                      %>
                         <a href="paging.jsp?disPage=<%=String.valueOf(currentPage+1)%>">下一页</a>
                         <a href="paging.jsp?disPage=<%=String.valueOf(allPageCount)%>">末页</a>
                     <%
                          }
                          else if(currentPage!=allPageCount)
                          {
                     %>
                          <a href="paging.jsp?disPage=<%=String.valueOf(originalPage)%>">首页</a>
                          <a href="paging.jsp?disPage=<%=String.valueOf(currentPage-1)%>">上一页</a>
                          <a href="paging.jsp?disPage=<%=String.valueOf(currentPage+1)%>">下一页</a>
                          <a href="paging.jsp?disPage=<%=String.valueOf(allPageCount)%>">末页</a>
                      <%
                          }
                          else{
                                  
                          
                      %>
                      <a href="paging.jsp?disPage=+<%= originalPage%>">首页</a>
                      <a href="paging.jsp?disPage=<%=(currentPage-1) %>">上一页</a>
                      <%
                          }
                      %>
                     </td>  
                </tr>

         </table>
   </body>
</html>

作者: 王晓新    时间: 2012-6-12 22:32
:handshake李同学的方案不错。。。
作者: 赵兵锋    时间: 2012-6-12 22:43
在ACCESS数据库中,可以使用top嵌套来完成分页。
String sql = "select * from (select top " + getsize(page)+ " * from (select top "+ page*pagesize+ " * from Arctic order by arcticid desc) order by arcticid) order by arcticid desc";
其中的pagesize为每页显示的记录数量,page是第几页,当这样直接这样写会造成每页的记录数都一样多,比如说共3条记录,每页显示2条,第一页显示第1和第2条,第二页会显示第2条和第3条。
所以需要根据数据库中所有记录数和当前第几页算出当前页应该显示几条记录,若有这样的页面会是最后一页。
int getsize(int page){//page是第几页
        String sql = "select count(*) from Arctic";
        rs = this.executeQuery(sql, new Object[] {});
        int c=0;
        try {
                rs.next();
                int size = rs.getInt(1);
                c = pagesize;
                if (size - (page - 1) * pagesize < 10) {//若前面每页都显示10条,轮到page页时,显示记录数少于10条,
                        c = size - (page - 1) * pagesize;//求出page该显示的记录条数。
                }
        } catch (SQLException e) {
                e.printStackTrace();
        }
        return c;
}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2