Display tag library 1.

1

A/C Jose Costa jose.costa@moove-it.com Ing. Martín Cabrera martin.cabrera@moove-it.com moove-iT

Motivación
Los custom tags simplifican el desarrollo y el mantenimiento de las JSP. Permiten entre otras funcionalidades:
realizar operaciones sobre objetos procesar formularios acceder bases de datos y otros servicios empresariales como e-mail y directorios realizar control de flujo

paginar.1 En la actualidad solo permite desplegar tablas Dada una lista de objetos permite crear una tabla donde se podrá ordenar por columnas. exportar en distintos formatos. decorar y otras funcionalidades.Display tag Proyecto open source de custom tags Se encuentra en la versión 1. .

Uso básico Sin especificar columnas: <% request. %> <display:table name="test"> <display:column property="id" title="ID" /> <display:column property="name" /> <display:column property="email" /> <display:column property="status" /> <display:column property="description" title="Comments"/> </display:table> . new TestList(10. false) ). false) ).setAttribute( "test". new TestList(10. %> <display:table name="test" /> Especificando columnas: <% request.setAttribute( "test".

getAttribute("testit")).getAttribute("testit_rowNum")%> </display:column> <display:column title=“Money”> <%=((ListObject)pageContext.getMoney()%> </display:column> </display:table> .Objetos implícitos <display:table name="test" id="testit"> <display:column property="id" title="ID" /> <display:column property="name" /> <display:column title="static value">static</display:column> <display:column title=“Row"> <%=pageContext.

setAttribute( "test". new TestList( 10 ) ). %> <display:table name="test"> Se puede definir el alcance del bean agregando alguno de los siguientes sufijos: pageScope requestScope (default) sessionScope applicationScope .Fuentes de datos Hasta ahora: <% request.

getAttribute(“list”).getAttribute(“name”).list.property” Las propiedades mapeadas se acceden especificando la clave entre () y las propiedades indexadas utilizando [] sessionScope.item[1] Es equivalente a: session.getItem(1) .Fuentes de datos También es posible acceder a las propiedades de un JavaBean con la sintaxis “.attribute(name).value.getValue().

Tipos de datos soportados El custom tag <display:table> soporta los siguentes tipos de objetos: Collection Enumeration Map Dictionary Array Iterator cualquier Object con el método iterator() El resto de los objetos se despliegan en una sola fila. .

números. etc.Decorators Un "decorator" es un patrón de diseño donde un objeto provee una capa de funcionalidad encapsulando o “decorando” otro objeto Utilizado comúnmente para controlar la forma en que se despliegan propiedades que no retornan un String nativo (fechas.) No es una buena práctica colocar la lógica del formateo dentro del propio objeto . monedas..

sample.displaytag. Las propiedades son llamadas sobre el decorator y si no se encuentran allí entonces se llaman directamente sobre el objeto original. Antes de procesar una fila en particular. le da el objeto de esa fila al decorator.Wrapper" > <display:column property="id" title="ID" /> <display:column property="email" /> <display:column property="status" /> <display:column property="date" /> <display:column property="money" /> </display:table> Funcionamiento: Un único objeto decorator es creado antes de que el tag table comienze a iterar dentro de la lista. . Tips: La clase Wrapper tiene que ser subclase de TableDecorator getCurrentRowObject() retorna el objeto correspondiente a la fila que se está evaluando.Table Decorator <display:table name="test" decorator="org.

Column Decorator <display:table name="test"> <display:column property="id" title="ID" /> <display:column property="email" /> <display:column property="status" /> <display:column property="date"decorator= "org.displaytag.LongDateWrapper" /> </display:table> .sample.

Dynamic links Al “estilo struts” Utilizando decorators . y automáticamente se convertirá en un link en la página.Links Smart linking Si una columna tiene una dirección de e-mail o una URL a una web. se puede setear la propiedad autolink=“true” en el tag display:column.

tipicamente null .Links al “estilo struts” Las columnas cuentan con 5 atributos similares a los de struts: href la URL base para construir el link paramId el nombre del parámetro que se agrega a la URL paramName nombre del bean del cual se quiere obtener una propiedad para obtener el valor del parámetro a agregar (tipicamente null para indicar que el bean se obtiene de la lista) paramProperty propiedad a invocar sobre el bean para obtener el valor paramScope alcance específico donde se encuentra el bean.

En este caso podemos crear un String que contenga un link HTML. . tomando alguna propiedad de los elementos de la lista.Links utilizando decorators Los decorators también pueden ser utlizados para generar cualquier elemento HTML dentro de una columna.

class. cellpading) CSS Automáticamente se agregan clases css a las filas/celdas de la tabla Fácilmente puede customizarse el estilo cambiando la clase adecuada en la hoja de estilos asociada . cellspacing.Agregando estilos a las tablas Atributos HTML Dentro de los tags <display:table> y <display:column> puede utilizarse cualquier atributo estándar estricto de html (style.

Los formatos predefinidos son CSV. Excel. XML y PDF .Exportando datos Seteando el atributo export=“true” aparecerá un footer con la posibilidad de exportar la tabla en diversos formatos.

export.displaytag.export.Agregando otros formatos La nueva clase que se defina debe implementar alguna de las siguientes interfaces: org.displaytag.TextExportView org.BinaryExportView Incluir si no existe el archivo display.properties en el classpath y agregar el nombre del nuevo tipo con los tipos ya existentes (export.types =csv excel xml [miexport] ) .

[miexport].[miexport].label=Click aquí para probar este formato export view export.[miexport].name export.[miexport].Agregando otros formatos En el archivo display.filename= .class.qualified.properties deberá incluirse: export.include_header=true # si se setea el siguiente parametro el archivo es bajado en vez de abrirse en la ventana del navegador export.[miexport]=true export.class=fully.

Filtro para la exportación Cuando se exporta en cualquier formato no-html. entonces el buffer se llenó y automáticamente se hizo flush sobre el response Algo antes del diplay:table hizo flush explícitamente de el response La página se incluye dinámicamente dentro de otra (Struts tiles) Cuando se exportan datos binarios que no son soportados por las jsps (pdf) . se debe cambiar el content type retornado al browser No siempre es posible Ya se escribieron demasiados caracteres en el response.

Filtro para la exportación Podemos sacar provecho de los filtros para resolver el problema Displaytag viene con un filtro que en conjunto con el tag table durante la exportación. deshabilita la posibilidad de hacer flush sobre el response una vez que se requirió una exportación .

jsp</url-pattern> </filter-mapping> .Instalando el filtro En el web.xml <filter> <filter-name>ResponseOverrideFilter</filter-name> <filter-class> org.displaytag.ResponseOverrideFilter </filter-class> </filter> Agregar los mappings para las páginas que se van a interceptar <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>*.filter.

properties podemos modificar los textos Para soportar varios lenguajes al mismo tiempo pueden agregarse archivos llamados displaytag_LANGUAGE. Por ejemplo: displaytag_ES.Internacionalización Displaytag soporta i18n para los textos utilizados para los cabezales de columnas y secciones de exportación y paginado Utilizando el archivo displaytag.properties .I18n .properties para cada lenguaje.

Paginado y ordenamiento externo Por defecto displaytag trabaja con la lista completa de objetos y maneja de forma transparente el ordenamiento y el paginado A veces puede ser necesario encargarse del ordenamiento y el paginado uno mismo (lista parcial) .

Trabajar con listas parciales Utilizando el patrón Valuelist Requiere que el objeto que se pasa al displaytag implemente la interfaz org. y se extraerá la información de paginado y ordenamiento de el Sin implementar la interfaz PaginatedList .pagination.displaytag.PaginatedList El objeto puede pasarse como una lista común.

pagination.PaginatedList y no una colección Displaytag asume que la lista está ordenada y paginada externamente .displaytag.Patrón Valuelist Si el objeto pasado como una lista a displaytag es en realidad una instancia de org.

Sin implementar la interfaz PaginatedList Ordenamiento Externo <display:table name="testList" sort="external" defaultsort="1" id="element"> <display:column property="id" title="ID" sortable="true" sortName="id" /> <display:column property="firstName" sortable="true" sortName="firstName" title="First Name" /> <display:column property="lastName" sortable="true" sortName="lastName" title="Last Name" /> <display:column property="address" sortable="true" sortName="address" title="Email Address"/> </display:table> Ordenamiento Externo con Paginado <display:table name="testList" sort="external" defaultsort="1" pagesize="20" id="element" partialList="true" size="resultSize"> <display:column property="id" title="ID" sortable="true" sortName="id" /> <display:column property="firstName" sortable="true" sortName="firstName" title="First Name" /> <display:column property="lastName" sortable="true" sortName="lastName" title="Last Name" /> <display:column property="address" sortable="true" sortName="address" title="Email Address"/> </display:table> .

net/ .Referencias Display Tag Library Overview http://displaytag.sourceforge.

¿Preguntas? .

Sign up to vote on this title
UsefulNot useful