Spring中有一个PagedListHolder,可以实现分页。但此类有几个缺点:
1. 使用此类的代码比较繁琐
2. 此类存放的数据源是所有的记录集,即对于记录数为1000条的数据,即使我们只需在一个页面中显示10条记录,每次均需要检索1000条记录出来,并且没有内在的缓存机制
3. 如果需将pageSize, maxLinkedPages这些一般为Session级的变量存于Session中,则必须在Session中存放PagedListHolder,从而导致大容量的数据常常撑满了Session
4. 只是实现了Serializable标识接口,且getPage(), setPage(), setPageSize()方法中直接使用newPageSet (private) 的属性,不利于子类覆盖。而且,内部类的各个方法耦合极强。特定方法的使用必须信赖于某个方法或标志变量作为前提条件。
比较理想的情况是,根据每一个HttpServletRequest产生一个PagesListHolder,不管记录总数有多少个,每次只检索页面上所显示的记录,但将pageSize, maxLinkedPages设为Session级的效果。
鉴于上述几点,我从Spring原有的PagedListHolder抽取出一些必需的方法名作为接口,并以一个名为RequestPagedListHolder的类实现之。
下面是抽取出来的PagedListHolder接口。
setRecordsSubst()用于存放页面显示的记录源,而setRealRecordCount()用于记录满足条件的记录总数。
下面是此接口的实现:
此类有以下特点:
1. pageSize及maxLinkedPages均设为static,这样不因每个Request而改变。因此用户不必每次显示一个不同的页面后都在UI中重新设置它们。
2. 在构造函数中包装了所有的使用过程,既简化了该类的使用,也保证了该类被正确初始化。
3. 摒弃了newPageSet变量,减少了各个方法的耦合强度。
4. 在Spring环境中使用了ServletRequestDataBinder,大大简化了各个参数的读取设置过程。
5. 通过回调机制,每次只检索PagedListProvider所提供的记录子集,节约了内存,提高了程序效率。
不难看出,PagedListProvider是个接口,只有一个方法:
熟悉Hibernate的用户知道,Hibernate中就是需要这两个参数来实现分页了。如果不使用Hibernate,也没关系,自己实现此接口就行了。(接口实现起来很简单,但技术细节却非简单,Hibernate用户在此居于明显的优势)(来源 www.iocblog.net)
以上的两个接口,一个实现类,便是经过改进后的分页技术了。下面看其使用方法。
当用户需要查看带有分面功能的页面时,都会由下面的方法处理:
这是一个简单的方法,为RequestPagedListHolder的构造函数准备好实参后,生成一个实例,将其置于页面的一个名为"pagedRecords"的attribute中,以供JSP读取。
adminService.getTotalRecordCount()应不难实现。主要是getRecordsSubset()。Service层的listTable()如下:
Dao层代码:
下面看看视图层的使用。
......
<c:forEach items="${pagedRecords.pageList}" var="record">
......
</c:forEach>
......
通过JSTL方便地读出pagedRecords变量的pageList属性。重抄一下上面的RequestPagedListHolder代码相应部分:
public List getPageList() {
return recordsSubset;
}
返回的正是Hibernate已经为我们检索出来的记录子集。
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhangming1013/article/details/46927717