默认的情况下eXtremeTable取得所有的结果集然后处理Beans集合,这样的好处是
你可以随意进行排序、过滤和分页操作。你只需要组装Beans集合并让eXtremeTable知道如何
引用它。这样的操作对于小到中等数据量的结果集非常有效,当结果集很大时这将非常糟糕。 这是一个判断,但我更喜欢描述如何做出我的技术决定。如果您认为在性能上有问题,
那么最好是使用一个profiler工具记录并查看它。有许多开源和商业的profiler工具可以帮助
你做出最好的判断。因此,假设我们发现了性能上存在问题,需要我们自己来处理分页。
手动处理分页意味着你一次只想取得一页显示需要的结果集。同时,你需要自己处理排序、过滤和分页。
下面的讨论是基于我假设你从数据库中取得集合,当然同样的原理能应用到任何地方。
这是一个重要的部分。为了得到较小的结果集,你可以创建一个普通的查询语句,但是limit你得到的结果集。
在Sybase和SQLServer中你可以使用rowcount命令,在MySql中你可以使用limit命令。 我不知道其他数据库怎么使用,但我确信每个数据库都有相似的功能。
也就是说当用户浏览第一页是得到第一页需要的 结果集,当用户浏览下一页时,再得到下一页需要的结果集。
使用Sybase的开发人员可能会说:rowcount命令总是从第一条开始,那么当我到第二页时我也必须 从第一条数据开始。
是的,你现在得到的是两页的结果集,而不需要得到所有的结果集。当你到第三页时,你只需要得到三页的结果集。。。。。。
其他数据库比如MySQL,允许你精确地得到你想要的那段数据,这样你就可以只得到当前页面显示需要的结果集。
为了知道用户想如何排序和过滤,他们想浏览哪一页,一页需要显示几条结果,eXtremeTable有一个使用LimitFactory
创建的名为Limit的简便接口:
首先你需要通过LimitFactory得到一个Limit实例:
Context context = new HttpServletRequestContext(request);
LimitFactory limitFactory = new TableLimitFactory(context, tableId);
Limit limit = new TableLimit(limitFactory);
Limit对象定义了limit结果集的所有方法。
TableLimitFactory具有另外一个构造函数,如果没有指定tableId的话默认的tableId将为ec。
Context context = new HttpServletRequestContext(request);
LimitFactory limitFactory = new TableLimitFactory(context);
Limit limit = new TableLimit(limitFactory);
当你对Limit实例化时,实例化对象包含两个对象:FilterSet和Sort。
private FilterSet filterSet;
private Sort sort;
FilterSet包含一个过滤动作(Action)和一个过滤器对象数组。
动作为TableConstants.FILTER_ACTION或TableConstants.CLEAR_ACTION。
一个过滤器包含一个property和这个过滤器的值。
private final String action;
private final Filter[] filters;
Sort对象包含property和sortOrder。sortOrder为
TableConstants.SORT_ASC或TableConstants.SORT_DESC:
private Sort sort;
设置行属性:
limit.setRowAttributes(totalRows, DEFAULT_ROWS_DISPLAYED);
下面是设置行属性可能用到的信息:
private int rowStart;
private int rowEnd;
private int currentRowsDisplayed;
private int page;
private int totalRows;
每个变量都有一个getter方法,我将不深入讲解属性的细节。
在你完成所有的定制工作:排序、过滤.....定制的Controller(Spring)或者Action(Struts)或者其他类似的框架后,
另外你需要创建一个callback,eXtremeTable已经提供了一个名为LimitCallback的实现。为了使用你只需要设置表
属性:retrieveRowsCallback、filterRowsCallback和sortRowsCallback:
<ec:table
items="presidents"
retrieveRowsCallback="limit"
filterRowsCallback="limit"
sortRowsCallback="limit"
action="${pageContext.request.contextPath}/limit.run"
title="Presidents"
>
<ec:row>
<ec:column property="fullName" title="Name"/>
<ec:column property="nickName" />
<ec:column property="term" />
<ec:column property="born" cell="date"/>
<ec:column property="died" cell="date"/>
<ec:column property="career" />
</ec:row>
</ec:table>
使用callback需要做的唯一事情是传输集合到request,同时传输totalRows属性。
totalRows表示总行数,使用PaginationCallback.TOTAL_ROWS静态变量将易于维护。
如果JSP页面使用了两个(以上)eXtremeTable的话你可以利用tableId分别传输totalRows。
例如如果tableId名为pres,你可以如下处理:
request.setAttribute("pres", presidents);
request.setAttribute("pres_totalRows", new Integer(""+totalRows));
译者注:关于limit使用的更详细信息,请参考《Limit指南》。