Wicket - 数据表自定义分页

Posted

技术标签:

【中文标题】Wicket - 数据表自定义分页【英文标题】:Wicket - Datatable custom pagination 【发布时间】: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/… 以获取灵感 【参考方案1】:

您的数据提供者实现不正确。您必须覆盖 IDataProvider 的“迭代器”方法并在那里选择您的数据。 BaseProvider 也没有出现在检票口库中。这是一个简单的例子:

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);
        
    ;

【讨论】:

以上是关于Wicket - 数据表自定义分页的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PrimeFaces 数据表自定义分页器

数据表中的自定义分页

数据表 - 自定义过滤器和分页

Angular DataTable - 自定义分页和信息

jqgrid分页后,自定义查询数据怎么得到所有页的某列值的合计

批量插入数据自定义分页器