2010-02-11 5 views

Antwort

87

Werfen Sie einen Blick auf und andere Klassen von org.springframework.beans.support.

Siehe den JPet-Speicher in den Beispielen für einige Beispiele, z. 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) Heiss verdammt, ich hatte keine Ahnung, dass es da war. Ich muss diese Funktionalität mindestens 3 mal implementiert haben, und da war es schon ... – skaffman

+1

cool, Übrigens, können Sie bitte erklären, wie Sitzung im Beispiel von SearchProductsController Code benötigt wird? Ich habe den Code durchgesehen, um ihn nicht nutzen zu können. – Nachiket

+2

@Nachiket Sobald das Objekt 'PagedListHolder' erstellt wurde, wird es in die Sitzung eingefügt. Die Paginierung wird tatsächlich auf einem im Speicherobjekt ausgeführt. Beantwortet das deine Frage? Wenn nicht, können Sie klären? –

11

Ich suchte nach einer Möglichkeit, das zu tun, fand aber keine Standardkomponente oder Taglib. Ich denke hauptsächlich deshalb, weil das Paging sehr spezifisch werden kann, da Sie Ihre Daten bereits mit Paging aus der Datenbank abrufen müssen (wenn Sie Hibernate verwenden, können Sie dies problemlos mit der Criteria-API tun). Ich kam mit so etwas wie dies oben:

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

Wenn Sie jetzt eine Anfrage an http://domain/app/test.html?id=10&page=1&results=30&sortOrder=asc ausführen werden Sie den Pager-Objekt in Ihrer Anfrage erhalten.

+0

Ich benutze nicht Winterschlaf, aber es ist cool .. gut ..:) – Nachiket

+0

Beste Antwort bis jetzt! Saubere Möglichkeit, Paginierungsparameter zu binden, funktioniert auch ohne Ruhezustand! – digz6666

+0

Anstelle von 'Pager' könnte man' Pageable' standardmäßig von Spring verwenden – EliuX

4

Keiner kommt in den Sinn und Google offenbart auch keine spezifischen Komponenten dafür (obwohl es ziemlich konkrete Beispiele und Hinweise gibt). Aber theoretisch sind nur ein paar Knöpfe und ein (oder zwei) Anfrageparameter mehr als ausreichend. Dann lass die SQL/DB ihre Arbeit machen. Ich habe eine Antwort auf ähnliche Frage in JSP/Servlet/DAO Kontext vor here geschrieben.

siedet im Allgemeinen nach unten firstrow passiert (Index der ersten Reihe in einer Seite angezeigt werden), um als Anforderungsparameter ist und zwei Tasten/Links in der Paginierung Form, die in/dekrementiert die firstrow mit rowcount (Menge der Zeilen angezeigt sofort in einer Seite) in Kombination mit einer SQL-Abfrage, die eine Teilmenge der Ergebnisse mit Hilfe von unter LIMIT, OFFSET Klauseln, Subselects, oder bestimmte Funktionen, abhängig von der betreffenden DB zurückgibt. Detaillierte Beispiele für Code und SQL-Abfragen finden Sie in der oben angegebenen Antwort.

4

Haben Sie jemals von dem Spring Data JPA-Projekt gehört? Es gibt eine schöne flexible Lösung mit der Pagable-Schnittstelle. Ich habe festgestellt, dass dies der einfachste Weg ist, um eine saubere, vorlagenfreie Paginierung zu erreichen. Check out mehr unter Spring Data JPA homepage.

+0

Ich schaute in diesen Link und fand nichts herausspringen zu diesem Zweck – mmcrae

3

Here's a link to the Spring Data JPA reference docs, wo sie eine sehr saubere Herangehensweise an Web-Paginierung haben.

+0

Ehrfürchtig, danke. Gibt es Unterstützung für die Suche nach Spalten? – mmcrae

+0

Ja. Repos unterstützen findByXxx(), findByXxx (Pageable) usw., wobei xxx die Spalte ist. –

2

Ich habe vor einiger Zeit eine Open-Source-Java-Bibliothek veröffentlicht, die sich auf Paginierung mit Federrahmen konzentriert.

Obwohl es nicht sehr erfolgreich gewesen ist, könnte vielleicht jemand daran interessiert sein, es zu versuchen.

Es gibt Beispiele dafür mit

Die Online-Beispiele etwas veraltet verwenden, laden Sie besser die jdal-Proben-Datei von sourceforge.

Verwandte Themen