【问题标题】:JSF2 Paging / Pager for Repeater中继器的 JSF2 寻呼/寻呼机
【发布时间】:2011-03-31 23:30:10
【问题描述】:

当您编写的每个代码都立即运行并且您的日程安排不足时,您是否知道这种感觉:-P 这就像'哦,是的,现在我有时间让它变得完美'。这就是我现在的位置^^

所以我用 JSF (ui:repeat) 实现了一个转发器,我考虑为所有实体分页。有没有一种简单的方法可以做到这一点?我需要考虑哪些要点?

如果有人给我一些帮助会很好。到目前为止,我的 googleskills 对我没有帮助:-P

干杯...

【问题讨论】:

  • 你在你的应用程序中使用richfaces吗?
  • 我没有。但如果这对我有帮助,我可以:-)

标签: jsf pagination repeater jsf-2


【解决方案1】:

分页其实很简单。您只需要不断传递一两个参数:firstrow 和可选的rowcount(也可以保留在服务器端)。当最终用户单击下一步时,您只需将firstrow 的值增加rowcount 的值。当最终用户单击 Back 时,您只需将 firstrow 的值减少为 rowcount 的值。你只需要检查它是否没有超出0totalrows的边界并相应地改变。

然后,根据所需的firstrowrowcount,您确切知道要显示哪些数据。如果所有数据都已经在Java 内存中的某个List 中,那么您只需使用List#subList() 从中获取一个子列表进行显示。然而,将整个数据库表复制到 Java 的内存中效率不高。当它只有 100 行时可能不会有什么害处,但是当它远不止这些时和/或您为每个用户复制它时,应用程序很快就会耗尽内存。

在这种情况下,您宁愿在数据库级别进行分页。例如,在 MySQL 中,您可以使用 LIMIT 子句从数据库中获取结果子集。 JPA/Hibernate 甚至提供了分别使用QueryCriteriasetFirstResult()setMaxResults() 方法的方法。您可以在thisthis 答案中找到示例。

您可以在this article 中找到类似 Google 的分页(和排序)的基本 JSF 1.2 目标启动示例。它使用 Tomahawk 组件,但在 JSF 2.0 中,您可以通过创建 bean @ViewScoped(替换 t:saveState)和使用 ui:repeat(替换 t:dataList)将它们保留。

最后但同样重要的是,有很多组件库可以在单个组件中完成所有工作。比如RichFaces<rich:datascroller>PrimeFaces<p:dataTable paginator="true">(也可以做到ajaxical)。

【讨论】:

  • 嗯,我真的很惊讶,您没有包含典型的“BalusC-kickoff”示例。 :) 尽管如此,我还是喜欢 DB 方法。
  • @BalusC : 您好 BalusC,在查看此链接http://blog.primefaces.org/?p=1808 后,primefaces 似乎引入了 ui:repeat pagination,但本文中的链接无效,请您澄清一下这一点吗?是否有针对 ui:repeat pagination 的 primefaces 解决方案?
  • @Jad:是<p:dataList>
【解决方案2】:

这是一个简单的示例,应该可以让您了解如何实现它。

重复分页器:

public class RepeatPaginator {

    private static final int DEFAULT_RECORDS_NUMBER = 2;
    private static final int DEFAULT_PAGE_INDEX = 1;

    private int records;
    private int recordsTotal;
    private int pageIndex;
    private int pages;
    private List<?> origModel;
    private List<?> model;

    public RepeatPaginator(List<?> model) {
        this.origModel = model;
        this.records = DEFAULT_RECORDS_NUMBER;
        this.pageIndex = DEFAULT_PAGE_INDEX;        
        this.recordsTotal = model.size();

        if (records > 0) {
            pages = records <= 0 ? 1 : recordsTotal / records;

            if (recordsTotal % records > 0) {
                pages++;
            }

            if (pages == 0) {
                pages = 1;
            }
        } else {
            records = 1;
            pages = 1;
        }

        updateModel();
    }

    public void updateModel() {
        int fromIndex = getFirst();
        int toIndex = getFirst() + records;

        if(toIndex > this.recordsTotal) {
            toIndex = this.recordsTotal;
        }

        this.model = origModel.subList(fromIndex, toIndex);
    }

    public void next() {
        if(this.pageIndex < pages) {
            this.pageIndex++;
        }

        updateModel();
    }

    public void prev() {
        if(this.pageIndex > 1) {
            this.pageIndex--;
        }

        updateModel();
    }   

    public int getRecords() {
        return records;
    }

    public int getRecordsTotal() {
        return recordsTotal;
    }

    public int getPageIndex() {
        return pageIndex;
    }

    public int getPages() {
        return pages;
    }

    public int getFirst() {
        return (pageIndex * records) - records;
    }

    public List<?> getModel() {
        return model;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

}

豆子:

public class TestBean {

    private List<String> list;
    private RepeatPaginator paginator;

    @PostConstruct
    public void init() {
        this.list = new ArrayList<String>();
        this.list.add("Item 1");
        this.list.add("Item 2");
        this.list.add("Item 3");
        this.list.add("Item 4");
        this.list.add("Item 5");
        this.list.add("Item 6");
        this.list.add("Item 7");
        this.list.add("Item 8");
        this.list.add("Item 9");
        this.list.add("Item 10");
        this.list.add("Item 11");
        paginator = new RepeatPaginator(this.list);
    }

    public RepeatPaginator getPaginator() {
        return paginator;
    }

}

XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    template="/WEB-INF/template/default.xhtml">

<ui:define name="content">
    <h:form>
        <ui:repeat value="#{testBean.paginator.model}" var="listItem">
            <div>
                <h:outputText value="#{listItem}"/>
            </div>
        </ui:repeat>
        <h:commandButton value="&lt; prev" action="#{testBean.paginator.prev}"/>
        <h:outputText value="#{testBean.paginator.pageIndex} / #{testBean.paginator.pages}"/>
        <h:commandButton value="next &gt;" action="#{testBean.paginator.next}"/>
        <h:inputHidden value="#{testBean.paginator.pageIndex}"/>
    </h:form>
</ui:define>
</ui:composition>

【讨论】:

  • @mmanco 在 UIRepeater 中你能动态创建 commandLinks 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多