使用方式
前端需要送出參數目前頁數currentPage,背景從資料庫中查詢出資料并将資料封裝到PageInfo類中,把封裝好的pageInfo對象傳遞給前端并解析。
//根據查詢結果傳回list集合的資料
List<Goods> data = userService.findAll();
//建立一個PageInfo對象,傳入泛型類
PageInfo<Goods> pageInfo = new PageInfo<Goods>();
/*
封裝pageInfo資料 :
第一個參數為list集合的資料
第二個參數為目前頁
第三個參數為每頁顯示資料條數
*/
pageInfo.setPageInfo(data,currentPage,12);
前端代碼
<!-- 顯示分頁資訊 -->
<div class="col-md-12" style="text-align: center;">
<div class="col-md-6 col-sm-offset-3" id="page_nav_area">
<nav aria-label="Page navigation ">
<ul class="pagination">
<!-- 跳轉的背景方法,目前頁currentPage=1 -->
<li><a href="${Path}/UserController/mainUI?currentPage=1">首頁</a></li>
<!-- 判斷是否有上一頁 -->
<c:if test="${pageInfo.hasPrePage}">
<li>
<!-- 如果有上頁,currentPage=上一頁 -->
<a href="${Path}/UserController/mainUI?currentPage=${pageInfo.prePage}" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li>
</c:if>
<!-- 循環顯示頁碼 -->
<c:forEach var="array" items="${pageInfo.pageArray}">
<c:choose>
<!-- 如果等于目前頁,則選中 -->
<c:when test="${pageInfo.currentPage == array}">
<li class="active"><a href="#">${array}</a></li>
</c:when>
<c:otherwise>
<!-- 如果不等于目前頁,則正常顯示 -->
<li><a href="${Path}/UserController/mainUI?currentPage=${array}">${array}</a></li>
</c:otherwise>
</c:choose>
</c:forEach>
<!-- 判斷是否有下一頁 -->
<c:if test="${pageInfo.hasNextPage}">
<li>
<!-- 如果有上頁,currentPage=下一頁 -->
<a href="${Path}/UserController/mainUI?currentPage=${pageInfo.nextPage}" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</c:if>
<!-- 跳轉尾頁,目前頁currentPage=最大頁數 -->
<li><a href="${Path}/UserController/mainUI?currentPage=${pageInfo.pageCount}">尾頁</a></li>
</ul>
<ul class="pagination">
<!-- 顯示總條數,總頁數 -->
<li>
<span class="label label-info" style="font-size: 15px;">總${pageInfo.totalRecord}條,共${pageInfo.pageCount}頁</span>
</li>
</ul>
</nav>
</div>
</div>
效果
PageInfo中的屬性
//目前頁
private int currentPage;
//總頁數
private int pageCount;
//總條數
private int totalRecord;
//頁面大小
private int pageSize;
//是否有下一頁
private boolean hasNextPage;
//是否有上一頁
private boolean hasPrePage;
//目前頁碼數組
private int[] pageArray;
//目前頁資料
private List<T> list;
//下一頁
private int nextPage;
//上一頁
private int prePage;
//是否是第一頁
private boolean isFirstPage;
//是否是最後一頁
private boolean isLastPage;
//開始行數
private int startRow;
//結束行數
private int endRow;
//需要顯示多少頁
private int navigatePages;
public PageInfo() {
this.navigatePages = 5; //預設顯示5頁
this.hasPrePage = true;
this.hasNextPage = true;
this.isFirstPage = false;
this.isLastPage = true;
}
設定分頁參數和資料
//計算頁碼邏輯
public void setPageInfo(List<T> list,int currentPage,int pageSize){
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalRecord = list.size();
this.pageCount = (int)Math.ceil((totalRecord*1.0) / pageSize);
//判斷是否有無前頁或後頁
if (currentPage == 1){
this.hasPrePage = false;
this.prePage = -1;
this.isFirstPage = true;
}else {
this.prePage = currentPage - 1;
}
if (currentPage == pageCount){
this.hasNextPage = false;
this.nextPage = -1;
this.isLastPage = true;
}else {
this.nextPage = currentPage + 1;
}
this.pageArray = this.culArray(currentPage,pageSize,totalRecord,pageCount);
this.startRow = (currentPage-1)*pageSize + 1;
this.endRow = startRow+pageSize-1;
if (endRow>totalRecord){
endRow = totalRecord;
}
this.list = new ArrayList<>();
for (int i=0;i<(endRow-startRow+1);i++){
this.list.add(list.get(startRow-1+i));
}
}
//計算顯示的頁數
private int[] culArray(int currentPage,int pageSize,int totalRecord,int pageCount){
int[] array;
if (pageCount<=navigatePages){
array = new int[pageCount];
for (int i=0;i<pageCount;i++){
array[i] = i + 1;
}
}else {
array = new int[navigatePages];
if (currentPage <= (navigatePages/2)){
for (int i=0;i<navigatePages;i++){
array[i] = i + 1;
}
}
else {
int x = pageCount-(navigatePages/2);
if (currentPage>x){
int start = pageCount - navigatePages + 1;
for (int i=0;i<navigatePages;i++){
array[i] = start + i;
}
}else {
int start = currentPage - (navigatePages/2);
for (int i=0;i<navigatePages;i++){
array[i] = start + i;
}
}
}
}
return array;
}
完整代碼
碼雲位址:分頁工具類PageInfo