本文只针对ZK的分页数据表格这个主题,关于ZK框架的入门介绍见《ZK(The leading enterprise Ajax framework)入门指南》
https://blog.csdn.net/daquan198163/article/details/9304897?spm=1001.2014.3001.5501
概述
zk框架虽然提供了大量方便的开箱即用的组件,但是不得不说分页是个例外,无论是listbox还是grid,对于大数据量的场景都没有给出开箱即用的分页解决方案。
这种内存分页是无法满足真实应用的——并发量和数据量一高就把内存耗尽了。因此需要我们自行封装解决。
分页逻辑的模板类BaseSortPagingListModel
首先需要设计一个模板类把分页的通用逻辑、流程(构造criteria查询条件、获取总记录数、查询当前页数据、处理返回结果)封装起来,以便复用和扩展。
同时这个模板还需要能够与最终用来显示数据表格的zk组件集成。
因此最合理的方案就是基于AbstractListModel扩展出一个分页版本——BaseSortPagingListModel
package common;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.zkoss.zul.AbstractListModel;
import org.zkoss.zul.FieldComparator;
import org.zkoss.zul.ListModelExt;
import org.zkoss.zul.event.ListDataEvent;
/**
* ZK分页ListModel基类,用于封装分页逻辑:构造criteria、获取总记录数、查询当前页数据、处理返回结果
* @param 查询条件model泛型
* @param 返回结果集中的model泛型
*/
@SuppressWarnings({ "unchecked", "serial", "rawtypes", "deprecation" })
abstract public class BaseSortPagingListModel extends AbstractListModel implements ListModelExt {
protected static final Logger logger = LoggerFactory.getLogger(BaseSortPagingListModel.class);
private static final ThreadLocal
扩展分页模板 实现分页查询的服务端逻辑
BaseSortPagingListModel模板类通过第一个泛型参数TC对查询逻辑以及回调方法abstract protected TC constructCriteria抽象了底层的实现细节,因此不会限制你用什么持久层用什么查询API,
如下代码样例不难看出是在用Hibernate的criteria API实现分页查询:
private static final int DEFAULT_PAGE_SIZE = 20;
private void doPagingQuery() {
BaseSortPagingListModel listModel= preparePagingListModel(DEFAULT_PAGE_SIZE);
renderListboxPage(forecastListbox, 0, listModel);
}
@SuppressWarnings("serial")
private BaseSortPagingListModel preparePagingListModel(int pageSize) {
return new BaseSortPagingListModel(pageSize , sortColum,
sortAscFlag) {
@Override
protected DetachedCriteria constructCriteria(String orderBy, Boolean asc) {
return prepareDc(forecastTaskTypeList, queryForm);
}
@Override
protected Integer doCountTotalSize(DetachedCriteria dc) throws Exception {
return HibernateUtil.countRecordsByCriteria(dc, "id");
}
@Override
protected List doQuery(DetachedCriteria dc, int index, int pageSize) throws Exception {
return HibernateUtil.findByCriteria(dc, index, pageSize);
}
@Override
protected FiDcForecastBean doTransferResultModel(Object item) {
return (FiDcForecastBean) item;
}
};
}
public static void renderListboxPage(Listbox lb, int currActivePage, BaseSortPagingListModel pagingListModel) {
lb.getPaginal().setDetailed(true);
lb.getPaginal().setPageSize(pagingListModel.getPageSize());
int size = pagingListModel.getSize();
lb.getPaginal().setTotalSize(size);
lb.setModel(pagingListModel);
lb.getPaginal().setActivePage(currActivePage);
lb.invalidate();
}
页面