Display tag library 1.
A/C Jose Costa [Link]@[Link] Ing. Martn Cabrera [Link]@[Link] moove-iT
Motivacin
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 versin 1.1 En la actualidad solo permite desplegar tablas Dada una lista de objetos permite crear una tabla donde se podr ordenar por columnas, paginar, exportar en distintos formatos, decorar y otras funcionalidades.
Uso bsico
Sin especificar columnas:
<% [Link]( "test", new TestList(10, false) ); %> <display:table name="test" />
Especificando columnas:
<% [Link]( "test", new TestList(10, false) ); %> <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>
Objetos implcitos
<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"> <%=[Link]("testit_rowNum")%> </display:column> <display:column title=Money> <%=((ListObject)[Link]("testit")).getMoney()%> </display:column> </display:table>
Fuentes de datos
Hasta ahora:
<% [Link]( "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
Tambin es posible acceder a las propiedades de un JavaBean con la sintaxis .property Las propiedades mapeadas se acceden especificando la clave entre () y las propiedades indexadas utilizando []
[Link](name).item[1]
Es equivalente a:
[Link](list).getValue().getAttribute(name).getItem(1)
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 mtodo iterator()
El resto de los objetos se despliegan en una sola fila.
Decorators
Un "decorator" es un patrn de diseo donde un objeto provee una capa de funcionalidad encapsulando o decorando otro objeto Utilizado comnmente para controlar la forma en que se despliegan propiedades que no retornan un String nativo (fechas, nmeros, monedas, etc..) No es una buena prctica colocar la lgica del formateo dentro del propio objeto
Table Decorator
<display:table name="test" decorator="[Link]" > <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. Antes de procesar una fila en particular, le da el objeto de esa fila al decorator. Las propiedades son llamadas sobre el decorator y si no se encuentran all entonces se llaman directamente sobre el objeto original.
Tips:
La clase Wrapper tiene que ser subclase de TableDecorator getCurrentRowObject() retorna el objeto correspondiente a la fila que se est evaluando.
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= "[Link]" /> </display:table>
Links
Smart linking
Si una columna tiene una direccin de e-mail o una URL a una web, se puede setear la propiedad autolink=true en el tag display:column, y automticamente se convertir en un link en la pgina.
Dynamic links
Al estilo struts Utilizando decorators
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 parmetro que se agrega a la URL
paramName
nombre del bean del cual se quiere obtener una propiedad para obtener el valor del parmetro 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 especfico donde se encuentra el bean, tipicamente null
Links utilizando decorators
Los decorators tambin pueden ser utlizados para generar cualquier elemento HTML dentro de una columna. En este caso podemos crear un String que contenga un link HTML, tomando alguna propiedad de los elementos de la lista.
Agregando estilos a las tablas
Atributos HTML
Dentro de los tags <display:table> y <display:column> puede utilizarse cualquier atributo estndar estricto de html (style, class, cellspacing, cellpading)
CSS
Automticamente se agregan clases css a las filas/celdas de la tabla Fcilmente puede customizarse el estilo cambiando la clase adecuada en la hoja de estilos asociada
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, Excel, XML y PDF
Agregando otros formatos
La nueva clase que se defina debe implementar alguna de las siguientes interfaces:
[Link] [Link]
Incluir si no existe el archivo [Link] en el classpath y agregar el nombre del nuevo tipo con los tipos ya existentes ([Link] =csv excel xml [miexport] )
Agregando otros formatos
En el archivo [Link] deber incluirse: export.[miexport]=true export.[miexport].class=[Link] export.[miexport].label=Click aqu para probar este formato export view 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].filename=
Filtro para la exportacin
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, entonces el buffer se llen y automticamente se hizo flush sobre el response Algo antes del diplay:table hizo flush explcitamente de el response La pgina se incluye dinmicamente dentro de otra (Struts tiles) Cuando se exportan datos binarios que no son soportados por las jsps (pdf)
Filtro para la exportacin
Podemos sacar provecho de los filtros para resolver el problema Displaytag viene con un filtro que en conjunto con el tag table durante la exportacin, deshabilita la posibilidad de hacer flush sobre el response una vez que se requiri una exportacin
Instalando el filtro
En el [Link]
<filter> <filter-name>ResponseOverrideFilter</filter-name> <filter-class> [Link] </filter-class> </filter>
Agregar los mappings para las pginas 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>*.jsp</url-pattern> </filter-mapping>
I18n - Internacionalizacin
Displaytag soporta i18n para los textos utilizados para los cabezales de columnas y secciones de exportacin y paginado Utilizando el archivo [Link] podemos modificar los textos Para soportar varios lenguajes al mismo tiempo pueden agregarse archivos llamados displaytag_LANGUAGE.properties para cada lenguaje. Por ejemplo: displaytag_ES.properties
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 patrn Valuelist
Requiere que el objeto que se pasa al displaytag implemente la interfaz [Link] El objeto puede pasarse como una lista comn, y se extraer la informacin de paginado y ordenamiento de el
Sin implementar la interfaz PaginatedList
Patrn Valuelist
Si el objeto pasado como una lista a displaytag es en realidad una instancia de [Link] y no una coleccin Displaytag asume que la lista est ordenada y paginada externamente
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>
Referencias
Display Tag Library Overview
[Link]
Preguntas?