Está en la página 1de 9

Conectar Java con Flex

Escenario
El usuario ejecutar una aplicacin Flex en su mquina para visualizar en una tabla (grid) cierta informacin sobre libros. Esta informacin reside en el directorio de un servidor Web, como un fichero XML y es procesada y luego enviada por un servlet cuando recibe la peticin del usuario. Veamos primero el funcionamiento de la aplicacin Java en el servidor y luego la aplicacin Flex en el lado del cliente.

Aplicacin Java (Lado del servidor)


Asumiendo el uso de Eclipse para programadores JEE con Tomcat correctamente configurado, creamos un proyecto Web dinmico denominado FlexWebXML. En la carpeta 'WebContent' creamos una carpeta con el nombre 'xml'. Aqu dentro creamos un fichero denominado 'books.xml' con el siguiente contenido:
<?xml version="1.0" encoding="iso-8859-1"?> <books> <stock> <name>The Picasso Code</name> <author>Dan Blue</author> <category>Fiction</category> <description>Cubist paintings reveal a secret society of people who really look like that</description> </stock> <stock> <name>Here With the Wind</name> <author>Margaret Middle</author> <category>Fiction</category> <description>In this edition, nobody in the south really gives a damn</description> </stock> <stock> <name>Harry Potluck and the Chamber of Money</name> <author>J.K. Roughly</author> <category>Fiction</category> <description>Young wizard finds the real pot-of-gold and retires</description> </stock> <stock> <name>No Expectations</name> <author>Chuck Dickens</author> <category>Fiction</category> <description>Dickens finally reveals what he really thinks of people</description> </stock> <stock> <name>Atlas Stretched</name> <author>Ann Rind</author> <category>Fiction</category> <description>Great inventors finally just take the money and run</description> </stock> <stock>

<name>Recycling Software</name> <author>Big Gates</author> <category>Nonfiction</category> <description>How to just change the name and interface of the same old software and sell it as new</description> </stock> <stock> <name>Make Tons of Money</name> <author>Donald Rump</author> <category>Nonfiction</category> <description>Rump explains how he became a billionaire while constantly declaring bankruptcy</description> </stock> <stock> <name>How to Win Enemies and Lose Friends</name> <author>Dale Crochety</author> <category>Nonfiction</category> <description>The Ultimate how-to book for people who want to stay loners</description> </stock> <stock> <name>My Lies</name> <author>Swill Clinton</author> <category>Nonfiction</category> <description>This former American president tries to define what a lie is</description> </stock> <stock> <name>The Complete History of the World</name> <author>David McClutz</author> <category>Nonfiction</category> <description>McClutz gives you the entire history of all civilization is less than 300 pages</description> </stock> </books>

Ahora vamos con las clases Java; en la carpeta 'src' creamos la clase LecturaFichero, dentro de un package que llamaremos 'utiles'. Esta clase se va a encargar de realizar la lectura del fichero XML y de devolver un String con tal contenido. LecturaFichero.java
package utiles; import java.io.BufferedReader; import java.io.FileReader; public class LecturaFichero { public static String readFile(String nombre) { StringBuilder ficheroEnCurso=new StringBuilder(); String linea; BufferedReader bf; try { bf = new BufferedReader(new FileReader(nombre)); while ((linea = bf.readLine())!=null) { ficheroEnCurso.append(linea); } } catch (Exception e) { e.printStackTrace(); }

return ficheroEnCurso.toString(); } }

Ahora creamos un package con el nombre 'servlets'. Aqu dentro creamos un servlet y lo llamamos 'GeneradorServlet'. Su finalidad va a ser invocar a la clase LecturaFichero, obtener el contenido del fichero XML en formato String y devolverlo a la capa cliente para que all sea procesado por la aplicacin Flex y mostrado al usario. GeneradorServlet.java
package servlets; import java.io.IOException; import java.io.PrintWriter; import import import import javax.servlet.ServletException; javax.servlet.http.HttpServlet; javax.servlet.http.HttpServletRequest; javax.servlet.http.HttpServletResponse;

import utiles.LecturaFichero; public class GeneradorServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer=response.getWriter(); writer.append(LecturaFichero .readFile(this.getServletContext().getRealPath("xml/book s.xml"))); writer.close(); } }

El descriptor de despliegue debe tener el siguiente aspecto: web.xml


<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>FlexWebXML</display-name> <servlet> <description></description> <display-name>GeneradorServlet</display-name> <servlet-name>GeneradorServlet</servlet-name> <servlet-class>servlets.GeneradorServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>GeneradorServlet</servlet-name> <url-pattern>/GeneradorServlet</url-pattern> </servlet-mapping>

</web-app>

Antes de pasar a la capa cliente hacemos una prueba para verificar que el servidor trabaja correctamente. Abrimos un navegador e invocamos al servlet:

En la figura anterior podemos observar cmo el servlet est devolviendo todo el contenido del fichero XML en un String. Por tanto, concluimos que la capa del servidor es correcta. A continuacin se muestra una imagen del aspecto final esperado del proyecto:

Aplicacin Flex (Lado del cliente)


Se asume que tenemos correctamente instalado el plugin de Flex para Eclipse. Seleccionamos un nuevo proyecto Flex:

Pulsamos 'Next' y como nombre escribimos 'FlexClienteXML'.

Pulsamos 'Finish'. Respondemos s, en el caso de que Eclipse nos pregunte sobre cambiar a la perspectiva de desarrollo en Flex.

Debemos tener en pantalla lo siguiente:

Para realizar todo el trabajo de comunicarse con el servidor y recibir la informacin del servlet tenemos a nuestra disposicin un componente llamado 'HTTPService'. Por tanto, creamos una instancia de tal componente, dndole a su atributo 'id' el valor 'libroDatos' y a su atributo 'url' el valor 'http://127.0.0.1:8080/FlexWebXML/GeneradorServlet' (donde atiende el servlet):
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:HTTPService id="libroDatos" url="http://127.0.0.1:8080/FlexWebXML/GeneradorServlet" </mx:Application> />

Cuando el componente HTTPService reciba los datos del servlet se desencadenar un evento, el cual puede ser capturado mediante su atributo 'result'. La idea es obtener este evento y pasarlo a una funcin (manejadora del evento) que extraer del evento los datos recibidos del servlet y los depositar en una variable de tipo array. Por tanto, comenzamos creando la variable tipo array que almacenar los libros:
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; [Bindable] private var stockLibros:ArrayCollection;

]]> </mx:Script>

<mx:HTTPService id="libroDatos" url="http://127.0.0.1:8080/FlexWebXML/GeneradorServlet" </mx:Application>

/>

Ahora creamos la funcin 'librosManejador', encargada de manejar el evento 'Resultados obtenidos del servidor':
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.rpc.events.ResultEvent; [Bindable] private var stockLibros:ArrayCollection; private function librosManejador(evt:ResultEvent):void { stockLibros=evt.result.books.stock; }

]]> </mx:Script>

<mx:HTTPService id="libroDatos" url="http://127.0.0.1:8080/FlexWebXML/GeneradorServlet" </mx:Application>

/>

Aadimos al componente HTTPService el atributo 'result', encargado de pasar el evento a la funcin manejadora de eventos anterior:
<mx:HTTPService id="libroDatos" url="http://127.0.0.1:8080/FlexWebXML/GeneradorServlet" result="librosManejador(event)" />

En el tag Application tenemos que aadir el atributo 'creationComplete'. Se trata de un evento que informa que el contenedor (Application en este caso) ha sido completamente cargado, es decir todos sus componentes ya estn cargados en memoria Este evento es muy importante, dado que cuando se produzca ya sabremos que es seguro realizar la llamada al servlet. Para realizar la llamada utilizamos el identificador del componente HTTPService, que no es otro que 'libroDatos':
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="libroDatos.send()">

Muy bien, pero cmo mostramos los datos en la tabla (grid)? Para ello disponemos del componente DataGrid, el cual dispone de un atributo llamado 'dataProvider' que utilizaremos para indicar de donde se obtienen los datos a mostrar en la tabla. En nuestro caso, estos datos los proporciona la variable de tipo array 'stockLibros', que definimos previamente. Justo despus del componente HTTPService escribimos lo siguiente:
<mx:DataGrid x="56" y="250" width="950" dataProvider="{stockLibros}"/>

Ya podemos ejecutar la aplicacin. Para ello nos dirigimos a la carpeta 'bin-debug' del proyecto y ejecutamos el fichero 'FlexClienteXML.swf'. Tenemos que obtener lo siguiente:

Ejecucin alternativa
Podemos copiar el fichero 'FlexClienteXML.swf' en la carpeta 'WebContent' del proyecto 'FlexWebXML', es decir en la capa del servidor:

Ahora podemos abrir un navegador y escribir: http://127.0.0.1:8080/FlexWebXML/FlexClienteXML.swf

Deberamos visualizar lo siguiente:

La ventaja de esta aproximacin es que en este caso no tenemos que preocuparnos de que los clientes tengan fsicamente el fichero 'FlexClienteXML.swf' en sus equipos, as como el resto de archivos de configuracin de Flex que se pudieran necesitar, ni tan siguiera es necesario que se tenga instalado el Flash Player. Tan slo se necesita un navegador.

También podría gustarte