【问题标题】:datatable pagination when using viewscoped bean使用 viewscoped bean 时的数据表分页
【发布时间】:2012-09-27 09:47:35
【问题描述】:

我一直在我的应用程序中使用JSF 1.2。我的大部分申请页面都包含h:datatable。我遇到了this 精彩的文章,它解释了有关数据表的一切。如上篇文章所示,我通过将我的表绑定到HtmlDataTable 并使用会话范围的bean 来实现数据表分页。

现在我正在转向JSF 2.0 版本。我想将我的 sessionscoped bean 转换为 viewscoped,因为我的大多数应用程序页面都是相互独立的。

我遇到了this 文章,其中解释了Viewscoped bean。它告诉我们不能使用数据表的binding 属性。它还使用Datamodel

我现在对如何使用 Datamodelviewscoped bean 实现数据表分页感到震惊。

我有以下分页方法

public String pageFirst() {
        dataTable.setFirst(0);
        return "";
    }

    public String pagePrevious() {
        dataTable.setFirst(dataTable.getFirst() - dataTable.getRows());
        return "";
    }

    public String pageNext() {
        dataTable.setFirst(dataTable.getFirst() + dataTable.getRows());
        return "";
    }

    public String pageLast() {
        try {
        int count = dataTable.getRowCount();
        int rows = dataTable.getRows();
        LOGGER.info("rowcount:" + count);
        LOGGER.info("rows:" + rows);
        dataTable.setFirst(count - ((count % rows != 0) ? count % rows : rows));
        }catch(ArithmeticException e){
            LOGGER.info("no rows to display: ",e);
        }
        return "";
    }

在视图中我是这样使用它们的

<h:commandButton value="#{msgs.footerbutton1}"
                 action="#{bean.pageFirst}"
                 disabled="#{bean.dataTable.first == 0}" />
<h:commandButton value="#{msgs.footerbutton2}"
             action="#{bean.pagePrevious}"
             disabled="#{bean.dataTable.first == 0}" />
<h:commandButton value="#{msgs.footerbutton3}"
             action="#{bean.pageNext}"
             disabled="#{bean.dataTable.first + bean.dataTable.rows
                             >= bean.dataTable.rowCount}" />
<h:commandButton value="#{msgs.footerbutton4}"
              action="#{bean.pageLast}"
              disabled="#{bean.dataTable.first + bean.dataTable.rows
                           >= bean.dataTable.rowCount}" />

请帮忙。

【问题讨论】:

    标签: jsf jsf-2 datatable pagination


    【解决方案1】:

    dataTable.setFirst(...)dataTable.getRows() 替换为绑定为的private int firstprivate int rows 属性

    <h:dataTable ... first="#{bean.first}" rows="#{bean.rows}">
    

    【讨论】:

      【解决方案2】:

      我认为,您应该使用 primefaces datable 他们有一个非常好的开箱即用数据表,其中包含很多功能,包括 lazy loading 或者您可以使用 richfaces 或任何其他组件套件。 当然你可以构建你的 onw jsf 分页,但我认为你会花费大量时间来构建一些已经完成的东西。

      【讨论】:

      • 感谢卡斯特罗的回复。但我正在使用 Apache trinidad 组件。我喜欢将解决方案扩展到特立尼达表
      • @Sreeram 如果 trinidad 组件只会给您带来大量工作和浪费时间,只需使用具有许多内置功能的 PrimeFaces 组件,例如分页、排序和过滤(用于数据表)。如果您仍然想重新发明*,那就尽情享受并喝杯咖啡吧。
      最近更新 更多