一个好的分页抽象模板类。
1 /** 2 * 3 */ 4 package com.alifi.scout.common.model; 5 6 import java.io.Serializable; 7 import java.util.ArrayList; 8 import java.util.List; 9 10 public class Pagination<E> implements Serializable { 11 12 /** 13 * 14 */ 15 private static final long serialVersionUID = -7438949134440092123L; 16 17 /** 默认每页行数 */ 18 public static final int DEFAULT_PAGE_SIZE = 10; 19 20 /** 当前页 */ 21 private int curPage = 0; 22 23 /** 每页数量大小 */ 24 private int pageSize = DEFAULT_PAGE_SIZE; 25 26 /** 总数 */ 27 private int total = 0; 28 29 /** 总页数 */ 30 private int totalPage = 0; 31 32 /** 数据 */ 33 private List<E> data = new ArrayList<E>(); 34 35 /** 36 * 构造函数 37 * 38 * @param page 请求的页码 39 */ 40 public Pagination(int page) { 41 this(page, DEFAULT_PAGE_SIZE); 42 } 43 44 /** 45 * 构造函数 46 * 47 * @param pageNo 请求的页码 48 * @param pageSize 每页数量 49 */ 50 public Pagination(int pageNo, int pageSize) { 51 // 传入的页码如果小于1则默认从第一页开始 52 this.curPage = pageNo < 1 ? 1 : pageNo; 53 // 传入的每页数量如果小于1则取默认的每页数量 54 this.pageSize = pageSize < 1 ? DEFAULT_PAGE_SIZE : pageSize; 55 } 56 57 /** 58 * 如果需要内存式分页才调用此方法,否则请使用setData 59 * 60 * @param records 61 */ 62 public void setRecordsForPaging(List<E> records) { 63 if (records != null && !records.isEmpty()) { 64 setTotal(records.size()); 65 int start = getStart(); 66 if (total > start) { 67 // 正常情况下size都大于start 68 int end = start + getCount(); 69 if (total >= end) { 70 // 数据满足请求页码 71 setData(records.subList(start, end)); 72 } else { 73 // 不满足最后一页 74 setData(records.subList(start, total)); 75 } 76 } 77 } 78 } 79 80 public int getCurPage() { 81 return curPage; 82 } 83 84 public int getPageSize() { 85 return pageSize; 86 } 87 88 public int getTotal() { 89 return total; 90 } 91 92 public final void setTotal(int total) { 93 this.total = total; 94 totalPage = (total % pageSize == 0) ? (total / pageSize) : (total / pageSize + 1); 95 } 96 97 /** 98 * @return 总页数 99 */ 100 public int getTotalPage() { 101 return totalPage; 102 } 103 104 public List<E> getData() { 105 return data; 106 } 107 108 public void setData(List<E> data) { 109 this.data = data; 110 } 111 112 /** 113 * 得到本页开始行号 114 * 115 * @return 116 */ 117 public int getStart() { 118 return (curPage - 1) * pageSize; 119 } 120 121 /** 122 * @return 每页数量大小 123 */ 124 public int getCount() { 125 return pageSize; 126 } 127 128 /** 129 * @return 本页最后一行 行号 130 */ 131 public int getEnd() { 132 return this.getStart() + this.getPageSize(); 133 } 134 135 /** 136 * @return 是否有下一页 137 */ 138 public boolean hasNext() { 139 return curPage < totalPage; 140 } 141 142 public int getNextPage(){ 143 return curPage+1; 144 } 145 /** 146 * @return 是否由上一页 147 */ 148 public boolean hasProx() { 149 return curPage > 1; 150 } 151 152 public boolean isFirstPage(){ 153 return curPage ==1; 154 } 155 public boolean isLastPage(){ 156 if(totalPage <= 1){ 157 return true; 158 } 159 return curPage == totalPage; 160 } 161 @Override 162 public String toString() { 163 StringBuilder sb = new StringBuilder(); 164 sb.append("curPage:").append(curPage).append(",pageSize:").append(pageSize).append( 165 ",total:").append(total).append(",data:").append(data); 166 return sb.toString(); 167 } 168 /** 169 * 分页偏移量 170 * @return 171 */ 172 public int getOffset() { 173 return (this.curPage - 1) * this.pageSize; 174 } 175 }
一个实例:
每页pageSize为30,pageNo为2,总共的数量是35条。30<35<=70,所以显示的应该为31,32,33,34,35总共5条数据。