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.
- 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 + "]";
}
}
- 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;
}
- 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