数据库分页操作
分页操作有很广泛的应用,比如百度搜索时,上千万条的数据不可能一次性都显示出来,一方面是缓解服务器的压力,另一方面加载大量的数据也需要耗时很长时间,因此分页操作就很有必要了。
要实现的效果:
前台页面
<div class="pagin">
<div class="message">
共 <i class="blue">${pageTool.totalCount}</i>条记录,
当前显示第 <i class="blue">${pageTool.currentPage} </i>页,
共 <i class="blue">${pageTool.pageSize } </i>页
</div>
<ul class="paginList">
<li class="paginItem"><a
<!-- 点击首页,调用查询方法,并传入当前页的页码 -->
href="${pageContext.request.contextPath}/user?func=findAllUser¤tPage=1">首页</a></li>
<li class="paginItem"><a
<!-- 点击首页,调用查询方法,并传入pageTool中封装的lastPage -->
href="${pageContext.request.contextPath}/user?func=findAllUser¤tPage=${pageTool.lastPage}">上一页</a>
</li>
<li class="paginItem"><a
<!-- 点击首页,调用查询方法,并传入pageTool中封装的nextPage -->
href="${pageContext.request.contextPath}/user?func=findAllUser¤tPage=${pageTool.nextPage}">下一页</a>
</li>
<li class="paginItem"><a
<!-- 点击首页,调用查询方法,并传入pageTool中封装的pageSize -->
href="${pageContext.request.contextPath}/user?func=findAllUser¤tPage=${pageTool.pageSize}">尾页</a>
</li>
</ul>
</div>
需要构建的工具类
在调用该工具类时,只需调用该工具类的构造方法即可。
传入的参数:
- Integer totalCount 总记录数,数据库查询可得。
- String currentPage 当前页,从前台获取
request.getParameter
。
package com.example.bean;
public class PageTool {
private Integer totalCount; //总记录数,从数据库中查询可得
private Integer pageSize; //总页数,可计算得出
private Integer currentPage; //当前页码,前台获取得到
private Integer lastPage; //上一页,可计算得出
private Integer nextPage; //下一页,可计算得出
private Integer startIndex; //每一页的起始下标,可计算得出
private Integer pageCount; //每页数据量,固定值或者下拉选择动态获取
public PageTool(Integer totalCount, String currentPage) {
super();
this.totalCount = totalCount;
this.pageCount = 5; //每页数据量,取固定值5
//初始化当前页
initCurrentPage(currentPage);
//初始化总页数
initPageSize();
//初始化上一页
initLastPage();
//初始化下一页
initNextPage();
//初始化起始下标
initStartindex();
}
//初始化起始下标,起始下标 = (当前页-1) * 每页显示几条记录
private void initStartindex() {
startIndex = (currentPage - 1) * pageCount;
}
//初始化下一页
private void initNextPage() {
if (currentPage == pageSize) {
//当前页如果是最后一页,那么下一页仍是最后一页
nextPage = pageSize;
} else {
//当前页不是最后一页,那么下一页=当前页+1
nextPage = currentPage + 1;
}
}
//初始化上一页
private void initLastPage() {
if (currentPage == 1) {
//当前页是第一页,上一页仍是第一页
this.lastPage = 1;
} else {
//当前页不是第一页,上一页=当前页-1
this.lastPage = currentPage - 1;
}
}
//初始化总页数
private void initPageSize() {
//先求整页数,如果有余数的话在加上一页
this.pageSize = this.totalCount / this.pageCount + (this.totalCount % this.pageCount == 0 ? 0 : 1);
}
//初始化当前页
private void initCurrentPage(String currentPage) {
if (currentPage == null || "".equals(currentPage)) {
//说明首次进入该页面展示数据,没有点击任何按钮,获取到的参数为空,所以默认值设置为1
this.currentPage = 1;
} else {
//说明点击了具体的某一页
this.currentPage = Integer.valueOf(currentPage);
}
}
public Integer getTotalCount() {
return totalCount;
}
public void setTotalCount(Integer totalCount) {
this.totalCount = totalCount;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
public Integer getCurrentPage() {
return currentPage;
}
public void setCurrentPage(Integer currentPage) {
this.currentPage = currentPage;
}
public Integer getLastPage() {
return lastPage;
}
public void setLastPage(Integer lastPage) {
this.lastPage = lastPage;
}
public Integer getNextPage() {
return nextPage;
}
public void setNextPage(Integer nextPage) {
this.nextPage = nextPage;
}
public Integer getStartIndex() {
return startIndex;
}
public void setStartIndex(Integer startIndex) {
this.startIndex = startIndex;
}
public Integer getPageCount() {
return pageCount;
}
public void setPageCount(Integer pageCount) {
this.pageCount = pageCount;
}
}
调用工具类的servlet
//构建分页对象
//获取totalCount,从数据库查询得到
Integer totalCount = userService.getUserCount();
//从前台获取的currentPage
String currentPage = request.getParameter("currentPage");
//调用工具类的构造方法
PageTool pageTool = new PageTool(totalCount, currentPage);
List<User> userList = userService.findAllUser(pageTool);
//将分页结果放入request域中
request.setAttribute("userList", userList);
//将分页工具类对象放入request域中
request.setAttribute("pageTool", pageTool);
request.getRequestDispatcher("/admin/user_list.jsp").forward(request, response);