2011-09-12 17 views
10

Qual è il modo più efficiente di eseguire l'impaginazione nell'app JSF 2.0? Uso Primefaces datatable ed è abbastanza intelligente da eseguire l'impaginazione da solo senza alcuna codifica.Impaginazione JSF efficiente

<p:dataTable var="car" value="#{carBean.cars}" paginator="true" rows="10"> 
    <!-- Multiple columns here--> 
</p:dataTable> 

La cosa che vedo è che ho bisogno di posizionare il mio bean su sessione con scope o superiore.

@ManagedBean 
@SessionScoped 
public class CarBean{ 
    public List<Car> getCars(){ 
     //return data from DB 
    } 
} 

Volevo sapere c'è un altro modo efficiente su come eseguire questo?

Ho usato EJB/JPA al back-end, a proposito. Vorrei sapere qualsiasi link o tutorial per saperne di più su questo.

Grazie.

risposta

18

È necessario utilizzare LazyDataModel per avere solo le righe nella memoria che il cliente in realtà ha bisogno di vedere . See also the example in PrimeFaces showcase. Questo fa l'impaginazione a livello di DB che è ciò che alla fine vuoi.

RichFaces supporta lo stesso sapore di ArrangableDataModel, here's the RichFaces showcase example.

+0

Ciao BalusC, questo è un eccellente suggerimento. Userò questo. Tuttavia, noto che questo modello è specifico per primefaces. Vorrei solo sapere, cosa succede se sto usando solo dati databili JSF, quindi come viene eseguita la paginazione in questo caso? Scusa per la domanda in più, solleva solo la mia curiosità. Ho un EJB/JPA che gestisce la mia logica aziendale. –

+0

Devi solo scrivere il codice boilerplate necessario in qualche bean ausiliario. Puoi ottenere alcuni esempi/approfondimenti di kickoff in questo articolo: http://balusc.blogspot.com/2008/10/effective-datatable-paging-and-sorting.html (nota: articolo di 3 anni e target di JSF 1.2!) – BalusC

+0

@BalusC, infatti. Tutta la piastra di cottura in qualche fagiolo ausiliario. Perché JSF deve essere così generico? E perché il componente dataTable integrato JSF manca qualcosa come 'LazyDataModel' dopo 10 anni della sua esistenza? –

1

Ho scoperto che la funzione di impaginazione integrata della tabella di dati Primefaces è una delle migliori caratteristiche e ha eseguito una buona quantità di test di carico su di esso, introducendo recordset con oltre 30.000 entità Hibernate e trovato le prestazioni poco brillanti . Questo ovviamente significa che avrete 30.000 entità in sessione, quindi ho il seguente nel mio web.xml per aiutare memorizzando la sessione sul lato server.

<context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>server</param-value> 
</context-param> 

Ciò consentirà di ridurre le dimensioni del ViewState permettendo dimensione di richiesta/risposta a essere notevolmente ridotto però di memoria lato server può soffrire enormemente in questo modo.

Un'altra possibile opzione in alcune implementazioni JSF per ridurre le dimensioni di ViewStat o l'utilizzo della memoria di sessione è la compressione. Il seguente collegamento descrive un numero di parametri di configurazione SUN RI e MyFaces JSF che possono essere impostati, alcuni dei quali offrono l'opzione di compressione dello stato della sessione. http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html

Per ulteriori informazioni su come funziona la funzione di impaginazione DataTable Primefaces, perché non andare direttamente alla fonte? Primefaces è dopo tutto un progetto open source, quindi basta guardare il codice e vedere cosa si può imparare: http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces

0

Nota importante a seconda della versione di Primefaces che si sta utilizzando. A partire da 3.0.M2 (penso) se si desidera utilizzare la funzione di selezione riga, è necessario implementare un SelectableDataModel. Questo rompe un sacco di codice legacy e ci sono state una serie di cazzate a riguardo.

cosa più semplice da fare è quello di creare una classe interna come questo:

private MyDataModel dataModel = null; 

public MyDataModel getDataModel() { 
    if (dataModel != null) return dataModel; 
    dataModel = new MyDataModel(some list); 
    return dataModel; 
} 

public static class MyDataModel extends ListDataModel<SomeRecord> 
     implements SelectableDataModel<SomeRecord> { 

    MyDataModel(List<SomeRecord> source) { 
     super(source); 
    } 
etc. 

Quindi il valore di attributo p: dataTable diventa # {} bean.dataModel.

Buona fortuna.

2

In un'app di produzione, abbiamo utilizzato una datamodel pigra per gestire 700000 record in db. Suggerirei di usare M3 che ha correzioni su casi databili pigri.