分页查询对于开发人员来说是再熟悉不过了,最近仔细的总结下,觉得写点东西,算是对自己成长的记录吧。我做的开发项目都是基于SSH的J2EE企业应用的,以下是具体的代码:
1.首先定义一个PaginationSupport类,
public class PaginationSupport<T> implements Serializable{
public final static int PAGE_SIZE=ModuleConstants.PAGE_SIZE;
private int pageSize=PAGE_SIZE;
private List<?extends T>items;
private int totalCount;
private int startIndex=0;
public PaginationSupport(){
super();
setPageSize(PAGE_SIZE);
setStartIndex(0);
}
public PaginationSupport(List<?extends T>items,int totalCount){
super();
setItems(items);
setTotalCount(totalCount);
setStartIndex(0);
setPageSize(PAGE_SIZE);
}
public PaginationSupport(List<? extends T>items,int totalCount,int startIndex){
super();
setItem(items);
setTotalCount(totalCount);
setStartIndex(startIndex);
setPageSize(PAGE_SIZE);
}
public PaginationSupport(LIst<? extends T>items,int totalCount,int startIndex,int pageSize){
super();
setItems(items);
setTotalCount(totalCount);
setStartIndex(startIndex);
setPageSize(pageSize);
}
public boolean isEmpty(){
return (getTotalCount()<=0);
}
public List<?extends T> getItems(){
return this.items;
}
public void setItems(List<?extends T>items){
this.items=items;
}
public int getPageSize(){
return pageSize;
}
public void setPageSize(int pageSize){
this.pageSize=pageSize;
}
public int getPageCount(){
if(getPageSize()==0||getTotalCount()==0)
return 0;
int count=getTotalCount()/getPageSize();
if(getTotalCount()%getPageSize()!=0){
count+=1;
}
return count;
}
public int getTotalCount(){
return totalCount;
}
public void setTotalCount(int totalCount){
if(totalCount>0)this.totalCount=totalCount;
else{this.totalCount=0;
}
}
public int getStartIndex(){
return startIndex;
}
public void setStartIndex(int startIndex){
this.startIndex=startIndex;
}
public int getNextIndex(){
int nextIndex=getStartIndex()+pageSize;
if(nextIndex>=totalCount){
return getStartIndex();
}
else{
return nextIndex;
}
public int getPreviousIndex(){
int previousIndex=getStartIndex()-pageSize;
if(previousIndex<=0)return 0;
else{
return previousIndex;
}
}
}
这个类是分页查询的基础类。
2. 2 在BasePageAction中定义pagination变量,具体代码如下,
public abstract class BasePageAction<T> extends BaseAction implements Preparable{
protected PaginationSupport<T> pagination;
public BasePageAction(){
super();
this.pagination=new PaginationSupport<T>();
}
@Override
public void prepare() throws Exception{
log.debug("=============> prepare");
}
public PaginationSupport<T> getPagination{
return pagination;
}
public void setPagination(PaginationSupport<T> pagination){
this.pagination=pagination;
}
public String getPageHiddens(){
StringBuffer sb=new StringBuffer();
HtmlUtils.prepareHidden(sb,ModulesConstans.PAGE_PAGESIZE,String.valueOf(pagination.getPageSize()));
HtmlUtils.prepareHidden(sb,ModulesConstants.PAGE_STARTINDEX,String.valueOf(pagination.getStartIndex()));
return sb.toString();
}
public Stirng getpageUrl(){
StringBuffer sb=new StringBuffer();
HtmlUtils.prepareHref(sb,ModulesConstants.PAGE_PAGESIZE,String.valueOf(pagination.getPageSize()));
HtmlUtils.prepareHref(sb,ModulesConstants.PAGE_STARTINDEX,String.valueOf(pagination.getStartIndex()));
return sb.toString();
}
}
所有要用到分页的action都要继承此类。
3. 3 在2中引用的HtmlUtils类的具体代码为:
public abstract class HtmlUtils
{
public static void prepareHidden(StringBuffer sb,String name,String value){
sb.append("\r<input");
prepareAttribute(sb,"type","hidden");
prepareAttribute(sb,"id",name);
prepareAttribute(sb,"name",name);
prepareAttribute(sb,"value",value);
sb.append(">");
}
public static void prepareAttribute(StringBuffer sb,String name,String value){
sb.append("");
sb.append(name);
sb.append("=");
sb.append(""");
sb.append(value==null?null:"":value);
sb.append(""");
}
public static void prepareHref(StringBuffer sb,String name,String value){
if(sb.length!=0){
sb.append("&");
}
sb.append(name);
sb.append("=");
sb.append(value==null?"":value);
}
}
4.在DAO层定义两个方法。 public PaginationSupport<T> findPageByCriteria(final DetachedCriteria detachedCriteria,final int pageSize,final int startIndex ){
return (PaginationSupport<T>) findPageByCriterial4(detachedCriteria,pageSize,startIndex);
}
public PaginationSupport findPageByCriterial4(DetachedCriteria detachedCriteria,int pageSize,int startIndex){
return(PaginationSupport)getHibernateTemplate().executeWithNativeSession(new HibernateCallback(){
@Override
public Object doInHibernate(Session session)throws HibernationException{
Criteria criteria=detachedCriteria.getExecutableCriteria(session);
int totalCount=0;
CriteriaImpl impl=(CriteriaImpl)criteria;
Projection projection=impl.getProjection();
List orderEntries=new ArrayList();
Field field=null;
try{
field=CriteriaImpl.class.getDeclaredField("orderEntries");
field.setAccessible(true);
orderEntries=(List)field.get(impl);
field.set(criteria,new ArrayList());
totalCount=((Integer)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();
criteria.setProjection(projection);
if(projection==null){
criteria.setResultTransformer(criteriaSpecification.ROOT_ENTITY);
}
field.set(criteria,orderEntries);
}catch(SecurityException ex){
throws new RuntimeException(ex.getMessage(),ex);
}catch(NoSuchFieldException ex){
throw new RuntimeException(ex.getMessage(),ex);
}
int start=startIndex;
if(start>=totalCount){
start=start-PageSize;
start=(start<0)?0:start;
}
List items=criteria.setFirstResult(start).setMaxResults(pageSize).list();
PaginationSupport ps=new PaginationSupport(items,totalCount,pageSize,start);
return ps;
}
});
}
5.剩下的就是在action中调用分页查询,并在表现层引用分页的结果即可。