我正在试图弄清楚如何使用richfaces datascroller进行真正的分页。
目前我的查询从表中提取所有数据,我想要它,所以当你点击datascroller的下一个按钮时,它将查询db接下来的20行。
我理解如何编写查询以限制行,但我不知道如何获取datascroller的下一个按钮来调用特定方法。
我看到有很多人在Richfaces论坛上发布了潜在的解决方案,但他们都使用了dataModel。由于我没有使用ORM,我不确定如何将这些解决方案应用于我所拥有的。
感谢任何帮助。
<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row">
<rich:columns value="#{tableBacking.columns == null ? '' : tableBacking.columns}" var="columns" index="ind" id="column#{ind}" sortBy="#{results[ind].data}" rendered="#{tableBacking.columns != null}">
<f:facet name="header">
<h:outputText value="#{columns.columnDescription}" />
</f:facet>
<h:outputText value="#{results[ind].data}" />
</rich:columns>
</rich:extendedDataTable>
<rich:datascroller for="resultsTable" page="#{tableBacking.page}" renderIfSinglePage="false" />
支持bean
public class TableBacking {
private List<List<TableData>> results = null;
private int page = 0;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<List<TableData>> getResults() throws Exception {
return results;
}
public void setResults(List<List<TableData>> results) {
this.results = results;
}
private void getData(String whereClause) {
try {
DataDao dd = new DataDao();
results = dd.getData(); // dd.getData just runs a query on a table and puts the results in a List of lists.
} catch (Exception e) {}
}
答案 0 :(得分:3)
尝试这样做:
JSF资料:
<rich:dataTable id="listTable" var="record" rows="10" value="#{personBean.data}">
....
<f:facet name="footer">
<rich:column colspan="8">
<rich:dataScroller page="#{personBean.page}" for="listTable"
scrollListener="#{personBean.scrollPage}" render="listTable" />
</rich:column>
Records : #{personBean.data.size()}
</f:facet>
</rich:dataTable>
Java BackBean Stuff:
public class PersonBean {
// List of Persons
private PagedList<Person> data;
// Current page
private Integer page;
// Default rows to display
private Integer rows = 10;
// Persistence layer
private DaoService daoService;
@PostConstruct
public void init(){
page= 1;
}
// Event trigger on scroll page
public void scrollPage(DataScrollEvent ev) {
log.debug("Scroll event");
reset();
// getPersons execute 2 queries : the first query is the count(*) and the result is set in TotalElements
// the second query gets the 'n' records defined in rows , something like this :
// select * from Persons LIMIT page*rows, (page*rows) + rows and the result is set in Content
Page<Person> pageResult = this.daoService.getPersons(filter, page - 1, rows);
// Now create a pagedList with the constructor
this.data = new PagedList<Person>(pageResult.getContent(), (int) pageResult.getTotalElements(), this.pageSize);
}
}
Java PagedList
public final class PagedList<E> extends AbstractList<E> {
private final List<E> lista;
private final int total;
private final int pageSize;
public PagedList(List<E> lista, int total, int pageSize) {
this.lista = lista;
this.total = total;
this.pageSize = pageSize;
}
public int size() {
return total;
}
public E get(int i) {
i = i % this.pageSize;
return lista.get(i);
}
}
诀窍是将PagedList
类的总属性设置为数据库中dataTable
的计数,并仅在PageList
列表中设置分页元素。
抱歉我的英语不好:P
答案 1 :(得分:0)
您需要将rich:extendedDataTable
绑定到辅助bean中的属性。
Java
private HtmlExtendedDataTable Table;
//Getter and setter
之后绑定视图
<强> XHTML 强>
<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row" binding="#{tableBacking.Table}">
Richfaces HtmlExtendedDataTable
有一种方法可以检查每页显示的行数,称为getRows()
。当bean初始化时只加载第一页的值,根据它(你可以只加载其余页面上的元素的id,稍后当你要访问页面时根据id加载它们)。
<rich:datascroller/>
还有一个事件,当单击一个页面按钮时会触发该事件,您可以通过这种方式从您的支持bean获取该事件:
<强> XHTML 强>
<f:facet name="footer">
<rich:datascroller id="ds"
scrollerListener="#{tableBacking.actionOnPageChange}" />
</f:facet>
<强>爪哇强>
public String actionOnPageChange(DataScrollerEvent event)
此DataScrollerEvent
包含用户点击的页面,您可以使用getNewScrolVal()
获取该页面。当发生这种情况时,只需在表格中加载相应页面的值即可。
答案 2 :(得分:0)
我发现的最佳解决方案是映射&#34;值&#34; dataTable的属性为org.richfaces.model.ExtendedTableDataModelproperty。然后使用org.richfaces.model.DataProvider的实例初始化ExtendedTableDataModel。样品:
在视图中:
<rich:dataTable id="table" value="#{bean.model}" rows="#{bean.rows}">
<!-- columns -->
<f:facet name="footer">
<rich:dataScroller for="table"/>
</f:facet>
</rich:dataTable>
在豆子里:
@ManagedBean
public class Bean {
private int rows = 15; // the ammount of rows per page.
private org.richfaces.model.ExtendedTableDataModel model = new org.richfaces.model.ExtendedTableDataModel(
new org.richfaces.model.DataProvider(
public int getRowCount() {
// count your rows.
}
public List<T> getItemsByRange(int first, int quantity) {
// fetch the page's rows.
}
public T getItemByKey(Object o) {
return null; // no need to implement this.
}
public Object getKey(T t) {
return null; // no need to implement this.
)
);
public int getRows() { return rows; }
public ExtendedTableDataModel getModel() { return model; }
}