2013-01-07 19 views
5

Tôi đang cố gắng tìm ra cách thực hiện phân trang đúng với richfaces datascroller.Richfaces 3 cách làm cho bộ dữ liệu thực hiện phân trang đúng

Hiện tại truy vấn của tôi kéo tất cả dữ liệu từ một bảng và tôi muốn nó khi bạn nhấp vào nút tiếp theo của bộ dữ liệu, nó sẽ truy vấn db cho 20 hàng tiếp theo.

Tôi hiểu cách viết truy vấn để giới hạn các hàng, nhưng tôi không chắc chắn làm thế nào để có được nút tiếp theo của bộ dữ liệu để gọi một phương thức cụ thể.

Tôi thấy có rất nhiều người đăng trên diễn đàn Richfaces với các giải pháp tiềm năng, nhưng tất cả họ đều sử dụng dataModel. Vì tôi không sử dụng ORM, tôi không chắc chắn làm thế nào tôi có thể phù hợp với những giải pháp này cho những gì tôi có.

Mọi trợ giúp đều được đánh giá cao.

<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" /> 

Sao đậu

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) {} 
} 

Trả lời

0

Bạn cần phải ràng buộc của bạn rich:extendedDataTable đến một thuộc tính trong đậu ủng hộ của bạn.

Java

private HtmlExtendedDataTable Table; 
//Getter and setter 

Sau đó bạn gắn cái nhìn của bạn

xhtml

<rich:extendedDataTable id="resultsTable" value="#{tableBacking.results}" var="results" sortMode="single" rowKeyVar="row" binding="#{tableBacking.Table}">

Richfaces HtmlExtendedDataTable có một phương pháp để kiểm tra bao nhiêu hàng được hiển thị trên một trang , được gọi là getRows(). Khi bean khởi tạo chỉ cần tải các giá trị trang đầu tiên, theo đó (bạn chỉ có thể tải các id của các phần tử trên các trang còn lại và sau đó khi bạn truy cập trang tải chúng dựa trên id).

<rich:datascroller/> cũng có một sự kiện được kích hoạt khi một nút trang được nhấp và bạn có thể có được điều đó từ đậu ủng hộ của bạn theo cách này:

xhtml

<f:facet name="footer"> 
<rich:datascroller id="ds" 
       scrollerListener="#{tableBacking.actionOnPageChange}" /> 
</f:facet> 

Java

public String actionOnPageChange(DataScrollerEvent event)

Điều này DataScrollerEvent bao gồm những gì trang đã được nhấp bởi người dùng, mà bạn có thể nhận được bằng cách sử dụng getNewScrolVal(). Khi điều đó xảy ra chỉ cần tải các giá trị của trang tương ứng trong bảng của bạn và đó là nó.

+0

Vấn đề tôi đang gặp với giải pháp này là datascroller không render, vì tôi có hàng DataTable của tôi đặt thành 20 và khi trang tải, nó chỉ nhận được 20 hàng. Bạn có biết làm thế nào để có được xung quanh này? Có cách nào để nói cho datascroller số lượng tối đa của hàng để nó biết bao nhiêu trang để tính toán? – Catfish

+0

Tôi không chắc tôi hiểu ý bạn là gì bởi "' bạn chỉ có thể tải id của các phần tử trên phần còn lại của trang và sau đó khi bạn truy cập trang tải chúng dựa trên id' " – Catfish

+0

Bạn nói rằng bạn không sử dụng ORM. Tôi đã sử dụng giải pháp này với Hibernate, tải toàn bộ dữ liệu nhưng một số thuộc tính trong tải chậm, với điều này, khi tôi yêu cầu một số trang tôi có thể tải các đối tượng và ngăn chặn trường hợp ngoại lệ tải lười biếng. Trong trường hợp của bạn, tôi nghĩ bạn có thể lưu trữ các đối tượng * giả * (chỉ có thuộc tính id được gán) trong các trang không nhìn thấy được. Làm thế nào để đạt được điều đó? Tải toàn bộ danh sách id từ đầu và chỉ lấy thông tin tương đối khi cần. Tôi không biết làm thế nào mô hình của bạn hoạt động, tôi chỉ đưa ra một ý tưởng. –

2

Cố gắng làm điều này:

JSF Stuff:

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

Bí quyết là đặt tổng tài sản là PagedList lớp với số lượng dataTable trong cơ sở dữ liệu và chỉ đặt các phần tử được phân trang trong danh sách PageList.

Xin lỗi vì tôi xấu tiếng anh: P

0

Giải pháp tốt nhất mà tôi đã tìm thấy được ánh xạ "giá trị" thuộc tính của DataTable để một org.richfaces.model.ExtendedTableDataModelproperty. Sau đó bạn khởi tạo ExtendedTableDataModel với một cá thể của org.richfaces.model.DataProvider. Mẫu:

Trong giao diện:

<rich:dataTable id="table" value="#{bean.model}" rows="#{bean.rows}"> 
    <!-- columns --> 
    <f:facet name="footer"> 
     <rich:dataScroller for="table"/> 
    </f:facet> 
</rich:dataTable> 

Trong đậu:

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

} 
Các vấn đề liên quan