这个是分页工具类,有些方法还没完善,但是已经能用。
有个地方需要注意的是,显示在页面的页码【首页】1 2 3 4 5 6【尾页】,该怎么算出来问题请参考方法
PageRange()
- 算法的思路是这样
==可变的因子:总页数C、当前页P。显示的个数(区间):N==
那么有三种情况:
总页数<=显示的区间:页面的码数就是总页数,显示1 2 3 4 ==5==...C
当前页P<=(N+1)/2:页面的码数就是总页数,显示((N+1)/2)-4 ((N+1)/2)-3 ((N+1)/2)-2 ((N+1)/2)-1 ==(N+1)/2==...((N+1)/2)+(P-1)/2
总页数>显示的区间,那么根据当前的P的不同有两种比较特殊的情况:
- P>=(N)
package com.mddworld.web.utils.page;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ModelAttribute;
/**
* 分页封装类
* 用于做分页查询的基础类,封装了一些分页的相关属性
* @author fxb
* @version v1.0
* @param <T>
*/
public class PageResults<T>{
// 当前页
private int currentPage;
//上一页的页数
private int preNo;
//下一页的页数
private int NextNo;
public int getPreNo() {
return preNo;
}
public int getNextNo() {
return NextNo;
}
// 每页个个数
private int perPageSize;
// 总条数
private int totalCount;
// 总页数
private int pageCount;
//尾页
private int maxPages;
//显示在前端的分页按钮比如“第一页 1 2 3 4 5 尾页”
private int[] pageRange;
//数据库中开始的行数
private int beginIndex;
//结果记录
private List<T> results;
public List<T> getResults() {
return results;
}
public void setResults(List<T> results) {
this.results = results;
}
public int getCurrentPage() {
return currentPage;
}
public int getPerPageSize() {
return perPageSize;
}
public int getTotalCount() {
return totalCount;
}
public int getPageCount() {
return pageCount;
}
public int getMaxPages() {
return maxPages;
}
public int[] getPageRange() {
return pageRange;
}
public int getBeginIndex() {
return beginIndex;
}
//获取请求
public HttpServletRequest request;
public HttpServletRequest getRequest() {
return request;
}
//@ModelAttribute
public void setRequest(HttpServletRequest request) {
this.request = request;
}
public PageResults(int currentPage, int perPageSize, int totalCount) {
super();
this.currentPage = currentPage;
this.perPageSize = perPageSize;
this.totalCount = totalCount;
//设置每一页默认数量
if(perPageSize<0){
perPageSize=12;
}
//设置总的页数
this.pageCount=PageCount();
//设置当前页
this.currentPage=CurrentPage();
//设置开始行数位置
this.beginIndex=Offset();
//设置pageRange
this.pageRange=PageRange();
//设置下一页的页码
this.NextNo=NextNo();
//设置上一页的页码
this.preNo=PreNo();
}
//计算总的页数
public int PageCount(){
if(this.pageCount!=0){
return pageCount;
}
float temp = (float)this.totalCount/(float)this.perPageSize;
pageCount = (int) Math.ceil(temp);
if(this.maxPages>0){
pageCount=Math.min(pageCount,maxPages);
}
return pageCount;
}
//计算当前页
public int CurrentPage(){
if(this.currentPage==0){
return currentPage+1;
}
if(currentPage>pageCount){
currentPage=pageCount;
return currentPage;
}
if(currentPage<=0){
currentPage=1;
return currentPage;
}
return currentPage;
}
//计算pageRange
public int[] PageRange(){
if(pageRange==null && totalCount>0){
int[] pages=null;
if(currentPage>=pageCount-4 && pageCount>9){
int start=pageCount-9+1;
pages=new int[9];
for (int i=0;i<pages.length;i++) {
pages[i]=start+i;
}
}else if(currentPage>=5&&pageCount>9){
int start=currentPage-5+1;
pages=new int[Math.min(9, currentPage+4+1)];
for(int i=0;i<pages.length;i++){
pages[i]= start+i;
}
}else{
pages=new int[Math.min(9, pageCount)];
for(int i=0;i<pages.length;i++){
pages[i]=i+1;
}
}
pageRange=pages;
}
return pageRange;
}
//获取页面链接
public String GetPageLink(int page){
String url = request.getScheme()+"://"; //请求协议 http 或 https
url+=request.getHeader("host"); // 请求服务器
url+=request.getRequestURI(); // 工程名
if(request.getQueryString()!=null) //判断请求参数是否为空
//参数
if(request.getQueryString()==null||request.getQueryString()==""){
url+="?p="+page;
System. out.println(url+":"+request.getQueryString());
}else{
url+="&p="+page;
}
return url;
}
//判断是否有上一页
public boolean HasPre(){
if(currentPage>1){
return true;
}
return false;
}
//判断是否有下一页
public boolean HasNext(){
if(currentPage<pageCount){
return true;
}
return false;
}
//返回上一页的页面链接
public String PageLinkPre(){
String urlPre=null;
if(HasPre()){
urlPre=GetPageLink(CurrentPage()-1);
return urlPre;
}
return urlPre;
}
//返回上一页的页数
public int PreNo(){
if(HasPre()){
return currentPage-1;
}
return currentPage;
}
//返回下一页的页数
public int NextNo(){
if(HasNext()){
return currentPage+1;
}
return currentPage;
}
//中间还有一些方法没写,不影响功能的情况先写一下方法,在此标记
//计算每次分页开始的位置
public int Offset(){
return (this.CurrentPage()-1)*this.perPageSize;
}
@Override
public String toString() {
return "PageResults [currentPage=" + currentPage + ", preNo=" + preNo + ", NextNo=" + NextNo + ", perPageSize="
+ perPageSize + ", totalCount=" + totalCount + ", pageCount=" + pageCount + ", maxPages=" + maxPages
+ ", pageRange=" + Arrays.toString(pageRange) + ", beginIndex=" + beginIndex + ", results=" + results
+ ", request=" + request + "]";
}
}