Para comenzar, debe agregar uno o dos parámetros de solicitud adicionales al JSP: firstrow
y (opcionalmente) rowcount
. El rowcount
también se puede dejar y definir completamente en el lado del servidor.
A continuación, añadir un montón de botones de paginación a la JSP: el siguiente botón debe instruir al Servlet
para incrementar el valor de firstrow
con el valor de rowcount
. El botón anterior obviamente disminuirá el valor de firstrow
con el valor rowcount
. ¡No olvide manejar valores negativos y desbordamientos correctamente! Puede hacerlo con la ayuda de SELECT count(id)
.
A continuación, active una consulta SQL específica para recuperar una sublista de los resultados. Sin embargo, la sintaxis SQL exacta depende de la base de datos utilizada.En MySQL y PostgreSQL es fácil con LIMIT
y OFFSET
cláusulas:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " contact ORDER BY id LIMIT %d OFFSET %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, rowcount);
// Implement JDBC.
return contacts;
}
en Oracle necesita una sub consulta con rownum
cláusula que debe ser similar:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " (SELECT id, username, job, place FROM contact ORDER BY id)"
+ " WHERE ROWNUM BETWEEN %d AND %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
}
En DB2 se necesita la función OLAP row_number()
de esto:
private static final String SQL_SUBLIST = "SELECT id, username, job, place FROM"
+ " (SELECT row_number() OVER (ORDER BY id) AS row, id, username, job, place"
+ " FROM contact) AS temp WHERE row BETWEEN %d AND %d";
public List<Contact> list(int firstrow, int rowcount) {
String sql = String.format(SQL_SUBLIST, firstrow, firstrow + rowcount);
// Implement JDBC.
return contacts;
}
No hago MSSQL, pero es sintácticamente similar a DB2. También vea this topic.
Por último, simplemente presente la sublista en la página JSP de la forma habitual con JSTL c:forEach
.
<table>
<c:forEach items="${contacts}" var="contact">
<tr>
<td>${contact.username}</td>
<td>${contact.job}</td>
<td>${contact.place}</td>
</tr>
</c:forEach>
</table>
<form action="yourservlet" method="post">
<input type="hidden" name="firstrow" value="${firstrow}">
<input type="hidden" name="rowcount" value="${rowcount}">
<input type="submit" name="page" value="next">
<input type="submit" name="page" value="previous">
</form>
en cuenta que algunos pueden sugieren que es necesario SELECT
toda la tabla y guardar la List<Contact>
en el ámbito de la sesión y hacer uso de List#subList()
paginar. Pero esto es de memoria eficiente con miles filas y múltiples usuarios concurrentes.
Para aquellos que estén interesados en una respuesta similar en contexto JSF/MySQL usando el componente h:dataTable
, puede encontrar this article útil. También contiene algunas matemáticas agnósticas útiles para el lenguaje para lograr que la paginación "similar a Google" funcione bien.
Supongamos que las inserciones y las inserciones de la base de datos se han producido mientras el usuario mira una página. Los números de fila no serán estables con el tiempo, creo? El efecto podría ser darle al usuario algunos cambios inesperados en la posición. – djna
Esto no es una preocupación. No desea ver un elemento ya eliminado o perder datos editados. El único recurso para eso sería transportar toda la tabla de bases de datos a la memoria de Java y trabajar solo en eso, pero no quiere hacer eso. – BalusC
@BalusC - wow. Impresionante respuesta. Puedo hacer un buen uso de mí mismo. – ChadNC