El problema de paginación es un problema muy común que encontrarán casi todos los desarrolladores. No discutiré cómo realizar la paginación específicamente aquí, pero explicaré el principio de paginación en modo web. La primera es consultar para obtener un conjunto de resultados (que se muestran como los resultados obtenidos al consultar la base de datos). Si hay muchos resultados, generalmente no mostraremos todos los datos a la vez, entonces usaremos la paginación para mostrar ciertos datos (como). como 20 artículos). Debido a la naturaleza sin estado de HTTP, cada envío se trata como una nueva solicitud. Incluso si se cambia la página, el último resultado no tiene impacto en el siguiente.
Aquí hay tres formas de implementar la paginación. ¡No sé si hay otras!
1. Obtenga todos los datos de los resultados de la consulta cada vez y luego muestre los registros especificados según el número de página.
2. Obtenga solo una página de datos según la página y luego muestre esta página. Aquí debe construir una declaración SQL.
3. Tomar un cierto número de páginas de datos es un compromiso entre los dos anteriores.
Lo que también se debe tener en cuenta aquí es si los datos se colocan en la solicitud o en la sesión, que se discutirán uno por uno aquí.
1. Generalmente no se colocará en la sesión porque ocupará mucha memoria, por lo que conviene colocarlo en la solicitud.
Ventajas: la implementación es relativamente simple y la velocidad de consulta es relativamente rápida.
Desventajas: Ocupa más memoria y transmite muchos datos a través de la red.
Este método es más adecuado para consultas con cantidades de datos relativamente pequeñas. Algunas personas aquí colocan los datos en la sesión para que no sea necesario volver a consultarlos al cambiar de página. Sin embargo, esto es extremadamente malo y se recomienda encarecidamente no usarlo de esta manera.
2. Definitivamente no se colocará en la sesión, porque no tiene sentido ponerlo en la sesión.
Ventajas: ocupa menos memoria.
Desventajas: es más problemático. Primero debe obtener el número total de resultados de la consulta, porque necesita saber cuántos registros hay para saber cuántas páginas hay. Además, es necesario construir una declaración de consulta de paginación, que es diferente para diferentes bases de datos.
3. Esta situación debe ubicarse en la sesión; de lo contrario, ¿por qué buscaría varias páginas? Esta implementación es para reducir la cantidad de consultas de la base de datos. Por ejemplo, si guardo los registros del 1 al 10, si cambio la página, entre 1. y 10 se pueden obtener directamente de la sesión. Si cambio a la página 11, puedo restablecer el caché a 11
20 páginas de datos (o de 5 a 15 páginas de datos); en este caso, solo se requiere una operación de consulta de base de datos para 10 cambios.
Ventajas: Ocupa relativamente poca memoria y mejora la velocidad promedio de consulta.
Desventajas: es más complejo de implementar, pueden existir datos sucios y usted mismo debe definir una colección de caché. Si la cantidad de datos consultados es relativamente grande, puede considerar utilizar este método.
El siguiente diseño solo obtiene una página de datos cada vez y el número total de consultas debe restablecerse cada vez. ¿Cómo implementarlo usted mismo? Esta es una implementación de paginación relativamente común.
Diseñe una interfaz aquí:
paquete treeroot.util;import java.util.List;/*** Esta interfaz se utiliza para implementar la función de paginación. Tenga en cuenta que aquí no se proporciona ninguna función de modificación. * @author treerot* @version 1.0* @since 2004-9-30*/public interface Pageable{ /** * Obtener resultados de datos* @return */ public List getResult() /** * Obtener el número total de consultas * @return */ public int getCount() /** * Obtener el número de registros por página* @return */ public int getPageSize() /** * Obtener el número de página actual* @return */ public; int getCurrentPage() /** * Obtener el número total de páginas* @return */ public int getPages() /** * El número predeterminado de registros mostrados en cada página*/ public final static int DEFAULT_PAGESIZE=20;} Esta interfaz es muy simple. Incluye una lista de resultados y cierta información necesaria para la paginación. Tenga en cuenta algunos puntos aquí:
1. La implementación de esta interfaz representa una determinada página de datos en una determinada consulta, que no tiene nada que ver con la última consulta.
2. La implementación de esta interfaz debe ser de solo lectura, lo que significa que no se puede modificar.
3. El método getPages() es redundante, pero este método todavía se proporciona aquí.
A continuación se proporciona una implementación abstracta:
paquete treeroot.util;import java.util.List;/*** @author treerot* @version 1.0* @since 2004-9-30*/public abstract class AbstractPage implementa Pageable{ private int currentPage; páginas; protected int count; resultado de la lista protegida /** * Especifique la página actual* @param currentPage * @throws PageException */ public AbstractPage(int currentPage){ this(currentPage,Pageable.DEFAULT_PAGESIZE); } /** * Especifique la página actual y el tamaño de la página* @param currentPage * @param pageSize * @throws PageException */ public AbstractPage(int currentPage,int pageSize) { this.currentPage=currentPage ; this.pageSize=pageSize; } protected void checkPage(int currentPage) lanza PageException{ if((currentPage<1)||(currentPage>this.getPages())) throw new PageException("Página fuera de rango: el número total de páginas es "+this.getPages()+", la página actual es " +currentPage); } /** * La subclase anula este método para la inicialización, es decir, para calcular el valor de recuento y el resultado, y se llama en el constructor de la subclase. */ abstract protected void init() lanza PageException; public List getResult() { devolver resultado } public int getCount() { devolver recuento } public int getPageSize() { devolver tamaño de página } public int getCurrentPage() { devolver página actual; } public int getPages() { if(pages==0) this.pages=(count+pageSize-1)/pageSize return; páginas; }}Esta clase abstracta implementa todos los métodos en la interfaz, pero define un método abstracto init(), que debe implementarse en subclases. La interfaz y la clase abstracta anteriores parecen relativamente simples. Es posible que sienta que no han hecho nada en términos de implementación, pero pueden aportar una gran ayuda al desarrollo. Podemos heredar esta clase abstracta según nuestras propias necesidades, y los datos se pueden obtener de varias maneras, como directamente a través de una Lista, o mediante JDBC, Hibernate, etc., pero todos necesitamos encapsular los resultados en una Lista. a través de Hibernate Parece particularmente conveniente.
PageException es una excepción personalizada
paquete treeroot.util /*** @author treeroot* @version 1.0* @since 2004-9-30*/public class PageException extiende Exception{ public PageException(){ super() } public PageException(Mensaje de cadena){ super( mensaje); }}