JavaWeb的分页

1.什么是分页

第N页/共M页   首页  上一页 1 2 3 4 5 6 7 8 9 下一页 尾页  [  ]  go

  分页的优点:只查询一页,不用查询所有页!

2.分页数据

  页面的数据都是由Servlet传递过来的!

  Servlet:

  1.*当前页:pageCode,pc;

    >pc:如果页面没有传递当前页码,那么Servlet默认是第一页,或者按页面传递的为准!

  2.*总页数:totalPages,tp

    >tp:总记录数/每页记录数

  3.*总记录数:totalRecored,tr

    >tr:dao来获取,select count(*) from 表;

  4.*每页记录数:业务数据或叫系统数据!(由我们自己来定义)

  5.*当前页数据:beanList

  6.*url

3.数据的传递

  这些分页数据总要在各层之间来回传递!

我们把这些分页数据封装到一个Javabean中,它就叫分页Bean,例如:PageBean

 1 package cn.itcast.cstm.domain;
 2 
 3 import java.util.List;
 4 
 5 public class PageBean<T> {
 6     private int pc;// 当前页码page code
 7 //    private int tp;// 总页数total page---不需要了,只需get得到
 8     private int tr;// 总记录数total record
 9     private int ps;// 每页记录数page size
10     private List<T> beanList;// 当前页的记录
11     
12     private String url;//它就是url后的条件!
13 
14     public String getUrl() {
15         return url;
16     }
17 
18     public void setUrl(String url) {
19         this.url = url;
20     }
21 
22     public int getPc() {
23         return pc;
24     }
25 
26     public void setPc(int pc) {
27         this.pc = pc;
28     }
29 
30     /**
31      * 计算总页数
32      * @return
33      */
34     public int getTp() {
35         // 通过总记录数和每页记录数来计算总页数
36         int tp = tr / ps;
37         return tr%ps==0 ? tp : tp+1;
38     }
39 
40 //    public void setTp(int tp) {
41 //        this.tp = tp;
42 //    }
43 
44     public int getTr() {
45         return tr;
46     }
47 
48     public void setTr(int tr) {
49         this.tr = tr;
50     }
51 
52     public int getPs() {
53         return ps;
54     }
55 
56     public void setPs(int ps) {
57         this.ps = ps;
58     }
59 
60     public List<T> getBeanList() {
61         return beanList;
62     }
63 
64     public void setBeanList(List<T> beanList) {
65         this.beanList = beanList;
66     }
67 }

4.分页在各层中的处理

  *页面:给出分页相关的链接们!

    >页面需要给Servlet传递什么:有可能传递pc(当前页码)

  *Servlet:创建PageBaen对象,给PageBean所有的属性赋值,然后传递给页面。

    >Servlet需要给Dao传递

  *Service:调用dao层方法。(中转)

  *Dao:

    >tr(总记录数):select count(*)  表名;

    >beanList:select *from 表名 limit x, y;(从数据库中查询从第x行开始,查y条记录---是MySQL的方言)

 

 5.显示分页页码列表

1 2 3 4 5 6 7 8 9 10

  # 最多显示多少个页码!(暂定为10);

  # 当前页,在页码中列表中的位置,定为6;

  只需要当前页码来定出来页码表!

  定下来页码列表只需要两样数据:

    begin

    end

    10 11 12 13 14 (15) 16 17 18 19

  需要使用pc来推算出begin和end

  begin=pc-5 

  end=pc+4

计算公式:

  # 如果总页数<=10(列表长度),那么begin=1,end=总页数

  # 使用公式计算:begin=pc-5,end=pc+4;

    # 头溢出:当begin<1时,让begin=1;

    # 尾溢出:当end>${tp}最大页数,让end=${tp}

 6.在超链接中要保留参数(搜索时的条件)

   当使用多条件查询后,然后再点击第二页时,这个第二页超链接没有条件了,所以会丢失条件,所以我们需要在页面上的所有链接都要保留条件!

   我们要把条件以一个字符串的形式保存到PageBean的url中!这个任务交给Servlet!

也就是获取请求的路径及参数(参数中不包括当前页pc)

    /**
     * 截取url
     *    /项目名/Servlet路径?参数字符串
     * @param request
     * @return
     */
    private String getUrl(HttpServletRequest request){
         String contextPath=request.getContextPath();//获取项目名
         String servletPath = request.getServletPath();//获取Servlet路径
         String queryString = request.getQueryString();//获取?之后的参数
         
         //判断参数部分是否包含pc这个参数,如果包含,需要截取下去,不要这一部分。
         if(queryString.contains("&pc=")){
             //返回指定子字符串在此字符串中最右边出现处的索引
             int index=queryString.lastIndexOf("&pc=");
             queryString=queryString.substring(0, index);
         }
         
         return contextPath+servletPath+"?"+queryString;
    }

 把这次请求得到的路径保存到PageBean对象中,然后可以在页面获取,从而不会丢失参数,完成查询的分页。

注意:在搜索查询的时候,也就是在Dao层的SQL语句上增加where子句,返回一个PageBean(其中BeanList是查询得到的对象集合),然后再分页实现。

    请求的时候的form表单的请求方式为GET,这样所得的URL路径中包含查询的参数条件(POST方式不带查询的参数条件),然后再处理编码问题得到参数条件。完成搜索查询。

猜你喜欢

转载自www.cnblogs.com/xjs1874704478/p/10923289.html