Programare Java Curs – 6 CREAREA DE PROGRAME INTERACTIVE PENTRU WEB Prima oara cand au aparut pe scara larga aplicatiile Java pentru web a fost in 1995 , atunci cand Netscape Navigator a inceput sa ruleze applet-uri . In general o aplicatie Java dedicata utilizarii pe web , in cadrul unei pagini HTML , se numeste applet si are o structura diferita fata de o aplicatie normala scrisa in limbajul Java . DIFERENTA INTRE APPLET-URI SI APLICATII Aceasta diferenta consta in principal in modul cum acestea sunt rulate . Aplicatiile sunt rulate prin intermediul unui interpretor Java care incarca fisierul clasa principal al aplicatiei . Acest lucru se face de obicei din linia de comanda falosind utilitarul “java.exe” al pachetului Java2 SDK ( sau JDK in versiunile mai vechi ) . Pe de alta parte , applet-urile sunt rulate de orice browser care suporta Java – cum ar fi Netscape Navigator , Internet Explorer , Sun HotJava sau Opera . Applet-urile pot fi testate si cu ajutorul utilitarului “appletviewer.exe” , inclus in pachetul Java2 SDK . Trebuie mentionat ca “appletviewer” ignora toate celelalte elemente ale paginii web in care inseram applet-ul nostru scris in Java . Pentru a rula un applet acesta trebuie iglobat intr-o pagina web folosind tag-uri HTML , in acelasi mod in care sunt inglobate imagini sau alte elemente . Atunci cand un utilizator cu un browser compatibil cu Java incarca o pagina web care contine un applet , browser-ul trajsfera codul applet-ului de pe serverul web si il executa pe sistemul local al utilizatorului . Nu este nevoie de un interpretor Java separat – el este inclus in browser . Ca orice aplicatie , un applet Java contine un fisier clasa si orice alte clase externe necesare rularii . Biblioteca de clase standard a Java este inclusa automat . Deoarece applet-urile Java ruleaza in cadrul unui browser Java , o parte din efortul crearii unei interfete utilizator este eliminata ; exista deja o fereastra in care applet-ul poate rula , un loc unde sa se afiseze grafica si de unde sa se primeasca datele de intrare precum si interfata browser-ului . OBS : Este posibil ca un program Java sa functioneze atat ca applet cat si ca aplicatie independenta . Cu toate ca pentru crearea acestor tipuri de programe se folosesc proceduri separate , acestea nu intra in conflict una cu alta . Caracteristicile specifice applet-urilor vor fi ignorate atunci cand programul ruleaza ca aplicatie si viceversa . ALEGEREA VERSIUNII DE JAVA PENTRU DEZVOLTARE In cazul crearii de applet-uri Java pentru web un programator mai are o problema suplimentara in afara de preogramarea propriu-zisa ; programul sau trebuie sa poata rula pe toate browser-ele existente ( mai realist vorbind pe cat mai multe dintre ele ) . In acest moment Java 1.02 este singura versiune de limbaj suportata absolut complet atat de Netscape Navigator cat si de Microsoft Internet Explorer ( aplicatii ce detin in jur de 90 de procente din piata browser-elor ) . Netscape si Microsoft au implementat si versiunile Java 1.1 si 2 ( la momentul actual – inceputul lui 2002 – ultima versiune ) dar implementarile mai produc anumite surprize neplacute , in unele cazuri existand applet-uri care nu functioneaza corect in cazul programarii lor folosind ultima versiune a limbajului . Sun a gasit o modalitate de a ocoli aceste neajunsuri creand un program add-on ( complementar ) pentru browser-e , denumit Java Plug-in , care ne permite sa utilizam imbunatatirile aduse de Java 1.2 sau Java 2 . Acest program add-on este continut in pachetul JDK 1.2 si in toate celelate versiuni ale
1
mediului de dezvoltare : 1.3 si 1.4 ( ultima versiune la momentul februarie 2002 a pachetului de dezvoltare al Sun pentru limbajul Java 2 numindu-se Java2 SDK 1.4.0 ) . In general in acest moment se aplica o formula destul de bizara :
-
applet-urile se scriu folosind elemente Java 1.02 deoarece functioneaza pe toate browser-ele compatibile Java aplicatiile se scriu folosind Java 2 deoarece pot fi rulate pe orice sistem care contine un interpretor Java
Java 2 a fost proiectat astfel incat un program care foloseste numai facilitatile Java 1.02 sa se poata compila si sa ruleze cu succes in cadrul unui browser compatibil Java . Daca un applet foloseste una dintre facilitatile introduse de Java 1.1 sau Java 2 programul nu va rula pe browser-ele care nu suporta aceste versiuni si care nu au instalat add-on-ul de care aminteam mai sus . De multe ori imbunatatirile aduse limbajului de versiunile 1.1 sau 2 nici nu sunt vitale pentru aplicatiile de tip applet , gasindu-si o utilitate mult mai mare in domeniul aplicatiilor Java independente . In unele cazuri de applet-uri scrise pentru Java 1.02 compilatorul ne va atentiona ca anumite elemente au fost inlocuite si ca exista o solutie mai buna ; aceste atentionari ( warnings ) nu sunt mesaje de eroare ale compilatorului , SDK-ul creand un fisier clasa compilat si atragand doar atentia programatorului . RESTRICTII DE SECURITATE ALE APPLET-URILOR Deoarece applet-urile Java sunt executate pe sistemul local al utilizatorului exista unele restrictii foarte serioase referitoare la activitatile de care este capabil un applet . Daca aceste restrictii nu ar exista un programator Java ar putea scrie fara probleme un program care sa stearga toate fisierele de pe un hard disk , sa colecteze informatii private sau sa realizeze diferite brese in securitatea sistemului . Ca regula generala , applet-urile Java functioneaza dupa principiul “better safe than sorry “ ; unui applet ii sunt interzise urmatoarele activitati : -
sa citeasca sau sa scrie pe sistemul local al utilizatorului sa comunice cu un alt site decat cel de unde provine pagina web ce contine applet-ul sa ruleze programe executabile in sistemul local al utilizatorului sa incarce programe din sistemul utilizatorului ( executabile sau biblioteci partajate )
Toate aceste reguli se aplica applet-urilor in mod normal dar exista si posibilitatea ( din configurarea browser-elor ) de a modifica nivelul de securitate dorit , permitand accesul din anumite directoare sau conexiuni catre anumite site-uri . De exemplu , utilitarul “appletviewer.exe” permite definirea unei liste de control al accesului pentru directoarele unde applet-ul poate citi sau scrie fisiere . In practica insa trebuie sa tinem seama de posibilitatea de a intalni restrictii de securitate maxime iar pentru evitarea problemelor programatorul trebuie sa tina seama de actiunile care ii sunt teoretic interzise unui applet . O facilitate nou introdusa de Java 2 este foarte importanta in problema securitatii ; noua versiune a limbajului permite folosirea unor controale de securitate specifice care pot fi introduse sau eliminate din applet-uri si aplicatii . Aceste elemente dau posibilitatea unui utilizator web sa acorde “incredere” unui applet astfel incat acesta sa poata rula fara restrictii pe sistemul local . CREAREA APPLET-URILOR Un program Java contine o metoda main() , folosita pentru crearea obiectelor , stabilirea variabilelor de instanta si apelarea altor metode . Applet-urile nu poseda o metoda main() care sa fie apelata automat la lansarea programului . In schimb exista mai multe metode apelate in diferite puncte ale executiei unui applet .
2
Toate applet-urile sunt subclase ale clsei Applet , care apartine pachetului java.applet . Clasa Applet prezinta doua tipuri de comportament , care trebuie sa fie comune tuturor applet-urilor : -
capacitatea de a opera ca parte a browser-ului si de a trata evenimente ( cum ar fi de exemplu incarcarea paginii in browser ) capacitatea de a prezenta o interfata grafica pentru utilizator si de a prelua date de intrare de la utilizator
Cu toate ca un applet poate folosi orice alte clase are nevoie , clasa Applet este clasa principala care declanseaza executia unui applet . Subclasele pe care le vom crea , apartinand clasei Applet , vor avea formula : public class appletNou extends java.applet.Applet { // cod sursa } Toate applet-urile trebuie declarate public deoarece clasa Applet este o clasa publica . Aceasta cerinta este valabila numai pentru clasa principala a applet-ului ; orice alte clase externe pot fi publice sau private . Atunci cand un browser compatibil Java intalneste un applet Java intr-o pagina web , clasa applet-ului este incarcata impreuna cu celelalte clase externe folosite . Browser-ul creaza automat o instanta a clasei applet-ului si apeleaza metode ale clasei Applet atunci cand au loc anumite evenimente . Diferite applet-uri care folosesc aceeasi clasa folosesc instante diferite deci vom putea introduce mai multe copii ale applet-ului in aceeasi pagina si fiecare se va comporta diferit . PRINCIPALELE ACTIVITATI ALE APPLET-URILOR In locul metodei main() , applet-urile poseda metode care sunt apelate la aparitia anumitor evenimente pe parcursul rularii applet-ului . Un exemplu de astfel de metoda este paint() care este apelata ori de cate ori fereastra applet-ului trebuie afisata sau redesenata . In mod prestabilit aceste metode sunt nule – ele nu fac practic nimic . De exemplu metoda paint() , mostenita de la clasa Applet , este o metoda nula . Pentru a afisa ceva in fereastra applet-ului metoda paint() trebuie suprascrisa cu un comportament care sa permita afisarea de text , grafica sau alte elemente . a.
Initializarea
Initializarea apare o data cu incarcarea applet-ului . Initializarea poate consta in crearea obiectelor de care are nevoie applet-ul , setarea starii initiale , incarcarea unor imagini sau fonturi sau setarea uno parametri . Pentru a defini codul de initializare al unui applet trebuie suprascrisa metoda ini() : public void init() { // codul sursa } b.
Pornirea
Un applet este pornit dupa initializare . Pornirea poate aparea si daca applet-ul a fost anterior oprit . De exemplu un applet este oprit daca utilizatorul browser-ului urmeaza o legatura catre o alta pagina si este pornit din nou atunci cand utilizatorul revine in pagina care contine applet-ul . Pornirea poate aparea de mai multe ori pe parcursul ciclului de viata al unui applet , insa initializarea apare doar o data . Pentru a defini codul de pornire al unui applet trebuie suprascrisa metoda start() : public void start() { // codul sursa
3
} Codul metodei start() poate contine trimiterea anumitor mesaje obiectelor externe sau specificarea intrun anumit mod a faptului ca applet-ul isi incepe rularea . c.
Oprirea
Oprirea si pornirea merg una alaturi de cealalta . Oprirea apare atunci cand utilizatorul paraseste pagina care contine applet-ul curent sau atunci cand applet-ul se opreste singur apeland metoda stop() . In mod prestabilit orice fire de executie ( threads ) pe care applet-ul le-a lansat isi vor continua executia si dupa ce utilizatorul paraseste pagina . Prin suprascriere metodei stop() putem suspenda executia acestor fire si le putem reporni daca applet-ul este vizualizat din nou . In continuare se prezinta o forma a metodei stop() : public void stop() { // codul sursa } d.
Distrugerea
Metoda destroy() permite applet-ului sa-si faca “curatenie” chiar inainte de a se elibera memoria alocata sau de a parasi browser-ul . Putem folosi aceasta metoda pentru a distruge orice fire de executie sau pentru a elibera orice alte obiecte care ruleaza . De obicei nu se suprascrie metoda destroy() decat daca exista anumite resurse care trebuie neaparat eliberate , cum ar fi fire de executie create de applet . Pentru a defini codul de distrugere al unui applet trebuie suprescrisa metoda destroy() : public void destroy() { // codul sursa } In cursurile anterioare a aparut un element inrudit cu destroy() : metoda finalize() . Diferenta intre aceste doua metode consta in faptul ca metoda destroy() se aplica doar applet-urilor iar finalize() este o metoda generica , ce permite unui obiect de orice tip sa-si elibereze resursele . Java poseda un recuperator automat al resurselor utilizate ( garbage collector ) , care administreaza memoria in locul nostru . Acesta recupereaza memoria ocupata de resurse dupa ce programul nu le mai foloseste , asa ca , in mod normal , nu trebuie sa folosim decat foarte rar metode ca destroy() sau finalize() . e.
Desenare
Desenarea este modul prin care un applet afiseaza ceva pe ecran : text , linii , imagini , etc. Desenarea poate aparea de foarte multe ori pe parcursul ciclului de viata al unui applet : o data dupa initializarea applet-ului , alta data atunci cand fereastra browser-ului este adusa in prim plan , alta data atunci cand fereastra browser-ului este mutata si asa mai departe . Pentru a se putea afisa ceva metoda paint() , din subclasa noastra Applet , trebuie suprascrisa . Metoda paint() arata in felul urmator : public void paint (Graphics g) { // codul sursa } Trebuie sa observam ca , spre deosebire de celelalte metode descrise anterior , metoda paint() preia un argument : o instanta a clasei Graphics . Acest obiect este creat si transmis metodei paint() de catre browser , deci nu trebuie sa ne facem probleme legate de definirea sa . Totusi , nu trebuie sa uitam sa importam clasa Graphics din pachetul java.awt in codul applet-ului nostru : import java.awt.Graphics; REALIZAREA UNUI APPLET
4
In cursul 3 s-a creat un applet Java denumit “Palindrom.java” cu scopul de a detalia conceptul de mostenire . Acum revenim la acelasi exemplu privindu-l acum doar ca applet : 1: import java.awt.Graphics; 2: import java.awt.Color; 3: import java.awt.Font; 4: 5: public class Palindrom extends java.applet.Applet { 6: Font f=new Font("TimesRoman",Font.BOLD,36); 7: 8: public void paint(Graphics monitor) { 9: monitor.setFont(f); 10: monitor.setColor(Color.red); 11: monitor.drawString("Go hang a salami , I'm a lasagna hog",5,40); 12: } 13: } Acest applet suprascrie metoda paint() . Deoarece applet-ul afiseaza doar cateva cuvinte pe ecran nu este nevoie de nici o initializare . Astfel nu este nevoie de metodele start() , stop() sau init() . Metoda paint() este locul unde se face toata treaba . Obiectul Graphics transmis metodei paint() pastreaza starea sistemului grafic , prin care se cunosc atributele curente ale suprafetei de desenare . Starea mai contine si detalii privind fontul curent sau culoarea folosita pentru operatiile de desenare . Liniile 9 si 10 definesc fontul si culoarea folosite pentru operatiile grafice . Obiectul Font este pastrat in variabila de instanta f iar obiectul reprezentand culoarea rosie este memorat in variabila red a clasei Color . Linia 11 foloseste fontul si culoarea curente pentru a desena sirul “Go hang a salami , I'm a lasagna hog" in pozitia 5 , 40 . Reamintesc ca pozitia 0 pentru x si y este punctul din stanga – sus al suprafetei de desenare a applet-ului , cu valoarea y crescand in jos asa incat valoarea 40 deplaseaza textul in jos . Daca implementam in clasa metodele corecte pentru applet – init() , start() , stop() , sau paint() – atunci applet-ul nostru va functiona corect fara a avea nevoie de un punct de start explicit . INSERAREA UNUI APPLET INTR-O PAGINA WEB Dupa ce am creat clasa sau clasele care compun applet-ul si le compilam in fisiere de tip class trebuie sa cream o pagina web in care sa introducem applet-ul . Applet-urile se insereaza intr-o pagina folosind eticheta HTML