Páginacion con Struts

Vamos a ver! Tengo un formulario de búsqueda de operaciones, se pulsa aceptar, se ejecuta una action donde se accede a la base de datos, se guardan las operaciones en una lista en sesión, y se redirecciona a una jsp donde se deben mostrar. Hasta ahí bien.
Ahora quiero paginar, y mostrar por ejemplo 10 operaciones por página y utilizar enlaces anterior y siguiente y tal. Esos enlaces deben cargar de nuevo la misma página pasando por una action que no hace nada (lo tengo así porque por un lado toda llamada a página jsp pasa por el controlador, y por otro lado porque ahí verifico que los datos del usuario logueado siguen en sesión. En caso contrario determinaría que la sesión expiró y le mando al login), y mostrar las 10 operaciones adecuadas. He leído información pero no me aclaro. Por un lado sé que el logic:iterate tiene los atributos length y offset. El length es estático (10 por ejemplo) y el offset debe ser dinámico y no sé cómo darle valor. Por otro lado tengo las tags ya descargadas del pager-taglig-2.0, pero tampoco entiendo demasiado bien como funciona.
A ver si soy capaz de hacerte preguntas concretas. El que use pager-taglib para la paginación significa que debo olvidarme de los atributos de logic:¿Iterate?, ¿O también debo usar estos? Sobre el pager-taglib, en sentencias que he visto como estas...
<pg:first>
<a href="<%= pageUrl %>">[ (<%= pageNumber %>) |< Previous ]</a>
</pg:first>
<pg:prev>
<a href="<%= pageUrl %>">[ (<%= pageNumber %>) << Previous ]</a>
</pg:prev>
¿De dónde sale pageUrl y pageNumber? Por qué (¿al menos aparentemente) pageNumber tiene el mismo valor si debería cargar bloques de 10 operaciones distintas? Básicamente me cuesta conseguir asociar el bloque de operaciones que yo quiero mostrar con los valores adecuados que debo dar a no sé qué variables.

1 Respuesta

Respuesta
1
Sinceramente, me he perdido, no se si he entendido tu problema.
Para hacer una paginación normalmente siempre vas a la misma url:
BuscaElementos. Do
A esta url se le suele pasar, al menos, un dato, la página actual que quieres ver:
buscaElementos.do?pag=1
Esta acción pone en la request el listado de elementos para la página actual y en el jsp te la compones para construir el listado mostrando siguiente, anterior.
Mi forma de trabajar siempre es que en lugar de devolver un objeto lista devuelvo uno que contiene más información: el numero de páginas y elementos en total, la página actual...
De forma que puedo hacer algo como (el código es una simplificación)
<table>
for (... lista...) {
<tr>
<td><%=datoDeLaLista%></td>
</tr>
}
</table>
if(pagActual>1) {
<a href="url?pag=<%=pagActual-1%>">anterior</a>
}
if (pagActual<maxNumeroDePaginas) {
    <a href="url?pag=<%=pagActual+1%>">siguiente</a>
}
Donde url siempre es la misma url (la actual).
Podemos tener variaciones de lo mismo, con más o menos lógica (obviamente, en el momento en que ponemos ordenación en la tabla y búsquedas el jsp se complica) pero la base es esa.
Prueba primero a hacer la base simple que te comento, y luego investiga como funciona el tag que usas.
Hola! He hecho avances, y ahora tengo un problema muy concreto.
La página jsp que debe mostrar las operaciones paginadas tiene esto al comienzo
<%
session = request.getSession(false);
if (session == null)
     throw new RuntimeException("La sesión ha expirado");
List paginacion = (List) session.getAttribute("listaPaginacion");
int operacsXPag = ((Integer) paginacion.get(0)).intValue();
int operacsTot = ((Integer) paginacion.get(1)).intValue();
int pagsTot = ((Integer) paginacion.get(2)).intValue();
%>
<pg:pager url="visualizarOperaciones" items="<%= operacsTot %>" maxPageItems="<%= operacsXPag %>"
maxIndexPages="<%= pagsTot %>" export="pageOffset, pagerPageNumber=pageNumber">
<pg:item>
<% System.out.println("Item " + pagerPageNumber); %>
                            ..............................
</pg:item>
                           ...
Como ves, primero obtengo unos valores útiles de la sesión (cosa que hice en la action), y el primer listado de operaciones (del 1 al 10) sale bien, pero cuando doy al enlace de 'siguiente', el listado me sale vacío. La línea a imprimir en la salida estándar la tengo puesta de prueba, y cuando el listado sale vacío dicha línea no se ejecuta (anteriormente sí). No se entra en pg:item. ¿Por qué? Eso es lo que quiero saber yo, y que te pregunto :)
Dos ideas te doy yo, que no quiere decir que tenga que ver!, pero bueno
La primera. En la documentación de pg:item dice que "If the item is out of range for
the current page it is not displayed". No sé qué quiere decir con item fuera de rango, así
Que no sé si puede ser eso.
La segunda. Como ves en el código, el atributo url de pg:pager tiene el valor "visualizarOperaciones". En struts-config.xml tengo esto
<action path="/buscarOperaciones" type="proyecto.action.BusquedaOperacionesAction" name="busquedaOperacionesForm" scope="request" input="/jsp/visualizacionoperaciones/busquedaOperaciones.jsp" validate="true" cancellable="true">
<forward name="success" path="/jsp/visualizacionoperaciones/historicoOperaciones.jsp"/></action>
<action path="/visualizarOperaciones" type="proyecto.action.VistaSinPreparacionAction">
<forward name="success" path="/jsp/visualizacionoperaciones/historicoOperaciones.jsp"/>
</action>
Me explico. La primera parte corresponde a la action que maneja el formulario para el criterio de búsqueda de operaciones. Si se pulsa aceptar se muestran las operaciones del 1 al 10, que eso sale bien. Cuando se pulse 'siguiente' o 'anterior' se llama a la segunda parte, "visualizarOperaciones", que pasa por una action que no hace nada y muestra la misma página jsp, pero ahora el listado no se ve.
¿Cómo lo ves? :)
Gracias
Vaya! He estado un poco liado. A ver si lo miro y ya te diré, porque en principio me parece algún tipo de fallito relacionado con el tag que uso pero parece que no lo conoces
Saludos

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas