2010-02-11 14 views

Respuesta

87

Eche un vistazo a PagedListHolder y otras clases de org.springframework.beans.support.

Consulte el JPetstore en las muestras para ver algunos ejemplos, p. en SearchProductsController.java:

public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { 
    String keyword = request.getParameter("keyword"); 
    if (keyword != null) { 
     if (!StringUtils.hasLength(keyword)) { 
      return new ModelAndView("Error", "message", "Please enter a keyword to search for, then press the search button."); 
     } 
     PagedListHolder productList = new PagedListHolder(this.petStore.searchProductList(keyword.toLowerCase())); 
     productList.setPageSize(4); 
     request.getSession().setAttribute("SearchProductsController_productList", productList); 
     return new ModelAndView("SearchProducts", "productList", productList); 
    } 
    else { 
     String page = request.getParameter("page"); 
     PagedListHolder productList = (PagedListHolder) request.getSession().getAttribute("SearchProductsController_productList"); 
     if (productList == null) { 
      return new ModelAndView("Error", "message", "Your session has timed out. Please start over again."); 
     } 
     if ("next".equals(page)) { 
      productList.nextPage(); 
     } 
     else if ("previous".equals(page)) { 
      productList.previousPage(); 
     } 
     return new ModelAndView("SearchProducts", "productList", productList); 
    } 
} 
+14

(+1) Hot maldición, no tenía idea de que estaba allí. Debo haber implementado esa funcionalidad al menos 3 veces, y ya estaba ... – skaffman

+1

genial, por cierto, ¿pueden explicarme cómo se necesita la sesión en el ejemplo de SearchProductsController code? Revisé el código y no pude usarlo. – Nachiket

+2

@Nachiket Una vez creado, el objeto 'PagedListHolder' se coloca en la sesión, la paginación se realiza realmente en un objeto en memoria. ¿Responde esto a tu pregunta? Si no, ¿puedes aclarar? –

11

Estaba buscando una manera de hacer eso, también, pero no encontré ningún componente estándar o taglib. Creo que principalmente porque la paginación puede volverse muy específica ya que necesita recuperar sus datos con paginación de la base de datos (si está utilizando Hibernate puede hacerlo fácilmente usando la API de Criteria). Se me ocurrió algo similar:

public class Pager 
{ 
    private int page; 
    private int results; 
    private String sortOrder; 
    private String sortColumn; 

    // Getters and setters 
} 

@Controller 
public class StuffController 
{ 
    @Autowired SomeEntityService someEntityService; 

    @RequestMapping("/test.html", method = Method.GET) 
    public void getStuffPaged(@RequestParam("id") String id, Pager pager, ModelMap mm) 
    { 
     mm.addAttribute("entities", someEntityService.get(id, pager)); 
    } 
} 

Si ahora realiza una solicitud a http://domain/app/test.html?id=10&page=1&results=30&sortOrder=asc obtendrá el objeto de localizador en su solicitud.

+0

No estoy usando hibernate, pero es genial .. bueno uno ..:) – Nachiket

+0

¡La mejor respuesta hasta ahora! Manera limpia de enlazar parámetros de paginación, ¡funciona sin hibernación también! – digz6666

+0

En lugar de 'Pager' puede usar' Pageable' provisto por defecto por Spring – EliuX

4

Nadie viene a la mente y Google tampoco revela ningún componente específico para eso (aunque da ejemplos y consejos bastante concretos). Pero, en teoría, solo un grupo de botones y uno (o dos) parámetros de solicitud son más que suficientes. Luego, deje que el SQL/DB haga su trabajo. He publicado una respuesta a una pregunta similar en contexto JSP/Servlet/DAO antes de here.

Básicamente se reduce a pasar firstrow (índice de primera fila que se mostrará en una página) alrededor como parámetro de la petición y que tiene dos botones/enlaces en forma de paginación que en/decrementa el firstrow con rowcount (cantidad de filas que se muestran de una vez en una página) en combinación con una consulta SQL que devuelve un subconjunto de los resultados con ayuda de cada LIMIT, OFFSET cláusulas o subselecciones, o funciones específicas, dependiendo de la BD en cuestión. Consulte la respuesta anterior para obtener ejemplos detallados de código y consultas SQL.

4

¿Alguna vez escuchó sobre el proyecto Spring Data JPA? Hay una buena solución flexible que usa la interfaz Pagable. Descubrí que es la forma más sencilla de lograr una paginación limpia y sin etiquetas. Vea más en el Spring Data JPA homepage.

+0

Lo busqué en ese enlace y no encontré nada saltándome para este propósito – mmcrae

2

Publiqué una biblioteca de código abierto de Java enfocada en la paginación con Spring Framework hace algún tiempo.

Aunque no ha sido muy exitoso, tal vez alguien esté interesado en probarlo.

hay ejemplos para usarlo con

Los ejemplos en línea son algo obsoleto, descargar mejor el archivo JDAL-muestras desde sourceforge.

Cuestiones relacionadas