Vous êtes sur la page 1sur 19

DWR (Direct Web Remoting)es una librería Javascript que permite el uso de Ajax (Asynchronous

JavaScript and XML) de forma mucho más simple (Este artículo asume que se entiende los conceptos
de Ajax, y de Java).
DWR es una librería mas orientada a apoyar la integración, que a apoyar la parte gráfica, de hecho si se
buscan Widgets (objetos gráficos) esta no es la librería, pero por otro lado lo fuerte de DWR es que
permite “publicar” fácilmente funcionalidad de clases Java para accederlas vía Javascript.
Luego si nuestra funcionalidad o lógica de negocio esta en Java, DWR es una de la mejores opciones
para aprovecharla, ya que usar una clase Java que tenemos en un servidor de aplicaciones vía Javascript
es tan fácil como definir un archivo de configuración en el servidor.
Ahora si se requiere además darle una interfaz más rica (rich interface) a los usuarios, es bueno
combinar DWR con otras librerías Ajax como YUI (Yahoo User Interface), JQuery, Prototype,
Scriptaculous, Dojo, o Spry.
Con Ajax se terminan las paginas JSP, o ASP (o deberían terminarse), porque Ajax solo necesita
Javascript y HTML para la parte de presentación, esto lo explicaremos mejor en otro articulo, pero por
ahora créannos. Y con DWR ni siquiera son necesarios los Servlets, esto en el sentido de que no se
necesitan desarrollar servlets para implementar la lógica de negocio, porque DWR si internamente esta
basado en Servlets, en otras palabras gracias a DWR no necesitamos implementar nuestros servlets sino
solo necesitamos clases Java (POJO).
Si se conoce la tecnología Axis, que permite publicar clases Java como Webservices, este es el símil
para publicar clases Java como objetos Ajax (objetos Javascripts), de hecho es muy fácil publicar con
DWR un servicio realizado para Axis. Incluso las buenas prácticas o blueprints de Axis para publicar
clases como Webservices se aplican totalmente para publicar clases para Ajax., ya que hay que tener
los mismos cuidados en cuanto a seguridad y manejo de desempeño (performance).
La definición oficial de DWR es:
DWR permite a Javascript (en un Browser) interactuar con las clases Java en un Servidor, y
ayuda a manipular las paginas Web con los resultados.
Si, porque otra característica importante de DWR es que ofrece funcionalidades Javascript que
permiten fácilmente manipular el HTML de la página: como obtener los datos de un formulario
(HTML Form), o de cualquier otro tag HTML, o setear fácilmente los valores de los tags
HTML, ademas aporta facilidades para clonar tags, lo que permite por ejemplo crear nuevas
filas (rows) en una tabla (HTML Table), muy útil para mostrar una consulta. DWR no nos
provee ningun objeto grafico prehecho, pero si nos permite la flexibilidad para hacer cualquier
cosa con el HTML.
Bueno basta de conceptos y vamos directo al código.
Hemos llamado a este tutorial “el Mejor”, solo para llamar su atención, pero la verdad es que es
bastante bueno, por lo siguiente:
 Es lo mas simple posible, tiene lo justo y necesario para entender el concepto principal de
DWR, y como funciona.
 Esta actualizado, otros ejemplos están basados en versiones anteriores de DWR.
 Esta completo, otros ejemplo ponen solo parte del código.
 Usa clases y colecciones de clases (Collection) como parámetros de entrada y parámetros de
salida, que es lo que típicamente se va a usar en un sistema real, otros ejemplos usan datos más
básicos. De esta forma también se muestra como se manejan las colecciones y las clases en
Javascript.

Tutorial DWR en 10 Simples Pasos


1. Lo primero es bajar DWR (http://getahead.org/dwr/download), basta bajar solo la librería
(dwr.jar).
2. Luego hay que modificar el archivo “web.xml”, este se encuentra bajo el directorio “WEB-
INF”, ejemplo: ”\dwrEasy\WEB-INF”, se debe incluir las definiciones de los servlets que
atienden los requerimientos DWR-AJAX.
Web.xml:
view sourceprint?
01.< ?xml version="1.0" encoding="UTF-8"?>
02.< !DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web
Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
03.<web_app>
04. <display_name>dwrEasy</display_name>
05. <servlet>
06. <servlet_name>dwr-invoker</servlet_name>
07. <display_name>DWR Servlet</display_name>
08. <description>Direct Web Remoter Servlet</description>
09. <servlet_class>org.directwebremoting.servlet.DwrServlet</se
rvlet_class>
10. <init_param>
11. <param_name>debug</param_name>
12. <param_value>true</param_value>
13. </init_param>
14. </servlet>
15. <servlet_mapping>
16. <servlet_name>dwr-invoker</servlet_name>
17. <url_pattern>/dwr/*</url_pattern>
18. </servlet_mapping>
19.</web_app>
3. A continuación se debe implementar la clase Java que va a ofrecer los servicios, esta basta que
sea un clase Java simple (POJO), con un constructor sin parámetros, y donde cada método de la
clase es un “potencial” servicio Ajax.
Esta clase va a estar del lado del servidor de aplicaciones (ejemplo: Tomcat, JBoss, o
Websphere) no necesariamente tiene que ser un servidor J2EE.
EasyService.java:
view sourceprint?
01.package com.soaagenda.services;
02.
03.import com.soaagenda.valueobjects.*;
04.
05.public class EasyService {
06. public EasyService() {
07. }
08.
09. public EasyResponse getProducts(EasyParameter parametersX){
10. EasyResponse responseX= new EasyResponse();
11.
12. // si parametros vacios devuelve error, error if
empty parameters
13. if (parametersX==null ||
parametersX.getClientID()==null ||
parametersX.getClientID().length()< =0){
14. responseX.setErrorCode(10001);
15. responseX.setErrorDescription("Debe indicar
ID Cliente. Give us Client ID");
16. return responseX;
17. }
18.
19. //crea lista productos del cliente, fill the client
product list
20. //para ejemplo en duro, for the example fixed data
21. Product[] productsListX= new Product[2];
22.
23. Product productX= new Product();
24. productX.setBarCode("0001");
25. productX.setName("Tarjeta Visa, Visa Credit Card");
26. productsListX[0]= productX;
27.
28. productX= new Product();
29. productX.setBarCode("0002");
30. productX.setName("Tarjeta American Express, American
Express Credit Card");
31. productsListX[1]= productX;
32.
33. //respuesta exitosa, sucessfull response
34. responseX.setErrorCode(0);
35. responseX.setErrorDescription("Consulta Banco
Exitosa, Succesfull Bank Query");
36. responseX.setProducts(productsListX);
37.
38. return responseX;
39. }
40.}
Este ejemplo simula una consulta de los productos bancarios de un cliente como Tarjetas de
Crédito (VISA, Master Card, Dinners, American Express), Cuentas Corrientes, o Creditos de
Consumo, para esto se le pasa como parámetro un objeto que tiene el ID del cliente, y el tipo de
producto a consultar, el servicio (o método) devuelve otra clase con el código de error, mensaje
de error, y la lista de productos (un arreglo de clases producto).
4. También hay que definir las clases de datos (Value Objects) que va a utilizar el servicio,
esta clases deben ser javabeans (atributo privados, con getters y setters):
EasyParameter.java: define los parámetros de entrada del servicio.
view sourceprint?
01.package com.soaagenda.valueobjects;
02.
03.public class EasyParameter {
04. private String clientID;
05. private String productType;
06. public EasyParameter() {
07. }
08.
09. public void setClientID(String clientID) {
10. this.clientID = clientID;
11. }
12.
13. public void setProductType(String productType) {
14. this.productType = productType;
15. }
16.
17. public String getClientID() {
18. return clientID;
19. }
20.
21. public String getProductType() {
22. return productType;
23. }
24.}
EasyResponse.java: define la estructura para los resultados del servicio.
view sourceprint?
01.package com.soaagenda.valueobjects;
02.
03.public class EasyResponse {
04. private int errorCode;
05. private String errorDescription;
06. private Product[] products;
07.
08. public EasyResponse() {
09. }
10.
11. public void setErrorCode(int errorCode) {
12. this.errorCode = errorCode;
13. }
14.
15. public void setErrorDescription(String errorDescription) {
16. this.errorDescription = errorDescription;
17. }
18.
19. public void setProducts(Product[] products) {
20. this.products = products;
21. }
22.
23. public int getErrorCode() {
24. return errorCode;
25. }
26.
27. public String getErrorDescription() {
28. return errorDescription;
29. }
30.
31. public Product[] getProducts() {
32. return products;
33. }
34.}
Product.java: define la estructura de un producto.
view sourceprint?
01.package com.soaagenda.valueobjects;
02.
03.public class Product {
04. private String barCode;
05. private String name;
06. public Product() {
07. try {
08. jbInit();
09. } catch (Exception ex) {
10. ex.printStackTrace();
11. }
12. }
13.
14. private void jbInit() throws Exception {
15. }
16.
17. public void setBarCode(String barCode) {
18. this.barCode = barCode;
19. }
20.
21. public void setName(String name) {
22. this.name = name;
23. }
24.
25. public String getBarCode() {
26. return barCode;
27. }
28.
29. public String getName() {
30. return name;
31. }
32.}
5. Vamos a indicarle a DWR que clases vamos a publicar para Javascript (Ajax), esto se hace en el
archivo “dwr.xml”, y también corresponde a un esquema de seguridad porque podemos llegar a
especificar solo que métodos de una clase queremos exponer, y que atributos.
Para nuestro ejemplo vamos a publicar toda la clase servicio
(com.soaagenda.services.EasyService), es decir todos sus métodos, y todas las clases de datos
(com.soaagenda.valueobjects.*).
dwr.xml
view sourceprint?
01.< ?xml version="1.0" encoding="UTF-8"?>
02.< !DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web
Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">
03.<dwr>
04. <allow>
05. <!-- define la clase de servicios que se va a publicar
mediante DWR -->
06. <!-- defines the service class to share across DWR -->
07. <create creator="new" javascript="EasyService">
08. <param name="class"
value="com.soaagenda.services.EasyService"/>
09. </create>
10. <!-- define las clases de datos que utiliza el servicio -->
11. <!-- defines the data classes to share across DWR -->
12. <convert converter="bean"
match="com.soaagenda.valueobjects.*"/>
13. </allow>
14.</dwr>
6. Ahora si compilamos las clases, y publicamos nuestro ejemplo Web (deploy), DWR nos presta
una utilidad para probar que todo anda bien, esta se accede desde un Browser, en el path
“/dwr/”, dentro de nuestro sitio (ejemplo: http://localhost:8028/dwrEasy/dwr/)

Seleccionado el servicio, nos aparece primero las librerías javascript necesarias para implementar una
pagina Web, luego la lista de servicios (métodos de las clase servicio) a los que tenemos acceso
(getProducts).

Como no restringimos los métodos de la clase, incluso nos aparecen los métodos que hereda por
ser una clase Java (como hashCode, getClass).
Si presionamos el botón “Execute”, ejecuta el servicio, y para el caso de nuestro ejemplo este
retorna un error “Debe indicar ID Cliente”, lo que esta bien porque no le hemos indicado
parámetros de entrada, con esto sabemos que todo anda bien, porque esa respuesta la da nuestra
clase que esta en el servidor, es decir, ejecutamos desde Javascript (Browser) una clase que esta
del lado del servidor, eso es Ajax y DWR!!.
7. Lo siguiente es crear nuestra pagina HTML que va a consultar los resultados y mostrarlos, esta
pagina es sumamente simple, tiene un formulario (Html Form), en realidad solo tiene las
variables del form, porque ya no es necesario el tag “<form>” (recuerden que con Ajax la forma
de hacer request al Server cambia, ahora es asíncrona), y tiene una tabla (html table) para
mostrar el resultado.

dwrEasyPage.html
view sourceprint?
01.< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
02.<html xmlns="http://www.w3.org/1999/xhtml">
03.<head>
04. <title>Editable Table Demo</title>
05. <meta http-equiv="Content-Type" content="text/html; charset=us-
ascii" />
06. <script type='text/javascript'
src='/dwrEasy/dwr/interface/EasyService.js'></script>
07. <script type='text/javascript'
src='/dwrEasy/dwr/engine.js'></script>
08. <script type='text/javascript' src='/dwrEasy/dwr/util.js'>
</script>
09. <script type="text/javascript" src='dwrEasyJS.js'> </script>
10.</head>
11.
12.<body>
13.<h1>Easy DRW Demo</h1>
14. <h3>Buscar / Search</h3>
15.
16. <table>
17. <tr>
18. <td>ID Cliente / Client ID:</td>
19. <td><input name="formClientID" type="text"
id="formClientID" size="15"/></td>
20. </tr>
21. <tr>
22. <td>Tipo Producto / Product Type</td>
23. <td><input name="formProductType" type="text"
id="formProductType" size="15"/></td>
24. </tr>
25. <tr>
26. <td colspan="2" align="right">
27. <input type="button" value="OK"
onclick="javascript:submitProductsRequest()"/>
28. </td>
29. </tr>
30. </table>
31.
32. <h3>Productos / Products</h3>
33. <p>Respuesta / Response:
34. <input name="serviceResponse" type="text"
id="serviceResponse" size="50"/>
35. </p>
36.
37. <table border="1">
38. <thead>
39. <tr>
40. <th>Codigo / BarCode</th>
41. <th>Nombre / Name</th>
42. </tr>
43. </thead>
44. <tbody id="myTable">
45. <tr id="myPattern" style="display:none">
46. <td>
47. <span id="codePattern">code
example</span></td>
48. <td>
49. <span id="namePattern">name
example</span></td>
50. </tr>
51. </tbody>
52. </table>
53.</body>
54.</html>
Si analizamos el código, lo primero es la referencia a las librerías Javascript (“EasyService.js”,
“engine.js”, “util.js”), estas fueron generadas por DWR, luego aparece la librería
(“dwrEasyJS.js”) que ya es propietaria (custom), y que debemos construir para realizar la lógica
de interacción (esta redescribe a continuación).
Luego aparecen las variables del formulario a solicitar (formClientID, formProductType), y el
botón que define la acción de consulta, ejecuta la función Javascript “javascript:
submitProductsRequest()”, esta funcion es la que se encuentra definida en la librería
(“dwrEasyJS.js), la cual vamos a tener que contruir.
Después viene la tabla que mostrará los datos (myTable).
Podemos ver que hay ciertas características especiales en el código Html, estas le van a servir a
DWR para encontrar donde obtener, o donde mostrar los datos:
Los “Id” de los tags html le sirven a DWR para manejar los datos:
· Los id “formClientID”, “formProductType” le permiten encontrar loas parámetros de
entrada.
· El id “myTable”, le servirá para saber que tabla limpiar.
· El id “myPattern”, le indicará a DWR que filas (rows) debe “clonar” para mostrar cada
registro de producto de la lista, como es un “patrón” en principio va oculto
(style=”display:none”).
· Los id “codePattern”, “namePattern” servirán para qeu DWR sepa donde colocar los datos
de cada producto, en este caso se usan tags “<span>”.
Como vemos esta pagina es solo Html, y Javascript, que “hermosamente simple”, nada de JSP,
ni de ASP, una pagina que se puede publicar en cualquier servidor Web.
8. Lo que sigue es la librería Javascript propia.
dwrEasyJS.js
view sourceprint?
01.function submitProductsRequest() {
02. var idX=dwr.util.getValue("formClientID");
03. var typeX=dwr.util.getValue("formProductType");
04.
05. var parametersX={clientID:idX,productType:typeX};
06.
07. EasyService.getProducts(parametersX,showProducts);
08.
09. }
10.
11.function showProducts(responseX) {
12.
13.// borro filas excepto el patron, delete rows except pattern row
14. dwr.util.removeAllRows("myTable",
{ filter:function(tr) { return (tr.id != "myPattern");}});
15.
16. if (responseX.errorCode!=0){
17. alert('Error: '+responseX.errorDescription);
18. return;
19. };
20. var productsX=responseX.products;
21. var lengthX=productsX.length;
22. var itemProductX;
23.
24. if (lengthX==0){
25. alert('No hay productos, Cant find products');
26. return;
27. };
28.
29. dwr.util.setValue("serviceResponse",
responseX.errorDescription);
30.
31. var id="00";
32. for (var i=0 ; i<lengthx ; i++)
33. {
34. temProductX= productsX[i];
35. id="00"+i;
36. dwr.util.cloneNode("myPattern",
{ idSuffix:id });
37. dwr.util.setValue("codePattern" + id,
itemProductX.barCode);
38. dwr.util.setValue("namePattern" + id,
itemProductX.name);
39. $("myPattern" + id).style.display = "";
40. }
41.}
9. Esta librería tiene dos funciones: “submitProductsRequest” la que obtiene los parámetros de
entrada y ejecuta el servicio correspondiente (clase Java EasyService.getProducts() vía DWR),
y la función que muestra los datos (showProducts).
Finalmente hay que subir las páginas (Deploy) en el sitio Web, quedando el proyecto con la
siguiente estructura:

.
Ejecutamos la pagina de prueba “dwrEasyPage” en nuestro Browser (ejemplo
“http://localhost:8028/dwrEasy/dwrEasyPage.html”), ponemos un dato en “ID Cliente”,
presionamos “OK”, y listo!, nuestra primera aplicación Ajax-DWR.
10.

cientemente 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.

19 Respuestas a “DWR :: AJAX para Java”


Canal RSS de esta entrada
1. 1 Efrén 23 Jun, 2005 a 2:13 pm
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.
2. 2 multivak 25 Jun, 2005 a 8:26 pm
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?
3. 3 okickoff 28 Jun, 2005 a 1:39 pm
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
4. 4 Ivan 28 Abr, 2006 a 11:47 am
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
5. 5 PiloMaC )ªWºl!d 5 May, 2006 a 10:28 am
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.
6. 6 Andres 22 May, 2006 a 9:57 am
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.
7. 7 Agustin 7 Jul, 2006 a 4:36 am
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.
8. 8 vk 21 Nov, 2006 a 12:56 pm
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.
9. 9 Eduardo 7 Dic, 2006 a 6:47 am
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.
10.10 Efrén 8 Dic, 2006 a 1:58 pm
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.
11.11 Richard 23 Ene, 2007 a 7:00 pm
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,
12.12 Richard 23 Ene, 2007 a 7:03 pm
…y obviamente soportado en base a Ajax ;) (una version con DWR para que sea facilmente
integrable para los que desarrollan proyectos con Spring Framework)
13.13 rodrigo 22 May, 2007 a 11:34 am
dwr lo encuentr muy bueno, pero estaba tratando de hacer algo con dwr + xml+xslt y no
obtengo rsultados..alguien lo ha trabajado?
14.14 Sandy 1 Ago, 2007 a 1:26 pm
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…
15.15 Sol 27 Ago, 2007 a 7:11 pm
Saludos…
Edgar, podrias actualizar el link del ejemplo, please.
16.16 ja 15 Oct, 2007 a 3:34 pm
puto
17.17 Christopher 30 Nov, 2007 a 2:49 am
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.
18.18 sandra 22 Ene, 2008 a 8:58 am
el link no funciona
19.19 roberto 12 Jun, 2008 a 6:59 am
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
Direct Web Remoting Direct Web Remoting
[ DWR | Blog ] [ DWR | blog ]

Google

DWR - Easy Ajax for JAVA DWR - Ajax fácil para Java

Direct Web Remoting


Direct Web Remoting
DWR is a Java library that enables Java on the
server and JavaScript in a browser to interact
and call each other as simply as possible. DWR
es una biblioteca Java que permite a Java en el
servidor y JavaScript en un navegador para
interactuar y comunicarse entre sí lo más
simple posible.

DWR is Easy Ajax for Java DWR es fácil


para el Ajax de Java

DWR version 3.0.rc1 is the most recent development release. DWR version 2.0 is the current stable
release. Download them now and use DWR in your website in minutes . versión 3.0.rc1 DWR es el
desarrollo más reciente lanzamiento. DWR la versión 2.0 es la versión estable actual. Descárgalos
ahora y el uso de DWR en su sitio web en cuestión de minutos .

DWR will generate the JavaScript to allow web browsers to securely call into Java code almost as if
it was running locally. DWR generará el JavaScript para permitir a los navegadores web para llamar
de forma segura en el código Java como si se ejecutan localmente. It can marshal virtually any data
including collections, POJOs, XML and binary data like images and PDF files. Puede mariscal
prácticamente todos los datos, incluidas las colecciones, POJOs, XML y datos binarios como
imágenes y archivos PDF. All that is required is a security policy that defines what is allowed. Todo lo
que se requiere es una política de seguridad que define lo que está permitido.
With Reverse Ajax , DWR allows Java code running on a server to use client side APIs to publish
updates to arbitrary groups of browsers. Con inversa Ajax, DWR permite al código Java se ejecuta en
un servidor para utilizar las API de cliente de lado la publicación de cambios a grupos arbitrarios de los
navegadores. This allows interaction 2 ways - browser calling server and server calling browser .
Esto permite la interacción dos formas - servidor y servidor llamando llamando navegador
navegador. DWR supports Comet, Polling and Piggyback (sending data in with normal requests) as
ways to publish to browsers. DWR soporta Comet, votación y Piggyback (envío de datos en las
solicitudes normales) como medios para publicar en los navegadores.
DWR provides integration with Spring , Struts , Guice , Hibernate and others. DWR proporciona
integración con la primavera , Struts , Guice , Hibernate y otros.
DWR is Open Source, available under the Apache Software License v2 . DWR es de código abierto,
disponible bajo la licencia de software Apache v2 .

We would like to thank ... Nos gustaría dar las gracias ...
YourKit YourKit
YourKit is kindly supporting open source projects with its full-featured Java Profiler. YourKit es
amable apoyo a los proyectos de código abierto con todas las funciones de perfiles Java. YourKit, LLC
is the creator of innovative and intelligent tools for profiling Java and .NET applications. YourKit, LLC
es el creador de herramientas innovadoras e inteligentes para crear perfiles de aplicaciones Java y.
NET. Take a look at YourKit's leading software products: YourKit Java Profiler and YourKit .NET
Profiler . Echa un vistazo a los productos de software líderes de YourKit: YourKit Java Profiler y
Profiler YourKit NET. .

Atlassian Atlassian

Descargar DWR
The following download packages are available. Los paquetes de descarga están disponibles las
siguientes. If you are just getting started with DWR, the JAR download is probably the best place to
start. Si se acaba de empezar con DWR, la descarga JAR es probablemente el mejor lugar para
empezar. See the Getting Started Guide for instructions as to what to do with these downloads.
Consulte la Guía de inicio rápido para obtener instrucciones sobre qué hacer con estas descargas.
If you are upgrading from a previous version of DWR then you should read the upgrading instructions.
Si va a actualizar desde una versión anterior de DWR entonces usted debe leer la mejora de las
instrucciones.

Development Release: Version 3 release candidate 1 Desarrollo


de Publicación: La versión 3 release candidate 1
DWR version 3 is under heavy development. DWR versión 3 está en desarrollo pesados. This is the
current best version of DWR. Esta es la versión más actual del DWR.
Download
Version 3.rc1 Versión 3.rc1 Notes Notas
Descargar
JAR File : JAR To DWR enable your web-app Para DWR
dwr.jar (1.08Mb) dwr.jar (1.08MB)
Archivo: permitirá a su web-app
WAR File : Archivo dwr.war (4.62Mb) dwr.war (4.62Mb) Demos/Examples of what DWR can do
Demos / Ejemplos de lo que puede hacer
WAR:
DWR
dwr-3.0.0.116.rc1-src.zip (71Mb) See also the sources from SVN Ver también
Sources : Fuentes:
DWR-3.0.0.116.rc1-src.zip (71MB) las fuentes de SVN
Non-CLA JAR : No dwr-noncla.jar (15.8kb) DWR- Code that we don't have a CLA for El
CLA JAR: noncla.jar (15.8kb) código que no tenemos un CLA para

Stable Release: Version 2.0.6 Estable de Publicación: Versión


2.0.6
DWR 2.0.6 includes Reverse Ajax and a large number of other enhancements. DWR 2.0.6 incluye
inversa Ajax y un gran número de otras mejoras. For details of the changes see the release notes for
version 2 . Para obtener información detallada de los cambios ver la notas de la versión para la versión
2.
Download Descargar Version 2.0.6 Versión 2.0.6 Size Tamaño
JAR File : JAR Archivo: dwr.jar dwr.jar (491Kb) (491kb)
WAR File : Archivo WAR: dwr.war dwr.war (2.14Mb) (2.14Mb)
Sources : Fuentes: dwr-2.0.6-src.zip DWR-2.0.6-src.zip (20.39Mb) (20.39Mb)

Continuous Integration Builds - Bamboo La integración


continua Construye - Bamboo
You may also access our continuous integration builds which contain the latest code from our
development repository. También puede acceder a nuestra integración continua se basa que contienen
el código más reciente de nuestro repositorio de desarrollo. To get the latest development build
(snapshot) please visit bamboo . Para conseguir el desarrollo más reciente construcción (foto), por
favor visite el bambú .

Other Downloads Otras Descargas


For more archives, or if these links don't work then you can go directly to the download pages at
java.net . Para obtener más archivos, o si estos enlaces no funciona, entonces usted puede ir
directamente a las páginas de descarga en java.net . These pages also contain detail on the release dates
of the various versions. Estas páginas también contienen detalles sobre las fechas de lanzamiento de las
diferentes versiones.

Documentación Índice
On this site, there are a number of documents to help you get started with DWR: En este sitio, hay una
serie de documentos que le ayudarán a empezar a trabajar con DWR:
• The overview of what DWR does . La visión general de lo que se DWR .
• A basic getting started guide (Your first DWR page). Una base para empezar guía (página Sus
DWR primero).
• An introduction to writing JavaScript that calls DWR (Your second DWR page). Una
introducción a la escritura de JavaScript que llama a DWR (página Sus DWR segundo).
• Some examples to demonstrate basic functionality. Algunos ejemplos para demostrar la
funcionalidad básica.
• A page containing answers to common questions pulled from our mailing list . Una página que
contiene respuestas a preguntas comunes extraídos de nuestra lista de correo .
• A list of troubleshooting advice and common errors and how to fix them . Una lista de consejos
para solucionar problemas y errores comunes y cómo solucionarlos .
Outside of this site there is a growing collection of tutorials from around the web . Fuera de este sitio
existe una creciente colección de tutoriales de todo la web .

Configuring the Server Configuración del


servidor
There are various different ways to configure DWR depending on how you like to work: Hay varias
maneras de configurar DWR dependiendo de cómo te gustaría trabajar:
• The WEB-INF/web.xml configuration options will be useful to all DWR users El WEB-
INF/web.xml opciones de configuración será útil para todos los usuarios de DWR
• Many people declare what to export using dwr.xml . Muchas personas declaran que para
exportar utilizando dwr.xml . We also have more detailed documentation on: También
contamos con documentación más detallada sobre:
• Creators , Converters and Signatures Creadores , Convertidores y Firmas
• Annotations are available from 2.0, if you don't want to use an XML configuration file Las
anotaciones están disponibles en 2.0, si no quiere usar un archivo de configuración XML
• Spring 2.0 users can configure DWR using Spring Namespaces Spring 2.0 los usuarios pueden
configurar utilizando DWR primavera espacios de nombres
• It is also possible to configure DWR using the Fluent Configurator También es posible
configurar DWR mediante el Configurador de Dominio
Reverse Ajax in DWR 2.0 needs careful configuration to work around the various network problems
that can arise. Invertir Ajax en DWR 2.0 necesita una configuración cuidadosa para evitar los
problemas de red diferentes que pueden surgir. Reverse Ajax is Comet + Polling + Piggyback. Invertir
Ajax es el cometa + + sondeo Piggyback. See the reverse ajax documentation for more details. Véase el
ajax revertir la documentación para más detalles.
DWR integrates with many external libraries like Struts, JSF, Webwork, Rife and so on. DWR se
integra con muchas bibliotecas externas como Struts, JSF, Webwork, Rife y así sucesivamente. See the
section on integration for more details. Vea la sección sobre la integración para más detalles.

Scripting the Browser Secuencias de comandos


del navegador
The scripting introduction gets you started with how to write JavaScript code to call your Java code. La
introducción de secuencias de comandos que se inició con la forma de escribir código JavaScript para
llamar a su código de Java. DWR comes with some small JavaScript libraries to help you: DWR
incluye una serie de pequeñas bibliotecas de JavaScript para ayudarle a:
• engine.js : Handles all server communication engine.js : Maneja todas las comunicaciones de
servidor
• util.js : Helps you alter web pages with the data you got from the server (and a few neat extras
too) util.js : Le ayuda a modificar las páginas web con los datos que se obtiene del servidor (y
un extra limpio muy pocas)
DWR is not a generic JavaScript library so we try to steer clear of functions that are not specific to
remoting functionality, however there are a few functions that sneak into util.js to make life a lot easier.
DWR no es un genérico de la colección de JavaScript por lo que tratar de mantenerse alejado de las
funciones que no son específicos de la funcionalidad de interacción remota, sin embargo, hay algunas
funciones que se escabullen en util.js para hacer la vida mucho más fácil.
It is common to need to pass extra data to callback methods and there is also a reference to how to
handle errors too. Es común que se necesita para pasar datos adicionales a los métodos de devolución
de llamada y también hay una referencia a cómo controlar los errores también.
• How to write secure code with DWR Cómo escribir segura de código con DWR
• The supported browsers Los navegadores compatibles
• The supported environments Los entornos de apoyo
• How to upgrade from older versions of DWR Cómo actualizar desde versiones anteriores de
DWR
• There is also a small collection of generated documents from things like JavaDoc. También hay
una pequeña colección de documentos generados a partir de cosas como JavaDoc.