最近我在一个blaog上看到一个老兄关于displaytag解决大数据量的文章。他是用封装displaytag的方式写了一个displaytagpro。我个人觉得没有必要。一是封装后的即使解决了大数据量的问题,将来升级也是个问题,难道还有天天关注你的程序更新?二是其实displaytag已经解决了大数据量分页的问题。解决的补丁可以从这里下载
DISPL-134.zip 。该补丁增加了table的virtualSize属性。
解决方式大致如下:
jsp:
<display:table class="list" name="<%= CodeListAction.CODE_LIST_KEY %>" id="row" pageSize="20" virtualSize="<%= ((Integer)request.getAttribute (CodeListAction.CODE_LIST_SIZE_KEY)).toString() %>" requestURI="codelist.do" sort="list">
在数据量大时
可以设置virtualSize属性,表示总记录数。
action:// Get the page number requested
int page = 1;
int size = 20;
Enumeration paramNames = request.getParameterNames
();
while (paramNames.hasMoreElements()) {
String name = (String)paramNames.nextElement();
if (name != null && name.startsWith("d-") &&
name.endsWith("-p")) {
String pageValue = request.getParameter(name);
if (pageValue != null) {
page = Integer.parseInt(pageValue);
}
}
}
DB:
数据层你可以根据数据库的不同写不同的adapter。下面是针对oracle的特性写的。
select * from (
select query.*, rownum rnum from (
your complete query goes here....
) query where rownum <= (:pagingNo*:pagingSize)
) where rnum >= ((:pagingNo-1)*:pagingSize)+1 order by rnum
这样就可以了。该问题可以查看
http://jira.codehaus.org/browse/DISPL-134要想更好的控制分页,就用valuelist ,Extreme Table了。
风之语