为我们的项目写的一个轻量的分页API。目的在于将分页与数据查询的逻辑完全剥离。我以前看过robbin发的通过detachedCriteria实现的分页那片贴子,里面把分页和数据查询结合在一起了。而我觉得分开更轻量,而且替换也比较容易。但是这个实现中有一个反模式,在逻辑中生成了代码,无奈之选,为了简便。其中字符生成可以自己扩展i18n实现,应该非常容易。
分页实现的接口:
package
com.goldnet.framework.util.paging;
/**
* 分页操作的接口
* @author Tin
*/
public interface IPagination {
/**
* 默认的分页大小
*/
public static final int DEFAULT_PAGE_SIZE = 15;
/**
* 默认的分页参数,指URL中用到的参数名
*/
public static final String PAGE_SIZE_KEY = "pageSize";
/**
* 默认的页码参数,指URL中用到的参数名
*/
public static final String PAGE_NO_KEY = "pageno";
/**
* 获取总页数
* @return 总页数
*/
int getPageSum();
/**
* 下一页的页码
* @return
*/
int getNextPageNo();
/**
* 上一页的页码
* @return
*/
int getPrevPageNo();
/**
* 是否有下一页,即是否为最后一页
* @return 是否有下一页
*/
boolean hasNextPage();
/**
* 是否有上一页,即是否为第一页
* @return 是否有上一页
*/
boolean hasPrevPage();
/**
* 添加参数名称、值对,如果页面需要使用parameters传递分页外的附加参数
* @param parameterName 参数名
* @param parameterValue 参数值
*/
void addPageParameter(String parameterName, String parameterValue);
String getPageUrl();
String getPageHtmlStr();
int getItemSum();
void setItemSum(int itemSum);
String getPageExtension();
void setPageExtension(String pageExtension);
String getPageName();
void setPageName(String pageName);
int getPageNo();
void setPageNo(int pageNo);
int getPageSize();
void setPageSize(int pageSize);
}
/**
* 分页操作的接口
* @author Tin
*/
public interface IPagination {
/**
* 默认的分页大小
*/
public static final int DEFAULT_PAGE_SIZE = 15;
/**
* 默认的分页参数,指URL中用到的参数名
*/
public static final String PAGE_SIZE_KEY = "pageSize";
/**
* 默认的页码参数,指URL中用到的参数名
*/
public static final String PAGE_NO_KEY = "pageno";
/**
* 获取总页数
* @return 总页数
*/
int getPageSum();
/**
* 下一页的页码
* @return
*/
int getNextPageNo();
/**
* 上一页的页码
* @return
*/
int getPrevPageNo();
/**
* 是否有下一页,即是否为最后一页
* @return 是否有下一页
*/
boolean hasNextPage();
/**
* 是否有上一页,即是否为第一页
* @return 是否有上一页
*/
boolean hasPrevPage();
/**
* 添加参数名称、值对,如果页面需要使用parameters传递分页外的附加参数
* @param parameterName 参数名
* @param parameterValue 参数值
*/
void addPageParameter(String parameterName, String parameterValue);
String getPageUrl();
String getPageHtmlStr();
int getItemSum();
void setItemSum(int itemSum);
String getPageExtension();
void setPageExtension(String pageExtension);
String getPageName();
void setPageName(String pageName);
int getPageNo();
void setPageNo(int pageNo);
int getPageSize();
void setPageSize(int pageSize);
}
抽象基类:
/**
*
*/
package com.goldnet.framework.util.paging;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* 对PagingString的重构
* @author Tin
*
*/
public abstract class AbstractPagination implements IPagination {
/**
* Page上显示的List中的domainModel的总数
*/
protected int itemSum = -1;
/**
* 分页的大小
*/
protected int pageSize = DEFAULT_PAGE_SIZE;
/**
* 页数
*/
protected int pageNo = 0;
/**
* 分页的页面的相对URL,不包括后缀
*/
protected String pageName = null;
/**
* 页面的URL的后缀
*/
protected String pageExtension = ".action";
/**
* 参数列表
*/
protected List<PageParameter> parameterList = new LinkedList<PageParameter>();
/**
* 返回的分页信息的字符串
*/
protected String pageHtmlStr = null;
/**
* 默认的构造函数
* @param pageName 分页的页面的相对URL,不包括后缀
* @param pageExtension 页面的URL的后缀
* @param itemSum Page上显示的List中的domainModel的总数
* @param pageNo 页数
* @param pageSize 分页的大小
*/
public AbstractPagination(String pageName, String pageExtension,
int itemSum, int pageNo, int pageSize) {
super();
this.pageName = pageName;
this.pageExtension = pageExtension;
this.itemSum = itemSum;
this.pageNo = pageNo;
this.pageSize = pageSize;
}
/**
* 无PageSize构造函数,使用默认PageSize为15
* @param pageName 分页的页面的相对URL,不包括后缀
* @param pageExtension 页面的URL的后缀
* @param itemSum Page上显示的List中的domainModel的总数
* @param pageNo 页数
*/
public AbstractPagination(String pageName, String pageExtension,
int itemSum, int pageNo) {
super();
this.pageName = pageName;
this.pageExtension = pageExtension;
this.itemSum = itemSum;
this.pageNo = pageNo;
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getPageSum()
*/
public int getPageSum() {
if ((itemSum != -1) && (pageSize > 0)) {
return ((itemSum % pageSize) == 0) ? (itemSum / pageSize)
: ((itemSum / pageSize) + 1);
}
return 0;
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getNextPageNo()
*/
public int getNextPageNo() {
return (pageNo < (getPageSum() - 1)) ? (pageNo + 1) : (getPageSum() -
1);
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getPrevPageNo()
*/
public int getPrevPageNo() {
*
*/
package com.goldnet.framework.util.paging;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
/**
* 对PagingString的重构
* @author Tin
*
*/
public abstract class AbstractPagination implements IPagination {
/**
* Page上显示的List中的domainModel的总数
*/
protected int itemSum = -1;
/**
* 分页的大小
*/
protected int pageSize = DEFAULT_PAGE_SIZE;
/**
* 页数
*/
protected int pageNo = 0;
/**
* 分页的页面的相对URL,不包括后缀
*/
protected String pageName = null;
/**
* 页面的URL的后缀
*/
protected String pageExtension = ".action";
/**
* 参数列表
*/
protected List<PageParameter> parameterList = new LinkedList<PageParameter>();
/**
* 返回的分页信息的字符串
*/
protected String pageHtmlStr = null;
/**
* 默认的构造函数
* @param pageName 分页的页面的相对URL,不包括后缀
* @param pageExtension 页面的URL的后缀
* @param itemSum Page上显示的List中的domainModel的总数
* @param pageNo 页数
* @param pageSize 分页的大小
*/
public AbstractPagination(String pageName, String pageExtension,
int itemSum, int pageNo, int pageSize) {
super();
this.pageName = pageName;
this.pageExtension = pageExtension;
this.itemSum = itemSum;
this.pageNo = pageNo;
this.pageSize = pageSize;
}
/**
* 无PageSize构造函数,使用默认PageSize为15
* @param pageName 分页的页面的相对URL,不包括后缀
* @param pageExtension 页面的URL的后缀
* @param itemSum Page上显示的List中的domainModel的总数
* @param pageNo 页数
*/
public AbstractPagination(String pageName, String pageExtension,
int itemSum, int pageNo) {
super();
this.pageName = pageName;
this.pageExtension = pageExtension;
this.itemSum = itemSum;
this.pageNo = pageNo;
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getPageSum()
*/
public int getPageSum() {
if ((itemSum != -1) && (pageSize > 0)) {
return ((itemSum % pageSize) == 0) ? (itemSum / pageSize)
: ((itemSum / pageSize) + 1);
}
return 0;
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getNextPageNo()
*/
public int getNextPageNo() {
return (pageNo < (getPageSum() - 1)) ? (pageNo + 1) : (getPageSum() -
1);
}
/* (non-Javadoc)
* @see com.goldnet.framework.util.paging.IPagination#getPrevPageNo()
*/
public int getPrevPageNo() {