Muchas veces lo que se necesita es implementar la paginación en Java. Tengo una forma genérica en implementar cualquier tipo de paginación en cualquier sitio. Sin cargar mucho la base de datos, ni utilizar mucha memoria una vez que se devuelven los datos. Supongamos que tenemos una tabla con muchos registros (100 000, por ejemplo) y queremos mostrarle a los usuarios 1 000 páginas con 100 registros por página.
Pongo un ejemplo genérico para un Servlet, pero en los demás casos la situación sería parecida.
private static final int REGISTROS_POR_PAGINA = 100;
private SqlMapClient SQL;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // para simplificar todo va dentro de bloque try..catch // calculo la cantidad de contactos en todas las páginas try { // calculo el total de las entradas que tenemos int total = (Integer)SQL.queryForObject(“”);
// calculo la cantidad de páginas total que vamos a mostrar al usuario int mod = total % REGISTROS_POR_PAGINA; int diff = total - mod; int totalPaginas = diff / REGISTROS_POR_PAGINA; if(mod != 0) // si la división no es exacta habrá una página más totalPaginas++;
// obtengo la página actual en la que estamos String sPage = request.getParameter(“p”); int page = 0; // si no está presente el parámetro asumo que estamos en la página cero (la primera) if(sPage != null) { page = Integer.parseInt(sPage); page–; }
// calculo el límite y el offset que pasaremos a la BBDD en la consulta int offset = page * REGISTROS_POR_PAGINA; int limit = REGISTROS_POR_PAGINA;
// la página actual ”de cara al usuario” int paginaActual = page + 1; // el usuario empieza a contar de 1, no de 0 int paginaAnterior = page; // aquí se debería de controlar el valor de 0 int paginaSiguiente = page + 2; // la misma razón
// en la lista objects estará lo que queremos List objects = SQL.queryForList(“queryConElLimitYElOffsetPuestos”);
}catch(Exception e){} } } |