DWR

RECU-0090 (Recurso Ficha Técnica)

Descripción

DWR (Direct Web Remoting) es una librería de código abierto que ayuda a incluir tecnología AJAX en aplicaciones web. Esta librería permite ejecutar código Java en un servidor de aplicaciones, como si este código estuviera en el navegador. DWR permitie invocar objetos Java alojados en un servidor desde el JavaScript de un navegador como si fueran objetos locales.

Esta librería cuenta con dos partes principales:

  • DWR genera dinámicamente el código JavaScript que actuará como proxy de las clases Java. Este código será el encargado de utilizar las clases Java del servidor como si fueran objetos del cliente.
  • Java es fundamentalmente síncrono mientras que Ajax es asíncrono, así que cuando se invoca un método remoto se debe proporcionar una función JavaScript de callback que será invocada cuando llegue la respuesta. El siguiente diagrama muestra como DWR puede cambiar el contenido de un combo como resultado de un evento (por ejemplo, “onclick”).

En este caso, DWR genera dinámicamente una versión JavaScript de la clase Java AjaxService. Ésta es llamada por la función eventHandler y DWR gestiona toda la interacción remota con el servidor incluyendo la conversión de tipos de datos de los parámetros entre Java y JavaScript. Cuando llega la respuesta, se invoca la función callback populateList la cual utiliza una utilidad de DWR para actualizar el contenido del combo de la página web.

Ventajas e inconvenientes

La utilización de DWR tiene asociado un conjunto de ventajas algunas de ellas implícitas por el uso de AJAX:

  • Con Ajax es posible la construcción de sitios web de manera rápida y dinámica.
  • Se utilizan los recursos de todas las máquinas clientes en lugar del servidor.
  • Ajax permite realizar procesos en la computadora cliente (con JavaScript) con datos provenientes del servidor.
  • El proceso de crear la página es realizado en el servidor antes de ser enviada a través de la red.

Sin embargo, no todo son aspectos positivos, también existen algunas desventajas:

  • Falta de soporte de JavaScript de algunos clientes (browsers)
  • Falta de soporte del objeto XMLHTTPRequest
  • La dificultad de determinar cuándo una zona o fragmento de una página ha sido actualizada mediante Ajax, producto de la navegación lineal de las páginas que realizan particularmente los usuarios con discapacidades visuales.
  • Navegadores distintos se comportan de manera distinta por lo que habrá que realizar más pruebas en la aplicación.

Además, el hecho de utilizar JavaScript hace que la aplicación pierda accesibilidad. Es posible encontrar usuarios que tengan desactivado la ejecución de scripts en sus navegadores.

Requisitos e incompatibilidades

El uso de DWR exige el cumplimiento de las siguientes restricciones:

  1. Contar con un constructor sin argumentos.
  2. No llamarse igual que palabras reservadas de JavaScript, en particular aquellas que no son reservadas en Java como por ejemplo delete.
  3. No contener métodos sobrecargados ya que no siempre funcionan bien desde JavaScript
  4. JDK 1.3 o superior.
  5. Motor de Servlet que soporte una versión de especificación 2.2 o superior. Versiones anteriores de la especificación de servlet pueden funcionar (según el caso).

Además de estas consideraciones han de tenerse en cuenta aquellas que corresponden a la utilización de la tecnología AJAX de usabilidad, tiempos de respuestas, utilización de javascript y las restricciones en los navegadores.

Si se usa la versión 1.0 hay que tener en cuenta además los siguientes entornos que provocan problemas:

  • Cuando se pone delante del servidor de aplicaciones un servidor web que altera las URLs de manera que el servidor de aplicaciones no espera.
  • Puede haber algunos problemas de ejecución con DWR en el portal de Vignette.

Interacciones

El uso de DWR permite la integración con otras herramientas de desarrollo, siempre y cuando estas herramientas funcionaran en nuestra aplicación previamente sin problemas. Los componentes con los que se ha verificado la integración de DWR son: Spring, Struts, JSF e Hibernate.