java实现分页查询
一.抽取页面模型和页码部分jsp
①按照下图红色选框中的内容进行页面抽取
import java.util.List;
/**
* 存放分页相关的数据
* @param <T>
*
*/
public class Page<T> {
//基本属性
private int currentPage;//当前页数,由用户指定
private int pageSize = 5 ;//每页显示的条数,固定的
private int totalRecords;//总记录条数,数据库查出来的
private int totalPage;//总页数,计算出来的
private int startIndex;//每页开始记录的索引,计算出来的
private int prePage;//上一页
private int nextPage;//下一页
private int startPage;//开始页码
private int endPage;//结束页码
private List<T> list;//已经分好页的结果集,该list中只有10条记录
//点击页码要访问的url
private String url;
//要想使用我的分页,必须给我三个参数。一个是要看哪一页,另一个是总记录条数和每页显示几条记录
public Page(int currentPage,int totalRecords,int pageSize){
this.currentPage = currentPage;
this.totalRecords = totalRecords;
this.pageSize=pageSize;
//计算查询记录的开始索引
startIndex = (currentPage-1)*pageSize;
//计算总页数
totalPage = totalRecords%pageSize==0?(totalRecords/pageSize):(totalRecords/pageSize+1);
//设置每页显示九个页码
startPage = currentPage - 4; //5
endPage = currentPage + 4; //13
//设置前一页与后一页
getPrePage();
getNextPage();
//看看总页数够不够9页
if(totalPage>9){
//超过了9页
if(startPage < 1){
startPage = 1;
endPage = startPage+8;
}
if(endPage > totalPage){
endPage = totalPage;
startPage = endPage-8;
}
}else{
//不够9页
startPage = 1;
endPage = totalPage;
}
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getStartIndex() {
return startIndex;
}
public void setStartIndex(int startIndex) {
this.startIndex = startIndex;
}
//不提供getPrePage()
public int getPrePage() {
this.prePage = currentPage-1;
if(prePage<1){
prePage = 1;
}
return prePage;
}
//不提供setNextPage()
public int getNextPage() {
this.nextPage = currentPage+1;
if(nextPage>totalPage){
nextPage = totalPage;
}
return nextPage;
}
public int getStartPage() {
return startPage;
}
public void setStartPage(int startPage) {
this.startPage = startPage;
}
public int getEndPage() {
return endPage;
}
public void setEndPage(int endPage) {
this.endPage = endPage;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
②.将底部页码内容放置在单独的一个jsp中
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%--分页显示的开始 --%>
<div style="text-align:center"> 共${page.totalPage}页/第${page.currentPage}页
<c:if test="${page.currentPage != 1 }">
<a href="${pageContext.request.contextPath}/${page.url}¤tPage=1">首页</a>
<a href="${pageContext.request.contextPath}/${page.url}¤tPage=${page.prePage}">上一页</a>
</c:if>
<%--显示的页码,使用forEach遍历显示的页面 --%>
<c:forEach begin="${page.startPage}" end="${page.endPage}" varStatus="i">
<c:if test="${i.index == page.currentPage }">
<span>${page.currentPage}</span>
</c:if>
<c:if test="${i.index != page.currentPage }">
<a href="${pageContext.request.contextPath}/${page.url}¤tPage=${i.index}">${i.index}</a>
</c:if>
</c:forEach>
<c:if test="${page.currentPage != page.totalPage}">
<a href="${pageContext.request.contextPath}/${page.url}¤tPage=${page.nextPage}">下一页</a>
<a href="${pageContext.request.contextPath}/${page.url}¤tPage=${page.totalPage}">末页</a>
</c:if>
<input type="text" id="page" name="page" size="1"/><input type="button" value="前往" onclick="jump()" />
<script type="text/javascript">
function jump(){
var totalpage = ${page.totalPage};
var page = document.getElementById("page").value;
//判断输入的是一个数字
var reg =/^[1-9][0-9]{0,1}$/;
if(!reg.test(page)){
//不是一个有效数字
alert("请输入符合规定的数字");
return ;
}
//判断输入的数字不能大于总页数
if(parseInt(page)>parseInt(totalpage)){
//超过了总页数
alert("不能大于总页数");
return;
}
//转向分页显示的Servlet
window.location.href="${pageContext.request.contextPath}/${page.url}¤tPage="+page;
}
</script>
</div>
<%--分页显示的结束--%>
二.获得页面模型流程
①在业务层获取要访问的当前页数(currentPage)、记录总数(totalRecords)、每页显示记录数(pageSize)封装到一个Page中
②根据Page中的数据开始索引(startIndex)和每页显示记录数(pageSize)去查询数据库并返回list
③将list放入Page中并设置Page的Url属性作为页码的跳转路径
⑤将该Page返回web层并放入请求域中转发到数据显示页面进行读取