Esta es una pequeña prueba de concepto de como se pueden llamar objetos remotos java desde Flex usando Linux y Tomcat del lado del servidor.
Creación de la aplicación web en Tomcat
1. Dentro del directorio webapps, creamos el directorio de nuestro proyecto (p.e. blazeds):
2. Bajamos la distribución binaria de BlazeDS de su página de Internet y la desempaquetamos en un directorio temporal.
3. Copiamos el archivo blazeds.war al directorio de nuestro proyecto y lo desempaquetamos.
4. Borramos el archivo .war.
5. Opcionalmente, agregamos la siguiente línea al archivo de configuración conf/server.xml dentro del tag de Host, para que tengamos bien definido el directorio de nuestra aplicación:
6. Agregamos el archivo de seguridad crossdomain.xml donde este el directorio raíz de nuestro dominio:
<allow-access-from domain="*" />
</cross-domain-policy>
Creación del Objeto Remoto en Java
Para este ejemplo, creamos una pequeña clase en Java, en el directorio WEB-INF/src que simplemente nos de la hora:
La compilamos con:
La copiamos al directorio classes.
Ahora que todo esta listo del lado del servidor, declaramos nuestra clase agregando las siguientes lineas al tag service del archivo flex/Remoting-config.xml:
<properties>
<!-- El nombre de nuestra clase -->
<source>Sereno</source>
</properties>
</destination>
Creación de la aplicación Flex
Del lado del cliente, necesitamos crear un archivo de configuración services-config.xml que más adelante se utilizará como un parámetro del comando mxmlc que compila nuestro código.
<services-config>
<services>
<service id="remoting-service" class="flex.messaging.services.RemotingService"
messageTypes="flex.messaging.messages.RemotingMessage">
<adapters>
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true" />
</adapters>
<!-- Con este id, llamamos al java desde flex -->
<destination id="blazeds">
<channels>
<channel ref="my-amf" />
</channels>
</destination>
</service>
</services>
<channels>
<channel-definition id="my-amf" class="mx.messaging.channels.AMFChannel">
<!-- Aqui tengo la ruta de donde se va a jalar las cosas, proviene del war de flex -->
<endpoint uri="http://192.168.1.100:8080/blazeds/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>
</channel-definition>
</channels>
</services-config>
Aquí tenemos el mxml (blazeds.mxml ) que vamos usar como ejemplo:
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns="*">
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
// Esta función se llama cuando se llamo exitosamente a nuestro objeto:
public function onMethodResult(event:ResultEvent):void {
bo.label = "Result "+event.result
bo.label += "nDataType "+ typeof(event.result)
}
]]>
</mx:Script>
<mx:RemoteObject id="ro" destination="blazeds" fault="Alert.show(event.fault.faultString, 'Error')" result="{onMethodResult(event)}">
<!-- Aquí declaramos todas las funciones que vamos a llamar del objeto Java -->
<mx:method name="getTime" result="{onMethodResult(event)}" />
</mx:RemoteObject>
<mx:Label id="bo" label="" click="ro.getTime()" />
</mx:Application>
Lo compilamos con la siguiente línea de comando:
Al ejecutar el mxml, veremos una etiqueta vacia que al darle doble click, nos imprimirá la hora del servidor.
Conclusiones
De aquí en adelante, ya todo es creatividad. Por supuesto que se pueden usar frameworks como Spring para acelerar el desarrollo del lado del servidor. Pero lo importante de este post, era comprobar con una prueba de concepto lo bien que se llevan estas tecnologías y hacerlo "a manita" para aprender más. No es muy díficil hacer esto mismo con Flex Builder para el cliente y Eclipse para el servidor.
{ 8 comments… read them below or add one }
Gracias, me sirvio mucho.
Insane:
Es un verdadero honor que visites mi página. El tuyo es el mejor blog de mis compañeros de trabajo y lo visito con regularidad.
Supongo que te hubiera servido más un post con Flex Builder y Eclipse, pero a veces es bueno saber hacer las cosas a manita. Que bueno que haya servido de algo
Saludos
Hola Jorge.
Se puede pasar un objeto directamente desde java a flex? gracias
Juan:
Claro que sí. Incluso arreglos de objetos.
Lo conveniente es que Tu(s) objeto(s) en Java tengan los getters y setters correspondientes a las propiedades que deseas pasar a Flex y manejarlas a través de event.result. Para este caso incluso lo puedes acceder directamente sin hacer un VO del lado de flex.
Saludos
Buena Jorsh, fue muy interezante experiencia aprender flex en epocas de guerra pero creo q hicistes un gran trabajo, pero ahora estoy haciendo un generador de sistemas en flex, algo para aportar al mundo de sistemas se esta poniendo interezante…, ya platicamos tambien esta en el projecto paco paccioly jajaja recuerdas…
Jaime:
Así es. Fueron tiempos de marchas forzadas. Que bueno que sigas innovando en esto de los sistemas y no solamente sacando la chamba.
Claro, estoy a tus ordenes.
Saludos
Jorge Machin
Hola que tal, excelente tuto, solo una pequeña duda, en caso de que sea necesario el paso de objetos o clases completas, esto segun tengo entendido es posible, sin embargo por ningun lado encuentro la forma de realizarlo, serias tan amable de darme una ayuda de antemanno gracias
Juliangui:
Si es posible. Esta explicado en el libro la Biblia de Flex. Como se ha vuelto una pregunta frecuente voy a publicar aquí el ejemplo, pero dame el fin de semana porque estoy algo ocupado en un proyecto ahorita.