2010-02-11 21 views

risposta

87

Dai un'occhiata a PagedListHolder e altre classi da org.springframework.beans.support.

Vedere il JPetstore nei campioni per alcuni esempi, ad es. in 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 damn, non avevo idea che fosse lì. Devo aver implementato quella funzionalità almeno 3 volte, ed era già ... – skaffman

+1

cool, A proposito, puoi spiegare, come è necessaria la sessione nell'esempio del codice SearchProductsController? Ho passato il codice non riuscendo ad usarlo. – Nachiket

+2

@Nachiket Una volta creato, l'oggetto 'PagedListHolder' viene inserito nella Session, l'impaginazione viene effettivamente eseguita su un oggetto in memoria. Questo risponde alla tua domanda? In caso contrario, puoi chiarire? –

11

Stavo cercando un modo per farlo, ma non ho trovato nessun componente standard o taglib. Penso principalmente perché il paging può diventare molto specifico poiché è necessario recuperare i dati con il paging dal database (se si utilizza Hibernate è possibile farlo facilmente utilizzando l'API Criteria). Sono venuto con qualcosa di simile:

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

Se ora si esegue una richiesta di http://domain/app/test.html?id=10&page=1&results=30&sortOrder=asc si otterrà l'oggetto pager nella richiesta.

+0

Non sto utilizzando l'ibernazione, ma è bello .. buono ..:) – Nachiket

+0

La migliore risposta finora! Un modo pulito per legare i parametri di impaginazione, funziona anche senza ibernazione! – digz6666

+0

Invece di 'Pager' puoi usare' Pageable' fornito di default da Spring – EliuX

4

Nessuno mi viene in mente e Google inoltre non rivela alcun componente specifico per quello (anche se fornisce molti esempi concreti e suggerimenti). Ma in teoria solo un gruppo di pulsanti e uno (o due) parametri di richiesta sono più che sufficienti. Quindi lasciare che SQL/DB faccia il suo lavoro. Ho postato una risposta a una domanda simile nel contesto JSP/Servlet/DAO prima dello here.

Si riduce sostanzialmente giù per passare firstrow (indice della prima riga da visualizzare in una pagina) intorno come parametro della richiesta e presentante due pulsanti/link nella forma impaginazione che a/decrementa il firstrow con rowcount (quantità di righe visualizzate in una sola volta in una pagina) in combinazione con una query SQL che restituisce un sottoinsieme dei risultati con l'aiuto di sotto ciascuna LIMIT, OFFSET clausole o sottoselezioni o funzioni specifiche, a seconda del DB in questione. Vedere la risposta aforelinked per esempi di codice dettagliati e query SQL.

4

Avete mai sentito parlare del progetto Spring Data JPA? C'è una bella soluzione flessibile usando l'interfaccia Pagable. Ho trovato che fosse il modo più semplice per ottenere una paginazione pulita e senza piatti. Scopri di più al Spring Data JPA homepage.

+0

Ho esaminato il link e non ho trovato niente che mi saltasse addosso a questo scopo – mmcrae

3

Here's a link to the Spring Data JPA reference docs, dove hanno un approccio molto pulito alla paginazione del web.

+0

Impressionante, grazie. C'è supporto per la ricerca sulle colonne? – mmcrae

+0

Sì. Supporto Repos findByXxx(), findByXxx (Pageable) ecc. Dove xxx è la colonna. –

2

Ho pubblicato una libreria java open source incentrata sull'impaginazione con la struttura di primavera qualche tempo fa.

Anche se non ha avuto molto successo forse qualcuno potrebbe essere interessato a provarlo.

ci sono esempi per utilizzarlo con

Gli esempi on-line sono un po 'obsolete, meglio scaricare il file jdal-campioni da sourceforge.

Problemi correlati