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.
 <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
<body>
    <p>Hola, ${usuario}</p>
</body>
</html>

 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.
package org.example.demo.pages;

/**
 * La clase de la página (asociada con el archivo de plantilla del mismo nombre).
 */
public class HolaMundo {

    /**
     * Un getter ordinario.
     */
    public String getUsuario() {
        return "mundo";
    }
}

 web.xml
 El archivo descriptor de despliegue de las aplicaciones web Java que instala Tapestry como un filtro de servlets.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app
        PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
    <display-name>Ejemplo de Tapestry</display-name>
    <context-param>
        <!-- Indica a Tapestry en que paquete buscar páginas, componentes, servicios y mixins -->
        <param-name>tapestry.app-package</param-name>
        <param-value>org.example.demo</param-value>
    </context-param>
    <filter>
        <!-- Define el filtro de Tapestry -->
        <filter-name>app</filter-name>
        <filter-class>org.apache.tapestry5.TapestryFilter</filter-class>
    </filter>
    <filter-mapping>
        <!-- Indica al contenedor de servlets que peticiones enviar al filtro de Tapestry -->
        <filter-name>app</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

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

Proyectos relacionados 
 Proyecto Tynamo  que ofrece funcionalidades adicionales.
 JumpStart tutorial  Tapestry mediante ejemplos.

Véase también 
 Comparison of web application frameworks
 Java view technologies and frameworks
 Java Platform, Enterprise Edition

Bibliografía

Notas

Enlaces externos 
 Página de inicio de Apache Tapestry
 Documentación de Apache Tapestry
 Ejemplos para iniciarse en Apache Tapestry 
 Proyecto Tynamo 
 Página personal de Howard Lewis Ship

Frameworks para aplicaciones web
Apache Software Foundation
Software libre