你是否有那种每次编写代码都立即运行并且提前完成计划的感觉 :-P 就像是“哦,现在我有时间把它完美化”。这就是我目前的状态^^
因此,我使用JSF(ui:repeat)实现了一个重复器,并考虑对所有实体进行分页。也许有一种简单的方法来实现这个功能吗?我需要考虑哪些要点?
如果有人能给我一些帮助就好了。我的谷歌技巧到目前为止还没有帮助我 :-P
干杯...
你是否有那种每次编写代码都立即运行并且提前完成计划的感觉 :-P 就像是“哦,现在我有时间把它完美化”。这就是我目前的状态^^
因此,我使用JSF(ui:repeat)实现了一个重复器,并考虑对所有实体进行分页。也许有一种简单的方法来实现这个功能吗?我需要考虑哪些要点?
如果有人能给我一些帮助就好了。我的谷歌技巧到目前为止还没有帮助我 :-P
干杯...
这里有一个简单的示例,可以帮助你了解如何实现这个功能。
RepeatPaginator:
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;
}
}
Bean:
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="< prev" action="#{testBean.paginator.prev}"/>
<h:outputText value="#{testBean.paginator.pageIndex} / #{testBean.paginator.pages}"/>
<h:commandButton value="next >" action="#{testBean.paginator.next}"/>
<h:inputHidden value="#{testBean.paginator.pageIndex}"/>
</h:form>
</ui:define>
</ui:composition>
firstrow
和可选的rowcount
(也可以保存在服务器端)。当用户点击“下一页”时,你只需将firstrow
的值增加rowcount
的值。当用户点击“上一页”时,你只需将firstrow
的值减去rowcount
的值。你只需要检查它是否超出0
和totalrows
的边界,并相应地进行更改。
然后,根据所需的firstrow
和rowcount
,您知道要显示哪些数据。如果所有数据已经在Java内存中的某个List
中,则只需使用{{link1:List#subList()
}}从中获取子列表以进行显示。但是,将整个数据库表复制到Java的内存中并不高效。当它只有100行时可能没有问题,但是当它远远超过这个数量和/或您为每个单独的用户复制它时,应用程序很快就会耗尽内存。
LIMIT
子句从数据库获取结果的子集。甚至JPA / Hibernate提供了使用Query
和Criteria
的setFirstResult()
和setMaxResults()
方法的方式。您可以在this和this答案中找到示例。@ViewScoped
(替换t:saveState
)并使用ui:repeat
(替换t:dataList
)来省略它们。
最后但并非最不重要的,有许多组件库可以在单个组件中完成所有工作。例如 RichFaces <rich:datascroller>
和 PrimeFaces <p:dataTable paginator="true">
(也可以通过 ajaxical 完成)。
<p:dataList>
。 - BalusC