Implementação de Paginação com JavaWeb e MySQL

A fim de atender a uma necsesidade específica, desenvolvi uma clasce de paginação para JavaWeb com MySQL. Abaixo está o código ipmlementado, que pode não ser perfeito devido às limitações técnicas.

  1. Classe de entidade principal
package com.zx.paginacao;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * <b> Classe de paginação </b>
 * @author zhangxiang
 * 
 */
public class Paginador implements Serializable {
    private static final long serialVersionUID = 4542617637761955078L;

    /**
     * página atual
     */
    private int página_atual = 1;
    /**
     * registros por página
     */
    private int registros_por_página = 5;
    /**
     * total de páginas
     */
    private int total_de_páginas;
    /**
     * total de registros
     */
    private int total_de_registros = 0;
    /**
     * página anterior
     */
    private int página_anterior;
    /**
     * próxima página
     */
    private int próxima_página;
    /**
     * primeira página
     */
    private int primeira_página = 1;
    /**
     * última página
     */
    private int última_página;
    /**
     * número inicial da navegação
     */
    private int início_pagina;
    /**
     * número final da navegação
     */
    private int fim_pagina;
    /**
     * quantidade máxima de números exibidos
     */
    private int quantidade_números = 10;
    /**
     * lista de números a serem exibidos
     */
    public List<Integer> números_exibidos = new ArrayList<Integer>();
    
    // métodos de configuração
    /**
     * Define a página atual <br>
     * @param página_atual
     */
    public void set_página_atual(int página_atual) {
        this.página_atual = página_atual;
    }

    /**
     * Define a quantidade de registros por página <br>
     * @param registros_por_página
     */
    public void set_registros_por_página(int registros_por_página) {
        this.registros_por_página = registros_por_página;
    }

    /**
     * Define o total de registros <br>
     * @param total_de_registros
     */
    public void set_total_de_registros(int total_de_registros) {
        this.total_de_registros = total_de_registros;
        configurar_valores();
    }

    /**
     * Calcula parâmetros relacionados à paginação
     */
    public void configurar_valores() {
        // cálculo do total de páginas
        this.total_de_páginas = this.total_de_registros % this.registros_por_página > 0 ? 
            this.total_de_registros / this.registros_por_página + 1 : 
            this.total_de_registros / this.registros_por_página;
        // primeira página
        this.primeira_página = 1;
        // última página
        this.última_página = this.total_de_páginas;
        // página anterior
        if (this.página_atual > 1) {
            this.página_anterior = this.página_atual - 1;
        } else {
            this.página_anterior = this.primeira_página;
        }
        // próxima página
        if (this.página_atual < this.última_página) {
            this.próxima_página = this.página_atual + 1;
        } else {
            this.próxima_página = this.última_página;
        }
        
        // cálculo da faixa de números
        início_pagina = Math.max(this.página_atual - quantidade_números / 2, primeira_página);
        fim_pagina = Math.min(início_pagina + quantidade_números, última_página);
        
        // ajuste de faixa quando necessário
        if (fim_pagina - início_pagina < quantidade_números) {
            início_pagina = Math.max(fim_pagina - quantidade_números, 1);
        }
        
        // geração da lista de números
        for(int i = início_pagina; i <= fim_pagina; i++){
            números_exibidos.add(i);
        }
    }

    // métodos de acesso
    public int get_página_atual() {
        return página_atual;
    }

    public int get_registros_por_página() {
        return registros_por_página;
    }

    public int get_total_de_páginas() {
        return total_de_páginas;
    }

    public int get_total_de_registros() {
        return total_de_registros;
    }

    public int get_página_anterior() {
        return página_anterior;
    }

    public int get_próxima_página() {
        return próxima_página;
    }

    public int get_primeira_página() {
        return primeira_página;
    }

    public int get_última_página() {
        return última_página;
    }

    public int get_início_pagina() {
        return início_pagina;
    }

    public int get_fim_pagina() {
        return fim_pagina;
    }

    public int get_quantidade_números() {
        return quantidade_números;
    }

    public List<Integer> get_números_exibidos() {
        return números_exibidos;
    }

    @Override
    public String toString() {
        return "Paginador [página_atual=" + página_atual + ", registros_por_página=" + registros_por_página
                + ", total_de_páginas=" + total_de_páginas + ", total_de_registros=" + total_de_registros
                + ", página_anterior=" + página_anterior + ", próxima_página=" + próxima_página
                + ", primeira_página=" + primeira_página + ", última_página=" + última_página
                + ", início_pagina=" + início_pagina + ", fim_pagina=" + fim_pagina + "]"; 
    }
}

  1. Código de interação com banco de dados usando Spring JDBC. Este é um trecho representativo:
@Override
public List<User> buscarLista(Paginador paginador) {
    String sql = "select * from usuário limit ?, ?";
    this.getJdbcTemplate().query(sql, new Object[] {
        (paginador.get_página_atual() * paginador.get_registros_por_página() - 
         paginador.get_registros_por_página()), 
        paginador.get_registros_por_página()
    });
    return null;
}

  1. Código JSP para navegação de páginas:
<div class="member-pages clearfix">
    <div class="fr pc-search-g" >
        <c:if test="${paginador.página_atual >1 }">
            <a href="enderecoView?página=${paginador.página_anterior }" class="pc-search-n" >Página Anterior</a>
        </c:if>
        <c:forEach  items="${paginador.números_exibidos}" var="pagina">
            <a href="enderecoView?página=${pagina }" <c:if test="${paginador.página_atual ==  pagina}">class="ativo"</c:if>>${pagina }</a>
        </c:forEach>
        <c:if test="${paginador.página_atual < paginador.total_de_páginas }">
            <span class="pc-search-di">…</span>
            <a href="enderecoView?página=${paginador.próxima_página }" class="pc-search-n" >Próxima Página</a>
        </c:if>
        <form action="enderecoView" id="subform" method="post" style="display:inline;">
            <span class="pc-search-y">
                <em> Total de ${paginador.total_de_páginas } páginas   Ir para a </em>
                <input type="text" name="página" placeholder="${paginador.página_atual }" class="pc-search-j">
                <em>página</em>
                <a class="confirmar" href="javascript:;" onclick="document.getElementById('subform').submit();return false">Confirmar</a>
            </span>
        </form>
    </div>
</div>

Exemplo de visualização:

Imagem 1

Imagem 2

Tags: pagination JavaWeb MySQL Spring JDBC jsp

Publicado em 9-6 05:08