Interactivitate Java - JavaScript

Radu Greab

Netscape Navigator, unul dintre browserele cele mai utilizate pentru navigarea prin Internet, înglobează o serie de tehnologii care permit în interiorul unei pagini HTML interactivitate între Java, JavaScript si plug-in-urile Navigatorului. LiveConnect este numele generic al acestei familii de tehnologii.

Voi încerca să vă prezint modul de comunicare Java – JavaScript. JavaScript este un limbaj interpretat de Navigator, folosit în ge neral pentru a realiza documente HTML interactive, cu formulare pentru preluare de date, verificarea partială a corectitudinii acestora înainte de a fi trimise înapoi serverului, etc. Limbajul Java, desi si el este interpretat, e mai puternic decât JavaScript deoarece are mult mai multe facilităti: suport pentru interfete utilizator grafice, suport pentru conectări la baze de date, lucru în retea, criptare de date.

Comunicatia JavaScript - Java

Pentru a putea realiza comunicatia JavaScript – Java, trebuie să activati LiveConnect. Începând cu versiunea 3.0 beta4, acest lucru se realizează prin setarea ambelor casete de bifare din Options/Network Preferences/Languages.

Puteti apela direct metode Java. Clasele Java sunt organizate după functiile lor si după firma care le-a dezvoltat, în pachete de clase (packages). În JavaScript, pachetele de clase sunt atribute ale obiectului Packages. Referirea la metoda unei clase se face utili zând notatia:

[Packages.]<numePachet>.<numeClasa>.<numeMetoda>

Cuvântul Packages este optional pentru pachetele java, sun si netscape, în codul JavaScript cuvintele java, sun si netscape fiind de fapt alias-uri pentru Packages.java, Packages.sun si Packages.netscape. Pentru pachetele de clase dezvoltate de alte firme de software cuvântul Packages nu mai este optional.

Listingurile 1 si 2 prezintă două exemple simple: primul afisează la consola Java textul „Hello world“, iar al doilea afisează la consolă valoarea maximă, respectiv, valoarea minimă cu care poate lucra clasa Long.

Din JavaScript puteti apela chiar si constructori de clase si puteti să aveti propriile instante de obiecte Java în JavaScript. Exemplul din listingul 3 creează o instantă a clasei Date (clasă care există de fapt si în JavaScript ) si afisează data respectivă in formatul definit local si în conventia Internet GMT.

După cum remarcati, câmpurile, metodele unei clase, constructorii de clase se apelează din JavaScript folosind aceeasi sintaxă ca în limbajul Java.

Listing 1

java.lang.System.out.println( "Hello world!" )
Output: Hello world!

Listing 2

var Long = java.lang.Long; // atribuie variabilei Javascript Long clasa Long
var Sys = java.lang.System; // atribuie variabilei Javascript Sys clasa System
Sys.out.println( "Valoarea maxima pentru Long este: " + Long.MAX_VALUE );
Sys.out.println( "Valoarea minima pentru Long este: " + Long.MIN_VALUE );
Output: Valoarea maxima pentru Long este: 9223372036854776000
Valoarea minima pentru Long este: -9223372036854776000

Listing 3

var data = new java.util.Date(); // construieste o noua instanta a clasei Date
var Sys = java.lang.System; // atribuie variabilei Javascript Sys clasa System
Sys.out.println( "Data locala: " + data.toLocaleString() );
Sys.out.println( "Data GMT: " + data.toGMTString() );
Output: Data locala: 12/19/96 16:41:39
Data GMT: 19 Dec 1996 14:41:39 GMT

Listing 4

<APPLET CODE=Cronometru.class WIDTH=70 HEIGHT=20 NAME=Cronometru> </APPLET>
<FORM>
<INPUT TYPE=button VALUE=Start onClick="document.Cronometru.startCronometru()">
<INPUT TYPE=button VALUE=Stop onClick="document.Cronometru.stopCronometru(); alert( 'Cronometrul a rulat: ' + document.Cronometru.curentSec + ' secunde.' )">
</FORM>

Listing 5

JSObject win = JSObject.getWindow( this );
JSObject doc = ( JSObject ) win.getMember( "document" );
JSObject forms = ( JSObject ) doc.getMember( "forms" );
JSObject firstForm = ( JSObject ) forms.getSlot( 0 );
JSObject elements = ( JSObject ) firstForm.getMember( "elements" );
JSObject firstElement = ( JSObject ) elements.getSlot( 0 );
String s = ( String ) firstElement.getMember( "value" );
System.out.println( "Valoarea primului element din primul formular: " + s );

Listing 6

JSObject win = JSObject.getWindow( this );
JSObject newWindow = ( JSObject ) win.eval( "open('')" );
newWindow.eval( "document.open()" );
newWindow.eval( "document.write( '<H1>Document creat dinamic din Java</H1>' ) " );
newWindow.eval( "document.write( '<a href=\ "http://www.agora.ro\ ">Situl Agora </a>' )" );
newWindow.eval( "document.close()" );

Listing 7

JSObject win = JSObject.getWindow( this );
String sURL = "http://www.agora.ro";
Object parametri[] = new Object[1];
parametri[0] = ( Object ) sURL;
win.call( "open", parametri );

Chiar dacă nu stiti care e structura internă a unui applet (cum sunt implementate metodele sale) dintr-o pagină HTML, aveti acces la datele si metodele publice ale acestui applet si a claselor de bază din care este derivat.

Un applet se include într-o pagină HTML folosind tagul APPLET cu sintaxa:

<APPLET [CODEBASE=<url>] CODE=<fisierApplet.class> WIDTH=<latimePixeli> HEIGHT=<înaltimePixeli> [NAME=<numeAppletÎnDocument>] [MAYSCRIPT]>
[PARAM NAME=<numeParametru> VALUE=<valoareParametru>]
</APPLET>

Tagul APPLET îi spune browserului să încarce appletul aflat în fisierul <fisierApplet.class> cu URL-ul implicit sau cu URL-ul format prin concatenarea la URL-ul specificat în atributul CODEBASE a numelui fisierului în care se găseste codul appletului, să-i aloce un spatiu de afisare de dimensiune <lătimePixeli> x <înăltimePixeli> (pe care appletul îl poate modifica dacă do reste). Atributul NAME specifică un nume prin care acest applet poate fi accesat în do cumentul HTML. Vom vedea mai jos ce înseamnă atributul MAYSCRIPT. Un applet poate avea si parametrii (echivalentul argumentelor din linia de comandă a unei aplicatii), dar parametrii appletului se accesează prin nume si nu prin pozitia lor în linia de comandă ca în cazul aplicatiilor standard.

Dacă am definit un applet într-un document HTML, din JavaScript ne referim la acest applet utilizând următoarele moduri posibile:

• document.<numeAppletÎnDocument> dacă am specificat o valoare pentru atributul NAME al tagului APPLET;

• document.applets["<numeAppletÎnDocument>"] este echivalent cu primul mod, dar în acest caz ne folosim de tabloul asociativ ( hash-array ) applets;

• document.applets[<indiceApplet ÎnDocumentHTML>] unde indicele re prezintă al câtelea applet este acesta în cadrul paginii HTML.

Ca exemplu am folosit un applet care simulează un cronometru simplu. În listingul 4 avem o sectiune dintr-un document HTML în care folosim interactivitatea Java Script – Java. În tagul APPLET atribuim atributului NAME valoarea Cronometru. Appletul cronometru are două metode pu blice ce sunt accesate din codul Java Script: startCronometru() porneste cronometrul din momentul de timp 0, iar stopCronometru() opreste ceasul crono metrului. Appletul are si o variabilă publică - curentSec - în care se memorează numărul de secunde trecute de la pornirea cronome trului. Sub applet avem cele două butoane de control ale cronometrului: butonul Start va porni cronometrul. La butonul Stop observăm că pe lîngă faptul că opreste cronometrul, actionarea acestui buton va citi valoarea variabilei curentSec si va afisa un mesaj cu numărul de secunde trecute de la pornirea cronometrului.

Comunicatia Java - JavaScript

Uneori e nevoie ca din appleturi Java să rea lizati lucruri pe care numai din JavaScript le puteti realiza, de exemplu să deschideti o altă fereastră a Navigatorului, să creati di namic un document, etc. Pentru a accesa functii, metode sau proprietăti ale obiec telor JavaScript, trebuie să importati în codul sursă al appletului pachetul de clase netscape.javascript. Acest pachet con tine o singură clasă, JSObject si o clasă ex ceptie, JSException. Apoi, pentru ca appletul să poată rula, în tagul APPLET includeti si atributul MAYSCRIPT. Acest atribut este un element de securitate prin care i se indică Navigatorului faptul că ap pletul are acces la metode si functii Java Script. Creatorul unui document HTML este cel care decide dacă un anumit applet poate avea acces la JavaScript, prin adăuga rea sau scoaterea din tagul APPLET a atri butului MAYSCRIPT. Dacă un applet nu are atributul MAYSCRIPT si încearcă să acceseze functii JavaScript va rezulta o exceptie JSException si appletul nu va fi capabil să lucreze cu JavaScript.

Primul lucru pe care îl face un applet ce doreste JavaScript este să obtină un handle pentru fereastra Navigatorului în care se află. Metoda statică getWindow a clasei JSObject primeste ca parametru o instantă ap plet si întoarce fereastra în care se află acest applet. Odată obtinută această fereas tră, ap pletul are acces la obiectele JavaScript si proprietătile lor, precum si la metodele JavaScript.

În Java, orice obiect JavaScript este în capsulat într-o instantă a clasei JSObject care se comportă ca un wrapper.

Valorile transferate din Java în JavaScript sunt transformate după următoarele reguli:

Valorile JavaScript, cînd ajung în Java, se transformă după următoarele reguli:

Citirea atributelor obiectelor JavaScript se realizează cu ajutorul metodelor getMember() si getSlot() ale clasei JSObject. Metoda getMember() are ca parametru un string care identifică prin nume atributul obiectului JavaScript asupra căruia se aplică metoda, iar parametrul metodei getSlot() este un indice în tablo ul JavaScript asupra căruia se apelează. Me todele getMember() si getSlot() întorc o instantă Object. Pentru a putea utiliza a ceastă instantă este necesar un cast expli cit către un anumit tip de obiect. În listingul 5, obtinem un handle la fereastra Navigatorului, apoi o referintă la obiectul document, o referintă la tabloul forms si o referintă la primul form din acest tablou, adică la primul formular din pagina HTML. În continuare, accesăm primul element al acestui formular si încercăm să-i obtinem valoarea sub forma unui string.

Prin apelarea metodelor getMember() si getSlot() se modifică atributele obiec telor JavaScript. Ca parametri vom trimite un string cu numele atributului, respectiv un indice în tabloul de atribute, si o instantă Object ce contine noua valoare a atributului. Presupunând că am executat pasii din listingul 5, putem modifica valoarea acelui element din formular schimbând toate literele în majuscule:

firstElement.setMember
( "value", ( Object ) s.toUpperCase() );

Metoda removeMember() sterge un atribut al unui obiect JavaScript. Desigur, parametrul metodei este un string ce contine numele atributului ce urmează a fi sters.

Pentru a apela metodele JavaScript, clasa JSObject ne pune la dispozitie două metode: eval() si call(). Metoda eval() are un singur parametru: un string care reprezintă fie o expresie JavaScript, fie una sau mai multe instructiuni JavaScript. În listingul 6 folosim eval() pentru a deschide o nouă fereastră a Navigatorului în care vom genera dinamic un document HTML. După ce obtinem un handle al ferestrei în care se află appletul, creăm o nouă fereastra apelând win.eval() cu argumentul open(‘’), adică se creează o fe reastră vidă. Apelul win.eval() întoarce în caz de reusită un handle la fereastra nou creată. Ultimele patru apeluri eval() execută instructiunile JavaScript document.o pen(), document.write() si document.close(), creând astfel în mod di namic un document HTML.

Metoda call() are doi parametri: pri mul este un string care specifică numele me todei ce va fi executată, iar al doilea parametru este de fapt un tablou de argumente ale metodei. Am folosit metoda call() pentru a deschide o nouă fereastră a Navigatorului, dar de această dată metodei win.open() îi plasăm ca argument URL spre situl Agora On Line.

Dl. Radu Greab este student în anul IV la Facultatea de Informatică a Universitătii „Petru Maior“ din Târgu Mures.

(C) Copyright Computer Press Agora