lunedì 7 giugno 2010

Comunicazione tra Flex, JavaScript e Applet Java

A volte può essere conveniente far comunicare un'applicazone Flex con del codice JavaScript, o con un'applet Java, magari per sfruttare il multithreading.

Sembra una cosa complicata, ma non è così.
Supponiamo di voler chiamare il metodo work della nostra applet, e di passargli una stringa come argomento.
Basta una riga di codice ActionScript:

ExternalInterface.call("document.workerApplet.work", arg);

Perché il metodo sia visibile deve essere dichiarato pubblico:

public void work(String arg) {
    /* ... */
}

Se la computazione è pesante ricordatevi di avviarla in un thread separato, altrimenti l'esecuzione si bloccherà finché il metodo non ritorna.

Naturalmente l'applet deve essere inclusa nello stesso wrapper HTML:

<APPLET id="workerApplet"
    code="WorkerApplet.class" codebase="." align="baseline"
    width="0" height="0" MAYSCRIPT="true" />


Passiamo ora alla comunicazione da un'applet java a un'applicazione Flex.

In questo caso le cose si complicano un po'.
Prima di tutto è necessario includere il parametro MAYSCRIPT nel tag APPLET.
Poi bisogna registrare il metodo ActionScript in modo che sia accessibile tramite JavaScript:

// registration
private function registerCallback():void {
    ExternalInterface.addCallback(
        "externalComputationComplete",
        externalComputationComplete);
}
// callback
public function externalComputationComplete(s:String):void {
        Alert.show("Applet returned: " + s);
}

Ora si costruisce una funzione JavaScript che chiama il metodo registrato come "externalComputationComplete":

<SCRIPT LANGUAGE="JavaScript">
    function callFlexApp(s) {
        var flexApp = document.getElementById("flexApp");
        flexApp.externalComputationComplete(s);
    }
</SCRIPT>

Da quanto ho sperimentato questa funzione deve essere dichiarata dopo il tag APPLET affinché sia visibile al codice java.

È ora possibile chiamare callFlexApp da Java:

netscape.javascript.JSObject.getWindow(this)
    .call("callFlexApp", new Object[] {"done"});

Come si vede gli eventuali argomenti alla funzione JavaScript vanno passati in un array.

Inoltre per usare JSObject bisogna includere nel classpath il JAR $JAVA_HOME/jre/lib/plugin.jar

Ulteriori informazioni sulla comunicazione tra Flex e JavaScript si possono trovare al seguente link:
http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7f17.html
Per la comunicazione Java - JavaScript si veda:
https://jdk6.dev.java.net/plugin2/liveconnect/
Mentre per una panoramica sui metodi di JSObject il javadoc si trova all'indirizzo:
http://java.sun.com/javase/6/webnotes/6u10/plugin2/liveconnect/jsobject-javadoc/netscape/javascript/JSObject.html

È tutto, buona programmazione!

Nessun commento:

Posta un commento

I commenti sono moderati