Son muchos los proyectos que usan DisplayTag para la creación de tablas con paginación y exportación automática. Es un taglib muy últil que ahorra mucho tiempo y líneas de código a un programador. En mi opinión se ha quedado un poco deprecated. Afortunadamente existe una alternativa más moderna y potente llamada jMesa.
A continuación muestro los pasos a seguir para sustituir DisplayTag por Jmesa:
Descargo jMesa de la aquí.
Añado la tld que se encuentra bajo el directorio /jmesa-2.3.3/dist del zip al directorio /WEB-INF/tld de mi aplicación.
También añado los ficheros css, javascript, las imágenes y por supuesto los jar en sus directorios correspondientes. Como jMesa requiere de JQuery también lo añado al directorio al directorio js (la versión de producción la puedes obtener aquí). No importa donde se coloquen los css ni los javascript dado que se referencian posteriormente a mano. Las imágenes sin embargo tienen que estar en una ruta determinada que ha de coincidir con la del valor de la clave html.imagesPath especificada en el fichero jmesa.properties.
Este último fichero hay que crearlo y referenciarlo desde el web.xml así que, primero lo referencio:
<context-param> <param-name>jmesaPreferencesLocation</param-name> <param-value>WEB-INF/jmesa.properties</param-value> </context-param>
Y luego lo creo en el directorio WEB-INF de la aplicación. Tiene esta pinta:
html.table.component.theme=jmesa html.table.renderer.styleClass=table html.row.renderer.highlightClass=highlight html.row.renderer.evenClass=even html.row.renderer.oddClass=odd html.column.header.renderer.image.sortAsc=sortAsc.gif html.column.header.renderer.image.sortDesc=sortDesc.gif html.column.filter.renderer.image.droplistHandle=droplistHandle.gif html.tbodyClass=tbody html.titleClass=title html.filterClass=filter html.headerClass=header html.toolbarClass=toolbar html.statusBarClass=statusBar html.imagesPath=/images/table/ html.rowcount.includePagination=false html.toolbar.maxRowsDroplist.increments=15,50,100 html.toolbar.image.csv=csv.png html.toolbar.image.pdf=pdf.gif html.toolbar.image.excel=excel.gif html.toolbar.image.clear=clear.png html.toolbar.image.firstPage=firstPage.png html.toolbar.image.firstPageDisabled=firstPageDisabled.png html.toolbar.image.lastPage=lastPage.png html.toolbar.image.lastPageDisabled=lastPageDisabled.png html.toolbar.image.nextPage=nextPage.png html.toolbar.image.nextPageDisabled=nextPageDisabled.png html.toolbar.image.prevPage=prevPage.png html.toolbar.image.prevPageDisabled=prevPageDisabled.png html.toolbar.image.filter=filter.png html.toolbar.image.separator=separator.gif
Ya esta configurado. Se puede usar de muchas maneras todas muy bien documentadas en la página oficial. Como mi idea es sustituir el DisplayTag del modo más rápido e indoloro posible tan sólo he de sustituir el tag usado antes por uno similar donde lo que voy a iterar en cada fila es un item de lista de objetos. Es exactamente lo mismo que se hace con DisplayTag con lo que no he de cambiar para nada el controlador.
<jmesa:tableFacade id="tag" items="${listaObjetos}" var="bean" > <jmesa:htmlTable> <jmesa:htmlRow> <jmesa:htmlColumn property="nombre"/> <jmesa:htmlColumn property="descripcion" title="Descripción"/> </jmesa:htmlRow> </jmesa:htmlTable> </jmesa:tableFacade>
En el ejemplo cada objeto tiene un atributo nombre y un atributo descripción, se mostrará cada uno en una columna.
No hay que olvidar cambiar en namespace de displaytag por el de Jmesa:
<%@ taglib uri="/WEB-INF/tld/jmesa.tld" prefix="jmesa" %>
Excelente artículo, sobre todo para los que nos iniciamos en el uso de jmesa.
Un saludo!
Bueno, no consigo echarlo a andar,
Yo creo «listaObjetos» como un ArrayList, ya que hereda de Collections, no hay problema.
Pero me da error: «Could not initialize class org.jmesa.facade.tag.TagUtils».
Hago las importaciones, pongo el TLD en su sitio, el properties, modifico el web.xml,…
¿cómo te creas «listaObjetos»?, ¿de qué tipo?…
Un saludo!!
Hola, soy nuevo en este tema y estoy tratando de usar el Tag JMESA, ya he agregado todos los archivos necesarios, pero no encuentro como pasarle los datos al tag. Tengo una lista con los datos de una tabla de la BD, ¿comó le asigno esa lista al tag?.
Espero su colaboracion. Saludos.
Una consulta, yo estoy migrando del displaytag al Jmesa, tenes idea si tiene el mismo problema que el display tag cuando hace la paginacion y tenes checkbox tildados y los pierde, o esto esta solucionado en el Jmesa.
Al final debido a lo avanzado del proyecto no migramos la aplicación a JMesa con lo que tampoco tengo mucha experiencia con el componente. Calculo que siga teniendo el mismo problema dado que refrescará la página cada vez que se cambie de página. En modo ajax, cuya migración no creo que sea tan inmediato como la del ejemplo, quizás la cosa mejore. En modo normal, calculo que, para mantener el estado de los checks tendrás que enviar su valor en cada post, almacenarlo en el servidor y posteriormente recuperarlo.
Siento no poder ayudarte 😦
Por cierto olvidé mencionar que no utilizo ningún Framework ni nada de eso…
y como servidor web utilizo el Apache-Tomcat 6 y el JDK 6.
(Mi anterior consulta estuvo mal detallada )Consulta…
Estoy haciendo una prueba y no se porque me sale este error.
org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: org/jboss/lang/EnumImpl
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
metromovil.com.servlet.Prueba.doProcess(Prueba.java:96)
metromovil.com.servlet.Prueba.doGet(Prueba.java:46)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
En mi servlet tengo lo siguiente:
request.setAttribute(”votos”, votos); // votos es un vector
getServletContext().getRequestDispatcher(”/test.jsp”).forward(request, response);
en test.jsp
Asi que no se a que se deba ese error. Para mi debería funcionar bien…
Porfa que alguien me ayude :S
Parece un problema de dependencias. La clase que no encuentra esta en jbossretro-rt.jar. Copio y pego de la página principal de JMesa:
«In version 2.3.4 you will be able use the JBoss Retro project to run JMesa under JDK 1.4.»
Prueba a añadirla a ver que pasa.
Suerte.
Estoy usando JMesa pero me aparece el siguiente error:
jQuery.jmesa is undefined
… en el navegador.
Por favor, podrías ayudarme.
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
porfis a mi me sale ese error, los css y los js los debo importar
en el jsp tmb? algo asi como: