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

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

false) ). false) ). new TestList(10.setAttribute( "test". new TestList(10. %> <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> . %> <display:table name="test" /> Especificando columnas: <% request.setAttribute( "test".Uso básico Sin especificar columnas: <% request.

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.getAttribute("testit_rowNum")%> </display:column> <display:column title=“Money”> <%=((ListObject)pageContext.getAttribute("testit")).

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

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

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

. monedas. 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. números.) No es una buena práctica colocar la lógica del formateo dentro del propio objeto .

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. le da el objeto de esa fila al decorator.displaytag. Tips: La clase Wrapper tiene que ser subclase de TableDecorator getCurrentRowObject() retorna el objeto correspondiente a la fila que se está evaluando.sample.Table Decorator <display:table name="test" decorator="org. 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.

displaytag.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.sample.LongDateWrapper" /> </display:table> .

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

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.

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 .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. cellspacing. class.

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

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

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

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) .Filtro para la exportación Cuando se exporta en cualquier formato no-html. 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> .xml <filter> <filter-name>ResponseOverrideFilter</filter-name> <filter-class> org.filter.Instalando el filtro En el web.do</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>*.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>*.

properties podemos modificar los textos Para soportar varios lenguajes al mismo tiempo pueden agregarse archivos llamados displaytag_LANGUAGE. Por ejemplo: displaytag_ES.properties .properties para cada lenguaje.I18n .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.

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) .

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

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

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