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
|