JSF2中继器寻呼/寻呼机

JSF2中继器寻呼/寻呼机,jsf,pagination,repeater,jsf-2,Jsf,Pagination,Repeater,Jsf 2,你知道这种感觉吗?当你写的每一个代码都很快地工作,而你却没有完成你的计划时。那就是我现在的处境^^ 因此,我用JSF(ui:repeat)实现了一个repeater,并考虑对所有实体进行分页。有没有一个简单的方法?我要考虑的要点是什么 如果有人能给我一些帮助就好了。到目前为止,我的谷歌技能对我没有帮助 干杯…这里有一个简单的例子,可以让您了解如何实现这一点 中继器: public class RepeatPaginator { private static final int DEFA

你知道这种感觉吗?当你写的每一个代码都很快地工作,而你却没有完成你的计划时。那就是我现在的处境^^

因此,我用JSF(ui:repeat)实现了一个repeater,并考虑对所有实体进行分页。有没有一个简单的方法?我要考虑的要点是什么

如果有人能给我一些帮助就好了。到目前为止,我的谷歌技能对我没有帮助


干杯…

这里有一个简单的例子,可以让您了解如何实现这一点

中继器:

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

}
公共类重复分页器{
私有静态最终整数默认记录数=2;
私有静态final int DEFAULT_PAGE_INDEX=1;
私人int记录;
私人int recordsTotal;
私有int页索引;
私人网页;
私有列表原始模型;
私有列表模型;
公共中继器(列表模型){
this.origModel=模型;
this.records=默认的\u记录\u编号;
this.pageIndex=默认页面索引;
this.recordsTotal=model.size();
如果(记录>0){
页面=记录(0){
网页++;
}
如果(页面==0){
页数=1;
}
}否则{
记录=1;
页数=1;
}
updateModel();
}
public void updateModel(){
int fromIndex=getFirst();
int-toIndex=getFirst()+记录;
如果(toIndex>this.recordsTotal){
toIndex=this.recordsTotal;
}
this.model=原始模型子列表(从索引到索引);
}
下一个公共空间(){
if(this.pageIndex1){
本页索引--;
}
updateModel();
}   
公共记录{
退货记录;
}
public int getRecordsTotal(){
返回记录stotal;
}
public int getPageIndex(){
返回页面索引;
}
公共int getPages(){
返回页面;
}
公共int getFirst(){
返回(页面索引*记录)-记录;
}
公共列表getModel(){
收益模型;
}
公共void setPageIndex(int-pageIndex){
this.pageIndex=pageIndex;
}
}
豆子:

公共类TestBean{
私人名单;
专用中继器分页器;
@施工后
公共void init(){
this.list=new ArrayList();
本清单新增(“第1项”);
本清单新增(“第2项”);
本清单新增(“第3项”);
本清单新增(“第4项”);
本清单新增(“第5项”);
本清单新增(“第6项”);
本清单新增(“第7项”);
本清单新增(“第8项”);
本清单新增(“第9项”);
本清单新增(“第10项”);
本清单新增(“第11项”);
paginator=新的重复paginator(this.list);
}
公共中继器paginator getPaginator(){
返回分页器;
}
}
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>

分页实际上很容易。您只需不断传递一个或两个参数:
firstrow
和可选的
rowcount
(也可以保存在服务器端)。当最终用户单击“下一步”时,只需将
firstrow
的值与
rowcount
的值相加即可。当最终用户单击“上一步”时,只需将
firstrow
的值减去
rowcount
。您只需检查它是否没有超出
0
totalrows
的边界,并进行相应的更改

然后,根据所需的
第一行
行数
,您可以准确地知道要显示哪些数据。如果所有数据都已经在Java内存中的某个
列表中,那么您只需使用它来获取一个子列表以供显示。但是,将整个数据库表复制到Java内存中是没有效率的。当它只有100行时可能不会有什么坏处,但当它远远超过100行时和/或为每个用户复制它时,应用程序很快就会耗尽内存

在这种情况下,您更希望在DB级别进行分页。例如,在MySQL中,您可以使用
LIMIT
子句从数据库中获取结果的子集。JPA/Hibernate甚至提供了分别使用
setFirstResult()
setMaxResults()
查询方法和
条件的方法。你可以在和答案中找到例子

您可以在中找到一个类似Google的分页(和排序)的基本JSF1.2目标启动示例。它使用Tomahawk组件,但在JSF2.0中,您可以通过使bean
@ViewScoped
(替换
t:saveState
)和使用
ui:repeat
(替换
t:dataList
)将它们去掉


最后但并非最不重要的一点是,有许多组件库在单个组件中完成所有工作。例如和(也可以这样做)。

在应用程序中是否使用richfaces?我不使用。但是如果这对我有帮助的话,我可以:-)@mmanco在UIRepeater中你能动态创建commandLinks吗?嗯,我真的很惊讶,你没有包括一个典型的“BalusC kickoff”——例如:)不过,我还是喜欢DB方法。@BalusC:Hi BalusC,似乎primefaces在检查此链接后引入了ui:repeat pagination,但本文中的链接无效,请您澄清这一点好吗?是否有一个primefaces解决方案用于ui:重复分页?@Jad:这是
。非常感谢!我到了这个地方
<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>