Managementul Unei Baze de Date Multimedia Folosind Jsp

I. Memoriu tehnic

1. Ce este Java?

Java nu este numai un limbaj de programare, Java este un mediu de programare ce oferă utilizatorului cadrul necesar și uneltele necesare dezvoltării aplicațiilor Java. Java este o tehnologie care oferă suport dezvoltării de aplicații distribuite, independente de platformă. Programele Java pot rula pe diferite tipuri de platforme conectate într-o rețea privind rețeaua ca un calculator unic. Ceea ce avantajează limbajul Java, comparativ cu alte limbaje este conexiunea sa strânsă cu tehnologia Internet datorită în special așa numitor appleturi Java. Appleturile Java sunt programe Java ce se execută în cadrul browserelor World Wide Web (WWW-web). Java ca limbaj și mediu de programare a fost lansat și este în continuare susținut de cunoscuta firmă Sun Microsystems. Cea mai mare parte a sintaxei de programare Java este moștenită de la C++, dar multe din conceptele de programare obiectuală prezente în Java își au rădăcinile în SmallTalk, Lisp etc. Arhitecții de la Sun au inclus în acest limbaj cele mai noi concepte de programare făcîndu-l o unealtă puternică și ușor de manevrat.

1.1. Scurt Istoric

Rădăcinile limbajului Java se află într-un proiect de cercetare (proiectul "Green") al firmei Sun. Coordonator de proiect era numit James Gosling, unul din veteranii designului softwarelui de rețea. Menirea proiectului era aceea de a creea obiecte casnice "deștepte" și de a le face să comunice unele cu altele. Atunci își face și apariția în scenă simpaticul "Duke", mascota tehnologiei Java. Inițial ca și limbaj de dezvoltare s-a folosit C++. Se pare însă că C++ nu a fost limbajul care să satisfacă cerințele unui astfel de proiect. Ca urmare James Gosling dă naștere unui nou limbaj care-1 va face mai încolo celebru. La început limbajul se numește "Oak" în cinstea arborelui din fața ferestrei lui Gosling. În urma unei demonstrații reușite a proiectului, și implicit a limbajului, firma Sun are o tentativă în Interactive Television Industry, tentativă care va fi însă un eșec. Asta se întâmpla în 1994.

În timp ce Green și Oak își căutau cumpărători în domeniul Televiziuni Interactive o nouă apariție schimbă lumea Internet în primăvara lui 1993: Marc Andreesen, încă student, lucrând la National Center for Supercomputing Applications (NCSA) lansează Mosaic 1.0 primul browser WWW grafic. Pierzând cursa în domeniul televiziunii interactive Oak începe o alta în WWW. Echipa proiectează un nou browser WWW, numit Web Runner, cu capabilități de rulare a aplicațiilor dezvoltate în limbajul Oak.

E momentul în care Oak își schimbă numele în Java, marca Oak existând deja pe piață. Firma Netscape ajută lansarea limbajului Java prin cumpărarea licenței și integrarea lui în browserele Netscape. Java intră astfel în cursa limbajelor de programare evoluate. Astfel, în noiembrie 1995 este disponibilă prima versiune Beta a limbajului Java. De atunci limbajul se află într-o continuă ascensiune trecând de la versiunea 1.0 (în 1995) la 1.1 (în 1997) și la 1.2 (în 1998). Fiecare versiune implementează noi concepte, și noi unelte își fac apariția în lumea Java. Rezultatul este surprinzător în lumea software. Java se profilează ca un limbaj, un mediu de programare puternic, o tehnologie a viitoarelor dezvoltări software. În acest moment cele mai mari firme de software au cumpărat licența Java de la firma Sun în vederea dezvoltării unor produse ce țin de tehnologia Java. Și povestea Java e încă de-abia la început…

1.2. Avantajele limbajului Java

Limbajul Java are câteva caracteristici care l-au făcut și-l fac un limbaj de succes pe piața actuală de software, piață în care o tehnologie apare și dispare de la o zi la alta. Vom încerca în continuare să enumerăm fiecare caracteristică a acestui limbaj, caracteristică ce-l diferențiază și-l avantajează față de alte limbaje de programare.

Simplu. Conceptele fundamentale al limbajului Java sunt deosebit de simple. Programarea în Java se poate învăța în câteva săptămâni. Fără a pierde din puterea limbajului, designerii lui au renunțat la părțile redundante ale unui limbaj, păstrând doar părțile strict necesare. Tot în ideea simplității, tehnologia Java conține așa numitul Garbage Colector, care eliberează programatorul de grija dezalocării zonelor de memorie anterior alocate. Pentru cei familiar cu C++, acest lucru înseamnă că nu mai e nevoie de delete după new. Garbage colectorul este supraveghetorul din umbră care face curățenie după noi, scăpând de datele care nu ne mai trebuie.

Familiar. Limbajul Java respectă o mare parte a gramaticii, a sintaxei de programare C/C++ ceea ce-l face foarte ușor de învățat de către cei care au lucrat în limbajul C/C++. Multe din conceptele C++ care făceau programarea dificilă au fost eliminate, și alte noi din limbajele Eiffel, Ada și Smaltalk au fost adoptate.

Orientatat pe obiecte. Spre deosebire de C++ limbajul Java este în întregime bazat pe obiecte. Nu există aplicație în care să nu existe cel puțin un obiect, o clasă. Orice în Java este un obiect, mai puțin câteva tipuri de date fundamentale. Tehnologia programării orientate pe obiecte (OOP-Object Oriented Programming) este singura care satisface cerințele actuale de dezvoltare software. Probleme complicate găsesc rezolvări simple utilizând OOP. Gradul de intercomunicarea în echipa de programatori se mărește considerabil, depanarea, modificarea codului se face într-un timp mult mai scurt rezultând o eficiență mult crescută a dezvoltării sistemelor software, deci în ultimă instanță un preț mai scăzut.

Robust. Java mărește gradul de siguranță al codului. Există două nivele de verificare: unul la compilare (prezent în marea majoritate a limbajelor) și unul la rulare. Ca urmare un program este mai puțin supus erorilor. Față de C++, multe din trăsăturile acestuia, care de foarte multe ori erau surse de erori, au fost eliminate (ex. pontatorii C++ au fost eliminați). Accesul la tablourile Java este verificat la rulare eliminând astfel posibilitatea accesului accidental sau malițios în afară domeniului tabloului. Conversiile între tipuri de date sunt limitate evitându-se astfel scrierea nepermisă a unor zone de memorie.

Securitatea. Într-o lume în care calculatoarele nu mai pot exista ca entități solitare, fără a fi conectate în rețea, problema securității este una din cele mai strigente. Se pune problema existenței unui nivel de securitate în cadrul limbajului. Gradul de securitate mărit este probabil unul din principalele avantaje ale limbajului Java care l-au făcut atât de popular. Programele Java sunt făcute să ruleze în sisteme distribuite, calculatoarele pe care ele lucrează nu pot fi sigure de proveniența programelor. Ca urmare trebuie oprit accesul acestor programe la unele resurse locale pentru a prevenii eventualele acțiuni malițioase. In vederea acestui lucru există mai multe proceduri de verificare. Pe lângă verificările de la compilare există verificările de la execuție. Programele Java sunt verificate pas cu pas în timpul rulării prevenind accesul în zonele nepermise. Acest lucru însă nu era fezabil dacă nu era rezolvată problema accesului în afara tablourilor sau problema conversiilor nepermise. Ca urmare există mai multe nivele de securitate în Java. Problema securității în Java, de altfel ca orice altă problemă de securitate, nu e și nu va fi pe deplin rezolvată niciodată, dar mari specialiști în probleme de securitate lucrează la ea îmbunătățind-o considerabil de la o versiune la alta.

Dinamic. Java este un limbaj dinamic prin faptul că multe decizii privind evoluția programului se iau în momentul rulării. Dat fiind faptul că multe din aplicațiile Java sunt preluate de pe Internet sub formă de appleturi chiar în momentul execuției lor, deci din rețea, aceste programe pot fi actualizate să facă față noilor cerințe, utilizatorul dispunând în orice moment de cea mai nouă variantă.

Independent de platformă. Acesta este încă unul din marile avantaje ale limbajului Java. Într-o lume în care fiecare mare companie de software încearcă să monopolizeze piața forțând o dependență de sisteme hardware, de sisteme de operare, de propriile standarde, Java aduce un aer proaspăt de cooperare, de limbaj viabil pentru toate platformele. Această independență de platformă se impunea, ținând cont de ideea de lucru în sisteme distribuite. De fapt un program Java lucrează pe o singură mașină: mașina virtuală Java (Java Virtual MachineJVM). Aceasta este o platformă virtuală transpusă în realitate prin intermediul interpretorului. Java este un limbaj interpretat. Programele executabile Java, numite și bytecodes sunt rezultatul compilării unui program text. Pentru a putea fi executate pe o anumită platformă (Windows, Unix) acestea au nevoie de un interpretor caracteristic respectivei platforme. Interpretorul va convertii bytecodul Java în cod executabil pe mașina reală pas cu pas, instrucțiune cu instrucțiune. Ca urmare a utilizării interpretorului un program Java poate rula pe orice platforma pentru care există un interpretor Java. Problema utilizării interpretorului este însă cu două tăișuri. Partea negativă este că folosirea interpretorului duce la mărirea timpului de execuție. Soluția este compilarea justin-time (JIT) care transformă întregul program Java în program mașină înainte de execuția lui. Compilatoarele just-in-time lucrează ca și interpretoarele doar că conversia nu se face la nivel de instrucțiune ci la nivel de program, crescând considerabil viteza de execuție a programului Java.

Suport pentru multithreading. Multithreadingul este cel care permite ca un program să execute mai multe sarcini aparent în același timp, utilizând mai multe fire de execuție (threaduri). Un program care nu poate executa mai multe sarcini simultan nu mai poate face față lumii noi din informatică, unde se cere tot mai mult în cît mai puțin timp. Java oferă suport pentru multithreading la nivel de limbaj deci la cel mai jos nivel (clasa Thread) oferindu-i astfel utilizatorului posibilitatea de a crea un nou fir de execuție ca și cum ar crea oricare alt obiect. Mai mult, Java permite comunicarea între fire de execuție precum și sincronizarea lor.

Interconexiunea cu browsere WWW. Acesta este unul din avantajele care a făcut limbajul Java așa de popular. Multe din firmele care dezvoltă browsere WWW au implementat mașina virtuală Java în interiorul acestor browsere. Aici amintim două din cele mai utilizate browsere care suportă la ora actuală Java: Netscape Navigator( și Communicator) al firmei Netscape și Internet Explorer al firmei Microsoft. Un browser compatibil Java permite unui tip special de aplicații, numite appleturi să fie transferate de la serverul WWW pentru a fi executate la client, adică pe calculatorul unde se execută browserul WWW. Conexiunea browserului cu appleturile se face prin intermediul etichetelor html, html fiind limbajul în care se scrie o pagină web.

Având în vedere aceste caracteristici, Java se conturează ca un limbaj performant cu șanse mari de a se impune tot mai mult în lumea informaticii. Tehnologia Java este una din cele mai dinamice. Concepte noi, librării noi, unelte noi apar zi de zi.

1.3. Dezvoltarea și execuția unui program Java:

Fig. 1.1. Executia unui program Java

Cel mai simplu program in Java arată cam așa:

class FirstApplication{

public static void main(String args[]){

System.out.println("This is our first Java application");

}

}

Java este pe lângă un limbaj de programare ostui lucru există mai multe proceduri de verificare. Pe lângă verificările de la compilare există verificările de la execuție. Programele Java sunt verificate pas cu pas în timpul rulării prevenind accesul în zonele nepermise. Acest lucru însă nu era fezabil dacă nu era rezolvată problema accesului în afara tablourilor sau problema conversiilor nepermise. Ca urmare există mai multe nivele de securitate în Java. Problema securității în Java, de altfel ca orice altă problemă de securitate, nu e și nu va fi pe deplin rezolvată niciodată, dar mari specialiști în probleme de securitate lucrează la ea îmbunătățind-o considerabil de la o versiune la alta.

Dinamic. Java este un limbaj dinamic prin faptul că multe decizii privind evoluția programului se iau în momentul rulării. Dat fiind faptul că multe din aplicațiile Java sunt preluate de pe Internet sub formă de appleturi chiar în momentul execuției lor, deci din rețea, aceste programe pot fi actualizate să facă față noilor cerințe, utilizatorul dispunând în orice moment de cea mai nouă variantă.

Independent de platformă. Acesta este încă unul din marile avantaje ale limbajului Java. Într-o lume în care fiecare mare companie de software încearcă să monopolizeze piața forțând o dependență de sisteme hardware, de sisteme de operare, de propriile standarde, Java aduce un aer proaspăt de cooperare, de limbaj viabil pentru toate platformele. Această independență de platformă se impunea, ținând cont de ideea de lucru în sisteme distribuite. De fapt un program Java lucrează pe o singură mașină: mașina virtuală Java (Java Virtual MachineJVM). Aceasta este o platformă virtuală transpusă în realitate prin intermediul interpretorului. Java este un limbaj interpretat. Programele executabile Java, numite și bytecodes sunt rezultatul compilării unui program text. Pentru a putea fi executate pe o anumită platformă (Windows, Unix) acestea au nevoie de un interpretor caracteristic respectivei platforme. Interpretorul va convertii bytecodul Java în cod executabil pe mașina reală pas cu pas, instrucțiune cu instrucțiune. Ca urmare a utilizării interpretorului un program Java poate rula pe orice platforma pentru care există un interpretor Java. Problema utilizării interpretorului este însă cu două tăișuri. Partea negativă este că folosirea interpretorului duce la mărirea timpului de execuție. Soluția este compilarea justin-time (JIT) care transformă întregul program Java în program mașină înainte de execuția lui. Compilatoarele just-in-time lucrează ca și interpretoarele doar că conversia nu se face la nivel de instrucțiune ci la nivel de program, crescând considerabil viteza de execuție a programului Java.

Suport pentru multithreading. Multithreadingul este cel care permite ca un program să execute mai multe sarcini aparent în același timp, utilizând mai multe fire de execuție (threaduri). Un program care nu poate executa mai multe sarcini simultan nu mai poate face față lumii noi din informatică, unde se cere tot mai mult în cît mai puțin timp. Java oferă suport pentru multithreading la nivel de limbaj deci la cel mai jos nivel (clasa Thread) oferindu-i astfel utilizatorului posibilitatea de a crea un nou fir de execuție ca și cum ar crea oricare alt obiect. Mai mult, Java permite comunicarea între fire de execuție precum și sincronizarea lor.

Interconexiunea cu browsere WWW. Acesta este unul din avantajele care a făcut limbajul Java așa de popular. Multe din firmele care dezvoltă browsere WWW au implementat mașina virtuală Java în interiorul acestor browsere. Aici amintim două din cele mai utilizate browsere care suportă la ora actuală Java: Netscape Navigator( și Communicator) al firmei Netscape și Internet Explorer al firmei Microsoft. Un browser compatibil Java permite unui tip special de aplicații, numite appleturi să fie transferate de la serverul WWW pentru a fi executate la client, adică pe calculatorul unde se execută browserul WWW. Conexiunea browserului cu appleturile se face prin intermediul etichetelor html, html fiind limbajul în care se scrie o pagină web.

Având în vedere aceste caracteristici, Java se conturează ca un limbaj performant cu șanse mari de a se impune tot mai mult în lumea informaticii. Tehnologia Java este una din cele mai dinamice. Concepte noi, librării noi, unelte noi apar zi de zi.

1.3. Dezvoltarea și execuția unui program Java:

Fig. 1.1. Executia unui program Java

Cel mai simplu program in Java arată cam așa:

class FirstApplication{

public static void main(String args[]){

System.out.println("This is our first Java application");

}

}

Java este pe lângă un limbaj de programare o tehnologie informatică. Limbajul Java poate fi caracterizat ca un limbaj: simplu, familiar, robust, orientat pe obiecte, dinamic, ce asigură un nivel ridicat de securitate, independent de platformă, adaptat pentru aplicații distribuite, adaptat pentru multithreading.

Un program Java(bytecode) se poate executa pe orice platformă deasupra căreia există o mașină virtuală Java (JVM). Acest lucru implică existența unui emulator Java.

O categorie specială de programe Java este categoria applet-urilor, categoria programelor Java ce se execută în cadrul unui browser WWW.

Pentru lucrul cu tehnologia Java, firma Sun pune la dispoziția utilizatorului un mediu de dezvoltare și testare și-anume mediul Java Developers Kit (JDK). Acest mediu conține o serie de librării (package-uri) de fișiere bytecode (unități executabile Java) și o serie de unelte de lucru pentru crearea, testarea, documentarea, depanarea programelor Java.

Există două tipuri de programe Java: aplicații stand-alone care se execută cu ajutorul unui interpretor Java (java, jre) și applet-uri Java care se execută în cadrul unui browser WWW(appletviewer, Netscape, etc.).

Orice mașină virtuală Java (fie interpretor fie browser) se presupune că are acces la fișierele bytecode existente în mediul JDK. Asta în cazul în care se conformează versiunii. Variabila de mediu CLASSPATH este cea care definește căile de acces la librării.

Etapele de dezvoltare și execuție ale unei aplicații Java stand-alone sunt: editarea fișierului sursă cu ajutorul unui editor text, compilarea cu ajutorul compilatorului ‘javac’ și execuția în JVM cu ajutorul interpretorului ‘java’.

Codul sursă al unei aplicații Java stand-alone trebuie să conțină metoda main definită astfel:

‘public static void main(String arg[ ] )’.

Un applet Java este un program ce se execută la client în contextul unui browser Internet după ce a fost adus de la server (un server WWW).

Etapele de dezvoltare și execuție ale unui applet Java sunt: editarea fișierului sursă Java, compilarea fișierului Java utilizând compilatorul ‘javac’, editarea fișierului html care să conțină tag-ul APPLET de legătură cu fișierul .class, și încărcarea paginii html în browser.

Un applet Java are o altă structură decât o aplicație Java stand-alone.

Un program Java poate fi scris astfel încât să poată fi executat atât ca și aplicație stand-alone cât și ca applet.

Mediul de execuție al limbajului Java, numit și Java Runtime Environment (JRE), reprezintă cadrul de execuție al unui program Java, al unui bytecode Java.

Mediul de execuție Java, JRE, conține două componente importante, fără de care un program Java nu poate să se execute. Aceste două componente sunt pe de-o parte librăriile (package-urile) Java și pe de altă parte mașina virtuală Java (JVM).

2. Java Server Pages

2.1. Scurt istoric

JavaServer Pages este o tehnologie bazatǎ pe platforma Java care permite scrierea aplicațiilor Web cu conținut dinamic cum ar fi: HTML, DHTML, XHTML și XML.

Ideea de bazǎ care a dus la apariția acestei tehnologii a fost sǎ se poată combina codurile Java cu limbajul HTML(Hyper Text Markup Language), și sǎ se convertească într-un servlet cu conținut dinamic.

Primele concepte au fost introduse odată cu apariția serverelor Web Java când s-a abandonat gândirea de a introduce elemente de HTML într-un cod Java și s-a trecut la viziunea de a introduce elemente Java în HTML. A apărut însă o problemǎ de incomoditate reprezentatǎ de faptul cǎ aceastǎ paginǎ trebuia compilată și încărcată din nou pentru a se vedea efectele unor modificări aduse.

Această idee nu a fost însă nouă, deoarece firma Microsoft avea deja lansată tehnologia ASP (Active Server Pages).

Alți concurenți pentru JSP în afară de ASP și SSJS sunt CGI, PHP, CGI/PEARL, ColdFusion și JHTML.

Avantajele principale pe care aceastǎ tehnologie le oferă sunt:

Posibilitatea de separare a conținutului static de conținutul dinamic ceea ce simplificǎ scrierea acestor aplicații.

Suportul oferit pentru scripturi și taguri (ceea ce duce la crearea unor aplicații încapsulate din punctul de vedere al funcționalității).

Posibilitatea scrierii aplicațiilor “Scrie odată și execută oriunde”. Acest lucru înseamnă că o aplicație o datǎ developatǎ va rula pe orice server.

Tehnologia JavaSever Pages este destul de asemănătoare cu alte tehnologii.

2.2. Avantajele JSP

· vs. Active Server Pages (ASP). ASP este o tehnologie Microsoft similară. Avantajele JSP sunt doua. In primul rând, partea dinamica este scrisa in Java, nu in Visual Basic sau alt limbaj specific Microsoft, deci este mai puternic si mai ușor de folosit (si nu trebuie sa cumpărată pe o licența). In al doilea rând, este portabil pe alte platforme non-Microsoft Web server.

· vs. Pure Servlets. JSP nu face nimic in plus față de ceea ce ar putea face un servlet. Dar este mult mai convenabil sa scrii (si sa modifici!) HTML obișnuit decât o mulțime de instrucțiuni println care generează pagina HTML. In plus, separând look-ul de conținut poți sa-ti organizezi mai ușor munca in echipă : experții in Web design construiesc HTML-ul, lăsând loc pentru programatorii să insereze conținutul dinamic.

· vs. Server-Side Includes (SSI). SSI este o tehnologie suportata pe o arie larga pentru includerea unor piese exterioare definite intr-o pagina Web statica. JSP este mai buna pentru ca iți permite sa folosești servleturile în loc sa folosești un program separat pentru generarea conținutului dinamic. Si, SSI este folosit pentru includeri simple de conținut, nu pentru programe care folosesc formulare, fac conexiuni la baze de date, etc.

· vs. JavaScript. JavaScript poate genera HTML dinamic. Este o capabilitate folositoare, dar se descurca doar cu situații in care informația dinamica este bazata pe mediul clientului. Cu excepția cookies, transmiterea HTTP si din formulare a datelor nu este disponibila cu JavaScript. Si, deoarece rulează pe stația client, JavaScript nu poate accesa resurse de pe server cum ar fi baze de date, cataloage, preturi, etc.

· vs. Static HTML. No comment.

2.3. Despre JSP

JSP este o tehnologie a nivelului de prezentare care este bazată pe modelul servelților Java și facilitează lucrul cu HTML. Ca și SSJS (Netscape Server Side JavaScript) permite amestecarea conținutului static HTML cu scripturi pe server (server side scripts) ca să se obțină conținut dinamic. Implicit, JSP folosește Java ca limbaj pentru scripturi; totuși specificația permite folosirea altor limbaje, la fel cum ASP poate folosi alte limbaje (cum ar fi JavaScript sau VBScript). In timp ce JSP cu Java va fi mai flexibil și mai robust decât platformele de scriptare bazate pe limbaje mai simple cum ar fi JavaScript și VBScript.

Pentru a oferi ceea ce e mai bun din ambele tehnologi – o platformă de aplicație Web robustă și simplă, limbaj și unelte ușor de folosit – JSP oferă un set de tag-uri pe server care permit dezvoltatorilor să genereze operațiile pentru conținut dinamic fără a scrie o singură linie de cod Java. Deci dezvoltatori care sunt familiari doar cu scriptarea, sau cei care sunt simpli designeri HTML, pot folosi etichete JSP pentru a genera ușor conținut fără a trebui să învețe Java. Cei mai avansați pot folosi tag-uri sau pot folosi întregul limbaj Java dacă vor să facă operații avansate în paginile JSP.

2.4. Dezvoltarea cu componente

Pentru a înțelege cum JSP poate fi o unealtă foarte puternică și in același timp ușor de folosit, trebuie să se înțeleagă diferența între dezvoltarea Web centrată pe componente și cea centrată pe pagini.

Atât ASP și SSJS au fost proiectate cu ani în urmă, când Web-ul era la început și toată lumea nu făcea decât să arunce datele și prezentările lor într-o pagină web scriptată. Acest model centrat pe pagini a fost ușor de învățat și a permis dezvoltarea rapidă. Totuși, în timp oameni și-au dat seama că nu acesta era modalitatea de a construi aplicații Web mari și scalabile. Logica scrisă pentru mediile cu scripturi era închisă în pagini și era refolosibilă doar prin Cut și Paste. Logica de prezenare era deseori

amestecată cu logica de business și de date, făcând dificilă întreținerea aplicațiilor. Componente sofisticate și reutilizable existau deja în nivelul enterprise și nimeni nu vroia să rescrie acea logică pentru aplicațiile Web. Designeri de HTML și grafică înmânau implementările lor scriptorilor de Web care trebuiau să duplice munca, deseori de mână pentru că nu existau unelte decente pentru a combina scriptarea de pe server cu generarea conținutului HTML. Pe scurt, complexitatea aplicațiilor Web a crescut încet și sigur, devenind evidente limitele modelului centrat pe pagină.

In timp ce se căutau soluții mai bune pentru construirea aplicațiilor Web, componentele erau la modă în lumea client-server. JavaBeans și ActiveX erau mediatizate lumilor Java și Windows de către mediile RAD (Rapid Application Development), ca modalitatea de a dezvolta rapid aplicații complexe. Aceste tehnologii permiteau experților în domeniu să scrie componente pentru aplicații verticale, pe care dezvoltatorii le puteau apoi folosi fără expertiză în acel domeniu. A fost doar o problemă de timp până când această tehnologie a trecut și la Web și a adus programarea centrată pe componente.

JSP este o platformă pentru dezvoltarea centrată pe componente. Este bazată pe un model în care componentele JavaBeans și EJB conțin logica de business și de date pentru o aplicație, și furnizează tag-uri și o platformă de scriptare pentru prezentarea conținutului generat sau returnat de componente în paginile HTML. Din cauza naturii centrate pe componente a JSP-ului, el poate fi folosit atât de programatori Java, cât și non-Java. Dezvoltatorii non-Java pot folosi tag-urile JSP pentru a lucra cu componente create de dezvoltatori Java. Dezvoltatorii Java pot nu numai să scrie și să folosească componentele, dar pot și să folosească Java în pagini JSP pentru un control mai precis asupra logicii de prezentare.

2.5. Modelul de cerere JSP

Să aruncăm o privire asupra modului în care sunt procesate cererile HTTP în JSP. În modelul de bază, o cerere este trimisă direct la o pagină JSP. Figura 2. ilustrează fluxul informației în acest model. Codul JSP controlează interacțiunile cu componentele JavaBeans pentru procesarea logici de business și de date și apoi afișează rezultatele într-o pagină HTML generată dinamic combinată cu cod static HTML.

Fig.1.2. Procesarea cererilor http in JSP

2.6. Cum funcționează tehnologia JSP ?

Engine-ul JSP transformă tag-urile JSP, codul Java dintr-o pagină JSP și chiar și conținutul HTML static în bucăți de cod Java. Aceste bucăți sunt organizate automat de engine-ul JSP în serveleți Java pe care vizitatorii site-ului nu-i văd niciodată și apoi servletul este automat compilat în bytecode Java. In acest fel, când un vizitator cere o pagină JSP, un servlet generat, precompilat face, de fapt, toată treaba. Pentru că servletul este compilat, nu e nevoie ca codul JSP dintr-o pagină să fie interpretat de fiecare dată când este cerută o pagină. Engine-ul JSP trebuie doar să compileze servletul generat o dată după ce a fost făcută ultima modificare a codului; apoi servletul compilat este executat. Pentru că engine-ul JSP, și nu programatorul JSP, generează și compilează servletul automat, JSP oferă atât performanță eficientă, cât și flexibilitatea unei dezvoltări rapide fără a fi necesară compilarea manuală a codului.

2.7. Comparație JSP-ASP

Între cele douǎ tehnologii studiate existǎ mai multe asemănări, dar și deosebiri majore. Nu poate fi decis în unanimitate care dintre cele două tehnologii este mai puternică fiecare are punctele sale forte dar și puncte vulnerabile.

Punctele comune ar fi:

ASP folosește obiecte ActiveX pentru o mai mare funcționalitate iar JSP folosește JavaBeans

Atât ASP cât și JSP sunt limbaje interpretate, ASP-ul este convertit în cod p iar JSP-ul în Java Byte Code

ASP-ul permite crearea de funcții separate de cod iar JSP-ul poate utiliza clase și variabile declarate extern

Există și anumite deosebiri:

ASP folosește ca limbaj Visual Basic Script și Java Script pe când JSP este focalizat pe Java

ASP-ul este deja un produs inclus în Internet Information Server al firmei Microsoft pe când JSP are doar specificații

Câteva considerații care iau partea tehnologiei JSP:

Limbajul Java este mult mai puternic decât Visual Basic Script sau Java Script în aplicațiile client-server

Obiectele ActiveX nu sunt disponibile numai pe platforme Windows, sub sistemul de operare Unix poate fi utilizatǎ doar tehnologia JSP

Un important motiv pentru care JSP este recomandat în defavoarea ASP-ului este datorită faptului cǎ ASP-ul a fost proiectat cu mai mult timp în urmă. Din această cauză, a moștenit principiile conform cărora o paginǎ WWW.,trebuie să fie plină de scripturi. Acest model a fost ușor de învățat și s-a răspândit cu mare ușurință. Odată cu trecerea timpului însă, s-a înțeles că nu acesta este modul în care se pot realiza aplicații mari. Cu acest mod de gândire nu se puteau realiza componente reutilizabile și în alte aplicații.

Pentru a contracara aceste dezavantaje, și pentru a putea crea cu ușurință componente reutilizabile pentru aplicații WWW, componentele JavaBeans respectiv ActveX au fost introduse în Java și în aplicațiile Windows. A fost altfel doar o problemǎ de timp până tehnologia axată pe componente a devenit cea mai bună în dezvoltarea aplicațiilor Web.

JSP a apărut ca fiind deja o platformă axată pe componente. Componentele pe care se bazează sunt componentele JavaBeans și Enterprise JavaBeans. Aplicațiile sunt create astfel încât, valorile, datele, și informațiile returnate de aceste componente sǎ poată fi încadrate și aranjate în pagini HTML.

JSP poate fi folosit atât de către programatori Java avansați cât și de către programatori care n-au o experiență în domeniul programării Java deoarece aceștia pot utiliza componentele pe care cei dintâi le-au creat cu o foarte mare ușurință.

2.8. Sintaxa JSP :

Aceastǎ directivă dă informații motorului JSP pe care acesta le aplicǎ întregii pagini. Cu ajutorul acestei directive putem preciza limbajul de programare utilizat în pagină, pachetele ce vor fi incluse în să sau o paginǎ de eroare care va fi apelată în momentul în care apare o eroare sau o excepție. Directiva poate fi plasată oriunde în pagină dar este bine sǎ fie la începutul paginii, chiar și înainte de instrucțiunea <html>.

Directiva include inserează conținutul unui alt fișier în pagina JSP principală, în locul în care directiva este poziționată. Directiva este utilă în cazul unor elemente care trebuie reutilizate și în alte aplicații. Fișierul inclus nu poate avea instrucțiuni <html> sau <body> deoarece ar da conflict cu cele din pagina principală. În tabelul următor este prezentatǎ sintaxa limbajului JSP valabil pentru versiunea 1.1.

Tabel 1.1.

Ce se întâmplă cu datele provenite dintr-un formular de înscriere?

O pagină JSP este executată de un motor JSP care este instalat pe un server Web sau de un server de aplicații Web. Motorul JSP trimite cererile provenite de la clienți către o paginǎ JSP și răspunsurile paginii JSP către clienți.

Informația care provine de la un utilizator prin introducerea într-un formular de înscriere, va fi păstrată într-un obiect cerere, care este trimis de la client către motorul JSP. Ce se va întâmpla mai departe? Figura 1.3., reprezintă modul în care datele se deplasează între client și server. Motorul JSP trimite cererea către o componentǎ oarecare (componentă JavaBeans, servlet) pe care fișierul JSP o precizează. Componenta preia cererea, efectuând unele operații cum ar fi în cazul nostru citirea dintr-o bazǎ de date și trimite un obiect răspuns înspre motorul JSP. Motorul JSP trece obiectul răspuns către pagina JSP unde datele sunt formatate cu instrucțiuni HTML. Motorul JSP și serverul Web trimit pagina JSP revizuitǎ înapoi către client, unde utilizatorul poate vedea rezultatele în browserul Web. Protocolul de comunicație folosit între client și server poate fi HTTP sau alt protocol. Protocolul cel mai des utilizat este protocolul HTTP. Când protocolul utilizat este HTTP, procesul este descris de clasa HttpServlet. Obiectele cerere și răspuns sunt întotdeauna accesibile implicit în fișierul sursă JSP.

Fig.1.3. Lantul de evenimente a unei aplicatii cu JSP.

În continuare voi prezenta un tabel cu câteva metode utilizate pentru preluarea unui obiect cerere.

Tabel 1.2.

Folosirea elementelor script.

Pentru început, este nevoie de prezentarea unor reguli generale despre elementele de script.

Sintaxa declarațiilor este: <%! … %> și se utilizează pentru declararea variabilelor și metodelor.

Sintaxa expresiilor este: <%= … %> și se utilizează pentru afișarea unor expresii în format String.

Cea de a treia formǎ: <% … %> poate conține atât declarații, expresii sau orice alt tip de cod permis de limbajul valid al paginii. Când se dorește sǎ se treacă la elemente de limbaj HTML, scriptul actual trebuie încheiat cu semnele: “%>”.

Obținerea si instalarea kitului de dezvoltare a servleturilor si JSP:

Primul pas este să se downloadeze un soft care implementează Java Servlet 2.1 sau 2.2 si specificațiile Java Server Pages 1.0 sau 1.1. Se poate lua o versiune gratuita de la Sun, cunoscuta sub numele de JavaServer Web Development Kit(JSWDK), la http://java.sun.com/products/servlet/.

Apoi, trebuie să se spună compilatorului javac unde găsește clasele pentru servleturi si JSP când compilează un fișier servlet. Instrucțiunile de instalare ale JSWDK explică asta, dar in esența este vorba despre specificarea caii spre servlet.jar si jsp.jar (care vin odată cu JSWDK) in CLASSPATH.

Instalare unui server capabil sa ruleze servleturi

Următorul pas este obținerea si instalarea unui server Web care suportă servleturi Java, sau instalarea unui pachet la serverul Web existent. Dacă se folosește un server Web up-to-date, atunci s-ar putea sa existe deja tot ce trebuie. Deși in cele din urma se dorește un server de calitate comerciala, pentru invățare este mai bun un sistem free care se instalează pentru teste. Iată câteva din opțiunile cele mai populare :

· Apache Tomcat.

Tomcat este implementarea și referința oficială a specificațiilor servlet 2.2 si JSP 1.1. Poate fi folosit ca un mic server stand-alone pentru teste de servleturi si JSP, sau se integreză in Apache Web Server. Până în anul 2000, era singurul server care suporta servlet 2.2 sau JSP 1.1. Anul acesta însă și-au anunțat suportul multe alte servere. Tomcat, ca si Apache, este gratuit. Si tot ca și Apache (care este foarte rapid si cu multe suporturi, insa dificil de configurat), Tomcat necesită un efort mai mare de configurare în comparație cu serverele comerciale. Pentru detalii, vizitati http://jakarta.apache.org/.

· JavaServer Web Development Kit (JSWDK).

JSWDK este implementarea oficiala și referința pentru specificațiile servlet 2.1 si JSP 1.0. Este folosit în special ca un server de sine stătător pentru teste de servleturi si pagini JSP, înainte ca acestea sa fie puse pe un server Web care suporta în întregime aceste tehnologii. Este gratuit și eficient, dar cere un pic de efort pentru instalare si configurare. Pentru detalii, vizitati http://java.sun.com/products/servlet/download.html.

· Allaire JRun.

JRun este un motor pentru servleturi si JSP care poate fi integrat în Netscape Enterprise sau FastTrack , IIS, Microsoft Personal Web Server, versiuni mai vechi de Apache, O'Reilly's WebSite, sau StarNine WebSTAR. O versiune care suportă până la 5 conexiuni simultane este disponibila gratuit; versiunea comerciala elimina aceasta restricție si adaugă facilitați cum ar fi o consola de administrare. Pentru detalii, vizitați http://www.allaire.com/products/jrun/ .

· New Atlanta's ServletExec.

ServletExec este un motor rapid de servleturi si JSP care poate fi integrat în cele mai populare servere Web pentru Solaris, Windows, MacOS, HP-UX si Linux. Poate fi downloadat și folosit gratuit, dar multe din facilitățile avansate și utilitare de administrare sunt indisponibile până la obținerea unei licențe. New Atlanta furnizează și un servlet debugger gratuit care lucrează cu cele mai populare Java IDE. Pentru detalii, vizitati http://newatlanta.com/ .

· Gefion's LiteWebServer (LWS).

LWS este un mic server Web gratuit care suporta servlet 2.2 si JSP 1.1. Are de asemenea un plugin gratuit numit WAICoolRunner care adaugă suportul pentru servlet 2.2 si JSP 1.1 la serverele Netscape FatsTrack și Enterprise. Mai există și un număr de componente servlet si JSP într-un pachet numit InstantOnline. Pentru detalii, vizitați http://www.gefionsoftware.com/.

· Sun's Java Web Server.

Acest server este scris în întregime in Java și a fost unul din primele servere Web care a suport complet la specificațiile servlet 2.1 si JSP 1.0. Cu toate acestea, nu mai este sub dezvoltare pentru ca Sun se concentrează asupra serverului Netscape/I-Planet, dar este o soluție populara pentru învățarea servleturilor și a JSP-urilor. Pentru o versiune de încercare, vizitați http://www.sun.com/software/jwebserver/try/. Pentru o versiune academica, vizitați http://freeware.thesphere.com/

2.9. Citirea de request headers

Pentru a ilustra ușurința folosiri servleturilor și a paginilor JSP în continuare este un mic exemplu despre citirea requesturilor.

Citirea de headere este foarte ușoară; se apelează doar metoda getHeader din HttpServletRequest, care returnează un String dacă headerul există in cerere, altfel null. Oricum, sunt câteva headere care sunt atât de utilizate încât au metode speciale. Metoda getCookies returnează conținutul headerului Cookie, parsat și stocat într-un array de obiecte Cookie. Metodele getAuthType și getRemoteUser separă headerul Authorization în elementele componente. Metodele getDateHeader și getIntHeader citesc headerul specificat și îl convertesc in valori Date si respectiv int.

In contrast cu căutarea unui header particular, se poate folosi getHeaderNames pentru a primi un Enumeration cu toate numele de headere primite la o cerere.

In sfârșit, ca un plus la căutarea headerelor de cerere, se poate primi informații și despre linia principală a cererii. Metoda getMethod returnează metoda principala de cerere (in mod normal GET sau POST, dar si altele ca HEAD, PUT, si DELETE sunt posibile). Metoda getRequestURI returneaza URI-ul (partea a URL-ului care vine după host și port, dar înainte de datele din formular). Metoda getRequestProtocol returnează partea a treia din linia de cerere, care este in general "HTTP /1.0" sau "HTTP /1.1".

Exemplu: Tipărirea tuturor headerelor

Iată un servlet iar apoi un JSP care creează un table cu toate headerele pe care le primește, împreună cu valorile lor asociate. Tipărește și cele trei componente ale liniei de cerere principale (metoda, URI si protocol). A se observa claritatea codului JSP.

ShowRequestHeaders.java

import java.io.*;

import javax.servlet.*;

import javax.servlet.http.*;

import java.util.*;

public class ShowRequestHeaders extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

response.setContentType("text/html");

PrintWriter out = response.getWriter();

String title = "Servlet Example: Showing Request Headers";

out.println(ServletUtilities.headWithTitle(title) +

"<BODY BGCOLOR=\"#FDF5E6\">\n" +

"<H1 ALIGN=CENTER>" + title + "</H1>\n" +

"<B>Request Method: </B>" +

request.getMethod() + "<BR>\n" +

"<B>Request URI: </B>" +

request.getRequestURI() + "<BR>\n" +

"<B>Request Protocol: </B>" +

request.getProtocol() + "<BR><BR>\n" +

"<TABLE BORDER=1 ALIGN=CENTER>\n" +

"<TR BGCOLOR=\"#FFAD00\">\n" +

"<TH>Header Name<TH>Header Value");

Enumeration headerNames = request.getHeaderNames();

while(headerNames.hasMoreElements()) {

String headerName = (String)headerNames.nextElement();

out.println("<TR><TD>" + headerName);

out.println(" <TD>" + request.getHeader(headerName));

}

out.println("</TABLE>\n</BODY></HTML>");

}

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}

Același exemplu in JSP:

<%@page contentType="text/html"%>

<%@ page import=" javax.servlet.*" %>

<%@ page import=" javax.servlet.http.*" %>

<%@ page import="java.io.*" %>

<%@ page import="java.util.*" %>

<HTML>

<HEAD>

<title> Pagina JSP </title>

</HEAD>

<BODY BGCOLOR=\"#FDF5E6>

<H1 ALIGN=CENTER> Pagina JSP </H1>

<B> Request Method: </B> <%=request.getMethod()%> <BR>

<B> Request URI: </B> <%=request.getRequestURI()%> <BR>

<B> Request Protocol: </B> <%=request.getProtocol()%> <BR>

<TABLE BORDER=1 ALIGN=CENTER>

<TR BGCOLOR=”#FFAD00">

<TH>Header Name<TH>Header Value

<%

Enumeration headerNames = request.getHeaderNames();

while(headerNames.hasMoreElements()) {

String headerName = (String)headerNames.nextElement();

%>

<TR><TD> <%=headerName%>

<TD> <%=request.getHeader(headerName)%>

<%

}

%>

</TABLE>

</BODY>

</HTML>

3. Servleți

Servleți Java sunt modalități de a extinde funcționalitatea unui server Web. Servleți pot fi văzuți ca apleți ce rulează pe server. Servleți sunt o platformă portabilă și independentă de serverul Web pentru a crea conținut dinamic. Un browser care apelează servleți nu trebuie să suporte limbajul Java pentru că ieșirea unui servlet e în HTML, XML sau orice alt format de conținut.

Servleți sunt scriși în limbajul Java. Aceasta permite servleților să fie suportați pe orice platformă care are o mașină virtuală Java și un server Web care suportă servleți. Servleți pot fi folosiți pe diferite platforme fără a fi recompilați. Pot folosi API-uri generice ca de exemplu JDBC pentru a comunica direct cu resurse enterprise deja existente. Acest lucru simplifică dezvoltarea aplicațiilor.

Servleți sunt extensibili pentru că se bazează pe limbajul Java. Aceasta permite dezvoltatorilor să extindă funcționalitățile unei aplicații Web ca pe o aplicație Java.

Servleți se comportă mai bine ca scripturile CGI. Un servlet este încărcat în memorie odată și apoi este apelat de câte ori este nevoie și se scalează bine fără a fi nevoie de hardware adițional. Odată ce un servlet este încărcat în memorie, el rulează pe un singur thread în timp de CGI-urile trebuie încărcate în procese diferite pentru fiecare cerere (request). Alt avantaj al servleților este că, spre deosebire de CGI, un servlet poate menține și/sau pune în comun conexiuni la baze de date sau alte obiecte Java ceea ce scurtează timpul de procesare.

Servleți simplifică procesul de recuperare a parametrilor dintr-o cerere HTTP; componentele au acces direct la parametri pentru că ele sunt prezentate ca obiecte. Cu scripturile CGI parametri postați de la un form sunt convertiți în proprietăți ale mediului care apoi trebuie citite de program.

Unul din cele mai mari beneficii este că servleții asigură un API (Application Programming Interface) uniform pentru menținerea datelor de sesiune prin toata aplicația Web și pentru interfațarea cu cererile utilizatorului. Datele de sesiune pot fi folosite pentru a depăși limitările aplicațiilor Web datorită fără stare (stateless) a HTTP.

4. Tehnologia Java Server Pages

Tehnologia JavaServer Pages (JSP) a fost proiectată ca să ofere o metodă de dezvoltare a servleților declarativă și centrată pe prezentare. Pe lângă toate beneficiile pe are le oferă servleții, tehnologia JSP oferă posibilitatea de a dezvolta rapid servleți unde conținutul și logică de afișare sunt separate, și posibilitatea de a reutiliza codul printr-o arhitectură bazată pe componente.

Atât servleții cât și paginile JSP descriu cum să proceseze o cerere (de la un client HTTP) și să creeze un răspuns. In timp ce servleți sunt scriși în limbaj Java, paginile JSP sunt documente text care includ o combinație de tag-uri HTML și JSP, cod Java și alte informații. Deși ambele tehnologii pot fi folosite pentru rezolvarea acelorași tipuri de probleme, fiecare își propune să efectueze probleme specifice. Tehnologia servlet a fost dezvoltată ca un mecanism pentru acceptarea cererilor din browsere, pentru extrage date din stratul aplicație sau bază de date, pentru a prelucra datele (mai ales când servletul a accesat baza de date direct), și pentru a formata datele pentru prezentare în browser (de obicei HTML). Un servlet folosește comenzi print pentru a trimite datele HTML, atât tag-urile hard-coded cat și conținutul dinamic bazat pe datele extrase.

Includerea HTML-ului in comenzi print cauzează două probleme. Prima, cand codul HTML este inclus in comenzile print, designeri Web nu pot vizualiza pagina și comportamentul ei până la rulare. A doua, când datele sau afișarea se schimbă, localizarea secțiunii de cod care trebuie schimbată este foarte dificilă. In plus logica de prezentare și cea de conținut sunt amestecate, iar o schimbare în conținut face ca pagina să trebuiască recompilată și reîncărcată pe server.

Paginile JSP oferă un mecanism de specificare a mapării unei componente JavaBeans intr-o prezentare HTML (sau XML). Pentru că paginile JSP sunt text, un designer Web poate folosi unelte de dezvoltare grafice ca să creeze și să vizualizeze paginile. Aceleași unelte pot fi folosite pentru a specifica unde se va afișa datele provenite din straturile EJB sau baze de date. JSP-urile folosesc limbajul Java pentru scriptare, putând crea formatări complexe ca tabele generate dinamic. Unele unelte de editate JSP-urilor pot oferi facilități avansate astfel încât un designer Web poate specifica formatări complexe fără a folosi cod Java. Alternativ, programatori java pot oferi la designeri un set de componente JavaBeans și/sau tag-uri personalizate care au grijă de formatările complexe HTML, astfel încât designeri Web nu trebuie să înțeleagă cum funcționează și să știe să programeze java.

Când o pagină JSP este schimbată, ea este automat recompilată și reîncărcată pe serverul Web. In plus toate paginile JSP dintr-o aplicație pot fi precompilate pentru o eficiență mai mare.

Deci tehnologia JSP permite dezvoltatorilor și designerilor Web să definească clar ce este logică de aplicație și ce este conținut. Astfel designerii pot crea interfețe frumoase și utile fără să cunoască limbajul Java, iar dezvoltatori pot crea o aplicație Web fără să fie experți în interfețe. Bineînțeles, aceste două munci pot fi foarte ușor făcute de o singură persoană.

Ca și servleții, JSP-ul este un mod eficient de a oferi conținut dinamic pe o platformă portabilă. Tehnologia JSP suportă reutilizarea componentelor prin includerea tehnologiei JavaBeans și a tag-urilor personalizate. De menționat că componentele JavaBeans utilizate in paginile JSP nu sunt aceleași cu componentele JavaBeans AWT sau JFC. Aceste componente doar expun niște proprietăți prin metode de Get si Set. Tag-urile personalizate pot fi privite ca componente JavaBeans inteligente cu excepția că acțiunile lor pot interacționa mai bine cu paginile JSP.

In rezumat, tehnologia JSP oferă un mod ușor de a dezvolta conținut dinamic bazat pe servleți, cu avantajul adițional de a avea separat conținutul de grafică. Intr-o pagina proiectată bine, logica de aplicație și cea de afișare pot fi schimbate independent de oameni cu expertiză in arii diferite.

In prezent scripturile CGI sunt folosite pe larg, dar în scădere. Tehnologiile scalabile și ușor de dezvoltat ca servlet și JSP sunt în creștere de piață.

5. Servleți și pagini JSP

Intr-un mediu unde numai tehnologia servelt este disponibilă, servleții pot să se ocupe de logica de procesare complexă, de navigare între ecrane, de accesul da date și de formatarea datelor intr-o pagină HTML. Intr-un mediu unde sunt disponibile ambele tehnologii, paginile JSP ar trebui să se ocupe de majoritatea acestor sarcini.

Codul Java folosit în paginile JSP ar trebui să rămână relativ simplu. Deci, dezvoltatorul ar trebui să încapsuleze sarcinile complexe în tag-uri personalizate și componente JavaBeans. O aplicație Web sofisticată poate să conțină numai din pagini JSP, tag-uri personalizate și componente JavaBeans; servleții sunt rareori necesari.

6. Rolurile componentelor Web

Deși în mod normal componentele Web sunt in principal folosite pentru statul de prezentare a aplicației, in modelul de programare a aplicațiilor J2EE, componentele Web au două roluri: de componente de prezentare și de componente de intrare (front component).

Componentele de prezentare generează răspunsul HTML/XML care determină interfața când sunt randate. O pagină JSP care funcționează ca componentă de prezentare poate conține tag-uri personalizate reutilizabile sau logică de prezentare/afișare. O componentă de prezentare poate fi și un servlet care produce date binare, ca de exemplu o imagine. Componentele de intrare nu fac nici o prezentare, ci se ocupă de celelalte componente și de cererile HTTP pe care le convertesc eventual la o altă formă pe care aplicația le înțelege. Componentele de intrare sunt utile pentru că ele asigură un singur punct de intrare în aplicație, făcând astfel mai ușor de administrat securitatea, starea aplicației și prezentarea uniformă.

In figura 1 este prezentat mecanismul de bază. Componenta de intrare acceptă o cerere, apoi determină componenta de prezentare la care trebuie trimisă. Aceasta procesează cererea și întoarce un răspuns la componenta de intrare, care o trimite mai departe la serverul Web și apoi la utilizator.

6.1. Componenta de intrare

Proma folosește ca componentă de intrare o pagină JSP, dar se poate folosi și un servlet. Pagina JSP simplifică inițializarea componentelor JavaBeans din stratul Web al aplicației. Componenta de intrare parcurge toate datele trimise de pagini și generează evenimente care rezultă din datele trimise. Evenimentele generate de componenta de intrare sunt redirecționate la componenta de prezentare șablon (template).

Componenta de intrare îndeplinește funcția de controler când este folosită intr-o arhitectură MVC.

6.2. Componenta de prezentare

Multe aplicații Web au un coș de cumpărături care conține produsele pe care utilizatorul le-a selectat. In multe aplicații, conținutul acestui coș este afișat de mai multe ori. Tehnologia JSP poate fi folosită pentru a parcurge obiectele ținute în coș și pentru a le afișa. Codul pentru această parte trebuie să fie modular, dat fiind ca el se poate afișa din mai multe puncte ale aplicației. Și aici se aplică principul diviziunii muncii, astfel Web designerii se concentrează asupra cum va arăta aplicația iar dezvoltatorii vor lucra la logica din componentele JavaBeans care manipulează datele din coș. Aceste date pot fi luate din mai multe surse.

Alte cerințe care trebuie îndeplinite de componenta de prezentare sunt: afișarea unei interfețe și a unei utilizări consistente în același timp cu permiterea unor mecanisme de personalizare a prezentării. De exemplu un site are un banner și un meniu de navigare. Aceste bucăți trebuie să fie prezente tot timpul.

Șablonul componentei de prezentare

In figura 2 este ilustrată o aplicație în care toate paginile au in comun un banner, un meniu de navigare, un corp și o bază. Fiecare element din aplicație care poate fi privit ca o componentă utilizată la generarea afișării, poate să conțină elemente dinamice și trebuie sa fie personalizabilă. Acest gen de design de pagini poate beneficia cel mai mult de pe urma tehnologiei JSP cu șabloane.

Sunt două metode de a construi o pagină ca cea din figură. Depinde de granularitatea care se dorește in aplicație, sau se construiește întreaga pagină unitar, sau fiecare bucată este codată într-o pagină JSP separată fiecare construită separat iar apoi puse împreună la rulare.

Exemplul de cod conține o parte a utilizării șablonului cu care se creează o pagină ca în figura 2. Șablonul este construit cu ajutorul unei pagini JSP inclusă (ScreenDefinitions.jsp) și a tag-ului personalizat j2ee:insert. Conținutul paginii este specificat în ScreenDefinitions.jsp. Șablonul folosește tag-ul insert pentru a include la rulare (runtime) componentele care alcătuiesc pagina.

<%@ taglib uri="/WEB-INF/tlds/taglib.tld" prefix="j2ee" %>

<%@ include file="ScreenDefinitions.jsp" %>

<html>

<head>

<title>

<j2ee:insert template=”template” parameter=”HTMLTitle” />

</title>

</head>

<body bgcolor=”white”>

<j2ee:insert template=”template” parameter=”HTMLBanner” />

<j2ee:insert template=”template” parameter=”HTMLBody” />

</body>

<html>

Acest exemplu ilustrează o separare clară între logica de prezentare, date și conținut. Nu există nici un fel de cod Java în această pagină, deci ar putea intra în grija unui om care nu are cunoștințe de Java. Se recomandă folosirea componentelor JavaBeans sau a tag-urilor personalizate pentru redarea datelor. Acestea sunt dezvoltate de un programator familiar cu limbajul Java. Daca sunt dezvoltate într-o manieră generală, JavaBeans-urile și tag-urile pot fi refolosite în alte porțiuni ale aplicației sau în alte aplicații.

6.3. Generare de date binare

Servleții sunt potriviți pentru generarea de date binare ca de exemplu imagini sau conținut special. Cererile pentru acel tip de conținut sunt mapate la servleți care știu să genereze acel tip de conținut, dar din punctul de vedere al clientului Web, el cere o imagine normală. Singura presupunere făcută este că clientul suportă formatul de imagine generată.

Un exemplu comun pe internet este un servlet care generează un grafic cu cotațiile la bursă cu date luate on-line dintr-o bază de date. Această imagine este stocată în memorie și regenerată in fiecare minut. Astfel se salvează timp și crește performanța atât pentru ciclurile de execuție cât și pentru accesul la fișiere.

6.4. Extinderea funcționalității unui server Web

Servleții sunt un mecanism portabil pentru extinderea funcționalității unui server Web. De exemplu, dacă este nevoie să fie suportat un nou format de date, se creează un servlet care apoi este mapat pentru acel tip de date.

Un bun exemplu este un servlet care extinde un server Web pentru paginile JSP. Acest servlet parcurge toate fișierele care au extensia jsp și le compilează în servleți. Acești servleți rezultați sunt apoi executați de un container Web și răspunsul rezultat este trimis la client.

7. Comparație pagini JSP – servleți

Depinzând de componența echipei de dezvoltare, de constrângerile de timp și de arhitectura aplicației, folosirea paginilor JSP și a servleților poate diferi. Ambele tehnologi au avantaje și ar trebui folosite eficient. In unele cazuri nu există o singură opțiune și rămâne la latitudinea managerului de proiect ce tehnologie să se folosească.

Servleți sunt unelte programatice și se potrivesc cel mai bine la funcții de nivel scăzut care nu necesită modificări frecvente.

Paginile JSP sunt un mod de legare a conținutului dinamic și a logicii într-un mod centrat pe prezentare. Paginile JSP ar trebui folosite pentru afișarea părții HTML care e generată. Ele se codează în pagini care seamănă cu HTML cu o structură și conținut familiară celor ce fac pagini de Web. Totuși paginile JSP oferă o putere mai mare decât paginile HTML normale, ele putând trata logica de aplicație prin componentele JavaBeans și tag-urilor personalizate. Chiar și paginile JSP pot fi folosite modular ca componente reutilizabile.

7.1. Design-ul paginilor JSP

Paginile JSP sunt unice prin faptul că ele pot conține atât conținut cât și cod de reprezentare. Astfel oferă o multitudine de opțiuni în proiectarea de aplicații ușor de întreținut și extins. Opțiunile disponibile pentru întrețeserea conținutului cu codului includ componente JavaBeans, tag-uri personalizate și scripleți. In continuare prezentăm aceste opțiuni.

8. Componentele Java Beans

Tehnologia JavaBeans este utilă pentru componente portabile și reutilizabile care se folosesc împreună cu tehnologia JSP. Sunt mai multe modalități de a folosi componente JavaBeans într-o aplicație.

Un mod de a folosi componentele JavaBeans este ca obiecte bazat pe modelul centrat pe date. Dacă aceste bean-uri sunt create specific pentru manipularea și returnarea datelor, ele pot fi folosite in mai multe părți ale aplicației și de mai mulți utilizatori în același timp.

In conjuncție cu o componentă de intrare, un JavaBean poate fi folosit ca și controler. Aplicația Proma folosește un JavaBean pentru procesarea tuturor cererilor primite de la componenta de intrare.

Componentele JavaBeans specifice unei pagini dau logica pentru procesarea datelor și generarea rezultatelor pentru acea pagină. Dezavantajul acestor tipuri de Bean-uri este că sunt mai greu de reutilizat.

9. Tag-uri personalizate

Tag-urile personalizate sunt un mecanism oferit de tehnologia JSP pentru definirea unei funcționalități personalizabile, declarative și modulare în folosirea paginilor JSP. Tag-urile personalizate sunt livrate ca librării de tag-uri și sunt importate într-o pagină JSP folosind directiva taglib. Odată importat, un tag personalizat poate fi folosit în pagină folosind prefixul definit de directivă.

Tag-urile personalizate oferă aceeași funcționalitate ca și componentele JavaBeans. Totuși, spre deosebire de JavaBeans care trebuie declarate mai întâi și apoi accesate folosind metode set și get, tag-urile personalizate funcționează cu o pagină prin obținerea informației de inițializare prin parametrii definiți la crearea tag-ului. Tag-urile au acces la containerul Web și la toate obiectele disponibile în paginile JSP. Tag-urile pot modifica răspunsul generat. Tag-urile pot și să fie imbricate cu alte tag-uri, permițând interacțiuni complexe în pagina JSP.

Tag-urile personalizate sunt portabile și reutilizabile. Sunt scrise în limbajul Java care le permite să fie utilizate pe mai multe platforme și containere Web. Dacă se plănuiește refolosirea tag-urilor, la design trebuie avut grijă să nu existe bucăți de cod specifice aplicației.

Tag-urile personalizate sunt ideale pentru iterare prin date și generare de cod HTML. Folosirea bună a tag-urilor personalizate poate reduce, sau chiar elimina, cantitatea de cod Java dintr-o pagină HTML pentru generare de conținut dinamic. Porțiuni de pagină care necesită logică, cum ar fi ciclări sau afișări de stare, sunt de asemenea locuri bune pentru a folosi tag-uri personalizate.

In plus față de randarea HTML, tag-urile personalizate pot fi folosite pentru procesare de date. Aceasta reduce cantitatea de cod Java necesar într-o aplicație și face părți din aplicație configurabilă de Web designer.

10. Folosirea scripleților și a expresiilor

Când se proiectează un site Web cu conținut dinamic și interactiv, poate fi necesar să se folosească mici bucăți de cod pentru generarea conținutului. Scripleții sunt mici fragmente de cod în limbajul definit de parametrul language din directiva page a JSP-lui. Expresiile sunt ca și scripleții, doar că sunt rulați direct la răspuns.

Pentru menținerea codului ușor de citit și menținut, se recomandă ca paginile JSP să fie folosite în principal pentru prezentare. Deși o mare parte a aplicației ar putea fi dezvoltată în tehnologia JSP, plasarea de bucăți mari de cod în paginile JSP le face mai dificil de adus la zi și îi confundă pe Web designeri.

Se recomandă includerea de cod Java doar acolo unde este necesar. Componentele JavaBeans și tag-urile personalizabile oferă metodele de adăugare de funcționalitate și în același timp evitându-se scripleții.

11. Proiectarea aplicației Web

Există multe modalități de a proiecta o aplicație Web. Complexitatea unei aplicații depinde diferite nevoi și necesități ca de exemplu limitări în dezvoltarea aplicației, longevitatea aplicației, și dinamismul conținutului aplicației. Chiar dacă aplicația originală nu este intenționată pentru o difuzare masivă, este întotdeauna benefic să se proiecteze astfel încât aplicația să poată fi scalată și migrată pe măsură ce scopul aplicației se schimbă.

Patru tipuri generale de aplicații Web pot fi implementate cu platforma J2EE: pagini HTML simple, HTML cu pagini JSP de bază, pagini JSP cu componente JavaBeans și aplicați structurate care folosesc componente modulare și enterprise beans. Primele trei tipuri de aplicații sunt considerate a fi centrate pe Web (Web-centric), în timp ce ultima este centrată pe EJB (EJB-centric). Spectrul de design-uri de aplicații este prezentat în figura 3:

12. Aplicații cu pagini JSP de bază și servleți

Aplicațiile Web cu pagini JSP de bază și servleți sunt similare în complexitate cu HTML-ul convențional și aplicațiile bazate pe CGI foarte folosite pe Web, cu excepția că porțiunile dinamice ale paginilor și interacțiunea cu utilizatorul sunt manevrate de JSP sau servleți în loc de scripturile CGI.

Aplicațiile HTML cu pagini JSP de bază sunt aplicații Web destul de simple cu mult din logica lor în servleți sau pagini JSP. Aceste aplicații pot fi dezvoltate rapid dar sunt mai dificil de extins și întreținut.

In aceste aplicați simple unele pagini afișează conținut HTML static. Unde este nevoie să afișeze conținut dinamic (de exemplu conținut generat folosind date dintr-o bază de date), o pagină JSP sau servlet ar trebui să conțină cod de conectare la baza de date și să aducă datele.

In aceste aplicații simple, afișarea nu se va schimba frecvent. Conținutul folosit pentru afișarea aplicației va fi legat de aplicație. Aceasta înseamnă ca schimbările la paginile dinamice pot fi făcute doar de specialist în limbajul Java.

Includerea unei importante porțiuni din logică în pagini JSP sau servleți este potrivită pentru prototipizarea unei aplicații, ca de exemplu site-urile Intranet, unde nu se așteaptă ca aplicația să fie folosită de un număr mare de utilizatori.

Pe măsură ce complexitatea aplicației crește ar fi folositor un model care permite o modularizare mai mare a componentelor.

13. Aplicații cu componente modulare

La dezvoltarea unei aplicații Web cu conținut dinamic și un grad ridicat de interacțiune cu utilizatorii, ar trebui folosite pagini JSP cu componente JavaBeans, tag-uri personalizate și pagini JSP incluse. Aceste trei tipuri de componente pot fi folosite pentru generarea conținutului, procesarea cererilor și afișarea conținutului personalizat.

Figura 8. arată calea pe care un utilizator ar putea să o folosească printr-o aplicație Web ipotetică și interactivă și arată cum componentele reutilizabile pot fi folosite la fiecare pas din proces.

Cu toate că această aplicație pare simplă este nevoie de un număr de componente să ghideze utilizatorul prin proces. Crearea mai multor componente modulare va permite reutilizarea a mai mult cod și va face aplicația mai ușor de întreținut.

Componente modulare într-o pagină JSP

Paginile JSP pot fi create folosind o varietate de componente. Folosite consecvent aceste componente dau aplicației o interfață constantă. Această tehnică este similare cu cea a șabloanelor, și totuși fiecare pagină poate fi unică dacă e necesar. Figura 6 arată cum se proiectează o pagină JSP care conține produse obținute dintr-un catalog implementat ca o componentă JavaBeans.

In acest exemplu fișierul banner.jsp conține o componentă reutilizabilă. Așezarea logicii de afișare a bannerului din site într-o singură pagină JSP înseamnă că nu e nevoie ca codul bannerului să apară pe fiecare pagină. In loc, pagina JSP care conține codul bannerului este adăugată la fiecare pagină folosind o includere la rulare (runtime include).

In centrul pagini corpul este generat folosind date din componenta Catalog (și posibil niște tag-uri personalizate pentru randarea HTML a datelor). Un Catalog se conectează la o sursă de date externă folosind o conexiune obținută prin componenta JDBC. Un Catalog este de asemenea responsabil pentru reactualizarea datelor sau menținerea datelor care au fost introduse anterior în aplicație.

Procesarea cererilor cu componente modulare

Procesarea cererilor utilizatorilor este alt aspect important al comportamentului aplicației Web care poate fi implementat eficient folosind componente modulare. Aplicațiile care folosesc componente modulare pentru procesarea cererilor vor fi mai ușor de implementat și întreținut.

Figura 7 înfățișează cum datele dintr-un formular vor fi procesate într-o aplicație Web. In acest exemplu un utilizator trimite date dintr-un browser. Datele sunt trimise la procesorul ce cereri, care extrage datele utilizator și le transformă în date-aplicație menținute de o componentă aplicație JavaBeans. Componenta aplicație este stocată într-o bază de date folosind o conexiune JDBC, care este de asemenea o componentă JavaBeans. Dacă datele au fost introduse corect, procesorul de cereri direcționează utilizatorul la pagină potrivită.

Pentru a evita confuziile, componentele JavaBeans care interacționează cu utilizatorii și cu datele externe (în acest exemplu procesorul de cereri), ar trebui să fie separate de componentele care reprezintă datele (componenta-aplicație JavaBeans). Această separare dintre conținut și date permite componentelor să fie refolosite și întreaga aplicație să poată migra la un design mai complex dacă se schimbă scopul.

14. Afișarea conținutului personalizat

O pagină JSP care afișează conținutul personalizat este similară cu exemplul din figura 6, cu excepția că datele afișate sunt obținute dintr-o componentă-aplicație.

Datele folosite pentru generarea conținutului acestei pagini include date introduse de utilizator. Pagina poate, de asemenea, să includă alte informații personalizate la nevoile utilizatorului. După crearea unui cont, utilizatorii pot fi duși direct la o pagină personalizată de fiecare dată când intră în aplicație. Datele care reflectă vizitele anterioare ale unui utilizator pot fi salvate ca o parte a contului utilizatorului și pot fi folosite la generarea conținutului aplicației văzută de acel utilizator.

Acest tip de aplicație poate fi utilizat în multe situații; dar dacă o aplicație care folosește acest design devine mai mare, nivelul de complexitate crește. Programatorul alocă mai mult timp la problemele de sistem, cum ar fi dirijarea conexiunilor, a stărilor aplicației și conducerea tranzacțiilor. Migrarea la un design centrat pe EJB va permite dezvoltatorului să se contreze asupra designului aplicației.

O aplicație bine proiectate folosind pagini JSP cu componente JavaBeans și tag-uri personalizate va avea o separare clară între logica de afișare și logica de business. Conținutul va fi mai ușor de modificat și componentele, dacă sunt proiectate bine, vor fi refolosibile. Marea slăbiciune a acestui design este faptul că programatorii vor trebui sa furnizeze conexiuni la aplicații-moștenire și la suportul de tranzacții. Pe măsură ce o aplicație devine mai complexă și nevoia de mai multe suporturi tranzacționale și de integrare a resurselor externe devine o problemă, este nevoie de o abordare mai structurată.

15. Introducere in bazele de date

Unul dintre domeniile care s-au dezvoltat încă din primii ani ai informaticii a fost domeniul bazelor de date și încă de pe atunci nu se putea face diferența între baza de date și sistemul de gestiune utilizat pentru administearea ei. Fiecare dintre sistemele degestiune a bazelor de date folosea un format propriu de stocare și punea la dispoziție un API(Application Programming Interface) specific pentru programarea aplicațiilor. Astfel atunci când auzim vorbindu-se despre baze de date ne gândim la formatul în care sunt stocate datele, mai bine zis ne gândim la SGBD(Sistemul de Gestiune al Bazelor de Date)

Odată cu evoluția tehnologiilor imformatice s-a ajuns la standardizarea unui limbaj SQL(Structured Query Language) cu ajutorul căruia se pot prelucra datele stocate în bazele de date. Ca urmare a standardizării în 1992 a limbajului SQL, un program poate comunica cu o bază de date fără a nevoie de schimbarea comenzilor SQL. Cu toate acestea, din păcate fiecare producător de SGBD a dezvoltat propriile extensii ale SQL și oferă o interfață diferită pentru manipularea datelor.

În acest moment apare ODBC(Open Data Base Connectivity) care reprezintă o interfață cosistentă pentru prlucrarea detelor, indiferent de formatul în care acestea sunt stocate. ODBC reprezintă o colecție de funcții apelabile din limbajul C, fiecare funcție având un nume bine determinat și o colecție a parametrilor clar stabiliți. Spre exemplu funcția createTable() permite crearea unei tabele în orice format. La fel și funcția getMetaData() știe să citească metadatele(informații despre structura unei baze de date) indiferent de faptul că respectiva bază de date a fost creată cu Oracle, Access, Infomix sau FoxPro. Ca urmare a acestor avantaje majore, deși ODBC a fost inițial conceput ca un standard pentru PC, astăzi el a devenit un standard adoptat de toate platformele.

Deși o bună parte din problemele inițiale au fost rezolvate, a apărut o nouă problemă aceasta fiind portabilitatea. Deșii C++ permite scrierea unei aplicații performante pentru manipularea datelor, grație și ODBC, aplicația respestivă trebuie rescrisă integral pentru a lucra sub o altă platformă. Acest impas apare datorită că limbajul C++ nu este complet definit(Ex.:Câți biți ocupă o variabilă de tip int ? Răspunsul este în funcție de platformă. Aici apar avantajele limbajului Java. Unul dintre aceste avantaje pe care le oferă Java este portabilitatea. Aceasta înseamnă că putem rula un program scris în Java pe orice platformă fără să fie nevoie ca programul să fie recompilat. În cazul limbajului Java se știe foarte clar faptul că o variabilă de tip int va ocupa întodeauna 32 de biți, indiferent de platformă. Printre bibliotecile implementate pe platformele care rulează Java se află și biblioteca care permite accesul la bazele de date din Java.:JDBC(Java Data Base Conncetivity). Această bibliotecă reprezintă echivalentul lui ODBC din C.

JDBC devine un standard care se impune pe zi ce trece. Până acum producătorii erau preocupați de dezvoltatrea și livrarea driverelor ODBC pentru sistemele lor de gestiune, astăzi ei se orientează spre producerea de drivere JDBC. Pentru a permite utilizarea vechilor baze de date. firma Sun pune la dispoziția utilizatorilor pachetul java.sql care reprezintă un “translator” între apelurile JDBC și apelurile ODBC. Folosirea limbajului Java în conjuncție cu JDBC oferă o soluție cu adevărat portabilă pentru scrierea aplicațiilor care lucrează cu baze de date.

Driverele JDBC pot face parte din patru categorii:

1. Translatoarele JDBC-ODBC permit accesul la bazele de date prin intermediul vechilor drivere ODBC. Translatorul furnizat de către Sun pentru a traduce apelurile JDBC în apeluri ODBC este tocmai un astfel de driver. Datorită faptilui că pe fiecare stație client trebuie încărcate o parte din bibliotecile ODBC și chiar o parte din codul aplicației client pentru baza de date, Acest tip de driver JDBC este indicat a se folosi în cadrul intranet-ului.

2. Drivere JDBC care utilizează API-uri native convertesc apelurile JDBC în apeluri ale API-urilor specifice pentru diferitele SGBD-uri cum ar fi: Oracle, Sybase, Infomix. Trebuie menționat că și în acest caz trebuie ca pe fiecare mașină client să fie încărcate o parte din bibliotecile care compun driverul.

3. Driverele JDBC care utilizează un protocol independent realizează o traducere a apelurilor JDBC într-un protocol de rețea independent de orice SGBD pentru ca apoi un server să să realizeze traducerea acestui protocol într-un protocol specific bazei de date accesate.Acesta este cel mai flexibil tip de driver, serverul permițând conectarea tuturor clienților la diferite tipuri de baze de date. Pentru ca aceste drivere să permită și accesul unor baze de date pe internet ele trebuie să ofere și o parte de facilități privind securitatea, accesul prin firewall-uri pe care Web-ul le impune.

4. Driverele JDBC care utilizează un protocol nativ realizeaza o convorbire a apelurilor JDBC în apeluri specifice protocolului utilizat de un anumit SGBD. În acest fel este posibilă o conectare rapidă a aplicației client la serverul de baze de date pentru efectuarea prelucrărilor. Dat fiind faptul că protocoalele sunt soluții proprietare, acest tip de driver este produs chiar de către cei care realizează și dezvoltă un anumit tip de SGBD.

15.1. Probleme specifice bazelor de date

Pentru orice aplicație care lucrează cu bazele de date exsistă câteva probleme specifice care trebuie rezolvate. Printre acestea se numără și următoarele:

Crearea unei baze de date. Înainte de prelucrarea datelor stocate trebuie să avem la dispoziție “containerul” care va conține toate aceste date. Adică este nevoie ca baza de date să fie creată. Crearea unei baze de date se poate realiza fie din afara unei aplicatii Java, fie în interiorul aplicației Java prin transmiterea comenzilor SQL. Avantajul Java constă în faptul că nu este nevoie să modificăm codul în funcție de formatul de stocare.

Conectarea la o bază de date. Pentru a putea accesa o bază de date este nevoie ca aplicația Java să se “conecteze” la sursă. În spatele acestei sintagme se ascunde următorul aspect: o bază de date este stocată într-un anumit format. Datele stocate într-un anumit format sunt accesate cu ajutorul unui anumit format, fie el ODBC sau JDBC. În momentul în care aplicația noastră dorește să se conecteze la baza de date este nevoie de alegerea driverului potrivit și încărcarea lui în memorie.

Introducerea datelor în cadrul bazei de date. Operațiile de introducere a datelor în baza de date pot avea loc atât din afara unei aplicații Java cât și prin intermediul unor comenzi

SQL specifice transmise din cadrul unei aplicații Java. Oricare ar fi calea aleasă, una dintre comenzile utilizate este INSERT INTO NumeTabelă DATA.

Regăsirea selectivă a datelor în cadrul unei baze de date. Putem spune că unele dintre obiectivele stocării datelor este ca prin prelucrarea lor să obținem informații, sau altfel spus să obținem sisitematizarea lor. Acesta este de fapt obiectul final.

15.2. Structura JDBS

Pentru fiecare din operațiile enumerate Java oferă o bibliotecă denumită generic JDBC. În scopul accesării unei baze de date Oracle, Access, Informix, etc. producătoriidriverelortrebuie să implementezeo colecție de clase și metode definite în cadrul a opt interfețedin biblioteca JDBC:

java.sql.CallableStatement-trebuie să permită executarea procedurilor SQl stocate.

java.sql.Connection-în contextul unie conexiuni cu baza de date se execută comenzile SQL și sunt întoarse rezultatele.

java.sql.DatabaseMetaData-permite aflarea de informații despre baza de date în ansamblul ei: numărul de tabele ce fac parte din baza de date,structura tabelelor din baza de date, câte câmpuri cuprinde o anumită tabelă, etc.

java.sql.Driver-cadrul oferit de JDBC permite utilizarea a multiple drivere. Orice astfel de driver trebuie să ofere o clasă care să implementeze această interfață. La cererea unei aplicații de conectare la o bază de date, dlasa DriverManager va interoga fiecare driver dacă poate realiza conexiunea cu sursa de date. Această interogare a criverelor se poate realiza numai dacă aceasta poate implementa metode din interfața Driver-

java.sql.PreparedStatement-un enunț SQL este precompilat și stocat într-un obiect de tip PreparedStatement. Acest obiect poate fi utilizat mai apoi pentru executarea de mai multe ori a respectivului enunț cu o mult mai mare eficiență.

java.sql.ResultSet-metodele-acestei interfețe permit accesarea tabelei generate în urma executării unui enunț SQL.

java.sql.ResultSetMetaData-un astfel de obiectpoate fi utilizat pentru a afla informații despre tipurile sau proprietățile unei coloane din ResultSet.

java.sql.Statement-un obiect de tip Statement este utilizat penteu realizarea unei interogări SQL statice și obținerea rezultatelorproduse ca urmare a execuției sale.

15.3. Conectarea la baza de date

Atunci când doresc să scriu sau să citesc date dintr-un fișier, prima operațiune care se realizează este deschiderea fișierului. Accesul la fișier este direct. În cazul “fișierului” care reprezintă baza de date avem nevoie de un “strat intermediar” care știe să citească corect datele înscrise, dat fiind faptul că ele sunt păstrate într-un anumit format. Deci pentru citirea datelor din baza de date se utilizează un anumit protocol. “Stratul intermediar” care cunoaște acest protocol este reprezentat de driver. În concluzie contactul între două componente, aplicație și baza de date, este realizată de către al treilea component, driverul.

Conectarea aplicației la baza de date se execută prin intermediul unui obiect de tip Connection. Pentru a obține conexiunea trebuie să furnizăm adresa, sau altfel spus url-ul respectivei baze de date. Acest url reprezintă un mod de identificare a bazei da date în așa fel încât driverul corespunzător recunoaște denumirea și poate stabili o conexiune.

Conectarea aplicației la baza de date este o sarcină care revine în special clasei DrierManager. Aceasta este una dintre principalele clase ale pachetului java.sql. În momentul în care se apelează metoda getConnection(), clasa DrierManager încearcă să găsească un driver care poate să realizeze conexiunea cu respectiva bază de date. Această clasa menține o listă a tuturor driverelor înregistrate pe sistem și la cererea de conectare din paretea unei aplicații verifică răspunsul fiecărui driver din listă la url-ul transmis ca parametru. Discuția clasei DriverManager cu driverele, are loc prin intermediul interfeței Driver, interfață pe care trebuie să o implementeze fiecare driver prin metoda: getConnection(), clasa DriverManager apelează metoda connect() din cadrul interfeței Driver, metodă care realizează conexiunea reală cu baza de date.

URL-ul transmis ca și parametru la apelul metodei getConnection conține un șir de caractere cu o semnificație bine determinată: jdbc.odbc.WebData. Înainte de a studia semnificația exactă a componentelor acestui URL să vedem exact care este definiția URL-urilor.

Un URL – Uniform Resource Locator – reprezintă o modalitate de identificare a resurselor pe Internet. În general, atunci când navigăm pe Internet furnizăm navigatoruluio cale care specifică localizarea unui fișier sau a unui sistem legat la Internet având forma:

http://java.sun.com/index.html

În alcătuirea unui URL se pot identifica două părți importante: în primul rând este specificat protocolul utilizat pentru accesarea resursei iar mai apoi este furnizată adresa exactă a resursei. Adresa exactă a resursei poate cuprinde inclusiv numele sitului(sistemului) pe care este localizat fișierul.

Protocolul în cazul exmplului dat este http – Hyper Text Transfer Protocol – iar adresa exactă a resursei este dată de java.sun.com/index.html.

În cazul URL-urilor JDBC este vorba despre o cale de identificare a bazelor de date într-un mod specific unui anumit driver. Astfel, la furnizarea URL-ului numai un anumit driver știe să recuoască URL-ul și să decodifice informațiile furnizate în cadrul acestuia. Practic, cei care scriu driverele sunt cei care stabilesc modul în care va arăta URL-ul JDBC care identifică driverul lor. Utilizatorii driverului nu trebuie să-și facă probleme în acest sens: se va utiliza URL-ul furnizat odată cu driverul. Rolul JDBC este doar de a recomanda anumite convenții privind modul de alcătuire a unui URL.

Ca urmare a faptului că URL-urile JDBC pot fi utilizate cu un număr mare de drivere este normal ca structura lor să fie foarte flexibilă. În primul rând, URL-urile JDBC permit diferite scheme pentru denumirea bazelor de date. Apoi, URL-urile JDBC permit producătorilor de drivere să înglobeze în ele toate informațiile de care au nevoie. Aceasta permite aplicațiilor să acceseze bazele de date fără ca utilizatorul să fie nevoit să recurgă la acțiuni de administrare a bazei de date. În al treilea rând, URL-urile JDBC permit specificarea unei denumiri logice pentru baza de date și pentru sistemul pe care este localizată baza de date. Maparea denumirii logice în denumirea fizică este realizată de un anumit serviciu de naming disponibil în cadrul rețelei sau pe sistemul local.

Sintaxa standard pentru un URL JDBC este următoarea:

jdbc: < subprotocol > : < subname >

După cum se vede există trei părți ale unui URL JDBC, părți care au următoarea semnificație:

1.jdbc reprezintă numele protocolului. În cadrul unui URL JDBC vom folosi întotdeauna protocolul jdbc.

2.Subprotocolul poate reprezenta numele unui driver sau numele unui mecanism de conectare la baza de date. Un exemplu foarte sugestiv pentru denumirea unui subprotocol este “odbc”. Acest nume este rezervat pentru URL-urile care specifică surse de date de tipul ODBC. Pentru accesarea unei baze de date prin intermediul unui bridge JDBC-ODBC, cazul nostru este demonstrativ: jdbc.odbc.ProDb

În această situație , subprotocolul este “odbc” iar numele ProDb este denumirea unei surse de date ODBC locale.

Dacă cineva dorește să utilizeze un serviciu de naming atunci respectivul serviciu trebuie furnizat ca protocol. Utilizarea acestui serviciu este necesară atunci când numele bazei de date nu reprezintă pe cel real. În acest caz URL-ul va arăta astfel: jdbc:dnsnaming:ProDb

Aici numele subprotocolului este serviciul de naming DNS. Acest serviciu trebuie să rezolve numele logic al bazei de date într-un nume real care să fie utilizat pentru conectarea la baza de date.

< subname > este cea de-a treia componentă a URL-ului și reprezintă o modalitate de identificare a bazei de date. Sintaxa acestei componente poate varia în funcție de driver și ca urmare poate conține toate informațiile necesare pentru localizarea bazei de date. În exemplul nostru ProDb este suficientă pentru identificarea sursei de date pe sistemul local. Dacă sursa de date se află pe un alt sistem în rețeaua locală sau chiar pe Internet atunci trebuie să includem în cadrul URL-ului JDBC adresa respectivului sistem. Presupunând că baza de date se găsește pe un sistem aflat în Internet având adresa www.utcluj.ro și numele subprotocolului utilizat pentru conectare este dbnet atunci URL-ul pentru conectarea la baza de date va avea forma: jdbc:dbnet://www.utcluj.ro:1444/WebData.

Revenind la exemplul nostru, obținerea conexiunii are loc prin apelul metodei getConnection() a clasei DriveManager.

Connection connect = DriveManager.getConnection(url,” ”,” ”);

La apelul metodei se transmit trei parametrii. Despre primul dintre aceștia, URL-ul JDBC, am discutat mai sus. Următorii doi parametrii reprezintă numele utilizatorului care dorește accesarea bazei de date și respectiv parola asociată respectivului utilizator. În exemplul de mai sus acești parametrii au valori nule pentru că nu s-a cofigurat baza de date pentru a fi protejată.

15.4. Executarea comenzilor SQL

Odată obținută conectarea la baza de date avem la dispoziție un obiect de tip Connection. Acest obiect reprezintă conexiunea. O sesiune de conectare cu baza de date cuprinde toate enunțurile SQL care sunt executate precum și rezultatele întoarse ca urmare a acestor prelucrări. O aplicație poate avea una sau mai multe conexiuni cu baza de date.

Comanda SQL create table primeste ca parametru numele tabelei, Administrator(User,MMTzpe) in acest caz , si respectiv denumirile campurilor care vor face parte din structura tabelei.

Dupa cum am vazut, un obiect de tip Statement este creat cu ajutorul metodei create Statement() a clasei Conection. Pntru executarea efectiva a comenzii SQL, obiectul de tip Statement ne pune la dispozitie o serie de trei metode fiecare cu o funmctionalitate precisa: execute(), executeQuery(), executeUpdate().

Metoda executeQuery() este utilizata, asa cum vom vedea in cadrul urmatoarei sectiuni, pentru acele enunturi care produc un singur set de articole. Mai bine spus, cu ajutorul acestei metode se executa interogarile de tip SELECT.

Metoda executeUpdate() este utilizata pentru executarea enunturilor de tip INSERT , DELETE si UPDATE respectiv pentru enunturi dfe tip SQL DDL(data definition language) cum ar fi CREATE TABLE respectiv DROP TABLE. Enunturile SQL INSERT, DELETE si UPDATE au ca efect modificarea uneia sau mai multor coloane respectiv randuri. Metoda intoarce o valoare de tip intreg reprezentand numarul randurilor care au fost afectate. Pentru enunturi de tip CREATE TABLE sau DROP TABLE metoda executeUpdate intoarce intotdeauna o valoare egala cu zero.

Metoda execute() este utilizata atunci cand interogarea intoarce mai mult decat un singur set de rezultate.

Dupa executarea a uniu enunt SQL,execute(),executeQuery sau executeUpdate() intoarce un rezultat. Imediat dupa obtinerea rezultatului obiectul de tip Statement trebuie eliberat. Aceasta actiune este indeplinita de ctre colectorul de gunoaie. Cu toate acestea, este recomandat ca obiectul sa fie eliberat in mod explicit prin apelarea metodei close(). Astfel se elibereaza resursele necesare pentru baza de date si se evita problemele care ar putea apare din cauza memoriei insuficiente.

Pentru definirea campurilor am utilizat doar doua tipuri de date precum varchar si integer. Practic exista mai multe tipuri de date SQL,driverul JDBC realizand o conversie intre tipurile de date SQL si tipurile de date din Java.

Dupa executarea enuntului SQL care are ca efect crearea tabelelor, aplicatia prezentata ca exemplu realizeaza introducerea de articole in aceste tabele. In acest scop am utilizat metoda executeUpdate(), care este destinata acestui scop.

Intre cele doua parantaze rotunde se introduc valorile pentru toate campurile care fac parte din structura tabelei., valori separate prin virgula. Pentru campurile de tip alfa numeric valorile introduse trebuie incluse intre doua apostroafe. Dat fiind faptul ca in Java sirurile de caractere se reprezinta prin includerea lor intre doua ghilimele, o greseala frecventa care apare la alcatuirea enunturilor SQL este incadrarea acestor valori alfanumerice intre ghilimele. Dar daca ne uitam cu atentie la sursa programului demonstrativ putem observa ca aceste valori sunt incadrate de apostroafe.

Pentru fiecare articol introdus se apeleaza metoda executeUpdate cu parametrul egal cu un enunt de tip INSERT.

II. Breviar de Calcul

1. Enumerarea si comentarea fisierelor utilizate in aplicatie

Tabel 2.1

2. Implementarea si descrierea mecanismului

2.1. Lantul Evenimentelor

HTTP request

DB

HTTP response

fig. 2.1

Connex.class

– Web Browser trimite cererea HTTP

– Serverul accepta cererea ; cererea inaintata spre JSP Engine (motorul JSP) apelare cod executabil (Bean-urile – Cristi. User 1 / User 2) instanta obiect de tip CONNEX interogarea DB salvarea claselor citite din DB in BEAN JSP genereaza cod HTML (dinamic) care contine si date citite din DB.

2.2. Organigrama – Fluxul Programului

FALSE TRUE

User1.valideaza

FALSE TRUE

Modifica

TRUE

VIZUALIZEAZA

TRUE

Sugestii

fig. 2.2

Aplicatia de fata realizeaza vizualizarea continutului unei baze de date multimedia (imagini – *.jpg/*.gif, secvente audio – *.mp3/*.wav, secvente audio – video – *.avi/*.mpg) datorita unui management realizat cu tehnologia Java Server Pages.

Aplicatia “USER” urmareste in tocmai arhitectura “two tier”. Nivelul “Presentation” este, insa, pus in evidenta mult mai mult decat “Business Logic” datorita celor doua motive urmarite: limbajul Java permite din ce in ce mai mult facilitati de lucru cu proceduri stocate, iar aplicatia noastra isi propuna sa puna in evidenta mai mult stratul “Presentation” adica utilizarea la maximum a tehnologiei Java Server Pages.Astfel, procedurile stocate in baza de date lasa locul unor simple interogari ale bazei de date, pierzand astfel din viteza asigurata prin utilizarea procedurilor stocate. Interogarea bazei de date se face folosind obiect separate de Bean-uri ajutatoare jsp-urilor – instanta de clasa Connnex:

public class Connex {

care contine 4 atribute:

Connection conn;

Statement stmt;

String sqlQuery;

ResultSet result;

utilizate dupa cum urmeaza: conn – pentru deschiderea unei conexiuni la baza de date, stmt – pentru executarea diferitelor interogari ale bazei de date, result – pentru citirea rezultatelor obtinute in urma interogarilor. Realizarea conexiunii la baza de date (inregistrarea driver-ului si apoi “obtinerea” conexiunii) are loc in constructorul clasei Connex:

public Connex() {

try{

Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver");

Connectio conn= DriverManager.getConnection("jdbc:odbc:DiplomaA&C", "administrator", "asdf123");

stmt = conn.createStatement ();

}

catch (Exception e){

System.out.println ("Exceptie aparuta in constructorul clasei JdbcTest");

}

}//end of Constructor

Cateva dintre cele mai utilizate metode din aceasta clasa pot fi amintite functie de rolul pe care-l joaca in realizarea aplicatiei:

getLoginAdmin(…) citeste din tabelul “User” o coloana fie ea “LoginId”, fie ea “Password” pentru a se putea realiza sesiunea de login

public String getLoginAdmin(String logID){

String str= "";

try{

result = stmt.executeQuery("select "+logID+" from User");

while(result.next()){

str=result.getString(1);

System.out.println("Am citit din tabelul Admin "+str);

}

}

catch(Exception e){

System.out.println("Exceptie aparuta in metoda getLoginAdmin");

}

return str;

}//end of method

allClosing() realizeaza elibereaza resursele ocupate cu lucrul cu baza de date

public void allClosing(){

try{

result.close();

stmt.close();

conn.close();

}

catch(Exception e){

//Facem ceva a la Bill Gates

System.out.println("Exceptie in metoda allClosing");

}

}

readIntTable(…..) citeste un int dintr-un tabel

public int readIntTabel(String tabel, String coloana, String coloanaStiuta, String valoare){

int i=0;

String str = "SELECT "+coloana+" FROM "+tabel+" WHERE "+coloanaStiuta+" = '"+valoare+"'";

try{

result = stmt.executeQuery(str);

while (result.next()){

i = result.getInt(1);

}

}

catch (Exception e){

System.out.println("Exceptie in metoda citesteTabel");

}

return i;

}

citesteTabel (…) citeste din tabel valoarea coloanei (String)

public String citesteTabel(String tabel, String coloana, String coloanaStiuta, String valoare){

String str1="";

String str = "SELECT "+coloana+" FROM "+tabel+" WHERE "+coloanaStiuta+" = '"+valoare+"'";

try{

result = stmt.executeQuery(str);

while (result.next()){

str1 = result.getString(1);

}

}

catch (Exception e){

System.out.println("Exceptie in metoda citesteTabel");

}

return str1;

}

scrieTable(…) scrie valoare in coloana

public void scrieTabel(String tabel, String coloana, String valoare){

String str = "INSERT INTO "+tabel+" ("+coloana+") VALUES ('"+valoare+"');";

try{

if (getId(tabel, coloana, valoare)==0){

stmt.executeUpdate(str);

}

else{

System.out.println("Exista!");

}

}

catch (Exception e) {

System.out.println("Exceptie in metoda scrieTabel");

}

}

updateTable(…) executa update de "valoare" in "tabel" la coloana "coloana" stiind "voaloareStiuta" (de tip String) a "coloanaSiuta"

public void updateTabel(String tabel, String coloana, String valoare, String coloanaStiuta, String valoareStiuta){

String str = "UPDATE "+tabel+" SET "+coloana+"='"+valoare+"' WHERE "+coloanaStiuta+"='"+valoareStiuta+"';";

try{

stmt.executeUpdate(str);

}

catch (Exception e) {

System.out.println("Exceptie in metoda updateTable");

}

}

getId(…) citire identificator din tabel cand se cunosc doua coloane

public int getId (String tabel, String coloana1, String valoare1, String coloana2, String valoare2){

String str = "SELECT id FROM "+tabel+" where "+coloana1+" ='"+valoare1+"' and "+coloana2+" ='"+valoare2+"'";

int id = 0;

try{

result = stmt.executeQuery(str);

while (result.next()){

id = result.getInt(1);

}

}

catch (Exception e){

System.out.println("Exceptie in metoda getId");

}

return id;

}

Asa cum este de remarcat stratul “Presentation” are la baza tehnologia Java Server Pages. Aplicatia cuprinde cateva fisiere *.jsp cu rol primordial in rularea acestei aplicatii. De asemenea se utilizeaza o serie de fisiere *.htm care au rolul de a “aranja” interfata grafica cu utilizatorul, de-a o face cat mai prietenoasa. Toate datele “setate” de catre utilizator in componentele input ale formurilor ajung (via *.jsp) in bean-uri specializate in procesarea lor.

Aplicatia debuteaza cu deschiderea sesiunii de login, prin incarcarea in fereastra browser-ului a fisierului “user1.htm”. Acesta contine “form-ul” HTML utilizat in introducerea datelor de login:

<form action="user1.jsp" method="POST">

<table border="0" cellpadding="4" width="45%">

<tr>

<td width="28%" align="left">

<p align="left"><font color="#0000FF"><b>Login ID:</b></font></td>

<td width="115%" align="left">

<p align="left"><input type="text" name="T1" size="20"></p>

</td>

</tr>

<tr>

<td width="28%" align="left">

<p align="left"><font color="#0000FF"><b>Parola:</b></font></p>

</td>

<td width="115%" align="left">

<p align="left"><input type="password" name="P1" size="20"></p>

</td>

</tr>

<tr>

<td width="28%" align="left"></td>

<td width="115%" align="left">

<p align="center"><input type="submit" value="Submit" name="B1"></td>

</tr>

</table>

</form>

Datele introduse in componentele input ale formului HTML vor fi procesate in bean-ul “ajutator” User1.class apelat in interiorul sursei user1.jsp:

<%@ page import = "Cristi.User1" %>

<jsp:useBean id="bean1" scope="session" class="Cristi.User1" />

Aceste date sunt salvate in User1.class cu ajutorul tagului

<jsp:setProperty name ="bean1" property="*" />

adica apelare implicita a metodelor

public void setT1(String T1) {

this.T1=T1;

}

public void setP1(String P1) {

this.P1=P1;

}

din interiorul bean-ului. Apeland in acest moment metoda valideaza() din interiorul bean-ului executam testul daca datele au fost introduse si daca acestea corespund celor existente in baza de date:

public boolean valideaza() {

boolean allOk=true;

idUser = getID("User", T1, P1);

System.out.println("id-ul Userului este "+idUser);

if (!T1.equals(conn.getLoginAdmin("loginId"))) {

T1 = "";

allOk=false;

}

if (!P1.equals(conn.getLoginAdmin("password"))) {

P1 = "";

allOk=false;

}

if (idUser==0){

allOk=false;

}

return allOk;

}

Daca “allOk” ia valoarea “TRUE” se face trecerea la urmatoarea sesiune de lucru.

“user2.htm” este cel de-al doilea fisier HTML incarcat in fereastra browser-ului. La randu-i contine formul pentru selectarea actiunii pe care utilizatorul se gandeste s-o utilizeze:

<form method="POST" action="user2.jsp">

</form>

Selectarea se va face prin actionarea unuia din cele trei butoane radio:

<p align="center"><input type="radio" value="Vizualizare" name="R1"></p>

<p align="center"><input type="radio" value="Modificare" name="R1"></p>

<p align="center"><input type="radio" value="Sugestii" name="R1"></p>

la apasarea butonului

<input type="submit" value="Submit" name="B1">

are loc trecerea in fisierul “user2.jsp”, unde va avea loc analiza valorii pe care o ia butonul radio “R1” iar functie de aceasta valoare se va incarca in browser urmatoarea pagina:

<%

String str = request.getParameter("R1");

if(str.equals("Vizualizare")){

%>

<jsp:forward page="ViewUser.jsp" />

<%

}

else if(str.equals("Modificare")){

%>

<jsp:forward page="ModifUser1.jsp" />

<%

}

else if(str.equals("Sugestii")){

%>

<jsp:forward page="Suggest.htm" />

<%

}

%>

adica daca butonul “R1” ia valoarea “Sugestii”, urmatoarea fereastra ce se va incarca in browser va fi “Suggest.htm”. Daca ia valoarea “Modifica”, urmatoarea fereastra ce se va incarca in browser va fi “ModifUser1.jsp”, iar daca ia valoarea “Vizualizare” urmatoarea pagina ce se va incarca in browser va fi “ViewUser.jsp”.

“ViewUser.jsp” este utilizata pentru o afisa intreg continutul bazei de date, printandu-se astfel numele fisierului si o eventuala descriere a celor existente in acest fisier. Acest lucru s-a realizat dupa ce in prealabil a avut loc o citire din baza de date a tuturor fisierelor existente iar numele lor au fost stocare in tabloul T1 din bean-ul User81:

T1=conn.getColoana("MMFiles", "nume");

Altfel spus pe baza celor returnate de metoda getCount():
public int getCount (String tabel){

String str = "SELECT COUNT (*) FROM "+tabel;

int count = 0;

try{

result = stmt.executeQuery(str);

while (result.next()){

count = result.getInt(1);

}

}

catch (Exception e){

System.out.println("Exceptie in metoda getCount");

}

return count;

}

metoda getColoana fiind descrisa mai jos:

public String[] getColoana (String tabel, String coloana){

String str = "SELECT "+coloana+ " FROM "+tabel;

int count = getCount(tabel);

int i=0;

String[] tablou = new String[count];

try{

result = stmt.executeQuery(str);

while (result.next()){

if (i<count){

tablou[i] = result.getString(1);

}

i++;

}

}

catch (Exception e){

System.out.println("Exceptie aparuta in metoda getColoana");

}

return tablou;

}

In acest moment formul din interiorul acestui jsp poate contine:

<%

String C = "C";

for(int i=0; i<bean81.T1.length; i++)

{

%>

<tr>

<td width="6%" height="1">

<p align="center"><input type="radio" value='<%= bean81.T1[i]%>' name="R1">&nbsp;&nbsp;&nbsp;&nbsp;</font></p>

</td>

<td width="43%" height="1"><font color="#000000" size="2" face="Arial"><%= bean81.T1[i]%>&nbsp;&nbsp;&nbsp;&nbsp;</font></td>

</center>

<td width="51%" height="1">

<p align="left"><font color="#000000" size="2" face="Arial"><%= bean81.readColoana("MMFiles", "comment", bean81.getIdFile(i))%>

&nbsp;&nbsp;&nbsp;&nbsp; </font></p>

</td>

</tr>

<center>

<%

}

%>

adica fiecare nume de fisier cu continut multimedia existent in baza de date va fi afisat in browser, avand in partea lui stanga un buton radio iar in dreapta o scurta descriere. Daca se va selecta unul din fisiere (folosind butonul radio corespunzator) si dupa apasarea butonului “Submit” se va incarca in browser pagina “ViewUser1.jsp” pentru afisarea imaginilor sau pregatirea secventelor audio – video pentru rulare:

<%

String nume = bean81.R1;

String url = "http://193.226.17.8:7070/Aurel_html/MMFiles/"+nume;

if ((nume.endsWith("jpg")) | (nume.endsWith("gif")))

{

%>

<p align="center">Afisarea continutului fisierului <%=nume%> din baza de date

&quot;Multimedia&quot;</p>

<center>

<IMG SRC='<%=url%>' LOWSRC='<%=url%>' HEIGHT=200 WIDTH=280 ALT="violets">

</center>

<%

}

else {

%>

<p align="center">Afisarea continutului fisierului <%=nume%> din baza de date

&quot;Multimedia&quot;</p>

<center>

<A HREF='<%=url%>' target="_blank"> playback the <%=nume%> file </A>

</center>

<%

}

%>

Daca avem de-a face cu secvente audio-video browser-ul Internet Explorer “stie” sa porneasca Windows Media Player pentru a rula aceste secvente, fie ele *.avi sau *.mpg. De asemenea daca incercam sa rulam secvente audio Internet Explorer va porni Winamp iar fisierul fie el *.mp3, fie el *.avi, va fi rulat. Ancora HTML spre fisier rezolva aceasta problema. Butonul “Submit” ne duce in cadrul principal pentru o alta sesiune de lucru.

Modificarea caracteristicilor de cont ale unui utilizator incepe prin setarea valorii lui “R1” la “Modificare”. In formul HTML din interiorul lui “ModifUser1.jsp” se citeste din baza de date prin intermediul bean-ului User1.class – utilizand metoda:

public String readUser(String numeColoana, String loginId){

String str = "";

str = conn.citesteTabel("User",numeColoana, "id", this.idUser);

return str;

}

– caracteristicile contului utilizatorului in sesiune de lucru:

a) Login ID

<td width="115%" align="left">

<p align="left"><input type="text" name="T1" value='<%= bean1.readUser("loginId", bean1.T1)%>' size="20"></p>

</td>

b) Parola

<td width="115%" align="left">

<p align="left"><input type="password" name="P1" value='<%= bean1.readUser("password", bean1.P1) %>' size="20"></p>

</td>

pentru o mai multa siguranta se va pretinde confirmarea parolei:

<td width="28%" align="left">

<p align="left"><font color="#0000FF"><b>Confirmare Parola:</b></font></p>

</td>

<td width="115%" align="left">

<p align="left"><input type="password" name="P2" size="20"></p>

</td>

Sesiunea de modificare se va incheia cu introducerea informatiilor referitoare la utilizator in baza de date, operatie realizabila cu ajutorul fisierului “ModifUser2.jsp”:

<%

if (bean2.validate()){

bean2.setUser(bean1.idUser);

%>

<jsp:forward page="user2.htm" />

<%

}

else{

%>

<jsp:forward page="ModifUser1.jsp" />

<%

}

%>

adica se testeaza daca input-urile form-ului din “ModifUser1.jsp” sunt completate, iar apoi acestea se introduc in baza de date utilizand metoda setUser din User2.class:

public void setUser(int idUser){

String tabel = "User";

conn.updateTabel(tabel, "loginId", T1, "id", idUser);

conn.updateTabel(tabel, "password", P1, "loginId", T1);

}

dupa care are loc saltul spre cadrul principal.

In cadrul sesiunii de sugestii se incearca implementarea unei aplicatii de email destul de simpla si eficienta. “Suggest.htm” contine formul cu input-urile HTML care vor trebui completate:

adresa proprie de email

<td>Your Email</td>

<td><input type="text" size="40" name="sender" ></td>,

mesajul ce se doreste a fi transmis

td>Msg Body</td>

<td><textarea name="msgbody" rows="20" cols="38"></textarea></td>

Se face apoi trecerea la “Suggest.jsp” in care se implementeaza urmatoarele:

setarea serverului

sun.net.smtp.SmtpClient sm = new sun.net.smtp.SmtpClient("icar.utcluj.ro");

setarea expeditorului

sm.from(bean.sender);

setarea destinatarului (administratorului)

sm.to("[anonimizat]");

setare subiect

msg.println("Subject: ");

msg.println("PROBLEMS");

msg.println();

setare “message body”

msg.println(bean.msgbody);

msg.println("==============");

msg.print("This mail brought to you by JSP MAIL..from a user at IP ");

msg.println(request.getRemoteHost());// afisare IP

inchidere conexiune cu serverul

sm.closeServer();

III. Rezultate experimentale

Aplicatia de fata este realizata cu tehnologia Java Server Pages. Pentru buna ei functionare se recomanda utilizarea ei pe un server web care suporta aceasta tehnologie bazata pe limabjul Java. Exista la ora actuala destul de multe astfel de servere, proiectantul insistand insa ca pentru testare sa se foloseasca serverul web „jswdk” iar pentru rularea ei ca „web site” sa se foloseasca serverul web „resin”. „Java Web Server” sau „JRun” sunt, de asemenea, recomandate cu caldura. Avand in vedere faptul ca se foloseste o baza de date Access (pe o platforma Microsoft) nu e recomanda folosirea serverelor de web pe oricare alta platforma.

Aplicatia „debuteaza” cu sesiunea de login al carui rol primordial fiind verificare caracteristicilor contului utilizatorului care incearca sa se conecteze.

Fig. 3.1. Sesiunea de login

Utilizatorul este obligat sa introduca date de login caracteristice propriului cont. Dupa introducerea lor si apasarea butonului „Submit” se va incarca in browser nodul principal al acestei aplicatii – Cadrul Principal, avand ca principal rol utilizarea cat mai prietenoasa a facilitatilor acestui produs.

Fig. 3.2. Cadrul principal al aplicatiei

In acest moment, utilizatorul este pus in posibilitatea de a alege intre cele trei sesiuni de lucru: sesiunea de vizualizare – care dupa o scurta trecere in revista a continutului bazei de date, cea de modificarea caracteristicilor contului utilizatorului logat si cea alocata trimiterii de noi sugestii catre administratorul raspunzator in perioada respectiva de acest produs.

Intreaga verificare a valorii pe care butonul (ramane de remarcat faptul ca nu exista decat un singur buton, R1, care poate lua trei valori) se realizeaza in interiorul ffisierului jsp. Chiar daca invizibile, marea majoritate a fisierelor *.jsp au rolul hotarator in sensul pe care-l urmeaza programul.

Daca unul dintre campurile formului HTML nu sunt complectate, sau daca sunt introduse in campuri informatii neexistente in baza de date, fisierul „user1.jsp” poate realiza returnarea in „user1.htm”.

Selectarea optiunii de vizializare conduce la incarcarea in fereastra browser-ului a primei ferestre de vizualizare:

Fig. 3.3. Vizualizarea continutului bazei de date

Se afiseaza astfel numele tuturor fisierelor existente in baza de date, in partea stanga a numelor fisierelor se gasesc butoanele radio utilizate pentru selectare de fisiere iar in dreapta numelor se pot observa descrierile acestora. Astfel, utilizatorul isi poate forma o parere destul de serioasa ca sa poata utiliza la maxim resursele bazei de date. Selectarea unuia din fisiere, si apasarea butonului „Submit” duc la incarcarea in fereastra browser-ului a a unei noi pagini – cea de afisare imagini/pregatire ancora HTML pentru rulare secventa audio – video. Mai precis, se verifica daca utilizatorul a selectat o imagine si implicit se va afisa aceasta imagine asemeni Fig. 3.4 (afisarea continutului fisierului ro.gif alungit). Daca utilizatorul a selectat o secventa audio – video, se va „forma” o ancora HTML catre URL-ul de unde se va rula aceasta secventa asemanator cu Fig. 3.5. Utilizarea ancorei (click) deschide automat unul din softurile aditionale: Windows Media Player – in cazul rularii unui *.avi sau *.mpg la fel ca in cazul Fig. 3.6. (rularea fisierului Ghost.avi) sau Winamp – in cazul rularii unui *.mp3 sau *.wav ca si in Fig. 3.7. (rularea fisierului Strong.mp3)

Fig. 3.4. Afisarea ancorei utilizata ca referinta pentru rularea continului fisierului Stronger.mp3

Fig. 3.5. Afisarea continutului fisierului „apache.gif”

Fig. 3.6. Rularea continutului fisierului Ghost.avi folosind Windows Media Player

Fig. 3.7. Rularea continutului fisierului Stronger.mp3 folosind Winamp

Fig. 3.8. Modificarea caracteristicilor contului utilizatorului

Fig. 3.9. Transmiterea sugestiilor via email

IV. Concluzii

Avantaje:

Aplicatia are forma unui site web realizat cu ajutorul tehnologiei Java Server Pages

Tehnologia Java Server Pages este bazata pe limbajul Java deci implicit urmeaza in totalitate avantajele oferite de acest limbaj de programare:

Simplu

Familiar

Orientat pe obiecte

Robust

Ofera securitate la cel mai inalt nivel

Independent de platforma

Portabil

Dinamic

Suporta programare multithreading

Suporta interconexiune cu browser-ele web

Prezinta facilitati multiple pentru manipularea tuturor elementelor multimedia

Este rapid

Accesarea bazei de date se face cu rapiditate folosind translatorul “jdbc – odbc”

Dezavantaje:

Este dependent de performantele sistemului – nu ruleaza pe orice masina

Nu se poate utiliza orice server web – va fi folosit un server ce suporta tehnologia Java Server Pages

Dependent de fluxul datelor pe Internet – in tara noastra acest lucru este principala problema

V. Bibliografie

COLIN FRAIZER “ Java API. Pachetele Java API java.applet si java.awt”,

Editura Teora, 1998.

AUGUSTIN PRODAN MIHAI PRODAN “Mediul Java pentru Internet”,

Editura Promedia Plus, 1997.

KRIS JAMSA, STEVE WEAKLEZ “Programarea in WEB”, Editura

All Educational, 1997.

CALIN MARIN VADUVA “Programare in Java”, Editura Albastra,

1999.

MARY CAMPIONE “The Java Tutorial Object Oriented Progamming

For the Internet”

JAMES GOSLING “The Java Language Specifictions”

BRUCE ECKEL “Thinking in Java ”

L.VANHELSUWE “Mastering Java”

Similar Posts

  • Proiectarea Si Analiza Sistemelor de Operare

    1.Introducere 2. Funcțiile unui SGBD. Organizarea-tip a SGBD 2.1. Funcțiile principale ale unui SGBD 2.1.1. Administrarea explicită (directă) a datelor în memoria externă 2.1.2. Administrarea tampoanelor (buferelor) din memoria operativă 2.1.3. Administrarea tranzacțiilor 2.1.4. Jurnalizarea 2.1.5. Susținerea limbajelor BD 2.2. Organizarea tipică a unui SGBD concurent 3. Despre calculul relațional 3.1. Relații și proprietățile lor…

  • Realizarea Aplicatiilor Web Utilizand Limbajul Java

    CUPRINS: Capitoulul 1: Introducere 1.1. Noțiuni introductive despre aplicații web…………………………………………………………..5 1.2. Obiective……………………………………………………………………………………………………..7 Capitolul 2: Generalități Java 2.1. Introducere și generalități ale limbajului Java………………………………………………….8 2.2. Evoluția limbajului Java……….…………….…………..…………………………………9 2.3. Java și conceptele programarii orientate pe obiecte…………………………………………11 2.4. Elemente Java folosite în dezvoltarea aplicației…….………………………………..15 Capitolul 3: Pregătirea mediului de lucru 3.1. Instalare Java Development Kit(JDK)……………………………………………………………..29 3.2. Instalare…

  • Sistemul de Dezvoltare Arduino Mega

    Capitolul 3: Sistemul de dezvoltare Arduino MEGA 3.1. Caracteristici generale ArduinoMega 2560 este o placa de dezvoltare avand ca nucleu microcontroller-ul ATMega2560 fiiind produs de catre firma ATMEL. Spre deosebire de lucrul cu microcontroller-ele clasice, acolo unde este necesara cunoasterea cu exactitate a structurii interne a acestora, platforma de dezvoltare Arduino ofera o solutie rapida…

  • Platforme de E Learnig

    LUCRARE DE LICENȚĂ Platforme de E-Learnig INTRODUCERE Proiectul tratează aspecte teoretice ale proiectării unei aplicații web, tehnologiile utilizate pentru dezvoltarea acesteia și transpune aceste aspecte în practică prin crearea unei aplicații web care are ca scop administrarea sarcinilor de lucru prin intermediul unei platforme e-learning. La început, în prima parte a anilor ‘90, World Wide…

  • Localizarea Si Monitorizarea Unui Autovehicul Folosind Api

    Localizarea și monitorizarea unui autovehicul folosind API Cuprins Introducere Capitolul 1. Prezentarea limbajului Java și Google Maps 1.1 Caracteristici JAVA 1.2 Platforme 1.3 Un limbaj compilat și interpretat 1.4 Structura limbajului 1.5 Platforma Google Maps 1.6 Curtis Wong, principal researcher, Microsoft Researcher 1.7 Tipuri de hartă și coordonatele hărților Capitolul 2. Android 2.1 Istoric și…