1 package test.dao;
2
3 import java.util.List;
4
5 /**
6 * 用于分页的工具类
7 * @author 莫取网名
8 */
9 public class Pager<T> {
10
11 private List<T> list; //对象记录结果集
12 private int total = 0; // 总记录数
13 private int limit = 20; // 每页显示记录数
14 private int pages = 1; // 总页数
15 private int pageNumber = 1; // 当前页
16
17 private boolean isFirstPage=false; //是否为第一页
18 private boolean isLastPage=false; //是否为最后一页
19 private boolean hasPreviousPage=false; //是否有前一页
20 private boolean hasNextPage=false; //是否有下一页
21
22 private int navigatePages=8; //导航页码数
23 private int[] navigatePageNumbers; //所有导航页号
24
25 public Pager(int total, int pageNumber) {
26 init(total, pageNumber, limit);
27 }
28
29 public Pager(int total, int pageNumber, int limit) {
30 init(total, pageNumber, limit);
31 }
32
33 private void init(int total, int pageNumber, int limit){
34 //设置基本参数
35 this.total=total;
36 this.limit=limit;
37 this.pages=(this.total-1)/this.limit+1;
38
39 //根据输入可能错误的当前号码进行自动纠正
40 if(pageNumber<1){
41 this.pageNumber=1;
42 }else if(pageNumber>this.pages){
43 this.pageNumber=this.pages;
44 }else{
45 this.pageNumber=pageNumber;
46 }
47
48 //基本参数设定之后进行导航页面的计算
49 calcNavigatePageNumbers();
50
51 //以及页面边界的判定
52 judgePageBoudary();
53 }
54
55 /**
56 * 计算导航页
57 */
58 private void calcNavigatePageNumbers(){
59 //当总页数小于或等于导航页码数时
60 if(pages<=navigatePages){
61 navigatePageNumbers=new int[pages];
62 for(int i=0;i<pages;i++){
63 navigatePageNumbers[i]=i+1;
64 }
65 }else{ //当总页数大于导航页码数时
66 navigatePageNumbers=new int[navigatePages];
67 int startNum=pageNumber-navigatePages/2;
68 int endNum=pageNumber+navigatePages/2;
69
70 if(startNum<1){
71 startNum=1;
72 //(最前navigatePages页
73 for(int i=0;i<navigatePages;i++){
74 navigatePageNumbers[i]=startNum++;
75 }
76 }else if(endNum>pages){
77 endNum=pages;
78 //最后navigatePages页
79 for(int i=navigatePages-1;i>=0;i--){
80 navigatePageNumbers[i]=endNum--;
81 }
82 }else{
83 //所有中间页
84 for(int i=0;i<navigatePages;i++){
85 navigatePageNumbers[i]=startNum++;
86 }
87 }
88 }
89 }
90
91 /**
92 * 判定页面边界
93 */
94 private void judgePageBoudary(){
95 isFirstPage = pageNumber == 1;
96 isLastPage = pageNumber == pages && pageNumber!=1;
97 hasPreviousPage = pageNumber > 1;
98 hasNextPage = pageNumber < pages;
99 }
100
101
102 public void setList(List<T> list) {
103 this.list = list;
104 }
105
106 /**
107 * 得到当前页的内容
108 * @return {List}
109 */
110 public List<T> getList() {
111 return list;
112 }
113
114 /**
115 * 得到记录总数
116 * @return {int}
117 */
118 public int getTotal() {
119 return total;
120 }
121
122 /**
123 * 得到每页显示多少条记录
124 * @return {int}
125 */
126 public int getLimit() {
127 return limit;
128 }
129
130 /**
131 * 得到页面总数
132 * @return {int}
133 */
134 public int getPages() {
135 return pages;
136 }
137
138 /**
139 * 得到当前页号
140 * @return {int}
141 */
142 public int getPageNumber() {
143 return pageNumber;
144 }
145
146
147 /**
148 * 得到所有导航页号
149 * @return {int[]}
150 */
151 public int[] getNavigatePageNumbers() {
152 return navigatePageNumbers;
153 }
154
155 public boolean isFirstPage() {
156 return isFirstPage;
157 }
158
159 public boolean isLastPage() {
160 return isLastPage;
161 }
162
163 public boolean hasPreviousPage() {
164 return hasPreviousPage;
165 }
166
167 public boolean hasNextPage() {
168 return hasNextPage;
169 }
170
171 public String toString(){
172 StringBuffer sb=new StringBuffer();
173 sb.append("[")
174 .append("total=").append(total)
175 .append(",pages=").append(pages)
176 .append(",pageNumber=").append(pageNumber)
177 .append(",limit=").append(limit)
178 .append(",isFirstPage=").append(isFirstPage)
179 .append(",isLastPage=").append(isLastPage)
180 .append(",hasPreviousPage=").append(hasPreviousPage)
181 .append(",hasNextPage=").append(hasNextPage)
182 .append(",navigatePageNumbers=");
183 int len=navigatePageNumbers.length;
184 if(len>0)sb.append(navigatePageNumbers[0]);
185 for(int i=1;i<len;i++){
186 sb.append(" "+navigatePageNumbers[i]);
187 }
188 sb.append(",list.size="+list.size());
189 sb.append("]");
190 return sb.toString();
191 }
192 }