MokaByte 94 - Marzo 2005 
Comunicazione Java-Flash
di
Cristoforo Billa
Nella stessa pagina web le applet Java possono dialogare con il plug-in Flash, e viceversa, attraverso una comunicazione Java-Javascript e Javascript-Flash, da un verso, e Flash-Javascript e Javascript-Java, nell'altro verso. Ognuno di questi passaggi richiede la conoscenza di linguaggi e script diversi. Pertanto gli argomenti qui di seguito trattati sono : il Live Connect, la classe JSObject di Java, il codice Javascript per accedere a membri o metodi di classi Java, il codice Javascript per accedere a membri o funzioni del plug-in Flash, le funzioni actionscript (ovvero il linguaggio di Flash) per accedere a funzioni Javascript e il DOM - Document Object Model

La comunicazione Java-Javascript
Java accede al DOM [1] del Browser, ovvero alla gerarchia degli oggetti presenti nella pagina web, attraverso la classe wrapper Java netscape.javascript.JSObject e attraverso un meccanismo detto LiveConnect [2] di Netscape abilitato nella maggior parte dei browser dotati di Java e di Javascript.
Come si vedrà nel paragrafo successivo, una corretta individuazione di un oggetto in una pagina web prevede la sua corretta individuazione nel DOM del browser in uso.
Qui di seguito è riportato uno schema di un'applet java che fa uso del principale metodo della classe JSObject, ovvero JSObject.getWindow( ), che serve a prelevare il riferimento alla pagina web corrente:

import java.awt.*;
class MyApplet extends Applet {
public void init() {
JSObject win = JSObject.getWindow(this);
JSObject doc = (JSObject) win.getMember("document");
JSObject loc = (JSObject) doc.getMember("location");

String s = (String) loc.getMember("href"); // document.location.href
win.call("f", null); // Call f() in HTML page
}
}

L'esempio qui sopra mette in evidenza come facilmente può essere richiamata una funzione javascript f() che si trova all'interno di una pagina web.

 

La comunicazione Javascript-Java
Affinché avvenga una comunicazione tra Javascript e Java il browser in cui risiede l'applet deve permetterlo. La maggior parte dei browser in circolazione accetta lo scripting per le applet.
Ogni browser identifica, nella propria gerarchia di oggetti, un'applet a seconda della versione di DOM implementata e a seconda del rispetto delle regole dettate dai DOM level 1, DOM level 2 etc..
L'applet viene identificata, nel codice html della pagina web, o con il tag APPLET o con tag OBJECT, a seconda del browser in uso; ad uno dei due tag si dà come attributo ID, ovvero un nome identificativo dell'applet nella gerarchia di oggetti. Le azioni che normalmente si possono compiere da Javascript sull'applet Java sono quelle di leggere e scrivere proprietà o eseguire metodi di una classe.
Di seguito un esempio di come può essere richiamata una funzione di una applet Java da una pagina web:

dichiariamo in questo esempio la classe CLSFractal.class identificata nel DOM con ID Fractal

<form name="Form1">
<OBJECT ID="Fractal" WIDTH=500 HEIGHT=120
CLASSID="CLSID:8AD9C840-044E-11d1-B3E9-00805F499D93"
<PARAM NAME="code" value="CLSFractal.class">
<PARAM NAME="codebase" value="1.0.2">
<PARAM NAME="level" value="5">
...
</OBJECT>

Associamo ad un pulsante la chiamata della funzione Javascript "startJSFractal"

<input type="button" name="Button1" value="Start"
onClick="startJSFractal" language="JavaScript">

Nel tag Script scriviamo la funzione "startJSFractal" che chiama il metodo startFractal() della classe CLSFractal.class usando l'identifictivo fractal dell'applet Java nel DOM ovvero

document.Form1.Fractal.startFractal()

<SCRIPT language="JavaScript">
function startJSFractal() {
document.Form1.Fractal.startFractal()
}
</SCRIPT>

La comunicazione JavaScript-Flash
Il plugin Flash viene individuato, a seconda del DOM utilizzato dal browser, o come EMBED o come OBJECT. Di questi due tag sono importanti due loro attributi: l'attribuito ID, che server ad identificare il movie nel DOM, e l'attributo SWLIVECONNECT che abilita la comunicazione Javascript Flash:

<EMBED type=application/x-shockwave-flash'
id = "mymovie"
src=mymovie.swf
width=770 height=550
swliveconnect=true
quality=high
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
            P1_Prod_Version=ShockwaveFlash"
scale="exactfit">
</EMBED>

Per accedere, da javascript, ad una variabile Flash si identifica innanzitutto il movie flash (ovvero l'oggetto flash) :

var movie =window.document.mymovie

dove mymovie è l'attributo del tag EMBED.
Il plugin Flash esporta diversi metodi, come ad esempio GetVariable() o SetVariable, chiamati Flash Methods [3] e che permettono di accedere al movie.
Se una variabile nella timeline principale del movie flash si chiama flashstarted allora per leggerla da javascript di dovrà usare il metodo GetVariable()

var isStarted= movie.GetVariable("flashstarted");

La comunicazione Flash-Javascript
I metodi attraverso i quali un movie Flash chiama funzioni javascript sono due. Il primo usa gli fscommands ampiamente spiegati in [3]. Il secondo invece usa GetUrl una funzione di ActionScript che prende come paramento un url ma accetta anche codice Javascript.
Di seguito una funzione actionscript che fa una chiamata di un metodo java:

function JavaCall(function_name, param1, param2, param3, param4) {
if (arguments.length==2)
invio = "javascript:" + _root.prefix1 + function_name+"("+chr(34)+param1+chr(34)+")";
….
getURL (invio);
}

E viene così richiamata :

JavaCall(myJavafuncion,1);

In un applet java nella classe principale di trova una funzione così definita:

public void myJavafunction(String p)
{

}

In questo esempio avete notato che non si fa più riferimento alla pagina web in cui scrivere il codice Javascript, ma si è passati direttamente da Flash alla classe Java inglobando il codice Javascript nella funzione GetURL dell'actionscript.

 

La comunicazone Java-Flash e Flash-Java
Java accede a Flash attraverso una catena Java-Javascript-Flash e Flash accede a Java attraverso una catena Flash-Javascript-Java.
Java può inglobare il codice Javascript, necessario per le chiamate dei metodi del plug-in Flash, e Flash può inglobare il codice Javascript, necessario alle chiamate dei metodi Java.
Si ottiene uno schema di utilizzo pulito in cui non c'è traccia di codice javascript nella pagina web.
Questa, al suo interno, non mostra riferimenti a variabili o funzioni ne di Java ne di Flash ma contiene solo i tag necessari alla loro identificazione nel DOM.

In questo esempio la variabile java "flashstarted" viene impostata con il valore della sua omonima variabile flash attraverso il richiamo del metodo GetVariable(nomevar) di Flash:

String argsG[ ] = {"flashstarted"};
String appletstarted[] = {"appletstarted","y"};
String flashstarted=null;
flashstarted = (String) myFlash.call("GetVariable", argsG);

Nell'esempio del paragrafo precedente si è visto invece come inglobare il codice javascript in Flash per accedere a Java direttamente da Flash.

 

Conclusioni
Nonostante tale articolo non sia assolutamente esaustivo, mette comunque in evidenza la potenzialità di questo sistema con cui si arricchiscono le funzionalità di Java e di Flash. Java può usare Flash come interfaccia grafica e Flash può usare Java come estensione del proprio linguaggio.
La comunicazione Java-Flash non è stata affrontata a fondo da nessun testo forse perché non si vedono casi pratici per cui una tale comunicazione sia utile.
A prescindere dal fatto che la fantasia ci possa venire in aiuto per trovare qualunque tipo di applicazione seria o faceta che sfrutti tale comunicazione, una implementazione è stata fatta.
Come noto Flash con il suo actionscript non dispone di socket o serversocket capaci di fare da client o da server. Possiede soltanto alcune limitate funzionalità di connessione a server che rispettino dei vincoli di un protocollo proprietario. Java usa invece le socket sin dalle sue prime versioni e mi ha dato la possibilità di creare un'applet che si collega ad un server irc (ma potrebbe essere qualunque altro tipo di server: ftp, telnet, gopher…). Ho potuto implementare tutto il protocollo IRC mettendo in comunicazione il flusso dati proveniente dal server con un movie Flash che si trova nella stessa pagina web dell'applet.
E' proprio questo il meccanismo che sta alla base di una chat irc che ho sviluppato e che usa una interfaccia Flash direttamente collegata ad un'applet Java e che ne sfrutta le capacita di connessione remota.

www.jafirc.com
www.algostudioinformatico.it


Bibliografia
[1] "Document Object Model (DOM)", http://www.w3.org/DOM/
[2] "Live Connect",http://wp.netscape.com/eng/mozilla/3.0/handbook/javascript/livecon.htm#996824
[3] "Scripting with Flash",http://www.macromedia.com/support/flash/publishexport/scriptingwithflash/


Cristoforo Billa è nato a Palermo nel 1972, titolare e principale programmatore della ALGO Studio Informatico, sviluppa progetti tecnico-scientifici, applicazioni web e.commerce, applicativi Java

MokaByte® è un marchio registrato da MokaByte s.r.l. 
Java®, Jini® e tutti i nomi derivati sono marchi registrati da Sun Microsystems.
Tutti i diritti riservati. E' vietata la riproduzione anche parziale.
Per comunicazioni inviare una mail a info@mokabyte.it