2011-09-12 22 views
10

¿Cuál es la forma más eficiente de paginación en la aplicación JSF 2.0? Uso la tabla de datos Primefaces y es lo suficientemente inteligente como para realizar la paginación por sí misma sin codificación.Paginación JSF eficiente

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

Lo que veo, es que necesito ubicar mi bean en una sesión con un alcance mayor.

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

Quería saber si hay alguna otra manera eficiente de cómo realizar esto?

Usé EJB/JPA en el back-end por cierto. Me gustaría saber cualquier enlace o tutorial para aprender más sobre esto.

Gracias.

Respuesta

18

Es necesario utilizar LazyDataModel el fin de tener sólo las filas de memoria que el cliente realmente necesita ver . See also the example in PrimeFaces showcase. Esto hace paginación en el nivel de DB, que es lo que en última instancia quieres.

RichFaces admite por cierto el mismo en el sabor de ArrangableDataModel, here's the RichFaces showcase example.

+0

Hola BalusC, esta es una excelente sugerencia. Usaré esto. Sin embargo, noto que este modelo es primo específico. Me gustaría saber qué pasaría si solo estoy usando la tabla de datos JSF, entonces ¿cómo se hace la paginación en este caso? Perdón por la pregunta adicional, solo aumenta mi curiosidad. Tengo un EJB/JPA que maneja mi lógica comercial. –

+0

Simplemente tendrá que escribir el código repetitivo necesario en algunos beans auxiliares. Puede obtener algunos ejemplos/ideas de inicio en este artículo: http://balusc.blogspot.com/2008/10/effective-datatable-paging-and-sorting.html (nota: ¡artículo de 3 años y JSF 1.2 dirigido!) – BalusC

+0

@BalusC, de hecho. Todas las repeticiones en algún grano auxiliar. ¿Por qué JSF tiene que ser tan genérico? ¿Y por qué el componente de dataTable incorporado de JSF carece de algo como 'LazyDataModel' después de 10 años de existencia? –

1

He encontrado que la función de paginación integrada de la tabla de datos Primefaces es una de las mejores características y realicé una buena cantidad de pruebas de carga, trayendo conjuntos de registros con más de 30,000 entidades de Hibernate y encontré el rendimiento mediocre . Esto, por supuesto, significa que tendrá 30,000 entidades en sesión, así que tengo lo siguiente en mi web.xml para ayudar al almacenar la sesión en el lado del servidor.

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

Esto reducirá el tamaño de la ViewState permitiendo tamaño de solicitud/respuesta a reducirse en gran medida, sin embargo la memoria del lado del servidor puede sufrir enormemente por hacer esto.

Otra opción potencial en algunas implementaciones JSF para ayudar a mitigar el tamaño de ViewStat o el uso de la memoria de sesión es la compresión. El siguiente enlace describe varios parámetros de configuración de SUN RI y MyFaces JSF que se pueden establecer, algunos de los cuales ofrecen la opción de compresión del estado de la sesión. http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/index.jsp?topic=%2Fcom.ibm.websphere.express.doc%2Finfo%2Fexp%2Fae%2Frweb_jsfengine.html

En cuanto a aprender más sobre cómo funciona la función de paginación Primefaces DataTable, ¿por qué no ir directamente a la fuente? Primefaces es después de todo un proyecto de código abierto, por lo que acaba de ver el código y ver lo que puede aprender: http://code.google.com/p/primefaces/source/browse/#svn%2Fprimefaces

0

Nota importante según la versión de Primefaces que esté utilizando. Comenzando con 3.0.M2 (creo) si desea utilizar la función de selección de fila, debe implementar un SelectableDataModel. Esto rompe una gran cantidad de código heredado y hubo una serie de perras sobre eso.

más sencilla de hacerlo es crear una clase interna como esto:

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. 

A continuación, el valor atributo a t: dataTable convierte # {} bean.dataModel.

Buena suerte.

2

En una aplicación de producción, hemos utilizado un modelo de datos perezoso para tratar 700000 registros en db. Sugiero usar M3, que tiene correcciones en casos de tabla de datos flojos.