Patrón múltiples vistas de un mismo dato en Tapestry

Publicado por pico.dev el , actualizado el .
blog-stack java planeta-codigo programacion tapestry
Comentarios

Un proyecto grande contendrá muchos archivos de código fuente, poseer gran cantidad de archivos puede ser una molestia al trabajar con ellos al tener que buscarlos o abrilos. En el caso de las aplicaciones web puede darse el caso de que un mismo dato tenga un archivo diferente por cada forma de visualizarlo, para reducir el número de archivos en estos casos uso el siguiente patrón cuando trabajo con Apache Tapestry con el soporte que ofrece pero que puede ser igualmente aplicado de forma similar a otros frameworks.

Apache Tapestry

Al desarrollar una aplicación web puede que necesitemos mostrar un mismo dato de diferentes formas. Una posibilidad es crear una vista por cada forma diferente que se haya de mostrar el dato. Sin embargo, de esta forma tendremos que crear un archivo diferente por cada forma a visualizar, si esto mismo nos ocurre en múltiples datos nos encontraremos en la situación de que el número de archivos del proyecto crecerá suponiendo una pequeña molestia tener que trabajar con tantos, también y peor aún es que múltiples archivos relacionados no lo estarán salvo que les demos una nomenclatura similar para mantenerlos ordenados por nombre y sean fáciles de encontrar si queremos abrir varios.

Tener tantos archivos puede ser una molestia que denomino de microgestión, esto es, tener muchos archivos pequeñitos. Para evitar microgestionar podemos tener una única vista que con un parámetro determine la forma de representar el dato, mientras que el contenido del archivo tenga alta cohesión me parece adecuado e incluso mejor ya que las diferentes vistas muy posiblemente serán parecidas con lo que quizá dupliquemos algo de código que será mejor tenerlo en un mismo archivo que en varios diferentes.

En este artículo comentaré una forma de como realizar esto usando el framework Apache Tapestry con las posibilidad que ofrece que a mi me ha resultado muy práctica, algo similar podría usarse en otros frameworks.

En Tapestry en una vista se pueden tener múltiples componentes Block cuya misión es agrupar otros componentes que como resultado de procesarse producirán el html. Por otra parte está el componente Delegate que indicándole en el parámetro to un componente Block lo procesa emitiendo el contenido html que generen los componentes que contenga. Teniendo en el código Java asociado al componente que mostrará el dato de diferentes formas un método que con cierta lógica devuelva un componente Block a visualizar podemos conseguir el objetivo.

En la siguiente vista de un artículo usada en el agregador de bitácoras Blog Stack se ve que en el archivo tml de la vista hay varios componentes Block y un componente Delegate tal y como he comentado que se puede hacer. El componente bloque excerptBlock es muy similar al componente fullBlock diferenciándose en que el primero emite un extracto del contenido del artículo con ${contentExcerpt} […] y el segundo el artículo completo con <t:outputraw value=“content”/>.

En la clase Java asociada al componente está el método getBlock que determina el bloque a mostrar. En este caso la lógica es muy sencilla, en base a un parámetro que recibe el componente (mode) indicando la vista del dato que se quiere se devuelve el componente Block adecuado. Las referencias a los componentes Block presentes en la vista se puede inyectar usando la anotación @Inject junto con @Component usando el mismo identificativo en la vista y en el nombre de la propiedad para la referencia del componente.

Portada libro: PlugIn Tapestry

Libro PlugIn Tapestry

Si te interesa Apache Tapestry descarga gratis el libro de más de 300 páginas que he escrito sobre este framework en el formato que prefieras, PlugIn Tapestry: Desarrollo de aplicaciones y páginas web con Apache Tapestry, y el código de ejemplo asociado. En el libro comento detalladamente muchos aspectos que son necesarios en una aplicación web como persistencia, pruebas unitarias y de integración, inicio rápido, seguridad, formularios, internacionalización (i18n) y localización (l10n), AJAX, ... y como abordarlos usando Apache Tapestry.


Yo apoyo al software libre