En múltitud de páginas tenemos que implementar páginación para mostrar los resultados de una búsqueda, un listado de productos, etc. La forma que más me gusta a mí es hacerlo mediante AJAX para que la interacción con el usuario sea rápida, sin por ello perder el uso no AJAX, como recargar la página y mantener la página actual o compartir el enlace.
A continuación muestro un ejemplo de bloques con únicamente los botones de anterior y siguiente, junto con un mixin (opcional) para mostrar el progreso de la petición.
<t:layout xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd" xmlns:p="tapestry:parameter" > <h3>${message:page.description}</h3> <t:textoutput value="message:ajax.pagination.description" /> <h3>${message:page.demo}</h3> <t:zone t:id="paginationZone" id="paginationZone"> <t:loop source="items" value="item"> <div class="panel panel-default">${item}</div> </t:loop> <ul class="pager"> <t:if test="showPrev"> <li> <!-- I use the mixing LoadingOnClick, but it's optional --> <a rel="nofollow" href="#" t:id="prevPage" t:type="EventLink" t:event="changePage" t:context="prev" t:zone="^" t:mixins="LoadingOnClick" t:text="loading"><span>${message:ajax.pagination.prev}</span> </a> </li> </t:if> <t:if test="showNext"> <li> <!-- I use the mixing LoadingOnClick, but it's optional --> <a rel="nofollow" href="#" t:id="nextPage" t:type="EventLink" t:event="changePage" t:context="next" t:zone="^" t:mixins="LoadingOnClick" t:text="loading"><span>${message:ajax.pagination.next}</span> </a> </li> </t:if> </ul> </t:zone> <h3>${message:page.sourcecode}</h3> <t:tabGroup> <t:codeTab source="classpath:es/carlosmontero/webapp/t5devutil/pages/ajax/PaginationPage.tml"/> <t:codeTab source="classpath:es/carlosmontero/webapp/t5devutil/pages/ajax/PaginationPage.java" /> <t:codeTab classpathSource="/META-INF/modules/pagination.js" /> <t:codeTab source="classpath:es/carlosmontero/webapp/t5devutil/mixins/LoadingOnClick.java" /> <t:codeTab classpathSource="/META-INF/modules/load-on-click.js" /> </t:tabGroup> </t:layout>