Hola, somos Arume

Desarrollamos páginas web, aplicaciones para móviles, capas de realidad aumentada y aplicaciones para Facebook. Nos apasiona la informática y somos unos perfeccionistas incurables; por eso en nuestros proyectos utilizamos estándares.

tel. 625 519 694

Mendaña de Neyra, 34, 3º B, 15008, A Coruña

Autenticarse

Registrarse. ¿Has olvidado tu contraseña?

Etiquetas

Saltar las etiquetas

Suscríbete a las RSS

Estás en:

Introducción a Apache Tapestry

29 Nov 2010 por Santi

Comentarios: 3

Apache Tapestry

Apache Tapestry es un framework Java de código abierto para la implementación de aplicaciones web mediante la arquitectura Modelo-Vista-Controlador. Inició sus andaduras allá por 1999 de la mano de su creador, Howard Lewis Ship para posteriormente ser adoptado como proyecto por la Fundación Apache. Actualmente se encuentra en la versión 5.1, bajo licencia Apache Software Licence 2.0.

Tapestry forma parte de una "nueva generación" de frameworks web (como por ejemplo JavaServer Faces o Apache Wicket) que intentan aportar un nuevo enfoque al desarrollo de aplicaciones web en Java (basados en componentes y orientados a eventos) frente al clásico y archiconocido Apache Struts (basado en acciones).

Características

Ligero y altamente escalable

Tapestry está construido sobre la API de Servlets, por lo que puede usarse en cualquier contenedor de aplicaciones Java ligero (sólo necesita soporte para Servlets). Uno de los objetivos en su desarrollo es conseguir un alto rendimiento y una alta escalabilidad, algo que a la vista de ciertos benchmarks parecen haber conseguido.

Uso de plantillas

Uno de los aspectos más destacables de Tapestry es que facilita e impone la separación entre código e interfaz mediante el uso de unas simples plantillas XML para el renderizado a HTML. Para facilitar el diseño a aquellos ya familiarizados con el desarrollo web, los componentes propios de Tapestry pueden ser embebidos dentro de los componentes XHTML estándar, de forma que las plantillas son prácticamente idénticas a un fichero XHTML. De esta forma, la plantilla para una simple página HTML en Tapestry tiene este aspecto:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:t="http://tapestry.apache.org/schema/tapestry_5_1_0.xsd">
<head>
  <title>${pageTitle}</title>
</head>
<body>
  <form t:type="Form" t:id="loginForm">
    <label for="loginName">Login</label>
    <input t:type="TextField" t:id="loginName" />

    <label for="password">Password</label>
    <input t:type="PasswordField" t:id="password" />

    <input type="submit" value="Entrar"/>
  </form>
</body>
</html>

Como vemos, esta plantilla podría tratarse perfectamente de una página XHTML normal. Los únicos añadidos propios de Tapestry son:

  • En el título vemos un ${pageTitle}, que indica que Tapestry debe parsear esa instrucción para a la hora de renderizar el HTML insertar ahí el valor de una variable llamada pageTitle que se encuentra definida en el objeto Java asociado a la página.
  • Ciertos atributos empiezan con el prefijo "t:". Este prefijo indica que Tapestry debe procesar esos elementos HTML. E.g. en el caso de t:type, indica a Tapestry que debe asociar esas etiquetas con su propio código, de forma que asociamos el formulario del HTML con el componente Form propio de Tapestry, que contiene la lógica necesaria para el tratamiento del formulario y sus datos asociados. De forma similar, los inputs son asociados a un componente TextField (Tapestry se encarga transparentemente de "capturar" el valor contenido en el input cuando se envíe el formulario y de rellenar el campo con el valor asociado cuando se renderice la página si es necesario) y PasswordField (idéntico a un TextField, pero con la salvedad de que se enmascara el texto contenido al tratarse de passwords). En el caso de los t:id, indican a Tapestry en qué variables u objetos se almacenarán los valores necesarios para el tratamiento de cada componente (en el caso del input, el valor introducido)

Basado en componentes y orientado a eventos

Tapestry concibe una aplicación web como un conjunto de páginas, cada una de las cuales se construye a partir de componentes que pueden generar diversos eventos ante los que la página puede reaccionar. De esta forma, el desarrollador crea una aplicación en base a los objetos, sus métodos y propiedades, mientras Tapestry se encarga de abstraer todos los conceptos relacionados con la web (URLs, parámetros, almacenamiento persistente, ...) para facilitarle el trabajo. De esta forma, cada página de la aplicación tendrá un objeto Java asociado que contiene las propiedades para almacenar el estado de la página y los métodos con la lógica necesaria para procesar los eventos que sean invocados por los componentes de la misma. Siguiendo con nuestro ejemplo, la clase Java asociada a nuestra simple página de login anterior tendría este aspecto:

import es.arumeinformatica.testapp.AuthenticationManager;
import org.apache.tapestry5.annotations.Property;
import org.apache.tapestry5.ioc.annotations.InjectPage;

public class Login
{
  /*
     Parámetros de la página.
     loginName y password están asociados a los inputs con mismo
     't:id' en la plantilla. La anotación @Property permite el
     acceso a los parámetros desde la plantilla.
  */
  @Property
  private String pageTitle;

  @Property
  private String loginName;

  @Property
  private String password;

  /*
     Otras páginas de la aplicación, se 'inyectan' mediante
     la anotación @InjectPage
  */
  @InjectPage
  private LoginError loginError;

  @InjectPage
  private UserIndex userIndex;

  /* Evento invocado al acceder a la página */
  void onActivate()
  {
    pageTitle = "Página de Login";
  }

  /* Evento invocado al hacer submit en el formulario */
  Object onSuccess()
  {
    /*
       Validamos que el login y password sean correctos. Para indicar
       a que página queremos dirigirnos, devolvemos la clase del objeto
       Java asociado a la página correspondiente
    */
    if (AuthenticationManager.validateUser(loginName, password))
    {
      return userIndex.class;
    }
    else
    {
      return loginError.class;
    }
  }
}

Tapestry trae un gran número de componentes predefinidos, pero permite al usuario definir sus propios componentes de forma sencilla. Los componentes se definen de forma idéntica a las páginas: mediante una clase Java y una plantilla XML (en el caso de que el componente necesite renderizar HTML). De esta forma se fomenta la reutilización del código y se facilita el desarrollo y comprensión del mismo.

Alta productividad

Otro de los objetivos de Tapestry es promover la productividad, para ello sigue un enfoque Convención sobre configuración, de forma que libra al desarrollador de tediosas y largas labores de configuración mediante una política de nombrado estándar de métodos, eventos y parámetros (e.g. asociar inputs a variables que tengan el mismo nombre que su id). Pero todo ello sin perder flexibilidad, pues le da la opción al desarrollador de no seguir las convenciones y proporcionar sus propias configuraciones si lo desea. Asimismo, posee un gran repertorio de componentes predefinidos para gran variedad de casos comunes, de forma que el desarrollador pueda usarlos directamente (validación de errores en formularios, mostrar listados en tablas con paginación, ...).

Otra forma de aumentar la productividad es mediante el uso e implementación de técnicas modernas de programación para aumentar la rapidez del desarrollo: Anotaciones, Inversión de Control y Live-class reloading.

Integración con otros frameworks

Tapestry está pensado para trabajar en conjunto con otros frameworks y trae por defecto soporte para integración con algunos de los más conocidos, como son Spring e Hibernate.

Críticas

Elevada curva de aprendizaje y falta de documentación

Uno de los grandes males achacados tradicionalmente a Tapestry desde siempre es su dificultad de aprendizaje. Y es que la alta abstracción en ciertos aspectos (especialmente los referidos a web y convenciones de nombrado) que tanto facilitan el desarrollo y aumentan la productividad una vez dominado Tapestry pueden suponer un obstáculo para desarrolladores noveles. Los recién iniciados suelen verse frustrados mientras no se adaptan a las convenciones de nombrado al ver como algunas cosas parecen funcionar por arte de magia y otras no por un simple error en el nombre.

Otro de los aspectos que dificulta enormemente el proceso de aprendizaje es la alarmante escasez de documentación existente sobre Tapestry. La documentación en el sitio oficial es correcta pero escasa, y mientras otros frameworks que gozan de más popularidad tienen una gran comunidad online, encontrar ayuda o tutoriales para ciertos aspectos de Tapestry puede ser una ardua labor.

Incompatibilidad entre versiones

La política de actualizaciones de Tapestry ha recibido en el pasado numerosas y merecidas críticas debido a la ruptura de compatibilidad entre las versiones 3 y 4, posteriormente repetida entre las versiones 4 y 5. Actualmente, el equipo desarrollador ha anunciado que el rediseño recibido en la versión 5 (la actual) es el definitivo y se ha comprometido a que las actualizaciones futuras mantendrán la compatibilidad hacia atrás.

Estructura estática

Tapestry usa una estructura de páginas semi-estática, donde el desarrollador puede incluir condicionales e iteraciones para conseguir un comportamiento dinámico. Pero la inexistencia de la posibilidad de definir estructuras y componentes en tiempo de ejecución imposibilita el uso de Tapestry para ciertas aplicaciones que necesiten una estructura de páginas totalmente dinámica.

Comentarios

3 comentarios. Comentar.

1. Anónimo el 29 Jul 2011 a las 20:23:22

Que buena introducción al tema de Tapestry.

2. pico.dev el 05 Sep 2011 a las 00:56:00

Muy buena introducción. Anotada en mi blog de documentación que voy recopilando sobre Apache Tapestry (http://elblogdepicodev.blogspot.com/2010/05/documentacion...).

Una pregunta, ¿En Arume informática utilizáis Apache Tapestry para algunos de los proyectos que desarrolláis?

3. Luis el 05 Sep 2011 a las 11:57:44

Hola pico.dev. Gracias por añadirnos a tu blog.

En cuanto a la pregunta que nos haces, aunque en la mayoría de nuestros proyectos trabajamos con PHP y MySQL, en algunos (a requerimiento del cliente) hemos utilizado Java y Oracle. En estos proyectos hemos utilizado Tapestry e Hibernate.

Comentar

Comentar de forma anónima

Puedes comentar poniendo cualquier nombre o apodo, exceptuando los nombres de usuarios registrados. Máximo de 50 caracteres.

Comentar como usuario registrado

Registrarse. ¿Has olvidado tu contraseña?