h1

Wicket vs. Tapestry.

07/21/2008

Wizdoc [Icon By Buuf]  Tips & Tricks.
Hace algún tiempo encontré este post, donde a través del Google Trends han estado midiendo la "popularidad" de varios frameworks de desarrollo web – entre ellos Java Server Faces, Struts 2 y Adobe Flex – llegando a la conclusión de que ASP.NET y Flex son la solución más socorrida mientras que frameworks tan buenos como Tapestry o Stripes son relegados a la nada.

Pero no nos engañemos, eso sólo son chaquetas mentales: como bien aciertan en este otro blog, las estadísticas proporcionadas por Google Trends pueden ser muy engañosas: cuando se comparan dos términos de búsqueda no obtenemos la verdadera razón tras éstas, y lo mismo muchos de los hits pueden deberse a su popularidad que a múltiples búsquedas porque los desarrolladores no encuentran cómo resolver un problema en el framework.

De hecho, le creería un poco más a una estadística parecida al TIOBE Programming Community Index. Aunque en dicho índice se calcula la popularidad de los lenguajes de programación de manera más general, sirve como referencia para ver el verdadero porcentaje de uso de los frameworks de presentación (dar click en imagen para ver la gráfica actualizada en tamaño original).

Por otro lado, y a sabiendas que le tengo aversión a Struts y por el momento no he revisado la funcionalidad de Struts 2, busqué comparativos y he estado realizando algunas pruebillas de concepto entre Apache Tapestry y Apache Wicket. Las diferencias – y sobre todo, las similitudes – son sorprendentes:

• En cuanto a la administración de requerimientos, Tapestry es prácticamente el trabajo de Howard Lewis Ship y a final de cuentas, es quien decide qué incluir y qué no dentro del core del framework. Por otro lado, Wicket es producto de una comunidad de desarrolladores, quienes debaten y acuerdan este tipo de funcionalidad en foros de discusión.

• Tapestry ha sido optimizado para tener un buen desempeño a costa de la curva de aprendizaje; Wicket es la otra cara de la moneda y ha sido pensado con la facilidad de implementación en mente.

• Tapestry es equivalente a un Ferrari: siempre con la última tecnología, se busca que el framework atraiga usuarios por la calidad y potencia de desempeño; Wicket es más bien un utilitario: con sólo lo suficiente de acuerdo a la retroalimentación del usuario para que haga la chamba.

Habiendo estudiado la teoría y ejecutado los ejercicios descritos en los libros Enjoying Web Development with Tapestry, Enjoying Web Development with Wicket y el excelente artículo de IBM titulado Tapestry and Wicket compared, resulta que Wicket es un mini-me con esteroides de Tapestry; de hecho, podríamos switchear entre estos dos frameworks de acuerdo a nuestras propias necesidades o idiosincrasia de desarrollo:

• Ambos frameworks son basados en componentes, utilizando etiquetas especiales embebidas en el HTML que parsea el core engine para ligar HTML con Java (por ejemplo, usando <span wicket:id="receivedItemsPages"> en Wicket o <span jwcid="table"> para Tapestry).

• La mayor diferencia existente entre Tapestry y Wicket es el uso de páginas escritas en XML para definir los componentes: en Tapestry siempre se requieren 3 archivos para definir una página web: los html, los java y los .page que ligan aquellos dos. Con Wicket prácticamente sólo usamos un java y un html. Sin embargo, cabe mencionar que si se conocen bien los inner workings de Tapestry, el XML contenido en los archivos page es básicamente de copy + paste:

Login.html


<form jwcid="@Form" listener="ognl: listeners.formSubmit" method="POST" onSubmit="javascript:return checkForm();">
 …
 Usuario: <input type="text" style="loginfield" jwcid="usrLog@TextField" value="ognl: usrLog"/>
 …
 Password: <input type="password" style="loginfield" jwcid="usrPwd@TextField" hidden="ognl: true" value="ognl: usrPwd"/>
 …
</form>

Login.page

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE page-specification PUBLIC "-//Howard Lewis Ship//Tapestry Specification 1.3//EN" "http://tapestry.sf.net/dtd/Tapestry_1_3.dtd"&gt;

<page-specification class="my.java.package.Login">
 <context-asset name="stylesheet" path="/css/login.css"/>
</page-specification>

Login.java

package my.java.package;

public class Login extends BasePage {
  …
  /** El username introducido en la forma (usa getters y setters)*/
  private String usrLog;

  /** El password introducido en la forma (usa getters y setters)*/
  private String usrPwd;
  …
  public void formSubmit(IRequestCycle cycle) {
    try {
      SecurityDAOJDBC dao = new SecurityDAOJDBC();
      …
      UserVO user = dao.getUser(getUsrLog(), EncryptionHelper.md5(getUsrPwd()));
      …
    } catch (MyException e) { … }
    …
  }
  …
}

Los tres componentes básicos de una página web en Tapestry (versión 1.3)

En conclusión, si ya estamos hasta el queque de depurar Struts y su programación basada en eventos, podemos tratar con alguno de estos frameworks: en caso de requerir un "deportivo" de alto desempeño y por la misma razón tenemos acceso a un buen "mecánico" que le sepa meter mano al motor, Tapestry es nuestro gallo; si queremos "sacar a pasear a la familia" sin meternos en problemas podemos lanzarnos al ruedo con Wicket.

Finalmente, retomando el tema de las estadísticas "hechizas" que muestra Google Trends, ya que Tapestry tiene en general más tiempo en el mercado y posee muchas características semejantes a Wicket, me extraña que de acuerdo a esas estadísticas Tapestry ni siquiera aparece en la gráfica y Wicket sea de los frameworks más populares… ¿no habrá aquí algo de mano negra?

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: