Uso de la librería DWR en aplicaciones ICM Área de Arquitectura de Aplicaciones AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM 1 TABLA DE CONTENIDO 1 TABLA DE CONTENIDO ................................................................................................... 2 2 INTRODUCCIÓN................................................................................................................ 3 3 COMPONENTES NECESARIOS ....................................................................................... 3 3.1 3.1.1 3.1.2 3.2 3.2.1 3.3 4 Librería DWR ...........................................................................................................................3 Modificar fichero web.xml .....................................................................................................................3 Crear y configurar el fichero dwr.xml....................................................................................................3 LIBRERÍA DE SISTEMAS ........................................................................................................4 ClaseDWR ............................................................................................................................................4 CÓDIGO JAVASCRIPT ............................................................................................................5 EJEMPLO........................................................................................................................... 5 4.1 COMBO ....................................................................................................................................5 Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 2/7 AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM 2 INTRODUCCIÓN DWR, Direct Web Remoting, es una librería de código abierto que facilita el uso de Ajax en aplicaciones web. Proporciona un mecanismo mediante el cual se puede invocar métodos java alojados en el servidor a traves de código javascript. También proporciona una librería de utilidades javascript para modificar la página web con los datos obtenidos del sevidor. DWR consta de dos partes principales: • • Javascript corriendo del lado del cliente que se comunica con el servidor y actualiza dinámicamente la página web. Un servlet que se ejecuta en el servidor de aplicaciones y que se encarga de procesar las peticiones y enviar las respuestas. 3 COMPONENTES NECESARIOS 3.1 Librería DWR Hay que descargarse la librería dwr.jar e incluirla en el directorio WEB-INF/lib de la aplicación. 3.1.1 Modificar fichero web.xml En el fichero web.xml hay que definir el servlet de dwr, para ello se tendrá que añadir las siguientes lineas: <servlet> <servlet-name>dwr-invoker</servlet-name> <display-name>DWR Servlet</display-name> <servlet-class>uk.ltd.getahead.dwr.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> 3.1.2 Crear y configurar el fichero dwr.xml Es necesario crear un fichero dwr.xml que se añadirá en el directorio WEB-INF junto al fichero web.xml. Este fichero sirve para configurar dwr. La estructura de este fichero es: <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 3/7 AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <!-- init is only needed if you are extending DWR --> <init> <creator id="..." class="..."/> <converter id="..." class="..."/> </init> <!-- without allow, DWR isn't allowed to do anything --> <allow> <create creator="..." javascript="..."/> <convert converter="..." match="..."/> </allow> <!-- you may need to tell DWR about method signatures --> <signatures> ... </signatures> </dwr> A continuación se muestra el código de un fichero dwr: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/dwr/dwr10.dtd"> <dwr> <allow> <create creator="new" javascript="ObtenerMunicipios"> <param name="class" value="ejemplo_dwr.acciones.ajax.ObtenerMunicipios" /> </create> <convert converter="bean" match="ejemplo_dwr.bean.MunicipiosBean"/> </allow> </dwr> En este fichero se definen las clases java que podrán ser usadas por DWR. Para más aclaraciones de cómo configurar este fichero acceder a http://getahead.org/dwr/server/dwrxml . 3.2 LIBRERÍA DE SISTEMAS 3.2.1 ClaseDWR Las clases que se vayan a utilizar con DWR deben heredar de ClaseDWR y se colocarán en el directorio acciones/ajax. Además en los métodos implementados que accedan a BBDD se tendrá que usar los métodos obtenerConexion y liberarConexion. Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 4/7 AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM public class BuscadorInteractivo extends ClaseDWR{ public List obtenerLista(String cadenaMun) throws DWRException { MunicipiosDAO municipiosDAO = new MunicipiosDAO(); LinkedList listaMunicipios = null; try{ Connection con = obtenerConexion(this); listaMunicipios = (LinkedList)municipiosDAO.busquedaPorNombre(con,cadenaMun); liberarConexion(con); }catch(DAOException daoex){ Trazas.imprimeErrorExtendido(daoex); throw new DWRException(daoex.getMessage()); } return listaMunicipios; } } 3.3 CÓDIGO JAVASCRIPT DWR proporciona dos librerías javascript que se han de importar a la página web. <script type="text/javascript" src="/nombreApp/dwr/engine.js"></script> <script type="text/javascript" src="/nombreApp/dwr/util.js"></script> Ademas existen dos funciones javascript para la gestión de errores, se deberán añadir siempre, son las siguientes: function init(){ DWREngine.setErrorHandler(errors); } function errors(message) { alert("Errores " + message); } 4 EJEMPLO 4.1 COMBO Este ejemplo rellena con datos de municipios un control select a partir de la base de datos. La acción debe retornar una lista. Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 5/7 AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM En la página jsp se crean dos funciones javascript. La función lista_municipios() llama al método listaPorProvincia de la acción ObtenerMunicipios. La función procesa_listaPorProvincia() será la encargada de gestionar los datos que devuelva el método de la acción. Código jsp de la página: <script type="text/javascript" src="/ejemplo_dwr/dwr/interface/ObtenerMunicipios.js"></script> <script type="text/javascript" src="/ejemplo_dwr/dwr/engine.js"></script> <script type="text/javascript" src="/ejemplo_dwr/dwr/util.js"></script> <jsp:useBean id="lista_provincias" scope="request" class="java.util.LinkedList" /> <%@ taglib uri="/jstl-core" prefix="c" %> <script> <!-/* Las funciones init() y errors() gestionan los errores */ function init(){ DWREngine.setErrorHandler(errors); } function errors(message) { alert("Errores "+message); } function listar_municipios(){ var provincia = DWRUtil.getValue("provincia"); ObtenerMunicipios.listaPorProvincia(provincia,procesa_listaPorProvincia); } function procesa_listaPorProvincia(listaMunicipios){ DWRUtil.removeAllOptions("municipio"); DWRUtil.addOptions("municipio",listaMunicipios,'cdmuni','dsmuni'); } --> </script> <FORM name="Formulario_1" method="post" action="#" > <b>Ejemplo de relleno de un combo.</b><br><br> <p>Provincia:</p> <SELECT name="provincia" onchange="listar_municipios()"> <OPTION selected></OPTION> <c:forEach var="registro" items="${lista_provincias}"> <OPTION value="<c:out value='${registro.cdprov}' />"><c:out value='${registro.dsprov}' /></OPTION> Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 6/7 AREA DE ARQUITECTURA DE APLICACIONES MANUAL DWR Identidad Corporativa de ICM </c:forEach> </SELECT> <br> <p>Lista de municipios de la provincia seleccionada :</p> <SELECT id="municipio" name="municipio"> </SELECT> </FORM> Clase java implementada para el ejemplo: package ejemplo_dwr.acciones.ajax; import java.sql.Connection; import java.util.LinkedList; import java.util.List; import import import import import import ejemplo_dwr.bean.ProvinciasBean; ejemplo_dwr.modelo.MunicipiosDAO; sistemas.framework.acciones.ClaseDWR; sistemas.framework.excepciones.DWRException; sistemas.framework.excepciones.DAOException; sistemas.util.Trazas; public class ObtenerMunicipios extends ClaseDWR{ public List listaPorProvincia(String CdProvincia) throws DWRException { LinkedList listaMunicipios = new LinkedList(); ProvinciasBean provinciasBean = new ProvinciasBean(); provinciasBean.setCdprov(CdProvincia); MunicipiosDAO municipiosDAO = new MunicipiosDAO(); Connection con = obtenerConexion(this); try { listaMunicipios = (LinkedList)municipiosDAO.busqueda(con,provinciasBean); }catch (DAOException daoex) { Trazas.imprimeErrorExtendido(daoex); throw new DWRException(daoex.getMessage()); }finally{ liberarConexion(con); } return listaMunicipios; } } Documento: Uso de DWR en aplicaciones ICM Versión: 1.0 Fichero: DWR.doc Proyecto: Area de Arquitectura de Aplicaciones Fase: Fecha: 08/06/2007 Página 7/7