Ola, somos Arume

Desenvolvemos páxinas web, aplicacións para móbiles, capas de realidade aumentada e aplicacións para Facebook. Apaixónanos a informática e somos uns perfeccionistas incurables; por eso nos nosos proxectos utilizamos estándares.

tel. 625 519 694

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

Autenticarse

Rexistrarse. Esqueceches o teu contrasinal?

Etiquetas

Saltar as etiquetas

Subscríbete ás RSS

Estás en:

Introdución a Apache Tapestry

29 Nov 2010 por Santi

Comentarios: 3

Apache Tapestry

Apache Tapestry é un framework Java de código aberto para a implementación de aplicacións web mediante a arquitectura Modelo-Vista-Controlador. Iniciou as súas andainas alá por 1999 da man do seu creador, Howard Lewis Ship para posteriormente ser adoptado como proxecto pola Fundación Apache. Actualmente atópase na versión 5.1, baixo licenza Apache Software Licence 2.0.

Tapestry forma parte dunha "nova xeración" de frameworks web (como por exemplo JavaServer Faces ou Apache Wicket) que intentan achegar un novo enfoque ao desenvolvemento de aplicacións web Java (baseados en compoñentes e orientados a eventos) fronte ó clásico e archicoñecido Apache Struts (baseado en accións).

Características

Lixeiro e altamente escalable

Tapestry está construído sobre a API de Servlets, polo que pode usarse en calquera colector de aplicacións Java lixeiro (só necesita soporte para Servlets). Un dos obxectivos no seu desenvolvemento é conseguir un alto rendemento e unha alta escalabilidade, algo que á vista de certos benchmarks parecen conseguir.

Uso de plantillas

Un dos aspectos máis destacables de Tapestry é que facilita e impón a separación entre código e interfaz mediante o uso dunhas simples plantillas XML para o renderizado a HTML. Para facilitar o deseño a aqueles xa familiarizados co desenvolvemento web, os compoñentes propios de Tapestry poden ser embebidos dentro dos compoñentes XHTML estándar, de forma que as plantillas son prácticamente idénticas a un ficheiro XHTML. Desta forma, a plantilla para unha simple páxina HTML en Tapestry ten 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 podería tratarse perfectamente dunha páxina XHTML normal. Os únicos engadidos propios de Tapestry son:

  • No título vemos un ${pageTitle}, que indica que Tapestry debe parsear esa instrución para á hora de renderizar o HTML inserir aí o valor dunha variable chamada pageTitle que se atopa definida no obxecto Java asociado á páxina.
  • Certos atributos empezan co prefixo "t:". Este prefixo indica que Tapestry debe procesar esos elementos HTML. E.g. no caso de t:type, indica a Tapestry que debe asociar esas etiquetas co seu propio código, de forma que asociamos o formulario do HTML co compoñente Form propio de Tapestry, que contén a lóxica necesaria para o tratamento do formulario e os seus datos asociados. De forma similar, os inputs son asociados a un compoñente TextField (Tapestry encárgase transparentemente de "capturar" o valor contido no input cando se envíe o formulario e de encher o campo co valor asociado cando se renderice a páxina se é necesario) e PasswordField (idéntico a un TextField, pero coa excepción de que se enmascara o texto contido ó tratarse de passwords). No caso dos t:id, indican a Tapestry en que variables ou obxectos se almacenarán os valores necesarios para o tratamento de cada compoñente (no caso do input, o valor introducido)

Baseado en compoñentes e orientado a eventos

Tapestry concibe unha aplicación web como un conxunto de páxinas, cada unha das cales se constrúe a partir de compoñentes que poden xerar diversos eventos ante os que a páxina pode reaccionar. Desta forma, o programador crea unha aplicación en base aos obxectos, os seus métodos e propiedades, mentres Tapestry se encarga de abstraer todos os conceptos relacionados ca web (URLs, parámetros, almacenamento persistente, ...) para facilitarlle o traballo. Desta forma, cada páxina da aplicación terá un obxecto Java asociado que contén as propiedades para almacenar o estado da páxina e os métodos ca lóxica necesaria para procesar os eventos que sexan invocados polos compoñentes da mesma. Seguindo co noso exemplo, a clase Java asociada á nosa simple páxina de login anterior terí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 da páxina.
     loginName e password están asociados ós inputs co mesmo
     't:id' na plantilla. A anotación @Property permite o
     acceso ós parámetros dende a plantilla.
  */
  @Property
  private String pageTitle;

  @Property
  private String loginName;

  @Property
  private String password;

  /*
     Outras páxinas da aplicación, 'inxéctanse' mediante
     a anotación @InjectPage
  */
  @InjectPage
  private LoginError loginError;

  @InjectPage
  private UserIndex userIndex;

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

  /* Evento invocado ó facer submit no formulario */
  Object onSuccess()
  {
    /*
       Validamos que o login e password sexan correctos. Para indicar
       a que páxina queremos dirixirnos, devolvemos a clase do obxecto
       Java asociado á páxina correspondente
    */
    if (AuthenticationManager.validateUser(loginName, password))
    {
      return userIndex.class;
    }
    else
    {
      return loginError.class;
    }
  }
}

Tapestry trae un gran número de compoñentes predefinidos, pero permite ó usuario definir os seus propios compoñentes de forma sinxela. Os compoñentes defínense de forma idéntica ás páxinas: mediante unha clase Java e unha plantilla XML (no caso de que o compoñente necesite renderizar HTML). Desta forma foméntase a reutilización do código e facilítase o desenvolvemento e comprensión do mesmo.

Alta produtividade

Outro dos obxectivos de Tapestry é promover a produtividade, para iso segue un enfoque Convención sobre configuración, de forma que libra ó programador de tediosas e longos labores de configuración mediante unha política de nomeado estándar de métodos, eventos e parámetros (e.g. asociar inputs a variables que teñan o mesmo nome que o seu id). Pero todo iso sen perder flexibilidade, pois dalle a opción ó programador de non seguir as convencións e proporcionar as súas propias configuracións se o desexa. Así mesmo, posúe un gran repertorio de compoñentes predefinidos para gran variedade de casos comúns, de forma que o programador poida usalos directamente (validación de erros en formularios, mostrar listaxes en táboas con paxinación, ...).

Outra forma de aumentar a produtividade é mediante o uso e implementación de técnicas modernas de programación para aumentar a rapidez do desenvolvemento: Anotaciones, Inversión de Control e Live-class reloading.

Integración con outros frameworks

Tapestry está pensado para traballar en conxunto con outros frameworks e trae por defecto soporte para integración con algúns dos máis coñecidos, como son Spring e Hibernate.

Críticas

Elevada curva de aprendizaxe e falta de documentación

Un dos grandes males achacados tradicionalmente a Tapestry desde sempre é a súa dificultade de aprendizaxe. E é que a alta abstracción en certos aspectos (especialmente os referidos a web e convencións de nomeado) que tanto facilitan o desenvolvemento e aumentan a produtividade unha vez dominado Tapestry poden supor un obstáculo para programadores noveis. Os recentemente iniciados adoitan verse frustrados mentres non se adaptan ás convencións de nomeado ó ver como algunhas cousas parecen funcionar por encantamento e outras non por un simple erro no nome.

Outro dos aspectos que dificulta enormemente o proceso de aprendizaxe é a alarmante escaseza de documentación existente sobre Tapestry. A documentación no sitio oficial é correcta pero escasa, e mentres outros frameworks que gozan de máis popularidade teñen unha gran comunidade online, atopar axuda ou tutoriais para certos aspectos de Tapestrypode ser un arduo labor.

Incompatibilidade entre versións

A política de actualizacións de Tapestryrecibiu no pasado numerosas e merecidas críticas debido á ruptura de compatibilidade entre as versións 3 e 4, posteriormente repetida entre as versións 4 e 5. Actualmente, o equipo que o desenvolve anunciou que o redeseño recibido na versión 5 (a actual) é o definitivo e comprometeuse a que as actualizacións futuras manterán a compatibilidade cara atrás.

Estrutura estática

Tapestry usa unha estrutura de páxinas semi-estática, onde o programador pode incluír condicionais e iteracións para conseguir un comportamento dinámico. Pero a inexistencia da posibilidade de definir estruturas e compoñentes en tempo de execución imposibilita o uso de Tapestry para certas aplicacións que necesiten unha estrutura de páxinas totalmente dinámica.

Comentarios

3 comentarios. Comentar.

1. Anónimo o 29 Xul 2011 ás 20:23:22

Que buena introducción al tema de Tapestry.

2. pico.dev o 05 Set 2011 ás 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 o 05 Set 2011 ás 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

Podes comentar poñendo calquera nome ou alcume, exceptuando os nomes de usuarios rexistrados. Máximo de 50 caracteres.

Comentar como usuario rexistrado

Rexistrarse. Esqueceches o teu contrasinal?