2010-08-19 22 views
13

¿Conoces este sentimiento cuando cada código que escribes funciona de inmediato y retrasas tu agenda ?: "Es como 'oh sí, ahora tengo tiempo para hacerlo perfecto'. Ahí es donde estoy en este momento ^^JSF2 Buscapersonas/buscapersonas para el repetidor

Así que implementé un repetidor con JSF (ui: repetir) y pensé en una paginación para todas las entidades. ¿Hay quizás una manera fácil de hacer eso? ¿Cuáles son los puntos en los que tengo que pensar?

Estaría bien que alguien me ayude. Mis googleskills no me han ayudado hasta ahora :-P

Saludos ...

+0

¿Utiliza richfaces en su aplicación? –

+0

Yo no. Pero podría si eso me ayuda :-) – Sven

Respuesta

21

Aquí está un ejemplo sencillo que debe darle la idea sobre cómo implementar esto.

RepeatPaginator:

public class RepeatPaginator { 

    private static final int DEFAULT_RECORDS_NUMBER = 2; 
    private static final int DEFAULT_PAGE_INDEX = 1; 

    private int records; 
    private int recordsTotal; 
    private int pageIndex; 
    private int pages; 
    private List<?> origModel; 
    private List<?> model; 

    public RepeatPaginator(List<?> model) { 
     this.origModel = model; 
     this.records = DEFAULT_RECORDS_NUMBER; 
     this.pageIndex = DEFAULT_PAGE_INDEX;   
     this.recordsTotal = model.size(); 

     if (records > 0) { 
      pages = records <= 0 ? 1 : recordsTotal/records; 

      if (recordsTotal % records > 0) { 
       pages++; 
      } 

      if (pages == 0) { 
       pages = 1; 
      } 
     } else { 
      records = 1; 
      pages = 1; 
     } 

     updateModel(); 
    } 

    public void updateModel() { 
     int fromIndex = getFirst(); 
     int toIndex = getFirst() + records; 

     if(toIndex > this.recordsTotal) { 
      toIndex = this.recordsTotal; 
     } 

     this.model = origModel.subList(fromIndex, toIndex); 
    } 

    public void next() { 
     if(this.pageIndex < pages) { 
      this.pageIndex++; 
     } 

     updateModel(); 
    } 

    public void prev() { 
     if(this.pageIndex > 1) { 
      this.pageIndex--; 
     } 

     updateModel(); 
    } 

    public int getRecords() { 
     return records; 
    } 

    public int getRecordsTotal() { 
     return recordsTotal; 
    } 

    public int getPageIndex() { 
     return pageIndex; 
    } 

    public int getPages() { 
     return pages; 
    } 

    public int getFirst() { 
     return (pageIndex * records) - records; 
    } 

    public List<?> getModel() { 
     return model; 
    } 

    public void setPageIndex(int pageIndex) { 
     this.pageIndex = pageIndex; 
    } 

} 

Bean:

public class TestBean { 

    private List<String> list; 
    private RepeatPaginator paginator; 

    @PostConstruct 
    public void init() { 
     this.list = new ArrayList<String>(); 
     this.list.add("Item 1"); 
     this.list.add("Item 2"); 
     this.list.add("Item 3"); 
     this.list.add("Item 4"); 
     this.list.add("Item 5"); 
     this.list.add("Item 6"); 
     this.list.add("Item 7"); 
     this.list.add("Item 8"); 
     this.list.add("Item 9"); 
     this.list.add("Item 10"); 
     this.list.add("Item 11"); 
     paginator = new RepeatPaginator(this.list); 
    } 

    public RepeatPaginator getPaginator() { 
     return paginator; 
    } 

} 

XHTML:

<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    template="/WEB-INF/template/default.xhtml"> 

<ui:define name="content"> 
    <h:form> 
     <ui:repeat value="#{testBean.paginator.model}" var="listItem"> 
      <div> 
       <h:outputText value="#{listItem}"/> 
      </div> 
     </ui:repeat> 
     <h:commandButton value="&lt; prev" action="#{testBean.paginator.prev}"/> 
     <h:outputText value="#{testBean.paginator.pageIndex}/#{testBean.paginator.pages}"/> 
     <h:commandButton value="next &gt;" action="#{testBean.paginator.next}"/> 
     <h:inputHidden value="#{testBean.paginator.pageIndex}"/> 
    </h:form> 
</ui:define> 
</ui:composition> 
+1

Gracias por esas cosas increíbles :-) funciona perfectamente – Sven

+0

@mmanco dentro del UIRepeater ¿eres capaz de crear dinámicamente commandLinks? –

9

paginación de hecho es fácil. Solo tiene que seguir pasando uno o dos parámetros alrededor de: firstrow y opcionalmente rowcount (que también se puede mantener en el servidor). Cuando el usuario final hace clic en Next, simplemente incrementa el valor de firstrow con el valor rowcount. Cuando el usuario final hace clic en Atrás, solo disminuye el valor de firstrow con el valor rowcount. Solo necesita comprobar si no supera los límites de 0 y totalrows y modificar en consecuencia.

Luego, según los firstrow y rowcount deseados, usted sabe exactamente qué datos mostrar. Si todos los datos ya están en algún List en la memoria de Java, entonces simplemente usa List#subList() para obtener una sublista de la misma para su visualización. Sin embargo, no es eficiente duplicar toda la tabla de la base de datos en la memoria de Java. Puede que no dañe cuando solo hay 100 filas, pero cuando es mucho más que eso y/o lo está duplicando para cada usuario, la aplicación se quedará sin memoria muy pronto.

En ese caso, preferiría paginar a nivel de base de datos. En, por ejemplo, MySQL puede usar la cláusula LIMIT para obtener un subconjunto de resultados de la base de datos. JPA/Hibernate incluso proporciona maneras usando los métodos setFirstResult() y setMaxResults() de Query y Criteria respectivamente. Puede encontrar ejemplos en this y this respuesta.

Puede encontrar un ejemplo de patada inicial básica JSF 1.2 de paginación (y clasificación) similar a la de Google en this article. Utiliza componentes de Tomahawk, pero en JSF 2.0 puede simplemente dejarlos al hacer el bean @ViewScoped (reemplaza t:saveState) y usando ui:repeat (reemplaza t:dataList).

Por último, pero no menos importante, hay muchas bibliotecas de componentes que hacen todos los trabajos en un solo componente. Por ejemplo, RichFaces<rich:datascroller> y PrimeFaces<p:dataTable paginator="true"> (también se puede hacer ajaxical).

+0

Hm, estoy realmente sorprendido de que no haya incluido un ejemplo típico de 'BalusC-kickoff'. :) Aún así, me gusta el enfoque DB de todos modos. – alexander

+0

@BalusC: Hola BalusC, parece que Primefaces introduce ui: repite la paginación después de marcar este enlace [http://blog.primefaces.org/?p=1808](http://blog.primefaces.org/?p= 1808) pero el enlace dentro de este artículo no es válido. ¿Puede aclararnos este punto? ¿Hay una solución de primefaces para ui: repetir la paginación? –

+0

@Jad: es el ''. – BalusC

Cuestiones relacionadas