DWR :: AJAX para Java
Publicado por Edgar González 23 Junio 2005 en AJAX, Java, JavaScript.Recientemente acabo de terminar unas pruebas usando DWR (Direct Web Remoting).
DWR es un proyecto open source (ASL 2.0) que facilita el uso de AJAX en una aplicación web basada en Java server-side.
DWR está compuesto principalmente por dos partes:
- Clases Java que permiten que código JavaScript recupere datos desde un servlet-container, usando los principios AJAX.
- Una biblioteca JavaScript que facilita al desarrollador el actualizar dinámicamente la página web con los datos recuperados desde el servlet-container.
Lo que considero más “novedoso” de DWR es que genera dinámicamente código JavaScript basado en clases Java. Esto permite al desarrollador usar código Java desde JavaScript como si este fuese local al web-browser, cuando en realidad el código Java se ejecuta en el servidor. Este enfoque es una alternativa interesante al uso de RMI o SOAP.
La “aplicación” de prueba que hice, está basada en Spring (1.2.1) , Hibernate (3.0.5) y DWR (0.8.5, al momento de escribir este post la versión más reciente es la 1.0RC1 - el proyecto está bien activo).
La aplicación muestra los datos de una tabla Oracle de forma paginada y permite visualizar el detalle de cada fila, tanto la paginación como la visualización del detalle se hace vía AJAX (la página web se actualiza dinámicamente).
Cree un bean en Spring (subclase de HibernateDaoSupport) que implementa dos métodos principales:
- Uno que realiza un query “paginado” (el query recupera de la base de datos una cantidad de datos fija, a partir de un desplazamiento). Este query es óptimo en el sentido en que solo se recuperan de la base de datos las filas necesarias, y no como hacen algunos proyectos (displayTag, ValueList, etc) que fallan cuando la tabla tiene una gran cantidad de filas, ya que por lo general estos proyectos o recuperan TODOS los datos y luego paginan este resultado o están basados en features como Scrollable Resultsets (que no siempre está disponible en el driver JDBC que se use) donde por ejemplo ir al último registro es extremadamente “costoso” en recursos, ya que igualmente se hace scroll a través de TODA la data.
- El otro método permite recuperar un objeto dado un primary key.
Luego de tener listo el bean, simplemente le indiqué a DWR que me hiciera “disponible” el bean vía JavaScript, y voilâ! , ya podia acceder desde JavaScript en mi jsp a los métodos del bean.
A DWR todavía le faltan algunas cosas (por lo menos hasta la 0.9 que fue la última que revisé) por ejemplo, no soporta la ejecución de métodos en el bean que estén definidos con parámetros que son interfaces (lo cual rompe el patrón de programar orientado a interfaces). Aunque se que ya están trabajando en ello, como dije el proyecto está bien activo.
Para detalles de la configuración de DWR es preferible revisar la documentación del proyecto.
El buzzword de DWR va creciendo, recientemente se publicó un artículo acerca de DWR en JavaWorld.

El único problema que tiene este tipo de tecnología es la compatibilidad entre browsers, lamentablemente esto hace que uno lo piense dos veces antes de usarla.
Pero efectivamente hace la interfaz mucho más amigable y rica para el usuario.
AJAX Es una promesa dorada que muchos hemos buscado hace tiempo, utilizar los estándares más simples y ligeros para poder cargar datos dinámicamente en el explorador sin preocuparse por cargar código de presentación. Muchos han querido hacer lo mismo con applets, flash y otras tecnologías. Pero todos conocemos los problemas que tiene cargar plugins, por la disponibilidad, peso y muchas otras cuestiones como por el simple hecho de que los motores de búsqueda no suelen indexar contenido inmerso en dichos formatos.
Mi preocupación es, y quiero aprovechar que ahora exista un blog dedicado a estos temas (y manejado por gente conocida), la seguridad. ¿Cómo podemos asegurarnos de que la “funcionalidad” que existe del lado cliente en JavaScript no compromete la seguridad de nuestros datos? Siempre he temido codificar funcionalidad para el navegador, incluso las validaciones me parecen más seguras en el lado servidor.
¿Alguno de ustedes sabe cuán segura sea esta implementación de AJAX?
A mi la verdad es que espero algunas cosas de AJAX, dado que no creo en las hadas, pero si en Google (copartícipe en la realización junto con Adaptative) y el horizonte pinta bien.
1. Madurez porque el horizonte promete. Que ruede un poco más, pero no por eso dejar de investigar y mantener la tónica como lo hace Edgar.
2. La asincronía, eso me preocupa, pero ya sabemos para qué son las aplicaciones Web y en que área son más potentes. Detesto comentarios como los: ¿Qué sucede si en el momento en el que se necesitan los datos se cae la red?, ¿y si se cae la base de datos?, ¿y si se estropea el cable de red?… caramba, lo mismo que con todas las aplicaciones, o es que nunca han ido a un banco esa gente y te dicen: No hay sistema.
3. Para mi, la confianza se la da gMail.
4. Lo de los navegadores con JavaScript, me preocupa menos, el js sólo hay que saberlo escribir para que funcione en todos.
Me imagino que la investigación sobre DWT nace por ser, por ahora, la única respuesta de integración con Java; porque JBuilder y Eclipse se durmieron.
—
Un tip… para desplegar listas, no se debería usar tablas puesto que hasta que todos los datos no están servidos y no se cierra [/table] no se pinta en algunos navegadores… Mejor los DIV y la presencia de respuesta rápida (sólo pintada) se agradece.
—
Un buen documento: www . uberbin . net / archivos / internet / ajax-un-nuevo-acercamiento-a-aplicaciones-web.php
—
Uno regular (los detractores frenan las buenas ideas, yo los llamo rompedores de bombillos, pero hay que leer todo y respeto a este señor por lo que sabe):
weblogs.javahispano.org / page / mperez
—
Disculpen los espacios en las URL, pero me considera un SPAMer
Estoy comenzando a ver como se utiliza DWR y me interesaria poder contar con tu aplicación ejemplo para poder ver bien como se utiza este framework.
gracias
Puedes comenzar con el sitio de DWR (http://getahead.ltd.uk/dwr/). Cuenta con una documentación bastante buena para entender y ejemplificar lo que quieras hacer. Según lo que veo la aplicación de Edgar cuenta con algunos detalles adicionales como lo es Spring + hibernate. Te recomiendo veas el sitio y después puedes integrarlo a algún desarrollo.
Saludos.
DWR, me parece una tecnología bastante interesante. Sin embargo si preocupa como se maneja el tema de seguridad en las aplicaciones desarrolladas con este framework. Podría pensarse en denegar acceso externo a los archivos js, utilizar ofuscadores de codigo para los js, u otra herramienta que permita que los archivos esten seguros, ya que desde estos se hacen las llamadas a metodos de mis clases java que accesan a la base de datos de mi aplicación. Cualquier sugerencia en cuanto a este tema de seguridad por favor postear. Saludos.
Buenas a todos.
Me parece muy interesante porque estoy con ello por mi cuenta. Mi problema es la integración de Hibernate a DWR y no puedo conseguir los datos de la base de datos.
He intentado mirarlo en la página oficial de Hibernate, he visto algo, pero no me entero de nada.
¿Podrías ayudarme? o pasarme la parte hibernate de tu proyecto ya que la parte dwr ya la entiendo un poco :)
Gracias.
Respecto al tema de la seguridad en los ficheros de configuración de DWR tu defines qué objetos y dentro de esos objetos qué métodos son accesibles vía AJAX por lo que finalmente se controla de una manera bastante cómoda la seguridad de los accesos. Pese a todo en la misma documentación oficial de DWR te sugiere que lo más pruedente es crear una capa intermedia para separar todavía más las llamadas del navegador de los objetos de negocio que puedan quedar comprometidos.
Hola a todos. Veo que sabeis bastante sobre DWR. Tengo un problemilla que no consigo solucionar. A ver si alguien me puede ayudar. Es el siguiente: desde un js desde el que realizo consultas con DWR, realizo una llamada a servidor y en la vuelta es donde realizo las distintas operaciones. Pues bien, no se porque muchas veces en la funcion de vuelta no entra. A empezado a pasarme de repente y sin motivo alguno. Estoy desarrollando con Eclipse, la jdk1.5 y con Ibatis. Si alguien le ha ocurrido algo parecido o sabe solucionarlo, le agradeceria mucho el que me ayudase.
Gracias y saludos a todos.
Asegurate de tener en el dwr.xml los converter para ese valor de retorno de esa función, supongamos que tú función regresa un objeto de Persona, tienes que mapear ese objeto como un converter.
Hola Edgar, leo tu artículo y con mucho agrado veo coincidencia con respecto a mis postjuicios sobre DisplayTag. El hecho de fallar cuando se recupera una gran cantidad de data (50000 registros), el trabajar en base a “location.href” y no a submits y el hecho de traer TODA LA DATA, son inconvenientes que uno esta obligado a subsanar pero no siempre. Me gustaría que expliques en que consiste tu query óptimo que te permite realizar dicha paginación, que contempla, que no contempla, pues estoy interesado en armar un proyecto open source que gestione ello, pero de manera general, es decir que no sea dependiente de la potencia y valor agregado de un SGBD como los de Oracle. Gracias y Saludos Cordiales,
…y obviamente soportado en base a Ajax ;) (una version con DWR para que sea facilmente integrable para los que desarrollan proyectos con Spring Framework)
dwr lo encuentr muy bueno, pero estaba tratando de hacer algo con dwr + xml+xslt y no obtengo rsultados..alguien lo ha trabajado?
Saludos a todos…
Estoy empezando en el mundo de ajax… quisiera que me ayuden con lo siguiente: deseo realizar un proyecto en Java utilizando hibernate (base de datos), spring (lógica) y ajax para la capa de presentación… según sus comentarios esto es posible, pero respecto a seguridades??? sería mas conveniente utilizar jsf o struts???
Esta aplicación es para un portal web donde se pueda manejar publicidad que puede estar en flash… no sé si exista alguna restricción con ajax para subir cosas en flash y que tán rápido puede ser…
Recuerden que estoy empezando y este es el primer blog que leo sobre ajax…
Actualmente estoy utilizando myeclipse y tiene una parte de ajax pero no sé que tan bueno o conveniente sea respecto a DWR…
Espero me puedan ayudar…
Gracias…
Saludos…
Edgar, podrias actualizar el link del ejemplo, please.
puto
Hola amigo, soy programador j2ee, y xhtml y css, estoy comenzando el mundo de ajax, y lo quiero mezclar con java, cuales son tus consejos para comenzar.
el link no funciona
Una manera que creo que es bastante rápida y fácil de implementar la seguridad en DWR, es a hacerlo de la misma manera que se haría con cualquier otro servlet, añadiendo filtros al mapeo de DWR en el web.xml de nuestro proyecto. Yo lo hago de esa manera. Así se aísla un poco la lógica de la seguridad de las clases dwr