Sustituir DisplayTag por JMESA

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" %>

10 Respuestas to “Sustituir DisplayTag por JMESA”


  1. 1 LoiX septiembre 1, 2008 a las 08:39

    Excelente artículo, sobre todo para los que nos iniciamos en el uso de jmesa.

    Un saludo!

  2. 2 LoiX septiembre 2, 2008 a las 14:20

    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!!

  3. 3 fmiranda octubre 21, 2008 a las 01:14

    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.

  4. 4 Saulo noviembre 13, 2008 a las 14:43

    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.

  5. 5 LeChuckNorris noviembre 15, 2008 a las 10:32

    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 😦

  6. 6 Veronica Carrasco noviembre 24, 2008 a las 18:11

    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.

  7. 7 Veronica Carrasco noviembre 24, 2008 a las 18:19

    (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

  8. 8 LeChuckNorris noviembre 24, 2008 a las 23:06

    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.

  9. 9 Freddy abril 18, 2009 a las 00:26

    Estoy usando JMesa pero me aparece el siguiente error:

    jQuery.jmesa is undefined

    … en el navegador.

    Por favor, podrías ayudarme.

  10. 10 Mariella May 16, 2009 a las 10:08

    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:


Deja un comentario




Add to Technorati Favorites
Clicky Web Analytics Clicky

Flickr Photos