分页的两种方式,一种是真分页,另一种是假分页。真分页也就是在界面根据要显示的数据页在数据库中查询相应的数据,并显示在页面上。而假分页是将数据库中的该内容的数据全部取出到页面,然后根据要显示的内容进行显示。两种方法各有优劣。本文介绍真分页。
1.分页工具类
import java.util.ArrayList;
import java.util.List;
/**
*
* @author RongGong
* @param <T>
* 提供两种构造方法:
* 1.空构造
* 2.带3个参数构造
* totalCount总记录条数,currentPage当前页,everyPage每页显示条数
*/
public class Page<T> {
/*
1.每页显示数量(everyPage)
2.总记录数(totalCount)
3.总页数(totalPage)
4.当前页(currentPage)
5.起始点(beginIndex)
6.是否有上一页(hasPrePage)
7.是否有下一页(hasNextPage)
8.分页显示的页数,比如在页面上显示1,2,3,4,5页,start就为1
9.end就为5,这个也是算过来的
10.将每页要显示的数据放在list集合中
*/
private int everyPage;
private int totalCount;
private int totalPage;
private int currentPage;
private int beginIndex;
private boolean hasPrePage;
private boolean hasNextPage;
private int start;
private int end;
private List<T> list;
/*
思考上面的10个列出数据中那些可以计算出来,哪些是需要已知的;
经过分析可以知道只有三个参数是必须要已知的,分别是:
每页显示数量(everyPage)
总记录数(totalCount)
当前页(currentPage)
*/
public Page(){
list = new ArrayList<T>();
}
public Page(int totalCount,int currentPage, int everyPage) {
this.totalCount = totalCount;
//1.设置当前页
if(currentPage == 0){
//设置默认当前页为第1页
this.currentPage = 1;
}else{
this.currentPage = currentPage;
}
//2.设置每显示数目
if(everyPage == 0){
//设置默认每页显示10条数据
this.everyPage = 10;
}else{
this.everyPage = everyPage;
}
//3.totalPage 总页数
if(totalCount % this.everyPage == 0){
//说明整除,正好每页显示pageSize条数据,没有多余一页要显示少于pageSize条数据的
this.totalPage = totalCount/this.everyPage;
}else{
//不整除,就要在加一页,来显示多余的数据。
this.totalPage = totalCount/this.everyPage+1;
}
//4.设置开始索引
this.beginIndex = (this.currentPage - 1)*this.everyPage;
//显示5页,这里自己可以设置,想显示几页就自己通过下面算法修改
this.start = 1;
this.end = 5;
//5.显示页数的算法
if(this.totalPage <= 5){
//总页数都小于5,那么end就为总页数的值了。
this.end = this.totalPage;
}else{
//总页数大于5,那么就要根据当前是第几页,来判断start和end为多少了;
//假设当前页是第3页,那么start = 1,end = 5
//假设当前页是第1页,那么start = -2,end = 3
this.start = this.currentPage - 2;
this.end = this.currentPage + 2;
if(start <= 0){
//比如当前页是第1页,或者第2页,那么就不如和这个规则.
this.start = 1 ;
this.end = 5;
}//endif
if(this.end > this.totalPage){
//比如当前页是倒数第2页或者最后一页,也同样不符合上面这个规则
this.end = this.totalPage;
//注意此处是减去4页
this.start = this.end - 4;
}//endif
}//endif
//6.是否有上一页,需要当前页
this.hasPrePage = (this.currentPage == 1 ? false :true);
//7.是否有下一页,需要总页数和当前页
this.hasNextPage = ((currentPage == this.totalPage || totalPage == 0 ) ? false:true);
}
//提供getter和setter方法
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getEveryPage(){
return everyPage;
}
public int getTotalPage() {
return totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public boolean isHasPrePage() {
return hasPrePage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public int getStart() {
return start;
}
public int getEnd() {
return end;
}
}
2.测试案例:
2.1新建一个UserDaoImpl.java
至于新建一个模型之类的就不再叙述,本文记录部分关键点,有需要的可以下载源码或者联系我。
2.2新建一个servlet
2.3测试结果:
结束语:在学习javaweb的过程中,遇到了很多挑战,比如说在这个分页的情况下,每一个人的理解不一样写出来分页的代码也不一样,本人也是在经过多番学习他人风格的过程中再次复写了分页工具类,虽然这个工具类写的不一定很好,但是在我当前的情况下足够用了,能够将别人的东西弄明白再自己写出来对自己来说真的有很多提升空间。同时以前自己从来没有弄明白过的真分页,自己这次是真的弄明白了,我写此篇博客的初心是希望有缘者看到这篇博客能让对方初学入门减少阻力。另外我也会将自己的源码放在网络上,供后来者交流学习。
真分页例子源代码:http://download.csdn.net/download/rong_gong/10253551