【发布时间】:2021-03-01 20:53:39
【问题描述】:
我正在研究 wicket 数据表,该数据表使用内置分页功能,其中数据通过 dataprovider 提供。 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 保存要显示的全部数据,因此从数据库中获取全部数据需要很长时间。因此,为了避免这种情况,我计划以这样一种方式实现分页,即每次根据页面大小单击下一步按钮时调用数据库。基本如下图
select * from table_name LIMIT 25 OFFSET ${req.query.pageNumber25} 将记录数限制为 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 实现的代码。
-
感谢 martin 有兴趣帮助我。更新了主要描述中的代码
-
我不知道 BaseProvider 是从哪里来的,但是您的泛型类参数似乎错误,应该是 DataTableProvider
-
请参阅github.com/wicketstuff/core/blob/… 以获取灵感
标签: wicket wicket-6 wicketstuff