2013-01-07 12 views
5

Sto cercando di capire come eseguire la paginazione vera con il datascroller di Richfaces.Richfaces 3 come fare che il datascroller esegua la paginazione vera

Attualmente la mia query recupera tutti i dati da una tabella e lo voglio così quando si fa clic sul prossimo pulsante del datascroller, interrogherà il db per le 20 righe successive.

Capisco come scrivere la query per limitare le righe, ma non sono sicuro di come ottenere il prossimo pulsante del datascroller per chiamare un metodo specifico.

Vedo che ci sono molte persone che postano nei forum di Richfaces con potenziali soluzioni, ma tutti usano un dataModel. Dal momento che non sto usando un ORM, non sono sicuro di come posso adattare queste soluzioni a quello che ho.

Qualsiasi aiuto è apprezzato.

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

Backup fagioli

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

risposta

0

È necessario vincolare il proprio rich:extendedDataTable a un attributo nel backing bean.

Java

private HtmlExtendedDataTable Table; 
//Getter and setter 

Dopo di che è vincolare il proprio vista

xhtml

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

RichFaces HtmlExtendedDataTable ha un metodo per controllare il numero di righe visualizzate per pagina , chiamato getRows(). Quando il bean si inizializza, basta caricare i valori della prima pagina, in base a ciò (è possibile caricare solo gli id ​​degli elementi sul resto delle pagine e successivamente quando si accederà alla pagina caricarli in base all'ID).

<rich:datascroller/> ha anche un evento che viene generato quando un pulsante pagina si fa clic e si può acquisire quella dalla tua backing bean in questo modo:

xhtml

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

Java

public String actionOnPageChange(DataScrollerEvent event)

Questo DataScrollerEvent include quale pagina è stata selezionata dall'utente, che è possibile ottenere utilizzando getNewScrolVal(). Quando ciò accade, carica i valori della pagina corrispondente nella tua tabella e il gioco è fatto.

+0

Il problema che sto avendo con questa soluzione è che il datascroller non viene eseguito il rendering perché ho il mio file dataTable impostato su 20 e quando la pagina viene caricata, riceve solo 20 righe. Sai come aggirare questo? C'è un modo per dire al datascroller il numero massimo di righe in modo da sapere quante pagine calcolare? – Catfish

+0

Non sono sicuro di capire cosa intendi con "" puoi caricare solo gli id ​​degli elementi sul resto delle pagine e più tardi quando accedi alla pagina caricarli in base all'ID " – Catfish

+0

You ha detto che non stai usando un ORM. Ho usato questa soluzione con Hibernate, caricando tutti i dati ma alcuni attributi nel caricamento lazy, con questo, quando richiedo qualche pagina posso caricare quegli oggetti e prevenire le eccezioni di load lazy. Nel tuo caso, penso che tu possa memorizzare * oggetti falsi * (che avranno solo l'attributo id assegnato) in pagine non visibili. Come raggiungerlo? Caricare l'intera lista di identificazione dall'inizio e prendere le informazioni relative solo quando è necessario. Non so come funzioni il tuo modello, mi viene solo un'idea. –

2

provare a fare questo:

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

Il trucco consiste nell'impostare la proprietà totale della classe PagedList con il conteggio dello dataTable nel database e solo impostare gli elementi di paging nell'elenco di PageList.

Ci dispiace per il mio cattivo inglese: P

0

La soluzione migliore che ho trovato è la mappatura del "valore" attributo del dataTable ad un org.richfaces.model.ExtendedTableDataModelproperty. Quindi si inizializza ExtendedTableDataModel con un'istanza di org.richfaces.model.DataProvider. Esempio:

Nella vista:

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

nel chicco:

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

}