第N页/共M页 首页 上一页 1 2 3 4 5 6 7 8 9 下一页 尾页 [ ] gojava
分页的优势:只查询一页,不用查询全部页!数据库
页面的数据都是由Servlet传递过来的!dom
Servlet:this
1.*当前页:pageCode,pc;编码
>pc:若是页面没有传递当前页码,那么Servlet默认是第一页,或者按页面传递的为准!url
2.*总页数:totalPages,tpspa
>tp:总记录数/每页记录数code
3.*总记录数:totalRecored,trorm
>tr:dao来获取,select count(*) from 表;对象
4.*每页记录数:业务数据或叫系统数据!(由咱们本身来定义)
5.*当前页数据:beanList
6.*url
这些分页数据总要在各层之间来回传递!
咱们把这些分页数据封装到一个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 }
*页面:给出分页相关的连接们!
>页面须要给Servlet传递什么:有可能传递pc(当前页码)
*Servlet:建立PageBaen对象,给PageBean全部的属性赋值,而后传递给页面。
>Servlet须要给Dao传递
*Service:调用dao层方法。(中转)
*Dao:
>tr(总记录数):select count(*) 表名;
>beanList:select *from 表名 limit x, y;(从数据库中查询从第x行开始,查y条记录---是MySQL的方言)
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}
当使用多条件查询后,而后再点击第二页时,这个第二页超连接没有条件了,因此会丢失条件,因此咱们须要在页面上的全部连接都要保留条件!
咱们要把条件以一个字符串的形式保存到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方式不带查询的参数条件),而后再处理编码问题获得参数条件。完成搜索查询。