Descripción completa
Views 148 Downloads 70 File size 427KB
El Mejor Ejemplo DWR, o El Mejor Tutorial DWR Java Add comments
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 plaincopy to clipboardprint?
1. 2.
< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Applicatio n 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> 3.
4. dwrEasy 5.
6. dwr-invoker 7. DWR Servlet 8. Direct Web Remoter Servlet 9. org.directwebremoting.servlet.DwrServlet 10.
11. debug 12. true 13.
14.
15.
16. dwr-invoker 17. /dwr/* 18.
19.
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 plaincopy to clipboardprint?
1.
package com.soaagenda.services;
3.
import com.soaagenda.valueobjects.*;
5. 6.
public class EasyService { public EasyService() { }
2. 4.
7. 8.
9. 10.
public EasyResponse getProducts(EasyParameter parametersX){ EasyResponse responseX= new EasyResponse();
11.
12. 13.
// si parametros vacios devuelve error, error if empty parameters if (parametersX==null || parametersX.getClientID()==null || parameter sX.getClientID().length()< =0){ 14. responseX.setErrorCode(10001);
15.
responseX.setErrorDescription("Debe indicar ID Cliente. Give us Client
ID");
16.
return responseX;
17. 18.
}
19. 20. 21.
//crea lista productos del cliente, fill the client product list //para ejemplo en duro, for the example fixed data Product[] productsListX= new Product[2];
23. 24. 25. 26.
Product productX= new Product(); productX.setBarCode("0001"); productX.setName("Tarjeta Visa, Visa Credit Card"); productsListX[0]= productX;
28. 29. 30.
productX= new Product(); productX.setBarCode("0002"); productX.setName("Tarjeta American Express, American Express Credit
31.
productsListX[1]= productX;
33. 34. 35.
//respuesta exitosa, sucessfull response responseX.setErrorCode(0); responseX.setErrorDescription("Consulta Banco Exitosa, Succesfull Bank
22.
27.
Card"); 32.
Query"); 36. 37.
38. 39. 40.
responseX.setProducts(productsListX); return responseX; }
}
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 plaincopy to clipboardprint?
1.
package com.soaagenda.valueobjects;
2.
3. 4. 5. 6. 7.
public class EasyParameter { private String clientID; private String productType; public EasyParameter() { }
8.
9. 10.
public void setClientID(String clientID) { this.clientID = clientID; }
13. 14.
public void setProductType(String productType) { this.productType = productType; }
17. 18.
public String getClientID() { return clientID; }
21. 22.
public String getProductType() { return productType; }
11. 12.
15. 16.
19. 20.
23. 24.
}
EasyResponse.java: define la estructura para los resultados del servicio. view plaincopy to clipboardprint?
1.
package com.soaagenda.valueobjects;
2.
3. 4. 5. 6.
public class EasyResponse { private int errorCode; private String errorDescription; private Product[] products;
7.
8.
public EasyResponse() { }
9. 10.
11. 12.
public void setErrorCode(int errorCode) { this.errorCode = errorCode; }
13. 14.
15. 16.
public void setErrorDescription(String errorDescription) { this.errorDescription = errorDescription; }
17. 18.
19. 20.
public void setProducts(Product[] products) { this.products = products; }
21. 22.
23. 24.
public int getErrorCode() { return errorCode; }
25. 26.
27. 28.
public String getErrorDescription() { return errorDescription; }
29. 30.
31. 32. 33. 34.
public Product[] getProducts() { return products; } }
Product.java: define la estructura de un producto.
view plaincopy to clipboardprint?
1.
package com.soaagenda.valueobjects;
2.
3. 4. 5. 6. 7. 8.
9. 10. 11. 12. 13.
public class Product { private String barCode; private String name; public Product() { try { jbInit(); } catch (Exception ex) { ex.printStackTrace(); } }
14.
private void jbInit() throws Exception { }
15. 16.
17. 18.
public void setBarCode(String barCode) { this.barCode = barCode; }
19. 20.
21. 22.
public void setName(String name) { this.name = name; }
23. 24.
25. 26.
public String getBarCode() { return barCode; }
27. 28.
29. 30. 31. 32. 5.
public String getName() { return name; } }
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 plaincopy to clipboardprint?
1. 2.
< ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0/ /EN" "http://getahead.org/dwr/dwr20.dtd"> 3.
4.
5.
7.
8. 9. 10. 11. 12. 13. 14.
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 “” (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 plaincopy to clipboardprint?
1.
< !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ww.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 2.
3.
4. Editable Table Demo 5.
6.
7.
8.
9.
10.
11.
12. 13. 14.
Easy DRW Demo Buscar / Search
15.
16. 17. 18. 19.
ID Cliente / Client ID: | 20. |
Tipo Producto / Product Type | 23.24. |
27. 28. | 29.
Respuesta / Response: 34.
35.
Codigo / BarCode | 41.Nombre / Name | 42.
---|