• Servlet学习:实现分页效果的方法


    分页的算法
    需要定义四个变量,它们有各自的用处
    int pageSize:每页显示多少条记录
    int pageNow:希望显示第几页
    int pageCount:一共有多少页
    int rowCount:一共有多少条记录

    说明:
    pageSize是指定,pageNow是指用户的选择。
    rowCount是从表中查询得到的。
    pageCount是计算出来的,该计算公式为:

    [java] view plain copy
     
    1. if(rowCount%pageSize==0) {  
    2.  pageCount=rowCount/pageSize;  
    3. else {  
    4.  pageCount=rowCount/pageSize+1;  
    5. }  

    如果使用语句:select 字段名列表 from 表名 where id between ? and ?
    这个sql语句确实比较快,但是存在一个问题,即如果表的id被删除了,那么某页可能就会少一条记录。

    因此,最终方法是如下语句:
    select top pageSize 字段名列表 from 表名 where id not in(select top pageSize*(pageNow-1) id from 表名)

    实现代码为:

    [java] view plain copy
     
    1. import javax.servlet.http.*;  
    2. import java.io.*;  
    3. import java.sql.*;  
    4. public class fenye extends HttpServlet{  
    5.  public void doGet(HttpServletRequest req,HttpServletResponse res)  
    6.    {  
    7.         Connection ct=null;  
    8.         PreparedStatement ps=null;  
    9.         ResultSet rs=null;  
    10.           
    11.        int pageSize=3;  //希望每页显示记录的条数  
    12.               int pageNow=1;   //初始化当前页为第一页  
    13.               int pageCount=0; //总页数,需要通过计算得知  
    14.               int rowCount=0;  //记录总数,查表获知  
    15.               String sPageNow=req.getParameter("pageNow");  //接收传递过来的当前页面         
    16.             if(sPageNow!=null)  //若接收到非空值,将其转为整数  
    17.              {  
    18.                    pageNow=Integer.parseInt(sPageNow);  
    19.            }  
    20.          
    21.   
    22.     try{  
    23.                  PrintWriter pw=res.getWriter();  
    24.              Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");  
    25.             ct=DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Students","sa","密码");  
    26.             ps=ct.prepareStatement("select count(*) from [Students].[dbo].[Students]");  //获取表中记录总数  
    27.             rs=ps.executeQuery();  
    28.             while(rs.next())  
    29.             {  
    30.                 rowCount=rs.getInt(1);  //获取表中记录总数  
    31.             }  
    32.             if(rowCount%pageSize==0)   //计算总页面数  
    33.             {  
    34.                 pageCount=rowCount/pageSize;  
    35.             }  
    36.             else  
    37.             {  
    38.                 pageCount=rowCount/pageSize+1;    
    39.             }  
    40.           
    41.  ps=ct.prepareStatement("select top  "+pageSize+" * from [Students].[dbo].[Students] where id not in(select top "+pageSize*(pageNow-1)+" id from [Students].[dbo].[Students])");  
    42.           
    43.     
    44.         rs=ps.executeQuery();  
    45.         pw.println("<body><center>");    //将查询结果以表的形式展现  
    46.         pw.println("<table border=1");  
    47.         pw.println("<tr><th>id</th><th>name</th><th>grade</th></tr>");  
    48.         while(rs.next())  
    49.         {  
    50.             pw.println("<tr>");  
    51.             pw.println("<td>"+rs.getInt(1)+"</td>");  
    52.             pw.println("<td>"+rs.getString(2)+"</td>");  
    53.             pw.println("<td>"+rs.getString(3)+"</td>");  
    54.             pw.println("</tr>");  
    55.         }  
    56.         pw.println("</table>");  
    57.         if(pageNow==1)   //前一页超链接,当已经跳转到第一页时,页面不再改变  
    58.         {  
    59.             pw.println("<a href=fenye?pageNow="+pageNow+">"+"forward"+"</a>");  
    60.         }  
    61.         else      //未跳转到第一页时,每点击一次超链接,页面向前跳转一次  
    62.         {  
    63.             pw.println("<a href=fenye?pageNow="+(pageNow-1)+">"+"forward"+"</a>");  
    64.         }  
    65.         if(pageCount<=5)  //控制显示页数超链接的个数  
    66.         {  
    67.             for(int i=1;i<=pageCount;i++)  
    68.              {  
    69.             pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
    70.              }  
    71.         }else if(pageCount-pageNow<=5)    
    72.         {  
    73.             for(int i=pageNow;i<=pageCount;i++)  
    74.             pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
    75.         }else  //当页面数过多时,为了页面美观需要控制显示超链接个数  
    76.         {  
    77.             for(int i=pageNow;i<=pageNow+5;i++)  
    78.                 pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
    79.         }  
    80.           
    81.         if(pageNow==pageCount)  //已经为最后一页时,点击后一页不再跳转  
    82.          {  
    83.              pw.println("<a href=fenye?pageNow="+pageNow+">"+"backward"+"</a>");  
    84.         }  
    85.         else  
    86.         {  
    87.             pw.println("<a href=fenye?pageNow="+(pageNow+1)+">"+"backward"+"</a>");  
    88.         }  
    89.         pw.println("</center></body>");  
    90.         }catch(Exception ex){  
    91.             ex.printStackTrace();  
    92.         }  
    93.               
    94.    }  
    95.      
    96.  public void doPost(HttpServletRequest req,HttpServletResponse res)  
    97.    {  
    98.     this.doGet(req,res);  
    99.    }  
    100. }  

    执行结果:

    当每页显示记录数为3时:

    点击相应连接可以成功跳转。

    最后一页显示为:

    对应代码:

    [java] view plain copy
     
    1. if(pageCount<=5)  
    2.     {  
    3.         for(int i=1;i<=pageCount;i++)  
    4.          {  
    5.         pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
    6.          }  
    7.     }  

    点击backward不再跳转。

    为了显示程序控制页数超链接数目的效果如何,将每页显示记录数改为1。

    第一页显示效果:

    对应代码:

    [java] view plain copy
     
    1. else  
    2.         {  
    3.             for(int i=pageNow;i<=pageNow+5;i++)  
    4.                 pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
    5.         }  

    当前页码逐渐增大时的显示效果:

     

    对应代码:

    [java] view plain copy
     
      1. else if(pageCount-pageNow<=5)  
      2.         {  
      3.             for(int i=pageNow;i<=pageCount;i++)  
      4.             pw.println("<a href=fenye?pageNow="+i+">"+i+"</a>");  
      5.         }  
  • 相关阅读:
    Binary Search Tree
    uC/OS-II 内存管理
    RLP
    hbase (local mode) remote access
    arm swi 软中断 一例
    模拟uClinux系统调用
    docker with flannel
    tcp并发服务器(c20w)
    浏览器的同源策略及跨域解决方案
    Redis快速入门
  • 原文地址:https://www.cnblogs.com/xinxin1994/p/6243972.html
Copyright © 2020-2023  润新知