Un nou limbaj de programare nu are sanse sa se impuna fara sa ofere, pe lânga sintaxa propriu-zisa un set de biblioteci sau o ierarhie de clase coerenta si cât mai generala. Atunci când limbajul C a fost prezentat pentru prima data, împreuna cu el a fost prezentata si biblioteca standard de intrare iesire. Primul program C pe care l-am învatat continea deja apelul:
printf( "hello, world!" );Limbajul Java nu numai ca nu face exceptie de la aceasta regula dar chiar o extinde cu ambitia de a oferi totul. Interfata Java pentru programarea aplicatiilor (API) ofera o ierarhie de clase care include functionalitate pentru lucrul cu mai multe fire de executie, lucrul în retea, crearea interfetelor utilizator complexe, grafica, etc.
Acest capitol va prezenta o parte a acestei ierarhii împreuna cu câteva tehnici uzuale de scriere a aplicatiilor Java.
Exista mai multe moduri de a aborda scrierea unui program. Unul dintre acestea este scrierea unui program care are initiativa pe toata perioada rularii. Acest tip de programe executa în permanenta o secventa de cod 17417l1124r , fie si numai o bucla de asteptare a carei conditie depinde de elemente exterioare precum ar fi o apasare de tasta sau sosirea unui pachet de date din retea.
Alternativa este aceea de a scrie programe care intra în executie doar atunci când sunt generate anumite evenimente în sistem. În clipa în care apar aceste evenimente, programul le analizeaza si executa o secventa de cod 17417l1124r specifica evenimentului respectiv. Dupa executia codului, programul se opreste din nou pâna la aparitia unui nou eveniment.
Aceste doua alternative diferite de a aborda scrierea unui program îsi au radacinile în moduri diferite de lucru ale sistemelor de operare si în moduri diferite de a gândi interfata cu utilizatorul.
Java implementeaza ambele stiluri de programe discutate mai sus. În primul caz, avem o clasa de pornire care contine o functie publica principala si care va fi lansata în executie la apelarea programului. În acest caz programul îsi controleaza complet executia ulterioara. În termenii limbajului Java, aceasta este o aplicatie.
În al doilea caz, codul ruleaza în interiorul unui navigator Internet. Clasa de pornire trebuie sa aiba implementate metode de raspuns la anumite evenimente pe care le genereaza navigatorul, precum ar fi initializare, pornire, oprire, desenare, etc. Acest al doilea tip de programe Java le vom numi apleturi.
Distinctia dintre cele doua moduri de organizare a codului este destul de vaga, din cauza ca cele doua moduri de lucru se pot amesteca în
realitate, un obiect aplet putând fi în acelasi timp lansat ca aplicatie independenta si invers. Totul depinde de metodele care au fost definite în interiorul clasei de pornire a programului.
Cea mai simpla aplicatie Java este declaratia unei clase de pornire continând o singura metoda, main , ca în exemplul urmator:
public class HelloWorldAcest exemplu defineste o functie principala care afiseaza un simplu mesaj pe consola aplicatiei. Afisarea este lasata în sarcina clasei java.lang.System care contine în interior implementarea iesirii si intrarii standard precum si a iesirii standard de eroare sub forma unor referinte catre obiecte de tip InputStream pentru in (intrarea standard) respectiv PrintStream pentru out si err (iesirea standard si iesirea standard de eroare).
Numele metodei main este obligatoriu, la fel si parametrul acesteia. Atunci când lansam interpretorul Java împreuna cu numele unei clase care reprezinta clasa de pornire, interpretorul cauta în interiorul acestei clase definitia unei metode numite main . Aceasta metoda trebuie sa fie obligatoriu publica si statica. În acelasi timp, metoda main trebuie sa nu întoarca nici un rezultat si sa accepte un singur parametru de tip tablou de siruri de caractere.
Daca interpretorul gaseste aceasta metoda în interiorul clasei apelate, el lanseaza în executie metoda main . Atentie, metoda main fiind de tip static, nu poate apela decât variabile statice. De obicei însa, metoda main nu face nimic altceva decât sa-si prelucreze parametrul dupa care sa creeze o serie de obiecte care vor controla executia ulterioara a aplicatiei.
Singurul parametru al metodei main este un tablou care contine argumentele aflate pe linia de comanda în momentul apelului. Nu este necesara transmiterea numarului de argumente care au fost gasite pe linia de comanda pentru ca tablourile Java contin în interior informatii relative la numarul de elemente. Acest numar de elemente se poate obtine prin accesarea variabilei length din interiorul tabloului ca în exemplul urmator care listeaza parametrii de pe linia de comanda la lansarea unei clase:
public class ArgumentsApleturile Java ruleaza într-un document HTML. În acest document, fiecare aplet are rezervata o fereastra dreptunghiulara prin care comunica cu utilizatorul. Dreptunghiul de încadrare al ferestrei este definit într-un tag HTML numit APPLET. Aceasta fereastra este în exclusivitate la dispozitia apletului care este responsabil de desenarea ei si de tratarea eventualelor evenimente care se refera la ea.
Noul tag HTML este recunoscut deocamdata doar de anumite navigatoare WWW precum HotJava si Netscape 2.0. Este foarte probabil
ca în viitor majoritatea navigatoarelor sa ofere compatibilitate Java.
Împreuna cu definirea interfetei dintre apleturi si navigator, Sun a definit si o sintaxa specifica noului tag HTML care permite pozitionarea si dimensionarea ferestrei apletului în document precum si specificarea unor parametri care sa poata altera modul de lucru al apletului.
Iata un prim exemplu de aplet:
import java.awt.Graphics;În mod minimal, apletul nostru nu defineste decât doua metode si anume una de initializare, necesara pentru organizarea mediului în care ruleaza apletul si una de desenare a spatiului destinat apletului în interiorul documentului HTML. Metoda de initializare nu face în acest caz decât sa redimensioneze spatiul alocat în mod corespunzator necesitatilor sale în timp ce metoda de desenare afiseaza în acest spatiu un mesaj de salut.
Pentru a vedea rezultatele rularii acestui aplet trebuie sa construim un document minimal HTML, care poate sa arate în felul urmator:
<HTML>Iata iesirea programului:
<APPLET CODE="HelloWorldApplet.class" WIDTH=150 HEIGHT=25>Spre deosebire de o aplicatie normala Java, apleturile nu pot primi parametri pe linia de comanda pentru ca nu exista linie de comanda. Din acest motiv, trebuie sa introducem parametrii apletului în fisierul HTML. De exemplu am putea introduce, imediat dupa linia de declaratie a apletului o linie de forma:
<PARAM NAME=mesaj VALUE="Salutare, lume!">si sa modificam codul apletului dupa cum urmeaza:
import java.awt.Graphics;În acest mod putem sa controlam la lansare initializarea apletului. În definitia clasei Applet exista si doua functii care permit navigatorului regasirea unui minim de informatii despre aplet. Aceste informatii reprezinta descrierea apletului si a parametrilor acestuia. Functiile care trebuiesc definite în noua clasa derivata din Applet sunt getAppletInfo si getParameterInfo . De exemplu, putem introduce în clasa HelloWorldApplet doua noi functii:
public String getAppletInfo()Executia unui aplet este marcata de câteva evenimente importante generate de catre navigator. Atunci când navigatorul întâlneste o eticheta APPLET, porneste în primul rând încarcarea codului necesar rularii apletului. Pâna când acest cod nu a ajuns pe calculatorul client, apletul nu poate fi pornit.
Dupa încarcarea codului, apletul este apelat pentru initializare. Acesta este momentul în care apletul îsi pregateste parametrii si obtine de la sistem resursele necesare rularii. Dupa ce initializarea a fost terminata, navigatorul trimite catre aplet o comanda de pornire. Aceasta este comanda care pune efectiv apletul în functiune deschizând interactiunea cu utilizatorul.
Un aplet ruleaza atâta timp cât navigatorul este activ. La schimbarea paginii curente, apleturile din vechea pagina nu sunt distruse, dar primesc o comanda de oprire temporara (pe care de altfel pot sa o ignore). La reîncarcarea paginii, o alta comanda de pornire este lansata spre aplet si acest ciclu se poate relua. În sfârsit, la oprirea navigatorului, apletul primeste o comanda de oprire definitiva, caz în care el trebuie sa elibereze toate resursele pe care le blocheaza.
Orice aplet Java reprezinta, din punctul de vedere al limbajului un nou tip de obiect, derivat din obiectul standard Applet . Atunci când navigatorul lanseaza un nou aplet el nu face altceva decât sa instantieze un nou obiect din aceasta clasa. Subrutinele care trateaza evenimentele descrise anterior trebuiesc definite ca metode în interiorul acestui nou tip de obiecte.
În continuare, între doua evenimente de pornire si respectiv de oprire temporara a apletului navigatorul transmite catre aplet evenimente specifice oricarei interfete grafice cum ar fi evenimentul care provoaca redesenarea spatiului destinat apletului, evenimente legate de apasarea unor taste sau a unor butoane ale mausului, etc. Ca raspuns la aceste evenimente, apletul trebuie sa reactioneze schimbând continutul ferestrei, lansând mesaje sonore, etc. Iata si un exemplu de aplet care ne arata fazele prin care trece un aplet în timpul existentei sale:
import java.applet.Applet;Puteti rula apletul de mai sus pentru a vedea care este ordinea în care sunt apelate aceste metode de catre navigator. Apletul de mai sus produce iesiri la consola (o fereastra text) si nu în fereastra apletului. Daca nu vedeti consola, încercati sa cautati prin meniurile navigatorului optiunea de afisare a consolei Java. Netscape de exemplu are o astfel de optiune în meniul Options-Show Java console.
Din cele spuse pâna acum se poate deduce ca apleturile Java nu au o viata proprie, ele fiind doar apelate din când în când de navigator. Ceea ce nu este întocmai adevarat pentru ca biblioteca standard de clase Java ofera suport pentru aplicatii care folosesc mai multe fire de executie. Apleturile pot astfel crea fire de executie care sa lucreze independent fata de navigator.
Iata descrierea DTD tagului pe care Sun l-a definit pentru introducerea unui aplet într-un document HTML.
<!ELEMENT APPLET - - (PARAM*, (%text;)*)>Atributele obligatorii ale acestei definitii sunt numele fisierului în care este memorat codul si dimensiunea spatiului rezervat apletului. Minimal, tag APPLET arata în felul urmator:
<APPLET CODE="HelloWorldApplet.class" WIDTH=200 HEIGHT=150>Atributele optionale ale tagului descriu locatia de baza a codului apletului, modul de aliniere în pagina, spatierea si eventualii parametrii care pot fi transmisi apletului din interiorul documentului HTML.
Daca codul clasei este în acelasi director cu documentul HTML este suficient sa fie specificat atributul CODE cu numele fisierului unde este acesta memorat. Daca este nevoie de un director diferit, trebuie completat si atributul CODEBASE în care se mentioneaza directorul. De exemplu, daca fisierele .class sunt într-un subdirector numit /clase al directorului care contine documentul HTML, atunci exemplul de mai sus devine:
<APPLET CODE="HelloWorldApplet.class" CODEBASE="clase"Atributul ALIGN specifica modul în care fereastra destinata apletului va fi aliniata în pagina. Valorile sale posibile sunt: LEFT, RIGHT, TOP, TEXTTOP, MIDDLE, ABSMIDDLE, BASELINE, BOTTOM si ABSBOTTOM. Valoarea implicita este BASELINE.
Atributele VSPACE si HSPACE specifica, în pixeli, spatiul care desparte apletul de textul care îl înconjoara.
Pentru a transmite parametrii unui aplet, puteti folosi tagul PARAM asa cum am aratat mai sus.
|