Certains d’entre vous se demandent encore comment réaliser une pagination correcte. Ce petit tutoriel va vous venir en aide. Dans celui-ci, il sera rapidement expliqué comment récupérer un nombre d’enregistrements limité dans une base de données, selon des critères bien précis. Le langage utilisé est Java avec un modèle JSP-servlets.
Paramètres
Lorsque vous souhaitez paginer une liste de membres sur votre site web par exemple, vous allez avoir besoin de deux paramètres importants : le numéro de la page que vous voulez afficher, et le nombre d’éléments que vous souhaitez sur celle-ci.
Dans l’exemple ci-dessous, nous allons récupérer des paramètres passés à la requête lors de l’appel de la servlet, soit le nombre d’éléments qu’on souhaite voir, et la page courante :
// Votre fonction de la servlet
int nombre_a_afficher = request.getParameter("n");
int page_a_afficher = request.getParameter("p");
Ensuite, il faut compter le nombre de pages selon le nombre d’enregistrements dans la base de données, de la manière qui suit.
// Votre fonction de la servlet
int NbrePages = dbFunctions.getPageCount(
nombre_a_afficher
);
L’objet « dbFunctions », dans ce cas-ci, fait référence à une classe utilitaire (nommée DBFunctions) qui contient un objet de type « Connection« , initialisé et ouvert, ainsi qu’une multitude de fonctions qui permettent d’accéder aux tables, de récupérer des utilisateurs, si on utilise par exemple une table qui contient des enregistrements de membres, et d’autres opérations que j’ai définies.
Dans notre cas, peu importe la table, vous devez juste retenir la manipulation suivante pour compter le nombre de pages. Notez l’utilisation de « Math.Ceil » pour arrondir au nombre supérieur le nombre obtenu :
// DBFunctions
public int getPageCount(int n)
{
ResultSet rsN = stmt.executeQuery(
"SELECT COUNT(id)" + " FROM user"
);
if (rsN.next())
{
int pgCount = (int)Math.ceil(
(double)rsN.getInt(1)/(double)n
);
rsN.close();
return pgCount;
}
// ...
}
Nombre d’enregistrements
Il faut récupérer le nombre d’enregistrements pour la page courante. Dans notre exemple, nous allons utiliser une liste d’utilisateurs. Encore une fois nous faisons appel à une fonction qui s’appelle très finement « getUsers() » et qui prend deux paramètres, qui ont été précédemment cités : le nombre d’éléments à afficher et le numéro de la page actuelle.
Rien de bien compliqué, voici le bout de code :
// Votre fonction de la servlet
LinkedList lst = dbFunctions.getUsers(
nombre_a_afficher, page_a_afficher
);
La fonction appelée va utiliser une requête qui utilise la clause LIMIT, notre base de données étant compatible avec celle-ci. A celle-ci, nous devons fournir deux paramètres : un offset, qui est en fait une sorte d’indice d’un tableau, donc qui indique où l’on doit commencer à récupérer les enregistrements, et le nombre d’éléments à récupérer (on commence à avoir l’habitude de ce paramètre !). L’offset doit être calculé selon la formule (page_a_afficher-1) * nombre_a_afficher.
// DBFunctions int public
LinkedList getUsers(int n, int p)
{
int offset = (p - 1) * n;
ResultSet rsU = stmt.executeQuery(
"SELECT...LIMIT " + offset + "," + n
);
while(rsU.next())
{
// Ajout dans la liste
}
// Autres opérations et retourner la liste créée.
}
Affichage
Vous voilà avec un nombre limité de lignes ! Il ne reste plus qu’à les afficher. Vous devez donc définir des paramètres supplémentaires à récupérer dans la JSP :
// Votre fonction de la servlet
request.setAttribute("n", nombre_a_afficher);
request.setAttribute("NbrePages", NbrePages);
request.setAttribute("list_users", lst);
Pour l’affichage, vous devrez donc utiliser (dans votre page JSP) :
- « n », pour le réutiliser lors de l’affichage de la page suivante par exemple.
- « NbrePages », pour créer une boucle et afficher le nombre de pages (sous forme de lien par exemple).
- « list_users », à parcourir pour extraire les informations et les formater.
Je ne vous donne pas plus d’indice, vous pouvez trouver comment ça marche comme des grands. Après tout, ce tutorial était principalement destiné à vous donner les points importants pour le calcul de l’offset notamment, ou pour le calcul du nombre de pages à afficher. Bien sûr, ces calculs sont valables pour n’importe quelle pagination dans n’importe quel langage : PHP, PL/SQL,…