说明:曾经在网上看过花样繁多的分页,很多都号称如何通用,但很多时候往往不尽如人意:有在分页类中还加入URL地址信息的,有在分页类中还进行分页动作处理(此动作完全属于操作数据库方面的事情)的。现在好了,经本人总结与提炼:
无论你是否自己手动分页,还是借助了框架进行分页。此工具类都可以帮助你达到稳定的分页效果(包括导航页码功能),而且使用方法也相对简单:好了,废话少说,代码如下: http://bbs.csdn.net/topics/360010907
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();
}
}