前端需要传递的参数:pageNumber(页码,必填默认为1),pageSize(每页显示的记录数)
后台的封装Page类为以下代码:
public class Pager<T> {
private List<T> list; // 对象记录结果集
private int total = 0; // 总记录数
private int limit = 10; // 每页显示记录数
private int start = 0;// 起始点
private int pages = 1; // 总页数
private int pageNumber = 1; // 当前页
private boolean isFirstPage = false; // 是否为第一页
private boolean isLastPage = false; // 是否为最后一页
private boolean hasPreviousPage = false; // 是否有前一页
private boolean hasNextPage = false; // 是否有下一页
private int navigatePages = 8; // 导航页码数
private int[] navigatePageNumbers; // 所有导航页号
public Pager() {
}
public Pager(int total, int pageNumber) {
init(total, pageNumber, limit);
}
public Pager(int total, int pageNumber, int limit) {
init(total, pageNumber, limit);
}
private void init(int total, int pageNumber, int limit) {
// 设置基本参数
this.total = total;
this.limit = limit;
this.pages = (this.total - 1) / this.limit + 1;
// 根据输入可能错误的当前号码进行自动纠正
if (pageNumber < 1) {
this.pageNumber = 1;
} else if (pageNumber > this.pages) {
this.pageNumber = this.pages;
} else {
this.pageNumber = pageNumber;
}
this.start = (this.pageNumber - 1) * this.limit;
// 基本参数设定之后进行导航页面的计算
calcNavigatePageNumbers();
// 以及页面边界的判定
judgePageBoudary();
}
/**
* 计算导航页
*/
private void calcNavigatePageNumbers() {
// 当总页数小于或等于导航页码数时
if (pages <= navigatePages) {
navigatePageNumbers = new int[pages];
for (int i = 0; i < pages; i++) {
navigatePageNumbers[i] = i + 1;
}
} else { // 当总页数大于导航页码数时
navigatePageNumbers = new int[navigatePages];
int startNum = pageNumber - navigatePages / 2;
int endNum = pageNumber + navigatePages / 2;
if (startNum < 1) {
startNum = 1;
// (最前navPageCount页
for (int i = 0; i < navigatePages; i++) {
navigatePageNumbers[i] = startNum++;
}
} else if (endNum > pages) {
endNum = pages;
// 最后navPageCount页
for (int i = navigatePages - 1; i >= 0; i--) {
navigatePageNumbers[i] = endNum--;
}
} else {
// 所有中间页
for (int i = 0; i < navigatePages; i++) {
navigatePageNumbers[i] = startNum++;
}
}
}
}
/**
* 判定页面边界
*/
private void judgePageBoudary() {
isFirstPage = pageNumber == 1;
isLastPage = pageNumber == pages && pageNumber != 1;
hasPreviousPage = pageNumber != 1;
hasNextPage = pageNumber != pages;
}
<span style="white-space:pre"> </span>//省去get()set()方法
}
后台先统计要被展示的总记录条数,total,例如:
// 总记录数(根据不同框架代码样式有所不同,总之就是要获取需要查询的记录总数)
int total = XXXDAO.getXXXTotal(params);
获取总记录数后即可通过以下代码生成page类
//total(记录总数),page(查询页码,前端传递获得),pageSize(每页显示记录数,前端获取亦可,后端定义亦可),XXX表示展示需要封装的类(例如:需要展示User信息,XXX即U//SER类)
Pager<XXX> pager = new Pager<XXX>(total,page,pageSize);
在sql语句中加入查询的开始条数以及结束条数字段,这两个字段可以从以下代码获取
pager.getStart();//开始记录数
pager.getLimit();//结束记录数
select * from xxx limit #{start},#{limit}
将结果集放入page中
pager.setList(list);
return pager;
<span style="white-space:pre"> </span><div class="am-cf">
<span style="white-space:pre"> </span>共 ${pager.total} 条记录,当前${pager.pageNumber}页
<span style="white-space:pre"> </span><div class="am-fr">
<ul class="am-pagination">
<c:if test="${pager.hasPreviousPage}">
<li><a onclick="pageDataCountForCUser('${pager.pageNumber-1}')">«</a></li>
</c:if>
<c:if test="${!pager.hasPreviousPage} ">
<li><a href="javascript:">«</a></li>
</c:if>
<c:forEach items="${pager.navigatePageNumbers}" var="num">
<li><a onclick="pageDataCountForCUser('${num}') " ${pager.pageNumber == num ? "style='background-color: #4086CB;co<span style="white-space:pre"> </span>lor: white;font-weight: bold'" : "" }>${num}</a></li>
</c:forEach>
<c:if test="${pager.hasNextPage}">
<li><a onclick="pageDataCountForCUser('${pager.pageNumber+1}')">»</a></li>
</c:if>
<c:if test="${!pager.hasNextPage}">
<li><a href="javascript:void(0)">»</a></li>
</c:if>
</ul>
</div>
</div>