domingo, 9 de septiembre de 2007

Direct Web Remoting

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 archivo WEB-INF/web.xml, acceder al enlace Reference to DWR entries in WEB-INF/web.xml.
  • Crear el archivo dwr.xml en el directorio WEB-INF junto a web.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 archivo dwr.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 archivo dwr.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ía Demo.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étodo sayHello, que pertenece al objeto Java Demo del servidor, es llamado desde la función JavaScript update. Como se puede observar en la declaración del método sayHello, éste únicamente recibe un parámetro de tipo String, mientras que desde el código JavaScript se le está pasando además la función de callback loadinfo, que será llamada en el retorno de sayHello con los valores devueltos por éste (data). Las funciones dwr.util.getValue y dwr.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:

thomasloane dijo...

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

Publicar un comentario

 

RSS RSS