Sunteți pe pagina 1din 250

Tehnologii de programare în

Internet

Curs 1
- Internet şi Web -

1
1. Internet
1.1. Istoric
 La mijlocul anilor 1960, când Războiul rece era în punctul culminant,
Dod-ul (Department of Defense - Departamentul de Apărare al Statelor
Unite) a vrut o reţea de comandă şi control care să poată supravieţui
unui război nuclear.
 Tradiţionalele reţele telefonice cu comutare de circuite erau prea
vulnerabile, deoarece pierderea unei linii sau a unui comutator ar fi pus
capăt tuturor conversaţiilor care le foloseau şi ar fi partiţionat reţeaua.
 Pentru a rezolva această problemă, Dod s-a orientat către agenţia sa
de cercetare ARPA (Advanced Research Projects Agency - Agenţia de
Cercetare pentru Proiecte Avansate).
 După discuţii cu diverşi experţi, ARPA a decis că reţeaua de care avea
nevoie Dod trebuia să fie o reţea cu comutare de pachete constând
dintr-o subreţea şi calculatoare gazdă. Subreţeaua avea să fie o
subreţea datagramă, astfel că dacă unele linii de transmisie şi
calculatoare gazdă se defectau, mesajele puteau fi redirijate automat
pe căi alternative.

2
 Cercetările pentru găsirea de protocoale potrivite pentru a rula pe
ARPANET şi pe LAN-urile (Local Area Network) ce se conectau într-un
număr tot mai mare la acesta a culminat cu invenţia modelului şi
protocoalelor TCP/IP. Astfel TCP/IP a fost proiectat special pentru a
trata comunicarea prin inter-reţele.
 In timpul anilor 1980 au fost conectate la ARPANET multe alte reţele, în
special LAN-uri. Pe măsură ce creştea dimensiunea reţelei, găsirea
gazdelor devenea tot mai costisitoare. De aceea a fost creat DNS
(Domain Naming System - Sistemul Numelor de Domenii), care
organiza maşinile în domenii şi punea în corespondenţă numele
gazdelor cu adrese IP. De atunci, DNS a ajuns să fie un sistem de baze
distribuit, generalizat, folosit pentru a memora informaţii referitoare la
procedurile de atribuire a numelor.

3
 La sfârşitul anilor 1970, NSF (U.S. National Science Foundation -
Fundaţia Naţională de Ştiinţă din SUA) a remarcat impactul enorm pe
care ARPANET-ul îl avea asupra cercetării universitare, reţeaua
permiţând partajarea datelor şi colaborarea în cadrul proiectelor de
cercetare.
 Dar, pentru a se conecta la ARPANET, o universitate trebuia să aibă un
contract de cercetare cu DoD, iar multe universităţi nu aveau.

4
 De aceea, în 1984 NSF a început să proiecteze un succesor de mare
viteză al ARPANET-ului, care să fie deschis tuturor grupurilor de
cercetare din universităţi.
 Pentru a avea ceva concret cu care să înceapă, NSF a hotărât să
construiască o coloană vertebrală care să lege centrele sale de
supercalculatoare din şase oraşe: San Diego, Boulder, Champaign,
Pittsburg, Ithaca şi Princeton. Acesta a fost primul WAN (Wide Area
Network) TCP/IP.
 NSF a finanţaţ, de asemenea, un număr de 20 de reţele regionale care
se conectau la coloana vertebrală, permiţând utilizatorilor din mii de
universităţi, laboratoare de cercetare, biblioteci şi muzee să acceseze
oricare dintre supercalculatoare şi să comunice între ei.
 Reţeaua completă, care includea coloana vertebrală şi reţelele
regionale, a fost numită NSFNET.

5
 Numărul reţelelor, maşinilor şi utilizatorilor conectaţi la ARPANET a
crescut rapid după ce TCP/IP a devenit, la 1 ianuarie 1983, unicul
protocol oficial. Când au fost conectate NSFNET şi ARPANET, creşterea
a devenit exponenţială. S-au alăturat multe reţele regionale şi s-au
realizat legături cu reţele din Canada, Europa şi Pacific.
 Pe la mijlocul anilor 1980, lumea a început să vadă colecţia de reţele ca
fiind un internet, iar apoi ca fiind Internet-ul.

6
1.2. Subreţele, reţele, inter-reţele

 Deseori se produc confuzii între subreţele, reţele şi inter-reţele.


 Termenul de subreţea este mai potrivit în contextul unei reţele larg
răspândite geografic, unde se referă la colecţia de rutere (routere -
comutatoare de date, sisteme intermediare, noduri de comutare a
pachetelor) şi linii de comunicaţie aflate în proprietatea unui operator de
reţea, de exemplu, o firmă ca America Online sau CompuServe.
 Combinaţia între o subreţea şi gazdele sale formează o reţea. În cazul
unui LAN, reţeaua este formată din cablu şi gazde, deci nu există, în
acest caz, cu adevărat o subreţea.
 În lume există multe reţele, cu echipamente şi programe diverse.
Persoanele conectate la o anumită reţea doresc adesea să comunice cu
persoane racordate la alta. Această cerinţă impune conectarea unor
reţele diferite, de multe ori incompatibile, ceea ce se realizează uneori
utilizând maşini numite porţi (gateways). Acestea realizează conectarea
şi asigură translatările necesare, atât în termeni de hardware cât şi de
software.
 O colecţie de reţele interconectate este numită inter-reţea sau internet.
 O formă comună de inter-reţea este o colecţie de LAN-uri conectate
printr-un WAN.

7
1.3. Internet vs. internet

 Pentru a evita confuziile, termenul “internet” este folosit în sensul său


generic. Prin contrast, Internet-ul (a se remarca folosirea lui I mare)
reprezintă un internet mondial specific, care este utilizat pe larg pentru
a conecta universităţi, birouri guvernamentale, firme şi persoane
particulare.
 Creşterea numărului reţelelor, maşinilor şi utilizatorilor care se
interconectau a continuat exponenţial şi în 1990 Internet-ul ajunsese
să cuprindă 3000 de reţele şi 200.000 de calculatoare.În 1992 a fost
ataşată gazda cu numărul 1.000.000. În 1995 existau mai multe
coloane vertebrale, sute de reţele de nivel mediu (adică regionale), zeci
de mii de LAN-uri, milioane de gazde şi zeci de milioane de utilizatori.
S-a estimat că mărimea Internet-ului se dublează aproximativ la un an.
 Substanţa care ţine legat Internet-ul este modelul de referinţă TCP/IP
şi stiva de protocoale TCP/IP. TCP/IP face posibile serviciile universale,
putând fi comparată cu sistemul telefonic sau cu adoptarea lăţimii
standard pentru căile ferate în secolul 19. Ce înseamnă de fapt să fii pe
Internet? O maşină este pe Internet dacă foloseşte stiva de protocoale
TCP/IP, are o adresă IP şi are posibilitatea de a trimite pachete IP către
toate celelalte maşini de pe Internet.

8
1.4. Modelul de referinţă TCP/IP

 Posibilitatea de a interconecta fără probleme mai multe tipuri de reţele


a reprezentat un obiectiv major al proiectării ARPANET-ului.
 Noua arhitectură de referinţă a devenit cunoscută sub denumirea de
modelul de referinţă TCP/IP, dată după numele celor două
protocoale fundamentale utilizate.
 Dată fiind îngrijorarea Dod că o parte din gazdele sale, rutere şi porţi
de interconectare ar putea fi distruse dintr-un moment într-altul, un alt
obiectiv major a fost ca reţeaua să poată supravieţui pierderii
echipamentelor din subreţea fără a fi întrerupte conversaţiile existente.
Cu alte cuvinte DoD dorea ca, atâta timp cât funcţionau maşina sursă şi
maşina destinaţie, conexiunile să rămână intacte, chiar dacă o parte din
maşini sau din liniile de transmisie erau brusc scoase din funcţiune.
 Mai mult, era nevoie de o arhitectură flexibilă, deoarece se aveau în
vedere aplicaţii cu cerinţe divergente, mergând de la transferul de
fişiere până la transmiterea vorbirii în timp real.

9
 Toate aceste cerinţe au condus la alegerea unei reţele cu comutare de
pachete bazată pe un nivel inter-reţea fără conexiuni. Acest nivel,
numit nivelul internet este axul pe care se centrează întreaga
arhitectură. Rolul său este de a permite gazdelor să emită pachete în
orice reţea şi de a face ca pachetele să circule independent până la
destinaţie, fiind posibil ca aceasta să se găsească pe o altă reţea.
Pachetele pot chiar să sosească într-o ordine diferită faţă de cea în care
au fost trimise, caz în care, dacă se doreşte furnizarea lor ordonată,
rearanjarea cade în sarcina nivelurilor de mai sus. Nivelul internet
defineşte oficial un format de pachet şi un protocol numit IP (Internet
Protocol - protocol Internet). Sarcina nivelului Internet este să
furnizeze pachete IP către destinaţie. Problemele majore se referă la
dirijarea pachetelor şi evitarea congestiei. În consecinţă, nivelul
internet din TCP/IP funcţionează asemănător cu nivelul reţea din OSI
(International Standards Organization - Organizaţia Internaţională de
Standardizare).

10
 Nivelul situat deasupra nivelului internet din modelul TCP/IP este nivelul
transport. Acesta este proiectat astfel încât să permită conversaţii între
entităţile pereche din gazdele sursă şi, respectiv, destinaţie. În acest sens au
fost definite două protocoale capăt-la-capăt. Primul dintre ele, TCP
(Transmission Control Protocol - protocolul de control al transmisiei), este un
protocol sigur orientat pe conexiuni care permite ca un flux de octeţi trimişi de
pe o maşină să ajungă fără erori pe orice altă maşină din inter-reţea. Acest
protocol fragmentează fluxul de octeţi în mesaje discrete şi pasează fiecare
mesaj nivelului internet. La destinaţie, procesul TCP receptor reasamblează
mesajele primite în flux de ieşire. TCP tratează totodată controlul fluxului pentru
a se asigura că un emiţător rapid nu inundă un receptor lent cu mai multe
mesaje decât poate acesta să prelucreze. Al doilea protocol din nivel, UDP (User
Datagram Protocol - protocolul datagramelor utilizator), este un protocol
nesigur, fără conexiuni, destinat aplicaţiilor care doresc să utilizeze propria lor
secvenţiere şi propriul control al fluxului, şi nu pe cele asigurate de TCP.
Protocolul UDP este de asemenea mult folosit pentru interogări întrebare-
răspuns dintr-un foc, client-server, şi pentru aplicaţii în care comunicarea promtă
este mai importantă decât comunicarea cu acurateţe, aşa cum sunt aplicaţiile de
transmisie a vorbirii şi a imaginilor video.

11
 Deasupra nivelului transport se află nivelul aplicaţie. Acesta conţine
toate protocoalele de nivel mai înalt. Primele protocoale de acest gen
includeau terminalul virtual (TELNET), transferul de fişiere (FTP – File
Transfer Protocol) şi poşta electronică (SMTP – Simple Mail Transfer
Protocol). Protocolul de terminal virtual permite unui utilizator de pe o
maşină să se conecteze şi să lucreze pe o maşină aflată la distanţă.
Protocolul de transfer de fişiere pune la dispoziţie o modalitate de a
muta eficient date de pe o maşină pe alta. Poşta electronică a fost la
origine doar un tip de transfer de fişiere, dar ulterior a fost dezvoltat un
protocol specializat pentru acest serviciu. Pe parcursul anilor, la aceste
protocoale s-au adăugat DNS-ul (serviciul numelor de domenii) pentru
stabilirea corespondenţei dintre numele gazdelor şi adresele reţelelor,
NNTP – Network News Transfer Protocol, protocolul utilizat pentru a
transfera articole de ştiri, HTTP – HyperText Transfer Protocol, folosit
pentru aducerea paginilor de Web ş.a.

12
 Sub nivelul internet se află necunoscutul, nivelul gazdă-reţea.
Modelul de referinţă TCP/IP nu spune mai nimic despre ce se întâmplă
acolo, însă menţionează că gazda trebuie să se lege la reţea, pentru a
putea trimite pachete IP, folosind un anumit protocol. Acest protocol nu
este definit şi variază de la gazdă la gazdă şi de la reţea la reţea.
Cărţile şi articolele despre TCP/IP rareori discută despre acest protocol.

13
1.5. Aplicaţii Internet

 Tradiţional, Internetul a avut patru aplicaţii principale. Facilitatea de a


compune, trimite şi primi poştă electronică a existat din primele zile
ale ARPANET-ului. Mulţi oameni primesc zeci de mesaje pe zi şi
consideră poşta electronică un important mijloc de a interacţiona cu
lumea exterioară, alături de telefon şi poşta obişnuită. Programele de
poştă electronică sunt astăzi disponibile practic pe orice tip de
calculator. Grupurile de ştiri erau forumuri specializate în care
utilizatorii cu un anumit interes puteau să facă schimb de mesaje.
Existau mii de grupuri de ştiri, pe subiecte tehnice sau non-tehnice
incluzând calculatoarele, ştiinţa, divertismentul şi politica. Folosind
programul Telnet, utilizatorii aflaţi oriunde pe Internet puteau să se
conecteze la distanţă, la orice maşină pe care aveau un cont.
Copierea fişierelor de pe o maşină din Internet pe alta (transferul de
fişiere) era posibilă utilizând programul FTP.

14
 Până la începutul anilor 1990 Internet-ul a fost foarte populat cu
cercetători din domeniul academic, guvernamental şi industrial. O
aplicaţie nouă, WWW (World Wide Web), a schimbat întreaga situaţie
şi a adus în reţea milioane de utilizatori care nu fac parte din mediul
academic. Această aplicaţie inventată de fizicianul Tim Berners Lee, nu
a modificat nici una din facilităţile existente, în schimb le-a făcut mai
uşor de folosit. Împreună cu programul de navigare Mosaic, scris la
Centrul Naţional pentru Aplicaţiile Supercalculatoarelor (NCSA –
National Centre for Supercomputing Application – University of Illinois),
WWW-ul a făcut posibil ca un site să pună la dispoziţie un număr de
pagini de informaţii conţinând text, poze, sunet, video, în fiecare
pagină existând legături către alte pagini. Printr-un clic pe o legătură,
utilizatorul este transportat la pagina indicată de legătură.

15
 De exemplu, multe firme au o pagină principală cu intrări care trimit la
alte pagini pentru informaţii asupra produselor, liste de preţuri,
reduceri, suport tehnic, comunicare cu angajaţii, informaţii despre
acţionari şi multe altele. Într-un timp foarte scurt au apărut numeroase
alte tipuri de pagini: hărţi, tabele cu cotaţii la bursă, cataloage de
bibliotecă, programe radio înregistrate şi chiar pagini care indicau spre
textele complete ale multor cărţi cărora le-au expirat drepturile de
autor (Mark Twain, Charles Dickens, etc.). De asemenea, mulţi oameni
au pagini personale (home pages). În primul an de la lansarea Mosaic-
ului, numărul de servere WWW a crescut de la 100 la 7000 prefigurând
o creştere continuă de-a lungul timpului, creştere ce reprezintă forţa
care va conduce tehnologia şi utilizarea Internet-ului în viitor.

16
2. WWW – World Wide Web

 Web-ul este un context arhitectural pentru accesul la documente,


răspândite pe mii de maşini în Internet, între care există legături. În
decursul timpului a evoluat de la o aplicaţie pentru transmiterea de
date utile pentru fizica energiilor înalte la o aplicaţie despre care
milioane de oameni cred că este Internetul. Popularitatea sa enormă se
datorează faptului că are o interfaţă grafică plină de culoare, uşor de
utilizat de către începători şi în acelaşi timp oferă o cantitate imensă de
informaţie.

17
2.1. Istoric

 Web-ul (cunoscut şi ca WWW) a apărut în 1989 la CERN, Centrul


European de Cercetări Nucleare. CERN avea câteva acceleratoare
utilizate de echipe mari de cercetători din ţările europene pentru
cercetări în fizica particulelor. Aceste echipe numărau membrii din
peste zece ţări. Majoritatea experienţelor erau foarte complicate şi
necesitau ani de pregătire şi construire de echipamente. Web-ul a
apărut din necesitatea de a permite cercetătorilor răspândiţi în lume să
colaboreze utilizând colecţii de rapoarte, planuri, desene, fotografii şi
alte tipuri de documente aflate într-o continuă modificare. Propunerea
iniţială pentru crearea unei colecţii de documente având legături între
ele (web) a fost făcută de fizicianul Tim Berners- Lee, fizician la CERN,
în martie 1989. Primul prototip (bazat pe text) era operaţional 18 luni
mai târziu. În decembrie 1991, s-a făcut o demonstraţie publică la
conferinţa Hypertex’91 în San Antonio, Texas. Acţiunea a continuat în
anul următor, fiind încununată cu realizarea primei interfeţe grafice,
Mosaic, în februarie 1993.

18
 Mosaic a fost atât de popular încât un an mai târziu, autorul său, Marc
Andreessen, a părăsit NCSA (Centrul naţional pentru aplicaţiile
supercalculatoarelor), unde Mosaic-ul a fost dezvoltat, pentru a forma o
nouă companie, Netscape Communications Corp., care se ocupa cu
dezvoltarea de software pentru Web. Când Nescape a devenit o
companie publică în 1995, investitorii, care probabil au crezut că este
vorba de un fenomen de tip Microsoft, au plătit 1.5 miliarde de dolari
pentru acţiunile companiei. Acest record a fost cu atât mai neaşteptat
cu cât compania avea un singur produs, opera în deficit şi anunţase
probabilii investitori că nu se aşteaptă la beneficii în viitorul apropiat.

19
 În 1994, CERN şi M.I.T. (Massachusetts Institute of Technology) au
semnat o înţelegere pentru a forma Consorţiul World Wide Web, o
organizaţie care are ca obiectiv dezvoltarea Web-ului, standardizarea
protocoalelor şi încurajarea interoperabilităţii între situri. Berners-Lee a
devenit director. De atunci, sute de universităţi şi companii au intrat în
consorţiu. M.I.T. a coordonat partea americană a consorţiului în timp
ce centrul de cercetări francez, INRIA (Institut National de Recherche
en Informatique et en Automatique), a coordonat partea europeană.
Deşi există foarte multe cărţi despre Web, cel mai bun loc pentru
găsirea unor informaţii la zi despre el este, în mod natural, chiar Web-
ul. Pagina consorţiului are adresa http://www.w3.org. Aici, cei
interesaţi pot găsi legături la pagini care acoperă toate documentele şi
activităţile consorţiului.

20
2.2 Aspecte generale privind
clientul
 Deoarece Web-ul este un sistem client-server sunt prezentate în
continuare atât aspecte referitoare la client (adică utilizator) cât şi cele
referitoare la server.
 Din punctul de vedere al utilizatorului, Web-ul constă dintr-o colecţie
imensă de documente răspândite în toată lumea, numite pagini.
Fiecare pagină poate să conţină legături (indicatori) la alte pagini aflate
oriunde în lume. Utilizatorii pot să aleagă o legătură (de exemplu prin
executia unui clic) care îi va aduce la pagina indicată de legătură. Acest
proces se poate repeta la nesfârşit, fiind posibil să se traverseze în
acest mod sute de pagini legate între ele. Despre paginile care indică
spre alte pagini se spune că utilizează hipertext.
 Paginile pot fi vizualizate cu ajutorul unui program de navigare
(browser): Mosaic, Netscape, Internet Explorer, Mozilla, etc.
Programul de navigare aduce pagina cerută, interpretează textul şi
comenzile de formatare conţinute în text şi afişează pagina, formatată
corespunzător, pe ecran. Şirurile de caractere care reprezintă legături
la alte pagini se numesc hiperlegături, sunt afişate în mod diferit,
fiind subliniate şi/sau colorate distinct.

21
 Pentru a selecta o legătură, utilizatorul va plasa cursorul pe zona
respectivă (utilizând mouse-ul sau tastele săgeţi de pe tastatură) şi
comandă selecţia (cu ajutorul mouse-ului sau apăsând tasta Enter).
Deşi există programe de navigare fără interfaţă grafică, ca de exemplu
Lynx, ele nu sunt atât de utilizate ca programele de navigare grafice.
Pagina adusă poate conţine legături care prin selectare aduc alte pagini
şi aşa mai departe. Noua pagină se poate afla pe aceeaşi maşină ca şi
prima sau pe o maşină aflată undeva pe glob la polul opus. Utilizatorul
nu va şti. Aducerea paginilor este realizată de către programul de
navigare, fără nici un ajutor din partea utilizatorului. Dacă utilizatorul se
va întoarce la prima pagină, legăturile care au fost deja utilizate vor fi
afişate altfel decât celelalte (de exemplu, utilizând o altă culoare)
pentru a fi deosebite de cele care nu au fost încă selectate. Majoritatea
programelor de navigare au numeroase butoane şi opţiuni care ajută
navigarea prin Web. Multe au un buton pentru revenirea la pagina
anterioară, un buton pentru a merge la pagina următoare (acest buton
este operaţional numai după ce utilizatorul s-a întors înapoi dintr-o
pagină).

22
 Majoritatea programelor de navigare au un buton sau un meniu pentru
înregistrarea unei adrese de pagină (bookmark) şi un altul care permite
afişarea unor adrese înregistrate, făcând astfel posibilă revenirea la o
pagină cu ajutorul unei simple selecţii realizate cu mouse-ul. Paginile
pot să fie salvate pe disc sau tipărite. Sunt disponibile numeroase
opţiuni pentru controlul ecranului şi configurarea programului de
navigare conform dorinţelor utilizatorului.
 În afară de text obişnuit (nesubliniat) şi hipertext (subliniat), paginile
de Web pot să conţină iconiţe, desene, hărţi, fotografii. Fiecare dintre
acestea poate să fie, în mod opţional, legată la altă pagină. Dacă se
selectează unul dintre aceste elemente, programul de navigare va
aduce pagina respectivă şi o va afişa, aşa cum se întâmplă în cazul
selectării unui text. Pentru imaginile care sunt fotografii sau hărţi,
alegerea paginii care se aduce poate să depindă de regiunea din
imagine pe care se face selecţia.

23
 Nu toate paginile sunt afişabile. De exemplu, pot să existe pagini care
conţin înregistrări audio, clip-uri video sau ambele. Dacă paginile de
hipertext sunt combinate cu alte tipuri de pagini, rezultatul se numeşte
hipermedia. Numai o parte din programele de navigare pot să afişeze
orice tip de hipermedia. Cele care nu pot, verifică un fişier de
configurare ca să afle cum să trateze datele primite. În mod normal,
fişierul de configurare conţine numele unui program de vizualizare
extern sau al unui program auxiliar pentru aplicaţie, care va fi utilizat
pentru a interpreta conţinutul paginii aduse. Dacă un astfel de program
nu este specificat, atunci programul de navigare poate să ceară
utilizatorului să specifice un program de vizualizare. Dacă nu există un
astfel de program, utilizatorul poate să indice programului de navigare
să salveze pagina adusă într-un fişier pe disc sau să o abandoneze.
Utilizarea unui generator de voce ca program auxiliar permite chiar şi
utilizatorilor orbi să acceseze Web-ul. Alte programe auxiliare conţin
interpretoare pentru limbaje speciale pentru Web, permiţând aducerea
şi execuţia programelor din paginile Web. Acest mecanism permite
extinderea funcţionalităţii Web-ului.

24
 Multe pagini de Web conţin imagini de dimensiuni mari, pentru care
încărcarea durează mult. Unele programe de navigare tratează
problema încărcării lente încărcând şi afişând mai întâi textul şi apoi
imaginile. Această strategie oferă utilizatorului ceva de citit cât timp
aşteaptă, şi în acelaşi timp îi permite să renunţe la pagina respectivă
dacă nu este destul de interesantă ca să merite aşteptarea. O altă
strategie este de a oferi opţiunea de a dezactiva aducerea şi afişarea
automată de imagini. Unii creatori de pagini de Web încearcă să trateze
altfel problema utilizatorilor plictisiţi, afişând imaginile într-un mod
special. Mai întâi apare rapid o imagine într-o rezoluţie foarte scăzută.
Apoi se îmbunătăţeşte calitatea imaginii. Pentru utilizator apariţia
imaginii după câteva secunde, chiar şi la o rezoluţie scăzută, este de
multe ori de preferat faţă de situaţia în care acesta urmăreşte modul în
care se desenează imaginea linie cu linie.

25
 Unele pagini de Web conţin formulare care cer utilizatorului să
introducă informaţii. Aplicaţiile tipice pentru formulare sunt căutări într-
o bază de date pentru o intrare specificată de utilizator, comandarea
unui produs sau participarea la un sondaj de opinie. Alte pagini de Web
conţin hărţi care permit utilizatorilor să selecteze porţiuni pentru a
obţine informaţii despre anumite zone geografice sau pentru a realiza o
mărire sau o micşorare a imaginii afişate.
 Unele programe de navigare utilizează discul local pentru a memora
temporar paginile pe care le aduc. Înainte ca o pagină să fie adusă, se
verifică dacă ea nu se găseşte deja în memoria temporară. Dacă da, se
verifică numai dacă pagina este încă actuală. În caz afirmativ, nu mai
este necesară readucerea paginii. Ca rezultat, selecţia butonului back
pentru a vedea pagina precedentă are un efect foarte rapid.

26
 Pentru a permite utilizarea unui program de navigare în Internet, un
calculator trebuie să fie legat la Internet sau cel puţin să aibă o
conexiune la un ruter sau la un alt calculator care este legat direct în
Internet. Această cerinţă apare deoarece aducerea unei pagini de către
un program de navigare presupune stabilirea unei conexiuni TCP cu
calculatorul pe care este memorată pagina, şi apoi transmiterea unui
mesaj, utilizând conexiunea, pentru a cere pagina.

27
2.3. Aspecte generale privind
serverul
 Pentru orice server de Web un proces ascultă portul 80 TCP pentru
conexiuni iniţiate de către clienţi (în mod normal programe de
navigare). După ce s-a stabilit o legătură, clientul trimite o cerere şi
serverul trimite un răspuns. Apoi conexiunea este eliberată.
Protocolul care descrie cererile şi răspunsurile permise este HTTP -
HyperText Transfer Protocol.
 Exemplul următor arată modul în care funcţionează serverele de
Web: presupunem că un utilizator tocmai a selectat un text sau o
iconiţă care indică spre pagina al cărei nume (URL – Uniform
Resource Locator – adresa uniformă pentru localizarea resurselor)
este http://www.w3.org/Protocols/Specs.html. URL - ul are trei părţi:
numele protocolului (http), numele calculatorului pe care se gaseşte
pagina (www.w3.org) şi numele fişierului care conţine pagina
(Protocols/Specs.html). Etapele care se parcurg între momentul în
care se face selecţia şi afişarea paginii aduse sunt următoarele:

28
 programul de navigare determină URL (pe baza selecţiei);
 programul de navigare întreabă DNS care este adresa IP pentru
www.w3.org;
 DNS răspunde cu 128.30.52.100;
 programul de navigare realizează conexiunea TCP cu portul 80 al
128.30.52.100;
 trimite o comandă GET Protocols/Specs.html.
 serverul www.w3.org transmite fişierul Specs.html;
 conexiunea TCP este eliberată.
 programul de navigare afişează textul din Specs.html;
 programul de navigare aduce şi afişează imaginile din Specs.html.
 Multe programe de navigare afişează care este etapa care se execută
într-o fereastră de stare, în partea de jos a paginii. În acest mod, dacă
performanţele sunt slabe, utilizatorul poate să ştie dacă este vorba de
faptul că DNS nu răspunde, că serverul nu răspunde, sau pur şi simplu
de congestia reţelei în timpul transmisiei paginii.

29
 Protocolul de transfer standard utilizat de Web este HTTP - HyperText
Transfer Protocol. Fiecare interacţiune constă dintr-o cerere ASCII
(deoarece HTTP este un protocol ASCII ca şi SMTP), urmată de un
răspuns MIME (Multipurpose Internet Mail Extension – extensii de
poştă cu scop multiplu, generat de problemele care includeau
transmisia şi recepţia de mesaje în limbi cu accente – de ex. germană
şi franceză, mesaje în alfabete ne-latine – de ex. ebraică şi rusă,
mesaje în limbi fără alfabet – de ex. chineză şi japoneză, mesaje care
nu conţin text deloc – de ex. audio şi video; MIME defineşte cinci noi
antete de mesaje) conform RFC 822 (RFC – Request for Comments –
cereri pentru comentarii, sunt rapoarte tehnice, pot fi citite on-line şi
sunt numerotate în ordinea cronologică a creării lor). Cu toate că
utilizarea TCP pentru conexiuni de transport este foarte obişnuită, el nu
este impus oficial de către standard.

30
 HTTP este în continuă evoluţie. Câteva versiuni sunt în utilizare şi altele
noi sunt în curs de implementare. În continuare sunt prezentate pe
scurt noţiunile de bază.
 Protocolul HTTP constă din două tipuri de elemente: mulţimea cererilor
de la programele de navigare către servere şi o mulţime de răspunsuri
care merg în sens invers. HTTP suportă două tipuri de cereri: simple şi
complete. O cerere simplă este doar o linie GET în care se indică
pagina dorită, fără specificarea versiunii de protocol. Răspunsul este
format numai din pagină, fără antete, fără MIME, fără nici o codificare.
 Un exemplu de utilizare a programului Telnet pentru a obţine o
conexiune TCP pe portul 80 al serverului www.w3.org:
se scrie: telnet www.w3.org 80
se afişează: Trying 128.30.52.54….
Connected to www.w3.org
după care se scrie: GET Protocols/Specs.html
 Pagina va fi transmisă fără nici o indicaţie referitoare la conţinut. Acest
mecanism este necesar pentru compatibilitatea cu versiuni mai vechi.

31
 Cererile complete sunt indicate de prezenţa versiunii de protocol în linia
GET. Cererile pot să fie formate din mai multe linii, urmate de o linie
albă, care indică sfârşitul cererii. Prima linie a unei cereri complete
conţine comanda (GET este una dintre posibilităţi), pagina dorită şi
protocolul/versiunea:
se scrie: telnet www.w3.org 80
se afişează: Trying 128.30.52.54….
Connected to www.w3.org
se scrie: GET Protocols/Specs.html HTTP/1.0
se scrie:
 Serverul răspunde cu o linie de stare care descrie ce protocol va utiliza
(acelaşi cu al clientului) şi codul 200, care arată că operaţia decurge
corect. Pe linia următoare se transmite un mesaj conform RFC 822
MIME. Urmează o linie goală şi corpul mesajului.

32
 Deşi HTTP a fost proiectat pentru utilizarea pentru Web, el este “mult
mai general” decât este necesar, având o deschidere pentru viitoare
aplicaţii obiect-orientate. Din acest motiv, primul cuvânt dintr-o cerere
completă este numele metodei care se va executa asupra paginii Web
(sau a unui obiect în general). Metodele sunt:
 GET - o cerere de citire a unei pagini de Web;
 HEAD - o cerere de citire a antet-ului unei pagini de Web;
 PUT - o cerere de memorare a unei pagini de Web;
 POST - adăugarea la o resursă cu nume (de exemplu o pagină de
Web);
 DELETE - ştergerea unei pagini de Web;
 LINK - conectarea a două resurse existente;
 UNLINK - întreruperea unei conexiuni dintre două resurse.
 Pentru numele comenzilor este semnificativă utilizarea literelor mari, de
exemplu GET este un nume corect în timp ce get nu.

33
 Metoda GET cere serverului să aducă pagina (prin asta înţelegem
obiect în general), codificată în mod corespunzător în MIME. Dacă
cererea GET este urmată de un antet If-Modified-Since, serverul
transmite datele numai dacă ele au fost modificate de când s-a făcut
aducerea lor. Utilizând acest mecanism, un program de navigare care
trebuie să afişeze o pagină memorată poate să ceară condiţionat
aducerea, indicând timpul de modificare asociat paginii. Dacă pagina
memorată este încă validă, serverul răspunde indicând numai faptul că
pagina este încă validă, eliminând astfel consumul de timp presupus de
readucere a paginii.
 Metoda HEAD cere numai antetul mesajului, fără să ceară şi pagina
propriu-zisă. Această metodă poate să fie utilizată pentru a afla când s-
a făcut ultima modificare, pentru a culege informaţii pentru indexare,
sau numai pentru a verifica corectitudinea unui URL. Nu există comenzi
HEAD condiţionate.

34
 Metoda PUT este inversa metodei GET: în loc să se citească o pagină,
scrie pagina. Această metodă permite să se construiască o colecţie de
pagini de Web pe un server la distanţă. Corpul cererii conţine pagina.
Pagina poate să fie codificată utilizând MIME, caz în care liniile care
formează comanda PUT pot să includă Content-Type şi antete de
autentificare, pentru a demonstra că într-adevăr cel care face cererea
are dreptul să o facă.
 Metoda POST este similară cu metoda PUT. Şi ea conţine un URL, dar
în loc să înlocuiască date existente, noile date se vor adăuga într-un
mod general. De exemplu, se poate transmite un mesaj la un grup de
ştiri sau adăuga un fişier la un sistem de informare în reţea. În acest
mod se doreşte ca Web-ul să preia şi funcţionalitatea sistemului de ştiri
USENET.

35
 DELETE realizează ştergerea unei pagini. Ca şi la PUT, autentificarea şi
drepturile de acces joacă aici un rol important. Nu există nici o garanţie
că operaţia reuşeşte, deoarece chiar dacă serverul doreşte să execute
ştergerea, fişierul poate să aibă atribute care să interzică serverului
HTTP să îl modifice sau să îl şteargă.
 Metodele LINK şi UNLINK permit conectarea pentru stabilirea unor
conexiuni între pagini şi alte resurse. Fiecare cerere primeşte un
răspuns constând din linia de stare şi informaţii suplimentare (de
exemplu o parte sau toată pagina Web). Linia de stare poate să conţină
codul 200 (operaţie terminată corect), sau un cod de eroare, de
exemplu 304 (nemodificat), 400 (cerere eronată) sau 403 (interzis).

Standardele HTTP descriu în detaliu antetele şi corpurile mesajelor.

36
 O pagină Web poate să conţină referinţe la alte pagini. Pentru a avea o
pagină care să indice spre altă pagină este necesar un mecanism care
să permită numirea şi regăsirea paginilor. În particular, sunt trei
întrebări la care trebuie să se răspundă înainte de a se putea afişa o
pagină:
 cum se numeşte pagina?
 cum este localizată pagina?
 cum se face accesul la pagină?
 Soluţia aleasă care identifică paginile într-un mod care rezolvă toate
cele trei probleme este URL(Uniform Resource Locators ). Fiecare
pagină are un URL (o adresă uniformă pentru localizarea resurselor)
care funcţionează ca nume al paginii general valabil. Un URL are trei
componente: protocolul, numele DNS al maşinii pe care este memorat
fişierul şi un nume local, care indică în mod unic pagina (de obicei,
numele fişierului care conţine pagina).

37
 Astfel se explică funcţionarea hipertextului. Pentru a face o porţiune de
text selectabilă, cel care scrie pagina trebuie să furnizeze două
elemente: textul prin care se face selecţia şi URL-ul paginii care trebuie
adusă, dacă textul este selectat. Când se face selecţia, programul de
navigare caută numele serverului utilizând DNS-ul. Pe baza adresei IP a
serverului, programul de navigare stabileşte o conexiune TCP spre
server. Utilizând această conexiune, se transmite numele fişierului
utilizând protocolul specificat.
 URL-urile au fost proiectate nu numai pentru a permite utilizatorilor să
navigheze prin Web, dar şi pentru a utiliza FTP, news, Gopher (metodă
de regăsire a informaţiei, similară conceptual cu cea utilizată de Web,
dar acceptând numai text şi imagini), e-mail şi telnet, ceea ce face
inutile interfeţele specializate pentru aceste protocoale (ftp, news,
gopher, mailto, telnet) integrând astfel într-un singur program,
navigatorul în Web, aproape toate tipurile de acces în Internet.

38
 În ciuda tuturor acestor proprietăţi, creşterea Web-ului a scos în
evidenţă şi o slăbiciune a metodei utilizării URL-urilor. Pentru o pagină
care este foarte des referită, ar fi de preferat să existe mai multe copii
pe servere diferite, pentru a reduce traficul în reţea. Problema este că
URL-urile nu oferă nici o posibilitate de indicare a unei pagini fără să se
specifice unde este localizată pagina respectivă. Nu există nici o
metodă pentru a spune ceva de genul: „Vreau pagina x, dar nu mă
interesează de unde o aduci”. Pentru a rezolva această problemă şi a
permite multiplicarea paginilor s-a creat un sistem de URI (Universal
Resource Identifiers – identificatori universali de resurse).

39
Tehnologii de programare în
Internet

Curs 2
- HTML -

40
 Limbajul HTML este o aplicaţie a standardului ISO 8879, SGML
(Standard Generalized Markup Language – limbajul standard
generalizat de marcare), specializat pentru hipertext şi adaptat la Web.
 HTML este un limbaj de marcare, un limbaj care descrie cum trebuie să
fie formatate textele.
 Termenul de „marcare” provine din timpurile vechi, când editorii făceau
marcaje pe documente pentru a indica tipografului ce font-uri să
folosească .
 Limbajele de marcare conţin comenzi explicite pentru formatare. De
exemplu, în HTML, <B> înseamnă început de mod aldin şi </B>
înseamnă terminarea utilizării modului aldin.
 Avantajul utilizării unui limbaj de marcare faţă de unul în care nu se
utilizează marcarea explicită constă din faptul că este simplu de scris
un program de navigare care să interpreteze comenzile de marcare.

41
 Documentele scrise într-un limbaj de marcare pot să fie comparate cu
cele obţinute utilizând procesoare de text de tip WYSIWYG (What You
See Is What You Get – ce vezi este ceea ce obţii), cum sunt MS-Word
sau Word-Perfect.
 Acest tip de sisteme pot să memoreze fişierele utilizând marcaje
ascunse pentru ca formatarea să se poată reface ulterior.
 Prin standardizarea şi includerea comenzilor de marcaj în fiecare fişier
HTML, devine posibil ca orice program de navigare să poată să citească
şi să formateze orice pagină Web.
 Posibilitatea formatării paginii recepţionate este foarte importantă,
deoarece o pagină poate să fie construită pe un ecran cu 1024 x 768
pixeli utilizând culori codificate cu 24 de biţi, dar s-ar putea să fie
necesară afişarea într-o mică fereastră de pe un ecran cu 640 x 480
pixeli şi utilizând culori codificate pe 8 biţi.
 Procesoarele de text de tip WYSIWYG comerciale nu pot să fie utilizate
pentru Web, deoarece limbajul lor intern de marcare, dacă există, nu
este standardizat între furnizori, calculatoare şi sisteme de operare.
 De asemenea ele nu pot să realizeze reformatarea pentru diferite
dimensiuni de ferestre sau rezoluţii.
 Pe de altă parte, o serie de procesoare de text permit salvarea
documentelor în format HTML în loc de formatul propriu (de exemplu,
MS Word).

42
 Ca şi HTTP, HTML este într-o evoluţie continuă.
 Când programul Mosaic era singurul program de navigare, limbajul
utilizat de el, HTML 1.0 , reprezenta standardul de facto.
 Când au apărut programe de navigare noi, a fost necesar un standard
oficial Internet şi aşa au apărut HTML 2.0, HTML 3.0, HTML 4.0,
versiunile evoluând odată cu eforturile de cercetare de a adăuga noi
facilităţi versiunilor anterioare, incluzând tabele, instrumente, formule
matematice, forme avansate de descriere a stilului (pentru descrierea
organizării paginilor şi definirea semnificaţiilor simbolurilor) etc.
 HTML 5
 DHTML –Dynamic HTML – animaţia paginilor Web;
 XHTML – extensie a HTML pentru obţinerea compatibilităţii cu XML –
Extensible Markup Language;
 XHTML+TIME –XHTML Timed Interactive Multimedia Extension –
extensie a limbajului XHTML care oferă documentelor Web suport
pentru temporizare şi sincronizare multimedia.

43
 Standardizarea oficială a limbajului HTML este făcută de Consorţiul
WWW, dar diferiţi furnizori de programe de navigare au adăugat o
serie de extinderi proprii.
 Aceşti furnizori speră ca cei care construiesc pagini de Web să utilizeze
aceste extensii, astfel încât cei care vor să citească aceste pagini să
aibă nevoie de programe de navigare care ştiu să interpreteze
extensiile respective.
 Astfel de abordări îngreunează sarcina standardizării limbajului HTML.

44
2.1 Caracteristici de bază

 O pagină Web conţine o zonă de cap şi o zonă de corp, cuprinse între


marcajele (tag-uri) <HTML> şi </HTML>, dar majoritatea
programelor de navigare ignoră absenţa acestor marcaje.
 Capul este cuprins între marcajele <HEAD> şi </HEAD>, iar corpul
între marcajele <BODY> şi </BODY>.
 Comenzile cuprinse între aceste marcaje se numesc directive.
 Majoritatea marcajelor HTML au acest format <....> pentru a indica
începutul a „ceva” şi </.....> pentru a marca sfârşitul.
 Majoritatea programelor de navigare au o opţiune View Source
(afişarea sursei). Selectarea acestei opţiuni afişează pagina curentă în
format HTML în loc de forma interpretată.
 Marcajele pot să fie scrise cu litere mici sau mari. Adica <HEAD > şi
<head > înseamnă acelaşi lucru, dar prima formă este de preferat
pentru cititorii umani.

45
 Cum este dispus textul în documentul HTML este nesemnificativ.
 Programele de navigare ignoră spaţiile şi trecerile la rând nou,
deoarece textul trebuie să fie formatat pentru a corespunde zonei de
afişare curente.
 Corespunzător, se pot utiliza spaţii pentru a face documentele HTML
mai uşor de citit, ceea ce ar fi necesar pentru majoritatea
documentelor.
 Liniile albe nu pot să fie utilizate pentru separarea paragrafelor,
deoarece sunt pur şi simplu ignorate. Este necesară utilizarea unor
marcaje explicite.
 Unele marcaje au parametri (care au nume), de exemplu <IMG
SRC=sursa_imaginii>. Pentru fiecare marcaj, standardul HTML
oferă o listă a parametrilor care pot să fie utilizaţi, dacă este cazul şi
care este semnificaţia lor. Deoarece parametrii au nume, ordinea în
care se dau valorile parametrilor nu este semnificativă.

46
 Din punct de vedere tehnic, documentele HTML sunt scrise utilizând
setul de caractere ISO 8859-1 Latin-1, dar pentru utilizatorii ale căror
tastaturi suportă numai codul ASCII, se pot utiliza secvenţe de
caractere pentru reprezentarea caracterelor speciale cum ar fi è. Lista
caracterelor speciale este precizată în standard. Toate încep cu
caracterul „&” şi se termină cu „;”. De exemplu, &egrave; produce è
iar &eacute; produce é. Deoarece <, > şi & au semnificaţii speciale,
pot să fie reprezentate numai utilizând secvenţele speciale de caractere
corespunzătoare, &lt; &gt; şi &amp; .
 Principalul element din zona de cap este titlul care este cuprins
între <TITLE> şi </TITLE>, dar aici pot să apară şi alte tipuri de
informaţii. Titlul nu este afişat pe pagină. Unele programe de navigare
îl utilizează pentru a eticheta fereastra în care se afişează pagina
respectivă.
 //Exemplul 0.

47
2.2 Marcaje HTML

 <Hn> - generează titlurile de capitole; n este o cifră între 1 şi 6.


 <H1> este titlul cel mai important,
 <H6> este cel mai puţin important.
Depinde de programul de navigare să prezinte aceste titluri în
mod diferit pe ecran. De obicei, titlurile cu număr mai mic vor fi
afişate utilizând caractere mai mari. Programul de navigare
poate să utilizeze culori diferite pentru fiecare nivel de titlu. De
obicei, pentru titlurile marcate cu <H1> se utilizează litere mari
scrise cu aldine cu cel puţin o linie liberă înainte şi după.
Corespunzător, pentru titlurile marcate cu <H2>, se utilizează
caractere mai mici cu mai puţin spaţiu lăsat înainte şi după.
 //Exemplul 1.

48
 <B> şi <I> - marcaje utilizate pentru a indica modurile aldin şi
respectiv cursiv. Dacă programul de navigare nu poate să afişeze
aceste tipuri de caractere, va utiliza un alt mod de a le reprezenta, de
exemplu utilizând diferite culori. În loc de a utiliza stiluri fizice, autorii
pot să utilizeze stiluri logice, cum sunt <DN> (definiţie), <EM>
(evidenţiere), <STRONG> (evidenţiere accentuată) şi <VAR> (variabile
de program). Stilurile logice sunt definite într-un document numit
pagină de stil. Avantajul utilizării unei pagini de stil constă în faptul că
la schimbarea unei definiţii, se vor schimba toate variabilele, înlocuind
de exemplu cursivele printr-un font cu dimensiuni constante.
 //Exemplul 2.
 //Exemplul 3.

49
 <UL> - indică începutul unei liste neordonate. Elementele individuale,
care sunt marcate în sursă cu <LI>, sunt reprezentate precedate de
buline (●). O variantă a acestui mecanism este <OL> care descrie o
listă ordonată. Când se utilizează acest marcaj, textele precedate de
<LI> sunt numerotate de către programul de navigare.
 //Exemplul 4.
 //Exemplul 5.
 <BR>, <P>, <HR> - indică o separare între diferitele părţi ale textului.
Formatul precis este descris în pagina de stil. <BR> forţează trecerea
la linie nouă. De obicei programele de navigare nu inserează o linie
liberă după <BR>. <P> reprezintă un început de paragraf, pentru care
se va insera o linie nouă şi eventual se va face o identare. <HR>
forţează trecerea la linie nouă şi desenează o linie orizontală.
 //Exemplul 6.

50
 <IMG> - arată că pe poziţia curentă din pagină se va include o
imagine. Marcajul poate să aibă o serie de parametri. Parametrul SRC
indică URL-ul (sau URI-ul) imaginii. În practică, toate programele de
navigare acceptă fişiere în format GIF sau JPEG. ALLIGN este un
parametru pentru <IMG> care controlează modul în care se aliniază
imaginea faţă de limita de jos a textului (TOP, MIDDLE, BOTTOM),
ALT, care furnizează textul afişat în locul imaginii dacă utilizatorul
dezactivează opţiunea de afişare a imaginilor.
 <A> (anchor) şi </A> -marcajul de hiper-legătură cu parametri HREF
(URL-ul), NAME (numele hiper-legăturii) şi METHODS (metodele de
acces). Textul cuprins între <A> şi </A> este afişat. Dacă este
selectat, atunci se utilizează hiper-legătura pentru a se aduce o nouă
pagină. În locul textului se poate pune şi un marcaj <IMG>, caz în
care, cu un click pe imagine, se va activa legatura.
 //Exemplul 7.

51
 <TABLE> - marcajul pentru tabele HTML. O tabelă HTML este formată
din una sau mai multe linii, fiecare fiind formată din una sau mai multe
celule. Celulele pot să conţină diferite tipuri de informaţii, inclusiv text,
figuri şi chiar tabele. Celulele pot să fie alipite, de exemplu, un titlu
poate să se întindă pe mai multe coloane. Autorii paginilor au control
asupra modului în care se face afişarea, inclusiv alinierea, stilul
bordurii, marginile celulelor, dar programul de navigare este cel care
hotărăşte de fapt cum se face afişarea.
 <CAPTION> - furnizează un titlu tabelei
 <TR> - Table Row, linie în tabelă, precedă fiecare linie
 <TH> - Table Header, titlu de coloană, marchează celulele
individuale
 <TD> - Table Data, date în tabelă.
 în tabele se pot utiliza şi alte marcaje ce includ posibilitatea de a
specifica alinieri orizontale sau verticale ale celulelor, alinierea în
cadrul celulei, margini, gruparea pe celule, unităţi şi altele.
 //Exemplul 8.

52
 <FORM> şi </FORM> - marchează un formular. Formularele conţin
casete şi butoane care permit utilizatorilor să completeze informaţii sau
să facă selecţii şi apoi să transmită informaţiile la proprietarul paginii.
În acest scop se utilizează marcajul <INPUT>. Acesta are o varietate
de parametrii care determină mărimea, tipul şi modul de afişare a
casetei utilizate. Cele mai obişnuite sunt câmpuri în care utilizatorul
poate să introducă text, casete care pot să fie selectate, hărţi active,
butoane SUBMIT. Textele care nu sunt incluse între marcaje sunt
afişate. Într-un formular poate să fie utilizat orice marcaj obişnuit (de
exemplu, marcajul <P> care indică programului de navigare să afişeze
ceea ce urmează pe o linie nouă, chiar dacă mai este loc pe linia
curentă, dând astfel creatorului paginii posibilitatea să controleze
dispunerea textului sau cum arată formularul pe ecran). Câteva
atribute pentru <INPUT>:

53
 NAME – un nume pentru variabila în care va fi memorat şirul
introdus de utilizator.
 TYPE - tipul casetei care poate fi:
 TEXT - este tipul implicit, deci nu trebuie specificat
TYPE=TEXT,
 RADIO - pentru specificarea butoanelor radio ce au
proprietatea că selecţia unuia dintre ele deselectează pe toate
celelalte care fac parte din acelaşi grup; modul de afişare
depinde de interfaţa grafică pe care o utilizează. Depinde de
programul de navigare să aleagă modul de afişare care
corespunde sistemului de ferestre utilizat (de exemplu,
Windows). Dacă există mai multe grupuri de butoane radio, ele
se diferenţiază prin câmpul NAME şi nu printr-un domeniu static
de genul <RADIOBUTTON> şi </RADIOBUTTON> .
 CHECKBOX – casete de selecţie

54
 PASSWORD – funcţionează la fel ca o casetă TEXT numai că nu
se face afişarea caracterelor introduse
 TEXTAREA – similară unei casete TEXT numai că va conţine
mai multe linii.
 SUBMIT – buton, când este selectat, informaţia introdusă de
către utilizator este transmisă la calculatorul de pe care provine
formularul. Similar altor tipuri, SUBMIT eate un cuvânt cheie pe
care îl înţelege programul de navigare. Programul de navigare
interpretează şi butonul RESET care selectat aduce formularul
la conţinutul original.
 HIDDEN – este utilizat numai ca rezultat, nu poate să fie
selectat sau modificat; de exemplu, atunci când se parcurg o
serie de pagini pentru care s-au făcut selecţii, selecţiile
anterioare pot să fie de tip HIDDEN, pentru a împiedica
modificarea lor.
 IMAGE – este utilizat pentru hărţi active (sau alte imagini
selectabile); dacă un utilizator execută clic pe o astfel de
imagine, coordonatele (x, y) ale punctului selectat (adică
poziţia curentă a indicatorului mouse-ului) sunt memorate în
variabile şi formularul este în mod automat transmis
posesorului pentru prelucrări ulterioare.

55
 VALUE – utilizat pentru a arăta care buton a fost apăsat, şirul
asociat ca valoare a butonului va fi asociat variabilei indicate de
NAME. Şirul VALUE reprezintă în cazul folosirii cu butonul
SUBMIT eticheta butonului şi se afişează. De asemenea, toate
casetele pot să aibă valori. Pentru casetele TEXT, conţinutul
câmpului VALUE este afişat odată cu formularul, dar utilizatorul
poate să îl modifice sau să îl şteargă. Casetele CHECKBOX şi
RADIO pot să fie iniţializate, utilizând însă un parametru numit
CHECKED (deoarece parametrul VALUE oferă un text dar nu
indică o selecţie).

56
 Formularele pot să fie transmise în trei moduri: utilizând butonul
SUBMIT, executând clic pe o hartă activă sau utilizând tasta ENTER
pentru un formular care conţine numai un singur câmp de TEXT. Când
se transmite un formular, trebuie să se execute o acţiune. Acţiunea
corespunzătoare este specificată în parametrii marcajului <FORM>:
 ACTION – precizează URL-ul sau URI-ul pentru a indica unde se face
transmiterea
 METHOD – specifică ce metodă se utilizează, valoarea sa determină
modul în care variabilele din formular sunt transmise înapoi la
posesorul paginii. Pentru GET, se utilizează un truc, şi anume se
adaugă la URL, separându-le prin semne de întrebare. Această
abordare poate conduce la URI-uri formate din mii de caractere. Totuşi,
pentru că este simplă, această soluţie este frecvent utilizată. Dacă se
utilizează metoda POST, corpul mesajului va conţine variabilele din
formular şi valorile lor. Pentru a separa câmpurile se utilizează
caracterul &; caracterul + reprezintă spaţiu; astfel şirul va fi transmis la
server ca o singură linie. Dacă un CHECKBOX nu este selectat el este
omis din şir. Este problema serverului să interpreteze şirul respectiv.
 //Exemplul 9.

57
 JavaScript este un limbaj de programare simplu de tip script, pentru
definirea comportamentului elementelor dintr-o pagină Web. Nu este
acelaşi lucru cu mult mai complexul limbaj de programare Java, care
oferă un mediu sofisticat şi robust pentru crearea unei multitudini de
aplicaţii. JavaScript nu este diferit de fişierele BAT de comenzi
secvenţiale, sau de scripturile Unix de tip shell. JavaScript poate
specifica, în mod obişnuit în doar câteva rânduri, răspunsurile la acţiuni
sau evenimente cum ar fi deschiderea unei pagini, deplasarea mouse-
ului într-un anumit punct sau ştergerea unui anumit câmp dintr-un
formular. Atributul LANGUAGE al marcajului <SCRIPT> defineşte
limbajul de scripting; o funcţie JavaScript se defineşte în secţiunea
HEAD a documentului; apelul unei funcţii JavaScript se face din corpul
(BODY) al documentului, dintr-un script (deci într-un marcaj )
<SCRIPT>......</SCRIPT> ). Este posibil ca un script JavaScript să fie
memorat ca un fişier separat (cu extensia .js) şi numele lui să fie dat ca
valoare a atributului SRC al marcajului <SCRIPT>.

58
 Fişierul se memorează într-un director la server, numele fişierului dat
ca valoare a atributului SRC va cuprinde şi calea (relativă faţă de
fişierul HTML sau absolută), şi fişierul de script va fi descărcat la client
o dată cu pagina HTML care îl include. Toate tipurile de butoane
admise în limbajul HTML: buton simplu, buton (casetă) de validare,
radio buton, buton de trimitere (submit), buton de resetare (reset)
generează unul sau mai multe evenimente care pot fi tratate folosind
scripturi JavaScript. De exemplu, evenimentul click se desfăşoară atunci
când utilizatorul execută clic pe un element al unui formular sau pe o
legătură şi e tratat de către handler-ul de eveniment onClick. Similar,
evenimentul submit se desfăşoară atunci când utilizatorul transmite un
formular şi e tratat de către handler-ul de eveniment onSubmit.

59
 De asemenea, elementele HTML text simplu (text) şi ariile de
text (textarea) generează patru evenimente JavaScript: change,
atunci când utilizatorul modifică valoarea unui text, zonă de text
sau element de selectare (handler de eveniment onChange),
select – atunci când utilizatorul selectează câmpul de intrare al
unui element de formular (onSelect), focus – atunci când se
intră în caseta respectivă, apăsând pe mouse-ul poziţionat în
casetă, altfel spus, atunci când utilizatorul atribuie unui element
de formular control de intrare, blur – atunci când utilizatorul
elimină controlul de intrare de pe un element al unui formular
adică când se părăseşte caseta respectivă, apăsând pe mouse-
ul poziţionat în afara casetei, select – atunci când utilizatorul
selectează câmpul de intrare al unui element de formular,
mouseover – atunci când utilizatorul deplasează indicatorul
mouse-ului deasupra unei legături sau a unei ancore. Elementul
de text password nu generează evenimente.

60
 Pentru a face posibile pagini Web puternic interactive - limbajul şi
interpretorul Java.
 Java a apărut atunci când câţiva programatori de la Sun Microsystems
au încercat să dezvolte un limbaj nou de programare destinat aparaturii
electronice. Ulterior a fost reorientat spre WWW. Deşi Java a utilizat
multe idei şi sintaxa de la C şi C++, el este un limbaj nou, orientat pe
obiecte, incompatibil cu ambele.

61
 Principala idee de a utiliza Java pentru pagini Web interactive este că o
pagină Web poate să indice spre un program scris în Java, numit
applet. Dacă este întâlnit de un program de navigare, applet-ul este
adus pe maşina client şi se face execuţia sa într-o manieră sigură.
Trebuie să fie imposibil pentru applet să scrie şi să citească fişiere la
care nu are drept de acces. Trebuie să fie imposibil pentru applet să
introducă viruşi sau să producă alte stricăciuni. Din aceste motive, dar
şi pentru a realiza portabilitatea pe diferite calculatoare, applet-urile
sunt compilate după ce sunt scrise şi depanate, producându-se un cod
intermediar. Paginile web vor indica către astfel de programe într-o
manieră similară în care se indică paginile. Când este adus un applet, el
este executat interactiv într-un mediu sigur. Un motiv pentru care s-a
dorit includerea applet-urilor Java în pagini de Web a fost acela că Java
permite ca paginile web să fie interactive. De exemplu, o pagină care
conţine o tablă pentru şah poate să joace un joc cu utilizatorul.
Programul de joc (scris în Java) este adus împreună cu pagina de Web.

62
 Un alt exemplu, formulare complicate (de exemplu, de tip formular de
calcul) pot să fie afişate, utilizatorul completând intrări şi programul
calculând alte intrări practic instantaneu. Un alt motiv pentru execuţia
unui applet pe maşina clientului este posibilitatea de a adăuga animaţie
şi sunete la paginile de Web fără a utiliza programe de vizualizare
externe. Sunete pot să fie produse atunci când se aduce o pagină, ca
muzică de fundal, sau când apar anumite evenimente (de exemplu,
când se execută clic pe o imagine reprezentând un animal, acesta
scoate un sunet caracteristic). Acelaşi lucru este valabil pentru
animaţie. Deoarece appletul se execută local, chiar dacă este
interpretat, el poate să scrie peste tot ecranul (sau numai peste o parte
a ecranului) în orice mod, cu o viteză foarte mare (comparată cu un
script de tip cgi-bin de la distanţă).

63
 Sistemul Java este format din trei părţi: un compilator Java – cod
maşină virtuală (bytecode), un program de navigare care înţelege
applet-uri, un interpretor de cod maşină virtuală. Programatorul scrie
applet-ul în Java şi îl compilează. Pentru a include produsul compilării
într-o pagină Web, se utilizează un nou marcaj <APPLET>, respectiv
</APPLET>. Când programul de navigare întâlneşte acest marcaj,
aduce applet-ul compilat specificat de atributul CODE de pe serverul de
pe care a fost adusă pagina (sau, dacă un alt atribut, CODEBASE, a
fost utilizat, de la URL-ul specificat). Programul de navigare transmite
apoi applet-ul interpretorului local de cod pentru execuţie (sau îl
interpretează dacă are un interpretor intern). Atributele WIDTH şi
HEIGHT ale marcajului <APPLET> dau dimensiunea în pixeli a
ferestrei implicite pentru applet. Într-un fel, marcajul <APPLET> este
analog cu marcajul <IMG>. În ambele cazuri, programul de navigare
“se duce” şi preia un fişier pe care îl transmite unui interpretor local
pentru a-l afişa într-o zonă limitată de pe ecran. După aceea continuă
prelucrarea paginii de Web.

64
 Astfel, un document HTML conţinut într-un fişier este o pagină Web
statică, cu conţinut care nu se modifică decât dacă se modifică fişierul
însuşi. Dacă se doreşte ca documentul de răspuns să conţină informaţii
care se modifică în timp sau în funcţie de datele trimise de client, este
necesară generarea dinamică a paginilor Web, sub formă de
documente HTML al cărui conţinut se crează programatic, înainte de a
fi trimise clientului. Pentru generarea paginilor HTML dinamice, serverul
Web transmite cererea clientului unui program executabil sau script,
care generează pagina de răspuns, iar serverul o transmite apoi
clientului.
 Generarea dinamică a paginilor HTML se realizează prin diferite
metode, dintre care cele mai cunoscute sunt: CGI (Common Gateway
Interface – interfaţă comună de conversie), PHP (Personal Hypertext
Preprocessor), componente servlet, scripturi JSP (JavaServer Pages).

65
Tehnologii de programare în
Internet

Curs 3
- Tehnologia Java -

66
3.1 Introducere

 La începutul anilor 90, firma Sun dezvoltă un program de cercetare numit


Green pentru creearea unor obiecte casnice deştepte capabile să comunice
unele cu altele.
 S-a încercat folosirea lui C++ ca limbaj de dezvoltare dar s-a ajuns la concluzia
că acesta este depăşit de cerinţele proiectului. A fost creat un nou limbaj numit
Oak.
 În paralel cu dezvoltarea limbajului, în 1993, NCSA lansează primul browser Web
grafic, Mosaic 1.0. Firma Sun care încerca fără suces să-şi vândă produsele
Green şi Oak în domeniul televiziunii interactive, se reorientează către Web.
Echipa proiectează un nou browser numit Web Runner capabil să ruleze
aplicaţiile dezvoltate în Oak. Oak îşi schimbă numele în Java.
 Firma Netscape ajută lansarea limbajului Java prin cumpărarea licenţei şi
integrarea lui în browserele Netscape.
 Mai mult decât un limbaj de programare Java se dezvoltă ca o tehnologie ce
oferă suport pentru dezvoltarea de aplicaţii distribuite independente de
platformă. Firme dezvoltatoare de software au cumpărat licenţa Java de la firma
Sun pentru dezvoltarea propriilor produse în tehnologia Java.

67
3.2 Tehnologia Java
 La baza dezvoltării unui program Java stă mediul de dezvoltare pus la
dispoziţie de firma Sun, JDK (Java Developers Kit). Acest mediu
conţine biblioteci de clase Java, aşa numitele package-uri care
formează JavaAPI (Java Application Programming Interface) şi un set
de utilitare necesare compilării, testării, execuţiei şi documentării unei
aplicaţii Java.
 JavaAPI şi JVM (Java Virtual Machine) formează platforma (mediul de
execuţie) Java, JRE (Java Runtime Environment).
 În sens generic, platforma este un mediu hardware sau software în
care se execută un program. Cele mai populare platforme (Windows,
Linux) pot fi descrise ca fiind o combinaţie între un sistem de operare şi
un sistem hardware.
 Platforma Java este o platformă exclusiv software care rulează
deasupra altor platforme bazate pe hardware. Java Virtual Machine a
fost portată pe diverse platforme bazate pe hardware.

68
 Crearea unei aplicaţii Java presupune parcurgerea următoarelor
etape:
 editarea fişierului sursă (text în limbaj Java) cu extensia .java
(folosind orice editor de text)
 fişierul sursă se transmite ca şi parametru în programul javac.exe
(Java Language Compiler)
 compilatorul Java transformă fişierul sursă în fişiere cu extensia
.class (limbaj intermediar, bytecode, şir de octeţi). Bytecode-ul
este un cod independent de platforma spre deosebire de codul
nativ (C++). Codul nativ este codul care după compilare şi link-
editare rulează pe o platformă hardware specifică. Bytecode-ul se
poate interpreta ca fiind instrucţiuni în limbaj maşină pentru JVM.
Este portabil, acelaşi bytecode poate fi rulat pe orice calculator care
are instalat JVM, fie că este vorba de o staţie Windows, Linux, etc.

69
 Pentru execuţia unei aplicaţii Java se foloseşte utilitarul java.exe (Java
Interpreter) căruia i se transmite ca parametru numele fişierului rezultat în urma
compilării (fără extensia .class). Prin lansarea în execuţie a acestui utilitar se
porneşte de fapt JVM. Poate fi folosit doar pentru execuţia aplicaţiilor Java
stand-alone.

 Exemplul 1.

/*
* Programul afiseaza textul “Hello” şi se incheie
*/
public class Hello{
public static void main (String args[]){
System.out.println(“Hello”);
}
}

70
 Pentru rularea applet-urilor se foloseşte utilitarul
appletviewer.exe. Acesta lansează în execuţie o JVM, un
browser minimal de Web care suportă spre deosebire de alte
browsere Web toate caracteristicile Java ale mediului JDK din
care provine. Programul preia ca parametru fişierul cu
extensia .html ce conţine eticheta de conectare cu clasa Java.
 Exemplul 2
// HelloWorld.java
import java.awt.*;
import java.applet.*;
public class HelloWorld extends Applet {
public void paint(Graphics g) {
g.drawString("Hello World !", 10, 10);
}
}

71
<html>
<body>
<APPLET code=HelloWorld.class
height = 250 width = 250>
</APPLET>
</body>
</html>

72
3.3 Structura JVM
 Componentele JVM sunt:
 Class Loader aduce fişierele bytecode necesare execuţiei
programului, fişiere ce se pot găsi pe orice calculator dintr-o reţea.
 Bytecode Verifier verifică fişierele bytecode pentru ca acestea să
respecte setul de reguli Java. Dacă un fişier nu se conformează
acestor reguli este respins.
 Interpreter + Java RunTime analizează şi transformă fiecare
instrucţiune Java-bytecode (cod maşină JVM) în instrucţiuni ale
maşinii reale.

73
 JVM este un nivel suplimentar deasupra platformei de lucru
(hardware + S.O.), de aceea execuţia unui program Java este mai
lentă decât a unui cod nativ (Java lent dar portabil, C++ rapid dar
neportabil). Soluţia este execuţia programului prin intermediul unui
compilator JIT (Just in Time) care transformă din primul moment
întreg programul Java în instrucţiuni procesor ceea ce duce la
mărirea vitezei de execuţie a programului.
 Garbage Colector este componenta ce se ocupă de eliberarea
zonelor de memorie alocate şi care nu mai sunt utilizate de
program. Specificaţiile JVM nu impun un algoritm de dezalocare,
lăsând la latitudinea celui ce implementează JVM stabilirea lui.
 Security Manager este componenta ce asigură respectarea unor
restricţii de securitate impuse de lucrul cu sistemele deschise.

74
3.4 Tipuri de programe Java

 Aplicaţiile de sine stătătoare (stand-alone) sunt programe


independente care rulează direct pe platforma Java.
 Applet-urile sunt programe care rulează în browsere Web care suportă
Java.
 În Java se pot realiza şi applet-aplicaţii (appletcations) care, în
funcţie de context pot fi tratate ca applet de către un browser sau
appletviewer sau ca aplicaţie grafică de către interpretorul Java.
 Servlet-urile sunt aplicaţii asemănătoare cu applet-urile prin faptul că
rulează în interiorul unei alte aplicaţii care suportă mediul Java şi
respectă regulile impuse de aceasta. Aici aplicaţia este un server de
Web.

75
3.5 Limbajul Java - caracteristici

 Structura şi gramatica unui program Java se aseamănă foarte


mult cu cea a unui program C++. De aceea pentru cei care
cunosc C++ este uşor să înveţe Java mai ales că Java este
considerat un limbaj de programare orientat pe obiecte mai
simplu decât C++.
 Descrierea făcută de firma Sun în „The Java Language: A White
Paper”: „Java: un limbaj simplu, orientat pe obiecte,
distribuit, interpretabil, robust, sigur, independent de
arhitectură, portabil, de înaltă performanţă, cu facilităţi
multithreading şi dinamic.”

76
 Simplu: Faţă de C++, Java aduce o serie de simplificări. Java nu
admite în textul sursă instrucţiuni preprocesor (linii care încep
cu #) şi nu are fişiere header (linii care încep cu #include).
Construcţiile struct şi union sunt eliminate. În Java nu există
moştenirea multiplă şi supraîncărcarea operatorilor. În Java nu
există pointeri. Toate obiectele Java sunt alocate dinamic
(folosind new), transparent faţă de programator. Programatorul
nu trebuie să se ocupe de eliberarea memoriei (nu există
delete). Mecanismul de „garbage collection” (mecanism de
colectare şi eliberare a zonelor de memorie nefolosite) rezolvă
problema dezalocării memoriei fără intervenţia programatorului.

77
 Orientat pe obiecte: spre deosebire de C++, Java este pur obiectual (în
întregime bazat pe obiecte). În Java, orice, cu excepţia tipurilor de date
primitive (byte, short, int, long, char, float, double, boolean) este
un obiect. Clasele sunt aranjate într-o structură ierarhică, având în vârf
o clasă rădăcină, Object. În Java se pot crea clase şi instanţe ale
acestora (obiecte), se pot încapsula informaţiile, se pot moşteni
atributele şi metodele de la o clasă la alta. Însă în locul moştenirii
multiple, Java oferă o facilitate, numită interface care permite
definirea unui anumit comportament pentru o clasă de obiecte, ce
poate fi altul decât cel definit de clasa de bază printr-o implementare
specifică a unei interfeţe. Într-un fişier Java nu există cod în exteriorul
unei clase. În Java nu există funcţii şi variabile globale. Rămân însă
atributele şi metodele statice definite în clase (sunt partajate de toate
instanţele unei clase). Ca extensie a conceptului de clasă Java
introduce conceptul de package. Un pachet este un set de clase care
asigură împreună un anumit gen de prelucrări. De exemplu, java.lang
oferă clasele şi metodele de bază ale limbajului. Clasa Object este
definită în acest pachet.

78
 Distribuit: Pachetul java.net oferă suport pentru dezvoltarea
aplicaţiilor Java de reţea. De exemplu, clasa URL permite aplicaţiilor
Java să acceseze obiecte aflate în Internet. Java suportă atât
conectivitate fiabilă (TCP) prin intermediul clasei Socket cât şi
conectivitate nefiabilă (UDP) prin clasele Datagram*
(DatagramChannel, DatagramPacket).

79
 Interpretabil: Compilatorul Java generează, pentru fiecare sursă
compilată, un cod echivalent care se pretează la prelucrare prin tehnica
interpretării. Ca reprezentare internă, codul generat este format dintr-
un şir de octeţi (bytecode). Limbajul interpretativ este unul universal,
nu un cod nativ al unei anumite maşini. Pentru a executa un program
Java este nevoie de un interpretor care să prelucreze octeţii generaţi
de compilator. Forma de generare a codului de octeţi este
independentă (neutră) faţă de o anumită maşină. De aceea codul poate
fi executat pe orice maşină care dispune de un interpretor Java generic
pentru un cod al unei maşini virtuale, JVM.

80
 Robust: Java a eliminat o serie de erori de programare tipice,
ceea ce face posibilă scrierea unui soft mai stabil decât al altor
limbaje. Au fost eliminate o serie de deficienţe întâlnite nu
numai la C, dar şi la C++ (moştenite la rândul lor de la C). Java
cere declararea metodelor, deci nu suportă stilul C de declarare
implicită. Cea mai semnificativă extindere este cea legată de
modelele de memorie. Deoarece Java nu suportă pointeri, se
elimină posibilitatea suprapunerii zonelor de memorie şi
alterarea datelor. Java este un limbaj puternic tipizat,ceea ce
permite efectuarea unei serii de controale încă din timpul
compilării. Java măreşte gradul de siguranţă a codului. Pe lângă
verificarea la compilare (prezentă în majoritatea limbajelor) mai
există un nivel de verificare la rulare. Accesul la tablourile Java
este verificat la rulare, eliminând astfel posibilitatea accesului
accidental sau maliţios în afara domeniului tabloului. Se
controlează automat şi necondiţionat depăşirea de indici în
timpul execuţiei. Deasemenea tablourile nu se pot parcurge prin
intermediul unor pointeri ca în C++. Pointerii lipsesc din limbajul
Java, împreună cu aritmetica pointerilor, eliminându-se astfel
una din principalele surse de erori din C++.

81
 În plus, eliberarea memoriei ocupate de obiecte şi tablouri se
face automat prin mecanismul de garbage collection evitându-
se astfel încercările de eliberare multiplă a unei zone de
memorie. În Java legarea funcţiilor se face în timpul execuţiei şi
informaţiile de compilare sunt disponibile până în momentul
rulării aplicaţiei. Acest mod de lucru face ca sistemul să poată
determina în orice moment neconcordanţe între tipul referit la
compilare şi cel referit în timpul execuţiei evitându-se astfel
posibile intruziuni răuvoitoare în sistem prin intermediul unor
referinţe falsificate. În acelaşi timp Java detectează referinţele
nule dacă acestea sunt folosite în operaţii de acces. Conversiile
între tipurile de date sunt limitate, evitându-se astfel scrierea
nepermisă a unor zone de memorie. Java are pus la punct un
mecanism de tratare a excepţiilor şi a erorilor sistem.

82
 Siguranţă : Este unul din aspectele de bază în Java mai ales pentru
faptul că permite lucrul în reţea. Prin mecanismul de applet Java
permite aducerea şi execuţia de cod aflat oriunde în Internet. Fără un
mecanism de siguranţă, nu s-ar putea evita crearea de viruşi,
implantarea de coduri ostile sau invadarea sistemului de fişiere local.
Toate mecanismele de siguranţă se bazează pe premiza că „nimic nu
poate prezenta siguranţă”. Securitatea merge mână în mână cu
robusteţea. Deoarece gestiunea memoriei nu este la dispoziţia
utilizatorului, el nu poate intra în alte zone de memorie de pe maşina
locală. Altfel spus, mediul de execuţie Java poate fi configurat pentru a
proteja reţeaua locală, fişierele şi celelalte resurse ale maşinii pe care
rulează o aplicaţie Java. Java nu este perfect sigur, este un limbaj cu
securitate ridicată. Java verifică la fiecare încărcare codul prin
mecanisme de CRC (cyclic redundancy check) şi prin verificarea
operaţiilor disponibile pentru fiecare set de obiecte. Variabilele
protejate dintr-un obiect Java nu pot fi accesate fără a avea drepturile
necesare, verificarea fiind făcută în timpul execuţiei.

83
 Independent de platformă : 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 Machine - JVM). Programele executabile Java (bytecodes)
rezultate în urma compilării surselor .java au nevoie de un interpretor
(parte componentă a JVM) specific platformei pe care se execută
(Windows, Unix). Folosirea interpretorului Java duce însă la mărirea
timpului de execuţie. Soluţia este compilarea just-in-time (JIT) care
transformă întregul program Java în program maşină înainte de
execuţia lui. Compilatoarele just-in-time lucrează ca şi interpretoarele,
converteşte bytecode-ul Java în cod executabil pe maşina reală, dar
conversia nu se face pas cu pas, la nivel de instrucţiune ci la nivel de
program, crescând considerabil viteza de execuţie a programului Java.

84
 Portabil : Neutralitatea faţă de arhitectură este numai unul dintre
aspectele portabilităţii. Un altul este acela ca limbajul să nu permită
aspecte dependente de implementare (de exemplu, reprezentarea
diferită a tipului int pe diverse implementări C). În acest scop, Java
specifică lungimea în octeţi a fiecărui tip de date ca şi o mărime
aritmetică obişnuită. Mediul Java este portabil pe noile sisteme de
operare, deoarece compilatorul Java este scris tot în Java, în timp ce
executabilul (run time system) este scris în ANSI C (standard publicat
de American National Standards Institute pentru limbajul de
programare C), cu respectarea specificaţiilor POSIX (Portable Operating
System Interface – standard specificat de IEEE pentru definirea de API
pentru software compatibil cu versiuni de sisteme de operare tip Unix,
standard care însă se aplică oricărui sistem de operare).

85
 Performanţă înaltă : Ca limbaj interpretativ, viteza unui program Java
este mai mică decât a unui cod generat (echivalent) C sau C++. În GUI
(Graphic User Interface) sau aplicaţii de reţea, procesorul central e
„absent” suficient de mult ca această diferenţă de viteză să nu fie
relevantă per ansamblu, iar portabilitatea să încline balanţa în favoarea
Java. Din alt punct de vedere, toate sistemele de operare folosesc o
parte interpretată (deci lentă), de exemplu interpretoarele de comenzi
(tip shell). Pentru situaţii critice, Java, prin compilarea just in time,
transformă codul de octeţi Java într-un cod maşină nativ la fel de bun
ca şi similarul lui C (C++).

86
 Multithreading : 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 (thread-uri). Într-o aplicaţie de reţea bazată pe GUI (de
exemplu utilizarea unui browser Web) procesorul se ocupă „simultan”
de controlul animaţiei, calcule, gestiunea memoriei, etc. Java oferă
acest tip de servicii. Astfel pachetul java.lang oferă clasa Thread care
suportă creare, oprire, execuţie, control şi sincronizare thread.
Operarea cu multithreading în C, C++ presupune ca programatorii să-şi
implementeze mecanisme proprii de blocare a unor secţiuni critice şi de
partajare a unor resurse critice. Primitivele furnizate de Java reduc
substanţial acest efort.

87
 Dinamic : Java este proiectat să se adapteze la mediul în care se află.
Java este un limbaj dinamic prin faptul că multe decizii privind evoluţia
programului se iau în momentul rulării, la run-time. Dat fiind faptul că
multe din aplicaţiile Java sunt preluate de pe Internet sub formă de
applet-uri 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ă. Spre deosebire
de C++, Java poate determina, în faza de execuţie, cărei clase aparţine
un anumit obiect. Este astfel posibilă legarea dinamică a claselor
(polimorfism dinamic). Bibliotecile de clase în Java pot fi reutilizate
foarte uşor. Problema fragilităţii superclasei este rezolvată mai bine ca
în C++. În C++ dacă o superclasă este modificată, trebuie recompilate
toate subclasele acesteia pentru că obiectele au o altă structură în
memorie. În Java această problemă este rezolvată prin legarea târzie a
variabilelor, late binding, doar la execuţie. Regăsirea variabilelor se face
prin nume şi nu printr-un deplasament fix. Dacă superclasa nu a şters o
parte dintre vechile variabile şi metode, ea va putea fi refolosită fără să
fie necesară recompilarea subclaselor acesteia. Se elimină astfel
necesitatea actualizării aplicaţiilor, generată de apariţia unei noi
versiuni de bibliotecă aşa cum se întâmplă, de exemplu, cu toate
celelalte ierarhii C++.

88
 O altă caracteristică foarte importantă a limbajului Java este
interconexiunea cu browsere WWW. Acesta este şi unul din avantajele
care a făcut limbajul Java atât de popular. Multe din firmele care
dezvoltă browsere WWW au implementat maşina virtuală Java în
interiorul acestor browsere. Un browser compatibil Java permite ca o
categorie specială de aplicaţii, numite applet-uri să fie transferate de la
server-ul WWW pentru a fi „executate la client”, adică pe maşina unde
se execută browser-ul WWW. Conexiunea browser-ului cu applet-urile
se face prin intermediul etichetelor HTML, HTML (HyperText Markup
Language) fiind limbajul de „scriere” a paginilor Web.

89
Tehnologii de programare în
Internet

Curs 4
- Limbajul Java -

90
4.1 Tipuri de date în Java

Tipul de date primitive reprezintă acele date care sunt incluse


implicit în limbajul Java. Specificarea unui astfel de tip de dată
se face prin unul din următoarele cuvinte cheie:

 byte întreg cu semn pe 8 biţi cu val. min -128 şi val. max. 127
 short întreg cu semn pe 16 biţi cu val. min -32768 şi val. max.
32767
 int întreg cu semn pe 32 biţi cu val. min. -2147483648 şi val.
max. 2147483647
 long întreg cu semn pe 64 biţi cu val. min. -263 şi val. max.
263 -1
 char întreg fără semn pe 16 biţi cu val. min. 0 şi val. max.
65535 (reprezentare caractere UNICODE nu complement faţă
de 2 ca cele anterioare)

91
 float virgulă mobilă pe 32 biţi
 double virgulă mobilă pe 64 biţi
 boolean val. booleană , 0 – false, nonzero-
true; intern JVM reprezintă boolean ca şi int
Numele unei variabile de tip primitiv
reprezintă chiar valoarea ei.

Tipuri de date referinţă : tablourile, clasele,


interfeţele. Numele unei astfel de variabile
reprezintă adresa unde se află variabila
respectivă şi nu valoarea variabilei.

Tipul de date null corespunde unei referinţe


nule.

92
4.2 Tipul clasă

Conceptul de clasă permite programatorului crearea


propriilor structuri de date, în funcţie de cerinţele
programului şi asocierea unor funcţii la aceste
structuri de date. Declararea unei clase:

class nume_clasa {
declaratii atribute;
declaratii constructori;
declaratii metode;
}

93
Declaraţia unui atribut:
[modificator] tip_atribut nume_atribut [=expresie_initializare];

Modificatorul reprezintă un cuvânt cheie care


specifică anumite proprietăţi ale atributului (public,
final, static, etc.).

Exemple:

int a;
public long b=15;
private PunctBidim p=new PunctBidim(5,5);

94
Declaraţia unei metode:

[modificator] tip_return nume_metoda


([lista_parametrii])
{
corp metoda
}

Exemplu:
public int adunare(int x, int y){return x+y;}

95
Declaraţia unui constructor:

[modificator] nume_clasa([lista_parametrii])
{
corp constructor
}

Exemplu:

class A
{
int a;
public A(){a=0;}
public A(int x){a=x;}
}

96
 La fel ca metodele constructorii pot fi redefiniţi.

 Pentru apelul unui constructor din altul se poate


folosi cuvântul cheie this. Prin this se referenţiază
obiectul curent, numele obiectului nefiind vizibil din
interiorul lui.

 Corpul constructorului poate conţine doar ca primă


linie instrucţiunea:

this(listă_parametrii);

prin care se poate apela un alt constructor cu o listă


de parametrii diferită de cea a contructorului curent.

97
Un obiect (instanţă a clasei) este o variabilă de tip clasa
respectivă. Pentru a putea folosi un obiect acesta trebuie
declarat, instanţiat şi iniţializat:
[modificator] nume_clasa nume_obiect[=expresie_initializare];

Instanţierea şi iniţializarea unui obiect se fac simultan prin


operatorul new urmat de numele clasei şi parametrii
constructorului între paranteze.
Exemple:
public PunctBidim p1, p2=new PunctBidim(5,5);
p1=new PunctBidim();
După crearea unui obiect acesta poate fi folosit accesându-se
atributele publice prin:
nume_obiect.nume_atribut
sau metodele publice prin:
nume_obiect.nume_metoda(param1, param2...).

98
4.3 Variabile în Java
O variabilă reprezintă un nume ce
referenţiază o valoare, o locaţie în care este
stocat un anumit tip de dată. Tipuri de
variabile:
 variabile atribut (ale unei clase),
 variabile locale (declarate într-un bloc de cod
delimitat de {}),
 variabile parametru de metodă (care apar în
lista parametrilor din declaraţia unei metode).

99
Domeniul de vizibilitate al variabilei (scope) este
domeniul în care variabila poate fi accesată.

Într-un domeniu de vizibilitate nu pot exista două


variabile cu acelaşi nume.

O variabilă de tip atribut are domeniul de vizibilitate


„cel puţin” întreaga clasă.

O variabilă parametru de metodă are domeniul de


vizibilitate în interiorul metodei.

O variabilă locală are domeniul de vizibilitate doar


între acoladele blocului în care a fost declarată.

100
Un acelaşi nume de variabilă poate fi utilizat
pentru a referenţia date diferite aflate în
domenii de vizibilitate diferite.

Într-un domeniu de vizibilitate inclus în alt


domeniu de vizibilitate nu se poate utiliza un
identificator deja folosit în domeniul mai
larg.

O situaţie specială apare când domeniul de


vizibilitate mai larg este o clasă şi domeniul
mai mic este un domeniu inclus în clasă
(putem avea o variabilă atribut şi o variabilă
locală cu acelaşi nume). Utilizarea numelui
respectiv în domeniul mai mic referenţiază
variabila definită în domeniul mai mic.
101
Exemplu:
class A{
int x=0; //x variabila atribut dom.viz. clasa
public int f(int y){ //y variabila parametru dom.viz metoda
int z; //z variabila locala dom.viz. blocul in care e definita, metoda
z=x+y; //toate variabilele sunt vizibile
for(int i=0;i<=5;i++);//i vizibil doar in bucla for
z+=i;//eroare compilare, i nu e vizibil
return z;
}
int v=x;
int w=z+y;//eroare compilare, z si y invizibile

102
public void g()
{
int x=2;
System.out.println(x);
//afis. 2 refer. var. locala nu variabila atribut
}

public void h()


{
int x=2;
for(int x=0;x<5;x++) System.out.println(x);
//eroare de compilare, x nu poate fi refolosit in bucla for pt.ca e deja
//utilizat pt o var.locala
}
}

103
Înainte de a utiliza o variabilă aceasta trebuie să
primească o valoare. JVM va da oricărei variabile
atribut neiniţializate de tip numeric valoarea 0, unei
variabile atribut de tip boolean valoarea false şi unei
variabile atribut de tip referinţă valoarea null.
Variabilele locale nu sunt iniţializate implicit de JVM.

Exemplu:

class A{
int x;
public void f(){
int y;
System.out.println(x);//afiseaza 0
System.out.println(y);//eroare la compilare}}
104
4.4 Membrii statici ai unei
clase
 Utilizarea modificatorului static la
declararea unui atribut/unei metode
face ca atributul/metoda să aparţină
clasei şi nu unui obiect anume.
 Astfel atributul/metoda poate fi
accesat(ă) atât prin numele clasei cât şi
prin numele unei obiect, instanţă a
clasei respective.
105
Pentru un atribut static se alocă o singură dată memorie la
“prima” iniţializare a clasei, ulterior toate obiectele de tipul
clasei respective vor partaja acelaşi membru static, aceeaşi
referinţă la aceeaşi zonă de memorie.

Metodele statice nu pot utiliza alte atribute şi metode ale clasei


respective care nu sunt statice.
Prima iniţializare a clasei se petrece când:
 un obiect din acea clasă este instanţiat (aici, iniţializarea clasei
are loc înaintea creerii obiectului)
 se apelează o metodă statică declarată în cadrul clasei
 se accesează un membru static al clasei.

Atributele nestatice se iniţializează doar la instanţierea (crearea)


unui obiect după ce au fost iniţializate atributele statice (dacă
există); atributele nestatice există separat pentru fiecare obiect
creat.

106
4.5 Specificatorii de acces pentru
clase, atribute, metode, constructori

107
4.6 Package Java
Un package Java este o bibliotecă de clase şi interfeţe Java.

Numele complet al unei clase conţine şi numele package-ului


căruia îi aparţine.

Se poate folosi doar numele clasei (fără a include şi numele


package-ului) cu condiţia să existe instrucţiunea:

import nume_package.*;
pentru a putea utiliza întreg package-ul sau

import nume_package.nume_clasa;
pentru a putea utiliza doar clasa respectivă.

108
Un package se poate crea doar în prima linie de cod
a programului prin instrucţiunea:

package nume_package;

Dacă nu se declară explicit un package se creează un


package fără nume.

109
4.7 Interfeţe Java
O interfaţă Java este o colecţie de metode abstracte
(fără corp) şi contante.

Interfeţele Java au “apărut” ca soluţie pentru


inexistenţa în Java a moştenirii multiple.

Astfel o clasă Java poate să moştenească o singură


clasă dar poate să implementeze oricâte interfeţe.

Nu se poate instanţia o interfaţă (se poate declara o


variabilă ca fiind de tipul interfeţei dar nu se poate
instanţia cu new).

110
Declarare:

[modificator] interface nume_interfata[extends alta_interfată_1,alta_interfata_2...]


{
lista_metode;

lista_constante;
}

Modificatorul poate fi unul din cuvintele cheie public sau


abstract (redundant, o interfaţă este abstractă prin definiţie).

O interfaţă poate moşteni mai multe interfeţe (extends).

O clasă care implementează o interfaţă (implements) trebuie să


suprascrie toate metodele acelei interfeţe.

class nume_clasa implements nume_interfata_1, nume_interfata_2..{ …….}

111
4.8 Moştenirea în Java
Principiul moştenirii <- POO.

În Java o clasă poate fi derivată dintr-o singură clasă de bază:

class nume_clasa_derivata extends nume_clasa_baza{ …….}

Nu este permisă moştenirea multiplă, soluţia de compromis fiind


implementarea mai multor interfeţe:

class nume_clasa_derivata extends nume_clasa_baza implements

nume_interfata_1, nume_interfata_2..{ ..}

112
Prin moştenire toţi membrii clasei de bază se regăsesc în clasa
derivată care însă mai poate adăuga şi alţii.

Accesul la membrii moşteniţi şi la cei nou adăugaţi e determinat


de modificatorii de acces.

Prin operaţia de derivare constructorii clasei de bază nu se


moştenesc.

Dar fiecare constructor al clasei derivate apelează un


constructor al clasei de bază. Acest apel se poate face implicit
(adăugat de compilator) sau explicit.

Apelul contructorului clasei de bază se face asemănător cu


apelul altui contructor al clasei curente, folosind însă cuvântul
cheie super în loc de this şi doar ca primă linie în corpul
constructorului:

super (lista_parametrii);

113
Consecinţă: cele două instrucţiuni (super şi this) nu
pot exista simultan.
Dacă nu se face explicit apelul super, compilatorul
adaugă un apel implicit al constructorului fără
argumente al clasei de bază.

La instanţierea unei clase derivate dintr-o clasă de


bază ordinea iniţializărilor este următoarea:
 iniţializarea atributelor statice ale clasei de bază
 iniţializarea atributelor statice ale clasei derivate
 iniţializarea atributelor nestatice ale clasei de bază
 apelul constructorului clasei de bază
 iniţializarea atributelor nestatice ale clasei derivate
 apelul constructorului clasei derivate.

114
O clasă derivată poate declara o metodă cu acelaşi
nume şi cu acelaşi număr şi tip al parametrilor
formali cu a unei metode din clasa de bază (tehnica
se numeşte suprascriere – overriding  tehnica
redefinirii metodelor - overloading). La apelul
respectivei metode dintr-un obiect de tip clasă
derivată se va executa metoda din clasa derivată.
Accesul la metoda clasei de bază din interiorul clasei
derivate se face prin:

super.nume_metoda();

Metodele statice şi atributele nu pot fi suprascrise. În


clasa derivată poate exista o metodă statică sau un
atribut cu acelaşi nume cu al unei metode sau al unui
atribut din clasa de bază dar nu le substituie pe
acestea din urmă. Deosebirea faţă de metode este că
la upcasting atributul clasei de bază şi nu cel al
derivatei este accesat.

115
Exemplu:

public class A
{
String sir="ceva";
public static void main(String args[])
{
A oba=new A();
B obb=new B();
System.out.println(oba.sir); //ceva
System.out.println(obb.sir);//altceva
oba=obb;
System.out.println(oba.sir);//ceva
}
}
class B extends A
{
String sir="altceva";
}
116
4.9 Modificatorul final
Poate fi utilizat atât în declaraţia unei clase cât şi în declaraţia
unui atribut sau a unei metode.

În cazul declaraţiei unei clase, modificatorul final se foloseşte


atunci când se doreşte ca nici o altă clasă să nu mai poată fi
derivată din aceasta.

În cazul declaraţiei unei metode, modificatorul final împiedică o


clasă derivată să suprascrie această metodă.

În cazul în care un atribut este declarat final, acesta odată


iniţializat nu va mai putea fi modificat rămânând constant pe tot
parcursul programului.

117
4.10 Modificatorul abstract
Clasele declarate abstract sunt acele clase care nu pot fi instanţiate.
Sunt utilizate pentru a modela concepte abstracte, tipuri de date
abstracte pentru care nu se justifică crearea obiectelor de acel tip (de
exemplu, tipul FormaGeometrica).

O clasă abstractă poate fi utilizată doar ca şi clasă de bază într-o relaţie


de moştenire.

Nu este posibilă instanţierea unei clase abstracte:

FormaGeometrica f=new FormaGeometrica();

produce un mesaj de eroare la compilare.

118
Poate fi declarată o variabilă ca fiind de tipul unei clase abstracte:
FormaGeometrica f;

şi apoi la instanţierea ei să folosim o clasă derivată (de exemplu


subtipurile Cerc, Dreptunghi, etc. ale tipului FormaGeometrica:

f=new Cerc();

O clasă abstractă poate să conţină una sau mai multe metode


abstracte. O metodă abstractă este o metodă pentru care s-a declarat
header-ul fără a defini însă şi corpul ei:

public abstract void nume_metoda();

În cazul în care o metodă a unei clase este declarată abstract şi clasa


trebuie să fie declarată abstract.

Clasa care este derivată dintr-o clasă ce conţine o metodă abstractă


trebuie să definească acea metodă (corpul metodei) sau să fie
declarată la rândul ei abstract.

(completare prin lucrările de laborator)

119
Tehnologii de programare în
Internet

Curs 5
- Appleturi Java -

120
5.1 Programarea interfeţelor
grafice în Java
Pentru crearea unei interfeţe grafice, Java pune la
dispoziţia utilizatorului o serie de componente
grafice.

Acestea fac parte din pachetul java.awt (exceptând


componenta Applet).

AWT = Abstract Window Toolkit.

Utilizând aceste componente, programatorul le poate


combina construind în funcţie de cerinţe o anumită
interfaţă grafică (GUI – Graphical User Interface).

121
D.p.v. al utilizatorului, componentele grafice AWT
sunt caracterizate printr-o formă (ceea ce se vede pe
ecran) şi prin faptul că răspund la acţiuni ale mouse-
ului, ale tastaturii, etc.

D.p.v. al programatorului, o componentă mai este


caracterizată de o serie de atribute interne ce conţin
informaţii legate de starea ei.

La acţiunea utilizatorului asupra unei componente


grafice, JVM, având în spate sistemul de operare,
generează evenimente (obiecte Java ce conţin
informaţii despre acţiunea utilizatorului asupra
componentei). Evenimentele (obiectele) sunt mai
departe transmise de JVM unor metode specifice
(handler-e) din cadrul programului. Aceste metode
sunt scrise de programator, sunt asociate cu
componentele grafice şi sunt responsabile de
acţiunea programului la apariţia evenimentelor.
122
Există o varietate de evenimente dar o anume
componentă grafică răspunde doar la anumite tipuri
de evenimente .

Clasele pentru evenimente (ActionEvent, ItemEvent


etc.) ca şi interfeţele de ascultare (ActionListener,
ItemListener) sunt conţinute în pachetul
java.awt.event, dar unele dintre superclasele
acestora sunt conţinute în alte pachete.

În diagrama următoare a claselor, toate clasele care


nu au înscris în numele lor numele pachetului apartin
pachetului java.awt.event.

Apoi în tabel se prezintă evenimentele generate de


diferite componente şi interfeţele pe care clasele
delegat trebuie să le implementeze pentru fiecare tip
de eveniment.
123
124
125
În cea mai mare parte a lor, componentele grafice
AWT sunt derivate din clasa Component .

Este o clasă abstractă care declară o serie de metode


general valabile pentru componentele grafice Java.
Printre acestea există metode legate de poziţionarea şi
dimensiunea componentei, de culorile utilizate pentru
afişare, de tipurile de fonturi utilizate, de analiză a
conexiunii cu alte componente, etc.

Fiecare componentă grafică are asociat un context


grafic definit prin clasa Graphics. Această clasă conţine
o serie de metode de desenare. În cazul în care se
doreşte crearea altor componente decât a celor
existente, programatorul poate desena componenta
utilizând contextul grafic al acesteia, suprascriind
metoda paint().

126
127
O categorie aparte de componente de tip Component
sunt componentele derivate din clasa Container.
Aceste componente sunt componente grafice care
oferă structura necesară pentru combinarea
componentelor grafice, permiţând includerea altor
componente în interiorul lor.

Clasa LayoutManager implementează un set de reguli


în vederea aranjării unor componente grafice în
interiorul unui container.

Pachetul java.awt mai pune la dispozitia


programatorului o serie de clase pentru lucrul cu
meniuri: MenuComponent, MenuBar, MenuItem,
Menu , CheckboxMenuItem, PopupMenu.
Clasa MenuComponent este o clasa abstracta, si este
radacina tuturor claselor de tip meniu. Este derivata
direct din clasa Object si nu din clasa Component.
128
Pentru crearea unui handler e nevoie de
implementarea unei anumite interfeţe (în funcţie de
tipul evenimentului) într-o anumită clasă.

În tabelul urmator sunt prezentate interfetele de


ascultare (delegat) (si clasele adaptor
corespunzatoare) precum si metodele fiecarei
interfete (sau adaptor).

Asocierea handler-componentă se face prin


intermediul unor metode ale clasei Component în
funcţie de tipul evenimentului (de exemplu,
addMouseListener(), addActionListener())

129
130
131
Pentru dezvoltarea interfetelor grafice AWT se parcurg mai
multe etape:

 Se porneste cu crearea unuia sau mai multor containere


(obiecte din clase derivate din clasa Container).
 Se creaza controalele (cu operatorul new; de exemplu new
Button(), new Choice()).

 Controalele create se insereaza într-un container, folosind


functii add() ale containerului.Modul de inserare a
controalelor trebuie sa tina seama de administratorii de
pozitionare impliciti sau noi creati ai containerului.

 Se prevede modul de tratare a evenimentelor generate de


componente.

132
Pentru tratarea unui eveniment se crează mai întâi o
clasă care implementează interfaţa care contine
functia de tratare a acelui eveniment si se defineste
aceasta functie.

Dupa aceasta, se instantiaza un obiect din acea clasa


(daca nu exista unul deja instantiat) si se asociaza cu
componenta al carui eveniment trebuie sa îl trateze.

Asocierea se realizeaza prin apelul unei metode a


componentei respective. Aceste metode de asociere
(de delegare) sunt prevazute în clasele
componentelor în functie de evenimentele pe care
acestea le pot genera si au un nume compus din
particula add, urmata de numele interfetei de
delegare a evenimentului.

133
De exemplu, pentru asocierea unui obiect delegat cu tratarea
evenimentului de apasare a unui buton se foloseste metoda
(clasei Button) addActionListener(); pentru asocierea unui
obiect delegat cu tratarea evenimentelor de fereastra se
foloseste metoda (clasei Window) addWindowListener() etc.

De exemplu, pentru tratarea evenimentului de apasare a unui


buton (ActionEvent) se creaza o clasa care implementeaza
interfata corespunzatoare acestui eveniment (ActionListener) si
se defineste metoda de tratare a evenimentului din interfata
implementata (actionPerformed()).

Dupa aceasta se instantiaza un obiect din clasa creata si se


asociaza cu butonul a carui eveniment se trateaza.

Componentele si evenimentele AWT se pot folosi atât pentru


aplicatiile independente (de sine statatoare - standalone) cât si
pentru applet-uri.

Exemplu:

134
135
136
137
138
5.2 Applet-uri Java
Un applet este un program special Java care rulează
în interiorul unui browser Web.

Pentru a construi un applet se crează o clasă derivată


din clasa Applet definită în pachetul java.applet.

Clasa Applet oferă cadrul necesar comunicării cu


browserul Web. Ea implementează mecanisme de
conexiune cu browser-ul punând la dispoziţia
programatorului o serie de metode pe care acesta le
poate suprascrie pentru a defini funcţionalitatea
applet-ului.

139
Clasa Applet este derivată din clasa Panel. Ca
urmare, toate metodele definite în clasa Panel şi mai
mult, cele definite în clasele Container şi Component
sunt disponibile în interiorul unei clase de tip Applet.

Una dintre cele mai importante metode este metoda

public void paint(Graphics g);

moştenită de la clasa Component.


Prin suprascrierea acestei metode, programatorul
poate controla ce se afişează în zona alocată applet-
ului în interiorul ferestrei browser-ului.

140
Alte metode importante moştenite de la clasa
Container sunt metodele de tip add prin care se pot
adăuga alte componente grafice AWT în interiorul
unui applet.

Acest lucru nu se va face în interiorul constructorului


clasei, deoarece în acel moment contextul grafic
ataşat applet-ului nu este încă disponibil.

Adăugarea altor componente se face în interiorul


metodei init().

Metoda init() a clasei Applet este metoda apelată de


browser imediat după crearea şi iniţializarea applet-
ului. Este apelată la prima încărcare a paginii html
care conţine applet-ul.

141
Metoda start() a clasei Applet este metoda apelată de
browser imediat după metoda init() şi ori de câte ori
utilizatorul revine în pagina html în care se află
applet-ul dintr-o altă pagină html.

Metoda stop() a clasei Applet este metoda apelată de


browser ori de câte ori se iese din pagina html în
care se află applet-ul.

Metoda destroy() a clasei Applet este metoda apelată


de browser înainte de a elibera resursele alocate
execuţiei unui applet. Este apelată când se închide
browser-ul.

Un applet poate să suprascrie aceste metode.

142
În afară de editarea şi compilarea fişierului
sursă Java este necesară pntru rularea
applet-ului în browser editarea unui fişier
html, în care, prin intermediul unui marcaj
HTML să se realizeze conexiunea cu fişierul
class obţinut în urma compilării.

Forma minimală de folosire a tag-ului


<APPLET>:

<APPLET CODE=”nume_applet.class”></APPLET>

143
5.3 Atribute ale marcajului
HTML APPLET
CODE pentru specificarea numelui applet-ului.

WIDTH , HEIGHT dimensiunea zonei alocate applet-


ului în fereastra browser-ului.

CODEBASE oferă posibilitatea includerii în pagina


html curentă a unui applet aflat în alt director decât
cel corespunzător fişierului html; mai mult, oferă
posibilitatea includerii unui applet care este disponibil
pe un alt calculator de la o altă adresă Internet (alt
URL).

144
De exemplu:

<APPLET CODE=”Hello.class”
CODEBASE=”JavaCode/” WIDTH=300
HEIGHT=200></APPLET>

Programul Hello.class se află în subdirectorul


JavaCode al directorului în care se află fişierul
html.

145
ARCHIVE permite utilizarea fişierelor
comprimate. Înainte de execuţia applet-ului,
JVM (pornită de browser) aduce fişierul class
specificat în atributul CODE. Dacă în execuţia
acestuia este nevoie de alte clase (fişiere
class) disponibile la server acestea sunt aduse
pe rând în momentul în care devin necesare.
În cazul în care se lucrează în reţea iar
capacitatea de transfer a reţelei este mică şi
execuţia applet-ului necesită o multitudine de
clase pot să apară întreruperi în execuţia
applet-ului în anumite momente pentru
aducerea claselor de care este nevoie.
146
Pentru a evita acest lucru se poate utiliza un singur
fişier comprimat care să conţină toate clasele
necesare. În acest caz, înainte de pornirea applet-
ului, JVM aduce fişierul comprimat şi apoi trece la
execuţia programului. Odată programul pornit toate
clasele sunt disponibile pe maşina clientului fără a
mai fi nevoie să se aştepte transferul lor. Pentru a
arhiva clasele utilizate se foloseşte utilitarul jar. În
cazul mai multor fişiere utilizate de applet (clase,
fişiere imagine, etc.) acestea se includ în fişierul
arhivă astfel:

jar cf nume_arhiva.jar fisier1 fisier2 fisier3.............

147
ALT este atributul prin care se poate specifica un text
pe care browser-ul îl va afişa în locul applet-ului în
cazul în care nu este compatibil Java dar tag-ul
APPLET îi este cunoscut. Există şi posibilitatea afişării
unui text dacă browser-ul nu recunoaşte tag-ul
APPLET, textul cuprins între <APPLET> şi
</APPLET>:

<APPLET CODE=”Hello.class”

ALT=”acest browser a auzit de Java dar nu stie sa


lucreze Java sau nu e testat corespunzator”

WIDTH=300 HEIGHT=200>

acest browser nu a auzit de Java


</APPLET>
148
NAME este atributul prin care se poate atribui un
nume unui applet. Acest atribut face posibil ca mai
multe applet-uri din aceeaşi pagină să se găsească
unul pe altul după nume şi să comunice între ele prin
intermediul metodelor definite în interiorul lor.

ALIGN, VSPACE şi HSPACE sunt atribute specifice


dispunerii applet-ului în pagina html afişată de
browser. ALIGN poate lua una din valorile left, right,
top, texttop, middle, absmiddle, baseline, bottom,
absbottom şi reprezintă modalitatea de afişare
comparativ cu linia de text din pagina html. VSPACE
şi HSPACE determină distanţa în pixeli care există
între applet şi zona unde browser-ul poate afişa altă
informaţie.

149
PARAM este unul din câmpurile cele mai utilizate
pentru că oferă posibilitatea configurării anumitor
variabile ale applet-ului. Astfel nu mai este nevoie să
fie modificat fişierul sursă, să fie recompilat ş.a.m.d.

Prin intermediul atributului PARAM este lăsată în


sarcina utilizatorului applet-ului (nu al
programatorului) setarea unor valori obţinându-se
astfel un grad ridicat de flexibilitate.

Pentru a face cunoscută în exterior lista parametrilor,


numele, tipul şi scopul acestora programatorul poate
suprascrie metoda getParameterInfo(), de exemplu:

150
public String[][] getParameterInfo()
{

String pinfo[][]={{“DISPLAYED_STRING”,

“String”, “Sirul aflat in interiorul applet-ului”}};

return pinfo;

Această metodă returnează un tablou bidimensional


de şiruri de caractere, pe fiecare rând aflându-se
informaţia despre un parametru al applet-ului.

151
Pe lângă informaţiile legate de parametrii se pot
returna informaţii generale legate de applet
suprascriind metoda getAppletInfo(), de exemplu:

public String getAppletInfo(){

return“Acest applet demonstreaza transferul de


parametrii din pagina html”;

}
Aceste metode de informare a utilizatorului unui
applet sunt apelate de browser la anumite comenzi
ale utilizatorului browser-ului. Aceste comenzi diferă
de la browser la browser. Cele două metode
prezentate mai sus pot fi utilizate de browser-e
pentru a face o introspecţie a applet-urilor.

152
O altă categorie de metode sunt cele utilizate
în interiorul applet-ului pentru a obţine
anumite informaţii de la browser:

public URL getDocumentBase()

returnează locaţia la care se găseşte pagina


în care se află applet-ul.

public URL getCodeBase()

returnează locaţia la care se găseşte applet-


ul.
153
Câmpul PARAM conţine la rândul lui alte două
câmpuri:

NAME prin care se specifică numele variabilei


VALUE pentru valoarea pe care o ia parametrul

De exemplu, codul unui program care va afişa textul


specificat în parametrul DISPLAYED_STRING din tag-
ul APPLET al fişierului html.

Dacă acest parametru nu este definit se va afişa şirul


„No string from outside”.

154
import java.applet.*;
import java.awt.*;

public class Test extends Applet {


public void paint(Graphics g) {

String sir=getParameter(“DISPLAYED_STRING”);

if(sir==null) sir=”No string from outside”;

g.drawString(sir, 30, 30);}


}

155
Se observă că funcţia utilizată pentru obţinerea unui
parametru setat în fişierul html este funcţia clasei
Applet, public String getParameter(String name);
.Metoda este publică deci poate fi apelată din
exteriorul clasei. Metoda are ca parametru o variabilă
de tip String (parametrul formal name) ce reprezintă
numele parametrului NAME din tag-ul APPLET, a
cărei valoare se doreşte a fi citită. Funcţia returnează
un şir String reprezentând valoarea parametrului
(VALUE). Se observă că valoarea setată prin VALUE
în fişierul html este un şir de caractere. Fişierul html
corespunzător applet-ului conţine:

<APPLET CODE=”Test.class” >


<PARAM NAME=”DISPLAYED_STRING”
VALUE=”Hello”>
</APPLET>

156
Pentru a transmite anumite mesaje browser-ului din
interiorul unui applet se pot folosi metodele definite
în interfaţa AppletContext. Un obiect de tipul
AppletContext se poate obţine prin metoda clasei
Applet, getAppletContext().

Pentru comunicarea cu browser-ul există următoarele


metode definite în interfaţa AppletContext:

public void showDocument(URL url)

cere browser-ului încărcarea unei noi pagini în


fereastra de afişaj curentă, pagină aflată la adresa
specificată prin parametrul url.

157
public void showDocument(URL url, String target)

cere browser-ului încărcarea unei noi pagini


specificând în plus faţă de metoda anterioară cadrul
în care se va afişa pagina. Un browser poate avea
mai multe cadre (frames) de afişaj în interiorul
ferestrei sale, deschizând şi afişând astfel mai multe
pagini html în aceeaşi fereastră de browser.
Parametrul target poate avea următoarele valori:
„self” (pagina se afişează în cadrul curent), „parent”
(pagina se afişează în cadrul părinte), „top” (pagina
se afişează în cadrul superior al ferestrei browser-
ului), „blank” (pagina se afişează într-o nouă
fereastră de browser fără nume), „name” (pagina se
afişează într-o nouă fereastră de browser cu numele
name).

158
public void showStatus(String status)

prin această metodă applet-ul poate cere browser-


ului afişarea unui şir în interiorul „status window”-ului
browser-ului (componentă grafică în care browser-ul
afişează diferite informaţii legate de încărcarea
paginilor, de stabilirea conexiunii, etc.).

Această metodă este disponibilă şi în clasa Applet.

159
public Enumeration getApplets()

returnează toate applet-uriledisponibile în


pagina în care se află applet-ul curent ( într-o
pagină pot exista mai multe applet-uri Java).
Ca urmare, applet-ul curent poate accesa
diferite metode publice ale altor applet-uri
aflate în aceeaşi pagină html.

public Applet getApplet(String name)

prin această metodă applet-ul poate cere


browser-ului referinţa la applet-ul cu numele
name.

160
5.4 Probleme de securitate ale
applet-urilor
Fiecare browser implementează o serie de politici de securitate în ceea ce
priveşte execuţia applet-urilor în cadrul browser-ului pentru a împiedica
compromiterea sistemului. Aceste politici pot să difere de la un browser la altul.

În general, se impun unui applet următoarele restricţii:


 nu poate citi sau scrie fişiere de pe/pe maşina pe care se execută.
 nu poate şterge sau modifica fişiere de pe maşina pe care se execută.
 nu poate citi anumite proprietăţi de sistem.
 nu poate porni un program pe maşina pe care se execută.
 nu poate deschide o conexiune de reţea decât cu maşina de pe care a fost adus.

Fiecare browser are un SecurityManager care implementează politica de


securitate. Când se încearcă o încălcare a drepturilor de acces, SecurityManager-
ul aruncă o excepţie de tipul SecurityException. Unele versiuni de Java oferă
soluţii prin care se pot acorda unor categorii speciale de applet-uri anumite
drepturi de acces (altfel interzise) la resursele maşinii client. Pentru aceasta se
foloseşte „semnătura digitală” a applet-urilor.
161
Tehnologii de programare în
Internet

Curs 6
- JavaScript -

162
În zilele de început ale World Wide Web-ului, HTML
era destul de simplu, iar marea majoritate a
informaţiilor necesare pentru a asambla o pagină
Web erau uşor de învăţat. Odată cu creşterea Web-
ului, au crescut şi aspiraţiile creatorilor de pagini
Web, iar cerinţele lor în sensul unui control mai mare
asupra aspectului paginii au forţat limbajul HTML să
se modifice şi să devină din ce în ce mai complex.

Întrucât Web-ul este un mediu dinamic, creatorii de


pagini Web au dorit ca paginile lor să interacţioneze
cu utilizatorii şi a devenit în scurt timp clar că limbajul
HTML nu putea satisface această cerinţă. Netscape a
inventat limbajul JavaScript ca o modalitate de a
controla browserul şi de a adăuga paginilor Web
interactivitate.

163
În ciuda numelor asemănătoare, limbajele JavaScript
şi Java nu au aproape nimic în comun unul cu
celălalt. Java este un limbaj de programare dezvoltat
şi comercializat de compania Sun Microsystems (azi,
de Oracle).

Principala utilizare a limbajului Java în domeniul


client-side, adică în browserul utilizatorului, este
crearea de applet-uri, aplicaţii care sunt descărcate
prin Internet şi rulează în cadrul browser-ului Web.
Applet-urile Java sunt adăugate în pagina Web prin
folosirea marcajului HTML <APPLET>. Când browser-
ul întâlneşte acest marcaj, el descarcă applet-ul Java
de pe server, iar appletul va rula în porţiunea de
ecran specificată în marcaj.

164
Când Netscape a adăugat browser-ului său
Web, Navigator, câteva capacităţi de scriptare
rudimentare, specialiştii au numit acest limbaj
de scriptare LiveScript.

În aceeaşi perioadă, Java ocupa prima pagină


a publicaţiilor de specialitate, fiind anticipată
ca o revoluţie în lumea calculatoarelor.

Ulterior, Netscape a revizuit browser-ul


Navigator pentru a permite rularea de applet-
uri Java în Navigator 2, dar a şi redenumit
LiveScript în JavaScript, sperând că o parte
din gloria limbajului Java se va prinde şi de
JavaScript.

165
Când Microsoft a văzut că limbajul JavaScript
devenea popular între dezvoltatorii Web, şi-a
dat seama că trebuie să introducă facilităţi de
scriptare şi în propriul browser, Internet
Explorer.

Ar fi putut adopta JavaScript dar a preferat


să-şi construiască un limbaj propriu, foarte
similar limbajului JavaScript.

Această versiune de JavaScript dezvoltată de


compania Microsoft poartă numele JScript.

166
Se fac referinţe la JavaScript ca fiind „limbaj de
scriptare”, cu implicaţia că un script este mult mai
simplu de scris decât un program.

Un script JavaScript este un program inclus într-o


pagină HTML. Deoarece este încadrat de marcajele
<SCRIPT> şi </SCRIPT>, textul script-ului nu apare
pe ecranul utilizatorului, iar browser-ele Web ştiu să
ruleze acest program JavaScript.

Marcajele sunt prezente cel mai frecvent în secţiunea


<HEAD> ....</HEAD> (scripturi de antet) a paginii
HTML. Scripturile care scriu text pe ecran sau care
scriu cod HTML, sunt plasate mai eficient în secţiunea
<BODY>...</BODY> (scripturi de conţinut).

167
JavaScript permite crearea unei interfeţe activă cu
utilizatorul, un exemplu fiind cel al site-urilor cu
butoane care se modifică la trecerea cursorului
mouse-ului pe deasupra lor (acest efect implică
folosirea unei tehnici numită rollover).

JavaScript poate fi folosit şi pentru a verifica dacă


utilizatorul introduce informaţii valide în formulare.

Dacă în aceste formulare procesarea necesită calcule,


acestea pot fi efectuate prin intermediul comenzilor
JavaScript direct pe calculatorul utilizatorului, fără să
fie nevoie de vreo prelucrare de către server.

JavaScript controlează browser-ul, astfel că pot fi


deschise ferestre noi, afişate mesaje de avertizare şi
chiar mesaje în bara de stare a ferestrei browser-ului.

168
Deoarece limbajul JavaScript are un set de funcţii de
lucru cu ora şi cu data, se pot genera ceasuri,
calendare şi documente cu timpul înscris.

JavaScript poate fi utilizat şi pentru a verifica


prezenţa unui plug-in în browser sau pentru a
redirecţiona utilizatorul spre o pagină diferită în cazul
în care plug-in-ul respectiv, necesar pentru
vizualizarea paginii, lipseşte.

169
6.1 Restricţii ale limbajului
JavaScript
JavaScript este un limbaj de tipul client-side, ceea ce
înseamnă că rulează pe calculatorul utilizatorului, nu
pe server. Din această cauză, limbajului JavaScript i-
au fost impuse o serie de limitări, majoritatea din
raţiuni de securitate.
JavaScript nu permite citirea sau scrierea de fişiere
pe calculatorul utilizatorului (astfel un vizitator al
paginii nu poate citi fişiere aflate pe mediile de
stocare din calculatorul gazdă, nu poate scrie viruşi
pe disc). Unica excepţie o constituie permisiunea
acordată limbajului JavaScript de a scrie în directorul
de cookie-uri al browser-ului, dar şi aici îi sunt
impuse o serie de limite.

170
JavaScript nu permite citirea sau scrierea de fişiere pe server.
Acest lucru ar putea fi util, de exemplu pentru stocarea
numărului de vizitatori sau scrierea datelor culese dintr-un
formular, dar limbajului JavaScript nu îi sunt permise aceste
acţiuni. Alternativa este existenţa unui program pe server care
să manevreze şi să stocheze aceste date. Un asemenea
program poate fi, de exemplu, un CGI, scris într-un limbaj
precum Perl sau PHP, sau un program Java.

Un script JavaScript nu poate închide o fereastră de browser


care nu a fost deschisă de el. Astfel se evită o situaţie în care un
site ia controlul asupra browser-ului, închizând ferestre care
conţin alte site-uri.

JavaScript nu poate citi informaţii dintr-un browser care conţine


o pagină Web de pe un alt server. Cu alte cuvinte, o pagină
Web nu poate citi nici o altă informaţie din alte ferestre
deschise, neputând astfel afla pe ce alte site-uri navighează
vizitatorul site-ului din care face ea parte.

171
6.2 JavaScript – limbaj
orientat pe obiecte
JavaScript este un limbaj orientat pe obiecte. Cele
mai răspândite obiecte folosite de JavaSript sunt
documentele, formularele, câmpurile, butoanele
radio. De asemenea, o fereastră este un obiect folosit
de un program JavaScript.

O pagină Web obişnuită conţine mai multe obiecte,


dintre care multe de acelaşi tip. De exemplu, o
pagină ar putea să conţină două formulare, dar chiar
dacă formularele au acelaşi tip de obiect, ele vor fi
diferite datorită câmpurilor, butoanelor şi altor
elemente de interfaţă care apar în formulare.

172
Fiecare obiect trebuie identificat în mod unic printr-
un nume sau identificator (formularele de exemplu,
ar putea fi numite form1 şi form2).

Câteodată programul JavaScript trebuie să acceadă


rapid la mai multe obiecte, cum ar fi de exemplu
afişarea mai multor imagini într-o prezentare. În
acest caz se poate folosi un tablou pentru a numi
fiecare obiect.

O proprietate este o valoare asociată unui obiect.


Obiectele pot avea mai multe valori, în funcţie de
tipul de obiect folosit (de exemplu, un obiect
formular poate avea un titlu, o lăţime şi o lungime ca
proprietăţi).

173
O metodă este un proces efectuat de către un obiect
atunci când acesta primeşte un mesaj (de exemplu,
un buton Submit de pe un formular este un obiect;
eticheta Submit şi dimensiunile obiectului sunt
proprietăţile obiectului buton; dacă se execută clic pe
butonul Submit, formularul este trimis către aplicaţia
server).

La metodele şi proprietăţile obiectului se accede prin


utilizarea sintaxei cu punct . De exemplu, metoda de
scriere în obiectul document:

document.write(‘Hello, World!’)

174
Alt concept fundamental este tratarea evenimentelor.

Un eveniment determină începerea execuţiei unui


program JavaScript (de exemplu, când se execută
clic pe un formular pe care JavaScript îl afişează pe
ecran).

Programul JavaScript află despre fiecare eveniment


care se petrece în timp ce acesta rulează. Acest lucru
este posibil prin crearea unei rutine de tratare a
evenimentului(de exemplu, rutina de tratare a
evenimentului de executare a unui clic pe butonul
Submit va conţine instrucţiuni JavaScript care
prelucrează informaţiile pe care utilizatorul le-a
introdus în formular).

175
Secţiunea

<script language=”Javascript”
type=”text/javascript”> alert (‘Hello, World!’)
</script>

într-o pagină HTML semnifică următoarele: eticheta


<script> atrage browser-ului atenţia că va urma un
script, nu cod HTML; browser-ul procesează
scripturile într-un mod diferit de HTML; atributul
HTML language informează browserul că limbajul de
scriptare este JavaScript; atributul HTML type îi
comunică browser-ului că scriptul este scris în format
text şi că textul este organizat în formatul JavaScript;
alert este funcţia de afişare pe ecran a unei casete de
dialog de avertizare care apare pe ecran pentru a
afişa mesajul Hello, World! şi rămâne pe ecran până
când se execută clic pe butonul OK afişat în caseta
de dialog.
176
6.3 Elemente fundamentale
ale limbajului JavaScript
Informaţia inserată în codul unei pagini Web sau în
cel JavaScript se numeşte valoare.

În HTML toate valorile sunt interpretate ca text (de


exemplu, tastarea valorii 10 nu este interpretată de
HTML ca număr care poate fi folosit în calcule, ci ca
un text care poate fi folosit eventual în scrierea unei
adrese, Strada Geniului, 10).

JavaScript operează cu 6 tipuri de valori.

177
 un număr este o valoare numerică, poate fi folosită în
calcule.

 un şir este un text încadrat de ghilimele.

 o valoare booleană este o valoare care este fie


adevărată (true sau 0), fie falsă (false sau nenulă).

 valoarea null, folosită în situaţiile în care trebuie


folosită o valoare (un simbol de înlocuire pentru o
valoare) pentru a reprezenta o non-valoare (vid)
până în momentul în care JavaScript atribuie
variabilei o valoare (de exemplu, se atribuie valoarea
null variabilei folosite pentru primul nume al unui
client până în momentul în care clientul introduce
numele său în formular).

178
 valoarea obiect

 o funcţie efectuează o acţiune atunci când este


apelată într-un program JavaScript; sunt două tipuri
de funcţii: predefinite (puse la dispoziţie de
JavaScript, de exemplu, alert()) şi particularizate
(definite de programator).

O variabilă este un simbol care înlocuieşte datele ce


se pot modifica în timpul execuţiei programului.

Declararea unei variabile într-un program JavaScript


comunică browser-ului să creeze o variabilă:

var nume_variabila

179
 var este unul din cele 25 de cuvinte cheie folosite de
JavaScript:

180
Un nume de variabilă nu poate fi un cuvânt cheie sau
un cuvânt rezervat în JavaScript. Un cuvânt rezervat
în JavaScript are un înţeles special pentru browser,
cu toate că nu este neapărat o comandă (aşa cum
este un cuvânt cheie al limbajului JavaScript):

181
De obicei, valoarea unei variabile se schimbă în
timpul rulării programului JavaScript, iar valoarea
iniţială este înlocuită de altă valoare. Un exemplu:

var price = 0
price = prompt(‘enter the price’, ‘ ’)

JavaScript are un mod simplu de a cere utilizatorului


să tasteze informaţii în program prin apelarea funcţiei
prompt(). Aceasta afişează textul în cadrul unei
casete de dialog de notificare, după care aşteaptă ca
utilizatorul să introducă informaţia şi să execute clic
pe butonul OK. Prima informaţiei a funcţiei este
mesajul comunicat utilizatorului, a doua este valoarea
prestabilită care este valoarea dată programului în
cazul în care utilizatorul nu a introdus nici o valoare
în caseta de dialog de notificare sau ’ ’ (atunci când
nu este folosită nici o valoare prestabilită).
182
JavaScript permite utilizarea atât a apostrofurilor cât
şi a ghilimelelor pentru desemnarea unui şir. Totuşi e
indicată folosirea primelor, întrucât ghilimelele ar
putea interfera cu ghilimelele folosite în paginile
HTML.

Operatorii (aritmetici, logici, de atribuire, de


comparaţie, condiţional) în JavaScript şi utilizarea
acestora în expresii sunt similare celor din C++ şi
Java. Operatorul de adunare folosit cu şiruri
realizează concatenarea.

De asemenea, instrucţiunile condiţionale (if...else,


switch...case), instrucţiunile de ciclare (for, while,
do...while) sunt similare celor din C++ sau Java.

183
JavaScript permite deasemenea folosirea tablourilor.
Declararea unui tablou:

var products = new Array()

Iniţializarea tabloului:

products[0]=’water’
products[1]=’soda’
products[2]=’beer’

sau:

var products = new Array (‘water’, ‘soda’, ‘beer’)

184
Numărul elementelor din tablou poate fi
determinat utilizând proprietatea length a
obiectului tablou

(var len = products.length)

Browserul poate afişa elementele tabloului


products pe ecran una sub alta:

for(var i=0;i<products.length;i++)
{
document.write(products[i]+’<br>’)
}

185
Un tablou poate fi sortat apelând metoda sort() a
obiectului tablou:

products.sort()

Elementele de tablou pot fi unite utilizând metoda


concat() sau metoda join() a obiectului tablou.

Ambele folosesc virgule pentru a separa valorile


dar pentru join se poate specifica un alt caracter
care să separe valorile în locul virgulei.

186
Definirea unei funcţii:

function nume_functie(nume_arg1,
nume_arg2,…nume_argn)
{
bloc_instructiuni
[return valoare]
}

Cel mai bun loc pentru definirea unei funcţii este la


începutul unui program JavaScript, în eticheta
<head>, deoarece apoi toate programele JavaScript
care apar ulterior pe pagina web vor cunoaşte
definiţia acelei funcţii. Browser-ul încarcă întotdeauna
totul în eticheta <head>, înainte să înceapă să
execute vreun program JavaScript.

187
O funcţie se apelează ori de câte ori se doreşte ca
browserul să execute instrucţiuni conţinute în blocul
de program al funcţiei. Apelul de funcţie este plasat
în eticheta <body>.

Apelul funcţiei trebuie de asemenea inclus între


marcajele <script>...</script>. O funcţie poate fi
apelată şi din codul html al paginii Web. De obicei o
funcţie va fi apelată ca răspuns la un eveniment, cum
ar fi încărcarea sau descărcarea paginii web de către
browser. În HTML se atribuie apelul de funcţie ca
valoare a unui atribut al unui marcaj HTML. De
exemplu, apelarea unei funcţii când browser-ul
încarcă pagina Web:

<body onload=’WelcomeMessage()’>

188
6.4Formulare şi tratarea
evenimentelor în
JavaScript
Formularele, fie ele formulare de comandă, de
abonare, de înscriere, financiar, de sondaj, etc.,
reprezintă un mod practic de a strânge informaţiile
necesare desfăşurării afacerilor pe Internet.

Formularele sunt create utilizând elemente de


formular HTML, cum ar fi butoane şi casete de
validare. Formularele folosite de siturile Web
comerciale interacţionează de asemenea cu
utilizatorul prin aplicaţii JavaScript. O aplicaţie
JavaScript este folosită în diverse scopuri, inclusiv
pentru validarea datelor şi pentru interacţiunea
dinamică cu elementele unui formular.

189
Aşa cum a fost prezentat la cursul referitor la HTML,
un formular este o secţiune de document HTML care
conţine elemente cum ar fi butoane radio, casete de
text, casete de validare şi liste de opţiuni.

Elementele unui formular HTML sunt deasemenea


cunoscute sub denumirea de controale. Elementele
sunt folosite ca un mijloc eficient pentru ca
utilizatorul să introducă informaţii într-un formular.

Informaţiile introduse într-un formular sunt transmise


serverului web pentru a fi prelucrate când utilizatorul
execută clic pe un buton de înaintare.

190
Programul care prelucrează formularul se numeşte
program CGI (Common Gateway Interface).

Programele CGI sunt scrise într-unul din mai multe


limbaje de programare, JSP, PHP, Perl, ASP, etc.

Programele CGI interacţionează de obicei cu aplicaţii


care nu sunt pentru Web, cum ar fi baze de date şi
alte sisteme, necesare prelucrării formularului.

După încheierea prelucrării, programul CGI crează de


obicei în mod dinamic o altă pagină Web şi o trimite
browser-ului care a trimis formularul.

191
Reamintim că fiecare element are unul sau mai multe
atribute, acestea fiind informaţii asociate cu
elementul.

De exemplu, atributul VALUE este folosit pentru a


defini o valoare prestabilită, nu valoarea introdusă de
utilizator.

Un exemplu bun în acest caz este atributul NAME,


deoarece acest atribut este utilizat pentru a face
referire la element.

Multe aplicaţii necesită ca unele informaţii conţinute


într-un formular să fie verificate utilizând un proces
de validare.

192
Două moduri frecvente de validare a datelor dintr-un
formular sunt prin intermediul utilizării programelor
CGI, respectiv al aplicaţiilor JavaScript.

Un program CGI validează informaţiile după


înaintarea formularului.

O aplicaţie JavaScript poate valida informaţii ori de


câte ori are loc unul din mai multe evenimente în
timp ce formularul este afişat pe ecran.

Pe lângă informaţiile de validare, aplicaţia JavaScript


poate schimba în mod dinamic un formular în timp ce
acesta este afişat pe ecran.

193
De exemplu, un program JavaScript poate activa sau
dezactiva elemente pe baza unei valori introduse de
utilizator într-un alt element.

Un program JavaScript este executat ca răspuns la


un eveniment ce are loc în timp ce un formular este
afişat pe ecran.

Evenimentele care au loc de obicei într-un formular


sunt:

 onload - executat când browser-ul termină de


încărcat o fereastră sau toate cadrele dintr-un set de
cadre
 onunload - executat când browser-ul şterge un
document dintr-o fereastră sau cadru

194
 onclick - executat la un clic deasupra unui element
 ondblclick - executat la un dublu clic deasupra unui
element
 onmousedown - executat când butonul mouse-ului
este apăsat în timp ce indicatorul mouse-ului se află
deasupra unui element
 onmouseup - executat când butonul mouse-ului este
eliberat în timp ce indicatorul mouse-ului se află
deasupra unui element
 onmouseover - executat când indicatorul mouse-ului
se deplasează ajungând deasupra unui element
 onmousemove - executat când indicatorul mouse-ului
este deplasat doar deasupra unui element
 onmouseout - executat când indicatorul mouse-ului
este deplasat în afara unui element

195
 onfocus - executat când un element este în atenţie
(selectat)
 onblur - executat când un element iese din atenţie
 onkeypress - executat la apăsarea şi eliberarea unei
taste
 onkeydown - executat când o tastă este apăsată
 onkeyup - executat la eliberarea unei taste
 onsubmit - executat când este înaintat un formular
 onreset - executat când un formular este reiniţializat
 onselect - executat când într-un câmp de text este
selectat text
 onchange - executat când un element iese din
atenţie şi valoarea elementului s-a modificat de la
intrarea în atenţie

196
Un eveniment este asociat cu un element al unui
formular, ca atribut definit în cadrul etichetei de
deschidere a elementului. Se asociază acestui atribut
numele funcţiei JavaScript ce se doreşte a fi
executată când are loc evenimentul.
Pentru exemplificare, se consideră un formular
cu elemente de introducere a datelor, în care
utilizatorul tastează numele şi prenumele său şi
adresa de e-mail. Fişierul include un program
JavaScript care validează adresa de e-mail, verificând
dacă aceasta include semnul @ când utilizatorul mută
cursorul în afara elementului de introducere a
datelor. Acest lucru se realizează utilizând atributul
de eveniment onblur din eticheta de deschidere a
elementului <INPUT> şi asociind numele funcţiei
JavaScript cu atributul de eveniment onblur.
Evenimentul onblur are loc când cursorul iese în
afara elementului, fapt numit out of focus (ieşirea în
afara atenţiei).

197
<html>
<head>
<title>onblur event</title>
<script language=”Javascript” type=”text/javascript”>

function ValidateEmail(EmailAddress)
{
var Location= EmailAddress.indexOf(‘@’)
if (Location==-1)
{
alert(‘You entered an inaccurate
email address.’)
}
}
</script>
</head>

198
<body>
<FORM action=”http://www.jimkeogh.com” method=”post”>
<P>
First Name: <INPUT type=”text” name=”Fname”/><BR>
Last Name: <INPUT type=”text” name=”Lname”/><BR>
Email: <INPUT type=”text” name=”Email”

onblur=”ValidateEmail(this.value)”/><BR>

<INPUT name=”Submit” value=”Submit” type=”submit”/>


<INPUT name=”Reset” value=”Reset” type=”reset”/>
</P>
</FORM>
</body>
</html>

199
Funcţiei ValidateEmail() i se transferă un parametru, care este
valoarea elementului Email de introducere a datelor.

În codul evenimentului onblur, numele obiectului este this –


face referire la obiectul curent, care este elementul Email de
introducere a datelor.

value este atributul asociat cu obiectul this.

De câte ori se utilizează numele unui atribut, i se comunică


browser-ului să folosească valoarea atributului.

Aici i se cere browser-ului să folosească valoarea atributului


value, care este informaţia tastată de utilizator în elementul
Email.

Funcţia indexOf() găseşte poziţia unui caracter din interiorul


unui şir de caractere. Funcţia returnează -1 dacă şirul nu
conţine caracterul.

200
Când un utilizator priveşte un formular din cadrul
unei pagini Web, probabil nu se gândeşte la modul în
care se leagă formularul de tot ceea ce vede în rest.

Totuşi, relaţiile de pe o pagină Web sunt foarte


importante pentru programatorul de JavaScript.

Tot ce se vede într-un site Web este considerat un


obiect.

Primul obiect ce se vede este fereastra, la care se


face referire în JavaScript ca window.

O fereastră conţine un document HTML la care se


face referire ca document.

201
Un document poate avea unul sau mai multe
formulare, iar un formular poate avea unul sau mai
multe elemente.
Obiectele de formular sunt stocate într-un tablou
numit forms şi apare în ordinea în care formularele
apar în document.

Se poate face referire la fiecare formular prin indicele


formularului.
De exemplu, prin

window.document.forms[2]

i se comunică browser-ului să meargă la obiectul


window şi apoi obiectul window să meargă la obiectul
document şi apoi să facă referire la cel de-al treilea
formular.
202
6.5”Ascunderea” programului
JavaScript
Un program JavaScript poate fi ascuns de ochii unui
vizitator stocându-l într-un fişier extern, în acelaşi
server de Web care conţine pagina Web.

Fişierul extern are extensia .js. Browser-ul apelează


ulterior fişierul extern ori de câte ori browserul
întâlneşte un element JavaScript din pagina Web.

Astfel în codul sursă al paginii Web, apar trimiteri la


fişierul extern .js, dar nu se vede codul sursă al
programului JavaScript.

203
Protejarea programului JavaScript nu constituie
principalul motiv pentru stocarea fragmentelor
JavaScript într-un fişier extern.

Cel mai important beneficiu al acestei practici este


partajarea programelor JavaScript de către mai multe
pagini Web, fără a fi necesară dublarea codului
sursă.

Orice modificări asupra codului JavaScript în fişierul


extern sunt aplicate automat tuturor paginilor Web
care utilizează fişierul extern ca sursă pentru
programe JavaScript.

204
Comunicarea către browser a faptului că programul
JavaScript se află într-un fişier extern de la server-ul
Web şi nu este încorporat în pagina Web se
realizează atribuind numele fişierului ce conţine
fragmentele JavaScript atributului src al marcajului
<script>:

<script src=”MyJavaScript.js” language =”Javascript”


type=”text/javascript”>.

După aceea, trebuie definite funcţii vide pentru


fiecare funcţie definită în fişierul JavaScript extern
({}).

Pasul final constă în crearea fişierului JavaScript


extern plasând toate definiţiile de funcţii într-un fişier
cu extensia .js.

205
În afară de lucrul cu formulare, JavaScript lucrează
cu cadre, cu imagini, cu ferestrele browser-ului.

Cursul nu face referire la aceste aspecte. Pentru


informaţii suplimentare sunt indicate:

 Tom Negrino, Dori Smith – „JavaScript pentru World


Wide Web – Ghid de învăţare rapidă prin imagini”,
Editura Corint, Bucureşti 2004.
 Jim Keogh – „JavaScript fără mistere” Editura Rosetti
Educational, Bucureşti 2006
 David Flannagan – „JavaScript – The Definitive
Guide”, O’Reiley 1997

206
Tehnologii de programare în
Internet

Curs 7
- Servlet-uri şi JavaServer Pages -

207
7.1 Servlet-uri generice
Servlet-urile sunt soluţia oferită de Java pentru
interfaţa CGI.

Un servlet este o componentă software gestionată de


un container care generează conţinut în mod
dinamic.

Se mai poate spune că o astfel de componentă


extinde funcţionalitatea unui server. Server-ul nu
trebuie neapărat să implementeze protocolul HTTP,
condiţia fiind să ofere suport pentru Java şi Servlet
API.

208
Servlet API este o specificaţie dezvoltată de Sun
Microsystems (şi alţii) care defineşte clasele şi
interfeţele utilizate pentru crearea şi execuţia servlet-
urilor în package-urile javax.servlet şi
javax.servlet.http.

Principiul de funcţionare al unui servlet este similar


cu cel al CGI-urilor. Acesta primeşte o cerere de la
client, o prelucrează şi formulează un răspuns
corespunzător.

209
Un container de servlet-uri este un modul al server-
ului Web sau al server-ului de aplicaţii care oferă
serviciile pentru comunicarea dintre navigator şi
servlet.

Aceste servicii pot fi: prelucrarea cererilor, formularea


răspunsului, stabilirea de restricţii pentru servlet,
crearea, invocarea şi distrugerea servlet-ului.

Containerul poate rula:


 în acelaşi proces cu server-ul din care face parte;
 într-un proces de pe aceeaşi maşină cu server-ul;
 pe altă maşină.

210
Pentru a creea un servlet trebuie implementată
interfaţa Servlet sau extinsă una din clasele
GenericServlet sau HttpServlet. Metodele utilizate
sunt: init(), service() şi destroy().

Pentru clasa GenericServlet, metoda service() este


abstractă şi de aceea trebuie implementată de către
programator.

Structura unui servlet generic este următoarea:

public class ServletMinimal extends GenericServlet{


//initializeaza servlet-ul
public void init(){
//aici se efectueaza diverse initializari,
//de exemplu se creaza conexiunile la bazele de date
}
211
//citeste cererile si formuleaza raspunsurile
public void service(ServletRequest cerere,
ServletResponse raspuns)throws ServletException,
IOException{
//se preia cererea prin intermediul obiectului cerere
//se seteaza datele prin obiectul raspuns
//se obtine un flux de iesire, se transmite raspunsul
}

//se apeleaza la distrugerea servlet-ului


public void destroy(){
//se elibereaza resursele alocate
}
}

212
Metodele init() şi destroy() se apelează o singură
dată la crearea servlet-ului şi, respectiv, la
distrugerea acestuia. Metoda service() se apelează de
fiecare dată când apare o cerere.

Conexiunea cu baza de date este consumatoare de


timp şi de aceea se realizează la iniţializare.
Conexiunea rămâne stabilită şi între două cereri
consecutive. În mod normal, acest lucru nu se
întâmplă la CGI-uri, deoarece după ce s-a generat
răspunsul pentru client, programul se termină, iar la
un alt apel se începe din nou cu etapa de iniţializare.

Servlet-ul următor va genera un document de tip text


datorită specificării tipului MIME text/plain de către
metoda setContentType(). După ce se obţine un
flux de ieşire se vor scrie informaţiile despre clientul
şi server-ul Web.

213
import java.io.IOException;
import java.io.Writer;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class VariabileMediu extends GenericServlets{
public void service(ServletRequest cerere,
ServletResponse raspuns)
throws ServletException, IOException{

//se stabileste tipul documentului generat


raspuns.setContentType(”text/plain”);
//se obtine fluxul de iesire
Writer iesire=raspuns.getWriter();

214
//se transmit informatiile catre client
iesire.write(“\nAdresa locala:
”+cerere.getLocalAddr());
iesire.write(“\nPortul local: ”+cerere.getLocalPort());
iesire.write(“\nProtocolul: ”+cerere.getProtocol());
iesire.write(“\nAdresa clientului: ” +
cerere.getRemoteAddr());
iesire.write(“\nHost-ul clientului: ” +
cerere.getRemoteHost());
iesire.write(“\nPortul clientului: ” +
cerere.getRemotePort());
iesire.write(“\nNumele server-ului: ” +
cerere.getServerName());
iesire.write(“\nPortul server-ului: ” +
cerere.getServerPort());
}
}
215
În navigatorul Web, rezultatul ar putea avea forma:

Adresa locala: 192.168.0.5


Portul local: 8080
Protocolul: HTTP/1.1
Adresa clientului: 192.168.0.17
Host-ul clientului: 192.168.0.17
Portul clientului: 4302
Numele server-ului: felix.ro
Portul server-ului: 8080

Adresa locală indică adresa IP a server-ului.

216
Calculatorul client nu are stabilit un nume şi este identificat doar
prin adresa IP. Pentru a rula exemplul trebuie ca în fişierul
web.xml al aplicaţiei să se găsească următoarele linii:

<servlet>
<servlet-name>VariabileMediu</servlet-name>
<servlet-class>VariabileMediu</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>VariabileMediu</servlet-name>
<url-pattern>/servlet/VariabileMediu</url-pattern>
</servlet-mapping>

În elementul servlet se stabileşte care este numele servlet-ului


şi care este clasa asociată. Dacă aceasta se află într-un pachet,
numele clasei va fi precedat de numele pachetului. În marcajul
servlet-mapping se ataşează unui servlet un URL. Acesta este
dat de URL-ul aplicaţiei, la care se adaugă conţinutul tag-ului
url-pattern.

217
7.2 Servlet-uri HTTP
Atunci când se doreşte crearea unui servlet pentru
protocolul HTTP, este recomandată extinderea clasei
HttpServlet. Aceasta extinde la rândul ei clasa
GenericServlet. În cazul utilizării clasei
HttpServlet nu se va suprascrie metoda service(),
ci numai metodele corespunzătoare tipului de cerere
HTTP: doGet() pentru GET, doPost() pentru POST
etc. Pentru cerere şi răspuns se folosesc interfeţele
HttpServletRequest şi, respectiv,
HttpServletResponse (vezi exemplul din platforma
de laborator).

218
Pentru redirectare se va utiliza metoda
sendRedirect() din clasa HttpServletResponse,
iar ca parametru se va da URL-ul către pagina la care
se realizează trimiterea.
De exemplu:

raspuns.sendRedirect(“http://info.tech.pub.ro/eroare.ht
ml”);

Similar, se realizează emiterea unui cod de eroare


particular, cu ajutorul metodei sendError() al
aceleaşi clase.
De exemplu:

raspuns.sendError(900, “Eroare SQL”);

219
Când sunt necesare informaţii din alte pagini, pe care
utilizatorul le-a vizitat deja se utilizează sesiunile.

Există mai multe modalităţi de a stabili o sesiune:


 prin intermediul cookie-urilor: containerul trimite
clientului un cookie, iar acesta îl retrimite de fiecare
dată când face o nouă cerere la server;
 prin intermediul protocolului HTTPS (HTTP Secure),
care utilizează tehnologia de criptare SSL ( Secure
Socket Layer), care conţine un mecanism de identificare
fără echivoc a clientului.
 prin rescrierea URL-ului, prin adăugarea unui
identificator de sesiune la sfârşitul URL-ului, situaţie
utilizată atunci când clientul nu acceptă cookie-uri.

De exemplu:

http://www.info.uaic.ro/mag/servlet/Mag;jsessionid=97
117
220
Pentru ca un servlet să acceseze informaţiile
referitoare la sesiunea curentă va trebui să facă un
apel la metoda getSession() din interfaţa
HttpServletRequest. Aceasta returnează intefaţa
HttpSession, care permite ataşarea de obiecte
pentru sesiunea curentă. Stabilirea unor informaţii se
face astfel:

protected void doPost(HttpServletRequest cerere,


HttpServletResponse raspuns)
throws ServletException, IOException{
//se creeaza o sesiune sau se continua cea existenta
HttpSession sesiune=cerere.getSession();
//se verifica daca s-a inceput o sesiune
if(!sesiune.isNew())){...}
...
//se ataseaza obiectul
sesiune.setAttribute(“eticheta”, obiect);}
221
Preluarea obiectului ataşat unei sesiuni se realizează
prin apelul:

Obiect obiect=(Obiect)sesiune.getAttribute(“eticheta”);

Dacă obiectul nu a fost ataşat anterior, se returnează


valoarea null.
Pentru a termina o sesiune se apelează metoda
invalidate(), caz în care obiectele ataşate se vor
pierde. Dacă metoda este apelată din nou, va genera
excepţia IllegalStateException.
Sesiunile pot avea o durată de viaţă limitată.
Perioada de timp dintre două cereri din cadrul unei
sesiuni se poate stabili cu metoda
getMaxInactiveInterval() şi este exprimată în
secunde. Metoda analoagă este
setMaxInactiveInterval(), iar dacă parametrul are
o valoare negativă, intervalul este infinit.
222
7.3 Cookie-uri
Un cookie reprezintă un conţinut (text) trimis
clientului Web spre păstrare de către server-ul Web.
De fiecare dată când se va cere o pagină de pe
respectivul server, se va trimite şi conţinutul păstrat
de cookie. Pentru cookie-uri, Servlet API pune la
dispoziţia programatorului clasa Cookie din pachetul
javax.servlet.http. Constructorul necesită
specificarea numelui şi a valorii, în această ordine. Un
exemplu de setare a unui cookie este:

raspuns addCookie(new Cookie(“color”,”blue”));

Astfel, se stabileşte faptul că utilizatorul curent


preferă culoarea albastră, iar paginile sit-ului vor
putea fi generate cu nuanţe de albastru.
223
7.4 JavaServer Pages (JSP)
Un JSP este un document Web care specifică cum va
fi prelucrată o cerere şi modul de generare a unui
răspuns. O pagină JSP conţine o parte statică,care
reprezintă un şablon al documentului care se
generează, şi una dinamică, dată de elementele
specifice JSP. Acestea sunt:
 directive standard;
 acţiuni standard;
 elemente de scripting;
 tag-uri proprii.

224
Dacă servlet-urile sunt clase care generează
documentele Web, JSP-urile sunt documente Web
care conţin secvenţe de cod Java.

De aceea JSP-urile sunt considerate ca o extensie a


paginilor Web obişnuite. Această tehnologie este
similară cu PHP şi ASP.NET.

Avantajul adus de JSP faţă de servlet-uri îl constituie


uşurinţa dezvoltării. Server-ul Web se ocupă de
transformarea acestora în servlet-uri şi apoi de
compilarea acestora.

Acest lucru se realizează fie la încărcarea aplicaţiei de


către server-ul Web, fie la prima cerere a paginii JSP.
Având în vedere faptul că un JSP este transformat în
servlet, se poate afirma că JSP-ul este o extensie a
servlet-urilor.
225
Tehnologia JSP permite definirea de biblioteci de noi
tag-uri de către programator. Aceste biblioteci pot fi
utilizate ulterior şi în cadrul altor aplicaţii. Mai mult,
se separă rolurile programatorului şi designer-ului:
programatorul va stabili care sunt tag-urile, iar
designer-ul le va include în documentele Web, acesta
nu va mai lucra cu cod Java. Astfel, se separă partea
de funcţionalitate (motorul aplicaţiei) de partea de
vizualizare (interfaţa cu utilizatorul).

O aplicaţie Web poate conţine atât servlet-uri cât şi


JSP-uri. Se recomandă ca paginile JSP să fie stocate
în directorul web al aplicaţiei în momentul dezvoltării.
Dacă unui document Web i se schimbă extensia în
jsp, va deveni un document JSP valid.

226
Pentru inserarea de elemente JSP se pot utiliza
marcatori XML (utilizând spaţiul de nume
http://java.sun.com/JSP/Page, având de regulă
prefixul jsp) sau specifici JSP. În practică se folosesc
mai mult cei specifici JSP, datorită uşurinţei în
utilizare. Formatul XML oferă avantajul de a putea
valida şi procesa pagina JSP cu un procesor XML
obişnuit.

Pentru a testa dacă server-ul Web suportă pagini JSP


în ambele formate se pot utiliza următoarele două
exemple. O pagină JSP simplă este:

227
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0
Strict//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-
strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<title>Test pentru JSP</title>
</head>
<body>
<h1>Test JSP</h1>
<%! String s=”JSP-urile functioneaza.”; %>
<p><%=s %></p>
</body>
</html>

228
Documentul anterior este unul XHTML (Extensible
Hypertext Markup Language – extensie a limbajului
HTML pentru obţinerea compatibilităţii cu XML,
specificaţie standardizată de Consorţiul Web) care
conţine elemente JSP. XHTML păstrează tag-urile
HTML. Documentele XHTML pot fi încadrate în unul
dintre tipurile MIME “text/html” sau “text/xml”.
Obligatoriu, paginile XHTML vor avea toate tag-urile
şi atributele scrise cu litere mici, deoarece XML este
case-sensitive. O altă restricţie este aceea că toate
tag-urile de sfârşit sunt obligatorii. De asemenea,
valorile atributelor trebuie încadrate între ghilimele.
comentariile trebuie încadrate între simbolurile <!-- şi
-->, iar spaţiile albe nu sunt semnificative.

Se declară o variabilă s de tip string, a cărei valoare


este inserată într-un paragraf.
Varianta care întrebuinţează elemente JSP în format
XML este următoarea:
229
<?xml version=”1.0” encoding=”UTF-8”?>
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”
xmlns:jsp=”http://java.sun.com/JSP/Page”>
<head>
<title>Test pentru JSP (XML)</title>
</head>
<body>
<h1>Test JSP</h1>
<jsp:declaration>
String s=”JSP-urile functioneaza in format XML.”;
</jsp:declaration>
<p>
<jsp:expression>s</jsp:expression>
</p>
</body>
</html>

230
Fişierele de genul celor din primul exemplu se
numesc pagini JSP, conţin elemente specifice JSP, iar
paginile JSP care sunt totodată şi documente XML se
numesc documente JSP. Pentru documentele JSP se
mai foloseşte şi extensia jspx.

Comentariile în JSP sunt de forma:


<%-- comentariu --%>

Spre deosebire de comentariile X(HT)ML, acestea nu


vor fi incluse în pagina generată. Mai mult, interiorul
comentariilor JSP nu este procesat.
În continuare sunt prezentate elementele JSP în
ambele formate care pot fi incluse în paginile Web.

231
Directivele sunt mesaje către containerul JSP şi nu
generează output (informaţii pentru răspuns).
Sintaxa pentru directive este următoarea:

<%@ directive …%>

sau

<jsp:directive.directiva … />

Directiva page poate fi utilizată pentru a importa


pachete şi clase Java (la fel ca instrucţiunea import),
pentru a stabili o sesiune, a indica adresa paginii
pentru eroare sau pentru a indica dacă pagina
curentă este pagină de raportare a erorilor.

232
Atributele cele mai utilizate ale directivei page sunt:
 import – specifică lista pachetelor şi claselor care
vor fi incluse pentru pagina curentă; separatorul
utilizat este virgula, iar pachetele implicite sunt
java.lang.*, javax.servlet.*, javax.servlet.jsp.*
şi javax.servlet.http.*.
 session – indică dacă se utilizează sesiuni (HTTP).
Valoarea implicită este true.
 buffer – stabileşte dimensiunea buffer-ului pentru
ieşire, exprimată în kiloocteţi. Valoarea implicită este
de cel puţin 8, iar sufixul kb este obligatoriu. În cazul
în care nu se doreşte utilizarea unui buffer, se va
folosi none. Buffer-ele sunt utilizate pentru creşterea
performanţelor operaţiunilor cu dispozitivele
periferice în general. În cazul paginilor JSP, este
recomandat lucrul fără buffer sau golirea frecventă a
acestuia atunci când aplicaţia client necesită
recepţionarea imediată a datelor generate.

233
 autoFlash – indică dacă buffer-ul se goleşte
automat. Valoarea implicită este true.
 info – stabileşte o descriere a paginii curente.
Aceasta se poate obţine din clasa transformată în
urma apelului metodei Servlet.getServletInfo().
 isErrorPage – stabileşte dacă pagina curentă este
utilizată pentru raportarea erorilor. Doar în caz
afirmativ va fi disponibilă variabila exception, care va
furniza informaţii referitoare la eroarea apărută.
Valoarea implicită este false.
 errorPage – indică URL-ul paginii pentru tratarea
excepţiilor neprinse.
 contentType – stabileşte tipul MIME pentru
documentul generat de către JSP. Tipul implicit este
text/html.
 pageEncoding – stabileşte setul de caractere utilizat
pentru scrierea paginii JSP. În cazul în care setul
specificat nu este disponibil, se va utiliza ISO-8859-1.

234
Exemple:
<%@page import=”ro.infoiasi.mag.admin.MagSursaDate” %>
<%@page info=”Pagina de administrare a sit-ului”
errorPage=”eroare.jsp” %>

Directiva include permite inserarea altor fişiere în


paginile JSP. Aceasta este utilă pentru inserarea
mediilor de navigare, a antetului şi subsolului
paginilor comune pentru întregul sit (sau pentru mai
multe pagini). Astfel, se poate administra mult mai
uşor sit-ul, întrucât se evită duplicarea datelor: o
modificare într-un singur fişier va fi vizibilă în mai
multe pagini ale sit-ului. Se pot include şi fişiere JSP,
iar acestea, la rândul lor, vor fi procesate. Singurul
atribut al directivei include este file şi acesta indică
locaţia fişierului ce se doreşte a fi inclus, de exemplu:

<%@include file=”footer.html”>

235
Directiva taglib permite includerea unei
biblioteci de tag-uri definite de programator.
Se specifică URI-ul corespunzător bibliotecii
de tag-uri (atributul uri) şi prefixul utilizat în
pagina Web (atributul prefix). De exemplu:

<%@taglib uri=”http://www.infoiasi.ro/mag”
prefix=”mag” %>

236
Marcatorii pentru declaraţii permit specificarea de
atribute şi metode pentru clasa servlet-ului generat.
Sintaxa este următoarea:

<%! declaratii %>

sau, în format XML

<jsp:declaration>declaratii </jsp:declaration>

Exemple de declaraţii:

<%! int lungime %>


<%! int getLungime() {return lungime;} %>

237
Expresiile JSP permit inserarea în fluxul de ieşire a
unei valori rezultate în urma evaluării unei expresii
Java. Sintaxa este:

<%=expresieJava %>

sau, în format XML

<jsp:expression>expresieJava</jsp:expression>

Expresia nu trebuie să se termine cu punct şi virgulă.


Un exemplu de expresie care include data curentă
este:

<%=(new java.util.Date()).toLocalString()%>

238
Pentru utilizarea de cod Java se vor folosi scriplet-uri,
care au următoarea sintaxă:

<% codJava %>


sau, în format XML <jsp:scriplet> codJava
</jsp:scriplet>

Este recomandată utilizarea a cât mai puţine scriplet-


uri, pentru că în acelaşi fişier vor exista atât codul
corespunzător documentului Web (pentru partea de
vizualizare), cât şi cod Java. În locul lor se pot utiliza
tag-uri definite în biblioteci proprii. Exemplu de
scriplet:

<%
String categorie=request.getParameter(“categorie”);
categorii=baza_date.obtineCategorii();
%>
239
Iniţializarea şi terminarea unui JSP se fac prin
intermediul metodelor: jspInit() – utilizată pentru
iniţializarea datelor şi jspDestroy() – folosită pentru
eliberarea resurselor.

Pentru formularea răspunsului pentru navigatoarele


Web se face apel la o serie de obiecte. Acestea sunt
create în cadrul paginii JSP sau sunt predefinite şi
pot avea următoarele domenii de vizibilitate:
 pagină (page) – obiectele sunt vizibile doar în cadrul
paginii curente;
 cerere (request) – obiectele pot fi accesate pe tot
parcursul rezolvării cererii: în pagina curentă, în
paginile care sunt incluse şi în paginile la care s-a
realizat redirectarea;
 sesiune (session) – obiectele vor fi disponibile de-a
lungul întregii sesiuni;
 aplicaţie (application) – obiectele sunt vizibile în
toată aplicaţia şi pentru toate sesiunile.
240
Tehnologia JSP pune la dispoziţia programatorilor o
serie de obiecte implicite:

241
Clasa JspWriter este abstractă şi derivată din java.io.Writer
şi conţine în plus metodele:
 print() şi println(), pentru afişarea tipurilor primitive, a
şirurilor de caractere şi a obiectelor;
 newLine() introduce caracterul pentru trecere la linie nouă;
 clear() şi clearBuffer(), pentru ştergerea informaţiilor din
buffer;
 flush() goleşte buffer-ul trimiţând datele la client;
 isAutoFlush() indică dacă buffer-ul este golit automat;
 getRemaining() returnează numărul de octeţi din buffer care
aşteaptă să fie trimişi;
 getBufferSize() returnează dimensiunea buffer-ului exprimată
în octeţi;
 close() închide fluxul;

De asemenea, clasa PageContext este abstractă şi extinde


clasa JspContext. Cea mai utilizată metodă este
getServletContext(), care permite accesarea contextului
servlet-ului obţinut în urma transformării paginii JSP curente.

242
7.5 Acţiuni şi componente
JavaBeans
Java, prin intermediul componentelor
JavaBeans, oferă posibilitatea utilizării
acestora de către instrumente de editare a
aplicaţiilor fără ca programatorul să intervină
direct în codul acestora.

În cazul aplicaţiilor Web nu este nevoie de


toate facilităţile şi restricţiile dictate de
JavaBeans. Cele mai importante aspecte ale
componentelor JavaBeans, în contextul
aplicaţiilor Web, sunt:
243
 Constructor fără parametri. Dintre toţi constructorii
clasei, trebuie să existe unul fără parametri sau să nu
fie definit nici unul, caz în care va fi creat automat
constructorul implicit.
 Nici un membru nestatic nu va fi public. Atributele
nestatice vor fi declarate protected sau private.
Eventual se poate utiliza modificatorul de acces
implicit (package). Pentru modificarea valorilor se vor
utiliza metode care să efectueze şi validări asupra
datelor (de exemplu, atributul varsta nu poate avea o
valoare negativă).
 Utilizarea de metode getter şi setter pentru accesarea
membrilor nestatici. Pentru obţinerea valorilor
atributelor de tip boolean se vor utiliza metode cu
prefixul is.

244
 Acţiunile sunt tag-uri JSP predefinite care folosesc varianta XML.
Cele care au echivalent în formatul specific JSP au fost
prezentate anterior (cele care încep cu <% şi se termină cu
%>). Pentru a utiliza o componentă JavaBeans în aplicaţiile
Web se va utiliza acţiunea jsp:useBean. Aceasta posedă
atributele din tabelul de mai jos:

245
În cazul în care o componentă cu acelaşi identificator există
deja în domeniul de vizibilitate specificat, se va utiliza respectiva
componentă şi nu se va mai crea una nouă. Nu se vor utiliza
niciodată simultan atributele class şi beanName, acestea
excluzându-se unul pe celălalt.

Declararea componentei:

<jsp:useBean id=”nume” class=”nume_pachet.nume_clasa”/>

este similară cu:

<% nume_pachet.nume_clasa nume=new


nume_pachet.nume_clasa(); %>

Pentru setare, avem la dispoziţie acţiunea jsp:setProperty.


Acesta prezintă atributele din tabelul următor:

246
247
Se va utiliza la un moment dat doar unul dintre
atributele param şi value. Atunci când se utilizează
atributul param, valoarea parametrului poate fi
preluată din câmpurile formularelor sau setată de
către alte pagini JSP sau servlet-uri care includ sau
redirectează către pagina JSP curentă.

Prima setare din exemplul de mai jos se realizează


pentru câmpul disponibila cu valoarea true (se
realizează un apel al metodei
setDisponibila(false)), iar la a doua se preia
valoarea din parametrul nume.

<jsp:setProperty name=”categ” property=”disponibila”


value=”false” />
<jsp:setProperty name=”categ” property=”denumire”
param=”nume” />
248
Pentru obţinerea valorii unui atribut al clasei
corespunzătoare componentei se utilizează acţiunea
jsp:getProperty. Atributele acestui marcator sunt:
name, care indică componenta, şi property, care
specifică numele datei membre (sau a proprietăţii)
pentru care se obţine valoarea.

Pentru accesarea datei membre denumire pentru un


obiect de clasă Categorie vom scrie:

<jsp:getProperty name=”categ”
property=”denumire” />

La procesarea exemplului se va apela metoda


getDenumire() pentru obiectul categ.

249
Componentele JavaBeans pot fi accesate şi în
expresiile cuprinse între ${ şi }. Acestea vor
fi evaluate în momentul execuţiei şi se vor
înlocui cu valorile rezultate.

<h3>${categ.denumire}</h3>
<p style=”color: ${optiuni.culoare}”>Bine ai
venit ${param.utilizator}!<p>

Expresiile de acest tip se pot utiliza şi în


interiorul tag-urilor, dar şi la valoarea
atributelor.

250

S-ar putea să vă placă și