Explorați Cărți electronice
Categorii
Explorați Cărți audio
Categorii
Explorați Reviste
Categorii
Explorați Documente
Categorii
Cuvinte cheie: Java, Server, Client, URL, RMI, JSP, JSF, applet.
Limbajul Java a aparut datorită necesităţii rezolvării problemelor actuale ale programării.
Deşi a apărut doar de câţiva ani, limbajul Java este prezent deja în peste 200.000 de pagini de
Web, are peste 400.000 de programatori care-l utilizează şi peste 40% dintre aplicaţiile
dezvoltate, în special cele dedicate comerţului electronic. Pentru a întelege ce înseamnă Java,
trebuie avută în vedere tendinţa Internet-ului de a deveni un bun de folosinţă comun, o piaţă
imensă, un teren electronic de desfăşurare a afacerilor, ceea ce a focalizat interesul
cercetătorilor şi firmelor de specialitate, precum şi utilizarea tot mai frecventă a soluţiilor de tip
Intranet în cadrul întreprinderilor de toate marimile. Coincidenţa apariţiei Java cu fenomenul
legat de Internet, Extranet, Intranet, a facut din el un instrument fundamental al dezvoltării
tehnologiei informaţie.
Teza constă din Introducere, patru capitole, concluzii. În primul capitol este prezentată
informaţia referitoare la utilizarea actuală a reţelelor şi deasemenea este redată prezentarea
limbajului Java, scurt istoric, noţiuni generale , caracteristici. În al doilea şi al treilea capitol s-a
studiat mai aprofundat arhitecturile Java pentru programarea în reţea şi web. Deasemea sunt
făcute şi unele comparaţii cu alte tehnologii de ultimă generaţie, prezentând avantaje şi
dezavantaze de partea fiecăreia. Al patrulea capitol prezintă aplicaţia web realizată în cadrul
tezei. Descrierea aplicaţiei, crearea utilizând limbajul Java, descrierea framework-ului folosit şi a
funcţionalităţilor.
Principalele obiective ale lucrării sunt:
• Studierea arhitecturilor Java de programare a reţelelor şi perspectivele oferite de aceste
tehnologii în dezvoltarea lor .
• Crearea unei aplicaţii web pentru un magazin de cărţi, stocarea şi prelucrarea datelor
privind managementul vânzării cărţilor.
1
CUPRINS
ADNOTARE..................................................................................................................................................................1
CUPRINS.......................................................................................................................................................................2
INTRODUCERE............................................................................................................................................................3
CAPITOLUL I................................................................................................................................................................4
Reţelele de calculatoare şi Java.......................................................................................................................................5
1.1 Reţele de calculatoare……………………………..……………………………………………………………. ...5
1.2 Java………………………………………………...………………………………………………………………7
1.2.1 Ce este Java ?.........................................................................................................................................................7
1.2.2 Evoluţia limbajului Java………………………..………………………………………………………………..8
1.2.3 Java : un limbaj compilat şi interpretat……..............................…………………………………………………8
1.2.4 Java şi conceptele programării orientate pe obiecte…………...............................………………………………
9
1.2.5 Caracteristicile de bază al limbajului Java…………………...............................………………………............10
1.2.6 Structura limbajului Java………………………………………………………..………………………...........11
CAPITOLUL II.............................................................................................................................................................12
2. INTERNETUL şi TEHNOLOGII WEB...................................................................................................................12
2.1. Internetul................................................................................................................................................................12
2.2 Tehnologii WEB……………………………………………………………………………….............................13
2.2.1 Java versus .NET…………………………………………………………………….........................................13
2.2.2 .NET a învăţat de la Java………………………………………………………………….................................14
2.2.3 .Net versus Java: criterii de comparaţie……………………………………………………...............................14
2.2.4 Schimbările ulterioare sunt scumpe…………………………………………………………………………….16
2.3. Java şi programarea WEB………………………………………………………………………………………..18
2.3.1 JSP……………………………………………………………………………………........................................18
2.3.2 JSF………………………………………………………………………………………....................................19
2.3.3 MySQL……………………………………………………………………………….......................................22
2.3.4 Arhitectura Tomcat……………………………………………………………………………………………..23
Capitolul III……………………………………………………………………………………...................................25
3.1. Socluri. Modelul client server……………………………………………………………................................... 25
3.2 URL…………………………………………………………………………………………................................ 31
3.3 Elemente de programare distribuită prin invocare de metode la distanţă. RMI.....................................................33
Capitolul IV…………………………………………………………………………………………………………..58
4.1 Magazinul electronic (E-shop)……………………………………………………………………………………58
4.2 Aplicaţia E-Shop.....................................................................................................................................................61
CONCLUZII.................................................................................................................................................................70
Introducere
Reţelele de calculatoare permit accesarea unor baze informaţionale cu localizări
geografice diverse şi constituie un mediu de comunicare între persoanele aflate la distanţă. Într-o
instituţie sau firmă cu mai multe compartimente, instalarea unei reţele de calculatoare facilitează
schimbul si corelarea informaţiilor (între diverse departamente sau în cadrul aceluiaşi
departament). Importanţa reţelelor de calculatoare ca medii de comunicare va creşte tot mai mult
în viitor.
2
Reţelele de calculatoare asigură partajarea resurselor de calcul fizice şi logice, astfel încât
programele, echipamentele şi mai ales datele să fie disponibile pentru orice utilizator conectat la
reţea, indiferent de localizarea lui. Această facilitate este foarte importantă în cadrul unei firme
fiindcă permite, de exemplu, mai multor persoane aflate în puncte geografice diferite, să
întocmească împreună un raport. O schimbare efectuată de un angajat într-un document poate fi
vizibilă instantaneu si celorlalţi angajaţi. Astfel, colaborarea dintre grupuri de oameni aflaţi la
distanţă devine foarte simplă. Practic, un utilizator cu orice localizare geografică (acoperită de
reţea) poate utiliza datele ca si când ar fi locale. Această caracteristică atinge scopul reţelelor,
formulat plastic, de "distrugere a tiraniei geografice".
Java este unul dintre cele mai utilizate limbaje de programare in zilele
noastre, datorita unor avantaje de necontestat. Printre acestea putem menţiona:
securitate, independenţa de platforma, limbaj intuitiv, bine structurat şi, bineinţeles, opensource.
Java este un mediu de programare ce oferă utilizatorului cadrul necesar şi uneltele necesare
pentru dezvoltarea aplicaţiilor Java. Java este o tehnologie ce oferă suport dezvoltării de aplicaţii
distribuite, independente de platformă.
Programele Java pot rula pe diferite tipuri de platforme, cu condiţia ca pe aceste platforme să fie
instalată o maşină virtuală Java deasupra platformei respective. Avantajul limbajului Java,
comparativ cu alte limbaje de programare este conexiunea strânsă cu tehnologia Internet.
Teza cuprinde 4 capitole, a căror obiectiv principal este sistematizarea şi îmbogăţirea
cunoştinţelor teoretice despre tehnologiile aduse de limbajul Java pentru programarea reţelelor
de calculatoare.
Dezvoltarea aplicaţiilor de reţea este un subiect complex care implică un set variat de
tehnologii ce oferă soluţii diverse pentru realizarea comunicării între calculatoare. Teza şi-a
propus să treacă într-o primă faza în revistă aceste tehnologii oferite de limbajul Java,
compararea lor cu alte limbaje de programare şi descrierea unor avantaje şi dezavantaje faţă de
aceste tehnologii. Odată ce s-a făcut o analiză a problemelor-soluţiilor din domeniu, s-a trecut la
partea practică a tezei şi anume realizarea unui proiect pe web, folosind tehnologiile oferite din
plin de Java în acest domeniu cum ar fi JSP, JSF, web servicii şi altele, precum şi lucrul cu baze
de date folosind My SQL.
CAPITOLUL I
Reţelele de calculatoare şi Java
3
1.1 Reţele de calculatoare
În anii '90, reţelele de calculatoare au început să furnizeze inclusiv servicii la domiciliu, pentru
persoane particulare.
Noile aplicaţii de acces la Internet sunt extrem de prietenoase, astfel încât încep să fie
utilizate nu numai în sferele de cercetare, industriale sau comerciale, în care aduc o îmbunătăţire
4
calitativă a proceselor de prelucrare şi transmitere a informaţiei, ci şi de către publicul larg,
pentru care se deschide astfel accesul la Internet. Aceste facilităţi se referă la:
1.accesul la baze informaţionale aflate la distanţă
2.comunicare între persoanele conectate la o reţea de calculatoare
3.divertisment interactiv.
Cea eficientă mai modalitate de consultare a informaţiilor din domenii diverse este
sistemul World Wide Web, creat la CERN (Geneva). Aceste informaţii aparţin unor domenii
foarte variate: artă, afaceri, politică, sănătate, istorie, recreere, ştiinţă, sport, călătorii, hobby-uri
etc.
În unele cazuri, se pot realiza nu numai consultări, ci, prin procedee interactive, se pot
realiza acţiuni care uzual ar fi necesitat prezenţa fizică a persoanei într-un anumit loc (plăţi,
rezervări de bilete, cumpărături etc). Un asemenea exemplu de domeniu, care este tot mai mult
transformat de progresul electronic, este cel bancar. Se vorbeşte din ce în ce mai mult de banking
virtual - băncile pun la dispoziţie produse (în special soft) prin care serviciile specifice îmbracă o
formă nouă, electronică. Oamenii îşi pot plăti taxele sau îşi pot administra conturile la distanţă,
prin metode electronice. Mii de firme îşi pun la dispoziţie cataloagele pentru consultări on-line
astfel încât practica de a face cumpărături la domiciliu, prin metode electronice, devine tot mai
răspândită. În acest sens, comerţul electronic a evoluat foarte mult, dezvoltând, prin mijloace
electronice, anumite direcţii specifice: marketing, management, plăţi digitale, securitatea
tranzacţiilor.
Presa începe să fie tot mai mult disponibilă direct, electronic. Mai mult, ea devine tot mai
personalizată: o persoană va putea comunica unui ziar subiectele sale de interes astfel încât să-i
fie trimise doar articolele legate de acestea. Pasul următor va fi crearea de biblioteci digitale cu
reviste, publicaţii ştiinţifice etc. Trecerea de la cărţile tipărite la cărţile electronice poate fi
comparată cu trecerea, în evul mediu, de la manuscrise la tipărituri.
În ultimii ani, se dezvoltă din ce în ce mai mult forme de educaţie la distanţă (învăţământ
electronic, care utilizează cel mai adesea facilităţile sistemului World Wide Web).
2. Poşta electronică sau e-mail-ul este un sistem de comunicare electronică bazat pe mesaje
scrise, care se adaugă astăzi la mijlocul clasic de comunicare verbală, prin intermediul
telefonului, vechi de mai bine de 100 de ani. Menţionăm aici faptul că între facilităţile poştei
5
electronice este inclusă şi posibilitatea ca anumite mesaje să fie trimise unui întreg grup de
persoane. Mesajele electronice conţin deja în mod curent secvenţe audio si video.
Dialogul direct on-line (aproape instantaneu) sau în timp real, implementat prin
mecanisme de tip talk, chat, se va extinde de la varianta textuală, scrisă, pentru a permite
utilizatorilor să se vadă sau să se audă unul pe celălalt. Această tehnologie face posibile
întâlnirile în timp real, numite videoconferinţe, între persoane aflate în poziţii geografice diferite.
Întâlnirile virtuale pot fi folosite pentru educaţie la distanţă, sfaturi medicale, întâlniri de afaceri
sau politice. Comunicaţiile vor prelua din ce în ce mai mult anumite tipuri de servicii realizate
deocamdată prin intermediul transporturilor, aşa cum poşta electronică a înlocuit, în mare
măsură, scrisorile obişnuite.
Deja s-au format grupuri mondiale de interes pe anumite domenii prin subscrierea la
facilităţle de informare şi comunicare oferite de grupurile de ştiri şi se pare că întreaga omenire
va fi antrenată în asemenea tipuri de comunicaţii, pe diverse tipuri de subiecte.
3. Divertismentul reprezintă la ora actuală o industrie în plină dezvoltare, în care se dezvoltă noi
tehnologii. Aplicaţia cu cel mai mare succes până acum este video-ul la cerere, prin care se va
putea selecta orice film sau program de televiziune iar acesta să apară imediat pe ecran. Filmele
viitorului, prevăzute cu scenarii alternative, ar putea deveni interactive iar spectatorul să joace un
rol activ în desfăşurarea acţiunii. Spectacolele de televiziune se vor putea desfăşura şi ele
interactiv, cu contribuţia directă a telespectatorilor.
Un domeniu al divertismentului care a înregistrat un succes uriaş şi al cărui viitor se
prevede la fel de promiţător este industria jocurilor. Există deja jocuri pentru mai multe persoane
cu simulare în timp real. Realitatea virtuală, creată prin animaţie tridimensională de calitate, va
putea deveni partajată.
Toate aceste aplicaţii noi sunt posibile prin tehnologiile moderne de comunicare, bazate pe reţele
de calculatoare.
1.2 Java
6
este complet orientat pe obiecte si ofera posibilitatea reala de refolosire a
codului (care este de fapt promisiunea făcută la apariţia programării
orientate pe obiecte).
este neutru din punct de vedere arhitectural, cu alte cuvinte Java este un
limbaj independent de platforma de lucru, aceeaşi aplicaţie rulând, fara
nici o modificare, pe sisteme diferite cum ar fi Windows, UNIX sau
Macintosh, lucru care aduce economii substanţiale firmelor care dezvolta
aplicaţii pentru Internet.
7
la dezvoltarea unui nou limbaj, numit Oak, care, mai târziu, avea sa se
numeasca Java. De asemenea grupul Green avea sa-şi schimbe numele întâi
în FirstPerson, apoi în JavaSoft.
Abia dupa ce a fost înfiinţată compania Netscape Communications
Corporation, cei de la JavaSoft s-au orientat către Internet si Web, mediul
multiplatformă distribuit al reţelei Internet fiind perfect pentru testarea
proiectului.
In prezent licenţa pentru tehnologia Java a fost acordata unor firme
precum IBM, Microsoft, Sillicon Graphics, Adobe şi Netscape.
8
Cum este rulat un program Java ? Interpretorul Java transformă codul
de octeţi într-un set de instrucţiuni maşina, întârzierea interpretarii fiind însă
foarte mica datorită asemanarii dintre codul de octeţi şi limbajul de
asamblare şi din acest motiv execuţia se face aproape la fel de repede ca în
cazul programelor compilate.
Cum este obţinuta neutralitatea arhitecturală a limbajului Java ? Cu
alte cuvinte, cum este posibilă portarea codului de octeţi pe calculatoare
diferite? Truc : codul sursa este compilat nu pentru calculatorul pe care se
lucrează ci pentru un calculator inexistent, acest calculator imaginar fiind
numit Maşina virtuală Java (Java Virtual Machine). Interpretorul acţionează
apoi ca un intermediar între Maşina virtuală Java şi maşina reală pe care este
rulat programul.
Aplicaţia utilizatorului
Obiecte Java
Maşina virtuală Java
UNIX Windows Macintosh
Sisteme de operare
• Obiectele
• Încapsularea şi transmiterea de mesaje
• Clasele
• Bibliotecile (numite pachete, în Java)
• Moştenirea
• Modificatorii de acces
9
Obiectele :
unitatea elementară a POO
starea obiectului este dată de variabile de instanţă
comportamentul obiectului este dat de metode
uşor de refolosit, actualizat, întreţinut
Încapsularea şi transmiterea de mesaje :
Clasele :
încapsuleaza obiecte
o singură clasă poate fi folosită pentru instanţierea mai multor obiecte
Pachetele: colecţie de clase înrudite
Moştenirea : permite
extinderea funcţionalitaţii unor clase existente
refolosirea codului
Modificatorii de acces : controleaza accesul la metodele şi variabilele
obiectelor. Acestea pot fi :
1. Private - accesibile doar obiectelor din aceeaşi clasă
2. Protejate - accesibile obiectelor din aceeaşi clasă şi din
subclasele clasei respective
3. Prietenosase (default) - (nivelul de accesibilitate prestabilit)
accesibile tuturor claselor din pachetul curent
4. Publice - accesibile tuturor claselor din orice pachet
10
• este distribuit = poate folosi atât obiecte memorate local cât şi obiecte
stocate pe calculatoare aflate la distanţă
D. Asigurarea securităţii
11
Modificarea claselor sau folosirea incorectă a acestora
Depăşirea stivei în partea superioară sau inferioară
Activităţi suspecte sau neautorizate
CAPITOLUL 2
2.1. Internetul
Internet (Internetware system) reprezintă un ansamblu de reţele de calculatoare interconectate
care a luat o amploare deosebită în ultimii ani. Internet reprezintă un instrument de acces la
cantităţi imense de informaţii distribuite în toată lumea. Prin intermediul Internet-ului se pot
transfera fişiere între calculatoare situate la distanţe foarte mari.
Internetul sau reţeaua mondială de reţele devine din ce în ce mai popular, cunoscând o
creştere exponenţială a numărului de calculatoare interconectate. Tehnologia şi aplicaţiile de pe
Internet se extind extrem de rapid, captând o atenţie deosebită, deoarece Internet-ul este un
mediu excitant de comunicaţie, un instrument pentru facilitarea afacerilor şi un debuşeu
comercial, într-o măsură mult mai mare decât au fost radioul şi televiziunea cu ani în urmă.
12
Noţiunea de internet (cu i mic) constituie o colecţie de reţele separate fizic şi care sunt
interconectate pentru a forma o singură reţea logică, iar Internet (cu I mare) reprezintă reţeaua
globală ce leagă toate reţelele, într-o reţea unică mondială. Internetul este un conglomerat
complex de arhitecturi, componente fizice şi sisteme de operare. Componentele sunt de unu-la-
unu.
Pe de altă parte Internetul este un complex univers virtual unde sunt accesibile informaţii
despre orice subiect imaginabil; ştiinţă, muzică, religie, politică, finanţe, umor etc.. Este de
înţeles preocuparea de a organiza această incredibilă masă de informaţii şi de concepere a unor
instrumente pentru regăsirea informaţiilor.
Internet foloseşte o metodă de adresare bazată pe sistemul de denumire al domeniilor.
Există posibilitatea includerii într-o adresă a mai multor nivele de domenii (domenii, instituţii,
departament, calculator). Domeniile de pe nivelul cel mai (înalt) general pot fi de natură
organizaţională sau geografică. Exemple de domenii organizaţionale: com (entităţi comerciale),
edu (instituţii educaţionale), gov (instituţii guvernamentale), etc. Exemple de coduri de denumiri
geografice: it (Italia), ro (România), etc.
Abstract:
J2EE şi .NET sunt platformele viitorului. Dar care platforma i se potriveşte cui? Sau:
„Cine vrea să cheltuiască bani pe produse Java?”
O privire comparativa asupra tehnologiilor Java si .Net, singurele alternative profesionale
pentru dezvoltarea de aplicatii in mediul de afaceri. Dupa succesul inregistrat de Java in ultimii
zece ani, Microsoft incearca sa introduca pe piata .Net, o creatie proprie si proprietara, care sa
concureze tehnologia Java. Este .Net cu adevarat o alternativa? Si daca da, pentru cine?
Evolutia ingineriei software in ultimii 5 ani a minimalizat utilizarea limbajelo 4GL, asa cum
limbaje ca Smalltalk au fost inlocuite de Java, iar conceptul de „fat client” a fost înlocuit de o
arhitectură multinivel. In compensatie s-au impus diferite tehnologii web si XML (Extended
Markup Language). Iniţiative de tip middleware cum ar fi Distributed Computing Environment
13
(DCE) sau Common Object Request Broker Architecture (CORBA) sunt înlocuite treptat cu
infrastructuri tehnice de mare complexitate. Astăzi au rămas în esenţă numai două platforme
tehnologice pentru aplicaţii noi: Java 2 Enterprise Edition (J2EE) şi Microsoft .NET.
Pentru a lua o decizie corectă pentru viitor, utilizatorii trebuie să ia în considerare două criterii
importante:
- potenţialul de dezvoltare şi comprehensibilitate susţinut de o anumită
platformă
- oferta de soluţii proprii ale platformei, necesare pentru a se menţine pe
piaţă.
Limbajul Java a cunoscut o dezvoltare deosebită în ultimii cinci ani, de la un„capriciu” al
împătimiţilor pentru limbajele orientate obiect la o tehnologie larg răspândită. Această evoluţie
se datorează mai puţin farmecului limbajului şi mai mult fortei platformei tehnice asociate.
Recent şi Microsoft oferă o platformă tehnologică asemănătoare. Cei din Redmond au început cu
Distributed InterNet Architecture (DNA), care avea însă multe defecte.
Pe lângă problemele cu registrul şi conflictele de la nivelul DLL-urilor, a apărut
conceptul de model obiect componentă (COM), care a devenit prea complex din cauza
suportului pentru diferite limbaje. De asemenea procesarea distribuită cu soluţii DCOM pe baza
conceptului Microsoft RPC şi a registrului Windows nu s-a dovedit a fi compatibilă cu
Internetul.
14
2. J2EE este independent de conceptul de sistem de operare. Portabilitatea este asigurată de Java
Runtime Environment, iar serverul de aplicaţii si alte produse middleware pot fi programate in
funcţie de sistemul de operare. Pe lângă aceste aspecte, mai există şi alte criterii importante în
luarea unei decizii în privinţa acestor două tehnologii, cum ar fi nivelul de comprehensibilitate si
dezvoltare, ceea ce analiştii de la Gartner numesc „completeness of vision”. Avantajul J2EE
constă în existenţa interfeţelor API (Application Programming Interface), care creează o
independenţă tehnologică a aplicaţiilor. Aceasta facilitează dezvoltarea ulterioară a tehnologiei
cu efecte secundare reduse. Modelul componentelor Java este mai metodic şi mai elaborat, iar
arhitectura bazată pe conectori oferă baza pentru o mai mare interoperabilitate decit facilitatile
corespondente in tehnologia .Net.
Înainte de a lua o decizie, responsabilul IT trebuie să mai treacă sub lupă şiimplementarea
tehnică a infrastructurii informatice respective. Sub acestaspect .NET posedă câteva avantaje,
deoarece utilizează de la începuttehnologii moderne cum ar fi XML şi serviciile web. Prin
dezvoltarea proprieimaşini virtuale Microsoft rezolvă problemele datorate interpretorului din
Java.Multe functionalităţi ale sistemului de operare Windows pot fi utilizate direct,cum ar fi
serverul web IIS, Active Directory, OLEDB şi Windows LoadBalancing. Cuplarea eficientă cu
sistemul de operare este cauzaperformanţelor îmbunătăţite ale aplicaţiilor .NET, comparativ cu
cele ale aplicaţiilor J2EE, deşi este dificil de estimat obiectivitatea testelor respective.Totuşi
performanţele pot varia, astfel performanţele maşinii virtuale Java pe acelaşi suport hardware
variază cu un factor egal cu trei, iar această variaţie e chiar mai mare pentru serverele de aplicaţii
Java. Experienţa arată ca produsele software complexe au nevoie de ani de zile pentru a fi
dezvoltate. Asta se întâmplă cu bazele de date, cu aplicaţiile de monitorizare a tranzacţiilor sau
cu aplicaţiile Java, ceea ce face ca dezvoltarea unui nou produs construit pe un nucleu de
componente mai vechi să nu constituie un dezavantaj. Produsele J2EE au căpătat în timp un grad
acceptabil de maturizare. Pentru .NET experienţa practicilor în dezvoltarea aplicaţiilor proprii
lipseşte, pentru a face o comparaţie.
15
Dincolo de criteriile de performanţă, managerii IT trebuie să ţină cont de eficienţa platformei şi
de productivitatea furnizată în dezvoltarea aplicaţiilor. Dacă se măsoară productivitatea numai pe
baza „numărului de linii de cod”, .NET prezintă avantaje clare in faţa J2EE. Crucial este însă cât
dintre aceste linii de cod trebuie sa fie scrise la mână. Aici intervine atât procesul automatizat de
dezvoltare cat şi inteligenţa mediului de dezvoltare software. În Java există diferenţe
semnificative între uneltele de dezvoltare, care sunt subliniate de furnizori în campaniile lor de
marketing. IDE (Integrated Development Environment) cum ar fi Jbuilder, Forte si mai nou
ECLIPSE oferta suport optimal pentru dezvoltare, debug si versionare de proiecte oricit de
complexe, lasind totusi programatorului intregul control si transparenta perfecta fata de codul
Java rezultat. Uneltele „Visual Studio .NET” de la Microsoft pot fi comparate cu cele mai
eficiente medii de dezvoltare din Java. Costurile cu licenţele şi cu întreţinerea sunt un factor ce
nu trebuie neglijat în luarea deciziei pentru sau contra unei tehnologii. Costurile soluţiilor J2EE
ale unor furnizori ca IBM sau BEA sunt transferate în categoria mainframe-urilor.
Nu trebuiesc insa uitate ofertele open-source cu preţ zero, care necesită doar puţin curaj
în implementare. Forte, Turbine, Struts, Cactus, Junit, Eclipse – sunt doar citeva nume de
frameworkuri, module sau unelte gratuite care nu mai au nevoie de nici o recomandare
suplimentare in lumea programatorilor si a inginerilor de software. Pe scara preţurilor de la
gratuit la scump, Microsoft .NET este aşezat undeva pe la mijloc. Mai apar şi cheltuieli cu
personalul calificat care să opereze o infrastructură atât de complexă. Mâna de lucru este scumpă
16
şi comparabilă pentru ambele tehnologii. Trebuie avut in vedere ca J2EE si Java sunt insa pe
piata de citiva ani de zile, fapt care a „produs” deja mina de lucru experimentata. Tehnologia
.Net este in stadiul de nou-nascut, iar specialistii in acest domeniu abia se formeaza.
Pentru a analiza dacă o tehnologie sau un concept este complet, trebuie luat în
considerare dacă ofertantul continuă să susţină şi să dezvolte propria tehnologie pe piaţă. Luind
in considerare valoarea strategica a acestor tehnologii, care sunt momentan singurele in masura
sa sustina dezvoltarea de aplicatii de tip B2B sau B2E, este foarte putin probabil sa nu se
gaseasca investori pentru ambele linii de dezvoltare, indiferent de situatia financiara a creatorilor
lor.
Furnizorii de tehnologie Java sunt capabili să sfideze puterea de dezvoltare simarketing a
celor de la Microsoft. Pentru ei aceasta este de fapt o strategie de supravieţuire. Dar ei nu depind
în mod necesar de existenţa companiei Sun. În cazul insolvabilităţii companiei Sun, rolul său
poate fi transferat altei companii. Grupul de producători de soluţii Java şi-a împărţit capacitatea
de producţie. Orice produs Java este dezvoltat în paralel de 6-8 producători. Astfel există
aproximativ 40 de producători de servere de aplicaţii. Dar competiţia accelerează si
diversificarea ideilor. Nici puterea de inovaţie a comunităţii open-source nu trebuie omisă.
Proiecte ca Apache arată gradul de dezvoltare de produse eficiente open-source.
17
de echipamente cu procesoare Intel ieftine si cu sisteme de operare Windows, vor opta pentru
.NET pentru noile aplicaţii. Companiile mari, ce dispun de sisteme mainframe dotate cu sisteme
Unix vor opta pentru o platformă ce rulează pe aceste mainframe-uri, aceasta fiind J2EE. Pentru
mulţi dintre utilizatori, inventarea limbajului Java a fost un eveniment. Dacă ei au trebuit să
testeze în trecut propriile aplicaţii pe mai multe sisteme de operare, acum ei le testează pe
implementarea standard de la Sun, cu eventuale teste adiţionale pe medii de producţie dezvoltate
de IBM, BEA sau Oracle.
Dar şi .NET atrage producătorii de software. Aceasta depinde de infrastructura clientului
respectiv. Dacă o companie cumpără o aplicaţie Java, atunci (cel puţin în prezent), trebuie
utilizat şi un mediu J2EE ce depinde de extensiile stabilite de fabricant. Prin cumpărarea mai
multor pachete software o companie ajunge să posede mai multe servere de aplicaţie. Cu .NET o
infrastructură pentru toate aplicaţiile este suficientă. Se mai pune doar intrebarea daca .Net
asigura si calitatea de care este nevoie in mediul de afaceri, Microsoft avind pina la acest
moment experiente (nu totdeauna laudabile) doar in mediul utilizator (home office sau
consumer).
Cerinţele legate de cunoştinţele dezvoltatorilor de aplicaţii sunt comparabile. În afara de
limbajul şi uneltele specifice, mai trebuie stăpânite cunoştinţe despre programarea orientată pe
obiecte, arhitectura bazată pe straturi, design de componente şi implementare iterativă. Cei care
au dezvoltat aplicaţii Microsoft în trecut pot trece uşor la .NET. Totuşi, un dezvoltator „clasic”
care a implementat în trecut în Visual Basic soluţii bazate pe „fat client” ar putea întâmpina
dificultăţi în implementarea cu .Net. În plus VB.NET nu mai este identic cu vechiul Visual
Basic.
Aceleaşi probleme apar şi la migrarea programelor Microsoft vechi la .NET. Pentru unele
module se oferă asistenţi de migrare, dar aceasta este valabil numai dacă aplicaţiile vechi s-au
dezvoltat pe o arhitectură pe trei nivele, pe bază de componente. Deoarece tendinţa merge către
achiziţionarea de software în loc de dezvoltare internă, companiile au puţine şanse să primească
tehnologie omogenă. Astfel încât se creează un mixaj de soluţii, pentru mainframe, PC, aplicaţii
Java şi .NET, prioritatea fiind abilitatea de a integra platforme eterogene.
Pentru sarcinile de integrare între tehnologii se poate utiliza XML sau serviciile web, care
sunt suportate atât de Java cât şi de .NET. Chiar şi aplicaţiile mainframe pot fi integrate cu un
anumit cost. Cea mai mare rezistenţă la integrarea cu alte programe o vor avea aplicaţiile din era
„fat client”, adică aplicaţiile Microsoft cu tehnologii mai vechi.
suport pe partea de server. JavaServer Pages face parte din familia Java şi reprezintă o
tehnologie care permite crearea de aplicaţii Web independente de platformă. JSP separă
interfaţa utilizator de conţinutul generat dinamic permiţând schimbarea întregului şablon al site-
ului WEB fără a altera informaţiile afişate. Tehnologia utilizează marcatori XML şi scripturi
scrise în limbajul de programare Java pentru a încapsula logica aplicaţiei care generează
conţinutul paginilor WEB. JSP-urile sunt o extensie a tehnologiei Java Servlet. Servlet-urile sunt
independente de platformă 100% şi reprezintă module la nivel de server care se integrează în
cadrul unei aplicaţii Web şi care pot fi utilizate pentru a extinde capabilităţile unui server WEB.
Tehnologia JSP şi servlet-urile oferă o alternativă pentru crearea aplicaţiilor WEB faţă
de alte limbaje de scripting/programare a aplicaţiilor WEB, oferind independenţă de platformă,
performanţă, separarea logicii aplicaţiei de partea de interfaţă utilizator, administrare uşoară şi
extensibilitate.
Principalul avantaj al JSP-urilor consta in introducerea template-urilor de continut
static (posibil de creat in formate non-HTML: WML, XML) care pot fi realizate de dezvoltatori
specializati in proiectarea interfetelor Web. Deoarece insa partea de prelucrare a informatiei necesara
generarii de continut dinamic este mai greu de scris in JSP, si este preferabil sa fie separata pentru a
fi scrisa de programatori Java, s-a trecut rapid de la lucrul exclusiv cu pagini JSP (arhitectura numita
“model-0”) la delegarea sarcinilor de stocare si prelucrare catre coduri Java care pot fi clase
Java clasice (POJO – Plain Old Java Objects) sau componente JavaBeans.
Arhitectura conţine elementele de bază necesare funcţionării aplicaţiei,
fiind prezentate componentele la nivel generic. Clienţii, prin intermediul unui
navigator Internet, accesează pagini JSP care conţin cod Java executat pe
maşina virtuală Java (JVM) de pe sever. Rezultatele prelucrărilor efectuate
sunt trimise clientului în format HTML prin serverul Web. Fişierele JSP sunt
transformate de către procesorul JSP în fişiere sursă Java, care conţin pe
lângă codul existent în fişierele JSP şi secvenţe de cod propriu motorului JSP.
Un servlet este un program Java care rulează în cadrul serverul Web sau al
servelor de aplicaţii şi funcţionează ca un strat de mijloc între cererile
provenite de la clienţi şi aplicaţii sau baze de date existente pe partea de
server. J2EE (Java 2 Platform, Enterprise Edition) defineşte un standard
pentru dezvoltarea aplicaţiilor de întreprindere multi-strat. Aplicaţiile de
întreprindere sunt simplificate prin utilizarea de componente modulare
19
standardizate, având un set complet de servicii care preiau o parte din
funcţionalitatea aplicaţiilor, astfel încât atenţia se va concentra la partea de
business.
Platforma J2EE utilizează platforma J2SE (Java2 Platform, Standard
Edition), în plus faţa
de aceasta oferă suport pentru:
- Java Servlets API ;
- tehnologia JSP;
- componente EJB (Enterprise JavaBeans);
- conectivitate la baze de date;
- tehnologia XML;
2.3.2 JSF
2.3.2.1 Introducere în JSF.
JSF (Java Server Faces) este o tehnologie opensource ce a apărut în
anul 2001, cu ajutorul căreia putem dezvolta interfeţe Web. JSF-ul are la
bază şablonul MVC (Model View Controller), ceea ce presupune separarea
interfeţei cu utilizatorul, a părţii de business logic, şi a modelului. JSF-ul pune
la dispoziţia programatorilor o serie de componente JSF standandard, ce vor
fi transpuse în elemente de interfaţă.
20
Puterea acestui framework se bazează tocmai pe flexibilitatea acestor
componente, care pot fi reutilizate, şi (şi mai important) pot fi extinse pentru
a da viaţă unei aplicaţii web conform cu cerinţele utilizatorilor săi. Putem sa
ne punem întrebarea: De ce să folosim JSF în locul JSP-ului, sau în locul unui
alt framework precum Strut sau Spring? Pentru a dezvolta o aplicaţie web
simplă, care nu necesită o interacţiune complexă cu utilizatorul putem alege
JSP în combinaţie cu JSTL (JSP Standard Tag Library). Dar, în caz contrar, JSF-
ul este o alegere mult mai potrivită datorită componentelor pe care le pune
la dispoziţia programatorului, acesta putându-se concentra pe dezvoltarea
aplicaţiei. Dezvoltatorul nu trebuie să ştie neapărat detaliile din spatele unei
componente JSF, modul de utilizare a acestora permiţând acest lucru.
Majoritatea IDE-urilor au dezvoltat suport pentru creearea de aplicaţii JSF în
mod vizual. Exemple de astfel de IDE-uri sunt: NetBeans, Eclipse, JDeveloper.
Un aspect important al aplicaţiilor web de care JSF-ul ţine cont este salvarea
şi reîncărcarea stării unei pagini web. Un exemplu tipic este cel al coşului de
cumpărături online. Starea fiecărei pagini trebuie salvată până când
utilizatorul a terminat de cumpărat (între cereri multiple). JSF-ul se ocupă de
acest lucru cu ajutorul clasei StateManager, care salvează şi recuperează
starea unui anumit view. Există două alternative pentru a face acest lucru: la
nivelul clientului sau la nivelul serverului.
21
care face parte din componentele JSF standard. Această componentă pune la
dispoziţie elementul html input text, cu ajutorul renderului HtmlInputText,
sau al renderelui HtmlInputHidden etc. Alte componente standard sunt:
UIData, UIColumn, UICommand, UIForm, UIGraphic etc. Pe lângă aceste
componentente standard, există o serie de alte implementări, care mai de
care mai puternice şi mai complicate. Printe acestea enumerăm: MyFaces,
RichFaces, IceFaces etc.
23
Restore View: atunci când este făcută o cerere pentru o pagina JSF. În timpul
acestei faze, JSF-ul construieşte/reconstruieşte view-ul paginii şi îl salvează
într-o instanţă FacesContext.
Apply Request Values: se apelează după construirea arborelui de
componente.
Validation: în timpul acestei faze, fiecare componentă procesează toţi
validatorii înregistraţi.
Update Model: se realizează actualizarea datelor pe partea de model pentru
a corespunde cu datele de pe partea de componentă.
Invoke Application: procesarea action-urilor şi a actionListenere-lor.
Render Response: generarea răspunsului pentru client şi salvarea stării.
2.3.3 MySQL.
MySQL este un sistem de gestiune a bazelor de date relaţional, produs
de compania suedeză MySQL AB şi distribuit sub Licenţa Publică Generală
GNU. Este cel mai popular SGBD open-source la ora actuală, fiind o
componentă cheie a stivei LAMP (Linux, Apache, MySQL, PHP).
Deşi este folosit foarte des împreună cu limbajul de programare PHP, cu
MySQL se pot construi aplicaţii în orice limbaj major. Există multe scheme
API disponibile pentru MySQL ce permit scrierea aplicaţiilor în numeroase
limbaje de programare pentru accesarea bazelor de date MySQL, cum are fi:
C, C++, C#, Borland Delphi, Java, Perl, PHP, Python, FreeBasic, etc., fiecare
dintre acestea folosind un tip spefic API. O interfaţă de tip ODBC denumită
MyODBC permite altor limbaje de programare ce folosesc această interfaţă,
să interacţioneze cu bazele de date MySQL cum ar fi ASP sau Visual Basic. În
sprijinul acestor limbaje de programare, unele companii produc componente
de tip COM/COM+ sau .NET (pentru Windows) prin intermediul cărora
respetivele limbaje să poată folosi acest SGBD mult mai uşor decât prin
intermediul sistemului ODBC. Aceste componente pot fi gratuite (ca de
exemplu MyVBQL) sau comerciale.
Licenţa GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei
care doresc să facă acest lucru pot achiziţiona, contra cost, o licenţă
comercială de la compania producătoare, MySQL AB.
MySQL este componentă integrată a platformelor LAMP sau WAMP
(Linux/Windows-Apache-MySQL-PHP/Perl/Python). Popularitatea sa ca
24
aplicaţie web este strâns legată de cea a PHP-ului care este adesea combinat
cu MySQL şi denumit Duo-ul Dinamic. În multe cărţi de specialitate este
precizat faptul ca MySQL este mult mai uşor de invăţat şi folosit decât multe
din aplicaţiile de gestiune a bazelor de date, ca exemplu comanda de ieşire
fiind una simplă şi evidentă: „exit” sau „quit”.
Pentru a administra bazele de date MySQL se poate folosi modul linie de
comandă sau, prin descărcare de pe internet, o interfaţă grafică: MySQL
Administrator şi MySQL Query Browser.
MySQL poate fi rulat pe multe dintre platformele software existente: AIX,
FreeBSD, GNU/Linux, Mac OS X, NetBSD, Solaris, SunOS, Windows
9x/NT/2000/XP/Vista.
25
1. se obţine kitul Tomcat de la adresa http://tomcat.apache.org/
2. se instaleaza acest kit. La instalare putem instala optional exemplele. In mod necesar, instalăm
Tomcat ca şi un serviciu (se selectează opţiunea service în ecranul „Choose Components”.
Selectăm o cale de instalare, de exemplu C:\Java\Tomcat6.0. Păstrăm portul de instalare 8080 şi
introducem o parolă de admin. LA instalare selectăm o platformă JRE. E de preferat să se
selecteze aceaşi platformă care este utilizată în Eclipse.
3. LA finalizarea instalării Tomcat, se porneşte serviciul de web. Verificăm funcţionarea acestui
serviciu. La o funcţionare corectă, în bara de taskuri care rulează în background trebuie să apară
icoana pentru Tomcat, marcată cu butonul verde. De asemenea, apelăm din browser adresa
http://localhost:8080/ care trebuie sa ne ducă la pagina iniţială Tomcat de pe calculatorul curent.
4. În cele ce urmează se configurează eclipse pentru WTP. În Eclipse se lansează meniul
Help/Software updates/Find and Install. Se selectează „Search for new features to install”. Se
selectează opţiunea Web Tools Platform updates. Pentru că avem nevoie de Eclipse DTP, dacă în
ecranul pentru alte unelte nu se gaseşte acest plugin, se introduce site-ul eclipse DTP pentru
update prin „new Remote Site”. Pentru DTP se va introduce următoarea adresa de web:
http://download.eclipse.org/datatools/downloads/drops/N_updates
5. În următorul ecran se selectează doar WTP şi apoi se apasă butonul „Select required” pentru a
se selecta pentru instalare toate uneltele solicitate de WTP. 6. Se finalizează instalarea lăsând
Eclipse să downloadeze şi instaleze componentele necesare.
7. Se instalează serverul Tomcat în Eclipse:
În meniul Window/Preferences/Servers/InstalledRuntimes selectăm Add. Apoi Selectăm din
lista Apache Tomcat 6.0 şi se selectează directorul de instalare Tomcat.
Capitolul III
26
Aplicaţii de reţea în Java. Socluri. URL. RMI
Clasele din pachetul java.net se împart în doua categorii, clase pentru socluri şi clase care
lucrează cu URL (Uniform Resource Locators). Soclurile Java facilitează accesul la protocoalele
standard utilizate în comunicarea între calculatoarele gazdă de pe Interent.
3.1.1 Protocoale
Aceste protocoale stabilesc regulile cu ajutorul cărora două calculatoare comunică între
ele. Protocoalele sunt standarde de care se ocupă IETF ( Internet Engineering Task Force). Java
implementează protocoalele de nivel superior al stivei de protocoale TCP/IP. Astfel facilitează
utilizarea protocoalelor HTTP (HyperText Transfer Protocol) şi FTP( File Transfer Protocol).
Astfel programatorul va utiliza nişte clase şi interfeţe predefinite, fără a cunoaşte detaliile de
implementare a acestora. Nu trebuie să cunoaştem structurile de date utilizate de acest sistem de
protocoale, nici metodele utilizate pentru transmiterea şi recepţionarea secvenţelor de octeţi.
27
Serverul este o aplicaţie care oferă servicii clienţilor sosiţi prin reţea. Serverele oferă o
gamă variată de servicii. Serverul cel mai cunoscut este serverul Web, care furnizează
documentele cerute de către clienţi. Un alt serviciu cunoscut este poşta electronică, care
utilizează protocoalele SMPT (Simple Mail Transfer Protocol) şi IMAP4 (Internet Mail
Access Protocol). Pe principiul client-server funncţionează şi protocoalele NFS (Network
File Service) şi FTP sau serviciul de nume de domenii DNS (Domain Name Service) şi
serviciul de informaţii despre reţea NIS (Network Information Services). Trebuie să amintim
şi serviciul care permite logarea la un calculator aflat la distanţă: TELNET şi RLOGIN.
Putem trage concluzia că arhitectura client-server este instrumentul de baza în dezvoltarea
aplicaţiilor de reţea.
Clientul este o aplicaţie care utilizează serviciile oferite de către un server. Pentru a putea
realiza acest lucru, clientul trebuie să cunoască unde se află serverul în reţea şi cum trebuie
comunicat cu acesta şi ce servicii oferă. Deci dacă un client doreşte o comunicare cu
serverul, trebuie să cunoască trei lucruri:
• adresa server
• portul server utilizat pentru comunicare
• protocolul de comunicaţie utilizat de server
Un soclu este de fapt un nod abstract de comunicaţie. Soclurile reprezintă o interfaţă de nivel
scazut pentru comunicarea in reţea. Soclurile permit comunicarea între procese aflate pe acelaşi
calculator sau pe calculatoare diferite din reţea. Mecanismul de socluri a fost definit prima data
in BSD UNIX. Java suportă trei tipuri de socluri. Clasa Socket utilizează un protocol orientat pe
28
conexiune (TCP), clasa DatagramSocket utilizează protocolul UDP la nivelul transport, care este
un protocol neorientat pe conexiune. O altă variantă a DatagramSocket este MulticastSocket
utilizat pentru a trimite date deodata la mai mulţi receptori. Soclurile utilizează fluxuri de date
(streamuri) pentru a trimite şi a recepţiona mesaje.
Acest model se bazează pe protocolul TCP. Într-o aplicaţie reţea întotdeauna avem două
parţi: o parte client care iniţializează conversaţia şi trimite cereri, şi o parte server care primeşte
cererile şi răspunde la acestea. Clientul întotdeauna crează un soclu pentru a iniţia conversaţia şi
trebuie să cunoască serverul căruia adresează cererea, iar serverul trebuie să fie pregatit pentru a
recepţiona aceste cereri. În momentul recepţionării mesajului crează un soclu pe partea
serverului, soclu care va facilita deservirea clientului. Atât pe partea de client cât şi pe partea de
server se utilizează câte un obiect de tip Socket pentru comunicare. Pe partea de server mai
trebuie să creăm un obiect de tip ServerSocket, care are sarcina primirii conexiunilor şi
acceptarea acestora.
29
Clientul trebuie să cunoască două lucruri despre server: numele serverului (utilizat pentru
determinarea adresei IP al serverului) şi numărul portului la care acesta ascultă cererile clienţilor.
Acelaşi calculator gazdă poate oferi mai multe servicii, deci poate găzdui mai multe procese de
tip server. De exemplu poate fi server Mail, server FTP, server HTTP, dar aceste aplicaţii
lucrează cu diferite porturi, deci cererile adresate acestor servere vor fi recepţionate pe diferite
porturi.
Privind modalitatea de deservire a clienţilor serverul prin construcţie poate fi server paralel
(concurent) şi server secvenţial.
30
eliberare conexiune ( eliberare soclu )
}
O aplicatie client executa urmatoarele:
1. Alocă un port de comunicare
2. Se conectează la server la portul cunoscut de dinainte
3. Se stabileşte o conexiune prin care se trimit şi se citesc date (soclu + fluxuri)
Clasa Socket
Constructori:
Socket(InetAddress address, int port)
Crează un soclu şi care se conectează la adresa IP specificat prin obiectul
InetAddress şi portul specificat prin parametrul port.
Crează un soclu şi care se conecteaza la adresa IP specificat prin obiectul InetAddress şi portul
specificat prin parametrul port. Ultimii doi parametri reprezintă adresa clientului şi portul pe care
acesta comunică .
Socket(String host, int port)
Crează un soclu şi care se conectează la calculatorul host pe portul specificat prin
parametrul port.
Metode principale:
void close()
Închide soclul.
InetAddress getInetAddress()
Returnează adresa la care soclul este conectat
InputStream getInputStream()
Returnează un stream de intrare pentru soclu.
31
InetAddress getLocalAddress()
Returnează adresa pe care soclul este creat.
int getLocalPort()
Returnează numărul portului local.
OutputStream getOutputStream()
Returneză un stream de ieşire pentru soclu.
int getPort()
Returnează portul la care soclul este conectat.
Clasa ServerSocket
Constructori:
ServerSocket(int port)
Crează un soclu server pe portul specificat.
Metode principale:
Socket accept()
Ascultă conexiunile şi le acceptă.
void close()
Închide soclul.
InetAddress getInetAddress()
Returnează adresa locală al soclului server.
int getLocalPort()
Returnează portul la care serverul aşteaptă conexiunile.
3.2 URL
Trimiterea unei datagrame este similară cu trimiterea unei scrisori prin serviciul poştal. În cazul
trimiterii unei scrisori avem nevoie de un plic pe care scriem adresa destinatarului şi după aceea
punem scrisoarea în plic şi o aruncăm într-o cutie poştală. Analog la trimiterea unei datagrame
32
trebuie sa cunoaşten adresa şi portul calculatorului caruia îi este adresată datagrama, după care
putem să punem datele în datagrama şi să le trimitem. Datagramele utilizează la nivelul
transportului protocolul UDP. Acest protocol este unul nesigur, neorientat pe conexiune. Nu se
face confirmare în cazul recepţionării acestor datagrame. Nici calea urmată de aceste datagrame
nu se cunoaşte de dinainte. De aceea dacă trimitem la acelaşi destinatar mai multe datagrame,
unul după altul, nu putem fi siguri nici în ordinea primirii acestor datagrame. Din cauza că
protocolul nu necesită confirmarea sosirii datagramelor este un protocol rapid şi se utilizează în
cazul serviciilor unde nu este nici o nenorocire dacî se pierde un pachet-doua (DNS utilizează
UDP).
Descrierea claselor principale:
Clasa DatagramPacket:
Constructori:
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port)
Construieşte un obiect de tip DatagramPacket pentru trimiterea unui pachet de lungime length
pe un port specificat, la un host specificat, specificand şi un offset
Metode:
InetAddress getAddress()
Returnează adresa IP al calculatorului de la care se primişte sau la care se trimite datagrama
byte[] getData()
Returnează şirul de octeţi care se trimite sau care se primeşte
int getLength()
Returnează lungimea datelor care se trimit sau care se primesc
int getOffset()
33
Returnează offsetul datelor care se trimit sau care se primesc
int getPort()
Returnează numarul portului calculatorului la distanţă la care se trimit datele sau de la care se
primesc datele
void setAddress(InetAddress iaddr)
Setează adresa.
void setData(byte[] buf)
Setează bufferul pentru pachet
void setData(byte[] buf, int offset, int length)
Setează bufferyl pentru pachet
void setLength(int length)
Setează lungimea pachetului.
void setPort(int iport)
Setează portul..
Clasa DatagramSocket
Constructori:
DatagramSocket()
Construieşte un soclu şi leaga la un port liber pe calculatorul local.
DatagramSocket(int port)
Metode:
void close()
Inchide soclul.
34
void connect(InetAddress address, int port)
Conectează soclul la o adresă şi port la distanţă.
void disconnect()
Deconectează soclul.
InetAddrress getInetAddress()
Returnează adresa la distanţa la care soclul este conectat.
InetAddress getLocalAddress()
Returnează adresa locală la care soclul este conectat.
int getLocalPort()
Returnează portul local la care soclul este legat.
int getPort()
Returnează portul la distanţa la care soclul este legat.
void receive(DatagramPacket p)
Primire de datagrama prin acest soclu.
void send(DatagramPacket p)
Trimitere de datagrama prin acest soclu
.
Mecanismul RMI (Remote Method Invocation) furnizează o modalitate prin care este
posibilă execuţia unei aplicaţii distribuite pe mai multe maşini virtuale Java, permiţând ca un set
de calculatoare să poată colabora (să transfere date şi cod) pentru rezolvarea unui task comun.
Paradigma RMI a preluat o serie de concepte din modelul clasic RPC (Remote Procedure Call)
adaptate pentru sisteme obiectuale, astfel un obiect “client” poate să apeleze o metodă a unui
obiect “server” aflat la distanţă, concept extins cu alte facilităţi specifice programării distribuite
obiectuale, cele mai importante fiind sistemul de numire a entităţilor, colectorul de deşeuri,
încărcarea dinamică a claselor, oferind astfel o modalitate elegantă de soluţionare a diverselor
probleme specifice programării distribuite, pentru medii Java.
3.3.1. Concepte
În aplicaţiile distribuite atât datele (stocate separat) cât şi codul (procesoare multiple în
sistem), respectiv utilizatorii (comunica şi interacţionează) pot fi distribuiţi. RMI este un sistem
35
de programare obiectual, distribuit construit în platforma Java, facilitate ce permite interacţiuni
între obiecte care rulează pe maşini virtuale Java distribuite în reţea. Spre deosebire de
programarea complexă, bazată pe socketuri, mecanismul RMI oferă un context de programare
distribuită flexibil şi relativ simplu, reprezentând mecanismul suport pentru diverse alte modele
de dezvoltare a aplicaţiilor distribuite Java
Mecanismul a fost adăugat în platforma Java JDK 1. 1 din nevoia unui suport pentru
dezvoltarea aplicaţiilor distribuite bazate pe obiecte Java. Deşi la o simplă analiză, sistemul RMI
poate părea un alt mecanism de apel al procedurilor la distanţă (tip RPC), el reprezintă o soluţie
evoluţionară, un sistem care diferă de celelalte în setul de prezumţii despre sistemul distribuit pe
care operează, în modelul de programare şi capabilităţile oferite dar şi în modul în care
mecanismul interacţionează cu sistemul distribuit. RMI permite crearea unei referinţe la un
obiect care aparţine unui proces de pe un alt calculator şi invocarea de metode ale obiectului ca şi
cum acesta ar fi local. În loc să fie necesară definirea unui protocol de transfer de mesaje şi un
format al datelor transmise între procesele aplicaţiei distribuite, se foloseşte interfaţa Java ca
protocol, iar argumentele metodei exportate devin formatul datelor transmise.
Un sistem de programare a aplicaţiilor distribuite trebuie să ofere dezvoltatorului de aplicaţii
următoarele facilităţi:
localizarea obiectelor la distanţă- aplicaţiile folosesc diverse mecanisme pentru a obţine
referinţele obiectelor remote (serviciul de nume rmiregistry sau transferul referinţelor la
obiecte ca parte a operaţiei solicitate)
comunicare cu obiectele remote - detaliile comunicării sunt gestionate de RMI, pentru
programator comunicaţia remote este similara unei invocări de metode locale
încărcarea codului intermediar al clasei pentru obiecte transferate ca parametri sau valori
întoarse. Deoarece permite ca apelantul să transfere obiecte, RMI integrează mecanismele
necesare încărcării codului obiectului şi transmiterea datelor.
Serverul apelează un sistem de localizare a obiectelor (registry) pentru a asocia un nume cu
un obiect remote, astfel clientul va căuta obiectul după nume în registry şi apoi va invoca
metoda. Pot fi utilizate servere Web pentru a încărca codul intermediar al claselor Java client-
server pentru obiectele aplicaţiei dacă este necesar folosind orice protocol de tip URL suportat de
platforma Java.
36
metode diverse obiecte complexe (tabela de hashing) (în sistemele RPC, la client
obiectul necesită descompunere în tipuri primitive, transferul lor şi apoi refacerea
obiectului la server)
oferă cod portabil: RMI e portabil referitor la orice JVM
integrează un colector de deşeuri distribuit (Garbage Collector) oferind astfel
suport pentru gestionarea referinţelor la obiectele distribuite
integrează mecanisme de securitate: RMI foloseşte controlerul de securitate
integrat JVM pentru a proteja sistemele de applet-uri maliţioase sau cod destructiv
oferă suport pentru procesare paralela şi comportament mobil: RMI poate să
schimbe ‘comportamentul’, adică implementările claselor, de la client la server şi
invers
37
Stratul Stub/Skeleton - stratul stub este la client, iar stratul skeleton e la server,
comportându-se asemenea unor proxy. JVM permite doar invocarea de metode locale, astfel o
cerere de invocare a unui obiect de la distanţă parcurge straturile sistemului RMI în ambele
sensuri, presupunând folosirea unui stub pentru obiectul de la distanţă şi a unei căi spre acel
obiect.
Acest strat defineşte interfaţa dintre aplicaţie şi restul sistemului RMI, nu se ocupă cu
detalii de transport, dar transmite datele spre stratul de referinţă la distanţă via abstractizarea
numită stream-uri, bazat pe mecanismul de serializare, ce permite transmisia obiectelor Java
între diferite spaţii de adrese.
Un stub pentru un obiect remote este proxy-ul la client al acelui obiect, el implementează
toate interfeţele care sunt suportate de obiectul remote, fiind reponsabil pentru:
iniţierea unui apel spre obiectul remote (prin apelul stratului de referinţă la distanţă)
ordonantarea argumentelor într-un stream marshall (argumente sunt obţinute de la
stratul de referinţă la distanţă)
informarea stratului de referinţă la distanţă de faptul că apelul este necesar
reconversia valorii de return sau a excepţiei dintr-un stream marshall
informarea stratului de referinţă la distanţă de faptul că apelul a fost efectuat
Un skeleton pentru un obiect remote este o entitate în server care conţine metode ce
efectuează apelurile spre implementarea obiectului remote. Această entitate este responsabilă cu:
reconversia argumentelor din stream-ul marshall
efectuarea apelului spre implementarea obiectului remote
ordonantarea valorii de return a apelului sau a excepţiei în stream-ul marshall
Obiec Obiec
t t
client server
Stub/skeleton Stub/skeleton
Referinta Referinta
remote remote
Transport Transport
Stratul de referinţa la distanţă are două componente care cooperează astfel: componenta
client conţine informaţii specifice despre server-ul remote şi comunică via strat transport cu
componenta server.
39
canal - abstractizarea pentru calea dintre două spaţii de adrese, responsabil pentru
managementul conexiunilor între spaţii de adrese locale şi spaţiul de adrese remote
pentru care este definit canalul.
conexiune - abstractizare pentru transferul datelor
abstracţia de transport controlează canalele. Fiecare canal e o conexiune virtuală între
2 spaţii de adrese, într-un transport poate exista un singur canal pentru fiecare pereche
de spaţii de adrese, abstracţia de transport fiind responsabilă pentru acceptarea
apelurilor de pe conexiunile care se stabilesc spre spaţiul de adrese şi pentru pasarea
acestui apel spre straturile superioare din sistem.
pentru acelaşi transport pot exista mai multe implementări (TCP-UDP pentru aceeaşi
maşina virtuală).
Modelul de obiecte distribuite. Numim obiect depărtat un obiect care oferă metode
apelabile de la distanţă, obiectele la distanţă sunt exemple ale unor clase ce implementează
metodele unor interfeţe la distanţă În terminologia client/server, obiectul depărtat îl vom numi
server, iar obiectul care invocă o astfel de metodă îl vom numi client.
Localizarea obiectelor la distanţă este realizată prin intermediul unui server de nume
(registrator - rmiregister), care stochează referinţe tip URL către obiecte la distanţă (protocolul
din URL poartă numele rmi). Serviciul de nume necesită următorul set de funcţiuni: introducere
de asocieri nume – obiect, căutări de asocieri, modificări / ştergeri de asocieri, listarea asocierilor
existente la un moment dat.
Interfaţa la distanţă. Legătura între server şi client este realizată prin intermediul unei
interfeţe de acces la distanţă. Definirea unei astfel de interfeţe trebuie să verifice următoarele
condiţii:
trebuie declarată public
trebuie să extindă interfaţa java. rmi. Remote
fiecare metodă din interfaţa la distanţă trebuie să declare posibilitatea de a arunca
(throws) excepţia java. rmi. RemoteException
Implementarea interfeţei la distanţă respectă următoarele etape:
obiectul server extinde java. rmi. server. UnicastRemoteObject şi implementează
interfaţa la distanţă
40
se specifică constructorul obiectului server (si excepţia java. rmi. RemoteException)
pentru obiectul server trebuie să se definească şi să se instaleze un manager de
securitate (pentru Java 2 acesta este RMISecurityManager).
constructorul obiectului server foloseşte, printre altele, un fişier în care să se specifice
“politica de securitate” adoptată de către server (identificarea numelui acestui fişier
este realizată prin stringul atribuit variabilei java. security. policy la lansarea
serverului, fie prin: System. setProperty()).
se înregistrează obiectul server la serverul de nume (rmiregister) sub numele dorit
(java. rmi. Naming. bind() sau java. rmi. Naming. rebind()).
se implementează metodele apelabile de la distanţă (interfeţe la distanţă).
Obiecte exportabile prin RMI. Orice argument sau valoare returnată folosită într-un
apel RMI trebuie să fie serializabilă. RMI va serializa transparent obiectele (sau tipurile
41
primitive de date) trimise ca parametri sau returnate de metodele apelabile la distanţă. Spre
deosebire de apelurile locale, care transmit referinţe la obiecte, RMI copiază argumentele şi
valorile returnate de metodele la distanţă, astfel semantica transmiterii acestor valori este
“transmitere prin valoare”. Spre exemplu avem un obiect server, exportabil, care are o metodă
apelabilă la distanţă, metodă ce întoarce o referinţa la însăşi obiectul server în sine (this). În
cazul serverului, this se referă la însăşi instanţa actuala a serverului care este o entitate în maşina
virtuală Java locală. Daca această metodă este apelata de către client care rulează în alta maşină
virtuală Java, acesta client lucrează cu stub-ul ca un mod de a reprezenta serverul (proxy pentru
obiectul server), deci în momentul în care serverul întoarce printr-o anumită metodă o referinţă la
el însuşi, clientul primeşte o referinţă la stub-ul serverului.
Metodele apelabile la distanţă verifica parametri şi valorile returnate care implementează
interfaţa Remote. De fiecare dată când este întâlnit un astfel de obiect exportabil, el este înlocuit
transparent cu stub-ul asociat lui. În momentul în care serverul întoarce o referinţă la el însuşi, în
urma apelului unei anumite metode, RMI converteşte serverul la stub-ul său pentru ca clientul să
îl poată folosi. Acest mod transparent de a schimba argumente asigură invizibilitatea stub-ului
atât în server cât şi în client. Atât serverul cât şi clientul au iluzia că lucrează cu obiecte locale,
fiindcă chiar şi referinţa this poate fi folosită prin RMI între mai multe maşini virtuale Java.
Astfel obiectele exportabile, apelabile la distanţă sunt transmise prin referinţă ca într-un
apel Java normal. Când transmitem un obiect la distanţă ca argument sau valoare returnată de
către o metodă la distanţă, se primeşte o referinţă a obiectului la distanţă ce poate fi utilizata atât
în server cât şi în client. Transmiterea unui obiect la distanţă nu se realizează prin copierea
întregului obiect, ci doar stub-ul, care poate fi gândit ca o referinţă la obiectul la distanţă. Un
stub este serializabil, ceea ce înseamnă că poate fi transmis într-un apel de metodă la distanţă ca
orice alt obiect Java neexportabil (adică prin valoare).
Adnotarea claselor în RMI. Adnotarea claselor denotă mecanismul prin care în fluxul
de date serializat se adaugă şi o adresă de unde se poate obţine la nevoie codul binar Java al
clasei respective, mecanism fundamental pentru implementarea transferului de comportament în
RMI.
Pentru a realiza adnotarea unei clase la scriere (serializare) în loc să se utilizeze un obiect
instanţiat direct din ObjectOutputStream se utilizează un obiect instanţiat din clasa derivată
MarshalOutputStream, în care se defineşte metoda annotateClass(). Pentru a încărca clasele
adnotate (operaţia inversă serializării) se utilizează un obiect instanţiat din MarshalInputStream
care derivă din ObjectInputStream şi care defineşte metoda resolveClass(). Adresa cu care se
face adnotarea se transmite sub forma unui URL.
42
La împachetarea argumentelor pentru RMI (marshalling) se utilizează pentru fiecare
obiect argument metoda annotateClass() care testează dacă o clasă este locală sau a fost adusă de
un încărcător (loader) de la distanţă. În acest caz (de un URLClassLoader spre exemplu), se
interoghează încărcătorul respectiv asupra adresei de origine şi se adnotează cu aceasta clasa, în
caz contrar, RMI nu poate determina adresa pe baza originii clasei (de exemplu, o clasă încărcată
local din CLASSPATH). Pentru a adnota astfel de clase RMI are nevoie de o adresă dată explicit
prin intermediul proprietăţii java. rmi. server. codebase, proprietate ce permite chiar specificarea
mai multor adrese alternative. Dacă această proprietate este însă vidă, atunci clasele nu vor fi
adnotate, iar cel care le receptează trebuie să determine prin alte mijloace adresa de la care le
poate încărca.
rmiregister
3 3
Naming. 0 Naming.
rebind LocateRegistry lookup
(optional)
obiect obiect
server client
1
1
java. security. java. security.
2 policy 4
policy
apel metoda 2
setSecurityManag (obiect) setSecurityManag.
43
fiecare descriptor de clasă metoda resolveClass() din MarshalInputStream, responsabilă cu
încărcarea claselor necesare pentru instanţierea obiectului.
Înainte de a preciza strategia de rezolvare a claselor, este necesară specificarea modului
în care se poate obţine codul binar al clasei, astfel există trei metode posibile:
pe baza adnotării aferente clasei transmisă prin RMI Wire Protocol
pe baza unei proprietăţi globale pentru toate clasele recepţionate fără adnotare
prin intermediul unui încărcător special.
Proprietatea globală care poate fi interogată este tot java. rmi. server. codebase. Se
observă că această proprietate oferă o adnotare automată a claselor ce nu prezintă una explicită
atât la transmiterea cât şi la recepţionarea fluxului serializat, mecanism numit adnotare implicită.
Încărcătorul special menţionat poartă denumirea de încărcător contextual (context class loader).
Acest mecanism este specific Java 2 şi este foarte flexibil deoarece pentru fiecare fir de execuţie
se poate specifica un încărcător contextual diferit. La instanţierea unui nou fir de execuţie, acesta
moşteneşte încărcătorul contextual al părintelui.
Astfel proprietatea java. rmi. server. codebase poate fi utilizată pentru adnotare atât de
către cel care transmite clasele cât şi de cel care le recepţionează, insa este necesara stabilirea
unei politici adecvate în acest sens. Să presupunem că dorim să realizăm o aplicaţie, în care un
44
server transmite un comportament care va fi executat de către clienţi. Există trei posibilităţi şi
anume:
setarea proprietăţii codebase doar la client, astfel clasele vor sosi fără vreo
adnotare la acesta şi se va folosi adnotarea implicită.
setarea proprietăţii codebase doar la server, atunci clasele vor sosi direct adnotate.
setarea proprietăţii codebase şi la client şi la server, atunci clasele vor sosi
adnotate de pe server, iar adnotarea implicită a clientului va fi ignorată. Se
observă că în acest scenariu transferul va funcţiona indiferent unde se specifică
proprietatea codebase.
Să presupunem însă că dorim să ne conectăm cu clientul la mai multe servere simultan şi
că nu toate serverele au codul comportamentului la aceeaşi adresă. În această ipoteză clientul
trebuie să primească cod de la fiecare server, iar adnotările trebuie să fie specifice fiecărui server,
caz în care este utila a doua soluţie, în care fiecare server va adnota corespunzător fluxul său de
date, astfel încât clientul să poată obţine fiecare comportament de la sursa corespunzătoare.
45
pe fire de execuţie distincte. Concret, metodele de setare şi obţinere a încărcătorului contextual
se găsesc la nivelul clasei Thread şi sunt:
Încărcătorul contextual poate fi setat doar la destinaţia comportamentului. Din acest motiv,
utilizarea sa este mai puţin directă. Trebuie să trimitem mai întâi de la sursa comportamentului
adresa de unde se pot obţine clasele. Asta se poate realiza printr-un apel RMI care să nu implice
transfer de cod.
Mecanismul de reflecţie. Începând cu Java 1. 2. facilităţile de reflecţie au fost utilizate
pentru a proiecta un distribuitor generic al cererilor de obiecte cu scopul de a evita skeletoanele.
Proxiurile la client sunt generate folosind compilatorul rmic din clasele server compilate şi nu
din definiţiile interfeţelor remote.
46
acestor referiri. Constructorii protected RemoteObject() şi protected RemoteObject(RemoteRef
newref) creează un obiect la distanţă iniţializat cu referirea specificată.
Clasa RemoteServer este o superclasă pentru implementări de servere şi oferă o gamă
variată de semantici pentru referirile la distanţă. Toate metodele clasei sunt statice. Metoda
getClient-Host apelata dintr-un fir de execuţie aflat în cursul tratării unui apel de metodă la
distanţă returnează numele calculatorului pe care rulează clientul, iar celelalte metode stabilesc
identitatea fluxului utilizat la crearea unui jurnal de apeluri la server.
protected UnicastRemoteObject()
protected UnicastRemoteObject(int port)
protected UnicastRemoteObject(int port, RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
public Object clone()
public static RemoteStub exportObject(java. rmi. Remote obj)
public static Remote exportObject(java. rmi. Remote obj, int port)
public static Remote exportObject(Remote obj, int port, RMIClientSocketFactory
csf, RMIServerSocketFactory ssf)
public static boolean unexportObject(java. rmi. Remote obj,
boolean force)
47
}
Majoritatea metodelor au nume care încep cu check iar utilizarea lor se face după
următoarea schemă:
SecurityManager security=System. getsecurityManager();
if (security !=null){
Security. checkxxx(argument, …);
}
48
public static Object getSecurityContext(ClassLoader loader) – returnează
contextul de securitate
Procesele server trebuie să declare mediului de execuţie RMI localizarea claselor stuburi
şi parametri/valori returnate ce vor fi disponibile clienţilor prin această proprietate.
Pachetul java. rmi. registry conţine două interfeţe Registry şi RegistryHandler precum şi
clasa LocateRegistry ce realizează serviciul de înregistrare şi regăsire a obiectelor la distanţă
folosind nume simple. E permis ca fiecare process server să îşi definească propriul registru de
obiecte sau să folosească un singur registru pentru un host. Registrul este un obiect la distanţă la
rândul său.
Interfaţa registry specifică metodele de căutare, legare, relegare, ştergere şi listare a
conţinutului unui registru. Operaţii bind/rebind/unbind sunt premise doar dacă solicitanţii sunt pe
acelaşi host ca şi serverul însă operaţia lookup este permisă de oriunde.
49
Clasa LocateRegistry - conţine metodele statice ce returnează o referinţă la un registru, o
metodă de creare registru, referinţele returnate sunt referinţe la un stub la distanţă al registrului.
Metodele tip get returnează referiri al registrul hostului curent şi pentru portul specificat
(portul pentru Registry este 1099). Metoda CreateRegsitry creează şi exportă un registru pe
hostul local, registru ce implementează un serviciu de nume simplu, în care numele unui obiect
la distanţă (String) este asociat unei referinţe la distanţă. Legăturile astfel create sunt valabile
doar pentru activarea curentă a registrului.
Interfaţa RegistryHandler este utilizată pentru legătura cu o implementare particulară a
serverului de nume astfel:
50
public abstract class RemoteStub extends java. rmi. RemoteObject {
protected RemoteStub() {. . . }
protected RemoteStub(RemoteRef ref) {. . . }
protected static void setRef(RemoteStub stub,
RemoteRef ref) {. . . }
}
51
metodă la distanţă obj. Tabloul de operaţii op conţine operaţiile disponibile asupra obiectului la
distanţă iar num este un indice în acest tablou prin care este indicată operaţia apelului curent.
Object invoke(Remote obj, java. lang. reflect. Method method, Object[] params, long
opnum) throws Exception;
RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum,
long hash) throws RemoteException;
void invoke(RemoteCall call) throws Exception;
void done(RemoteCall call) throws RemoteException;
String getRefClass(java. io. ObjectOutput out);
int remoteHashCode();
boolean remoteEquals(RemoteRef obj);
String remoteToString();
}
Interfaţa ServerRef reprezinta descriptorul de server pentru implementarea unui obiect la
distanţă. Metoda exportObject caută sau creează un obiect stub client pentru implemenetarea
obiectului Remote obj. Astfel server este obiectul server la distanţă pentru implementare poate fi
identic cu obj), iar data conţine informaţiile necesare exportării obiectului.
52
package java. rmi. server;
public interface Skeleton {
void dispatch(Remote obj, RemoteCall call, int opnum, long hash)
throws Exception;
Operation[] getOperations();
}
Într-un sistem distribuit, la fel ca într-un sistem local, este de preferat a se şterge automat
acele obiecte remote care nu mai sunt referenţiate de nici un client. Astfel, programatorul e
eliberat de sarcina neplăcuta de a tine evidenţa obiectelor remote client. RMI foloseşte un
algoritm de garbage collection bazat pe numărarea referinţelor.
Pentru a implementa algoritmul garbage collection, RMI runtime ţine evidenta a tuturor
referinţelor active din fiecare JVM, astfel când o referinţă activă intră într-o maşină virtuală
JVM, contorul sau de referinţă e incrementat. Pe măsură ce referinţe active sunt găsite
nereferenţiate de JVM, contorul asociat este decrementat. Când ultima referinţă a fost ştearsă un
mesaj de nereferenţiere este trimis la server. Protocolul este destul de complex, pentru că se ţine
seama mai ales de menţinerea ordonării mesajelor de referenţiere şi dereferenţiere, astfel încât
obiectul să nu fie prematur colectat.
Interfaţa DGC (Distributed Garbage Collector) este utilizată în server de algoritmul
distribuit de colectare a deşeurilor şi implementează metodele dirty şi clean. Un client apelează
dirty atunci când deordonanţează o referire la distanţă iar dacă nu mai are referiri la distanţă va
53
apela clean. Referirile la obiectele la distanţă sunt împrumutate (lease) de către clienţi pe
perioade specificate ce încep în momentul primirii apelului dirty. Este responsabilitatea
clientului să reînnoiască împrumuturile înainte de expirare, altfel se presupune că obiectul nu
mai e referit. Un obiect conţine un identificator unic al clientului, (VMID) pentru fiecare obiect
la distanţă exportat în maşina locală colectorul (GC) menţine o listă de referiri (identificatori ai
clienţilor ce au referit obiectul). Este necesar un singur apel la dirty pentru fiecare obiect chiar
dacă clientul deţine mai multe referinţe pentru acel obiect. Descrierea sucintă a claselor:
1. Clasa Lease conţine VMID şi o durată de împrumut
2. Clasa ObjID identifică unic obiectele remote pentru fiecare maşină virtuală, acesta
conţine un număr de obiect şi un identificator al spaţiului de adrese. Clasa Objid
reimplementează metodele hashCode, equals şi toString
3. Clasa UID creează identificatori unici pentru hostul pe care s-au generat pentru a
permite identificarea spaţiului de adrese.
4. Clasa VMID oferă identificatori unici universali în raport cu toate maşinile JVM(UID
şi adresa de host)
In cazul în care în reţea apare o partiţionare forţată între clienţi –servere e posibil să apară
referinţe invalide fiind astfel necesare mecanisme suplimentare pentru gestionarea lor corectă.
54
când se doreşte exportarea unor obiecte dintr-un applet (exportarea este acţiunea prin care un
obiect devine invocabil de la distanţă).
Conexiunile încapsulate se utilizează atunci când clientul se află într-un intranet protejat
de un firewall care limitează accesul către exterior. Pentru conexiunile încapsulate clientul
împachetează apelul într-o cerere HTTP POST, răspunsul obiectului apelat fiind împachetat la
rândul său într-un răspuns HTTP.
Pentru a transmite cererea sunt disponibile două metode:
Acces direct - se încearcă adresarea acesteia direct către portul pe care
ascultă obiectul de pe server, dacă firewall-ul lasă să treacă cereri HTTP către
porturi arbitrare, atunci această metodă va reuşi, iar obiectul va fi apelat direct. În
caz contrar, se trimite cererea către portul 80 al serverului, în speranţa că firewall-
ul permite conexiuni către porturi HTTP standard.
Acces indirect – e necesar ca pe maşina pe care se găseşte obiectul apelat
să ruleze un server Web care să poată executa un anume program CGI (java-rmi.
cgi). Acest program va citi antetul cererii POST şi pe baza acestuia va înainta
cererea către portul pe care ascultă obiectul apelat.
Prin conexiunea stabilită prin una din aceste metode sunt transmise invocările la distanţă
şi obţinute rezultatele. Prin intermediul primelor două tipuri de conexiune se pot transmite mai
multe apeluri, însă conexiunea încapsulată permite un singur apel, după care trebuie efectuată o
nouă conexiune.
Transfer de cod (comportament). Pentru a încapsula fluxul de cod binar se pot folosi
protocoalele Internet pentru transferul de fişiere suportate de maşina virtuală Java (FTP, HTTP).
Nu este nevoie de un server Web pentru a testa transferul de cod, fiind posibilă folosirea oricărui
protocol pentru care există un handler instalat, bayat pe faptul că RMI foloseşte un
URLClassLoader pentru a transfera codul binar al claselor ce prezintă adnotare.
55
realizata prin modificarea fluxului de date transmis (cum ar fi utilizarea RMI peste protocolul de
transmisie securizata SSL -Secure Sockets Layer) asigurând astfel prin criptare securitatea
comunicaţiilor prin utilizarea unui mecanism specific numit Custom RMI Socket Factory.
Disponibil în JDK 1. 1, RMISocketFactory face posibilă construirea unei “fabrici” care
să producă socketuri, însă odată instanţiata “fabrica” aceasta putea produce numai socketuri de
acelaşi tip. Prin introducerea clasei java. rmi. server. SocketType se oferă posibilitatea construirii
unui RMISocketFactory care poate genera cel mai potrivit tip de socket pentru un anumit obiect.
Practic, se oferă utilizatorului RMI posibilitatea de a redefini fabrica ce produce soclurile
utilizate de RMI, redefinire introdusă încă din JDK 1. 1, însă o serie de restricţii destul de severe
au făcut ca această facilitate să nu poată fi exploatată corespunzător în JDK 1. 1, astfel:
aceeaşi fabrică de socluri era necesar a fi folosită pentru toate obiectele
invocabile de la distanţă,
era necesar să existe un registru RMI (rmiregistry) pentru fiecare tip de
socluri, iar
clasele fabricii de socluri nu puteau fi aduse de la distanţă ci era obligatoriu să
fie încărcate local.
Tipul soclurilor (tip client pentru cel care iniţiază o conexiune, tip server ascultă în
aşteptarea unei conexiuni) utilizate de un obiect invocabil la distanţă se stabileşte la momentul
exportării obiectului. Presupunând că obiectul este derivat din UnicastRemoteObject, va fi
suficient să-l construim prin intermediul unui constructor care primeşte ca argumente fabricile de
socluri: protected UnicastRemoteObject(int port, RMIClientSocketFactory csf,
RMIServerSocketFactory ssf)
Ambele tipuri de socluri se transmit ca parametri. Fabrica de socluri server va fi folosită
de către obiect pentru a instanţia socluri pe care se vor primi conexiuni de la clienţi, iar fabrica
de socluri client nu e folosită ca atare de obiectul server, ci se va transmite clienţilor pentru ca
aceştia să se poată conecta la server.
56
Putem imagina un client care contactează un server prin RMI "obişnuit", stabileşte de
comun acord cu acesta ca sesiunea să se desfăşoare criptat, după care utilizează o fabrică de
socluri cu criptare pentru restul comunicaţiei, iar fabrica ce generează soclurile cu criptare poate
fi transmisă de la server la client pe parcursul execuţiei acestuia.
Obiecte activabile
57
În JDK 1. 2, mecanismul RMI se îmbogăţeşte cu obiecte activabile la distanţă. Acestea
reflecta un mecanism prin intermediul căruia se pot activa obiecte server doar atunci când este
nevoie de ele şi se folosesc identificatori persistenţi pentru a putea referi obiectele şi atunci când
acestea sunt inactive, aceasta conduce evident la o folosire mai eficientă a memoriei pe maşina
server
De lansarea în execuţie a acestor obiecte activabile este responsabil un demon (rmid) ce
lansează maşini virtuale Java în care rulează efectiv obiectele. Pentru a nu crea un număr excesiv
de maşini virtuale şi pentru a permite cooperarea între obiectele server, acestea pot fi adunate în
grupuri de activare; toate obiectele din acelaşi grup fiind executate în aceeaşi maşină virtuală
Prin introducerea clasei java. RMI. activation. Activatable şi a demonului RMI, rmid,
obiectele remote pot fi create şi executate atunci când este nevoie de ele, programele trebuie doar
să înregistreze informaţiile de implementare despre obiectele remote şi demonul rmid va furniza
instanţa obiectului atunci când va fi nevoie de ea.
58
Elemente de securitate
RMI pune la dispoziţie pentru securizarea canalelor de comunicatei între client şi server
un mecanism de izolare a implementărilor aduse intr-un ‘sand box’ securizat pentru a proteja
sistemul de posibile atacuri efectuate de clienţi nesiguri. Este important a se defini nevoile de
securitate pentru a stabili reguli stricte ce se vor aplica pentru toţi clienţii. S-ar putea să fie
nevoie a se securiza un canal de comunicaţie între client şi server.
RMI permite furnizarea unui constructor de socket-uri care permite crearea unor socket-
uri de diferite tipuri, inclusiv socket-uri criptate, care vor fi folosite la comunicaţie între client şi
server. Începând cu JDK 1. 2 se vor putea specifica cerinţele pentru serviciile oferite pentru
socket-urile server-ului. Aceasta nouă tehnică este utilă în applet-uri, unde majoritatea browser-
elor refuză permisiunea de setare a unui constructor de tipuri de socket-uri. Clasele aduse
remote prezintă alte probleme de securitate, securizarea acestora este realizată via un obiect de
tip SecurityManager, care va superviza orice acţiune ce implică un nivel de securitate mai
deosebit, cum ar fi deschiderea de fişiere, stabilirea conexiunilor pentru reţea etc. RMI
furnizează un tip RMISecurityManager, care e la fel de restrictiv ca acele tipuri folosite pentru
securizarea applet-urilor, astfel se previne ca implementările aduse remote să poată citi date
sau scrie date locale, sau să creeze conexiuni spre alte sisteme din spatele firewall-urilor. Se
poate de asemenea scrie şi instala un obiect propriu de securitate pentru a forţa diferite politici
de securitate specifice.
Dacă se încearcă execuţia pe Java 2 a unei aplicaţii RMI scrise pentru JDK 1. 1., se va
constata că aceasta nu rulează conform aşteptărilor. Politica implicită de securitate este prea
restrictivă şi împiedică execuţia aplicaţiilor RMI. Nu este însă necesar (şi nici recomandabil) să
se altereze politica implicită a JDK, ci este preferabil să se definească o politică particulară
aplicaţiei ce ridică probleme. Pentru a lansa în execuţie o aplicaţie Java cu altă politică decât cea
implicită se poate folosi un fişier de configurare care să definească noua politică. Apoi, maşina
virtuală trebuie instruită să folosească noua politică plasând numele fişierului respectiv în
proprietatea globală java. security. policy.
O soluţie care sa ofere o politică optimă de securitate care să permită execuţia aplicaţiei,
dar să nu ofere drepturi superflue presupune să se pornească cu politica implicită de securitate şi
să se monitorizeze execuţia aplicaţiei, observând ce încălcări ale politicii de securitate împiedică
buna funcţionare. Pentru monitorizarea verificărilor efectuate de managerul de securitate trebuie
ca proprietatea globală java. security. debug să conţină o listă ce precizează tipurile
evenimentelor monitorizate: access sau failure. Vom porni iniţial cu un fişier MYpolicy. sec care
nu conţine nici o permisiune suplimentară. Trebuie precizat că acest fişier va extinde (nu înlocui)
59
politica implicită. Procedăm apoi incremental: executăm aplicaţia, observăm permisiunile pe
care le solicită dar nu le primeşte, le adăugăm în fişierul MYpolicy. sec, după care de reia ciclul.
Un asemenea fişier ar putea avea următorul conţinut:
grant {
permission java. io. filePermission “/tmp/*”, “read”, “write”;
permission java. net. SocketPermission “somehost. somedomain. com:999”, ”connect”;
permission java. net. SocketPermission “*:1024-65535”, ”connect, request”;
permission java. net. SocketPermission “*:80”, ”connect”;
};
RMI furnizează o platformă solidă pentru aplicaţii orientate obiect distribuite. Se poate
utiliza RMI atât pentru a conecta obiecte Java între ele, cât şi obiecte Java cu obiecte
implementate în alte limbaje. Se va observa că folosind Java în mediul de programare se obţin
toate beneficiile acesteia: portabilitate largă, costuri mici de întreţinere, siguranţa şi securitatea
mediului. RMI oferă posibilitatea extinderii Java în orice parte a sistemului într-un mod
incremental, adăugând noi clienţi şi servere Java atunci când este necesar.
Capitolul IV
60
De-a lungul timpului au apărut mai multe modele de afaceri în sfera comerţului electronic cum ar
fi: magazinul electronic (e-shop), magazinul electronic universal (e-mall), licitaţiile electronice
(e-auctions), achiziţiile electronice (e-procurements), brokerajul informaţional (price
investigation agencies), portaluri pentru călătorii (travel portals).
Magazinul electronic este în esenţă un website cu catalogul produselor oferite. Firmele mici şi
medii oferă de multe ori produsele lor în această formă. Se prezintă cataloage cu descrieri,
fotografii, preţuri şi condiţii de livrare. De cele mai multe ori există posibilităţi de comandă on-
line a produselor dorite. E-shop este folosit mai ales în domeniul B2C şi oferă produse ca CD-
uri, DVD-uri, cărţi, echipamente electronice etc. Site-ul care implementează un e-shop poate fi
plasat în diferite locuri:
61
ETAPELE DE PARCURS ÎN LANSAREA UNUI MAGAZIN VIRTUAL (E-SHOP)
Comerţul electronic este una dintre soluţiile complexe, "integrate", pe care le oferă tehnologia
Internet. Asta înseamnă ca o multitudine de aplicaţii şi de furnizori de servicii Internet trebuie să
conlucreze intr-o sincronizare perfecta pentru ca un site de comerţ electronic să poată funcţiona. Se poate
rezuma lansarea unui magazin virtual în următorii paşi:
62
terminal de acest fel (POS) poate comunica prin intermediul liniilor telefonice, cam la fel ca un fax. Prin
POS se citesc şi se înregistrează informaţiile despre consumator de pe banda magnetică a unei cărţi de
credit sau de debit. După aceea, tot POS trimite informaţiile şi detaliile tranzacţiei către instituţiile
autorizate să proceseze plata (VISA, AMEX, MASTERCARD etc. sau la banca emitentă, dacă este vorba
de o carte de debit). Acestea răspund cu informaţia dacă fondurile/creditul existent sunt suficiente
efectuării plăţii şi autorizează sau declină tranzacţia. În situaţia în care comunicarea la terminalul POS nu
este posibilă din diverse motive (ex. întrerupere temporară), tranzacţia poate fi totuşi procesată manual la
un număr de telefon gratuit (1-800).
Programe Afiliate: Este un tip de program care stimulează vânzările oferind site-urilor care se înscriu
intr-o astfel de reţea (afiliate) comisioane pentru fiecare vânzare realizată prin intermediul lor. Pentru
promovarea produselor şi a serviciilor puse în vânzare, se folosesc atât link-uri grafice (casete publicitare
şi bannere) cât şi link-uri text. Sistemul de afiliere asigură urmărirea clienţilor şi contorizarea vizitelor şi a
vânzărilor fiecărui site afiliat în parte, printr-un cod unic de identitate. Pentru detalii vizitaţi
AffiliateWorld.com
Directoare cu plată: Sunt directoare specializate de obicei pe un segment de piata care percep taxe
pentru listarea site-urilor.
63
Campanie de bannere: Bannerele sunt link-uri grafice plasate de obicei la începutul paginilor care
înregistrează traficul cel mai mare dintr-un site. Taxele pentru plasarea unui banner se calculează de
obicei în raport cu numărul de impresii (expuneri) sau de clickuri.
Mai jos sunt date toate fişierele care sunt folosite pentru lucrul aplicaţiei, denumirile lor precum
şi a directoarelor în care se conţin date în formă arborescentă :
css
eshop.css
images
1.gif, 2.gif, 3.gif, 4.gif, 5.gif, 6.gif
bg_header.gif
bg_menu.gif
64
cart.gif
jsp
BookDetails.jsp
Checkout.jsp
LeftMenu.jsp
OrderConfirmation.jsp
SearchOutcome.jsp
SelectCatalog.jsp
ShoppingCart.jsp
TopMenu.jsp
META-INF
MANIFEST.MF
WEB-INF
web.xml
classes
eshop
ShopServlet.class
ShopServlet.java
beans
Book.class, Book.java
CartItem.class, CartItem.java
Category.class, Category.java
Customer.class, Customer.java
model
BookPeer.class, BookPeer.java
CategoryPeer.class, CategoryPeer.java
DataManager.class, DataManager.java
OrderDetailsPeer.class, OrderDetailsPeer.java
OrderPeer.class, OrderPeer.java
shop.sql
65
După cum se vede metoda doGet execută doPost, care la randul său execută o cerere către
index.jsp.
Pagina index.jsp, ca toate celelalte pagini ale aplicaţiei expune un header cu un linc către coşul
cu cumparături şi un meniu în partea stângă pentru controlul selectării şi căutărilor.
Pentru a reliza acest lucru au fost incluse două module separate după cum urmează:
TopMenu.jsp este foarte simplu, conţine următoarele elemente după cum urmeză:
Parametrul action setat către showCart indică metodei doPost din ShopServlet să urmeze o cere
către /jsp/ShoppingCart.jsp.
Modulul LeftMenu.jsp deasemenea este simplu, el expune un câmp de căutare şi o listă pentru
selectarea categoriilor de cărţi. Codul care relizeză cererea pentru căutare este următorul:
66
<p>Book Title/Author:</p>
<form style="border: 0px solid; padding: 0; margin: 0;">
<input type="hidden" name="action" value="search"/>
<input id="text" type="text" name="keyword" size="15"/>
<input id="submit" type="submit" value="Search"/>
</form>
Aici este codul care realizeză descrierea listei cu categoriile de cărţi:
<%
Hashtable categories = dataManager.getCategories();
Enumeration categoryIds = categories.keys();
while (categoryIds.hasMoreElements()) {
Object categoryId = categoryIds.nextElement();
out.println("<p><a href=" + base + "?action=selectCatalog&id="
+ categoryId.toString() + ">" + categories.get(categoryId) + "</a></p>"
);
}
%>
67
try {
ResultSet rs = s.executeQuery(sql);
try {
while (rs.next()) {
categories.put(rs.getString(1), rs.getString(2));
}
}
finally { rs.close(); }
}
finally {s.close(); }
}
catch (SQLException e) {
System.out.println("Could not get categories: " + e.getMessage());
}
finally {
dataManager.putConnection(connection);
}
}
return categories;
}
Liniile evidenţiate sunt cele care execută tot lucrul: în primul rând este realizată o interogare
SQL şi apoi rezultatul este salvat într-un tabel, în care cheia este ID-ul categoriei iar valoarea
este numele categoriei.
LeftMenu.jsp utilizează conţinutul tabelului pentru a genera câte un link pentru fiecare categorie,
după cum este arătat în următorul exemplu:
Parametrul action este setat către selectCatalog. Acesta este alcatuit din toate categoriile şi indică
fişierului ShopServlet să urmeze cererea către /jsp/SelectCatalog.jsp, când utilizatorul execută
click pe o anumită categorie.
68
După cum sa menţionat, când utilizatorul selectează o categorie de cărţi sau execută o căutare,
paginile prezentate sunt SelectCatalog.jsp şi SearchOutcome.jsp, respectiv. Ambele pagini expun
o listă de cărţi şi sunt asemănătoare una cu alta.
În SelectCatalog.jsp, cererea categoriei este specificată după parametrul id. Pentru a obţine un
nume de categorie, se execută DataManager şi anume metoda getCategoryName:
care încarcă înregistrarea categoriei din baza de date. În SearchOutcome.jsp, cuvântul cheie ca
parametru este stringul de căutare.
Pentru a obţine lista de cărţi, SelectCatalog.jsp execută următorul cod de script:
Pentru fiecare carte din listă, ambele pagini generează un link după cum urmează în următorul
rand:
69
public Book getBookDetails(String bookID) {
şi metoda getBookById din fişierul BookPeer, obţine înregistrarea corespunzătoare din baza de
date.
Pentru a cumpăra o carte utilizatorul face un click pe următorul link:
70
<input type="submit" value="Update"/>
</form>
</form>
Atunci când utilizatorul execută click pe unul din butoane, ShopServlet transmite cererea înapoi
către ShoppingCart.jsp.
Înainte de a prezenta conţinutul coşului de cumpărături, ShoppingCart.jsp trebuie să execute un
cod, care depinde de valoarea parametrului action.
Pentru a manipula cu addItem, ShoppingCart.jsp obţine detaliile despre carte de la data manager
prin intermediul metodei getBookDetails şi creaza un obiect nou de tip CartItem, pe care îl
adaugă în coş.
Pentru lucrul cu updateItem, ShoppingCart.jsp utilizează metoda setQuantity pentru a modifica
cantitatea itemului din coş identificat prin bookId. Pentru deleteItem, ShoppingCart.jsp pur şi
simplu sterge identificatorul coşului identificat de către bookId.
După ce a înscris conţinutul coşului de cumpărături, ShoppingCart.jsp prezintă următorul link:
Dacă parametrul action este setat la valoarea checkOut, ShopServlet execută cerere către
Checkout.jsp.
71
4.2.6 Acceptarea unei succesiuni
Checkout.jsp interoghează utilizatorul pentru a furniza date personale şi financiare. Când
utilizatorul execută click pe butonul Check Out, parametrul ascuns action este setat la
orderConfirmation, care cauzeză ca ShopServlet să execute o cerere către
OrderConfirmation.jsp.
72
CONCLUZII
73
BIBLIOGRAFIE
9. ALBOAIE L., BURAGA S., 2006, Servicii Web. Ed. Polirom, Iasi.
10. http://en.wikipedia.org
11. http://java.sun.com/
12. http://java2s.com/
13. http://preferatele.com/
14. http://apache.org/
15. http://blog.search3w.com/dynamic-to-static/hello-world/
16. http://www.afaceri-online.net;
17. http://en.wikipedia.org/wiki/Web_page
74
18. http://en.wikipedia.org/wiki/Web_application
19. http://ro.wikipedia.org/wiki/Website
20. http://ro.wikipedia.org/wiki/HyperText_Markup_Language
21. http://ro.wikipedia.org/wiki/Sistem_de_management_al_continutului
75