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方式不带查询的参数条件),然后再处理编码问题得到参数条件。完成搜索查询。