Wicket-数据表自定义分页



我正在开发wicket数据表,它使用内置的分页功能,其中数据通过数据提供者提供。Wicket NavigationToolbar用于显示用于导航数据表页面的链接,如下所示

public class AbstractDataTable<T, S> extends DataTable<T, S> {
private static final long serialVersionUID = -3370089530205846951L;
public AbstractDataTable(String id, List<? extends IColumn<T, S>> columns, ISortableDataProvider<T, S> dataProvider) {
this(id, columns, dataProvider, DataTableConstants.DEFAULT_ELEMS_PER_PAGE);
}
public AbstractDataTable(String id, List<? extends IColumn<T, S>> columns, ISortableDataProvider<T, S> dataProvider,
int elemsPerPage) {
super(id, columns, dataProvider, elemsPerPage);      
addToolbars(dataProvider);
}

protected void addToolbars(ISortableDataProvider<T, S> dataProvider) {
addTopToolbar(new HeadersToolbar<S>(this, dataProvider));
addBottomToolbar(new NavigationToolbar(this));
addBottomToolbar(new NoRecordsToolbar(this));
}   

这里dataprovider保存要显示的整个数据,所以从数据库中获取整个数据需要很长时间。所以,为了避免这种情况,我计划以这样一种方式实现分页,即根据页面大小每次单击下一个按钮时调用数据库。基本上像

从table_name LIMIT 25 OFFSET$中选择*将记录数限制为25。当req.query.pageNumber=1时,它将偏移前25条记录,并发送下25条记录。类似地,如果req.query.pageNumber=2,它将偏移前225条记录,并发送51-75条记录。

我被困在这里,我正在寻找实现上述功能的方法

更新

数据提供商的骨架

public class DataTableProvider<T extends AbstractDataProvider> extends  BaseProvider implements Serializable {
private static final long serialVersionUID = -6593326956377071200L;
private final List<T> searchResults;
public DataTableProvider() {
this(null);
}
public DataTableProvider(List<T> bo) {
this.searchResults = null != bo ? bo : new LinkedList<T>();
}
public List<T> provide() {
return searchResults;
}
public int size() {
return provide().size();
}
public void update(List<T> bos) {
searchResults.clear();
searchResults.addAll(null != bos ? bos : Collections.<T> emptyList());
}
public boolean isEmpty() {
return provide().isEmpty();
}
}

点击搜索按钮即可填充以上数据提供商

@Override
protected void onSubmit(SearchFilterBO criteria) {
if (getLog().isDebugEnabled()) {
getLog().debug(format(MSG_PTRN_SEARCH_SUBMISSION, ToStringBuilder.reflectionToString(criteria)));
}
getResultsProvider().update(searchService.searchBy(criteria));
getLog().info(format(MSG_PTRN_SEARCH_ENDED, getResultsProvider().size()));
}

数据提供程序的实现不正确。您必须重写IDataProvider的"迭代器"方法,并在那里选择数据。BaseProvider也没有出现在wicket库中。这里有一个简单的例子:

IDataProvider<Location> provider = new IDataProvider<>() {
@Override
public Iterator<? extends Location> iterator(long first, long count) { 
return getLocationDAO().findAll(first, count).iterator();
}
@Override
public long size() {
return getLocationDAO().getTotal();
}
@Override
public IModel<Location> model(Location object) {
return new Model<>(object);
}
};

最新更新