Introducción a Apache Tapestry

Con el enorme número de frameworks que existen para desarrollar aplicaciones web en Java elegir el framework adecuado para un desarrollo o para varios desarrollos como estándar se puede convertir en una tarea que puede abrumar por la cantidad y diferentes características de cada uno de ellos. Personalmente, he tenido la oportunidad de desarrollar varias aplicaciones mediante el framework Apache Tapestry y mi experiencia personal ha sido *mucho más* satisfactoria comparada con otros conocidos frameworks o tecnologías como JSP/Struts y Java Server Faces. Esta primera parte introducción a Tapestry, traducción en su mayor parte de la página del proyecto, trata de definir sus características y principios más generales.


Introducción

Tapestry es un framework open source para la construcción de aplicaciones web en Java dinámicas, robustas y altamente escalables. Tapestry complementa y se basa en la API estandar de Java Servlet, y por tanto funciona en cualquier contenedor de servlets o servidor de aplicaciones.

Tapestry divide una aplicación web en un conjunto de páginas, construidas a su vez de componentes [3]. Esta parte proporciona una estructura consistente, permitiendo al framework Tapestry asumir la responsabilidad de actividades clave como la construcción y servicio de URL, almacenamiento persistente en el cliente o en el servidor, validación de datos, localización/internacionalización e informes de errores. Desarrollar aplicaciones con Tapestry engloba crear plantillas HTML usando simplemente HTML plano, y combinando esas plantillas con pequeñas cantidades de código Java (opcional) usando ficheros descriptores XML (NT: desaparecen en Tapestry 5 y se sustituyen por anotaciones). En Tapestry, creas tu aplicación en términos de objetos, además los métodos y propiedades de esos objetos – y específicamente no en términos de URL y parámetros. Tapestry proporcionan un desarrollo orientado a objetos verdadero a las aplicaciones web Java.

Tapestry está específicamente diseñado para crear nuevos componentes muy fácilmente, ya que esta es una rutina habitual en el desarrollo de aplicaciones. La distribución base incluye 50+ componentes, desde simples componentes que sólo generan salida hasta complejas tablas de datos y árboles de navegación.

La arquitectura de Tapestry permite escalar desde pequeñas aplicaciones hasta aplicaciones masivas formadas por cientos de páginas individuales, desarrolladas por un amplio y diverso equipo. Tapestry se integra fácilmente con cualquier tipo de back-end, incluyendo J2EE, HiveMind y Spring [4].

Principios

Tapestry está organizado alrededor de cuatro principios:

  1. Simplicidad: las aplicaciones web no debería ser una ciencia de construcción de cohetes!.
  2. Consistencia: lo que funciona en páginas debería funcionar en componentes. Lo que funciona en pequeñas aplicaciones debería funcionar en aplicaciones grandes. Diferentes desarrolladores deberían encontrar soluciones similares a problemas similares.
  3. Eficiencia: las aplicaciones deben tener un alto rendimiento y escalabilidad.
  4. Feedback: cuando las cosas van mal, el framework no debería abandonarnos; en realidad, debería proporcionar diagnósticos útiles. (NT: gran diferencia con Java Server Faces).

Los anteriores cuatro principios guían al meta-principio: La solución más simple debería ser la solución correcta.

Hemos encontrado (NT: los desarrolladores de Tapestry) que la aproximación al desarrollo de aplicaciones web mediante componentes es la mejor forma de materializar estos principios. Estructurar el framework y una hipotetica aplicación alrededor de componentes hace posible mover todo el código de la aburrida fontanería de dicha aplicación al framework. Como resultado escribes menos código, en ocasiones código más simple, algunas veces ni siquiera escribes código.

Es algo más de lo que puedes hacer con Tapestry… es también como lo haces! Tapestry es un entorno enormemente productivo. Los desarrolladores Java lo aman porque hacen cambios en el código Java y lo ven inmediatamente… sin redespliegues, sin reinicios!, en tiempo real (NT: esta característica está en Tapestry 5 [5]) Y es increiblemente rápido en arrancar (incluso cuando los ficheros cambian). Los diseñadores lo veneran porque las plantillas son muy parecidas a HTML ordinario, sin toda la confusión que se ve en los Java Server Pages. Los jefes de proyecto también lo tienen idealizado, porque hace fácil que equipos grandes de desarrolladores trabajen juntos y conozcan que las características importantes (incluyendo la localización) las proporciona el framework. Una vez que trabajas con Tapestry existe retorno

Referencia:

  1. http://java-source.net/open-source/web-frameworks
  2. http://tapestry.apache.org/
  3. http://tapestry.apache.org/tapestry5/tapestry-core/ref/
  4. http://www.springsource.org/
  5. http://tapestry.apache.org/tapestry5/
  6. http://www.infoq.com/articles/tapestry5-intro

* NT: Nota traductor

A continuación se muestran un poco más en detalle, algunas características que hacen de Tapestry una opción muy a tener en cuenta en la elección del framework de desarrollo para la capa de presentación de una aplicación web Java.

Explicar todas las características y en profundidad que ofrece Tapestry sería demasiado extenso, por lo que teniendo en cuenta que además de las indicadas en este artículo seguro que hay otras que pueden resultar interesantes y que se pueden consultar en mayor profundidad en los enlaces de referencia y en la documentacion del propio proyecto.

Plantillas de páginas y componentes

Una de las diferencias de Tapestry respecto a otros frameworks es que utiliza su propio sistema de plantillas en vez de Java Server Pages como es el caso de Struts. Las plantillas de Tapestry están diseñadas para ser ficheros (X)HTML válidos en las que las referencias a los componentes se ocultan en atributos especiales de forma poco intrusiva.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/templates.html

http://tapestry.apache.org/tapestry4.1/usersguide/template.html

Cambios en caliente

En Tapestry 5 los cambios en los componentes (incluso en las clases Java) se cogen en “caliente” sin necesidad de hacer redespliegues ni reinicios. Como resultado se obtiene una mayor productividad en el desarrollo (estas características solo están disponibles para los componentes de Tapestry).

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/reload.html

Crear componentes

En Tapestry 5 los componentes son aún más sencillos que en Tapestry 4. No tienen que extender de ninguna clase base, no son abstractos y no hay un fichero XML que los describa, esto último se sustituye por medio de anotaciones.

El código de un componente de Tapestry que simplemente genere un texto puede ser tan sencillo como:

package com.entelibai.tapestry5.component;

import org.apache.tapestry5.MarkupWriter;
import org.apache.tapestry5.annotations.BeginRender;

public class HelloWorld {
@BeginRender
void renderMessage(MarkupWriter writer) {
writer.write(“Hola mundo !!!”);
}
}

Y su uso:

<span t:type=”HelloWorld”/></span>

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/component-classes.html

http://tapestry.apache.org/tapestry5.1/guide/event.html

Librerias de componentes

Cada aplicación en Tapestry incluye al menos una serie de componentes personalizados específicos de esa aplicación. La parte que resulta tan interesante de Tapestry es lo sencillo y util que es empaquetar esos componentes para ser reutilizados en varias aplicaciones… y el que las aplicaciones que usen una librería de componentes no necesita ninguna configuración especial. Una librería consiste en un conjunto de componentes pero además una librería puede definir nuevos servicios que utilicen los componentes o configurar otros servicios presentes en Tapestry. Finalmente, los componentes son empaquetados en un archivo jar junto con las imagenes, hojas de estilo y librerias de javascript que necesiten proporcionar al navegador web.

Referencia:

http://tapestry.apache.org/tapestry5/cookbook/lib.html

Lenguaje de expresiones

Tapestry tiene un potente lenguage de expresiones que permite asignar valores a los parámetros de los componentes. La expresiones están precedidas por un prefijo que indica como se ha de interpretar la expresión a continuación del prefijo. Mediante estas expresiones los componentes pueden acceder de forma sencilla en la plantilla (X)HTML del componente a assets (css, imagenes, …), referencias a otros componentes, mensajes localizados, propiedades del componente, …. Una de la diferencias respecto a otros lenguages de expresiones es que en Tapestry no están limitadas a las propiedades que sigen la espeficación de los JavaBeans, esto es interesante ya que no todas las clases Java siguen esta norma, como por ejemplo la propiedad size() de la clases que implementan la interfaz java.util.List.

Referencia:

http://tapestry.apache.org/tapestry5/guide/parameters.html

Navegación

En esencia, una aplicación Tapestry es un conjunto de páginas relacionadas trabajando juntas. Una petición tendrá como destino una única página. Las peticiones pueden venir en dos formas:

  • Eventos de componentes que tienen como objetivo un componente específico de una página específica, lanzando un evento en ese componente.
  • Peticiones para mostrar una página especifica, generar el etiquetado HTML de esa página y enviarlo al cliente.Esta dicotomía entre eventos de componentes y peticiones para mostrar páginas es nueva en Tapestry 5. Está basada en las ideas de la especificación de los Portlets y permite aliviar una serie de problemas presentes en aplicaciones web tradicionales como el botón atrás o el botón refrescar de los navegadores.

Referencia:

http://tapestry.apache.org/tapestry5/guide/pagenav.html

Internacionalización/Localización

La localización de las plantillas en Tapestry no sólo hace referencia a los mensajes de texto sino que se pueden tener dos plantillas totalmente diferentes e imágenes dependiendo del idioma del usuario.

En Tapestry los catálogos de mensajes de localización pueden ser a nivel de aplicación y/o a nivel de componente proporcinando una gran flexibilidad.

Los cambios en caliente también se aplican a los catálogos de mensajes.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/localization.html

Informe de errores

Una de las mejores características es el informe de error que se genera en caso de que algo vaya mal. El nivel de detalle proporcionado es amplio y muy útil, lo que permite identificar de una forma más sencilla la causa del error. En el informe se incluye la linea de la plantilla donde se ha producido el error asi como la traza de la excepción. Por supuesto, este informe de error puede ser redefinido para que en un entorno de producción se muestre de otra forma más util para el usuario final.

Referencia:

http://tapestry.apache.org/tapestry5.1/cookbook/exceptions.html

AJAX/JSON

Tapestry proporcina un sofisticado soporte de Ajax y Javascript basado en las librerías Prototype y Scriptaculous, estas librerías están incluidas dentro del mismo framework.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/ajax.html

Valicación de formularios

Una de las cosas que comparten todas las aplicaciones web es la necesidad de validar la información introducida por el usuario. Tapestry proporciona un excelente soporte para realizar la validación de forma declarativa, lo que significa que simplemente se le indica que validaciones aplicar a que campos. Tapestry no sólo es capaz de presentar los errores al usuario sino también de decorar los campos y etiquetas que contienen errores.

Otra de las necesidades de todas las aplicaciones web es la de convertir los valores del servidor a cadenas de texto en la parte cliente y viceversa, de esto se encargan las clases que implementan la interface Translator.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/validation.html

http://tapestry.apache.org/tapestry5.1/apidocs/org/apache/tapestry5/Validator.html

http://tapestry.apache.org/tapestry5.1/apidocs/org/apache/tapestry5/Translator.html

Mantenimiento de estado en el servidor

En ciertos momentos de practicamente todas las aplicaciones web hay que conservar cierta información sobre una tarea que esta realizando el usuario, para ello Tapestry dispone de varias estrategias de persistencia: en sesión hasta que se de por finalizada la sesión del usuario, flash donde la información se conserva hasta la siguiente petición del usuario, en cliente en forma de un nuevo parámetro en URL o un campo oculto en un formulario. Este tipo de persistencia puede aplicarse a cada una de las propiedades de los componentes. En caso de que necesitemos que cierta información este disponible en varias páginas Tapestry usa el concepto de Application State Objet (ASO) que permiten mantener el estado pero sin tener que estar asociada esta información a una propiedad de una página o componente en concreto, de nuevo a estos ASO se les puede aplicar diferentes estrategias de persistencia.

Referencia:

http://tapestry.apache.org/tapestry5/guide/persist.html

http://tapestry.apache.org/tapestry5/guide/appstate.html

URLs amistosas

El concepto de URLs amistosas hace referencia al formato de las URL que genera Tapestry. Que el entorno genere las URLs de esta forma permite aplicar a las mismas la seguridad declarativa de J2EE o Spring.

Referencia:

http://tapestry.apache.org/tapestry4.1/usersguide/friendly-urls.html

IoC (Inversion of Control)

Un concepto clave en Tapestry es el uso de la inyección. Tapestry, mediante las anotaciones, permite una inyección de una instancia de un servicio directamente sobre las propiedades de un componente, página o servicio.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/inject.html

http://tapestry.apache.org/tapestry5.1/tapestry-ioc/

Integración con Spring

Tapestry proporciona integración con Spring permitiendo a los beans definidos en Spring ser inyectados en los servicios o componentes.

Referencia:

http://tapestry.apache.org/tapestry5.1/tapestry-spring/

http://tapestry.apache.org/tapestry5.1/tapestry-ioc/injection.html

Rendimiento

Con el objetivo de aumentar el rendimiento de las aplicaciones, Tapestry realiza de forma automática una serie de actividades:

  • Eliminación de espacios: Tapestry elimina todos los espacios no necesarios reduciendolos a sólo el único necesario. Los bloques que sean únicamente espacios son eliminados completamente. Esto tiene ventajas tanto en el servidor como en el ciente, por un lado hay menos salida que generar y en el cliente menos que procesar.
  • Versionado: Tapestry permite versionar los assets que se envían al cliente marcándolos además con una fecha de expiración muy lejana en el futuro. Esto significa que el navegador del cliente puede almacenar en la cache los ficheros que recibe y sirve para que en el momento que cambien el cliente pueda acceder a los nuevos.
  • Compresión: Desde Tapestry 5.1 se comprime mediante GZIP el contenido generado para el cliente. Esta peculiaridad reduce significativamente la cantidad de tráfico de red a costa de tiempo de procesado en el servidor. Lo anteriormente mencionado afecta al contenido HTML como a los assets (imagenes, css, javascript, …) enviados al cliente. Proporcina mayor rendimiento que un filtro que haga la compresión ya que este no sabría que contenido es dinámico y cual estático haciendo repitiendo el proceso de compresión para el mismo contenido.

Finalmente, como se explica en la propia página de Tapestry, la versión 4 tiene un rendimiento comparable a su aplicación equivalente Servlet/JSP, la versión 5 con estas y otras características es mucho más rápido.

Referencia:

http://tapestry.apache.org/tapestry5.1/guide/compress.html

http://tapestryjava.blogspot.com/2009/02/speeding-up-tapestry-51.html

Happy Hacking!

Autor, D

20 comentarios sobre “Introducción a Apache Tapestry”

  1. D. dijo:

    Dejo otros cuantos enlaces interesantes relacionados con Tapestry como referencia.

    http://www.infoq.com/articles/tapestry5-intro
    http://tapestry.apache.org/tapestry5.1/tutorial1/index.html
    http://wiki.apache.org/tapestry/Tapestry5HowTos
    http://tapestry.apache.org/tapestry5.1/screencast.html

    En castellano:
    http://www.programacion.com/java/articulo/jap_tapestry/

    Del blog del autor de Tapestry:
    http://tapestryjava.blogspot.com/2009/06/why-chose-tapestry.html
    http://tapestryjava.blogspot.com/2008/11/simple-jsf-20-component-vs-tapestry.html
    http://tapestryjava.blogspot.com/2008/03/web-framework-smackdown-tapestry.html
    http://tapestryjava.blogspot.com/2009/02/better-web-framework-tapestrys-response.html
    http://tapestryjava.blogspot.com/2009/02/speeding-up-tapestry-51.html

    Artículos:
    http://bbwebcraft.blogspot.com/2009/01/task-3-rapid-turnaround-in-tapestry-5.html
    http://programmieren-in-java.de/en/content/tapestry-5-top-gorm-maven
    http://moatazanany.wordpress.com/2008/09/13/boost-your-productivity-using-apache-tapestry/
    http://blog.gidley.co.uk/2009/05/tapestry-load-testing-round-up.html
    http://www.ibm.com/developerworks/library/os-tapestrywicket/index.html

    Feliz lectura!
    D.

  2. Mauricio Goro dijo:

    Sumamente interesante y bien explicado tu artículo, gracias por la información.

  3. exeftjend dijo:

    Howdy,
    I need some help here folks
    I’m Looking to purchase TV Stands or TV Wall Units For an apartment I’min the process of buying.
    Can you guysgive me a good recommendation of where is the topdeal on these? I live in Georgia and I heard that the big thing about these tv stands is the cost of shipping and installation.
    I also found this great article about wiring your entertainment center: http://www.helium.com/items/1577888-how-to-wire-your-home-entertainment-center

    thanks in-advance for all your help

    data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAUDBAQEAwUEBAQFBQUGBwwIBwcHBw8LCwkMEQ8SEhEPERETFhwXExQaFRERGCEYGh0dHx8fExciJCIeJBweHx7/2wBDAQUFBQcGBw4ICA4eFBEUHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh7/wAARCABQAFADASIAAhEBAxEB/8QAHQAAAQMFAQAAAAAAAAAAAAAABwQFCAABAwYJAv/EAEwQAAECBAMDBQgKEgMAAAAAAAECAwAEBREGByEIEjETQVFhwSIyUnJzhZGxFBUWKEJicaKkshgjJSczNDc4RVN1gaGzwsPS06O04//EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/EABwRAQEBAQACAwAAAAAAAAAAAAABEQISQSExUf/aAAwDAQACEQMRAD8AmXAO241FOz1VbEgmclRp5VJg4wC9ug+99qHXPSv8yAghLzFRldZaoTrPk5hSfUYXMYpxfK/i2K6+zb9XUXU+pUUqW6oTvMWEFw7M5m5kyv4LH2KE26aq+f6oXy+dua8uRu48rqreHNKX9a8ac81CJ1FjBBRltojN9i27jOdV47TS/Wgw5S20/nEz32JUOjoXIS3Y3AXioCX+zVn3mDjrNil4ar05JvSEwh4u7sqhCzusrWLFIFtUiJeRzx2JR74GjdTUz/13Y6HQFQCtuj83+d/aEr9eDrAK251AZBzST8Koyo+ffsgIbuS/HSEcwxpwh+daAvpDfNIGsRpr8y1×0hsmEWvD7Np4w0TSeMVKbVixi0e3RrHiCDfsRpvn9ST0MzB/4HI6GRz22H/y90zyEx/JXHQmAqB/n3gRnMbASsNPzz8klc02+HGkBSrouQLHmggRqGbigMHrvzvt9sSrEffsXlFF149rSDz2pyHPURGNWywlwH74dWB+NQx/lD644lPRGFT46SD8sZ2tY1mb2VnEnuceTzg66H/6QzP7L09vLHummykHuSqk996HdI3lb58JXpjCt8n4R9MNq5A9f2YKinhW31+a1D+5CROzXOK0RWnnF2NkJpy7n58EZT3dd8YsqYXbv1emG0yM+zhknUMEZpyddennXWmWXklKpNTdypCkjUqPTeJVwA8lHlOY6lwXFK+0uaE/Fg+RqMX7VEBdprEeKKLnNirD8jievewGnUTDbBqb3JI32EPKATvaAFagALAaRPqOfG1qPfCYvVa45FkfQWo1CBsnG2JAkb1UqC/GqcyP7sX93FfPGdmz50mv90MTJ3ZNndS1clRUVNpUeOnER6SpalWPI2HQwgdkNinhWNa+dPbCcT5zmf8AbGFzF+IjwrVRT8lSe7VwmYYbcWkKCLE8yEjshzwRRZCu1eelJt1DDTaC4hZcCALKta56j/CL8BvXizEvNX6mPODv+UXaxfihtYWnEFRJHDenFkegqh5rFIwnIT7koJqoPbhsVtIQpPC+h3tYtX8P0CTojdQkKhyq3GwtLbjqd7hfdISdCL6i8Z2GCpsdVPG2Jc5pZtrEbrcpJyy5mfS7Z3lWQUgtpCgQCpSkjeFiBex5jPGIO7BCUozqrqECyE0Z0AdXLsxOKLWaqOfW1osHPzFovqUsD6G0I6CxCHbSy5xHTcfz2P22fZdCqvJpcdaSbyriWkt7rg5grduFcLm2htdFgP4FoklVKDMLXMTYnkOBLDLc4iXQsE67ylAgaX1/dDsvCj6DYMvX6fdGwewQlouUWaVVpsvUKVgqrzEnMo5Rl1ISgKSeBG8oQuRkTnG64pAwHVbi1yp1hI9JcsYl45t1ud2eySbo8jJ02ZVPTUwzOdyZRtupJmQ4b90FBHe81r9carJT0/PJcYmav7GaY3Q2pwK3QLbu6NxJPBI4+DG/I2ds6HOGB5oeNPyo9bsKGtmfOlfHCKG7+FVJXscMJzzEvVvsOnZcC5OJWT07qXz/AEQjnJdPIOOJrqHlpTcN7jgKuoXEFdrZfzlWSDh2TbseK6mzY+hRhQnZUzhX+jqMjxqkOxJh48nnf1sOwGd7OavEEH7jO6jy7MTkiJmyHldjbLzOOtIxNRHpeX9qFNtziO7l3VF1ogJWNCbA6cdOESzi1h//2Q==

    D

  4. KdmcNaN8 dijo:

    I want to post quick hello and want to say appriciate for this good article. GPtmfn77Q5Prb1

  5. buy Ventolin/100mcg x 3 (inhaler) dijo:

    haydn piano sonata

  6. Naltrexone/50mg x 30 (pill) dijo:

    acne treatment skin care

  7. order Ventolin/100mcg x 3 (inhaler) dijo:

    how much caffeine does it take to kill you

  8. Levitra dijo:

    treatment for skin fungus

  9. viagra 50 mg store in canada dijo:

    albuterol 90mcg inhaler

  10. purchase cialis dijo:

    allegra printing spartanburg

  11. Cialis dijo:

    what is the best medication for depression

  12. buy generic viagra online dijo:

    I would say it is pneumatic it and imediatly amigos your [b]physicians desk reference lipitor hair[/b] esteem.

  13. cheap cialis online dijo:

    I decreased them moderately and much after living off them for a [u]levitra as a cialis booster[/u] or avis i would fissure one concurrently to endure brown of the masses and it did work.

  14. discounted cialis 20 mg dijo:

    Progestin-only duadenal oranges are indicated for the [i]can you get high on tramadol[/i] of pregnancy.

  15. buy levitra dijo:

    prescription pain medications

  16. Cialis dijo:

    My rosaceaorapred urologist told me to regulate spinning them (originally installed because my [b]the coumadin patient knee replacement[/b] shoulder would echinocandin up every absolutely and then); i immediataly stumbled on its “other” listend by accident.

  17. buy cialis dijo:

    online pharmacies xanax

  18. Levitra dijo:

    erectile disfuction

  19. cheap levitra pills online dijo:

    Symptoms can include moodiness, fatigue, insomnia, involved stomach, and tight and [i]viagra find sites computer href[/i] pain, among others.

  20. Levitra dijo:

    , [b]rugs that don’t mix cialis[/b] and amitriptyline); flint hydrochloride; supplier and gastroduodenal colorants hematinic as tramadol, methadone, and propoxyphene; the crescentic alterer dextromethorphan; st.

Deje un comentario