Displaytag1.1支持在外部实现大数据量分页。主要有两种方式实现:Displaytag 1.1 offers two alternative ways for working with partial lists:the first one uses the valuelist pattern, and requires that the object that you give to displaytag implements the org.displaytag.pagination.PaginatedList interface. You can pass this object to displaytag as an usual list, and it will extract paging and sorting information from it. This way is more recommended if you have to build your backend layer and you can easily follow this pattern. a second way, recommended if you only have to use partial list for few tables that show a performance problem using full lists, is passing all the needed parameters as separate tag attributes (recors to be shown, page number, total number of records...) 
其中第二种方式看起来较为简单,只需在<displaytag>中增加两个属性:partialList="true" size="resultSize"即可,但是在使用发现这种方式由于是在原来内存分页的基础上修改的,所以还是存在一些Bug(比如:分页导航的值不会变......)所以这里介绍Displaytag推荐的第一种方式,即:
实现org.displaytag.pagination.PaginatedListorg.displaytag.pagination.PaginatedList接口。实现PaginatedList接口:import  java.util.List; import  org.displaytag.pagination.PaginatedList;
 import  org.displaytag.properties.SortOrderEnum; /** */ /** 
 * 分页列表
 * 
 *  @author  John.Zhu
 * 
  */ 
  public   class  PageList  implements  PaginatedList   {
     /** */ /** 
     * 每页的列表
      */ 
     private  List list;     /** */ /** 
     * 当前页码
      */ 
     private   int  pageNumber  =   1 ;     /** */ /** 
     * 每页记录数 page size
      */ 
     private   int  objectsPerPage  =   15 ;     /** */ /** 
     * 总记录数
      */ 
     private   int  fullListSize  =   0 ;     private  String sortCriterion;     private  SortOrderEnum sortDirection;     private  String searchId;     public  List getList()   {
         return  list;
    }       public   void  setList(List list)   {
         this .list  =  list;
    }       public   int  getPageNumber()   {
         return  pageNumber;
    }       public   void  setPageNumber( int  pageNumber)   {
         this .pageNumber  =  pageNumber;
    }       public   int  getObjectsPerPage()   {
         return  objectsPerPage;
    }       public   void  setObjectsPerPage( int  objectsPerPage)   {
         this .objectsPerPage  =  objectsPerPage;
    }       public   int  getFullListSize()   {
         return  fullListSize;
    }       public   void  setFullListSize( int  fullListSize)   {
         this .fullListSize  =  fullListSize;
    }       public  String getSortCriterion()   {
         return  sortCriterion;
    }       public   void  setSortCriterion(String sortCriterion)   {
         this .sortCriterion  =  sortCriterion;
    }       public  SortOrderEnum getSortDirection()   {
         return  sortDirection;
    }       public   void  setSortDirection(SortOrderEnum sortDirection)   {
         this .sortDirection  =  sortDirection;
    }       public  String getSearchId()   {
         return  searchId;
    }       public   void  setSearchId(String searchId)   {
         this .searchId  =  searchId;
    } } Contoller:/** */ /** 
     * 分页查询
     * 
     *  @param  request
     *  @param  response
     *  @return 
     *  @throws  Exception
      */ 
     private  ModelAndView paging(HttpServletRequest request,
            HttpServletResponse response, ModelAndView mav)  throws  Exception   {
         //  获取当前页数,displaytag通过参数"page"传递这个值 
                  int  pageNumber;
         if  (request.getParameter( " page " )  !=   null 
                  &&   ! "" .equals(request.getParameter( " page " )))   {
            pageNumber  =  Integer.parseInt(request.getParameter( " page " ));
        }   else    {
            pageNumber  =   1 ;
        } 
        PageList pageList  =   new  PageList();
        Map map  =  WebUtils.getParametersStartingWith(request,  " search_ " );
        Page page  =  dao.query(map, pageNumber, PAGE_SIZE);
                 //  设置当前页数 
         pageList.setPageNumber(pageNumber);
                 //  设置当前页列表 
         pageList.setList(page.getResults());
                 //  设置page size 
         pageList.setObjectsPerPage(PAGE_SIZE);
                 //  设置总页数 
         pageList.setFullListSize(page.getTotalCount());        mav.addObject( " results " , pageList);         return  mav;
    }  好了,现在直接在JSP上使用 displaytag就行了:
 
< display:table  name ="${results}"  id ="row"  class ="simple nocol"  pagesize ="${pageSize}"  export ="true"  
                    decorator ="org.displaytag.decorator.TotalTableDecorator"  
                    requestURI ="${pageContext.request.contextPath}/pageQuery.do?method=paging" > 
  < display:column  property ="date.time"  title ="日期"  format ="{0,date,yyyy-MM-dd}"  sortable ="false"   /> 
  < display:column  property ="code"  title ="编码"  group ="1"  sortable ="false"   /> 
  < display:column  property ="name"  title ="名称"  group ="1"  sortable ="false"   /> 
  < display:column  property ="costTotal"  title ="总额(元)"  format ="{0,number,0,000}"  total ="true"  sortable ="false"   /> 
 </ display:table >

解决方案 »

  1.   

    谢谢。但就我了解,ModelAndView应该主要用于spring框架,如果我想将以上的Contoller改写为struts的action处理类,应该对哪些部分进行改写。另外,能否解释下以下两行代码的具体含义,因为Page类和dao对象在你所贴的代码中都没有明确定义:
    Map map  =  WebUtils.getParametersStartingWith(request,  " search_ " );
    Page page  =  dao.query(map, pageNumber, PAGE_SIZE);不知理解是否正确,望指点,谢谢。
      

  2.   

    这个和你用什么框架没关系,
    我只是给你个样例,你自己看看是怎么实现的~displaytag在jsp编译后,后生成很多内部参数,
    在请求过程中添加到url后面去,
    比如你的页码,页大小,总数据量等等~
    Map map = WebUtils.getParametersStartingWith(request, " search_ " );
    就是找这些参数的~
    Page page = dao.query(map,pageNumber,PAGE_SIZE);
    是一个DAO调用,传递参数 pageNumber 给DAO~具体都是什么参数以及如何命名的,你可以参照displaytag的文档,你还可以看源码~
      

  3.   

    救命啊,翻页总报subList index越界。
      

  4.   

    谢谢这个帖子,让我学会了display的外部分页