说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的。现在好了,经本人总结与提炼:
无论你是否自己手动分页,还是借助了框架进行分页。此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
package test.dao; import java.util.List; /** * 用于分页的工具类 * @author 莫取网名 */ public class Pager<T> { private List<T> list; //对象记录结果集 private int total = 0 ; // 总记录数 private int limit = 20 ; // 每页显示记录数 private int pages = 1 ; // 总页数 private int pageNumber = 1 ; // 当前页 private boolean isFirstPage= false ; //是否为第一页 private boolean isLastPage= false ; //是否为最后一页 private boolean hasPreviousPage= false ; //是否有前一页 private boolean hasNextPage= false ; //是否有下一页 private int navigatePages= 8 ; //导航页码数 private int [] navigatePageNumbers; //所有导航页号 public Pager( int total, int pageNumber) { init(total, pageNumber, limit); } public Pager( int total, int pageNumber, int limit) { init(total, pageNumber, limit); } private void init( int total, int pageNumber, int limit){ //设置基本参数 this .total=total; this .limit=limit; this .pages=( this .total- 1 )/ this .limit+ 1 ; //根据输入可能错误的当前号码进行自动纠正 if (pageNumber< 1 ){ this .pageNumber= 1 ; } else if (pageNumber> this .pages){ this .pageNumber= this .pages; } else { this .pageNumber=pageNumber; } //基本参数设定之后进行导航页面的计算 calcNavigatePageNumbers(); //以及页面边界的判定 judgePageBoudary(); } /** * 计算导航页 */ private void calcNavigatePageNumbers(){ //当总页数小于或等于导航页码数时 if (pages<=navigatePages){ navigatePageNumbers= new int [pages]; for ( int i= 0 ;i<pages;i++){ navigatePageNumbers[i]=i+ 1 ; } } else { //当总页数大于导航页码数时 navigatePageNumbers= new int [navigatePages]; int startNum=pageNumber-navigatePages/ 2 ; int endNum=pageNumber+navigatePages/ 2 ; if (startNum< 1 ){ startNum= 1 ; //(最前navigatePages页 for ( int i= 0 ;i<navigatePages;i++){ navigatePageNumbers[i]=startNum++; } } else if (endNum>pages){ endNum=pages; //最后navigatePages页 for ( int i=navigatePages- 1 ;i>= 0 ;i--){ navigatePageNumbers[i]=endNum--; } } else { //所有中间页 for ( int i= 0 ;i<navigatePages;i++){ navigatePageNumbers[i]=startNum++; } } } } /** * 判定页面边界 */ private void judgePageBoudary(){ isFirstPage = pageNumber == 1 ; isLastPage = pageNumber == pages && pageNumber!= 1 ; hasPreviousPage = pageNumber > 1 ; hasNextPage = pageNumber < pages; } public void setList(List<T> list) { this .list = list; } /** * 得到当前页的内容 * @return {List} */ public List<T> getList() { return list; } /** * 得到记录总数 * @return {int} */ public int getTotal() { return total; } /** * 得到每页显示多少条记录 * @return {int} */ public int getLimit() { return limit; } /** * 得到页面总数 * @return {int} */ public int getPages() { return pages; } /** * 得到当前页号 * @return {int} */ public int getPageNumber() { return pageNumber; } /** * 得到所有导航页号 * @return {int[]} */ public int [] getNavigatePageNumbers() { return navigatePageNumbers; } public boolean isFirstPage() { return isFirstPage; } public boolean isLastPage() { return isLastPage; } public boolean hasPreviousPage() { return hasPreviousPage; } public boolean hasNextPage() { return hasNextPage; } public String toString(){ StringBuffer sb= new StringBuffer(); sb.append( "[" ) .append( "total=" ).append(total) .append( ",pages=" ).append(pages) .append( ",pageNumber=" ).append(pageNumber) .append( ",limit=" ).append(limit) .append( ",isFirstPage=" ).append(isFirstPage) .append( ",isLastPage=" ).append(isLastPage) .append( ",hasPreviousPage=" ).append(hasPreviousPage) .append( ",hasNextPage=" ).append(hasNextPage) .append( ",navigatePageNumbers=" ); int len=navigatePageNumbers.length; if (len> 0 )sb.append(navigatePageNumbers[ 0 ]); for ( int i= 1 ;i<len;i++){ sb.append( " " +navigatePageNumbers[i]); } sb.append( ",list.size=" +list.size()); sb.append( "]" ); return sb.toString(); } } |
关于用法:使用步骤如下:
1).不管是否用了条件查询,首先count出相应的总条数
2).构造一个Pager类(关于limit参数可根据自身前台进行取舍)
3).根据构造好的Pager类获取已经自动纠正过的pageNumber参数,-1再乘个limit,做为实际要查询的第一条记录的位置
4).设置要查从起始位置开始,直到第limit条的所有记录.(如果手工分页,则也有可能第二个参数是结尾记录的位置偏移,具体情况视数据库而定)
5).将[条件]查询出的list设置入pager对象中并返回.
6).在展现层通过Servlet或Action或直接拿到这个pager对象即可使用,具体如何拼接url的事情,也应该交由展现层来完成即可。
1
2
3
4
5
6
|
int totalCount=Integer.valueOf(queryCount.uniqueResult().toString()); Pager pager= new Pager(totalCount, pageNumber,limit); queryList.setFirstResult((pager.getPageNumber()- 1 )*limit); //容错处理 queryList.setMaxResults(limit); pager.setList(queryList.list()); return pager; |
上述代码是使用了hibernate的一个简单示例。如果你是手工分页,也按使用步骤来即可。
当然了,分页可以放在dao层来完成,也可以放在Service层来完成。而Servlet或Action则去调用service层的代码。个人认为:分页其实也是一种业务需要,因此,可以将其放在业务层。因为DAO层提供相应的[条件查询]list及[条件]统计count,在业务层完全可以根据自己的需要进行方法调用(只不过需要按既定的步骤来罢了,当然了,很多时候,业务都是有既定的流程步骤的)。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/seeseait/article/details/46004101