GWT

RECU-0091 (Recurso Ficha Técnica)

Descripción

Google Web Toolkit (GWT) es un framework de desarrollo en Java de código abierto, que te permite escapar de la “matriz” de tecnologías usadas actualmente para escribir aplicaciones AJAX, las cuales son difíciles de manejar y propensas a errores. Con GWT, puedes desarrollar y depurar aplicaciones AJAX usando el lenguaje de programación Java en el entorno de desarrollo de tu preferencia (nos referimos al sistema operativo y a los IDEs). Cuando la aplicación escrita en Java esta finalizada, GWT compila y traduce dicho programa a JavaScript y HTML compatible con cualquier navegador web.

El ciclo de Desarrollo de GWT sería el siguiente:

  1. Usa tu entorno de desarrollo integrado (IDE) favorito para escribir y depurar una aplicación en Java, usando las librerías GWT que necesites.
  2. Usa el compilador de Java a JavaScript de GWT para transformar tu aplicación en un conjunto de archivos JavaScript y HTML que puedes colgar en cualquier servidor y ejecutar desde un navegador web.
  3. Verifica que tus aplicaciones trabajan sobre todos y cada uno de los navegadores que consideres que tus clientes usarán. 

En GWT puedes usar componentes de interfaz de usuario llamados Widgets, para construir aplicaciones AJAX con GUIs (interfaz de usuario gráfico) atractivas. Al igual que en la mayoría de los lenguajes de programación, los componentes de la UI (interfaz de usuario) son agrupados en paneles que determinan la ubicación de los mismos. A continuación veamos una completa aplicación que utiliza un botón y un manejador de eventos:

public class Hola implements EntryPoint{
       public void onModuleLoad(){
              Button b = new Button(“Click aquí”, new ClickListener(){
              public void onClick(Widget sender){
              Window.alert(“Hola,”);
              }
              });
              RootPanel.get().add(b);
       }
}

GWT soporta una gran cantidad de widgets que son útiles en el desarrollo de aplicaciones AJAX, incluyendo árboles, pestañas, barras de menú y menús de dialogo. GWT también soporta invocación de métodos remotos (RPC) y otras características.

Existe varios productos similares a Google Web Tolkit, entre los más conocidos se encuentran:

  • jmaki
  • echo2

JMaki es un framework desarrollado por Sun para la construcción de aplicaciones web con Ajax utilizando Java como hace GWT, y además se puede usar PHP o Ruby.

Está compuesto por una serie de widgets propios y de otras librerías como Dojo, Google y Yahoo UI encapsulados para integrarlos fácilmente en tus proyectos. Para el caso de Java, los encapsula en tags de JSP y en componentes JSF. JMaki tiene plugins para NeatBeans.

Echo2 es similar a GWT, probablemente su competencia directa. Sin embargo, el enfoque de ambos es significativamente diferente. En GWT el código se ejecuta por completo en el navegador. Si necesita datos del servidor, debe pedirlos de manera explícita, implementando alguno de los mecanismos conocidos, como XML, JSON o RPC. En cambio en Echo2, el código se ejecuta por completo en el servidor, haciendo transparente la implicación de AJAX y de los ciclos HTTP, algo que ha traído un sin fín de frustraciones a quienes desarrollan con frameworks tradicionales como Struts, JSF o Tapestry. GWT argumenta a su favor, que Echo2 por cada evento agrega una latencia de Petición/Respuesta que es innecesaria en la mayoría de los casos. Por otro lado, GWT con su filosofía "Server Agnostic", no exige que el servidor esté implementado en Java, siendo posible integrarlo con lenguajes como PHP, e incluso con otros frameworks como JSF, según lo demuestra la librería de tags Gwt4Jsf. También se dice que Echo2 no es tan flexible a la hora de implementar componentes personalizados.

Hay que destacar, sin embargo, que Echo2 es una tecnología muy joven, con un futuro prometedor,que aún no ha explotado todas sus posibilidades.

Se distribuye gratuitamente bajo licencia Mozilla (o LGPL).

Requisitos e incompatibilidades

Requisitos

Procedemos a describir algunas especificaciones que requiere el compilador de Google Web Toolkit:

Soporte de lenguaje Java

Google Web Toolkit compila el código de Java que es compatible con J2SE 1.4.2.

  • Tipos de datos nativos: byte, char, short, int, long, float, double, Object, String, y arreglos son soportados. Sin embargo, no existen tipos integrales de 64-bit integral en JavaScript, así que las variables de tipo long son mapeadas a variables de coma flotante en JavaScript. Para asegurar la máxima consistencia entre el “modo hosted” y el “modo web”, se recomienda que se usen variables tipo int.
  • Excepciones: try, catch, finally y excepciones definidas por el usuario son soportadas normalmente, aunque Throwable.getStackTrace() no es soportada por el modo web.
  • Sentencia assert: El compilador Google Web Toolkit parséa las sentencias assert, pero no emite código JavaScript para ellas.
  • Multi-hilado (subprocesamiento múltiple) y sincronización: Los intérpretes de JavaScript usan single-threaded (uso de hilos simple), así que cuando Google Web Toolkit acepta la palabra synchronized, en realidad esto NO tiene ningún efecto sobre la aplicación final. Los métodos de las librerías de sincronización no están disponibles, incluyendo Object.wait(), Object.notify(), y Object.notifyAll().
  • Reflexión: Para un mejor desempeño, Google Web Toolkit compila tu código Java dentro de un script monolítico, y no soporta la carga subsecuente de clases. Ésta y otras optimizaciones excluyen el soporte general para la reflexión. Es posible consultar el nombre de clase de un objeto usando el método Google Web Toolkit.getTypeName(Object).
  • Finalización (recolección de basura): JavaScript no soporta finalización durante la recolección de basura, así que Google Web Toolkit no puede usar nada similar a los finalizadores de Java (una de las principales características de este lenguaje) en modo web.
  • Strict Floating-Point: La especificación del lenguaje de programación Java soporta variables de punto flotante (floating-point), incluyendo números de single-precisión y double-precisión así como también la palabra reservada strictfp. Google Web Toolkit no tiene soporte para la palabra strictfp y no puede asegurar cualquier grado de precisión de punto flotante en el código traducido, así que lo mejor que puedes hacer es evitar en lo posible el uso de cálculos en el lado del cliente (en el navegador) que requieran un nivel alto de precisión.

El compilador de Google Web Toolkit

Google Web Toolkit soporta solamente una pequeña parte de las librerías de clases disponibles en Java 2 Standar Edition y Enterprise Edition, esto sucede ya que éstas librerías son bastante grandes y usan funcionalidades que no están disponibles en navegadores web. Para enterarse completamente de qué clases y métodos son soportados por el núcleo de paquetes Java, ver la referencia del API para java.lang y java.util, en donde se listan las clases a las que se les dio soporte y contiene notas acerca de las diferencias entre lo soportado y el estándar de Java. Algunas áreas específicas en las que la emulación Google Web Toolkit difiere desde el estándar de Java son:

  • Expresiones regulares: La sintaxis para expresiones regulares en Java es similar, pero no idéntico, a las expresiones regulares en JavaScript. Por ejemplo, los métodos replaceAll y split usan expresiones regulares. Así que, es aconsejable ser cuidadoso al usar expresiones regulares que tienen el mismo significado tanto en Java como en JavaScript.
  • Serialización: La serialización Java requiere de unos cuantos mecanismos que no están disponibles en JavaScript, como por ejemplo el cargar dinámicamente clases y la reflexión. Por consiguiente, Google Web Toolkit no soporta el estándar de serialización de Java. En lugar de eso, Google Web Toolkit tiene una facilidad de soporte para RPC, que provee serialización automática de objetos desde y hacia el servidor usando invocación de métodos remotos.

Limitaciones

Hasta el momento y la versión actual del compilador GWT, sólo se puede compilar un subconjunto del API disponible en Java aunque suele ser más que suficiente para el tipo de aplicaciones que vamos a desarrollar.

Para las clases cliente, estaremos limitados a usar los paquetes "java.lang." y "java.util." además de los propios de GWT (com.google.gwt.user.client.).

El compilador especial que incluye GWT no soporta caracteres especiales (vocales acentuadas, etc.) a menos que los ficheros fuente se encuentren codificados usando UTF-8. Se recomienda por tanto usar editores que soporten este tipo de codificación. Esta limitación es sólo para los ficheros compilados por el compilador GWT, es decir, los del lado cliente.

GWT impone los siguientes tipos:

  • Tipos primitivos
  • Clases String y java.util.Date
  • Clases que implementan la interfaz isSerializable y cuyos campos no transient sean a su vez serializables.
  • Array de tipos de los anteriores

Interacciones

Entornos de Desarrollo

El primer paso en el ciclo de desarrollo de GWT es la implementación de la aplicación Java correspondiente, usando entornos de desarrollo integrados (IDE), y la depuración de dicha aplicación usando las librerías GWT que sean necesarias. En este punto se pueden usar un amplio abanico de entornos de desarrollo integrados. A continuación presentamos algunos conocidos y bastante extendidos:

  • NetBeans: plataforma para el desarrollo de aplicaciones de escritorio usando Java. Permite que las aplicaciones sean desarrolladas a partir de un conjunto de componentes de software llamados módulos.
  • Eclipse: es una plataforma de software de código abierto independiente de una plataforma para desarrollar lo que el proyecto llama "Aplicaciones de Cliente Enriquecido", opuesto a las aplicaciones "Cliente-liviano" basadas en navegadores. Esta plataforma, típicamente ha sido usada para desarrollar entornos integrados de desarrollo (IDE), como el IDE de Java llamado Java Development Toolkit (JDT)
  • JDeveloper: Entorno integrado de desarrollo desarrollado por Oracle Corporation para lenguaje Java, HTML, XML, SQL, PL/SQL, JavaScript y otros.
  • JDK (Java Development Kit): compilador y conjunto de herramientas de desarrollo para la creación de programas independientes y applets java.
  • Gwt4nb: es un plugin para NetBeans, que nos permite desarrollar proyectos GWT dentro del IDE.
  • GWT+Designer: un plugin para Eclipse que permite la creación de aplicaciones Web con tecnología AJAX a través de la utilización de Google Web Toolkit. Su fortaleza, radica en lo fácil que es utilizarlo al poder arrastrar los componentes dentro de un área de diseño visual y en donde esta herramienta se encarga de escribir el código que corresponde. Además, se puede escribir el código manualmente y esta herramienta se encarga de actualizar el área de diseño. Con GWT Designer, se puede usar el diseñador visual y éste generará el código Java. Permite depurar la parte cliente y servidor de la aplicación como si fuera una aplicación swing/swt stand-alone, en "hosted mode", a una velocidad espectacular desde la versión 1.2.

Versiones

A partir de la versión 1.3, el Google Web Toolkit está liberado bajo la licencia Apache 2.0. La versión 1.4 está considerada como la más actualizada debido a que corrige errores de versiones precedentes. Con respecto a la versión 1.3 agrega las siguientes funcionalidades y mejoras:

Tamaño y velocidad de optimizaciones

  • Nueva mejora del tamaño en el compilador de GWT, el cual reduce el código JavaScript en un 10-20%; sólo es necesario recompilar tu aplicación con la versión 1.4.
  • Una mayor secuencia de arranque reduce el tamaño de tu modulo de script de inicio en un 80%. Lo que es más importante, la nueva secuencia de inicio elimina un envío de ida y vuelta en HTTP, haciendo la latencia de inicio un 33% más rápida aproximadamente.
  • Las anteriores optimizaciones combinadas con ImageBundle, hacen posible que las aplicaciones basadas en GWT puedan cargarse a una velocidad sorprendente.

Despliegue de mejoras

  • GWT RPC ya no está atado exclusivamente a los servlets. El nuevo servidor de código modular RPC hace que sea más fácil conectar GWT RPC a la función Java del servidor que necesitemos.
  • Añadir módulos de GWT a una página en HTML se ha simplificado. En lugar de añadir un
<meta name='gwt:module'> y <script src='gwt.js'>

sólo tienes que añadir un único script para tu módulo.

  • La inclusión de script de secuencia de comandos entre sitios está ahora soportado. El compilador produce una versión “-xs” (que significa una secuencia de comandos entre sitios) de tu script del módulo de inicio que puede ser incluida sin restricciones por la misma política de origen. CUIDADO: incluir scripts de otros sitios que no sean de confianza puede conllevar un riesgo de seguridad.

Widget y mejoras en la librería

  • RichTextArea permite la edición de texto con más características.
  • SuggestBox hace fácil añadir la funcionalidad de autocompletado.
  • Separadores (splitters). HorizontalSplitPanel y VerticalSplitPanel permiten cambiar el tamaño de porciones de la interfaz de usuario.
  • PushButton y ToggleButton permiten personalizar de manera fácil botones widgets que pueden mejorar el aspecto de su interfaz de usuario.
  • DisclosurePanel es un panel sencillo que permite a los usuarios fácilmente ocultar y mostrar partes de la interfaz de usuario de su aplicación.
  • DateTimeFormat y NumberFormat facilita el formato y el análisis de fechas, horas y números de usuarios de todo el mundo.
  • IncrementalCommand ayuda a implementar tareas de larga duración en tu código cliente sin que genere warnings de script de larga duración.
  • Un nuevo subsistema benchmarking integrado con JUnit permite registrar y comparar la velocidad de los fragmentos de código en múltiples navegadores y múltiples rangos de parámetros. Benchmarking (“evaluación comparativa”) es una herramienta eficaz para identificar los cuellos de botella y comparar el rendimiento de otras implementaciones.
  • Ahora java.io.Serializable está incluida en la emulación de biblioteca de JRE y es sinónimo de IsSerializable.
  • Los eventos de rueda del ratón están ahora disponibles en una variedad de widgets.

ImageBundle

  • ImageBundle es la única gran característica en esta liberación. Los paquetes de imagen hacen que sea fácil de combinar docenas de imágenes en una sola franja de imagen, colapsando docenas de peticiones de HTTP en una sola: un solo archivo de imágen permanentemente cacheable.
  • Los paquetes de imagen lo dirigen todo automáticamente por ti, desde recortes de rectángulos para hacer imágenes transparentes PNG en IE6. Incluso puedes optar por obtener el recortado de imagen como un widget Image o como HTML.
  • Además de permitir un inicio rápido, los paquetes de imagen dan una apariencia mejor a la interfaz de usuario. Las dimensiones de cada imagen recortada se calcula en tiempo de compilación mientras que el paquete de archivo de cada imagen se está creando.