# Apache Tapestry

Apache Tapestry es un framework para desarrollar aplicaciones web de código abierto desarrollado sobre el lenguaje Java basado en componentes. Tapestry fue creado por Howard Lewis Ship y adoptado por Apache Software Foundation como proyecto superior en 2006.
Tapestry hace énfasis en la simplicidad, fácilidad de uso y la productividad para el desarrollador. Se adhiere al paradigma convención sobre configuración eliminando prácticamente todo el uso de XML. Usa una aproximación modular al desarrollo web, poseyendo una fuerte unión entre el componente en la página web y su correspondiente clase Java. La arquitectura basada en componentes toma prestadas varias ideas de WebObjects. Emplea el Modelo–vista–controlador y una arquitectura push.
Tapestry se basa en el estándar Java Servlet API, funcionando sobre cualquier contenedor de servlets o contenedor de aplicaciones. Asume responsabilidades clave como la construcción y envío de URLs, almacenamiento del estado persistente en el cliente o en el servidor, validación de entradas de usuario, localización/internacionalización e informe de excepciones. Las aplicaciones se describen en términos de objetos, métodos y propiedades y no en términos de URLs y parámetros como en los frameworks basados en acciones.

## Características destacadas
### Recarga dinámica de clases

    Tapestry monitoriza el sistema de archivos buscando cambios en las clases Java de las páginas, componentes e implementaciones de servicios, plantillas HTML y archivos properties de los componentes. Cuando hay algún cambio la recarga dinámica aplica los nuevos archivos sin requerir un reinicio de la aplicación. Esto proporciona un ciclo corto de codificar-guardar-ver mediante el que se reclama una productividad mejorada enormemente para el desarrollador.

### Basado en componentes

    Las páginas pueden ser construidas con pequeños componentes anidables que pueden ser reutilizados múltiples veces en una misma página, en diferentes páginas del mismo proyecto o en diferentes proyectos mediante librerías de componentes. Cada uno posee una clase de componente y opcionalmente una plantilla. Construir nuevos componentes es trivial.

### Convención sobre configuración

    Tapestry usa convenciones de nombres y anotaciones en vez de XML para configurar la aplicación.

### Mínimo uso de HttpSession

    Tapestry está diseñado para hacer un uso mínimo de HttpSession para ser altamente eficiente en un entorno cluster con sesiones replicadas.

### Post/Redirect/Get

    La mayoría de los envíos de peticiones siguen el patrón Post/Redirect/Get (PRG) que reduce los problemas de enviar múltiples veces un formulario y mostrando siempre URLs amigables y agregables a los marcadores, haciendo que los botones atrás y refrescar de los navegadores funcionen correctamente.

### Inversión de control (IoC)

    posee una capa propia de Inversión de control disponible para los servicios de la aplicación haciendo que muchos de los aspectos del comportamiento de Tapestry configurables y reemplazables. El contenedor de dependencias está específicamente diseñado para ser usado en Tapestry aunque puede ser usado por cualquier otro tipo de aplicación y fuera del ámbito web.

### Informativo

    Cuando se produce una excepción Tapestry presenta una página con un informe de error en el que se incluye mucha información para determinar la causa del error, incluyendo la traza de la excepción, líneas precisas de código y mostrando un extracto del código donde se ha producido la excepción. El informe de error se muestra también cuando se producen excepciones en peticiones Ajax.

### Políglota

    El lenguaje de programación empleado habitualmente para el código asociado a las páginas y componentes es Java pero se puede emplear cualquier otro lenguaje soportado por la JVM. Tapestry acepta cualquiera de ellos (Groovy, Scala, ...).

### Modular, adaptable y extensible

    Los servicios proporcionados por Tapestry pueden ser configurados para adaptarse a las necesidades de la aplicación o reemplazados por otras implementaciones, también pueden proporcionase nuevos servicios.

## Principios

La documentación de Tapestry cita cuatro principios que gobiernan las decisiones de desarrollo para Tapestry 5 empezando desde la versión 5 en 2008.
* Estructura estática, comportamiento dinámico: la estructura de las páginas y componentes es esencialmente estática no teniendo la necesidad de construir (y almacenar en memoria) árboles grandes de páginas y componentes.
* API adaptativa: el framework está diseñado para que se adapte al código del desarrollador en vez de que el desarrollador se adapte al framework.
* Diferenciación entre API pública e interna: permite a los desarrolladores no hacer uso de APIs internas del framework que pueden cambiar en un futuro de modo que posteriores actualizaciones a nuevas versiones sean más sencillas y sigan siendo compatibles.
* Asegurar compatibilidad hacia atrás: los desarrolladores de Tapestry están comprometidos a asegurar la compatibilidad y que actualizar a siguientes versiones sea sencillo.

## Ejemplo Hola mundo

Una aplicación mínima usando plantillas requiere solo tres archivos:

### HolaMundo.tml

    La plantilla (X)HTML para la página /holamundo. Las plantillas de Tapestry puede contener cualquier marcado (X)HTML bien formado.

### HolaMundo.java

    La clase de la página está asociada con la plantilla. En este ejemplo simplemente proporciona una propiedad *usuario* que la plantilla puede acceder.

### web.xml

    El archivo descriptor de despliegue de las aplicaciones web Java que instala Tapestry como un filtro de servlets.

## Transformación de clases

Tapestry usa manipulación de bytecode para transformar las clases de las páginas y componentes en tiempo de ejecución. Esta aproximación permite que las páginas y componentes sean escritas como simples POJOs, con unas pocas convenciones de nombres y anotaciones Tapestry puede invocar la funcionalidad en tiempo de ejecución. A partir de la versión 5.3 usa una capa de manipulación de bytecode llamada Plastic que está basada en ObjectWeb ASM.

## Soporte del lado del cliente

Desde la versión 5.4, Tapestry incluye una nueva capa de JavaScript que elimina la dependencia sobre Prototype permitiendo usar jQuery o cualquier otro framework JavaScript. Esta capa de abstracción permite que las operaciones Ajax sean ciudadanos de primera clase.
La versión 5.4 también incorpora el soporte para la carga de módulos de JavaScript usando RequireJS.

## Relación con otros frameworks

De acuerdo con Howard Lewis Ship, Tapestry fue inicialmente concebido como un intento de implementar en Java algunos conceptos generales y aproximaciones presentes en WebObjects que en su momento estaba escrito en Objective-C y era de código cerrado.
Apache Wicket fue desarrollado como una respuesta a la complejidad de las versiones iniciales de Tapestry de acuerdo a su creador Jonathan Locke.
Facelets, la tecnología de presentación por defecto de JavaServer Faces está inspirada en versiones anteriores de Tapestry como un intento de disponer de "un framework como Tapestry pero como un estándar para la industria basado en JavaServer Faces".

## Historia

| Versión | Fecha | Descripción |
| 1.0 | 2000 | Desarrollada por Howard Lewis Ship para uso propio. |
| 2.0 | 2002-04 | Primeramente disponible en SourceForge bajo una licencia GNU Lesser General Public License. |
| 3.0 | 2004-04 | La primera versión bajo Apache, como un subproyecto de Jakarta. |
| 4.0 | 2006-01 | Incluye soporte para anotaciones JDK 1.5, un nuevo subsistema de validación y un informe de error mejorado. |
| 5.0 | 2008-12 | Se reescribe prácticamente Tapestry 4, presentando un nuevo modelo de componentes basado en POJOs enfatizando convención sobre configuración y reemplazando Hivemind con una nueva capa de inversión de control sin XML. |
| 5.1 | 2009-04 | Mejoras de rendimiento y uso de memoria, compresión de GZIP automática, agregación de JavaScript manteniendo compatibilidad con Tapestry 5.0. |
| 5.2 | 2010-12 | Se añade JSR 303 Bean Validation. Recarga de clases extendida a las implementaciones de los servicios. Se elimina el pool de páginas. |
| 5.3 | 2011-11 | Se añade soporte para HTML5, inyección de anotaciones JSR-330, mejoras de rendimiento y uso de memoria, nuevos componentes, cambio de manipulación de bytecode de JavaAssist a ASM. |
| 5.3.1 - 5.3.7 | 2012-2013 | Corrección de errores y mejoras. |
| 5.3.8 | 2014-11 | Se añade soporte para funcionar con Java 8. |
| 5.4 | 2015-12 | Varias mejoras en el lado cliente. Nueva capa de JavaScript agnóstica del framework pudiéndose usar jQuery, Prototype u otro. Se emplea RequireJS para la definición y uso de módulos JavaScript. Se incluye Twitter Bootstrap para los estilos. Además de numerosas correcciones de errores, actualización de dependencias, mejoras en la documentación y en diversas funcionalidades así como nuevas características que pueden consultarse en la lista completa de cambios. |

## Proyectos relacionados

* Proyecto Tynamo Archivado el 16 de octubre de 2014 en Wayback Machine. que ofrece funcionalidades adicionales.
* JumpStart tutorial Archivado el 12 de octubre de 2014 en Wayback Machine. Tapestry mediante ejemplos.