displaytag实现内存分页

本文介绍如何使用DisplayTag结合Struts2、Hibernate和Spring实现数据库分页,包括实现PaginatedList接口、Hibernate分页查询、设置分页参数及DisplayTag显示。
摘要由CSDN通过智能技术生成

Displaytag用来实现内存分页的确很方便,但是当列表数据太大,就不适宜一次过读出来内存进行分页了。Displaytag当然也支持进行数据库分页,基本上主要是实现org.displaytag.pagination.PaginatedList接口,并且通过hibernate的相应方法进行查询就行。

   本项目是Struts2,Hibernate,Spring主流框架结合开发的。实现数据库分页的步骤为:

  1.实现PaginatedList接口

   PaginatedList的代码为:

1.public interface PaginatedList
2.{
3.    List getList();
4.    int getPageNumber();
5.    int getObjectsPerPage();
6.    int getFullListSize();
7.    String getSortCriterion();
8.    SortOrderEnum getSortDirection();
9.    String getSearchId();
10.}
   从以上代码可以知道,此接口应该有相应的成员变量,那么在实现这个接口的同时,要补充定义好相应的变量。

   

  2.在Hibernate层实现分页查询数据库

   Hibernate支持分批对数据库进行查询,这里是使用Query接口:

   

1.        Session s=null;
2.        Query query=null;
3.       
4.        String queryString="select o.id,o.ICityId,o.SName,o.IPublishCount,o.DRegisterDate,r.SRegionName from TbOwnerUser as o,TbRegion as r " +
5.        " where o.ERole='owner' and o.ICityId=r.id order by o.ICityId";
6.        try {
7.             s= this.getSession();
8.             query= s.createQuery(queryString);
9.          
10.            //设置起始查询的记录号 11.            query.setFirstResult((pageNumber - 1) * pageSize);
12.            //设置一次查询所要获得的记录数,即是每页记录数 13.            query.setMaxResults(pageSize);
14.                        return query.list();
15.        } catch (Exception e) {
16.            System.out.println("获取业主列表时出错!");
17.            e.printStackTrace();
18.        }finally{
19.            try {
20.                s.close();
21.            } catch (Exception e) {
22.                e.printStackTrace();
23.            }
24.        }
  其中,实现分页查询的主要是:

1.query.setFirstResult((pageNumber - 1) * pageSize);
2.query.setMaxResults(pageSize);
   setFirstResult是指定这次查询开始的记录数,setMaxResults是指定一次查询所要查询出的记录条数。每次查询都只会读取pageSize大小的数据出去,那么就节省了很多内存空间了。

 

  3.在action中设置分页相关的参数

   

1.HttpServletRequest request=ServletActionContext.getRequest();
2.HttpSession session=request.getSession();
3.        if(request.getParameter("page")!=null && "".equals(request.getParameter("page"))==false)
4.            pageNumber=Integer.parseInt(request.getParameter("page"));
5.        else6.            pageNumber=1;
7.       
8.        ListPagination list=new ListPagination();
9.        list.setFullListSize(this.getDeletedOwnerListSize());
10.        list.setList(backendOwnerUserManageService.getDeletedOwners(pageNumber, SessionParameters.PAGE_SIZE));
11.        list.setObjectsPerPage(SessionParameters.PAGE_SIZE);
12.        list.setPageNumber(pageNumber);
            displaytag是用“page”这个参数来实现页数的传递的,所以request.getParameter("page")获得当前页号。ListPagination list=new ListPagination()为自己实现了PaginatedList的类,在action中要把整个列表大小、当前页数、每页记录数等信息设置给自己实现了PaginatedList的类,之后就可以直接把这个list传递给displaytag进行输出了。

 

  4. displaytag显示

   这里只需要把上面设置好的list交给display:table的name属性进行显示就可以。

1.<display:table name="${backendListOwnerAction.pageList}" id="ownerTable" >
2.</displaytag:table>
  至此就简单的实现了内存分页,每次翻页都会查询一次数据库,虽然查询数据库的次数增加了,但是对于大list来说,能够节省不少内存空间。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/blackwingzhong/archive/2008/11/17/3322145.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值