Das Paging-Problem ist ein sehr häufiges Problem, auf das fast alle Entwickler stoßen. Ich werde hier nicht speziell auf die Vorgehensweise beim Paging eingehen, sondern das Prinzip des Pagings im Webmodus erläutern. Die erste besteht darin, eine Abfrage durchzuführen, um einen Ergebnissatz zu erhalten (dargestellt als Ergebnisse aus der Abfrage der Datenbank). Wenn es viele Ergebnisse gibt, zeigen wir im Allgemeinen nicht alle Daten auf einmal an, sondern verwenden Paging, um bestimmte Daten anzuzeigen (z. B als 20 Stück). Aufgrund der zustandslosen Natur von HTTP wird jede Übermittlung als neue Anfrage behandelt. Selbst wenn die Seite geändert wird, hat das letzte Ergebnis keinen Einfluss auf die nächste.
Hier sind drei Möglichkeiten, Paging zu implementieren. Ich weiß nicht, ob es noch andere gibt!
1. Rufen Sie jedes Mal alle Daten der Abfrageergebnisse ab und zeigen Sie dann die angegebenen Datensätze entsprechend der Seitenzahl an.
2. Rufen Sie nur eine Seite mit Daten ab und zeigen Sie diese Seite dann an. Hier müssen Sie eine SQL-Anweisung erstellen.
3. Die Aufnahme einer bestimmten Anzahl von Datenseiten ist ein Kompromiss zwischen den beiden vorherigen.
Hierbei ist auch zu beachten, ob die Daten in der Anfrage oder in der Sitzung platziert werden, worauf hier einzeln eingegangen wird.
1. Im Allgemeinen wird es nicht in die Sitzung eingefügt, da es viel Speicher belegt. Daher sollte es in die Anforderung eingefügt werden.
Vorteile: Die Implementierung ist relativ einfach und die Abfragegeschwindigkeit ist relativ hoch.
Nachteile: Es benötigt mehr Speicher und überträgt viele Daten über das Netzwerk.
Diese Methode eignet sich besser für Abfragen mit relativ kleinen Datenmengen. Einige Leute legen hier die Daten in die Sitzung, sodass beim Seitenwechsel keine erneute Abfrage erforderlich ist. Dies ist jedoch äußerst schlecht und wird dringend davon abgeraten.
2. Es wird definitiv nicht in die Sitzung eingefügt, da es keinen Sinn macht, es in die Sitzung einzufügen.
Vorteile: Benötigt weniger Speicher.
Nachteile: Es ist schwieriger, zuerst die Gesamtzahl der Abfrageergebnisse zu ermitteln, da Sie wissen müssen, wie viele Datensätze vorhanden sind, um zu wissen, wie viele Seiten vorhanden sind. Darüber hinaus ist es erforderlich, eine Paging-Abfrageanweisung zu erstellen, die für verschiedene Datenbanken unterschiedlich ist.
3. Diese Situation muss in der Sitzung platziert werden. Warum sollte ich sonst mehrere Seiten abrufen, um die Anzahl der Datenbankabfragen zu reduzieren? Wenn ich beispielsweise die Datensätze 1 bis 10 speichere, dann zwischen 1 und 10 können direkt aus der Sitzung bezogen werden. Wenn ich auf Seite 11 wechsle, kann ich den Cache auf 11 zurücksetzen
20 Datenseiten (oder 5 bis 15 Datenseiten). In diesem Fall ist für 10 Änderungen nur ein Datenbankabfragevorgang erforderlich.
Vorteile: Es beansprucht relativ wenig Speicher und verbessert die durchschnittliche Abfragegeschwindigkeit.
Nachteile: Die Implementierung ist komplexer, es können schmutzige Daten vorhanden sein und Sie müssen selbst eine Cache-Sammlung definieren. Wenn die abgefragte Datenmenge relativ groß ist, können Sie die Verwendung dieser Methode in Betracht ziehen.
Das folgende Design ruft jedes Mal nur eine Seite mit Daten ab und die Gesamtzahl der Abfragen muss jedes Mal zurückgesetzt werden. Wie implementiert man es selbst? Dies ist eine relativ häufige Paging-Implementierung.
Entwerfen Sie hier eine Schnittstelle:
package treeroot.util;import java.util.List;/*** Diese Schnittstelle wird zum Implementieren der Paging-Funktion verwendet. Beachten Sie, dass hier keine Änderungsfunktion bereitgestellt wird. * @author treerot* @version 1.0* @since 2004-9-30*/public interface Pageable{ /** * Datenergebnisse abrufen* @return */ public List getResult(); /** * Gesamtzahl der Abfragen abrufen * @return */ public int getCount(); /** * Anzahl der Datensätze pro Seite abrufen* @return */ public int getPageSize(); /** * Aktuelle Seitenzahl abrufen* @return */ public int getCurrentPage(); /** * Gesamtzahl der Seiten abrufen* @return */ public int getPages(); /** * Die Standardanzahl der auf jeder Seite angezeigten Datensätze*/ public final static int DEFAULT_PAGESIZE=20;} Diese Schnittstelle ist sehr einfach. Sie enthält eine Ergebnisliste und einige notwendige Informationen zum Blättern. Beachten Sie hier einige Punkte:
1. Die Implementierung dieser Schnittstelle stellt eine bestimmte Datenseite in einer bestimmten Abfrage dar, die nichts mit der letzten Abfrage zu tun hat.
2. Die Implementierung dieser Schnittstelle sollte schreibgeschützt sein, was bedeutet, dass sie nicht geändert werden kann.
3. Die Methode getPages() ist überflüssig, wird hier aber weiterhin bereitgestellt.
Eine abstrakte Implementierung ist unten angegeben:
package treeroot.util;import java.util.List;/*** @author treerot* @version 1.0* @since 2004-9-30*/public abstract class AbstractPage implementiert Pageable{ private int currentPage; private int pageSize; Pages; protected int count; protected List result; /** * Geben Sie die aktuelle Seite an* @param currentPage * @throws PageException */ public AbstractPage(int currentPage){ this(currentPage,Pageable.DEFAULT_PAGESIZE); } /** * Geben Sie die aktuelle Seite und Seitengröße an* @param currentPage * @param pageSize * @throws PageException */ public AbstractPage(int currentPage,int pageSize) { this.currentPage=currentPage ; this.pageSize=pageSize; } protected void checkPage(int currentPage) löst eine PageException aus if((currentPage<1)||(currentPage>this.getPages())) throw new PageException("Seite außerhalb des gültigen Bereichs: Die Gesamtzahl der Seiten ist "+this.getPages()+", die aktuelle Seite ist " +currentPage); } /** * Diese Methode wird von der Unterklasse zur Initialisierung, also zur Berechnung des Zählwerts und des Ergebnisses, überschrieben und im Konstruktor der Unterklasse aufgerufen. */ abstract protected void init() throws PageException; public List getResult() { return count } public int getPageSize() { return currentPage; } public int getPages() { if(pages==0) this.pages=(count+pageSize-1)/pageSize return; Seiten; }}Diese abstrakte Klasse implementiert alle Methoden in der Schnittstelle, definiert jedoch eine abstrakte Methode init(), die in Unterklassen implementiert werden muss. Die obige Schnittstelle und die abstrakte Klasse sehen relativ einfach aus. Sie haben vielleicht das Gefühl, dass sie nichts in Bezug auf die Implementierung getan haben, aber sie können große Hilfe bei der Entwicklung leisten. Wir können diese abstrakte Klasse entsprechend unseren eigenen Anforderungen erben, und die Daten können auf verschiedene Weise abgerufen werden, z. B. direkt über eine Liste oder über JDBC, Hibernate usw., aber wir alle müssen die Ergebnisse in einer Liste kapseln. durch Ruhezustand Es scheint besonders praktisch zu sein.
PageException ist eine benutzerdefinierte Ausnahme
package treeroot.util /*** @author treeroot* @version 1.0* @since 2004-9-30*/public class PageException erweitert Exception{ public PageException(){ super( } public PageException(String message){ super( Nachricht); }}