Direct Web Remoting
Direct Web Remoting (DWR) es una API (Application Programming Interface) open source que, utilizando la tecnología AJAX (Asynchronous JavaScript and XML), permite realizar llamadas remotas a objetos Java del servidor desde código JavaScript cliente.
DWR se compone de dos partes, una que se ejecuta en el lado cliente (en un navegador Web) y otra que se ejecuta en el servidor (en un contenedor de servlets).
En el lado del servidor, DWR proporciona servicios para la invocación de métodos remotos y la traducción de tipos, de forma muy similar a otras tecnologías RPC (Remote Procedure Call). Para la invocación de métodos remotos, DWR dispone del servlet
org.directwebremoting.servlet.DwrServlet
, que utiliza la información que le llega a través de la petición HTTP para instanciar los objetos necesarios y realizar la invocación del método solicitado, pasándole los parámetros enviados desde el cliente. Todas estas operaciones se realizan utilizando la API Reflection de Java. En cuanto a la traducción de tipos, DWR puede realizar de forma automática traducciones de tipos básicos, colecciones, arrays y beans. Por ejemplo, las colecciones las traduce a arrays y los beans a arrays asociativos, siendo los nombres de las propiedades del bean los índices del array.La parte de DWR que se ejecuta en el cliente tiene dos funciones. Por un lado, sirve como stub para la realización de llamadas a los objetos del servidor, para lo que es necesario importar, en el cliente, el archivo engine.js ubicado en la ruta
/[YOUR-WEBAPP]/dwr/engine.js
. Por otro lado, proporciona un conjunto de funciones que facilitan la operación sobre el código DHTML de la página Web, para lo que es necesario importar, en el cliente, el archivo util.js ubicado en la ruta /[YOUR-WEBAPP]/dwr/util.js
.Para comenzar a utilizar DWR en una aplicación Web hay que seguir los pasos siguientes:
- Descargar el archivo dwr.jar y copiarlo en el directorio
WEB-INF/lib
de la aplicación Web. - Añadir las siguientes líneas en el archivo
WEB-INF/web.xml
de la aplicación Web para declarar y configurar el servlet de DWR:
<servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <servlet-class>org.directwebremoting.servlet.DwrServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>true</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> </servlet-mapping>
Para más información acerca de la configuración de DWR en el archivoWEB-INF/web.xml
, acceder al enlace Reference to DWR entries in WEB-INF/web.xml. - Crear el archivo
dwr.xml
en el directorioWEB-INF
junto aweb.xml
. En este fichero se realizarán todas las declaraciones necesarias, tanto las clases cuyos métodos podrán ser llamados desde el cliente (etiqueta<create>
), como para realizar traducciones de tipos (etiquetas<convert>
y<signatures>
). La página http://localhost:8080/[YOUR-WEBAPP]/dwr es una página de pruebas y depuración que muestra las clases que se han exportado remotamente, y permite probar su funcionalidad. Las siguientes líneas muestran un ejemplo de archivodwr.xml
:
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <allow> <create creator="new" javascript="JDate"> <param name="class" value="java.util.Date"/> </create> <create creator="new" javascript="Demo"> <param name="class" value="[YOUR-PACKAGE].Demo"/> </create> <convert converter="bean" match="[YOUR-PACKAGE].Bean"/> </allow> </dwr>
Para más información acerca de la configuración del archivodwr.xml
, acceder al enlace Configuring DWR - dwr.xml. - Incluir en el código cliente las siguientes referencias correspondientes al script del motor de DWR, engine.js, a un script generado automáticamente por DWR que permite realizar las llamadas remotas a las clases Java del servidor, con el mismo nombre que el declarado en el archivo
dwr.xml
(en el ejemplo anterior seríaDemo.js
), y a un script util.js que tiene algunas funciones útiles, aunque opcionales, para la operación sobre el código DHTML de la página Web.
<script src="/[YOUR-WEBAPP]/dwr/engine.js"></script> <script src="/[YOUR-WEBAPP]/dwr/interface/[YOUR-SCRIPT].js"></script> <script src="/[YOUR-WEBAPP]/dwr/util.js"></script>
- Ahora sólo queda empezar la programación del código cliente. Por la condición asíncrona de AJAX, el método remoto no se ejecuta en el mismo instante en que se ejecuta el código JavaScript, lo cual supone cierta complejidad en saber qué hacer con los valores devueltos por el objeto Java del servidor hacia el navegador. DWR soluciona este problema pidiendo un método de callback al cual se le pasarán los datos devueltos. El último parámetro de cualquier método generado por DWR es siempre una función de callback.
public String sayHello(String name) { return "Hello, " + name; } function update() { var name = dwr.util.getValue("demoName"); Demo.sayHello(name, loadinfo); } function loadinfo(data) { dwr.util.setValue("demoReply", data); }
En el ejemplo, el métodosayHello
, que pertenece al objeto JavaDemo
del servidor, es llamado desde la función JavaScriptupdate
. Como se puede observar en la declaración del métodosayHello
, éste únicamente recibe un parámetro de tipoString
, mientras que desde el código JavaScript se le está pasando además la función de callbackloadinfo
, que será llamada en el retorno desayHello
con los valores devueltos por éste (data
). Las funcionesdwr.util.getValue
ydwr.util.setValue
pertenecen a la librería util.js de DWR y permiten obtener y actualizar el valor de un componente de la página Web.
En el enlace Tutorials and Examples hay ejemplos muy útiles para empezar a utilizar DWR.
1 comentarios:
saludos... tengo una consulta a ver si tu me puedes ayudar.. tengo el siguiente java script hecho con DWR:
function obtenerRazas(){
var grupo = dwr.util.getValue("grupo");
var especie = dwr.util.getValue("especie");
alert('Obtener Razas\nGrupo : ' + grupo + '\nEspecie : ' + especie);
CatalogosDependenciasJS.obtenerRazas(grupo, especie,
function(data){
alert('Obtener Razas\nGrupo : ' + grupo + '\nEspecie : ' + especie);
dwr.util.useLoadingMessage("Cargando datos...");
dwr.util.removeAllOptions("Raza");
dwr.util.addOptions("Raza", data, "clave", "descripcion");
}//function
);
}//function
tengo muchos dentro de mi proyecto para obtener diferentes vectores para llenar combos dependientes, y todos funcionan excepto este... Ahora la peculiaridad de esto es que si el servidor donde coloco el WAR de mi proyecto esta corriendo en Windows si funciona, pero cuando lo pongo en un servidor con Linux no funciona... deberia ser un problema de nombres de archivo, no lo se? mayusculas o minusculas pero si fuese asi tendria que ser un problema con el dwr.jar . Me vuelve loco esto. Gracias
14 de febrero de 2008, 22:16
Publicar un comentario