PaginationSupport: 分页查询技术文档

分页查询对于开发人员来说是再熟悉不过了,最近仔细的总结下,觉得写点东西,算是对自己成长的记录吧。我做的开发项目都是基于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中调用分页查询,并在表现层引用分页的结果即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值