Sabin Corneliu Buraga – Tehnologii Web Autorul acestei lucr ări – Dr. Sabin Corneliu Buraga – este cadru didactic la Facultatea de Informatic ă a… [631063]
Sabin Corneliu Buraga
TTeehhnnoollooggiiii WWeebb
2007
Sabin Corneliu Buraga – Tehnologii Web
Autorul acestei lucr ări – Dr. Sabin Corneliu Buraga – este cadru didactic la Facultatea
de Informatic ă a Universit ății „Alexandru Ioan Cuza” din Ia și, România, fiind titula-
rul cursurilor „Tehnologii Web”, „Semantic Web”, „Interac țiune om-calculator” și
„Rețele de calculatoare”. Este laureat al Premiului „Gheorghe Cârtianu” al Academi-
ei Române (2005) și coordonatorul seriei Web publicată de Editura Polirom.
Mai multe am ănunte privitoare la activit ățile sale sunt disponibile pe Web la adresa
http://www.infoiasi.ro/~busaco/ .
Materialul de fa ță, inclusiv figurile, nu poate fi folosit sau reprodus sub nici o form ă
decât cu acordul autorului, fiind protejat de legile în vigoare privitoare la drepturile
de autor.
De asemenea, autorul nu se face r ăspunzător pentru disponibilitatea și/sau acurate-
țea informa țiilor de la adresele Web indicate pe parcursul lucr ării.
2
Sabin Corneliu Buraga – Tehnologii Web
3 CCuupprriinnss
În loc de prefață… ……………………………………………………………………………………..5
Partea I – Internet și Web ……………………………………………………………………………7
1. Fundamente și istoric ………………………………………………………………………………9
2. Localizarea resurselor Web ……………………………………………………………………..18
3. Protocolul HTTP pe scurt ………………………………………………………………………23
4. Privire de ansamblu ……………………………………………………………………………….27
Partea II – Familia de limbaje XML …………………………………………………………….29
1. Preambul ……………………………………………………………………………………………..31
2. Caracterizare și trăsături esenț iale…………………………………………………………….32
3. Părțile componente ale unui document XML …………………………………………….34
4. Membrii constituen ți ai familiei XML ……………………………………………………….37
5. Spațiile de nume XML ……………………………………………………………………………41
6. Validarea documentelor XML …………………………………………………………………43
7. Procesarea documentelor XML ……………………………………………………………….54
8. Transform ări XML ………………………………………………………………………………..62
Partea III – Programarea aplica țiilor Web ……………………………………………………..71
1. Maniere de programare pe partea de server ………………………………………………..73
2. Standardul CGI ( Common Gateway Interface )…………………………………………………76
3. PHP ( PHP: Hypertext Preprocessor )……………………………………………………………..85
4. Servicii Web ……………………………………………………………………………………….110
Sabin Corneliu Buraga – Tehnologii Web
Partea IV – Reg ăsirea informa țiilor pe Web …………………………………………………121
1. Preliminarii …………………………………………………………………………………………123
2. Motoare de c ăutare ………………………………………………………………………………124
3. Meta-căutătoare …………………………………………………………………………………..135
4. Alte mijloace de reg ăsire a informa țiilor…………………………………………………..137
Exerciții și teme propuse ………………………………………………………………………….143
Resurse bibliografice ……………………………………………………………………………….147
4
Sabin Corneliu Buraga – Tehnologii Web
5
ÎÎnn lloocc ddee pprreeffaațțăă……
„Este mai bine s ă știi câteva întreb ări decât toate r ăspunsurile. ”
James Thurber
Acest material realizeaz ă o trecere în revist ă a principalelor tr ăsături referitoare la spaț iul
World Wide Web, punctând anumite aspecte de interes privitoare la arhitectura Web-ului,
la meta-limbajul XML (componente, spa ții de nume, validarea și transformarea documen-
telor XML), la proiectarea și programarea aplica țiilor Web (standardul CGI, serverul de
aplicații PHP, serviciile We b bazate pe XML) și la regăsirea informa țiilor disponibile pe
Web via motoare de c ăutare și alte mijloace.
Lucrarea reprezint ă numai o introducere în domeniul tehnologiilor Web actuale, o par-
te dintre subiectele men ționate fiind înso țite de prezent ări și exemple disponibile online la
http://www.infoiasi.ro/~b usaco/teach/courses/web/ .
Pentru aprofundarea domeniului, cititorul este încurajat s ă consulte resurse prezentate
în cadrul bibliografiei și să viziteze periodic situl Web al autorului textului de fa ță –
http://www.infoiasi.ro/~busaco/ .
Așteptăm posibilele reac ții și opinii pe adresa busaco@infoiasi.ro .
Sabin Corneliu Buraga – Tehnologii Web
6
Sabin Corneliu Buraga – Tehnologii Web
7 PPaarrtteeaa II –– IInntteerrnneett șșii WWeebb
„De la un anumit punct încolo, nu mai exist ă cale de întoarcere. Acela este punctul ce trebuie atins.”
Franz Kafka
1. Fundamente și istoric
2. Localizarea resurselor Web
3. Protocolul HTTP pe scurt
4. Privire de ansamblu
Sabin Corneliu Buraga – Tehnologii Web
8
Sabin Corneliu Buraga – Tehnologii Web
1. Fundamente și istoric
Conceptul esen țial al spațiului World Wide Web îl reprezint ă conceptul de comunicare , pe
care de altfel se bazeaz ă orice rețea de calculatoare. Înainte de a defini spa țiul World Wide
Web, trebuie precizat mai întâi ce înseamn ă o rețea de calculatoare, respectiv Internetul.
O rețea de calculatoare reprezint ă un ansamblu de calculatoare independente ca-
pabile să comunice între ele prin intermediul unor canale de comunica ție. Așadar,
o rețea poate fi privit ă drept colec ție de calculatoare autonome interconectate.
Luat în sine, Internetul este o rețea de rețele, prin care utilizatorii unui calculator sau ai
unei rețele pot accesa diverse sisteme apar ținând altor re țele.
Precursorul Internetului, ARPAnet (Advanced Research Projects Agency network ) a fost dez-
voltat la sfâr șitul anilor ’60 și începutul anilor ’70 de c ătre Departamentul de Apă rare al
Statelor Unite ca experiment în plin r ăzboi rece, după lansarea primului satelit artificial,
Sputnik. De la început, utilizarea re țelei în scopuri academice și pentru comunica ții științi-
fice a condus la o oarecare îndep ărtare de scopul ini țial – folosirea exclusiv ă în medii mili-
tare. Prima demonstra ție publică a rețelei ARPAnet a avut loc în 1972, soldat ă cu un
neașteptat succes, în ciuda scepticismului dezvoltatorilor ei. Acest aspect a stimulat activi-
tatea de cercetare, ap ărând curând noi re țele, iar programatorii fiind încuraja ți să adauge
noi facilități sistemului de operare Unix folosit la interconectarea re țelelor. Astfel, în me-
diul prielnic oferit de sistemul de operare Unix, au fost dezvoltate în aceast ă perioadă
primele protocoale de comunica ție, culminând în 1974 cu suita de protocoale TCP/IP
(Transmission Control Protocol/Internet Protocol ). Meritul acesteia este acela de a furniza o mo-
dalitate universală și standardizat ă de comunicare între re țelele de calculatoare, folosit ă și
în prezent pentru conectarea la Internet.
În anul 1980, NSF (National Science Foundation ) reproiecteaz ă modelul ARPAnet,
transformându-l într-o re țea modern ă, noua arhitectura primind numele de Internet, in-
terconectând la început super-calculatoare guvernamentale, institu ții academice și centre
de cercetare și utilizând suita standard de protocoale de comunica ție reprezentat ă de
TCP/IP (Transmission Control Pr otocol/Internet Protocol ). În anii care urmeaz ă, Internetul se
dezvoltă spectaculos, într-o manier ă exponenț ială, poate și datorită apariției unei variet ăți
de furnizori de servicii Internet comerciale, la nivel mondial, mai ales în cursul anilor ’90.
În România, o dezvoltare accentuată a Internetului, la toate nivelele, s-a produs începând
cu anii 1993-1994, dar mai ales dup ă 1996.
De reținut faptul c ă Internul nu este proprietatea nici unei persoane sau organiza ții,
aflându-se sub coordonarea unor societ ăți independente, constituite din voluntari, dintre
care se pot aminti ISOC (Internet Society ) sau IETF ( Internet Engineering Task Force ).
Serviciile tradiț ionale ale Internetului se rezumau în anii ’80 la po șta electronic ă (e-mail),
accesul la grupuri de știri ( usenet), conectare la distanță ( telnet) și transfer de fi șiere ( FTP).
9
Sabin Corneliu Buraga – Tehnologii Web
În 1990-1991 apar dou ă noi servicii (acum disp ărute): Archie utilizat pentru c ăutarea fișie-
relor pe Internet și Gopher , structură de meniuri ierarhizate fa cilitând organizarea docu-
mentelor pe Internet.
De notat faptul c ă funcționarea Internetului este reglementat ă de o serie de documente
disponibile în cadrul colec ției globale RFC (Request For Comments) – www.ietf.org/rfc/ .
O parte dintre aceste documente specific ă arhitectura și standardele protocoalelor de co-
municaț ie existente.
Începuturile Web-ului
Unul dintre cele mai importante și de succes servicii ale Internetului, World Wide Web –
ul – mai pe scurt, Web sau spațiul WWW – a fost instituit la CERN (Centre European pour
la Recherche Nucleaire – Centrul European de Cercet ări Nucleare de la Geneva) în anul
1989, pe baza cercet ărilor lui Tim Berners-Lee , Robert Caillau și echipei acestora, scopul
principal urm ărit fiind facilitarea accesului rapid la informaț iile tehnice cuprinse în ma-
nualele de utilizare a calculatoarelor. Robert Caillau accentueaz ă faptul că istoria fiecă rei
mari invenț ii se bazeaz ă pe multe evenimente anterioar e. În cazul Web-ului, dou ă mari
direcții precursoare trebuie menț ionate: dezvoltarea hipertextului (sau a proces ării compu-
terizate a documentelor electronice complexe) și dezvoltarea protocoalelor Internet care
au făcut posibil ă comunicarea global ă dintre rețelele de calculatoare.
Data de 12 noiembrie 1990 este considerat ă drept ziua de na ștere oficial ă a Web-ului.
CERN devenea astfel cel mai dezvoltat nod Internet al Europei.
Web-ul reprezint ă un sistem de distribu ție locală sau globală a informațiilor hipermedia .
Din punct de vedere tehnic, spa țiul Web pune la dispoziț ie un sistem global și standar-
dizat de comunicare multimedia, informa țiile fiind organizate asociativ și fiind distribuite
în funcție de cererile utilizatorilor, func ționând conform modelului client/server. Web-ul,
cu toată dezvoltarea lui spectaculoas ă, nu trebuie confundat cu Internetul, ci poate fi con-
siderat drept cea mai dinamic ă și spectaculoas ă component ă software a acestuia, nepu-
tând exista f ără infrastructura hardware a re țelelor mondiale interconectate prin interme-
diul protocoalelor TCP/IP.
Dezideratele principale ale sistemului propus de Tim Berners-Lee erau:
• accesul la distan ță într-o re țea, acceptându-se diverse tipuri de conexiuni;
• accesul la o multitudine de surse de informa ții stocate într-o varietate de forme
(text, grafic ă, sunet etc.) cu ajutorul unor tipu ri diferite de sisteme de operare
situate pe diferite platforme hardware;
• capabilități de extindere și dezvoltare în ceea ce prive ște aria de acoperire prin
creșterea num ărului de legă turi, fă ră existența unui control central.
Tim Berners-Lee concepe, de asemenea, prima aplicaț ie Web – un server Web rulând pe
calculatoare NeXT. În noiembrie 1990, Nicola Pellow începe s ă dezvolte un navigator
10
Sabin Corneliu Buraga – Tehnologii Web
(browser ) text care la sfâr șitul aceluia și an va fi disponibil în ca drul CERN. Primul client
grafic permi țând vizualizarea de documente WWW a fost WorldWideWeb .
Dezvoltarea ulterioar ă a Web-ului a fost facilitat ă de programul Mosaic (de la NCSA –
Centrul Na țional pentru aplica țiile supercalculatoarelor, Universitatea Urbana-
Champaign), rulând sub mediul XWindow (Unix). Acest navigator – elaborat în principal
de Marc Andreesen – era foarte simplu de folosit și poseda facilit ăți multimedia, fiind
furnizat gratuit pe Internet începând cu anul 1993. Ulterior, Marc Andreesen fondeaz ă
compania Netscape Communications, specializat ă în realizarea de aplica ții destinate Web-
ului, care – ulterior – a donat comunit ății open source codul-surs ă al navigatorului, peste ani
apărând astfel Mozilla Firefox .
În 1994 a fost constituit Consortiul Web , avându-l ca director pe Tim Berners Lee. Con-
sorțiul Web este o organiza ție non-profit, principala sa activitate constând în elaborarea,
dezvoltarea și menținerea standardelor destinate spa țiului WWW. Actualmente, Consor-
țiul Web însumeaz ă peste 500 de membri, atât organiza ții academice, corpora ții comercia-
le, cât și persoane particulare. Mai multe detalii sunt disponibile pe situl Web
www.w3.org .
Clienți și servere Web
În prezent, pentru a avea acces la WWW, utilizatorii trebuie s ă foloseasc ă un program
client – cunoscut sub denumirea de navigator – și, bineîn țeles, să cunoască localizarea fizi-
că a documentelor dorite (adresa acestora). Exist ă actualmente o multitudine de naviga-
toare, alături de binecunoscutele Netscape Communicator, Mozilla Firefox și Internet
Explorer (rulând în medii grafice precum Windows, XWindow (Unix/Linux) sau Apple)
numărându-se multe altele, chiar daca nu atât de populare: Opera, Konqueror, Lynx sau
Links (ultimele dou ă rulând doar în mod text, fiind disponibile mai ales sub Linux).
Principalele caracteristici ale na vigatoarelor Web grafice sunt:
• posibilitatea de a realiza interogă ri multiple c ătre serverele Web;
• asigurarea securit ății transmiterilor de date (de exemplu, în cazul comer țului
electronic sau pentru accesarea unor informa ții pe bază de autentificare);
• suport pentru aplicaț ii menite s ă extindă funcționalitatea navigatorului. O astfel
de extensie este denumit ă de cele mai multe ori plugin , putând fi configurat ă și
exploatată de către utilizator pentru accesarea unor tipuri speciale de date ( e.g.
lumi virtuale modelate în VRML, documente PDF sau anima ții Flash);
• stabilirea de liste de adrese ale unor situri Web favorite și oferirea posibilit ății
de a avea acces la istoricul navig ării (mecanismul de history );
• posibilitatea de a folosi mai multe ferest re (independente sau nu) de navigare;
• suportul pentru cadre ( frame-uri) sau vederi multiple în interiorul unei acelea și
ferestre;
11
Sabin Corneliu Buraga – Tehnologii Web
• posibilitatea configur ării de către utilizator a unor caracteristici ale modurilor
de afișare, navigare și exploatare (stabilirea preferin țelor utilizatorilor);
• asigurarea suportului pentru diverse limbaj e de programare folosite la realizarea
de documente Web dinamice ( i.e. Java sau JavaScript), pentru foi de stiluri ata-
șate datelor (în vederea îmbunăt ățirii modului de afișare) sau pentru stocarea
datelor în mai multe limbaje de marcar e (HTML, XHTML, limbaje bazate pe
XML etc.);
• integrarea unor aplica ții facilitând accesul la alte servicii Internet (po șta elec-
tronică, transferul de fi șiere, grupurile de știri) sau Web (precum c ăutarea de in-
formații, afiș area de nout ăți, accesarea în timp-real a programelor de radio sau
televiziune etc.).
O versiune a navigatorului Konqueror ru lând în mediul XWindow (sub Linux)
După cum se poate observa, Web-ul se bazeaz ă pe modelul de programare cli-
ent/server care divide aplica țiile de rețea în două părți: partea de client și cea de server.
Prin defini ție, clientul (în cazul nostru denumit și navigator sau agent-utilizator Web) so-
licită servicii (informa ții) de la componenta server. Serverul r ăspunde așadar cererilor cli-
enților.
12
Sabin Corneliu Buraga – Tehnologii Web
Modul de dialogare între clienț i și servere se realizeaz ă prin intermediul unei
mulțimi de reguli de comunicare prin re țea denumit ă protocol .
În cazul Web-ului, acest protocol este HTTP (HyperText Transfer Protocol ). HTTP repre-
zintă un protocol bazat pe stiva de protocoale TCP/IP. HTTP a început s ă fie proiectat
și folosit din anul 1990, dezvoltându-se împreun ă cu spațiul WWW. În prezent, este utili-
zată versiunea HTTP/1.1 care oferă funcționalități suplimentare, ca de exemplu suport
pentru identificatori uniformi de resurse – URI (Uniform Resource Identifier ). Acești identificatori
specifică adresele Web ca loca ție (prin URL – Uniform Resource Locator ) sau prin nume
(URN – Uniform Resource Name ). Identificatorii uniformi de resurse reprezint ă o modalita-
te flexibilă și eficientă de accesare a oric ărei resurse Internet, prin oricare protocol de
comunicare. Încorporând supor t pentru transferul de po ștă electronic ă, transferul de fi și-
ere sau accesul la grupuri de știri, HTTP este de asemenea utilizat și ca protocol generic
pentru comunicarea între agenț ii utilizator (navigatoare, robo ți Web etc.) și alte sisteme
disponibile pe Internet. În acest mod, HTTP permite accesul la resurse disponibile din
diverse aplica ții.
Numeroase detalii privitoare la protocolul HTTP pot fi g ăsite consultând c ăr-
țile S. Buraga, Tehnologii XML , Polirom, Ia și, 2006 și S. Buraga et al., Programare
Web în bash și Perl, Polirom, Ia și, 2002.
Ca orice serviciu Internet bazat pe modelul client/server, Web-ul trebuie s ă includă o
multitudine de servere Web . Cele mai cunoscute servere Web sunt Apache, Netscape
Enterprise Server , Sun Web Server, Microsoft Internet Information Services , Stronghold , Jigsaw (dis-
ponibile pe diverse platforme, în special Unix).
Situri Web
Calculatorul pe care ruleaz ă un server Web și care g ăzduiește o serie de pagini
(documente) WWW înrudite – ale unei organiza ții, companii sau persoane – se
mai nume ște și sit (site). Această colecție este orientat ă de obicei c ătre anumite in-
formații unitare sau scopuri comune.
Există două tipuri majore de situri Internet:
• situri Web – seturi de pagini Web corelate și resursele la care se refer ă acestea;
• situri FTP – servicii configurabile care furnizeaz ă acces la fi șiere publice (do-
cumentații, programe, informaț ii) prin intermediul protocolului FTP.
Un sit Web are asociat ă în general o adresă vizibilă oricărui utilizator din Internet (de
exemplu, www.info.uaic.ro este adresa sitului Facult ății de Informatic ă din Iași).
Un server Web poate gestiona simultan mai multe situri, oferind a șa-numita găzduire
virtuală (virtual hosting ). Acest lucru este util în situa ția în care o anumit ă organizație își
menține situl Web pe un alt server (de exemplu, pe serverul unui distribuitor de servicii
Internet – Internet Service Provider ).
13
Sabin Corneliu Buraga – Tehnologii Web
Un caz particular de disponibilitate a unui sit Web este în cadrul unui intranet , adică a
unei rețele interne – proprii unei companii sau organizaț ii – care folose ște tehnologiile
Internet. Situl Web dintr-un intranet nu este accesibil persoanelor din exteriorul organiza-
ției proprietare, ci exclusiv membrilor acesteia. Din acest punct de vedere, intranetul poa-
te fi privit ca fiind un mini-Inter net, restrâns la nivelul unei re țele locale. Companiile care
s-au slujit de facilit ățile intranetului au înregistrat economii importante datorit ă accesului
rapid la date și aplicații, comparativ cu problemele și costurile ce ar fi fost implicate de
distribuirea în scris a acestora în interiorul corpora ției.
Un sit Web poate fi disponibil și în cadrul extranetului – o extindere a facilit ăților intra-
netului prin mijlocirea comunica țiilor între intraneturile a dou ă sau mai multe organiza ții.
Avantajele cele mai atr ăgătoare sunt cele din domeniul afacerilor pe Internet, în sectorul
business-to-business (B2B).
O aplicație Web reprezint ă o colecție interconectat ă de pagini Web cu conț inut
dinamic menit ă a oferi o funcț ionalitate specific ă utilizatorilor.
Natural, interac țiunea dintre aplicaț ie și utilizatori are loc prin intermediul unei interfe-
țe Web. Deseori, termenii de sit și aplicaț ie Web sunt folosi ți unul în locul celuilalt, pen-
tru a desemna acela și concept.
Drept exemple de aplica ții Web pot fi enumerate Amazon , Basecamp , eBay, Expedia ,
Flickr , Google Maps , PHPMyAdmin , Wikipedia, Yahoo! și multe altele.
Hipermedia
Alături de modelul client/server, al doilea concept important pe care s-a putut construi
Web-ul este cel de multimedia.
În esență, multimedia reprezintă o sumă de diverse medii de comunicare: statice
(text, imagini precum fotografii, diagrame sau grafice) și dinamice (sunet, anima-
ție, filme). Dac ă la acest con ținut informa țional se adaug ă și capabilit ăți de a reali-
za diverse leg ături (relații) între părțile componente ale documentelor multimedia,
ceea ce rezult ă se numește hipermedia sau hipertext (termen ap ărut în anul 1965, în
urma cercet ărilor întreprinse de personalit ăți precum Vannebar Bush, Douglas
Engelbart și Ted Nelson).
În anul 1965, Ted Nelson inventeaz ă termenul hipertext (text non-linear), definindu-l
drept „material scris sau grafic interconectat într-o manier ă complexă care în mod con-
vențional nu poate fi reprezentat pe hârtie. El poate conț ine cuprinsuri ale propriului s ău
conținut și relațiile dintre diverse p ărți componente; poate de asemeni con ține adnotă ri,
adăugiri și note de subsol pentru cei care doresc s ă-l examineze”.
Definițiile hipertextului sunt diverse. O prim ă definiție ar fi aceea c ă hipertextul repre-
zintă o formă de document electronic. O alta, alternativ ă, specifică hipertextul ca repre-
zentând o metodă de organizare a informa țiilor în care datele sunt memorate într-o re țea
de noduri și legături, putând fi accesat ă prin intermediul navigatoarelor interactive și ma-
nipulată de un editor structural.
14
Sabin Corneliu Buraga – Tehnologii Web
Hipertextul semnific ă o tehnică pentru organizarea informa ției textuale printr-o meto-
dă complexă neliniară în vederea facilit ării explorării rapide a unei cantit ăți mari de cuno ș-
tințe. Conceptual, o baz ă de date hipertext poate fi gândit ă ca un (di)graf, unde fiecare
nod poart ă un fragment de text și unde arcele grafului conecteaz ă unele fragmente de text
cu altele înrudite. Pentru a vizua liza textul dintr-o astfel de baz ă de date, utilizatorul se va
folosi de o interfa ță, traversând legă turile.
Conceptul esen țial prezent în cadrul hipertextului este cel al legăturilor (care apar în ca-
drul aceluia și document și/sau între documente diferite). Aceast ă caracteristic ă de legare
permite organizarea non-linear ă a informa țiilor.
O parte dintre avantajele hipertextului fa ță de textul tip ărit sunt:
– forma neliniar ă a hipertextului ofer ă facilități eficiente de parcurgere a con ți-
nutului;
– mediile electronice pot stoca o cantitate impresionant ă de informa ții;
– hipertextul ofer ă o mai bun ă vizualizare a con ținutului și o navigare rapid ă,
oricât de complexe ar fi documentele, ț inând cont de specifica țiile utilizatori-
lor;
– în cadrul sistemelor hipertext, interog ările, filtră rile, diversele preferin țe și ad-
notările utilizatorilor pot fi refolosite or i de câte ori este necesar, putând fi
stocate în cadrul structurii hipe rtext a documentelor folosite.
Principalele probleme cu care se confrunt ă informaticienii în ceea ce prive ște hipertex-
tul sunt cele legate de:
• conversie (în general automat ă) a textului liniar în form ă hipertext și liniarizare a hi-
pertextului;
• proiectare (design) a documentelor hipertext;
• accesare concurent ă a bazelor de date hipertext în context distribuit;
• construire a unor mecanisme optime pentru căutarea și interogarea în manier ă inteli-
gentă a informa țiilor hipertext;
• suportare a extensiilor multimedia ;
• prezentare a documentelor hipertext într-o form ă ușor de parcurs de c ătre utiliza-
tori etc.
15
Sabin Corneliu Buraga – Tehnologii Web
O structur ă hipertext compus ă din mai multe noduri
și modul de vizualizare fo losind un browser hipertext
În principiu, un sistem hipermedia este constituit din noduri (concepte) și legături (rela-
ții). Un nod reprezint ă, în mod uzual, un concept unic (o idee), putând con ține text, gra-
fică, animație, audio, video, imagini sau programe. Un nod poate avea asociat un tip (de-
taliu, propozi ție, colecție, observa ție etc.) înglobând o informa ție semantic ă. Nodurile
sunt conectate de alte noduri prin intermediul legăturilor. Nodul surs ă al unei leg ături se
numește referință, iar cel destina ție referent , fiind denumite și ancore . Conț inutul unui nod se
afișează la activarea leg ăturii.
Legăturile sunt conexiuni între noduri (sau concepte) dependente unul de altul, putând
fi bidirecționale sau doar unidirec ționale . Legă turilor li se pot asocia tipuri, definind natura
relației dintre noduri. Leg ăturile pot fi referențiale (non-ierarhice, utile pentru realizarea re-
ferințelor încruci șate, ele fiind cele care deosebesc cel mai bine hipermedia de celelalte
forme de stocare a informa ției) sau organizaționale (denumite ierarhice sau structurale, ilus-
trând relațiile părinte-copil dintre noduri, folosite la organizarea nodurilor în manier ă ie-
rarhică într-o structură strictă). Legă turile organiza ționale sunt esen țiale pentru liniariza-
rea hipertextului și permit autorilor s ă verifice coerenț a structurii hipertext.
De asemenea, leg ăturile pot fi statice (stabilite de autorul documentului) sau dinamice
(create în momentul rulării sistemului hipertext, în func ție de context sau de cerin țele uti-
lizatorilor). Ele pot fi utilizate, de exemplu, pentru a încorpora proceduri de securitate (o
legătură poate fi disponibil ă doar pentru un anumit utilizator autentificat) ori s ă permită
utilizatorilor s ă-și creeze legă turi personale între diverse noduri care în mod uzual nu sunt
conectate direct.
Activarea marcajelor unei leg ături duce la vizualizarea (activarea) nodurilor.
Înțelegerea și navigarea printr-un document de ti p hipertext depind de abilitatea utili-
zatorului de a construi o reprezentare mental ă coerentă a structurii hipertextului, r ămâ-
nând în responsabilitatea creatorului documentului s ă asigure aceast ă coerență. Construi-
rea unui document hipertext coerent poate fi considerat ă o problem ă de design, f ără a
exista însă legi pentru conceperea de documente hipertext „corecte”, de și unii cercet ători
au stabilit o serie de reguli pentru aceasta. Astfel, un document hipertext coerent const ă
16
Sabin Corneliu Buraga – Tehnologii Web
din trei componente: partea de con ținut, partea de organizare și partea de prezentare a informa ții-
lor.
Una dintre solu țiile de a crea documente hipertext este oferit ă de limbajul de marcare
HTML ( HyperText Markup Language ), apărut încă de la începuturile Web-ului, în prezent
regăsit sub versiunea XHTML. Marcajele HTML descriu structura logică a documentului,
urmând a fi procesate de că tre programul client (de cele mai multe ori, un navigator). Un
astfel de document poate cuprinde leg ături de tip hipertext, indicate prin zone de text sau
imagini, conducându-l pe utilizat or fie în alt punct al aceluia și document, fie într-un alt
document, care poate s ă se găsească stocat local (pe serverul curent) sau la distan ță (pe
oricare alt sit Web din lume). Un document marcat se nume ște pagină Web.
Documentele pot include elemente multimedia variate datorit ă facilităților puse la dis-
poziție de diferitele versiuni ale limbajului HTML care prev ăd inserarea de imagini (for-
mate grafice precum GIF, JPEG sau PNG), fi șiere audio (MIDI, WAV ori MP3) și video
(AVI, ATF, MPEG), precum și alte informaț ii în formate proprietare sau nu ( e.g., arhive,
documente PDF, anima ții Flash, lumi virtuale VRML).
Îmbinarea dintre marcajele HTML și diverse linii de cod scrise în alte limbaje de pro-
gramare (JavaScript, VBScript – pe partea client; C/C++, C#, Perl, PHP, Python sau
Java – pe partea server) confer ă Web-ului interactivitate sporit ă și dinamism, caracteristici
exploatate mai ales în contextul e-business , dar nu numai.
Aceste legă turi încruci șate între sutele de mii de situri Web realizeaz ă o adevărată pân-
ză de păianjen ( web) planetar ă (world-wide ) de unde provine și denumirea WWW, iar utiliza-
torul navigheaz ă prin ciberspa țiul reprezentat de aceast ă rețea complex ă.
În ultimii zece ani, Web-ul s-a dezvoltat exploziv, asimilând și un nou aspect: nu se mai
limitează la schimbul de informa ții științifice între cercet ători, ci a devenit domeniu pu-
blic, extinzându-se foarte mult în lumea afacerilor. Astfel, Web-ul poate fi considerat
segmentul Internet cu cea mai rapid ă dezvoltare.
Dacă Internetul este o re țea de rețele, format din calculatoare și medii de transmisie ca-
re transport ă pachete de date de la un calculator la altul, Web-ul reprezint ă un spațiu ab-
stract de informa ție. Pentru Internet, conexiunile sunt reprezentate de canalele de comu-
nicație (cu fir sau f ără fir) între calculatoare, iar pe Web conexiunile sunt ilustrate prin
legături hipertext. Web-ul exist ă datorită aplicațiilor care asigură comunicarea în cadrul
Internetului și a făcut din Internet un spa țiu public, liber de constrângeri, universal și ușor
de utilizat.
17
Sabin Corneliu Buraga – Tehnologii Web
2. Localizarea resurselor Web
Localizarea informaț iilor în Internet se realizeaz ă apelându-se la așa-numi ții identificatori
uniformi de resurse – URI (Uniform Resource Identifiers ).
Este considerată resursă orice entitate având identitate, de exemplu un docu-
ment electronic, o imagine, un serviciu ( i.e. serviciul de po ștă electronic ă), o colec-
ție de alte resurse.
Nu toate resursele pot fi accesate direct pe Internet, de vreme ce pot fi considerate
drept resurse (non-electronice) și ființele umane, organiza țiile, volumele dintr-o bibliotec ă
etc. O resurs ă se poate menț ine constant ă în timp, de și conținutul ei – entit ățile cărora ea
le corespunde – se poate modifica. Pentru fa cila lor localizare, resursele sunt desemnate
printr-un identificator (în cazul Internetului, identificatorii reprezint ă o secvență de caracte-
re având o sintax ă bine-definit ă, după cum vom vedea mai jos). Pentru ca diverse tipuri
de identificatori de resurse s ă poate fi utilizate în același mod, s-a recurs la folosirea unor
scheme uniforme de identificatori. Acest principiu adoptat asigur ă independen ța de meca-
nismul (protocolul) folosit pentru accesarea resurselor, permi țându-se astfel interpretarea
într-o manier ă uniformă a mai multor conven ții sintactice desemnând identificatori ai
unor resurse eterogene. Mai mult, pot fi introd use noi tipuri de identificatori de resurse
fără a fi modificat modul de adresare a vechilor tipuri.
Identificatorii uniformi de resurse pot fi diviza ți în două categorii:
• localizatori uniformi de resurse – URL (Uniform Resource Locator ) care identific ă
resursele printr-o reprezentare a mecanismului de accesare a lor ( e.g. localizarea
unor resurse prin intermediul adresei calculatorului pe care este stocat ă și a rețelei
din care face parte acel co mputer), nu prin nume sau alte atribute (vezi mai jos);
• nume uniforme de resurse – URN (Uniform Resource Name ) ce permite specifi-
carea unei resurse chiar dac ă resursa a disp ărut ori a devenit inaccesibil ă, prin in-
termediu unui nume care r ămâne permanent și unic. URN-ul se utilizeaz ă mai
ales pentru a desemna entit ăți folosite de anumite aplica ții Web. Ca exemple de
URN-uri putem men ționa:
– urn:mozilla:package:communicator
– urn:schemas-microsoft-com:datatypes
Drept exemple de URL-uri, le putem descrie pe urm ătoarele:
• http://www.infoiasi.ro/~busaco/cv.html – se identific ă resursa
reprezentată de documentul Web cv.html prin intermediul acestui URL, via o
schemă http asociată serviciilor protocolului de transfer a hipertextelor ( HTTP –
HyperText Transfer Protocol );
• ftp://ftp.uaic.ro/pub/Readme.txt – se utilizeaz ă o schemă ftp pen-
tru serviciile protocolului de transfer de fi șiere ( FTP – File Transfer Protocol );
18
Sabin Corneliu Buraga – Tehnologii Web
• mailto:busaco@infoiasi.ro – contul unui utilizator Internet se speci-
fică printr-o schem ă mailto pentru poșta electronic ă.
Un URL este compus din urm ătoarele componente principale:
protocol://domeniu /cale?șir_de_interogare
Componentele protocol (de cele mai multe ori http , specificând utilizarea protoco-
lului HTTP pentru accesarea resurselor Web) și domeniu sunt obligatorii.
Componenta domeniu reprezint ă în mod uzual numele unui server Web de pe care
dorim să accesă m o pagin ă WWW (a unui sit), identificând într-o manier ă unică un calcu-
lator conectat la Internet. Domeniul poate fi specificat printr-un șir de patru octe ți des-
părțiți de punct, șir denumit adresă IP (de exemplu: 193.231.30.225 ), sau prin numele
simbolic – mai u șor de reținut – corespunz ător adresei IP, asociat unui calculator (adresei
IP dată mai sus îi corespunde numele thor.info.uaic.ro ). Numele simbolic reprezin-
tă un șir de identificatori de domenii sau de sub-domenii și de calculatoare ale unui
(sub)domeniu.
Ierarhia de domenii de nume – primul nivel este cel al domeniilor primare
Domeniile primare (principale) sunt cele ap ărute la începuturile Internetului (de obicei
localizate în Statele Unite ale Americii, dar nu obligatoriu):
• .com desemneaz ă o companie sau organiza ție comercială – .ibm.com sau
.jclark.com ,
• .org reprezint ă o organiza ție non-profit – de exemplu, .w3.org (Con-
sorțiul Web) ori .oasis-open.org ,
• .gov specifică domeniul unei organizaț ii guvernamentale (americane) –
.whitehouse.gov ,
• .mil desemneaz ă o organiza ție militară – .dmso.mil sau .navy.mil ,
19
Sabin Corneliu Buraga – Tehnologii Web
• .net reprezint ă o organiza ție cu preocupă ri în domeniul re țelelor de cal-
culatoare și al Internetului – .uu.net ori .php.net ,
• .int desemneaz ă o organiza ție internațională – .greenpeace.int ,
• .edu specifică domeniul unei organiza ții din spa țiul academic, educativ
(de origine american ă) – .uiuc.edu ori .stanford.edu .
Tot domenii primare sunt considerate domeniile corespunz ătoare statelor lumii, codi-
ficate conform codului rutier. De exemplu, .ro corespunde României, .de este specific
Germaniei, .jp asociat Japoniei etc. Mai recent, au ap ărut domenii primare noi precum
.ws (denumire provenind de la World Site) specific siturilor Web comerciale, .biz dedicat
activităților de afaceri Internet ( e-business ) sau .info pentru siturile Web informaț ionale
(de exemplu, www.schemaweb.info ).
În România autoritatea care se ocupă cu înregistrarea și reglementarea domeniilor .ro
din țara noastr ă este Rețeaua Națională de Calculatoare (RNC ) – www.rnc.ro . Înregistrarea
unui domeniu .ro se poate realiza direct la RNC sau la unul dintre partenerii acestuia,
persoana care a înregistrat domeniul purtând r ăspunderea pentru eventualele conflicte
apărute. Institu ția RNC poate suspenda sau anula dreptul de folosin ță al unui domeniu, în
condițiile sesizării existenț ei unor litigii pe rol, folosirii inadecvate a numelui de domeniu
sau dacă datele despre organizaț ia sau persoana care a înregistrat domeniul respectiv sunt
false ori incorecte etc.
Fiecare domeniu primar va avea în jurisdic ție o serie de sub-domenii, corespunzând
diverselor organiza ții, companii și persoane care fac parte din acel domeniu. Un sub-
domeniu poate fi compus din sub-sub-d omenii sau din nume simbolice de ma șini conec-
tate la Internet. De exemplu, este u șor de înț eles că adresa www.infoiasi.ro corespun-
de calculatorului www (serverul Web) din sub-domeniul infoiasi al domeniului .ro. Un
calculator poate avea asociate mai multe nume simbolice (serverul thor are asociat și
numele www, denumit și alias, pentru servicii de tip World-Wide Web, dar și alias-ul ftp
pentru servicii de transfer de fi șiere via FTP). A șadar, www.infoiasi.ro este identic cu
thor.infoiasi.ro sau cu ftp.infoiasi.ro .
Pentru a vizita pagina principal ă a serverului (sitului) Web al Facult ății de Informatic ă
din Iași se va folosi URL-ul urm ător: http://www.infoiasi.ro . La fel de bine, se pu-
tea utiliza http://193.231.30.225 , dar se preferă numele simbolice pentru c ă sunt
mult mai u șor de reținut și în plus sunt independente de adresa IP stabilit ă (mai mult, pot
exista adrese IP multiple asociate cu acela și nume simbolic).
Coresponden ța dintre numele simbolic și adresa IP a unui calculator este facilitat ă de
un serviciu denumit DNS (Domain Name System ) – sistemul numelor de domenii .
Mai multe detalii în cartea S. Buraga, Proiectarea siturilor Web (ediția a II-a),
Polirom, Ia și, 2005.
Dacă se dorește accesarea unei anumite resurse (fi șier) memorat ă pe un server Web, va
trebui ca în cadrul URL-ului, imediat dup ă domeniu să fie specificat ă calea pân ă la acea
20
Sabin Corneliu Buraga – Tehnologii Web
resursă , adică șirul de nume de directoare, terminat eventual cu numele fi șierului dorit.
Directoarele vor fi desp ărțite de caracterul „ /”, ca în exemplul urm ător:
http://www.infoiasi.ro/eurolan/euro95.html . Acest URL indic ă resursa desem-
nată de documentul HTML euro95.html , resursă aflată în directorul eurolan localizat
în directorul r ădăcină al sitului Web www.infoiasi.ro . Dacă la sfârșitul unei c ăi de di-
rectoare nu este specificat numele unui fi șier, va fi înc ărcată o pagină implicită (denumit ă
și pagină index ) al cărui nume este dependent de serverul Web opera țional pe calculatorul
accesat sau de modul de configurare a acestuia (ca exemple standard, pot fi men ționate
index.html pentru un server Apache ori default.htm pentru Microsoft IIS). Dac ă un
nume de director sau de fi șier include caracterul spa țiu sau un alt caracter rezervat, aces-
tea vor fi substituite de codul în baza 16 al caracterului în cauz ă, precedat de „ %” (de pil-
dă, adresa www.infoiasi.ro/docs/Pagina Web.html v a f i t r a n s f o r m a t ă în
www.infoiasi.ro/docs/Pagina%20Web.html , ținând cont c ă spațiul are codul 32 în
baza 10, adic ă 20 în baza 16).
Alte simboluri ce pot fi întâlnite în componen ța unui URL sunt:
• caracterul „ #” (la finalul URL-ului) determin ă poziționarea într-o anumită sec-
țiune a resursei. De exemplu:
http://www2002.org/CDROM/refereed/481/index.html#SunOne ;
• caracterul „ ~” indică pagina personal ă a unui utilizator care posed ă cont pe
serverul precizat în URL (caracterul tilda semnifică directorul home al acestui
utilizator pe o ma șină Unix/Linux). De exemplu,
http://www.infoiasi.ro/~busaco/teach/ va desemna pagina in-
dex.html stocată în directorul teach aflat în directorul Web al directorului
home aparținând utilizatorului cu numele busaco de pe ma șina cu numele sim-
bolic www.infoiasi.ro .
• caracterul „ ?” prefixeaz ă un șir denumit șir de interogare con ținând anumite in-
formații transmise resursei accesate. De mult e ori, URL-urile pot include refe-
riri la resurse care nu reprezint ă documente propriu-zise, ci programe (i.e.,
script-uri) executate de serverul Web. Aceste programe pot fi, de exemplu,
script-uri CGI (Common Gateway Interface ) având în mod uzual extensia .cgi ,
programe PHP cu extensia .php sau alte tipuri de aplica ții executate pe server
(i.e. servlet-uri Java, programe ASP.NET etc.). Șirul de interogare prefixat de
„?” reprezint ă tocmai datele de intrare transmise unui astfel de program. Ast-
fel, pentru a c ăuta paginile Web con ținând cuvântul „Dali” vom putea scrie
http://www.altavista.com/cgi-bin/query?pg=q&what=web&q=Dali ,
apelând la motorul de c ăutare Altavista. Acest șir de interogare nu poate conț i-
ne caracterele ;, /, ?, :, @, &, =, +, , și $, ele fiind codificate în baza 16 și prefi-
xate de simbolul %.
URL-urile pot fi utilizate, de asemenea, și pentru accesarea fi șierelor locale, aflate pe
calculatorul pe care ruleaz ă și navigatorul Web. În acest scop se va folosi schema file ,
21
Sabin Corneliu Buraga – Tehnologii Web
ca în exemplul urmă tor: file:///C:/Temp (navigatorul va afi șa conținutul directorului
Temp de pe discul C: al unui calculator rulând sub sistemul de operare Windows). Un
URL similar, în cazul Unix (Linux), ar fi file:///tmp/ .
De menț ionat faptul că pot exista și alte scheme URL nestandardizate, ca de exemplu
man utilizată de navigatorul Nautilus pentru a accesa documenta țiile de sistem Linux pro-
cesate în mod uzual de comanda man. Astfel, pentru a consulta paginile de manual ale
shell-ulului bash , se poate folosi URL-ul man:bash , în locul comenzii man bash .
22
Sabin Corneliu Buraga – Tehnologii Web
3. Protocolul HTTP pe scurt
Dată fiind importan ța protocolului HTTP, în continua re vom realiza o trecere în revist ă a
caracteristicilor sale importante.
Protocolul HTTP, standardizat de documentul RFC 2616, este folosit în special pentru
hipertext, dar poate fi considerat drept protocol generic, baza comunic ării într-un sistem
distribuit de management al datelor, în cazul WWW fiind vorba în principal de facilitarea
transferului de date între clien ții și serverele Web. Fiind un protocol utilizat în Internet,
HTTP se situeaz ă la nivelul de aplica ții al stivei de protocoale TCP/IP ( Transmission Con-
trol Protocol/Internet Protocol ), putând fi considerat fiabil ( reliable ).
Concepte fundamentale
Conceptele de baz ă sunt cererea și răspunsul : un client Web trimite un mesaj (cererea) la un
server. Mesajul conține identificatorul resursei dorite, dat sub forma unui URI, metoda de
acces folosit ă, versiunea protocolului, precum și o serie de meta-informaț ii care pot fi uti-
le serverului. Răspunsul serverului cuprinde un cod indicând starea serverului dup ă inter-
pretarea cererii, un mesaj explicativ pent ru codul de stare transmis, meta-informa țiile care
vor fi procesate de c ătre client și, eventual, un con ținut ( e.g., resursa solicitat ă).
În general, o sesiune de comunicare HTTP este iniț iată de către client și constă din so-
licitarea unei resurse (o pagină Web, uzual) identificate unic pe un server cunoscut. Aces-
ta este numit și server de origine datorită faptului c ă în comunicarea între client și server pot
să apară unul sau mai mulț i intermediari: proxy (numit și server proxy ), poartă (gateway ) sau
tunel (tunnel ). Un proxy reprezintă un intermediar care retrimite un mesaj HTTP, eventual
modificând o parte a sa. Poarta semnific ă un intermediar care se poate situa înaintea unui
server de origine și să se identifice drept acesta, client ul Web necunoscând acest aspect.
Tunelul este un intermediar care nu schimb ă conținutul mesajului, ci are rol exclusiv de
retransmitere a lui; de exemplu, tunelul poate fi folosit pentru (de)criptarea mesajelor ve-hiculate între server și client, în cadrul unui intranet/extranet.
Un alt concept important este cel de cache , desemnând un depozit local de stocare (în
memorie, pe disc) a mesajelor (datelor) la nivel de server/client. Un proxy deține obligato-
riu un cache , denumit și sistem de cache .
Un exemplu tipic de cerere-r ăspuns este urm ătorul, în care cererea – formulat ă, intern,
de un browser – are forma:
GET /catalog_produse.html HTTP/1.1
Host: www.portocale.info
User-Agent : Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.0.5) Gec-
ko/20060719 Firefox/1.5.0.5
Accept: text/html, image/gif, image/jpeg, */*
Accept-Language : en-us
Accept-Encoding : gzip, deflate, compress, identity
Connection : Keep-Alive
23
Sabin Corneliu Buraga – Tehnologii Web
Un posibil r ăspuns – obț inut din partea serverului Web – ar putea fi urm ătorul (am
omis conț inutul propriu-zis al documentului solicitat):
DateTue, 22 Aug 2006 07:17:13 GMT :
Server: Apache/2.0.54 (Win32) PHP/5.0.4
Accept-Ranges : bytes
Content-Length : 201
Keep-Alive : timeout=15, max=74
Connection : Keep-Alive
Content-Type : text/html; charset=ISO-8859-1
…
Maniera de codificare a con ținutului
Pentru ca datele să fie corect interpretate de toate entit ățile participante la conversa ția
prin rețea, indiferent de platforma hardware și software, ele trebuie s ă respecte aceea și
codificare.
Astfel, se define ște conceptul de set de caractere , pentru a putea interpreta corect datele
schimbate via protocolul HTTP între dou ă platforme diferite ( e.g., un server rulând pe un
sistem Linux cu un navigator Web de pe un dispozitiv mobil), având reprezent ări diferite
ale datelor. Informa ția e transmis ă sub forma unui șir de caractere urmând ca entitatea de
la celălalt capă t, folosind indicaț iile despre setul de caractere, s ă realizeze transformarea
din șir de octe ți în șir de caractere. Setul de caractere implicit este ISO-8859-1, dar exist ă
o multitudine de alte seturi (de exemplu, ISO-8859-2 denumit și Latin-2, care ofer ă prin-
tre altele și reprezentarea diacriticelor din limba român ă).
Protocolul HTTP respect ă seturile de caractere definite de specifica țiile MIME
(Multipurpose Internet Mail Extensions ) descrise în documentele RFC 2045 și 2046. Conform
standardului MIME, pentru fiecare resurs ă în parte se specific ă tipul și subtipul acesteia.
De exemplu, text/html pentru un document HTML, text/plain în cazul unui document
text neformatat, image/png pentru o imagine în format PNG, application/soap+xml pentru
mesajele SOAP etc.
De asemenea, mesajele pot fi codi ficate prin diverse metode precum gzip ori compress , în
vederea comprimă rii sau asigur ării identității și/sau integrit ății.
Mesajele HTTP
Cererile și răspunsurile HTTP sunt vehiculate prin inter mediul mesajelor. Astfel, mesajele
HTTP sunt considerate de două tipuri: cerere provenit ă de la un client c ătre un server și
răspuns al serverului, trimis la acel client . Un mesaj e compus dintr-o succesiune de linii
de text, delimitate de caracterele CRLF ( Carriage Return și Line Feed ). Prima linie semnific ă
o cerere efectuat ă de un client sau un cod de stare ob ținut de la server, urmat ă de un nu-
măr de atribute de antet.
Un antet ( header ) conține mai multe atribute care sunt folosite la completarea unei ce-
reri sau a unui r ăspuns cu meta-informa ția necesar ă interpretă rii corecte a mesajului prin
stabilirea unor valori specificate de c ătre protocolul HTTP sau a unor protocoale definite
24
Sabin Corneliu Buraga – Tehnologii Web
de utilizator (de exemplu, SOAP). Un atribu t este furnizat printr-un nume urmat de „ :”
și de o valoare (opț ională, în unele cazuri).
O cerere este specificat ă de o metod ă de acces, cele mai folosite fiind descrise în conti-
nuare.
Metoda GET reprezintă o cerere de accesare a unor informa ții (reprezent ări de resur-
se). Un client HTTP (navigator, robot, program de desc ărcare, agregator de știri, player
multimedia etc.) folose ște metoda GET pentru a ob ține o anumit ă resursă , fie că ea re-
prezintă un fișier (document text, HTML, imagine PNG sau JPEG, aplica ție, arhivă , do-
cument XML etc.), fie c ă indică execuț ia pe serverul Web a unui proces care va produce
datele dorite ( e.g., invocarea unui script CGI sau a unui program PHP);
HEAD este similar ă cu metoda GET, dar serverul va întoarce un mesaj având infor-
mații doar în antet. Meta-datele din anteturile HTTP din r ăspunsul la o cerere HEAD vor
fi identice cu cele din r ăspunsul la o cerere GET. Utilitatea acestei metode const ă în obți-
nerea meta-datelor asociate unei resurse Web f ără a transfera efectiv întreaga entitate, în
vederea – de exemplu – a test ării existenț ei resursei, a obț inerii datei ultimei modific ări
sau furnizarea drepturilor de acces;
Metoda POST este utilizat ă pentru a identifica dac ă serverul accept ă o entitate îngloba-
tă în cadrul cererii. POST este proiectat ă să implementeze o metod ă uniformă pentru
funcții precum adnotarea resurselor, trimiterea datelor unui formular Web c ătre server,
extinderea unei baze de date printr-o opera țiune de inserare, invocarea unui serviciu etc.
În cadrul unei cereri, pot fi specificate dive rse atribute, utilizate pentru a transmite ser-
verului informa ții suplimentare privitoare la acea cerere și la client. Se poate face o analo-
gie între trimiterea unei metode HTTP cu apelul unei func ții dintr-un limbaj de progra-
mare, unde atributele reprezint ă parametrii de intrare.
După primirea și interpretarea unui mesaj de tip cerere și interpretarea lui, un server
HTTP ră spunde cu un mesaj denumit r ăspuns. Prima linie conț ine versiunea protocolului
HTTP implementat de c ătre server și continu ă cu un cod de stare reprezentând un num ă-
rul asociat de c ătre specificaț ia HTTP unei anumite situa ții a serverului în urma trată rii
unei cereri. Urmeaz ă un text explicativ pentru codul de stare, menit s ă clarifice situa ția
exprimată de codul de stare.
Codul de stare este format din trei cifre organizate în categorii de st ări; codurile din ace-
eași categorie se refer ă la stări similare.
Ele se disting dup ă prima cifr ă în modul de mai jos.
Codurile de informare ( 1xx) furnizeaz ă informații privitoare la o anumit ă acțiune (cererea
a fost primit ă, comunica ția continu ă). De exemplu: 100 Continue (clientul poate continua
cererea, trebuind s ă trimită următoarea parte a unui mesaj par țial).
Codurile de succes (2xx) raportează efectuarea cu succes a unei opera țiuni (cererea a fost
primită, interpretat ă și acceptat ă de către server). Un cod tipic din aceast ă categorie este
25
Sabin Corneliu Buraga – Tehnologii Web
200 OK (cererea a fost rezolvat ă cu succes). Alt exemplu este 204 No Content (serverul a
rezolvat cererea, dar nu are ce returna clientului).
Codurile de redirec ționare (3xx) indică o redirecționare a cererii spre alt ă locaț ie ori alt ser-
ver. Drept exemple, men ționăm codurile 301 Moved Permanently (resursa solicitat ă a fost
asociată unui URI nou și orice referință viitoare la ea trebuie să se realizeze prin acest
URI furnizat) și 302 Moved Temporarily (resursa cerut ă are asociat un alt URI, dar pentru o
perioadă temporar ă).
Codurile de eroare provocate de client (4xx) specifică apariția unei erori pe partea clientului
(fie cererea este incorect ă din punct de vedere sintactic, fie nu poate fi satisfă cută din varii
motive). Ca exemple, furniz ăm 401 Unauthorized (cererea necesit ă autentificarea utilizato-
rului – e.g. , via unui nume de cont urmat de o parol ă) și 403 Forbidden (serverul a recep țio-
nat o cerere corectă , dar refuz ă să o satisfac ă din diverse motive legate de restric ționarea
accesului). Un alt cod tipic, des întâlnit, este 404 Not found (serverul nu gă sește resursa
specificată).
Codurile de eroare generate de server (5xx) desemneaz ă coduri semnificând o eroare pe par-
tea serverului (cererea este aparent corect ă, dar serverul nu o poate îndeplini din anumite
motive). Ca exemplificare, men ționăm 503 Service Unavailable (serverul Web nu poate sa-
tisface cererea – e.g., din cauza supraîncă rcării temporare sau din raț iuni de administrare).
26
Sabin Corneliu Buraga – Tehnologii Web
4. Privire de ansamblu
Din cele ce am văzut mai sus, spa țiul World-Wide Web funcț ionează în practic ă datorită:
• unei scheme consistente de identificare a resurselor, prin intermediul identificatori-
lor universali de resurse (URI);
• unui mecanism flexibil de transfer de date, reprezentat de protocolul HTTP;
• unei descrieri logice a structurii documentel or hipertext, prin intermediul limbajelor
de adnotare (marcare) HTML și XHTML.
Web-ul poate fi considerat un veritabil sistem hipermedia distribuit, utilizând ca infrastruc-
tură Internet-ul. De asemenea, Web-ul poate fi privit ca un mediu eterogen pentru dez-
voltarea și exploatarea de sisteme distribuite me nite a manipula componente multimedia.
Interacțiunile dintre server, client și utilizator din prisma unei aplica ții Web
Inițial, spațiul WWW era compus din pagini (documente) statice – incluzând text și
imagini, apoi elemente multimedia –, interconectate prin intermediul leg ăturilor hipertext.
Aplicații de tip client (precum navigatoarele Web) erau folosite pentru accesarea – via
adrese (URI) – a reprezent ării acestor resurse, stocate pe servere Web. Programe supli-
mentare ( plug-in-uri), incluse în navigato arele Web, erau menite s ă redea tipuri de conț inu-
turi nestandardizate, ca fi șiere Word, PostScript, PDF (Portable Document Format ), Flash
etc. Pentru a oferi con ținut dinamic utilizatorilor, sunt adoptate diverse modalit ăți pro-
gramatice, reprezentate pe partea de server de programe CGI (Common Gateway Interface ),
servere de aplicaț ii precum PHP ( PHP: Hypertext Processor ), JSP (Java Server Pages ), ASP
(Active Server Pages ) sau ASP.NET, iar pe partea de c lient de programe JavaScript sau
applet -uri Java.
De remarcat faptul c ă o serie de elemente programabile func ționează drept componen-
te middleware (generând de fapt o arhitectură 3-tier ori N-tier), reprezentând interfe țe pen-
tru accesarea unor servicii aflate la distan ță (e.g.: sisteme rela ționale de baze de date).
27
Sabin Corneliu Buraga – Tehnologii Web
Unul dintre pașii importanț i ai evoluției spațiului WWW îl reprezint ă serviciile Web baza-
te pe meta-limbajul XML ( Extensible Markup Language ). Serviciile Web permit ca elemente
programabile s ă fie plasate pe siturile Web, al ți programatori/aplica ții putând accesa func-
ționalitățile acestor programe, în manieră distribuit ă și directă, pentru orice poten țial nu-
măr de sisteme independente, prin folosirea unor standarde precum XML și HTTP.
Calculatoarele sunt și vor fi incluse în diferite tipuri de dispozitive, pe diverse scale,
precum telefoane celulare, palmtop-uri, notebook -uri, laptop -uri și alte viitoare dispozitive
portabile. Aceasta implic ă adoptarea unor noi mijloace de interac țiune și comunicare atât
între mașini, cât și între calculatoare și utilizatori, cercet ările concentrându-se în prezent
pe studierea comunica țiilor fără fir ( wireless ), în medii distribuite precum Web-ul,
folosindu-se diverse paradigme ( peer-to-peer , sisteme de agen ți etc.).
Identificatorii uniformi de resurse, protocolul HTTP și limbajul (X)HTML au reușit să
îndeplineasc ă practic scopurile principale ale Web-ului:
independența de dispozitiv (aceleași informa ții pot fi accesate via o multitudine de dis-
pozitive ca mainframe -urile, calculatoarele personale , dispozitivele mobile etc.),
independența de software (forme diferite de software – clien ți (navigatoare, robo ți Web
etc.) și servere Web – ofer ă și extrag informa ții într-o manier ă universală , fără ca
nici un produs-program s ă reprezinte o componentă critică pentru spa țiul WWW,
deoarece Web-ul nu reprezint ă un program, ci un set de protocoale și specifica ții
standardizate, deschise, redactate de Consorțiul Web ),
scalabilitatea (dezvoltarea exponen țială a Web-ului este un exemplu interesant al
efortului uman depus de comunitatea utilizatorilor Internet-ului, independent de
resursele hardware și software disponibile),
multimedia (documentele, reg ăsite și sub denumirea de pagini , disponibile pe Web
pot integra surse de informa ție multiple, în diverse forme, de la date discrete –
text, imagini statice precum fotografii, scheme, diagrame etc. – pân ă la cele conti-
nue – animaț ii, audio și video).
Drept concluzie final ă, Consorțiul Web – for ța motrice din spatele XML-ului – consi-
deră că misiunea sa este aceea de a conduce evoluția Web-ului. De și a împărt ășit mai multe
idei comune Internetului – precum „software-ul gratuit se r ăspândește mai repede”, „sis-
temele ASCII prolifereaz ă mai rapid decât cele binare” și „protocoalele proaste imit ă;
protocoalele bune fur ă” – a impus o strategie inovatoare: „autodescrierea”. Web-ul poate fi
construit peste el însu și. Identificatorii universali de resurse, formatele de date u șor de proce-
sat de către mașină și specifica țiile capabile de a fi interpretate de calculatoare pot fi îm-
pletite într-un sistem extensibil care asimileaz ă orice concuren ță. În esență, apariția limba-
jului XML în spectrul formatelor de date pentru Web pune cap ăt luptei asupra structur ă-
rii documentelor în vederea realiz ării viziunii originare a creato rilor Web-ului. La ora ac-
tuală, XML reprezint ă unica modalitate existent ă pentru adnotarea complex ă a datelor.
28
Sabin Corneliu Buraga – Tehnologii Web
29 PPaarrtteeaa IIII –– FFaammiilliiaa ddee lliimmbbaajjee XXMMLL
„Esențialul în lumânare nu este ceara ce las ă urma, ci lumina.”
Antoine de Saint-Exupéry
1. Preambul
2. Caracterizare ș i trăsături esen țiale
3. Părțile componente ale unui document XML
4. Membrii constituen ți ai familiei XML
5. Spaț iile de nume XML
6. Validarea documentelor XML
7. Procesarea documentelor XML
8. Transform ări XML
Sabin Corneliu Buraga – Tehnologii Web
30
Sabin Corneliu Buraga – Tehnologii Web
1. Preambul
Pentru identificarea resurselor Web-ul recurge la identificatori uniformi de resurse (URI –
Uniform Resource Identifiers ), iar pentru interac țiune se folose ște în mod uzual protocolul
HTTP. Reprezentarea resurselor se realizează via formate de date. Arhitectura spaț iului
WWW încurajează refolosirea formatelor existente, printre aspectele importante legate de
acest aspect putându-se enumera: adoptarea fo rmatelor textuale în contrast cu cele bina-
re, controlul versiunilor, extensibilitatea , compunerea formatelor, separarea con ținutului,
prezentării și interac țiunii.
Cu proliferarea serviciilor Internet, mai ales ale Web-ului, datele au putut fi publicate
liber, folosindu-se un format de redare (prezentare) a informaț iilor pus la dispoziț ie de
bine-cunoscutul HTML ( HyperText Markup Language ), în varianta actuală XHTML
(Extensible HTML ). În prezent, aten ția cade asupra model ării cât mai eficiente a informa-
țiilor, prin intermediul unui format deschis, extensibil – subiectul acestui capitol. Mai
mult decât atât, modelarea datelor nu reflect ă doar sintaxa (care e specificat ă printr-un set
de conven ții de marcare), ci și semantica – pân ă acum, reprezentat ă de codul-surs ă al
programelor ce prelucrau acele date.
Dacă formatele de date transpun maniera efectiv ă de stocare și prezentare a informaț ii-
lor, la nivel conceptual trebuie adoptat cel puț in un model de reprezentare. Evolu ția in-
frastructurilor de calcul a condus și la adoptarea unor modele de date diferite. Prezentul
are la bază arhitecturile naviga ționale, bazate pe hipertext (tex t neliniar), utilizate de o ple-
iadă de dispozitive, inclusiv cele mobile. Se consider ă că unul dintre modelele de date cele
mai potrivite este cel oferit de familia de limbaje XML.
Ca și SGML ( Standard Generalized Markup Language ), din care provine, XML
(Extensible Markup Language ) reprezintă un standard interna țional pentru descrierea
de marcaje (markups ) ale textelor electronice disponibile pe Web. În fapt, XML reprezint ă
un meta-limbaj , o descriere formal ă a unui limbaj, în acest caz, un limbaj de adnotare (de
marcare) a datelor. Specificaț iile XML au fost dezvoltate în cepând cu 1996 în cadrul Con-
sorțiului Web, de un grup de cercetare condus de Jon Bosak de la Sun Microsystems, la
care au aderat ulterior o serie de grupuri de exper ți din comunit ățile academice (Text
Encoding Initiative, NCSA, James Clark) și industriale (Sun, IBM, Netscape, Oracle,
Adobe etc.). Specifica țiile XML sunt standardizate de c ătre Consorț iul Web – vezi
http://www.w3.org/TR/xml .
31
Sabin Corneliu Buraga – Tehnologii Web
2. Caracterizare ș i trăsături esen țiale
Putem considera XML ca reprezentând un standard interna țional pentru descrierea de
marcaje (markups ) privitoare la resursele electr onice. În fapt, XML reprezint ă un meta-
limbaj (descriere formal ă a unui limbaj, conform unei gramatici – suit ă de reguli prin care,
pe baza unor simboluri, se genereaz ă cuvinte). La început, a fost v ăzut ca un limbaj de
adnotare (de formatare) de texte , dar scopurile actuale dep ășesc aceast ă interpretare în-
gustă.
Termenul marcaj (markup ) a fost utilizat iniț ial pentru a descrie anumite adnot ări, note
marginale în cadrul unui text cu inten ția de a indica tehnoredactorului cum trebuie listat
un anumit pasaj ori chiar omis. Cum formatarea și imprimarea textelor au fost automati-
zate, termenul s-a extins pentru a acoperi toa te tipurile de coduri de marcare inserate în
textele electronice cu scopul de a indica modul de formatare, listare ori alte ac țiuni.
Marcajul (codarea ) reprezintă , astfel, o ac țiune de interpretare explicit ă a unui
fragment de dat ă. Astfel, un limbaj de specificare oferă un set de convenții de marcare uti-
lizate pentru codificarea textelor. Un limbaj de marcare trebuie s ă desemneze mulț imea
de marcaje obligatorii, permise, maniera de identificare a marcajelor și care este
semantica fiec ărui marcaj disponibil (similar procesului de specificare a sintaxei și
semanticii unui limbaj de programare).
Există următoarele caracteristici definitorii ale XM L, primele trei preluate de la SGML:
utilizarea marcajelor descriptive ( descriptive markups ), adoptarea tipurilor de documente via
DTD ( Document Type Definition ), independenț a datelor și caracterul case-sensitive (majuscule-
le diferă de minuscule).
Printre trăsăturile care au f ăcut meta-limbajul XML să fie folosit în industria software
putem enumera: suportul acordat Web-ului, facilit ățile pentru utilizarea interna țională,
meta-limbajul (se permite definirea de noi limbaje, într-o manier ă portabilă), soluție pen-
tru reprezentarea con ținutului resurselor Web identificate via URI.
Așadar, XML este o metod ă de descriere universal ă a informa ției astfel încât atât com-
puterele, cât mai ales oamenii s ă o poată înțelege. Scopurile limbajului sunt cele legate de
utilizarea lui în Internet, suportând o varietate de aplicaț ii, dar fiind mult mai flexibil decât
HTML. Oferind o manier ă universală pentru reprezentarea (descrierea) informa țiilor hi-
pertext, XML poate fi v ăzut ca o tehnologie complementar ă limbajului HTML, nu ca o
înlocuire a sa.
Un prim exemplu: dac ă am considera un fragment de document HTML utilizat pentru
a stoca informa ții dintr-o list ă privitoare la colegii de grup ă, acesta ar putea avea forma:
<p>Coleg:</p>
<p>Nume: <b> Ștefan Ciprian Tanas ă</b></p>
<p>Adresa: <i>Str. Berthelot, 16 – Ia și</i></p>
32
Sabin Corneliu Buraga – Tehnologii Web
<p>Telefon: 032-201090</p>
<p>E-mail: <tt>stanasa@infoiasi.ro</tt></p>
Din perspectiva unui calculator (a unei aplica ții de prelucrare a acestor informa ții), nu
există nici o indicaț ie asupra faptului c ă informația ar fi structurat ă. În schimb, conside-
rând aceea și informa ție reprezentat ă prin XML, fragmentul de document ar putea fi:
<coleg>
<nume>Ș tefan Ciprian Tanas ă</nume>
<adresa>Str. Berthelot, 16 – Ia și</adresa>
<telefon>032-201090</telefon>
<email>stanasa@infoiasi.ro</email>
</coleg>
Dacă fragmentul de document HTML de mai sus indic ă mai mult modalit ățile de afișa-
re a datelor (forma), documentul XML descrie structura datelor (putem afirma c ă este
vorba de un coleg, pentru el memorând numele și diverse maniere de contact). Cunos-
când structura datelor, se pot executa diferite opera ții asupra acestora ( e.g. afișarea doar a
numelor colegilor, trimiterea de felicit ări tuturor colegilor din Ia și, generarea unui tabel
conținând numerele de telefon etc.).
1. Subset simplificat al SGML
– foarte puternic, dar ușor de implementat
– fără limite în ceea ce prive ște complexitatea structurilor care pot fi de-
finite
– îndeajuns de compact pentru a fi suportat de navigatoarele Web
2. Oferă suport pentru utilizare la nivel interna țional
– marcajele și conținutul pot fi reprezentate în Unicode
– instrumentele de dezvoltare XML pot suporta orice codific ări
3. Meta-limbaj
– conceput pentru a suporta definirea unui num ăr nelimitat de limbaje
specializate, oferind suport de extinderi
– portabilitate
Trăsături definitorii ale meta-limbajului XML
33
Sabin Corneliu Buraga – Tehnologii Web
3. Părțile componente ale unui document XML
Un document XML poate cuprinde urm ătoarele categorii de constituen ți:, declara ția,
elementele, atributele, entit ățile, secțiunile de marcare, instruc țiunile de procesare.
Documentele XML pot s ă înceapă cu o declara ție (numită și prolog) XML care specifi-
că versiunea limbajului XML utilizat – de exemplu: <?xml version="1.0"
encoding="UTF-8" ?> (de asemenea, s-a precizat și tipul de codificare a setului de ca-
ractere folosit).
Componenta structural ă a unui document XML este elementul.
Diferite tipuri de elemente au asociate nume diferite. Fiecare element trebuie specificat
explicit prin intermediul marcajelor ( tag-urilor). Perechea marcaj de început ( start tag ) –
marcaj de sfâr șit (end tag ) este folosit ă la încadrarea fiecă rei instanț e a elementului respec-
tiv în cadrul unui text. În XML, se utilizeaz ă <element> pentru a specifica un tag de în-
ceput și </element> pentru cel de sfâr șit, unde element este numele unui element oare-
care (specificat de utilizator ori de autoritatea care a redactat specifica țiile limbajului bazat
pe XML folosit).
Regulile sintactice privitoare la numele de elemente sunt similare celor privitoare la
identificatorii de variabile. Numele începând cu caracterele „ xml” (în orice modalitate de
scriere, cu majuscule sau minuscule) sunt re zervate. Numele de element nu poate con ține
spații albe.
Un element poate fi vid (nu con ține nimic între tag-urile de început și sfârșit), putând fi
scris fie <element></element> , fie prin forma prescurtat ă <element /> . De asemenea,
poate include un text ( șir de caractere) ori alte elemen te. Mai multe elemente de acela și
tip pot fi, a șadar, imbricate. Un aspect deosebit de important este cel privitor la faptul c ă
elementele trebuie s ă fie închise și imbricate corect.
Conținutul textual al unui element poate fi compus din caracterele permise de codifica-
rea precizat ă de atributul encoding din declara ția XML, orice apari ție de spații albe
multiple fiind implicit redus ă la un singur caracter spa țiu.
Pentru a ilustra mai detaliat acest aspect, consider ăm un model structural foarte simplu.
Presupunem c ă dorim să identificăm o comand ă de portocale ce va fi procesată de un sit
de comerț electronic. Astfel avem:
<portocale>
<!– partea de achizi ție de portocale –>
<achizitii> <tip>Portocale grece ști fără coajă</tip>
<cod>P10-01-GR</cod> <cantit um="kg">3374</cantit> </achizitii> <!– partea de vânz ări de portocale –>
<vanzari>
34
Sabin Corneliu Buraga – Tehnologii Web
<tip>Portocale japoneze albastre</tip>
<cod>P10-03-JP</cod> <cantit um="kg">0107</cantit>
</vanzari>
</portocale>
Exemplul de mai sus nu ne precizează anumite reguli de compunere a comenzii (de
exemplu, nu putem impune ca tipul produsului solicitat s ă nu apară de mai multe ori).
Așadar, vom avem nevoie de un meca nism de precizare a structurii.
Un atribut este utilizat cu scopu l de a descrie o anumit ă proprietate a unei apari-
ții specifice (particulare) a unui element.
Atributele sunt localizate în tag-ul de start al unui element, imediat dup ă numele ele-
mentului, sunt urmate de „ =”, apoi de valoarea atributului, scrisă între ghilimele sau apos-
trofuri. Dac ă valoarea unui atribut nu este specificat ă între ghilimele va fi semnalat ă o
eroare, la fel ca și în cazul în care pentru un atribut nu ar fi ata șată și valoarea acestuia.
Pentru un element pot exista oricâte atribute, specificate în orice ordine, atât timp cât
sunt declarate corect.
Pentru exemplul dat mai sus, am specificat unitatea de m ăsură „kilogram” prin valoa-
rea „kg” a atributului um asociat elementului <cantit> .
Referințele la entit ăți constituie de fapt pointeri c ătre entități. În XML, entit ățile repre-
zintă unități de text, unde o astfel de unitate poate desemna orice, de la un singur caracter
la un întreg document sau chiar o referin ță la un alt document. O referință la o entitate
prezintă construcția sintactic ă &nume_entitate ; (caracterul „ &”, urmat de numele enti-
tății, apoi de caracterul „ ;”). Una dintre cele mai frecvente utiliz ări ale referin țelor la enti-
tăți este atunci când se dore ște folosirea unor caractere care ar conduce la erori de proce-
sare și deci care nu ar trebui să apară în forma lor normal ă în text (de exemplu, pentru a
genera simbolul „ <” vom folosi „ < ”). În momentul în care se întâlne ște referinț a la o
entitate în document, aceasta se va substitui cu datele pe care le refer ă și se va returna
documentul cu înlocuirile f ăcute.
Ocazional, anumite p ărți ale documentului necesit ă un tratament special în ceea ce pri-
vește modul de procesare. Astfel, exist ă posibilitatea folosirii sec țiunii CDATA (character
data), cu rolul de inhibare a prelucr ării construc țiilor XML. Sec țiunile CDATA pot fi inse-
rate oriunde pot ap ărea și datele de tip caracter. Ele sunt utilizate pentru a include blocuri
de text conț inând caractere care altfel ar fi recu noscute ca marcaje. Acest aspect devine
important atunci când documentul include, de exemplu, linii de cod-surs ă scrise într-un
limbaj de programare care are propriile conven ții sintactice.
Sintaxa general ă a secțiunii CDATA are forma <![CDATA[ … ]]> . Secțiunile
CDATA nu pot fi incluse unele în altele.
35
Sabin Corneliu Buraga – Tehnologii Web
Un exemplu este urm ătorul:
<achizitii>
<tip>Portocale grece ști fără coajă</tip>
<obs><![CDATA[
Cantitatea trebuie s ă fie >2000.
]]></obs> </achizitii>
Instrucțiunile de procesare reprezintă un tip special de marcaj care con ține informa ții
privitoare anumite aplicaț ii ce urmeaz ă a fi executate pentru procesarea con ținutului. Un
exemplu este instruc țiunea de procesare care permite atașarea de foi de stiluri documen-
telor XML în vederea red ării conținutului acestora:
<?xml-stylesheet href="xml2html.xsl" type="text/xsl" ?>
36
Sabin Corneliu Buraga – Tehnologii Web
4. Membrii constituen ți ai familiei XML
Limbajul XML ofer ă mai mult decât o sintax ă comodă pentru reprezentarea datelor
structurate sau semi-structurate. XML consist ă dintr-o familie de limbaje bazate pe XML
pentru reprezentarea datelor și relațiilor dintre ele.
Această familie de limbaje, menite a adapta con ceptele curente de stocare, modelare și
publicare pe Web a datelor, este compus ă din:
• XML ( Extensible Markup Language ) – subset al specificaț iei SGML, conceput pen-
tru o implementare mai u șoară. Modalitățile de validare sunt concretizate, uzual,
de schemele XML, complementare DTD-urilor;
• XLL ( Extensible Linking Language ) – oferind suport pentru specificarea de leg ături
hipertext, concretizat în dou ă componente majore:
– XLink – conceput pentru descrierea leg ăturilor (simple sau multiple) din-
tre resursele Web;
– XPointer – are ca scop precizarea în manier ă extensibil ă a unor scheme de
adresare a datelor XML;
• XSL ( Extensible Stylesheet Language ) – permite transformarea documentelor XML
în alte tipuri de document e (XML, XHTML sau altele) și atașarea unor obiecte de
formatare, în vederea red ării conținutului XML în formate precum PDF ( Portable
Document Format );
• XQuery – împreună cu limbajul XPath, ofer ă posibilitatea interog ării documente-
lor XML.
Pentru alte detalii, pute ți consulta lucrarea S. Buraga, Tehnologii XML ,
Polirom, Ia și, 2006.
Intuitiv, structura unui document XML complex poate fi mult mai u șor înț eleasă
având asociat ă o reprezentare grafic ă arborescent ă – a se vedea figura de mai jos.
Reprezentarea arborescentă a unui document XML
37
Sabin Corneliu Buraga – Tehnologii Web
De asemenea, exist ă o multitudine de aplica ții bazate pe XML, dintre care se pot enu-
mera limbaje pentru:
• reprezentarea expresiilor matematice ( MathML ),
• descrierea resurselor Internet ( RDF – Resource Description Framework ) – baza pentru
Web-ul semantic ,
• crearea de ilustra ții (conținuturi grafice) vectoriale ( SVG – Scalable Vector
Graphics );
• realizarea de prezentă ri multimedia sincronizate ( SMIL – Synchronized Multimedia
Integration Language ),
• reprezentarea și interschimbarea informa țiilor referitoare la afaceri pe Web
(BRML – Business Rules Markup Language ),
• transferul de date în medii mobile ( WML – Wireless Markup Language ),
• descrierea serviciilor Web ( WSDL – Web Services Description Language ).
Practic, este imposibil de enumerat toate lim bajele bazate pe XML existente la ora ac-
tuală, standardizate sau nu. Numeroase limbaje utile, în num ăr de peste 500, sunt descrise
la adresa http://xml.coverpages.org/ .
În ceea ce prive ște tipurile de instrumente XML, pot fi amintite urmă toarele categorii:
– analizoare (procesoare, parsers ) XML – e.g., Expat, libxml, MSXML,
Xerces;
– vizualizatoare și editoare structurale – Firefox, Open Office, oXygen,
Stylus, XML Spy, XMLStarlet și multe altele;
– formatatoare – FOP, Saxon, Xalan, XEP etc.;
– instrumente de convertire/arhivare – e.g., Open SP, Tidy, XMill;
– sisteme de gestiune a bazelor de date orientate-text (native XML sau doar
oferind suport pentru XML) – dbXML, eXist, Mark Logic’s CIS, Xindice
etc.;
– aplicații hipertext – Annotea, Hyperwave;
– biblioteci/sisteme de procesare a meta -datelor – Carp and Spiral, Dri-
ve.NET, Jena, Redland și altele;
– instrumente de modelare conceptual ă – pOWL, Protégé, SWOOP etc.;
– aplicații din domeniul social ( blog-uri, portaluri, wiki-uri, adnotatoare de
conținut, managere de noti țe și adrese personale etc.) – Connotea,
del.icio.us, Furl, Spurl.net etc.
38
Sabin Corneliu Buraga – Tehnologii Web
Exemple
Documentele XML pot stoca informa ții structurate sau semi-structurate care ulterior se
pot prelucra într-o manier ă comodă .
Astfel, o baz ă de date simpl ă poate fi memorată ca fișier XML astfel (desigur, aceast ă
abordare nu este unic ă):
<tabela>
<inregistrare id="0001">
<camp1 tip="numar">valoarea 1-1</camp1>
<camp2 tip="caracter">valoarea 1-2</camp2>
<!– mai multe câmpuri –>
</inregistrare>
<inregistrare id="0002"> <camp1 tip="numar">valoarea 2-1</camp1>
<camp2 tip="caracter">valoarea 2-2</camp2>
</inregistrare>
<!– mai multe înregistr ări –>
</tabela>
La fel, documentele XML pot fi utilizate cu succes ca fi șiere de configura ție pentru di-
verse aplica ții:
<config logdir="/var/log/app/"
debugfile="/tmp/app.debug">
<server name="odin" osname="solaris"
osversion="2.6"> <address>193.30.121.101</address>
</server>
<server name="fenrir" osname="linux"
osversion="2.4.2">
<address>193.30.121.197</address>
</server>
<server name="thor" osname="linux" osversion="2.4.2">
<address>193.30.121.224</address>
<address>193.30.121.225</address>
</server>
</config>
Un alt exemplu prive ște stocarea informa țiilor referitoare la cuprinsul unei c ărți:
<?xml version="1.0" ?>
<!– Un alt exemplu de marcare a datelor in XML
(un cuprins de carte)
–>
<?xml-stylesheet href="cuprins.xsl" type="text/xsl" ?>
39
Sabin Corneliu Buraga – Tehnologii Web
<cuprins titlu="Situri Web la cheie. Solutii profesionale de imple-
mentare" editura="Polirom" an="2004">
<capitol>
<nume>Prefata</nume>
<autor>Sabin Buraga</autor>
</capitol>
<capitol>
<nume>Portaluri educationale</nume>
<autor>Bogdan Manolache</autor>
<descriere>Capitolul de fata incepe cu o prezentare generala a portalurilor, urmata de o incursiune in lumea portalurilor
educationale.</descriere>
</capitol>
<capitol>
<nume>Modelarea si reprezentarea relatiilor intre tabele</nume>
<autor>Sorin Bahmata</autor>
<descriere>Aplicatia DataR reprezinta un sit Web dezvoltat in
limbajul PHP ce ofera posibilitatea de a modela si reprezenta
metadatele asociate structurii bazelor de date relationale (mai exact, a bazelor de date MySQL), aici incluzand si detalii despre
relatiile intre tabele.</descriere>
</capitol>
<capitol>
<nume>FindMyHome, solutie e-business in domeniul imobiliar</nume>
<autor>Viorel Atofani</autor>
<descriere>Capitolul de fata prezinta o privire de ansamblu asu-
pra unei idei de afaceri on-line, prin detalierea unei solutii prac-
tice de e-business, reprezentata de un portal Web in domeniul imobi-liar.</descriere>
</capitol>
</cuprins>
40
Sabin Corneliu Buraga – Tehnologii Web
5. Spaț iile de nume XML
În unele situa ții pot apă rea confuzii, atunci când se folosesc date provenite din diverse
surse (documente) XML care pot avea elemente/atribute cu acela și nume, dar cu semni-
ficații (semantici) diferite. Pentru evitarea acestor ambiguit ăți sunt folosite spaț iile de nu-
me, astfel încât numele de elemente și/sau atribute vor fi identificate în mod unic,
evitându-se conflictele.
Necesitatea folosirii spa țiilor de nume se poate re marca din exemplul urmă tor, în care
considerăm două documente XML, primul cu informa ții despre partenerii de afaceri, al
doilea despre numele furnizorilor de portocale:
<!– parteneri de afaceri –>
<parteneri> <partener>
<nume>Portocal Escu</nume>
<adresa>Aleea Z ăpezilor, 33</adresa>
</partener> … </parteneri>
<!– furnizori –> <furnizori> <furnizor adresa="http://ja.po.ro/"> <nume>Japo Nez S.A.</nume>
</furnizor>
… </furnizori>
Documentul care le utilizeaz ă pe precedentele și folosește spații de nume pentru evita-
rea ambiguit ăților („ nume reprezint ă un nume de persoană sau un nume de companie?”;
idem pentru adresă ) ar putea fi următorul:
<comanda xmlns:p="http://www.undeva.ro/parteneri/"> <partener> <p:nume>Portocal Escu</p:nume> <p:adresa>Aleea Z ăpezilor, 33</p:adresa>
</partener>
<f:furnizor xmlns:f="urn:furnizori.info"
f:adresa="http://ja.po.ro/"> <nume>Japo Nez S.A.</nume> </f:furnizor> </comanda>
Atributul xmlns este folosit pentru declararea spa țiilor de nume, iar valoarea lui trebuie
să fie un URI, fie localizând o resurs ă prin adresa ei – cazul URL ( Uniform Resource Loca-
tor), fie desemnând un nume unic asociat resursei în cauz ă – facilitate oferit ă de URN
(Uniform Resource Name ).
Prin intermediul construc ției xmlns , se asociaz ă un vocabular , denumit și spațiu de nume
(namespace ), pentru elementele în cauză .
41
Sabin Corneliu Buraga – Tehnologii Web
În cele ce urmeaz ă, vom furniza un exemplu complet, în care se vor folosi mai multe
vocabulare, fiecare desemnat de un spa țiu de nume XML. Documentul serve ște pentru
stocarea rezultatelor unui chestionar anonim privitor la desf ășurarea unui curs (se poate
observa și utilizarea referin țelor la entit ăți, plus a atributelor speciale xml:id și
xml:lang ).
<feedback xmlns="urn:infoiasi.ro:busaco:feedbacks"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
type="results" xml:id="feedback1-2005" version="0.1"> <meta> <author uri="http://www.infoiasi.ro/~busaco/"> Sabin-Corneliu Buraga</author>
</meta>
<issue xml:id="i2"> <question xml:lang="ro"> Care dintre aspectele propuse spre expunere vă stârnesc cel mai mult interesul?
</question> <response xml:lang="ro"> <rdf:Seq> <rdf:li>Baze de date native XML & XQuery</rdf:li>
<rdf:li>Cookie-uri & sesiuni</rdf:li>
</rdf:Seq> </response> </issue> <issue xml:id="i3">
<question xml:lang="ro">
Ce alte subiecte a ți dori să fie prezentate?
</question> <response xml:lang="ro"> <rdf:Seq>
<rdf:li>Tehnologii WAP</rdf:li>
<rdf:li>Anima ții pentru Web</rdf:li>
<rdf:li>E-business</rdf:li> </rdf:Seq> </response>
</issue>
</feedback>
42
Sabin Corneliu Buraga – Tehnologii Web
6. Validarea documentelor XML
Punerea problemei
O primă necesitate în cazul adopt ării tehnologiei XML este aceea ca informa țiile marcate
în XML s ă poată fi regăsite, reutilizate și partajate între diverse aplicaț ii. Astfel, o cerin ță
importantă este de a cunoa ște:
– setul de elemente/atribute ce pot fi specificate;
– modul lor de structurare ( e.g., ordinea, num ărul minim/maxim de apari ții, contex-
tul etc.);
– tipul conținutului (de exemplu, cantitatea de portocale s ă reprezinte un num ăr na-
tural, apar ținând intervalului [0, 7433]);
– ce anume este valid și ce reprezint ă eroare.
Soluția este aceea ca un grup sau grupuri de indivizi (precum o companie, o industrie,
persoane, produc ători de instrumente software specifice sau un consor țiu) să specifice
mulțimea de elemente și atribute permise și regulile de marcare, adic ă tocmai modelul
structural amintit mai sus.
Modelul structural se aplic ă unei clase de documente XML, în vederea verific ării via
un analizor (numit și procesor sau parser ) a corectitudinii instan țelor de documente apar-
ținând acelei clase. Se au în vedere aspecte privind:
– modul de numire a elementelor/atributelor;
– definirea regulilor de utilizare a acestora;
– specificarea structurii și conținutului;
– precizarea anumitor constrângeri;
– oferirea unui set de conven ții de numire.
Apare, așadar, necesitatea specific ării unui set de constrângeri asociate documentelor,
astfel încât datele XML s ă fie verificate dac ă sunt valide sau nu din punct de vedere struc-
tural sau al tipului con ținutului.
Modalitățile de precizare a constrângerilo r se pot baza pe: descrieri ( DTD și XML
Schema ), reguli ( Sablotron ) și șabloane ( RELAX NG ) – detalii în cartea Sabin Buraga, Teh-
nologii XML , Polirom, Ia și, 2006.
43
Sabin Corneliu Buraga – Tehnologii Web
Declaraț ia tipului de document. Valid ări via DTD
Declarația tipului de document reprezintă un marcaj special care poate fi inclus în documente-
le XML cu rolul de a specifica existenț a și locaț ia definiției tipului de document (DTD –
Document Type Definition ). Declara ția tipului de document și definiț ia tipului de document
sunt noțiuni diferite. DTD-ul însumeaz ă un set de reguli formale care definesc structura
unui document XML, spre deosebire de declara ția tipului de document care are rolul de a
indica analizorului ce DTD trebuie s ă foloseasc ă pentru verificare și validare. DTD-urile
sunt o reminiscen ță a SGML-ului și în prezent tind a fi înlocuite de schemele XML.
Pentru a putea fi procesate, documentele XML trebuie s ă fie mă car documente bine
formatate.
Documentele bine formatate sunt documentele corecte din punct de vedere sin-
tactic.
Spre deosebire de HTML, XML este mai strict în ceea ce prive ște sintaxa. Regulile care
trebuie respectate pentru ca un document s ă fie bine formatat sunt:
– Față de HTML și SGML, XML este case sensitive . Greșelile de scriere a elemen-
telor și atributelor sunt destul de greu de detectat, mai ales când nu se folose ște
un editor XML specializat.
– Fiecare tag deschis trebuie închis, în caz contrar analizorul XML va semnala
eroare.
– Primul tag deschis trebuie s ă fie ultimul care este închis. Tag-urile trebuie închi-
se exact în ordinea invers ă a deschiderii lor, altfel va fi semnalat ă eroare (con-
strucția <client><adresa>…</client></adresa> este incorect ă).
– Nu sunt acceptate elementele vide. Dup ă cum am vă zut deja, elementele vide
au sintaxa modificat ă: <element /> .
Un document XML valid este acel document bine formatat a c ărui structur ă este
conformă cu DTD-ul ata șat (pot fi valide doar documentele care au ata șat un
DTD).
Un analizor XML efectueaz ă două nivele de verificare a unui document XML. Dup ă
verificarea corectitudinii sintactice, analizorul poate verifica dac ă documentul este con-
form setului de reguli specificate de DTD-ul ata șat. Dacă sunt respectate aceste reguli,
atunci spunem despre documentul XML c ă este valid. Procesul de verificare dac ă un do-
cument este valid se nume ște validare .
Sintaxa declaraț iei tipului de document difer ă în funcție de tipul DTD-ului: intern sau
extern.
44
Sabin Corneliu Buraga – Tehnologii Web
DTD-ul intern se declar ă imediat după declarația XML sau, dac ă această declarație nu
există, el va fi primul element exceptând comentariile, spa țiile de nume sau instruc țiunile
de procesare. DTD-ul intern se declară utilizând cuvântul cheie DOCTYPE în modul
următor:
<!DOCTYPE element_r ădăcină [
declara ții de elemente
declara ții de atribute
declara ții de entit ăți,
declara ții de instruc țiuni de procesare
declara ții de nota ții
]>
DTD-ul extern este definit într-un alt fi șier text care trebuie să se afle la o adres ă speci-
ficată. Declarația este asem ănătoare, dar intervin cuvintele cheie SYSTEM sau PUBLIC:
<!DOCTYPE colegi
SYSTEM "http://undeva.ro/colegi.dtd">
<!DOCTYPE colegi PUBLIC "parteneri" "http://undeva.ro/colegi.dtd">
Fișierul colegi.dtd aflat la adresa specificat ă în declara ție conține definițiile elemen-
telor care vor apare în document. Elementul <colegi> trebuie să apară în DTD-ul speci-
ficat.
Un exemplu de document DTD este furnizat în continuare:
<!– DTD definind tipul de document 'cuprins' –> <!ELEMENT cuprins (coordonator?,capitol+)>
<!ELEMENT coordonator ANY>
<!ELEMENT capitol (nume,autor*,descriere?)> <!ELEMENT nume (#PCDATA)>
<!ELEMENT autor (#PCDATA)> <!ELEMENT descriere (#PCDATA)>
<!– declararea unei entitati (cu utilizarea entitatilor predefinite) –> <!ENTITY busaco "Sabin Buraga <busaco@infoiasi.ro>">
<!ATTLIST cuprins
titlu CDATA #REQUIRED editura CDATA #IMPLIED an (2004|2005) "2004" >
<!ATTLIST capitol
numar CDATA #REQUIRED > <!ATTLIST autor email CDATA #IMPLIED
>
Se observ ă definirea elementelor cuprins, c oordonator, capitol, nume, autor și descrie-
re. Elementul cuprins (care e element r ădăcină) va putea cuprinde elementele coordona-
tor (apariția acestuia e opț ională, aspect indicat de „ ?”) și capitol (operatorul „ +” indică
măcar o singur ă apariție). Elementele vor ap ărea în secvență, lucru specificat de caracterul
virgulă . Elementul capitol va putea include elementele nume, autor și descriere. Elemen-
45
Sabin Corneliu Buraga – Tehnologii Web
tul autor poate ap ărea de 0, 1 sau mai multe ori, deoa rece a fost specificat operatorul „ *”.
Conținuturile elementelor nume, autor și descriere sunt șiruri de caractere (indicate de
#PCDATA), iar con ținutul elementului coordonator poate fi oricare (s-a folosit ANY).
Pentru elementul cuprins se specific ă lista de atribute titlu, editura și anul. Atributul titlu
are drept valoare un șir de caractere (CDATA) și e obligatoriu (#REQUIRED), pe când
atributul editura este op țional (#IMPLIED). Atributul an ar e drept valori o enumerare de
valori, implicit fiind considerat ă valoarea 2004. Similar și pentru celelalte.
Se specific ă și o entitate (numit ă „busaco ”) care cuprinde un șir de caractere.
Documentul XML care trebuie validat conform acestui DTD va putea fi urm ătorul:
<!DOCTYPE cuprins SYSTEM "cuprins.dtd">
<!– pentru validare se foloseste un DTD extern –>
<cuprins titlu="Aplicatii Web la cheie. Studii de caz implementate in PHP" editura="Polirom" an="2003"> <coordonator>&busaco;</coordonator>
<capitol numar="4">
<nume>E-Pizza – de la browser la WAP</nume> <autor email="angel@infoiasi.ro">Cristian Neghita</autor> <autor>Marius Ropota</autor> <autor>Iavi Rotberg</autor>
<descriere>Aplicatia E-Pizza este o solutie completa pentru
managementul informatiilor referitoare la activitatea unei pizzerii, incluzand comandarea on-line de produse, rezervarea de mese in restaurant si administrarea facila prin intermediul unei interfete Web. De asemenea, se descrie si o solutie de accesare – via
dispozitive WAP – a sitului, utilizandu-se limbajul WML.</descriere>
</capitol> <capitol numar="7"> <nume>Accesul la baze de date prin servicii Web</nume> <autor>Silvana Solomon</autor>
<descriere>Acest capitol prezinta principalele trasaturi ale
protocolului XML-RPC, prin care e posibila apelarea de proceduri la distanta, mesajele schimbate fiind scrise in format XML, in vederea implementarii de servicii Web bazate pe XML. Exemplificam utilizarea tehnologiei XML-RPC pentru gestiunea unei baze de date Web indiferent
de platformele folosite.</descriere>
</capitol> </cuprins>
46
Sabin Corneliu Buraga – Tehnologii Web
Verificarea validit ății unui document XML
în cadrul editorului Kate oferit de mediul KDE sub Linux
Descriere succint ă a XML Schema
XML Schema , recomandare oficial ă a Consor țiului Web, este una dintre cele mai utilizate
și versatile maniere de validare a documentelor XML. În cele ce urmeaz ă, vom prezenta
cele mai importante aspecte referitoare la aceasta.
47
Sabin Corneliu Buraga – Tehnologii Web
O schemă reprezint ă o specifica ție formală a gramaticii asociate unui document
XML și reprezint ă, în fapt, tot un document XML stocat într-un fi șier având ex-
tensia .xsd ( XML Schema Definition ). O schem ă XML define ște o clasă de documente
XML conformându-se unui model structural, suplimentar specificând un sistem
de tipuri de date. Pentru a putea fi verificat ă validitatea, o instan ță a unei clase de
documente XML trebuie s ă aibă asociată o schemă XML.
Aceste aspecte sunt asem ănătoare celor de la paradigma orientat ă-obiect.
O schemă va specifica modul de apariț ie și tipurile de date pe care le pot lua valorile
construcțiilor XML. Rezultatul ob ținut în urma unei valid ări încununate cu succes este
numit și PSVI ( Post-Schema Validation Infoset ).
Schemele XML sunt utilizate în multe cont exte/domenii, dintre care le enumeră m pe
următoarele:
– verificarea tipurilor de date în contextul sistemelor de baze de date (rela ționale), al
mașinilor virtuale (CLR, JVM) etc.;
– serializarea automat ă a datelor;
– invocarea la distan ță a metodelor (RMI – Remote Method Invocation , SOAP – Simple
Object Access Protocol);
– generarea de cod-surs ă;
– implementarea de editoare „inteligente”;
– crearea validatoarelor generale de date ( e.g., validarea formularelor electronice).
Construcțiile XML Schema trebuie s ă aparțină spațiului de nume indicat de adresa
http://www.w3.org/2001/XMLSchema . Atributele privitoare la sc heme ce apar în cadrul
unei instan țe a unei clase de documente vor proveni din spa țiul de nume specificat de
http://www.w3.org/2001/XMLSchema-instance .
Un document XML Schema are ca element-ră dăcină <xsd:schema> . Definirea sau
instanțierea unui element se realizeaz ă via <xsd:element> , iar în cazul unui atribut prin
<xsd:attribute> .
Asemă nător definirii unor tipuri de date și variabile într-un limbaj de programare, într-
o schemă XML fiecare instanță de element trebuie s ă aparțină unei clase (tip) de elemen-
te. Un element/atribut va avea valori permise ce apar țin unui tip de date (simplu sau
complex), specificat prin <xsd:SimpleType> și, respectiv, <xsd:ComplexType> .
Tipurile simple, predefinite ori deri vate din cele predefinite, descriu con ținutul datelor
textuale. În acest caz, nu se permite ca un element s ă includă alte elemente și nici să aibă
48
Sabin Corneliu Buraga – Tehnologii Web
asociate atribute. Tipurile simple pot fi folosite și pentru specificarea con ținutului atribu-
telor.
Tipurile complexe descriu datele (semi)structurate. În acest caz, se accept ă ca elemen-
tele să includă alte elemente (via reguli de apari ție) și să aibă asociate atribute. Elementele
de tip complex vor putea con ține:
– declarații de elemente, prin intermediul construc ției <element name=" nume"
type="tip" /> ;
– referințe la elemente apriori definite: <element ref=" nume" re-
guli_aparitie ="valori" /> ;
– declarații de atribute via <attribute name=" nume" type=" tip" /> .
Tipurile complexe nu pot fi folosite în c ontextul stabilirii tipului valorilor atributelor
XML.
Consorțiul Web a pus la dispozi ție o paletă largă de tipuri predefinite (primitive și de-
rivate). Cele mai utilizate sun t enumerate în continuare:
– numerice: byte, unsignedByte, integer, posit iveInteger, negativeInteger, int, long,
decimal, float, double și altele;
– logice: boolean;
– privitoare la dat ă și timp: time, dateTime, duration, date, gYear, gMonth, gDay
etc.;
– șiruri de caractere: string, token și altele;
– adrese Web: anyURI.
Putem defini tipuri simple de rivate din cele predefinite via <xsd:simpleType> . Noul
tip de date specificat poate fi o restric ție a unui tip deja existent prin intermediul unor
constrângeri ( facets). Prin intermediul constrângerilo r pot fi precizate aspecte precum:
– lungimea: <xsd:length> ;
– lungimea minim ă: <xsd:minLength> ;
– lungimea maxim ă: <xsd:maxLength> ;
– un model ( pattern), exprimat printr-o expresie regulat ă: <xsd:pattern> .
De asemenea, putem recurge la precizarea unei liste de valori (via
<xsd:enumeration> ) ce va forma tipul sau a unui interval de valori (construc țiile
<xsd:minInclusive> , <xsd:maxInclusive> , <xsd:minExclusive> și
<xsd:maxExclusive> ).
49
Sabin Corneliu Buraga – Tehnologii Web
Tipurile simple noi vor fi folosite s ă descrie valorile elementelor/atributelor, ata șarea
acestora unor construc ții XML putând avea loc fie în cadrul schemei la declararea unui
element, fie în cadrul instan ței via atributul xsi:type .
De asemenea, vom putea preciza urm ătoarele (simbolul „ |” semnific ă o alternativ ă):
– reguli (restric ții) de aparitie a unei instan țe de element: num ărul minim de apari ții
(minOccurs="num ăr") și/sau num ărul maxim de apari ții (maxOccurs="num ăr
| unbounded" );
– reguli de apariț ie a unui atribut (obligatoriu, op țional sau interzis):
use="required | optional | prohibited" ;
– valoarea predefinit ă a unui atribut via default ;
– valori particulare pentru elemente sau atribute: fixed .
De reținut că tipurile simple pot fi utilizate doar pentru a descrie date-caracter. În ve-
derea definirii structurii unui document, se recurge la <xsd:complexType> . Un tip com-
plex poate avea un con ținut simplu ( <xsd:simpleContent> ) sau unul complex.
Conținutul simplu înseamn ă că un element va putea include atribute, extinzând astfel
modelul-con ținut. O prim ă metodă este derivarea prin extensie, via elementul
<xsd:extension> , iar a doua modalitate vizeaz ă derivarea prin restricț ie, realizat ă prin
intermediul constrângerilor ( facets). Atributele vor fi definite prin intermediul
<xsd:attribute> , putând fi declarate global (la nivelul schemei) sau local (în cadrul
unui tip complex). De asemenea, ele pot fi calificate (prefixate de spa țiul de nume ales)
sau nu.
Specificarea unui tip cu conț inut complex vizeaz ă definirea listei și ordinii sub-
elementelor și atributelor sale. Con ținutul unui element poate fi și mixt (compus din sub-
elemente sau date-caracter): <xsd:complexType mixed="true"> ori vid (nu va conț ine
decât declara ții de atribute).
Pentru a preciza diverse modele ale con ținutului, vom adopta diverse construc ții refe-
ritoare la:
– alternativă: <xsd:choice> ;
– secvență: <xsd:sequence> ;
– grupare: <xsd:group> ;
– apariție a tuturor elementelor, în orice ordine: <xsd:all> .
De menț ionat și faptul c ă specificarea unor elemente/atribute generice (ale altor ti-
puri de documente) se realizeaz ă prin elementele <xsd:any> și <xsd:anyAttribute> .
De asemenea, XML Schema oferă și suport pentru documentare via <xsd:annotation> .
50
Sabin Corneliu Buraga – Tehnologii Web
În continuare, vom furniza un exemplu de schem ă XML menit ă a valida documentul
XML privitor la achizi țiile și vânzările de portocale, menț ionat mai sus. Structura schemei
este următoarea:
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="urn:portocale.info" targetNamespace="urn:portocale.info"> <xsd:annotation> <xsd:documentation xml:lang="ro">
O schem ă utilizat ă la validarea
tranzac țiilor de portocale
</xsd:documentation>
</xsd:annotation>
<!– definirea elementului-r ădăcină "portocale" –>
<xsd:element name="portocale" type="portocaleType" />
<xsd:complexType name="portocaleType"> <!– o secven ță de alternative –>
<xsd:sequence maxOccurs="unbounded">
<xsd:choice>
<!– m ăcar o apari ț. a elem. "achizitii" –>
<xsd:element name="achizitii" type="prodType" minOccurs="1" maxOccurs="unbounded" />
<!– idem și pt. "vanzari" –>
<xsd:element name="vanzari"
type="prodType" minOccurs="1" maxOccurs="unbounded" /> </xsd:choice>
<xsd:sequence>
</xsd:complexType> <!– tipul complex "prodType", folosit pentru achizi ții sau vânz ări –>
<xsd:complexType name="prodType"> <xsd:sequence> <xsd:element name="tip" type="xsd:string" minOccurs="1" maxOccurs="1" /> <xsd:element name="cod" type="xsd:string"
minOccurs="1" maxOccurs="1" />
<!– elementul "obs" e op țional –>
<xsd:element name="obs" type="xsd:string" minOccurs="0" maxOccurs="1" /> <xsd:element name="cantit">
<xsd:complexType>
<!– deriv ăm dintr-un tip simplu –>
<xsd:simpleContent> <xsd:extension base="xsd:unsignedInt"> <!– specif. apari ția (obligatorie)
a atributului "um" –> <xsd:attribute name="um" type="xsd:string" use="required" /> </xsd:extension>
</xsd:simpleContent>
</xsd:complexType> </xsd:element> </xsd:sequence> <!– un identificator op țional –>
<xsd:attribute name="id" type="xsd:ID"
51
Sabin Corneliu Buraga – Tehnologii Web
use="optional" />
</xsd:complexType> </xsd:schema>
Reprezentarea grafic ă a schemei e disponibil ă în figura de mai jos.
Reprezentarea generat ă de editorul <oXygen /> a schemei XML
Mai urmeaz ă să utilizăm schema de mai sus, pentru a ve rifica validitatea unei instanț e
de document XML care trebuie s ă declare un spaț iu de nume cu un URI desemnând
schema utilizat ă.
La nivel de instanță de document, vom folosi o construc ție de genul:
<portocale xmlns="urn:portocale.info" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"urn:portocale.info file:portocale.xsd"> <!– con ținut propriu-zis –>
</portocale>
Aplicația <oXygen /> XML Editor amintită mai sus poate fi folosit ă și ca validator de
documente XML.
În cele de mai jos, ilustră m anumite mesaje de eroare afi șate de unul dintre utilitarele
puse la dispoziț ie de procesorul Apache Xerces – disponibil în regin open source – în cazul
unui document XML invalid conform schemei descrise anterior:
P:\xerces> DOMPrint.exe -v=always -n -s -f portocale.xml
Error at file "portocale.xml", line 7, column 21 Message: Unknown element 'suplimentar'
Error at file "portocale.xml", line 11, column 21
Message: In element cod: Can not have element children within a simple type content Error at file "portocale.xml", line 12, column 14 Message: Required attribute 'um' was not provided
52
Sabin Corneliu Buraga – Tehnologii Web
Error at file "portocale.xml", line 13, column 15
Message: Element 'suplimentar' is not valid for content model: '((tip,cod,obs),cantit)'
Un rezultat aproape similar îl ob ținem utilizând Microsoft Visual Web Developer pentru
editarea și validarea documentelor XML – a se urm ări figura al ăturată.
Semnalarea erorilor de validare a unui document XML în cadrul instrumentului
Visual Web Developer
53
Sabin Corneliu Buraga – Tehnologii Web
7. Procesarea documentelor XML
Modelul DOM
Consorțiul Web a propus pentru prelucrarea sofisticat ă a documentelor XML și/sau
HTML un model obiectual denumit DOM ( Document Object Model ).
Acest model reprezint ă o interfață de programare a aplica țiilor destinate s ă prelucreze
documentele HTML și XML, independent ă de platform ă și de limbaj, definind structura
logică a documentelor și modalit ățile de accesare și de modificare a lor.
Structura logic ă a documentelor este o structură arborescent ă, documentele fiind mo-
delate utilizând obiecte. Modelul DOM nu furnizeaz ă doar o vizualizare structurat ă a do-
cumentului, ci și o modalitate de specificare a comportamentului lui și a obiectelor com-
ponente. Fiecare element al unui document poate fi privit, a șadar, ca un obiect, cu o iden-
titate și propriile sale funcț ii.
Recomandă rile DOM sunt structurate pe mai mul te nivele de specificare a modelului.
Nivelul 0 (pentru HTML) a fost nivelul de func ționalitate a versiunilor 3 ale navigatoare-
lor Netscape și Internet Explorer. Nivelul 1 este recomandare standardizat ă din anul
1998, iar în 2000 a fost standa rdizat DOM – nivelul 2. Par țial, nivelul 3 al DOM a fost
publicat ca recomandare oficială în anul 2004 și este în curs de standardizare complet ă.
DOM nu este o specifica ție binară și nu define ște nici o form ă de interoperabilitate la
nivel binar, în contrast cu alte tehnologii, precum CORBA ( Common Object Request Broker
Architecture ) ori COM ( Common Object Model ). DOM reprezint ă un model care specific ă
interfețe și nu este un set de structuri de da te (abstracte). De asemenea, nu define ște se-
mantica detaliată a documentelor HTML sau XML.
Specificația DOM reprezint ă documentele ca o ierarhie de obiecte-nod. Anumite tipuri
de noduri pot avea noduri copii (descenden ți) de diverse tipuri. Altele pot fi noduri frun-
ză, lipsite de descenden ți. Tipurile fundamentale de noduri sunt cele din urm ătorul tabel.
Pentru fiecare tip de nod, DOM ofer ă o interfață care desemneaz ă constantele, variabi-
lele și metodele ce vor putea fi folosite de programator într-o implementare efectiv ă a
modelului. Exist ă o serie de interfe țe fundamentale ( e.g., Document , DocumentFragment ,
Node, NodeList sau Attr), plus diverse interfe țe extinse pentru a suporta implementă ri
având în vedere procesarea documentelor HTML ori oferind facilit ăți adiț ionale.
În continuare, vom descrie succint o serie dintre interfe țele puse la dispoziț ie.
54
Sabin Corneliu Buraga – Tehnologii Web
Tip Descenden ți
Document Element, ProcessingInstruction, Comment,
DocumentType
DocumentFragment Element, ProcessingInstruction, Comment,
Text, CDATASection,
EntityReference
DocumentType –
EntityReference Element, ProcessingInstruction, Comment,
Text, CDATASection,
EntityReference
Element Element, Text, Comment,
ProcessingInstruction, CDATASection,
EntityReference
Attr Text, EntityReference
ProcessingInstruction –
Comment –
Text –
CDATASection –
Notation –
Entity Element, ProcessingInstruction, Comment,
Text, CDATASection,
EntityReference
Interfețele DOM
O interfa ță importantă este DocumentFragment care poate reprezenta un obiect-
document minimal. Sunt numeroase situa țiile în care nu trebuie lucrat cu întregul docu-
ment, ci doar cu diverse fragmente ale sale. Arborele de noduri ale unui fragment de do-
cument este un sub-arbore al structurii de nodur i a documentului luat în întregul lui. În
funcție de necesit ăți, DocumentFragment poate reprezenta o entitate XML, un element
XML sau chiar un grup de elemente.
Interfața Document reprezintă un document XML, conceptual desemnând ră dăcina ar-
borelui de noduri-obiecte ale documentului și oferind accesul la informa țiile conț inute de
acesta. Din moment ce elementele (marcatorii) , nodurile de tip text, comentariile, instruc-
țiunile de procesare nu pot exista în afara contextului unui document, interfa ța Document
conține de asemenea metodele necesare pent ru a crea aceste categorii de obiecte.
Interfața Document are ca membri trei atribute:
i. doctype reprezint ă declarația tipului de document (DTD) asociat ă unui
document particular.
ii. implementation specifică implementarea sau implement ările disponibile
pentru procesarea documentului.
55
Sabin Corneliu Buraga – Tehnologii Web
iii. documentElement (de tip Element ) desemneaz ă nodul-ră dăcină de acce-
sare a structurii arborescente a documentului.
Menț ionăm urmă toarele metode importante:
• createElement() creează un element XML;
• createTextNode() , createComment() , createCDATASection() ,
createProcessingInstruction() vor genera noduri-obiect de tip text, co-
mentariu, secț iune CDATA, instruc țiune de procesare, respectiv;
• createAttribute() creează un obiect atribut care va fi asociat unui element
specificat;
• getElementById() va întoarce elementul al c ărui atribut id se potrive ște cu cel
furnizat ca argument al acestei metode (în acest mod poate fi selectat exact un
anumit element, știind că identificatorul asociat trebuie s ă fie unic);
• getElementsByTagName() va returna o list ă ordonată de noduri NodeList pen-
tru toate elementele corespunz ătoare unui tag, ordonarea nodurilor realizându-se
prin parcurgerea în pre-ordine a arborelui;
Interfața Node define ște un tip primar pentru întregul model DOM, reprezentând un
anumit nod în cadrul arborelui as ociat unui document. Atributele nodeName , nodeValue
și attributes sunt introduse ca mecanism pentru furnizarea informa țiilor despre noduri
fără conversie de tipuri (vizualizare „simplificat ă”, nu una „orientată -obiect”). Fiecare
nod va avea asociat ă o listă ordonată conținând descenden ții săi, plus atribute specificând
nodul pă rinte, primul și ultimul nod copil, dac ă există.
Ca metode prezentând interes se pot men ționa cele care manipuleaz ă nodurile copil:
• insertBefore() permite inserarea unui nod înaintea celui curent;
• replaceChild() substituie un nod-copil;
• removeChild() elimină un nod-copil specificat;
• appendChild() adaugă un alt nod-copil;
• cloneChild() clonează un anumit nod-copil;
• hasChildNodes() întoarce true dacă există noduri-copil;
• hasAttributes() întoarce true dacă nodul are atribute (metod ă introdusă în
DOM nivelul 2);
• isSameNode() întoarce true dacă nodul curent e identic cu un altul specificat
(metodă oferită de DOM nivelul 3).
56
Sabin Corneliu Buraga – Tehnologii Web
Interfața NodeList reprezint ă o interfață care ofer ă un tip abstract de dat ă pentru co-
lecțiile ordonate de noduri, f ără a defini sau restric ționa cum va fi implementat ă efectiv
această colecție. Fiecare implementator va decide ce tipuri de date concrete vor fi utiliza-
te. Membrii colec ției se vor accesa via metoda item() pe baza unui index întreg, nume-
rotarea nodurilor începând cu valoarea 0.
Interfața NamedNodeMap este folosit ă pentru reprezentarea abstract ă a colecțiilor ne-
ordonate de noduri, prelucrate pr in intermediul numelui. Interfa ța NamedNodeMap nu
derivă din NodeList .
Interfața Attr modeleaz ă un atribut din cadrul unui obiect de tip Element. Tipic, valo-
rile permise ale atributelor sunt definite în schema XML corespunz ătoare documentului.
Un obiect Attr nu se consider ă că aparține arborelui de noduri-obiect al documentului.
Nodurile de tip Attr sunt considerate proprietăți ale elementelor (marcatorilor), putând fi
asociate nodurilor Element conț inute de obiecte de tip DocumentFragment.
Interfața Element derivă din Node și oferă metode de accesare a obiectelor Attr, prin
nume sau prin valoare: getAttribute() , setAttribute() , removeAttribute() ,
getAttributeNode() , setAttributeNode() , removeAttributeNode() .
Interfața Text este o interfa ță reprezentând con ținutul textual (date de tip șiruri de ca-
ractere) al unui nod Element sau Attr. Dacă între tag-urile de început și de sfârșit nu exist ă
alți marcatori, atunci textul va fi stocat într-un obiect implementând interfa ța Text .
În prezent, exist ă implement ări complete pentru DOM – nivelurile 1 și 2 – în majori-
tatea limbajelor de programare actuale (C/C++, C#, Java, JavaScript, Perl, Python etc.).
Drept exemple notabile de biblioteci și interfețe de programare disponibile în diverse
limbaje pot fi enumerate JAXP (Java API for XML Parsing ), JDOM , libxml ,
MSXML.NET, QDOM , Xerces DOM API și XML::DOM .
Inspectarea arborelui DOM se poate realiza di rect în navigatorul Mozilla Firefox, via
componentei DOM Inspector . O captură -ecran edificatoare este dat ă mai jos.
57
Sabin Corneliu Buraga – Tehnologii Web
Folosirea componentei DOM Inspector pentru vizualizarea arborelui DOM
asociat unui document XHTML
O serie de exemple de manipulare prin DO M a documentelor XML vor fi furnizate pe
parcursul acestei lucr ări.
Procesarea XML prin SAX
Pentru documente de dimensiuni mari, mode lul DOM este ineficient, deoarece înainte de
a se realiza prelucrarea, do cumentul respectiv trebuie înc ărcat complet în memorie. Ca
alternativă la implement ările DOM, exist ă o interfață simplă de programare destinată ma-
nipulării documentelor XML, îns ă nu atât de complet ă precum DOM. Aceast ă interfață
este denumit ă SAX ( Simple API for XML ).
Majoritatea celor care se ocup ă de prelucrarea documentelor XML v ăd structura unui
document în form ă arborescent ă, iar modelul DOM ofer ă din plin posibilitatea de a ma-
nipula informaț iile în aceast ă manieră. Din punctul de vedere al implementatorilor, aceas-
tă abordare are numeroase deficien țe (maniera de stocare intern ă a arborelui de obiecte,
parcurgerea lui etc.). Unul dintre beneficiile utiliz ării interfeței SAX este c ă arborele nu
mai trebuie construit, dându-i-se programatorului o alt ă cale de analiz ă a documentului
58
Sabin Corneliu Buraga – Tehnologii Web
XML. Mai mult, SAX poate ajuta la converti rea datelor din formatul arborescent DOM
în alt format mai comod, iar pentru procesare nu este necesar a se memora întreaga in-
formație XML, ci numai p ărțile dorite.
Interfața SAX reprezint ă un efort independent de Consor țiul Web de standardizare a
procesării XML condus ă de evenimente. În acest moment, SAX este acceptat ca standard
industrial, fiind folosit pe scar ă largă în multe aplicaț ii, dar nu trebuie privit ca o înlocuire
a modelului DOM, ci drept o abordare complementar ă.
Actualmente, sunt disponibile dou ă versiuni ale specificaț iilor SAX: varianta 1.0 și vari-
anta 2.0, mai complex ă, oferind suport pentru spa ții de nume și extensii. Mai multe detalii
la www.saxproject.org .
În esență, după inițierea încă rcării conținutului documentului XML dorit a fi procesat,
pentru fiecare tip de construc ție XML sintactic ă (început de tag, sfârșit de tag, conținut
(text), instruc țiune de procesare, comentariu etc.) se va „aprinde” un eveniment care va fi
tratat de o func ție sau metod ă (handler ). Funcțiile (metodele) de tratare se specific ă de că-
tre programator, pentru fiecare tip de construc ție XML în parte.
Astfel, programul consum ă și tratează evenimente produse de procesorul SAX folosit.
Minimal, trebuie definite urmă toarele func ții/metode:
• trateaz ă_tag_început (procesor, elem, atrib) – va fi apelat ă la apariția
unui tag de început și are drept parametri procesorul XML folosit, numele ele-
mentului corespunz ător tag-ului și lista de atribute ale acestuia (dac ă există);
• trateaz ă_tag_sfâr șit (procesor, elem) – va fi invocat ă la apariția unui
tag de final, argumentele având semnifica țiile de mai sus;
• trateaz ă_date_caracter (procesor, date) – va fi apelat ă la apariția unor
date caracter (con ținut propriu-zis aflat între marcatorii de început și sfâr șit).
Mai rămâne să atașă m pentru fiecare eveniment de apari ție a tag -ului de început, a tag-
ului de sfâr șit și a datelor-con ținut funcțiile de tratare descrise anterior. SAX ofer ă pentru
aceasta dou ă funcții/metode de forma:
• set_element_handler ( trateaz ă_tag_început , tratea-
ză_tag_sfâr șit)
• set_character_data_handler (trateaz ă_date_caracter )
Sunt oferite implement ări SAX pentru majoritatea limba jelor de programare actuale.
Navigatoarele Web nu ofer ă suport pentru proces ări XML via SAX.
59
Sabin Corneliu Buraga – Tehnologii Web
Analizoare XML
Desigur, pentru prelucrarea documentelor XML vom trebui s ă recurgem la un analizor
XML deja implementat în limbajul nostru preferat. Analizoarele XML pot fi de dou ă ti-
puri:
– analizoare f ără validare care vor procesa un document XML verificând dac ă acesta
este bine-formatat (adic ă respectă regulile privind sintaxa și modul de imbricare
corectă a tag -urilor);
– analizoare cu validare care vor realiza procesarea do cumentului XML prin verifica-
rea regulilor formale descrise de un DTD sau o schem ă atașate acestuia (aceste
analizoare sunt mai complexe).
Unul dintre cele mai cunoscute analizoare f ără validare este Expat, disponibil în regim
open source. De asemenea, pot fi utiliz ate analizoarele cu posibilit ăți de validare JAXP
(Sun), JDOM , libxml (parte a proiectului GNOME), MSXML (Microsoft) sau Xerces
(Apache). Practic, toate mediile de dezvoltare Web actuale ofer ă posibilități de validare a
documentelor XML via DTD sau XML Schema și diverse modalit ăți de procesare.
Pentru verificarea format ării corespunz ătoare a documentelor XML se pot utiliza chiar
și navigatoarele Web actuale.
De exemplu, fie documentul XHTML eronat:
<?xml version="1.0"?>
<html xmlns:html="http://www.w3.org/1999/xhtml">
<table width=600 align=center>
</table>
Vom obține mesajul de eroare din capturile-ecran de mai jos:
60
Sabin Corneliu Buraga – Tehnologii Web
Verificarea bunei-format ări a documentelor XML folosind navigatoarele Web
61
Sabin Corneliu Buraga – Tehnologii Web
8. Transform ări XML
Din cele descrise mai sus, am v ăzut că în mod uzual un document XML separ ă conținu-
tul de maniera de formatare/procesare (specific ă, deseori, unui anumit scop și/sau unei
aplicații).
Pentru a prezenta – într-o manier ă dorită și comodă – datele XML, trebuie specificat ă
o modalitate de redare via a șa-numita foaie de stiluri ( stylesheet ). Soluț iile actuale sunt date
de două direcții importante standardizate de Consorț iul Web:
• CSS ( Cascading Style Sheets ) – folosesc o sintax ă non-XML, prezint ă o flexibilitate
limitată și nu ofer ă o redare dependent ă de context;
• XSL ( Extensible Stylesheet Language ) – adoptă o sintaxă XML, au o flexibilitate mai
mare, iar procesarea se poate face în func ție de context; de asemenea, se pot opera
modificări de structură , oferindu-se facilit ăți pentru realizarea de interog ări simple.
În cele ce urmeaz ă, ne vom referi la transformă rile XSL. Pentru efectuarea transform ă-
rilor se consider ă că documentul XML este un arbore format din noduri de diverse tipuri,
precum element-r ădăcină, elemente, con ținut textual, atribute, spa ții de nume, instruc ți-
uni de procesare, comentarii etc. Pentru nodur i de tip text, caracter ele rezervate trebuie
rescrise cu entit ăți.
Fiecare foaie de stiluri XSL const ă, simplist vorbind, din reguli compuse dintr-un model
(pattern) și o acțiune , modelul identificând un nod sa u grup de noduri XML asupra c ăruia
se va aplica ac țiunea. Expresiile modelului sunt exprimate în limbajul XPath, iar ac țiunile
– transformă rile efectuate asupra elementelor documentului – sunt specificate în XSLT
(XSL Transformations). Transform ările se aplic ă recursiv tuturor nodurilor XML care satis-
fac modelul/ șabloanele de reguli ( pattern-matching ).
Limbajul XPath
Vom prezenta în continuare principalele tr ăsături ale limbajului XPath. Scopul acestuia
este să adreseze pă rți dintr-un document XML, oferind facilit ăți de baz ă pentru manipu-
larea unor tipuri de date simple ( șiruri de caractere, numere etc.) și operând la nivelul
structurii abstracte a documentului XML (i.e. arborele).
Construcția fundamental ă este expresia XPath , evaluarea acesteia realizându-se în func-
ție de context. Acest context poate fi desemnat de un nod al documentului XML, de po-
ziție, o funcție de bibliotec ă sau de o declara ție a unui spaț iu de nume.
În urma evaluă rii expresiei, este întors un obiect, adic ă: o mulț ime de noduri ( node-set ),
o valoare logic ă (true, false), un num ăr (float), un șir de caractere.
Asupra nodurilor, pot fi folosi ți operatorii descri și în continuare.
62
Sabin Corneliu Buraga – Tehnologii Web
Operatorul / (descendent) este utilizat s ă defineasc ă o ierarhie de elemente (o cale de
parcurgere a nodurilor din arborele asoc iat documentului). Câteva exemple: / și
/cuprins/capitol/autor (a se vedea figura urm ătoare).
Utilizarea operatorului „/”pentru selectarea unui element descendent
Operatorul // (traversare recursiv ă) traverseaz ă în adâncime întreg sub-arborele unui
anumit nod; exemple: //capitol și //cuprins .
Operatorul * (wildcard ) e folosit uzual pentru elemente și atribute; ofer ă toate elemente-
le/atributele de pe un anumit nivel al arborelui. Ca exemplificare, furniz ăm capitol/* și
/cuprins/*/nume .
Operatorul . (nodul curent) este un operator contextual și desemneaz ă nodul curent;
exemple: ./capitol și ./cuprins/* .
Operatorul @ (atribut) e utilizat s ă specifice valoarea unui anumit atribut; drept exem-
plificări, furnizăm //capitol/@nr și table/@* .
Operatorul : (spațiu de nume) este folosit s ă selecteze elemente/atribute pe baza unui
spațiu de nume – pentru //html:* obținem toate construc țiile HTML existente într-un
document ce au fost prefixate de spa țiul de nume corespunz ător.
Operatorul [] (filtru/index) aplic ă un filtru sau localizeaz ă nodurile pe baza unui index
(numerotarea începe de la 1); de exemplu: /cuprins/capitol[2] sau
//capitol[@nr="3"] .
De asemenea, pentru valori logice și întregi pot fi utiliza ți operatorii uzuali rela ționali
(„or”, „and”, „=”, „!=”, „<=”, „<”, „>”, „>=”) și aritmetici („+”, „—”, „*”, „div” și
„mod”).
Comparațiile de șiruri de caractere se realizeaz ă în manier ă case-sensitive .
Limbajul XPath clasific ă tipurile de noduri în a șa-numitele axe , dintre care men ționăm:
• axa nodului curent ( context node): self;
• axa nodului p ărinte: parent ;
63
Sabin Corneliu Buraga – Tehnologii Web
• axa nodurilor copil: child;
• axa nodurilor descendente: descendent ;
• axa nodurilor de tip atribut: attribute ;
• axa nodurilor spa țiilor de nume: namespace .
Pentru specificarea unei axe, se folose ște operatorul :: precedat de numele axei dorite.
Un exemplu este //child::*[@nr > 2] care selecteaz ă toate nodurile copil având va-
lori mai mari decât 2 pentru atributul nr, parcurgându-se recursiv întreg arborele XML
În locul preciz ării anumitor axe, se poate recurge la sintaxa prescurtat ă. Astfel, self se
poate substitui cu „ .”, parent cu „..”, attribute cu „@” și namespace prin „:”.
Specificația XPath descrie și suita de func ții de bază care pot fi folosite în cadrul unei
expresii. Le men ționăm pe cele mai importante:
• privitoare la noduri: id(), position(), count() , name(), namespace-uri() , last() etc.;
• referitoare la tipuri de noduri: node(), text(), comment() , processing-instruction() și altele;
• vizând șirurile de caractere: concat() , starts-with(), contains(), substring() , string-length() ,
translate() etc.;
• privitoare la valori logice: not(), true() , false() ;
• referitoare la numere: sum() , floor(), round(), number() etc.
Limbajul XSLT
Limbajul XSLT ( XSL Transformations) are drept scop transformarea documentelor
XML în alte structuri (tipuri) de documente: XML, HTML, text.
Pentru a avea efectul scontat, construc țiile XSLT trebuie s ă aparțină spațiului de nume
desemnat de URI-ul http://www.w3.org/1999/XSL/Transform . O foaie de stiluri XSLT are
drept element-r ădăcină <xsl:stylesheet> sau <xsl:transform> și include diverse
șabloane ( template -uri) de transformare, m ăcar un șablon la nivelul r ădăcină.
Pentru realizarea transform ărilor, se recurge la expresii XPath folosite la selectarea no-
durilor dorite a fi procesate, la specificarea condiț iilor de procesare (contextul) sau la ge-
nerarea textului de ie șire ( e.g., un alt document XML, o pagin ă HTML ori text obi șnuit).
Modelul proces ării consideră că o listă de noduri-sursă (input) este prelucrat ă pentru a se
genera un fragment de arbore de noduri la destina ție (output ). Inițial, se proceseaz ă nodul-
rădăcină, la care se insereaz ă noduri copil generate de șabloane aplicate prin pattern-
matching unei liste de noduri selectate (în manier ă recursivă) – via expresii XPath.
Regulile șabloanelor identifică noduri asupra c ărora se vor aplica transform ări, selectarea
nodurilor realizându-se prin XPath. Un șablon se define ște prin elementul
64
Sabin Corneliu Buraga – Tehnologii Web
<xsl:template> , iar aplicarea unui șablon se realizeaz ă cu elementul <xsl:apply-
templates> .
Crearea arborelui de ie șire se realizeaz ă ținând cont de faptul c ă într-un șablon orice
element ce nu apar țin spațiului de nume XSLT sunt copiate, f ără a fi operate modific ări,
în arborele de ie șire. De asemenea, pot fi generate diverse tipuri de noduri:
<xsl:element> , <xsl:attribute> , <xsl:text> , <xsl:comment> etc. Pentru a avea
acces la rezultatele expresiilor XPath implicând valori ale documentului surs ă, vom recur-
ge la <xsl:value-of> . Diverși parametri de control al modului de generare a ie șirii se
pot stabili via <xsl:output> .
Foile de stiluri XSLT pot fi considerate programe, permiț ându-se exprimarea de con-
strucții repetitive: <xsl:for-each> , de construc ții de test: <xsl:if> , <xsl:choose> ,
<xsl:when> și <xsl:otherwise> , de copieri de noduri: <xsl:copy> și <xsl:copy-
of>, de sort ări de noduri: <xsl:sort> , de includeri de alte foi de stiluri:
<xsl:include> , de variabile și parametri: <xsl:variable> și <xsl:param> .
Facem observa ția că, spre deosebire de limbajele de programare clasice, variabilele (de-
clarate via <xsl:variable> ) au valori imutabile : valoarea asociat ă nu se schimbă din
moment ce a fost evaluat ă. Astfel, dup ă o construc ție de genul <xsl:variable
name="ani" select="21 + 12" /> , o încercare de a atribui o alt ă valoare variabilei
ani conduce la apari ția unei erori. Parametrii (specifica ți prin <xsl:param> ) își pot modi-
fica ulterior valoarea. Apelarea (invocarea) unui șablon se poate realiza cu pasarea de va-
lori parametrilor via <xsl:with-param> .
Suplimentar, sunt puse la dispozi ție diverse func ții de bază:
– desemneaz ă nodul curent: current() ;
– adresează un alt document XML, diferit de cel curent: document() ;
– verifică existența unei func ții (suport pentru extensii): function-available() ;
– formateaz ă valori numerice: format-number() ;
– oferă informații privitoare la sistemul de procesare: system-property() .
Exemple
Pentru început, consider ăm documentul projects.xml care stocheaz ă o listă de proiecte
propuse spre implementare și care are structura:
<?xml-stylesheet href="projects.xsl" type="text/xsl" ?>
<projects update="…">
<project class="A">
<title>…</title>
<desc>…</desc>
65
Sabin Corneliu Buraga – Tehnologii Web
<stud>…</stud>
<url>…</url>
</project>
</projects>
Ne propunem s ă generăm un document XHTML pentru redarea, în navigator, a aces-
tei liste. Dup ă cum se poate remarca, folosind instrucț iunea de procesare <?xml-
stylesheet …?> atașăm o foaie de stiluri XSLT numit ă projects.xsl și având urm ătorul
conținut:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<!– șablonul-r ădăcină –>
<xsl:template match="/"> <html>
<head> <title>Proiecte</title>
</head>
<body>
<!– aplic ăm șablonul pentru vizualizarea proiectelor –>
<div id="listing"> <xsl:apply-templates />
</div>
</body>
</html> </xsl:template>
<!– șablonul pentru proiecte –>
<xsl:template match="projects"> <ul>
<!– lista nenumerotat ă conținând date
despre fiecare proiect –> <xsl:for-each select="project">
<li> <h5>
<!– titlul proiectului + clasa –>
<xsl:value-of select="title" />
(<xsl:value-of select="@class" />)
</h5>
<p><!– descrierea proiectului –>
<xsl:value-of select="desc" /> </p>
<div>Resurse suplimentare:
<!– construim o leg ătură –>
<a> <!– inser ăm atributul ’href’ –>
<xsl:attribute name="href"> <xsl:value-of select="url" />
66
Sabin Corneliu Buraga – Tehnologii Web
</xsl:attribute>
<!– inser ăm atributul ’title’ –>
<xsl:attribute name="title">Mai multe detalii</xsl:attribute>
<xsl:value-of select="url" />
</a>
</div>
</li>
</xsl:for-each>
</ul> <p>Ultima actualizare:
<xsl:value-of select="@update" /></p>
</xsl:template>
</xsl:stylesheet>
Codul generat este XHTML, pentru ca foaia s ă fie considerată un document XML bi-
ne formatat. Sunt specificate dou ă șabloane, primul construind scheletul general al paginii
Web, iar al doilea generând lista privitoare la proiecte. Al doilea șablon va fi invocat la
potrivirea cu succes a apari ției elementului <projects> . Similar, <xsl:for-each> va
furniza lista de noduri rezultat ă în urma evalu ării expresiei XPath project (același efect
îl avea expresia absolut ă /projects/project ).
Primul pas al transform ării va conduce la invocarea șablonului-r ădăcină, în urma potri-
virii cu nodul-r ădăcină desemnat de operatorul „ /”. Toate nodurile care nu apar țin spa-
țiului de nume xsl vor fi copiate la ie șire (astfel, se construie ște codul-surs ă al paginii
Web, pân ă la apariția elementului <xsl:apply-templates /> . Acest eveniment va
conduce la invocarea șablonului potrivit cu expresia project , în cazul nostru
<xsl:template match="projects"> …</xsl:template> , care va genera lista ne-
numerotat ă a proiectelor. Cele specificate în cadrul <xsl:for-each> vor fi repetate de
atâtea ori câte noduri sunt returnate de expresia specificat ă ca valoare a atributului se-
lect al elementului <xsl:for-each> .
Se observ ă generarea unei leg ături <a href="…" title="…">…</a> , pentru
aceasta recurgând la <xsl:attribute> pentru a ataș a cele dou ă atribute – href și
title – elementului <a> al limbajului XHTML.
Vom rafina pu țin cele scrise mai sus, știind că proiectele propuse sunt de diverse clase
de dificultate, indicate de valorile atributului class al elementului <project> . Intențio-
năm să afișă m în mod diferit descrierea proiectului, conform clasei sale. Pentru aceasta,
vom recurge la construc țiile de test (omitem restul foii de stiluri):
<p>
<!– în func ție de clasa proiectului,
vom afi șa diferit descrierea lui –>
<xsl:choose>
<!– proiect de clasa ’A’ –>
67
Sabin Corneliu Buraga – Tehnologii Web
<xsl:when test="@class = 'A'">
<span style="color: darkred">
<xsl:value-of select="desc" />
</span>
</xsl:when>
<!– proiect de clas ă ’B’ sau ’C’ –>
<xsl:when test="@class = 'B' or @class = 'C'"> <span style="color: navy">
<xsl:value-of select="desc" />
</span> </xsl:when>
<!– proiect de clas ă necunoscut ă –>
<xsl:otherwise> <span style="color: black">
<xsl:value-of select="desc" />
</span>
</xsl:otherwise>
</xsl:choose>
</p>
De asemenea, putem verifica dac ă <url> există sau are o valoare nenul ă, pentru a nu
insera inutil legă tura spre resursele suplimentare privitoare la un proiect:
<!– dacă nu exist ă elementul "url",
nu afi șăm legă tura spre resurse suplimentare –>
<xsl:if test="url != ''">
<!– (url != '') este echivalent cu (not url == '') –>
…
</xsl:if>
Următorul pas este s ă ordonăm lista proiectelor conform unor criterii. Pentru aceasta,
folosim o construc ție de genul:
<!– lista nenumerotat ă conținând datele
despre fiecare proiect –>
<xsl:for-each select="project"> <!– sort ăm în ordinea descresc ătoare a num ărului
de studen ți (sortarea e lexicografic ă) –>
<xsl:sort select="stud" order="descending" />
<!– apoi alfabetic dup ă titlul proiectului –>
<xsl:sort select="title" /> <li>
<h5><xsl:value-of select="title" /></h5> </li>
</xsl:for-each>
Vom recurge și la variabile, calculând valoarea RGB a culorii de fundal pe care o vom
stabili în func ție de num ărul maxim de studen ți arondaț i unui proiect – se utilizeaz ă func-
ția concat() pusă la dispozi ție de XPath:
68
Sabin Corneliu Buraga – Tehnologii Web
<xsl:for-each select="project">
<xsl:sort select="title" />
<li>
<!– în func ție de num ărul de studen ți,
gener ăm o culoare de fundal –>
<xsl:variable name="fundal"
select="concat('rgb(',stud*90 ,',', stud*90,
',', stud*30, ')')" />
<p style="background-color: {$fundal}">
<!– afi șăm poziț ia, numerotând astfel proiectele –>
<xsl:value-of select="(position())" />.
<xsl:value-of select="title" />
</p>
</li>
</xsl:for-each>
După cum se poate remarca, valoarea unei variabile se acceseaz ă prefixând numele va-
riabilei cu semnul „ $”.
Realizarea transform ărilor se poate face direct în cadrul unui navigator Web de ultim ă
generație, precum Mozilla Firefox 1 ori Internet Explorer 6 sau o versiune superioar ă. De
asemenea, exist ă o sumedenie de modalit ăți de realizare a transform ărilor la nivel pro-
gramatic via procesoare XSLT precum Apache Xalan , libxslt , Saxon etc.
Drept exemple de aplica ții care folosesc tehnologia XSLT amintim:
– Adobe Help Center – sistem de ajutor utilizat de suita Adobe Creative Suite 2, dar
funcționând și independent, disponibil gratuit;
– Apache AxKit – mediu de publicare a datelor implementat în Perl;
– Apache Forrest – mediu de dezvoltare de situri Web;
– Microsoft InfoPath – editor/procesor de formulare interactive, parte a Microsoft
Office 2003 și 2007;
– Open Office – suita de birou disponibilă în regim open source .
69
Sabin Corneliu Buraga – Tehnologii Web
70
Sabin Corneliu Buraga – Tehnologii Web
71
PPaarrtteeaa IIIIII –– PPrrooggrraammaarreeaa aapplliiccaațțiiiilloorr WWeebb
„O arhitectur ă bună poate îmbun ătăți calitatea vie ții oamenilor.”
Alfred Hitchcock
1. Maniere de programare pe partea de server
2. Standardul CGI ( Common Gateway Interface )
3. PHP ( PHP: Hypertext Preprocessor )
4. Servicii Web
Sabin Corneliu Buraga – Tehnologii Web
72
Sabin Corneliu Buraga – Tehnologii Web
1. Maniere de programare pe partea de server
Pentru început, vom trece în revist ă modalitățile tradiț ionale de programare, pe partea de
server, a aplica țiilor Web.
Standardul CGI
Din punct de vedere istoric, prima metodă de generare dinamic ă pe server a reprezent ări-
lor unor resurse solicitate de un client Web vizează standardul de facto CGI ( Common
Gateway Interface) – detalii în S. Buraga et al., Programarea aplica țiilor Web folosind bash și Perl ,
Polirom, Ia și, 2002.
Principalele dezavantaje sunt cele pr ivitoare la invocarea concurent ă a mai multor
scripturi CGI, problemele survenite fiind asigurarea scalabilit ății, a integr ării cu alte apli-
cații, persisten ța conexiunii și contextul invoc ării (rulării). Drept solu ții se pot adopta teh-
nici de caching , includerea suportului pentru CGI direct în serverul Web și folosirea așa-
numitului FastCGI.
Servere de aplica ții Web
Evoluț ia a continuat cu apari ția altor interfe țe de programare Web pe partea de server.
Astfel, pot fi men ționate mod_perl pentru Apache, NSAPI ( Netscape Server API ) și ISAPI
(Microsoft Internet Services API), func ționând intern conform modelului CGI.
De un succes larg se bucur ă însă serverele de aplica ții Web, printre cele mai populare
numărându-se ASP ( Active Server Pages ), ASP.NET (parte integrant ă a .NET Framework ),
PHP ( PHP: Hypertext Preprocessor ) și JSP ( Java Server Pages ). Principalele avantaje ale acesto-
ra față de vechiul, dar înc ă utilizatul CGI, sunt urm ătoarele: suportul pentru sesiuni, asi-
gurarea load-balancing -ului, conexiunile persistente cu si stemele de baze de date, suportul
pentru template -uri de interfa ță (șabloane, componente Web, skin-uri ș.a.m.d.), facilit ățile
vizând modularitatea, securitatea.
Vom descrie în continuare caracteristicile comune serverelor de aplica ții Web, fără a
intra în am ănunte privind modul de programare și exploatare.
Un server de aplica ții Web ofer ă posibilitatea de a include cod (script) direct în cadrul
documentelor Web, cod invocat pe server. Astfel, se genereaz ă conținut dinamic pe par-
tea de server, eventual procesându-se un num ăr de surse de date – e.g., fișiere text, baze
de date, documente XML, multimedia etc. – disp onibile pe acel server sau pe alte calcula-
toare. Maniera de includere a codului menit s ă proceseze datele și s ă genereze reprezen-
tări destinate clientului depinde de serverul de aplica ții folosit. Drept exemple, putem da
<% … %> pentru ASP, ASP.NET și JSP, <?php … ?> în cazul PHP și, mai general,
<script language= "…">…</script> .
73
Sabin Corneliu Buraga – Tehnologii Web
Un server de aplica ții Web pune la dispozi ție un cadru de lucru oferind urm ătoarele fa-
cilități.
În primul rând ofer ă posibilitatea folosirii unui limbaj sau o suit ă de limbaje de pro-
gramare – pentru ASP, se poate recurge la JScript și VBScript (un dialect ECMAScript),
interpretate pe partea de server, iar în cazul ASP.NET la limbajele .NET oferite
(ASP.NET este independent de limbaj, progra marea putându-se realiza în oricare din
limbajele suportate de .NET Framework : C#, J#, Perl.NET, VB.NET și multe altele). De
asemenea, se poate folosi Java (via servlet -uri și JSP) sau Python (pentru Zope).
Al doilea aspect privește recurgerea la func ționalitățile oferite de API-ul de baz ă –
aceasta are leg ătură cu utilizarea „puterii” limbajului și a cadrului de lucru (e.g. , folosirea
de funcții/clase predefinite). În func ție de mediu, se poate asigura migrarea relativ facil ă
de la aplica ții clasice la cele destinate Web-ului. În plus, pot fi puse la dispoziț ie facilități
referitoare la accesul la resurse, consisten ță și siguranță. Un alt aspect important este cel
al asigurării independenț ei de platform ă. Funcționalitățile incluse în API-ul de baz ă nu ar
trebui să necesite recompilarea serverului de aplicaț ii (acolo unde se poate). Exist ă două
mari puncte de vedere: existen ța unei pleiade impresionante de func ții predefinite (cazul
PHP, de exemplu) sau oferirea unei funda ții de ierarhii de clase, uneori chiar independen-
te de limbaj (vezi ASP.NET CLR – Common Language Runtime).
Al treilea avantaj este suportul pentru bazele de date – se ofer ă acces robust la diverse
servere de baze de date, eventual folosindu-se interfe țe standardizate, precum ADO ( Ac-
tive Database Objects ) sau JDBC ( Java DataBase Connectivity ). Pentru PHP, exist ă funcții
predefinite pentru o pleiad ă de servere de baze de date, majoritatea rela ționale, via biblio-
teci incorporate ( e.g., SQLite și mysqli în PHP5) sau extensii, în plus putându-se folosi in-
terfața ODBC. „Legarea” datelor de codul-program ( data binding ) poate fi realizată auto-
mat ( e.g., ASP.NET) sau manual (PHP). Eventual, se pot folosi framework-uri adiț ionale
(pentru Java, un exemplu fiind Hibernate ).
Un alt aspect important e suportul pentru interac țiunea Web – pot fi utilizate controale
Web disponibile pe server, fie emulând câmpurile din formularele HTML, fie oferind
elemente interactive noi (e.g. , calendarul). Unele medii, ca ASP.NET sau PHP5 via PRA-
DO, permit astfel generarea de co d HTML (plus JavaScript) în funcț ie de clientul Web.
ASP.NET oferă și un model de procesare a evenimentel or provenind de la client, permi-
țând scrierea de aplica ții conduse de evenimente ( event driven Web applications ). Pe acest
model se bazeaz ă și PRADO, implementat în PHP5. De asemenea, se pot folosi unele
framework-uri suplimentare oferind suport pentru AJAX.
De asemenea, de interes sunt facilit ățile acordate procesă rii de documente XML – în
mod natural, trebuie puse la dispozi ție modalit ățile de prelucrate via DOM și SAX, even-
tual folosind o interfa ță simplificat ă (ASP.NET și PHP5). Pot fi suportate și alte tipuri de
procesări, precum XPP pentru Java. Pentru o pa rte dintre servere, se poate realiza și vali-
darea (în ASP.NET și JSP exist ă clase de validare prin scheme XML și DTD). De aseme-
nea, se pot efectua transform ări XSL și „legări” ale datelor ( XML data binding ). Orice ser-
74
Sabin Corneliu Buraga – Tehnologii Web
ver de aplica ții Web la momentul actual acord ă suport pentru implementarea și invocarea
de servicii Web.
Un aspect interesant este cel privitor la recurgerea la medii de dezvoltare – unele dintre
ele sunt deosebit de sofisticate, încadrându-se în una dintre categoriile: comerciale
(Delphi, Visual Studio .NET, JBuilder, Zend etc.), gratuite (Eclipse, NVU, WebMatrix și
altele), de evaluare/educa ționale (Kylix, Visual Express etc.). De asemenea, pot fi utilizate
diverse depanatoare, utilitare de calcul al execu ției (profilers ) și optimizatoare de cod. Sunt
acordate și facilități pentru dezvoltatorii de servicii Web, plus pot fi folosite clase, com-
ponente și biblioteci adi ționale, disponibile în regim comercial, gratuit sau open source .
Alt aspect este reprezentat de suportul acordat inginerilor software – aplica țiile Web
sunt de cele mai multe ori structurate pe mai multe niveluri ( N-tier), unele framework-uri
încurajând folosirea șabloanelor de proiectare ( design patterns ). De asemenea, se poate re-
curge și la unități de testare automat ă (e.g., JUnit, PHP Unit etc.), iar unele medii prezint ă
modalități de generare automat ă de documenta ții, în diverse formate.
De asemenea, se pot pune la dispozi ție și alte facilit ăți. De pildă, se poate oferi suport
pentru dezvoltarea de aplica ții Web complexe: descrierea atributelor unei pagini sau ale
unui sit (vizând limbajul, importul de resurse, sesiunile Web, tratarea evenimentelor, tipul
conținutului etc.), modul de autentificare, tema vizual ă (skin), șabloane de redare (template –
uri) etc. Aplica țiile Web pot folosi și containere de componente, precum (Enterprise) Java
Beans .
75
Sabin Corneliu Buraga – Tehnologii Web
2. Standardul CGI ( Common Gateway Interface )
Standard pentru interacț iunea clienț ilor Web cu serverele Web, Common Gateway Interface
se află în prezent la versiunea 1.1. Un program CGI, numit în mod uzual script, se execut ă
pe serverul WWW, fie în mod explicit (apelat din cadrul paginii printr-o directiv ă specia-
lă), fie la preluarea informa țiilor aflate în cadrul câmpurilor unui formular interactiv sau
coordonatelor unei zone senzitive (image map).
Acest standard confer ă interactivitate paginilor Web, documentele HTML putând ast-
fel să-și modifice în mod dinamic conț inutul și să permită prelucrări sofisticate de date.
Programele CGI pot fi scrise în orice limbaj, fiind interpretate (cazul Perl, Tcl, script-
uri shell Unix) sau compilate (C, C++, Delphi). Regulile care trebuie respectate la conce-
perea unui program CGI sunt:
• programul scrie datele la ie șirea standard ( stdout );
• programul genereaz ă antete care permit serverului Web s ă interpreteze corect ie-
șirea script-ului (folosindu-se specifica țiile protocolului HTTP).
Cele mai multe script-uri CGI sunt concepute pentru a procesa datele introduse în
formulare. Un formular se definește în XHTML folosindu-se tag-uri specifice pentru afi-
șarea conținutului și introducerea datelor de c ătre client, iar script-ul CGI, executat de
server, va prelua con ținutul acelui formular și-l va prelucra, returnân d, eventual, rezultate-
le.
Antetul trimis serverului de c ătre programul CGI va respecta specifica țiile MIME,
conțînând de exemplu Content-type: text/html (document HTML) sau Content-
type: image/jpeg (imagine JPEG) ori Content-type: text/plain (text obișnuit).
Programului CGI i se vor transmite în diverse variabile de mediu sau de la intrarea
standard informa ții referitoare la datele de procesat sau la clientul care a ini țiat cererea (de
exemplu, SERVER_PORT , REQUEST_METHOD , SCRIPT_NAME , QUERY_STRING ,
REMOTE_HOST etc.) în func ție de metoda de transfer utilizat ă.
Oricare program CGI va putea dispune de valorile urm ătoarelor variabile de mediu,
dintre care men ționăm:
• REQUEST_METHOD specifică m e t o d a p r i n c a r e v a f i f o r m u l a t ă cererea: GET ,
POST , PUT etc.
• QUERY_STRING conține toate informa țiile de dup ă caracterul " ?" din URL-ul care
referă script-ul CGI, informa ții care vor trebui decodificate de acel script.
• REMOTE_HOST indică mașina-gazdă care a formulat cererea (calculatorul care a
apelat script-ul CGI prin intermediul unei pagini Web).
• REMOTE_ADDR furnizeaz ă adresa IP a clientului care a formulat cererea, asociat ă
adresei simbolice date de REMOTE_HOST .
76
Sabin Corneliu Buraga – Tehnologii Web
• CONTENT_TYPE indică tipul conținutului datelor vehiculate, pentru cererile care au
atașate informa ții suplimentare, precum PUT sau POST (de exemplu, pentru un
formular transmis prin metoda POST , normal ar trebui ca variabila CON-
TENT_TYPE să aibă valoarea application/x-www-form-urlencoded ).
• CONTENT_LENGTH conț ine numă rul de octe ți ai datelor trimise de client.
Suplimentar, liniile antet (dac ă există) recepționate de la client prin intermediul proto-
colului HTTP vor fi plasate în variabile de mediu având numele prefixate de HTTP_ . Ca
exemple de astfel de variabile, pot fi amintite:
• HTTP_ACCEPT indică tipurile MIME pe care le va accepta clientul, fiecare tip fiind
despărțit de virgul ă așa cum specific ă protocolul HTTP: tip/subtip,
tip/subtip .
• HTTP_USER_AGENT furnizeaz ă numele și versiunea browserului Web care a for-
mulat cererea, în formatul general: software/versiune bibliote-
ca/versiune .
Următorul script Perl va afi șa toate variabilele de mediu la care are acces prin inter-
mediul interfe ței CGI:
#!/usr/bin/perl
# Afișează mediul
print "Content-type: text/plain\n\n";
print "Environment:\n\n";
foreach $key (keys %ENV) {
printf "%16s = %s\n", $key, $ENV{$key};
}
Variabila predefinit ă ENV este un tablou asociativ con ținând perechile ( nume de variabi-
la de mediu, valoarea variabilei ).
Un script CGI similar, scris în bash ( Bourne Again Shell ), este:
#!/bin/bash # Afișează mediul
echo "Content-type: text/plain"
echo
set
Un posibil rezultat al execu ției programului de mai sus poate fi:
HTTP_ACCEPT_LANGUAGE=en SERVER_SIGNATURE=<ADDRESS>Apache/1.3.12 Server at endirra.ro
Port 80</ADDRESS>
SCRIPT_FILENAME=/home/httpd/cgi-bin/env.pl.cgi
HTTP_ACCEPT_CHARSET=iso-8859-1,*,utf-8
HTTP_PRAGMA=no-cache SERVER_NAME=endirra.ro
77
Sabin Corneliu Buraga – Tehnologii Web
HTTP_CONNECTION=Keep-Alive
REMOTE_ADDR=127.0.0.1
REQUEST_URI=/cgi-bin/env.pl.cgi
HTTP_HOST=endirra
REMOTE_PORT=1041
REQUEST_METHOD=GET
GATEWAY_INTERFACE=CGI/1.1
QUERY_STRING=
SERVER_ADDR=127.0.0.1
SERVER_SOFTWARE=Apache/1.3.12 (Unix) (Red Hat/Linux) PHP/4.3.15
SERVER_PROTOCOL=HTTP/1.0
SERVER_PORT=80
DOCUMENT_ROOT=/home/httpd/html
HTTP_USER_AGENT=Mozilla/7.0 [en] (X11; U; Linux i686)
HTTP_ACCEPT=image/gif, image/x-xbitmap,
image/jpeg, image/png, */*
SCRIPT_NAME=/cgi-bin/env.pl.cgi
SERVER_ADMIN=root@endirra.ro HTTP_ACCEPT_ENCODING=gzip
Un program CGI scris în limba jul C standard care genereaz ă o pagină Web conț inând
mesajul „Salut !”.
/* salut-cgi.c
Genereaz ă o pagină Web conț inând mesajul 'Salut!'
*/ #include <stdio.h>
void main()
{
/* trimite în primul rând antetul HTTP referitor la tipul de date returnate de script */
printf("Content-type: text/html\n\n");
/* început de document HTML */
printf("<html>");
/* antet de pagin ă */
printf("<head><title>Salut!</title></head>\n"); /* corp de pagin ă */
printf("<body>\n");
printf("<p>Salut!</p>\n");
printf("</body></html>");
/* terminare program */
}
Pentru a fi îns ă efective, programele CGI trebuie apel ate (implicit sau explicit) din ca-
drul paginilor Web.
78
Sabin Corneliu Buraga – Tehnologii Web
De cele mai multe ori, un script CGI va fi invocat din cadrul unui formular XHTML la
apăsarea butonului de trimitere a datelor c ătre server (butonul de tip submit ).
Să presupunem c ă avem urm ătorul exemplu în care un utilizator introduce prin inter-
mediul unui formular două numere întregi, iar progra mul CGI va genera o pagin ă Web
conținând maximul dintre ele.
Formularul XHTML va fi:
<form action="http://www.infoiasi.ro/cgi-bin/max.cgi"
method="GET">
<p>Vă rugăm, introduce ți două numere:
<input name="nr1" size="5" /> <input name="nr2" size="5" />
<p></p>
<input type="submit" value="Afl ă maximul" />
</form>
De exemplu, introducând numerele 7 și 4 și acționând butonul etichetat „Afl ă maxi-
mul”, vom primi o pagină Web care va afi șa textul „Maximul dintre 7 și 4 este num ărul
7” (vezi figura de mai jos).
Introducerea datelor și obținerea rezultatului
după acționarea butonului de trimitere a datelor pentru prelucrare
Care este mecanismul prin care func ționează interfața CGI?
Presupunând c ă în cele două câmpuri ale formularului (purtând numele nr1 și respectiv
nr2) am introdus valorile 7 și 4 respectiv și am apăsat butonul submit , navigatorul va trimi-
te, prin intermediul protocolului HTTP, o cerere c ătre serverul Web aflat la adresa dat ă
de URL-ul http://www.infoiasi.ro (adresa este preluat ă din valoarea atributului
79
Sabin Corneliu Buraga – Tehnologii Web
action din <form> ). Desigur, în loc de o adres ă absolută, putea fi specificat ă o cale rela-
tivă, însemnând faptul c ă se folosește serverul pe care se g ăsește pagina con ținând formu-
larul.
Atunci când se trimite cererea HTTP, navigatorul construie ște un URL având ca sufix
informații despre datele introduse în câmp urile formularului, în cazul nostru
http://www.infoiasi.ro/cgi-bin/max.cgi?nr1=7&nr2=4 folosindu-se o codifica-
re special ă. Pentru fiecare câmp al formular ului, se va genera o pereche
nume_câmp =valoare delimitată de caracterul „& ”, iar caracterele speciale (ca de exem-
plu slash-ul sau apostroful) vor fi înlocuite de codul lor numeric, în hexazecimal, precedat
de caracterul procent („ %”). În unele implementă ri,. spațiile vor fi substituite de semnul
plus („ +”). De exemplu, pentru a trimite textul Cina de la Maxim's se va folosi codificarea
Cina+de+la+Maxim%27s .
Serverul spre care cererea a fost expediat ă va procesa datele recepț ionate conform re-
gulilor proprii. Tipic, configura ția serverului define ște unde sunt stocate în cadrul siste-
mului de fi șiere directoarele și fi șierele CGI. De cele mai multe ori, daemonul HTTP
(adică serverul Web) ruleaz ă pe mașin ă sub auspicii de utilizator fictiv (din ra țiuni de se-
curitate ca nobody , în mod uzual), fi șierele sale fiind stocat e de obicei în directorul
/home/httpd/ sau /var/www/html (în cazul unui sistem Unix/Linux). Aici, al ături de
directorul html unde se memoreaz ă documentele HTML ale unui sit Web, se afl ă și di-
rectorul cgi-bin unde ar trebui să fie stocate toate fi șierele (script-urile) CGI apelate din
cadrul paginilor Web. A șadar, http://www.infoiasi.ro/cgi-bin/max.cgi va în-
semna pentru serverul Web de la adresa www.infoiasi.ro următoarea acț iune: invocă
programul max.cgi aflat la /home/httpd/cgi-bin . Astfel, în loc s ă trimită către naviga-
torul Web care a ini țiat cererea HTTP un document HTML sau un fi șier de alt tip, serve-
rul va invoca programul ori script-ul CGI specifica t în cadrul URL-ului (în acest caz
max.cgi ) și-i va pasa datele furnizate de sufix, de dup ă semnul întreb ării (adică șirul
nr1=7&nr2=4 ).
Acțiunea de invocare va avea o semantică diferită în funcție de script-ul sau programul
CGI conceput. Pentru un script Perl, server ul va invoca un interpretor Perl (în cazul
Apache, poate fi un modul special mod_perl ; de fapt, pentru a permite execu ția de pro-
grame CGI, serverul Apache se va folosi de serviciile modulului mod_cgi ). Pentru un
program executabil (compilat de pild ă într-unul din limbajele C sau C++), serverul va
lansa programul ca un proces separat.
Extensia de fi șier .cgi nu are nici o relevan ță în general, dar pot exista diverse reguli
de numire a fișierelor CGI executabile dependente de server sau de sistemul de operare
pe care ruleaz ă.
Detalii privitoare la programarea CGI în limbajele bash si Perl sunt disponibi-
le în cartea S. Buraga et al., Programare Web în bash și Perl , Polirom, Ia și, 2002:
http://www.infoiasi.ro/~cgi/ .
80
Sabin Corneliu Buraga – Tehnologii Web
Un studiu de caz: procesarea prin SAX a unui document XML via un script CGI
În cadrul acestei sec țiuni, vom urmă ri în continuare s ă prelucrăm documentele XML via
script-urile Perl, în vederea transform ării lor în pagini Web.
Transformarea unui document XML în pagin ă Web
prin intermediul unui script Perl
Una dintre cele mai facile modalit ăți de a prelucra documentele XML este cea a utiliz ă-
rii analizorului Expat dezvoltat de James Clark, a c ărui funcționalitate este încapsulat ă de
modulul XML::Parser . Acest modul va pune la dispozi ție obiectele XML::Parser și
XML::Parser::Expat .
După cum deja știm, procesarea SAX este bazat ă pe evenimente, fiecare tip de nod al
arborelui asociat documentului XML declan șându-se un anumit eveniment care va trebui
tratat de o rutină Perl specificat ă de programator. Astfel, dup ă inițializarea analizorului, va
trebui să folosim metoda setHandlers pentru a stabili ce func ții vor fi apelate pentru
fiecare tip de eveniment.
Cele mai importante evenimentele generate de procesorul XML sunt:
• Start – indică apariția tag-ului de început al unui element;
• End – desemneaz ă apariția tag-ului de sfâr șit al unui element;
• Char – indică apariția conținutului text al unui element (caracterele de
text neprocesat dintre tag-ul de început și cel de sfârșit);
• Comment – indică apariția unui comentariu.
Vom asocia pentru evenimentele Start , End și Char câte o subrutin ă care va fi apelat ă
la fiecare apari ție a evenimentului în cauz ă.
Documentul XML biblio.xml care urmeaz ă stochează informații despre împrumu-
turile dintr-o bibliotec ă:
<?xml version="1.0" ?>
<imprumuturi>
<imprumut>
<carte autor="J.P. Sartre" an="1999">
81
Sabin Corneliu Buraga – Tehnologii Web
Zidul
</carte>
<client adresa="mituc@ac.tuiasi.ro">
Victor Tarhon-Onu
</client>
</imprumut>
<imprumut>
<carte autor="H. Hesse" an="1998">
Jocul cu margelele de sticla
</carte> <client adresa="stanasa@infoiasi.ro">
Stefan Ciprian Tanasa
</client>
</imprumut>
</imprumuturi>
Dorim să generăm un tabel XHTML cu aceste informaț ii, prin transformarea docu-
mentului XML de mai sus. Vom scrie urm ătorul script Perl, în care vom substitui fiecare
element XML cu elementele XHTML corespunz ătoare (aceste substitu ții vor fi stocate în
tablouri asociative):
#!/usr/bin/perl # utilizam modulul XML
use XML::Parser;
# definim tablourile hash de inlocuire a tag-urilor
# definim substitutiile de tag-uri de inceput
%start = (
"imprumuturi" => "<table border=\"1\">",
"imprumut" => "<tr>",
"carte" => "<td><b>",
"client" => "<td align=\"center\">"
);
# definim substitutiile de tag-uri de sfirsit
%sfirsit = (
"imprumuturi" => "</table>\n",
"imprumut" => "</tr>",
"carte" => "</b></td>",
"client" => "</td>"
);
# instantiem analizorul XML
my $parser = new XML::Parser(ErrorContext => 2);
# setam functiile de prelucrare
# a elementelor si continutului lor
$parser->setHandlers(
Start => \&procesare_start,
82
Sabin Corneliu Buraga – Tehnologii Web
# functia de procesare tag-uri de inceput
End => \&procesare_sfirsit,
# functia de procesare tag-uri de sfirsit
Char => \&procesare_continut
# functia de procesare a continutului
);
# afisam antetul HTTP
print "Content-type: text/html\n\n";
# incarcam fisierul si il analizam
$parser->parsefile("biblio.xml");
# definim subrutinele pentru prelucrarea
# elementelor XML si continutului lor
sub procesare_start
{
# primul argument este instanta procesorului XML
my $procesor = shift;
# al doilea argument este numele elementului
# corespunzator tag-ului de inceput my $element = shift;
# afisam codul HTML, folosind tabloul hash
print $start{$element};
}
sub procesare_sfirsit
{
# primul argument este instanta procesorului XML
my $procesor = shift;
# al doilea argument este numele elementului # corespunzator tag-ului de sfirsit
my $element = shift;
# afisam codul HTML, folosind tabloul hash
print $sfirsit{$element};
}
# rutina de afisare a continutului
sub procesare_continut {
# am preluat argumentele furnizate
my ($procesor, $data) = @_;
# afisam datele
print $data;
}
Funcțiile asociate evenimentelor de procesare XML vor primi drept argumente instan-
ța procesorului Expat și numele elementului curent (pentru evenimentele Start și End)
sau conținutul dintre tag-urile de început și de sfârșit (pentru evenimentul Char ).
83
Sabin Corneliu Buraga – Tehnologii Web
Ieșirea script -ului prezentat mai sus este:
Content-type: text/html
<table border="1">
<tr>
<td><b>
Zidul
</b></td>
<td align="center">
Victor Tarhon-Onu </td>
</tr>
<tr>
<td><b>
Jocul cu margelele de sticla
</b></td>
<td align="center">
Stefan Ciprian Tanasa
</td> </tr>
</table>
84
Sabin Corneliu Buraga – Tehnologii Web
3. PHP ( PHP: Hypertext Preprocessor )
PHP (PHP: Hypertext Preprocessor ) a fost gândit ini țial a fi o simpl ă aplicație CGI
pentru interpretarea formularelor definite prin HTML și procesate de un program scris
într-un limbaj ( e.g., C, Perl), executat pe server. În cazul interfe ței CGI aveam nevoie de
permisiunea de a rula programe pe server, ceea ce conducea uneori la lacune în securitate
și în plus la disocierea de documentul HTML a programului care procesa datele.
PHP (în versiunea curent ă PHP 4; în paralel, este disponibil ă și versiunea PHP 5) re-
prezintă un pachet puternic care ofer ă un limbaj de programare accesibil din cadrul fi șie-
relor HTML, limbaj asem ănător cu Perl sau C, având în plus suport pentru manipularea
bazelor de date într-un dialect SQL (dBA SE, Informix, MySQL, mSQL, Oracle,
PostgreSQL, Solid, Sybase, ODBC etc.) și acces la sisteme hipermedia precum
Hyperwave. De asemenea, PHP suport ă încărcarea fișierelor de pe calculatorul client:
upload și oferă suport pentru cookies (mecanism, pe care îl vom prezenta ulterior, de stoca-
re a datelor în navigatorul client pentru identificarea utilizatorilor).
Această aplicație este disponibil ă gratuit, integrându-se în popularul server Apache. În
fapt, PHP reprezint ă un server flexibil pentru dezvoltarea de aplica ții Web sofisticate,
alături de altele comerciale.
În ceea ce urmeaz ă vom prezenta numai o parte dintre facilit ățile oferite de PHP, f ără
a intenționa să realizăm un manual complet de programare și de utilizare.
Mai multe detalii, inclusiv studii de caz complete, sunt disponibile în volumele:
S. Buraga (coord.), Aplicații Web la cheie. Studii de caz implementate în PHP , Polirom,
Iași, 2003: http://www.infoiasi.ro/~phpapps/
S. Buraga (coord.), Situri Web la cheie. Soluț ii profesionale de implementare , Polirom,
Iași, 2004: http://www.infoiasi.ro/ ~busaco/books/webapps/
Caracterizare
Script-urile PHP pot fi incluse în paginile Web în diferite moduri, a șa cum arată exemplul
de mai jos:
<? echo ("cea mai simpl ă cale de introducere…\n"); ?>
<?php echo ("se utilizeaz ă în cazul documentelor XML.\n"); ?>
<script language="php">
echo ("anumite editoare nu accept ă tag-uri necunoscute");
</script>
<% echo ("op țional se pot folosi tag-uri în stilul ASP"); %>
Comentariile pot fi scrise în stilul comentariilor din limbajele C, C++ sau shell-urile
Unix (adic ă se pot folosi /* … */ , //… sau #… ).
85
Sabin Corneliu Buraga – Tehnologii Web
Preprocesorul PHP va determina construc țiile PHP delimitate între tag-urile de mai sus
și le va interpreta, ignorând restul con ținutului documentului pe care îl va trimite, la ie și-
rea standard, nealterat. Astfel, putem privi ana lizorul PHP ca un script CGI care efectu-
ează o preprocesare special ă înainte ca datele să fie expediate clientului Web.
Instrucțiunile de control ale limbajului sunt cele uzuale din C ( if, break , while și altele).
Pentru instruc țiunea if, testul se evalueaz ă ca fiind false și în cazul în care rezultatul expre-
siei de test va fi șirul vid ("") sau va fi șirul "0" . Variabilele se declară „din zbor”, tipul
lor putând fi, de exemplu, integer , double sau string, iar numele de variabile trebuie precedat
de caracterul „ $”. Șirurile de caractere se pot delimita între ghilimele sau apostroafe, în
acest ultim caz inhibându-se eval uarea variabilelor din interiorul șirului respectiv (exact ca
la script-urile bash).
Pot fi definite de asemenea și tablouri (indexate sau asociative, ca în Perl). Exist ă și di-
verse variabile predefinite, mai ales cele speci fice serverului Web, similare variabilelor de
mediu disponibile script-urilor CGI ( e.g., $REMOTE_ADDR ). Sunt permiși operatorii obi șnu-
iți ai limbajului C și se pot defini și funcții utilizator (prin construc ția function ). Un ope-
rator preluat din Perl este cel de concatenare a șirurilor de caractere, specificându-se prin
intermediul caracterului punct „ .”.
PHP pune la dispozi ția programatorului și o serie de constante predefinite (ca de
exemplu, PHP_VERSION , TRUE și FALSE ).
Pentru a experimenta exemplele de pr ograme date în continuare, recomandă m să insta-
lați mediul Apache2Triad, care pune la dispoziț ie, printre altele, – pe platforma Windows –
serverele Apache, MySQL și PHP, deja configurate pentru lucru. Apache2Triad este dis-
ponibil pentru download la adresa http://apache2triad.sourceforge.net/ .
Funcționarea procesorului PHP
Un exemplu de lucru cu tablouri
Acest exemplu ilustreaz ă folosirea tablourilor indexate, a instruc țiunii de ciclare foreach și a
generării de conținut XHTML spre a fi transmis c ătre browser-ul Web.
86
Sabin Corneliu Buraga – Tehnologii Web
<?php
// umplem un tablou cu valori de la 1 la 10 for ($contor = 1; $contor <= 10; $contor++) {
$valori[$contor] = $contor;
} // realizam suma valorilor $suma = 0; foreach ($valori as $element)
$suma += $element;
// afisam suma obtinute la iesirea standard // pentru a fi trimisa browserului echo ("<p>Suma de la 1 la 10 este: <b>" . $suma . "</b></p>"); ?>
Un exemplu de definire ș i folosire a func țiilor specificate de utilizator
Următoarele linii PHP ofer ă detalii privitoare la modul de creare și de utilizare a func țiilor
definite de utilizator:
<?php // functia de ridicare la patrat function patrat($numar) {
return $numar * $numar;
} $numar = 0; while ($numar < 10) {
$numar++; // incrementam numarul
if ($numar % 2) // e numar impar… continue; // continuam cu urmatoarea iteratie
// e numar par, deci afisam patratul
echo "<p>$numar la patrat este " . patrat($numar) . "</p>"; } ?>
Un exemplu de prelucrare a formularelor electronice
Puterea limbajului PHP const ă și în manipularea facil ă a formularelor, dup ă cum vom
vedea în continuare.
Presupunem c ă definim urm ătorul formular folosit de utilizatori pentru a introduce di-
verse impresii despre o pagin ă Web personal ă:
<html> <head> <title>Impresii</title> </head>
<body text="blue" bgcolor="white">
<form action="add.php" method="POST" name="Form"> <table align="center" cellpadding="4"> <tr> <td>
<p>Numele și prenumele:</p>
</td>
<td> <input type="text" name="nume" />
87
Sabin Corneliu Buraga – Tehnologii Web
</td>
</tr> <tr>
<td>
<p>Ocupa ția:</p>
</td> <td> <select name="ocupa ția" size="1">
<option selected>Student</option> <option>Elev</option> <option>Cadru didactic</option> <option>Altceva</option> </select>
</td>
</tr> <tr> <td> <p>Vârsta:</p>
</td>
<td> <p> <input type="radio" value="sub 18" name="virsta">sub 18 |
<input type="radio" value="18-25"
name="virsta" checked>18-25 | <input type="radio" value="25-35" name="virsta">25-35 | <input type="radio" value="35-60"
name="virsta">35-60 |
<input type="radio" value="peste 60" name="virsta">peste 60 </td> </tr>
<tr>
<td> <p>Adresa e-mail:</p> </td> <td>
<input type="text" name="email">
</td> </tr> <tr> <td>
<p>Impresiile d-voastr ă:</p>
</td>
<td> <textarea name="impresii" rows="3" cols="60"> </textarea> </td>
</tr>
<tr> <td> <input type="submit" value="Trimite"> </td>
<td>
<input type="reset" value=" Șterge">
</td> </tr> </table>
</form>
</body> </html>
88
Sabin Corneliu Buraga – Tehnologii Web
Se solicită utilizatorului numele, ocupa ția, vârsta, adresa de e-mail și impresiile care vor
fi procesate de programul (script-ul) PHP con ținut în fișierul add.php. Acesta ar putea cu-
prinde urmă toarele:
<html>
<body> <?
if(!$nume || !$email) { // nu s-au introdus numele sau adresa
?> <h4 style="color: red" align="center"> Eroare: nu a ți specificat numele sau adresa!
</h4>"
<p align="center">Corecta ți
<a href="javascript:history.go(-1)">
formularul</a></p> <? }
else {
?> <h4 style="color: green" align="center"> Formularul introdus </h4>
<hr />
<? // creaz ă un mesaj pentru a fi expediat și prin e-mail
$mesaj = ""; // data curent ă
$mesaj .= "<impresie data=\"" . date("d M Y, G:i"); $mesaj .= "\" client=\"" . $REMOTE_HOST . "(" . $REMOTE_ADDR . ")\">\n"; // concateneaz ă numele, adresa, ocupa ția și impresiile
$mesaj .= "<nume email=\"" . $email . "\">" . $nume . "</nume>\n"; $mesaj .= "<ocupatia>" . $ocupa ția . "</ocupa ția>\n";
$mesaj .= "<virsta>" . $virsta . "</virsta>\n";
// exist ă impresii?
if ($impresii)
$mesaj .= "<text>\n" . $impresii . "\n</text>\n</impresie>\n";
// trimite e-mailul (adresa, subiect, corp-mesaj, destinatar)
mail("busaco@infoiasi.ro", "Impresii", $mesaj, "From: " . $email); // scrie și într-un fi șier
$f = fopen("impresii.xml", "a"); if (!$f) echo ("<p>Eroare la deschiderea fi șierului!</p>");
else {
fputs($f, $mesaj);
fclose($f); } // scrie și în pagin ă (convertind NL cu <br>),
// dar tag-urile XML nu vor fi recunoscute de navigator
$mesaj_html = nl2br($mesaj);
echo ("<center>$mesaj_html</center>"); }
89
Sabin Corneliu Buraga – Tehnologii Web
?>
<!– final de pagin ă –>
<hr />
</body>
</html>
Script-ul PHP va expedia prin po șta electronic ă, unui anumit utilizator, datele introdu-
se în formular, prin intermediul func ției predefinite mail() , și va genera un fi șier numit
impresii.xml cuprinzând impresiile enunț ate de vizitatorii paginii.
Un fragment dintr-un astfel de fi șier XML este dat mai jos:
… <impresie data="01 Nov 2006, 11:33" client="fenrir.infoiasi.ro (193.231.30.197)">
<nume email="socrate@tuiasi.ro">Radu Filip</nume>
<ocupatia>Student</ocupatia> <virsta>18-25</virsta> <text> Salut!…
Ce mai faci?
</text> </impresie> <impresie data="02 Nov 2006, 18:42" client="localhost (127.0.0.1)">
<nume email="luminish@infoiasi.ro">Lumini ța Chiran</nume>
<ocupația>Cadru didactic</ocupa ția>
<virsta>25-35</virsta>
<text> Îmi place, îns ă cred c ă ar fi trebuit s ă pui și ceva
referitor la adnotarea lingvistic ă (e.g. TEI).
Luminița
</text> </impresie> …
După cum se observă , PHP oferă un limbaj script puternic și simplu, accesul la câm-
purile formularului realizându-se prin intermediul unor variabile create automat. În cazul
câmpurilor checkbox ale unui formular, nu se creeaz ă variabile decât pentru câmpurile bi-
fate. Dacă nu apare atributul value pentru un buton checkbox, atunci valoarea variabilei
corespunz ătoare lui va fi setat ă automat pe „ on”.
Atenție! Ultimele versiuni de PHP interzic folo sirea variabilelor globale pentru a avea
acces direct la datele din formulare, transmise de c ătre clientul Web. Astfel, se va folosi,
în loc de $nume , construc ția $_REQUEST["nume"] .
În PHP exist ă, de asemenea, o multitudine de func ții predefinite (o serie fiind similare
funcțiilor din bibliotecile standard ale limbajului C) – detalii la www.php.net (situl oficial
al serverului de aplica ții PHP; tot în cadrul sitului ave ți posibilitatea s ă obținem manualul
PHP, în diverse formate):
– matematice;
– de conversie;
– de manipulare a șirurilor de caractere;
90
Sabin Corneliu Buraga – Tehnologii Web
– de prelucrare a tablourilor;
– de acces la resursele sistemului de operare și de lucru cu fi șiere;
– de manipulare a bazelor de date;
– privitoare la conexiunile Internet (HTTP, FTP);
– pentru accesarea fi șierelor având tipuri speciale: PDF, JPEG, XML etc.;
– specifice sistemului de operare;
– generale.
Programare orientat ă-obiect în PHP
Limbajul PHP ofer ă implementarea unora dintre cele mai importante aspecte ale pro-
gramării obiectuale: încapsularea datelor, mo ștenirea, polimorfismul. Astfel, PHP d ă po-
sibilitatea programatorului s ă exprime distincț ia dintre propriet ățile generale și cele speci-
fice ale obiectelor cu care lucreaz ă. Vom ilustra aceste caracteristici prin câteva exemple
concludente.
Încapsularea Încapsularea datelor reprezint ă un mecanism de protec ție a membrilor de tip dat ă, acce-
sul la ei realizându-se exclusiv prin intermediul unor metode specifice și nu în mod direct.
Acest lucru se realizeaz ă prin intermediul claselor, dup ă cum se poate remarca din frag-
mentul de cod PHP de mai jos:
<?php
class Student { // date-membru var $year; // an
var $age; // vârsta
var $name; // nume // metode function setYear($y) {
$this->year = $y;
} function getYear() { return $this->year; }
…
} ?>
Datele-membru se definesc utilizând var, putând avea orice tip (întreg, tablou sau chiar
obiect). Metodele se specific ă prin declaraț ii de func ții care prelucreaz ă membrii clasei.
Pentru a accesa datele clasei, metodele vor trebui s ă se foloseasc ă de construc ția sintactic ă
$this->variabila , altfel variabila se consider ă a fi locală în cadrul acelei metode.
Vom crea un obiect prin operatorul new, exact ca în limbajul C++:
$stud = new Student;
91
Sabin Corneliu Buraga – Tehnologii Web
Accesarea metodelor clasei se realizeaz ă astfel:
$stud->setYear(4);
$student_year = $stud->getYear();
Din păcate, în PHP4, membrii dat ă ai clasei pot fi accesa ți direct, neputându-i declara
privați. La fel, metodele nu pot fi specificate private sau protejate, a șa cum se întâmpl ă la
C++. Astfel, PHP ofer ă doar suport pentru încapsulare, dar nu o poate impune. În versi-
unea PHP 5 acest aspect a fost remediat.
Pentru func țiile membru, în loc de construc ția sintactic ă „->”, în PHP 4 se permite
„::”. Astfel, codul de mai sus este echivalent cu:
$student_year = $stud::getYear();
Moștenirea
Moștenirea reprezint ă posibilitatea folosirii datelor sau metodelor definite în prealabil de
o anumită clasă în cadrul unei clase derivate din prima. Relaț ia de derivare se specific ă
prin cuvântul-cheie extends :
<?php class GoodStudent extends Student { // date-membru var $prizes; // premii
// metode
function setPrizes($p) { $this->prizes = $p; } function getPrizes() {
return $this->prizes;
} } ?>
Putem scrie urm ătoarele linii:
$goodstud = new GoodStudent;
// apel de metod ă din clasa de baz ă
$goodstud->setAge(21);
// apel de metod ă din clasa derivat ă
$goodstud->setPrizes(2);
În PHP mo ștenirea multiplă nu este înc ă posibilă. Nu putem avea, de exemplu:
class GreatStudent extends GoodStudent Genius {
…
}
Pentru a accesa membri ai clasei p ărinte ne vom folosi de construc ția „::” (exact ca și
în C++).
Constructori PHP permite specificarea constructor ilor, ei fiind metode cu acela și nume al clasei din
care aparțin, fiind apela ți automat atunci când instan țiem un obiect al clasei respective.
Putem avea, de exemplu:
92
Sabin Corneliu Buraga – Tehnologii Web
<?php
class Student { // date-membru
var $year; // an
var $age; // vârsta var $name; // nume // constructor
function Student($y, $a, $n) {
$this->year = $y; $this->age = $a; $this->name = $n; }
// metode
function setYear($y) { $this->year = $y; } function getYear() {
return $this->year;
} … } ?>
Așadar, acum se poate crea un obiect de genul:
$stud = new Student(3, 24, "Radu Filip");
Constructorii și metodele, fiind func ții PHP obișnuite, pot avea specificate valori im-
plicite pentru argumente (ca în C++):
function Student($y = "4", $a = "22", $n = "")
Dacă scriem în acest mod constructorul, atunci în urm ătoarele cazuri vom avea:
// year = 4, age = 22, name = "" $stud = new Student(); // year = 2, age = 22, name = ""
$stud = new Student(2);
// year = 2, age = 20, name = "" $stud = new Student(2, 20);
Atunci când un obiect al unei clase derivate este creat, numai constructorul lui propriu
va fi apelat, constructorul clasei de baz ă nefiind apelat implicit. Dac ă dorim ca și con-
structorul clasei p ărinte să fie apelat, o vom face într-o manier ă explicită:
<?php function GoodStudent {
$this->prizes = 3;
// apel explicit al constructorului clasei de baz ă
$this->Student(); } ?>
Începând cu versiunea 4, tipurile permise pentru parametrii unui constructor sunt doar
cele simple (întregi, șiruri de caractere), deci nu vor pu tea fi executate transmiteri de ta-
blouri sau de obiecte.
Dacă o clasă derivată nu posed ă propriul ei constructor, va fi apelat implicit construc-
torul clasei p ărinte.
93
Sabin Corneliu Buraga – Tehnologii Web
Mecanismul obiectual în PHP 4 nu permite declararea destructorilor și nici specificarea
de clase abstracte (de și se pot imagina metode mai mult sau mai pu țin sofisticate pentru a
le simula). În PHP 5, exist ă însă posibilitatea specific ării destructorilor.
Supraîncărcarea
Supraîncărcarea (asocierea de semantici diferite unei acelea și funcții pe baza tipurilor pa-
rametrilor specifica ți) nu este suportat ă nici ea. Putem îns ă supraîncărca, indirect, con-
structorii prin crearea de obiecte diferite în func ție de num ărul de argumente specificate:
<?php
class Student { …
function Student() {
// contruim un șir de apel
$method_name = "Student" . func_num_args(); $this->$method_name(); }
function Student1($x) {
// cod } function Student2($x, $y) { // cod
}
… } ?>
Vom putea scrie:
$stud1 = new Student('1'); // va apela Student1
$stud2 = new Student('1', '2'); // va apela Student2
Pentru a pasa un num ăr variabil de parametri unei func ții și a-i folosi ulterior putem s ă
ne slujim de func țiile predefinite func_get_args() , func_num_args() și
func_get_arg() .
Astfel, metoda Student() de mai sus va putea afi șa toți parametrii transmi și prin co-
dul următor:
function Student()
{ $args_array = func_get_args(); for ($i = 0; $i < count($args_array); $i++)
print ($i => $argument_array [$i]);
}
94
Sabin Corneliu Buraga – Tehnologii Web
Polimorfismul
Polimorfismul reprezint ă abilitatea unui obiect de a determina care metodă trebuie invo-
cată pentru un obiect pasat ca argument în momentul rul ării și acest lucru se realizeaz ă
foarte ușor în limbaje interpretate precum PHP.
Vom ilustra acest concept și implementarea lui în PHP presupunând c ă avem o clas ă
Figure desemnând o figur ă geometric ă în care se define ște metoda draw() și clasele
derivate Circle și Square unde vom rescrie metoda draw() în funcție de figura dorit ă
a fi desenat ă:
<?php
… function drawing($obj) { // metoda clasei Board
$obj->draw();
} // coordonate centru și raza
$circle = new Circle(100, 100, 33);
// coordonate stânga-sus și latura
$square = new Square(100, 200, 74);
// afișează cele dou ă figuri
$board = drawing($circle); // apeleaz ă draw() din Circle
$board = drawing($square); // apeleaz ă draw() din Square
… ?>
Funcții utile pentru manipularea obiectelor
Începând cu PHP 4, se pun la dispozi ția programatorului o serie de func ții folositoare:
– get_class() va returna numele unui obiect, instan ță a unei clase;
– get_parent_class() furnizeaz ă clasa părinte din care provine un anumit
obiect;
– method_exists() testează dacă există o metod ă pentru un anumit obiect
specificat;
– class_exists() testează existenț a unei clase;
– is_subclass_of() va determina existen ța unei relaț ii de moștenire dintre
două clase.
O altă facilitate este cea a transmiterii prin referin ță a parametrilor și nu prin valoare,
cum se realizeaz ă în mod implicit. Pentru a fi transmis prin referin ță, vom prefixa numele
acelui parametru cu caracterul „ &”.
95
Sabin Corneliu Buraga – Tehnologii Web
Accesarea bazelor de date
Cele de mai sus ne permit s ă definim un mecanism bazat pe obiecte pentru manipularea
informațiilor din bazele de date SQL. Pentru a accesa o baz ă de date (de oricare tip) va
trebui să specificăm mulțimea minimal ă de membri (date și metode) pe care s ă o încapsu-
lăm într-o clas ă generală:
class DataBase_SQL {
// date-membru
var $Link_ID = 0; // identif. leg ăturii cu o baz ă de date
var $Query_ID = 0; // identif. interog ării active
var $error = 0; // starea de eroare
// metode
function connect() { … } function query() { … } function next_record() { … } function num_rows() { … }
}
Metoda query() verifică existenț a unui $Link_ID valid care să pointeze spre o bază
de date activ ă. Dacă nu există, query() va apela connect() pentru a stabili o leg ătură
cu serverul SQL. Execuț ia metodei query() va actualiza variabila $Query_ID și metoda
next_record() va putea furniza înregistr ările găsite în urma invocă rii interog ării SQL.
Metoda num_rows() va returna numă rul total de rânduri ale tabelei.
Accesând bazele de date prin clase, ne vine mult mai u șor să realizăm, de exemplu, do-
uă interogări concurente asupra acelea și tabele, prin instan țierea obiectelor de mai jos:
$db1 = new DataBase_SQL;
$db2 = new DataBase_SQL;
Folosind cele de mai sus, putem concepe o clas ă care să ne faciliteze accesarea unei ba-
ze de date MySQL. Astfel, vom defini clasa derivat ă:
class DataBase_MySQL extends DataBase_SQL { // date-membru
var $Host = ""; // adresa serverului MySQL
var $DataBase = ""; // numele bazei de date de pe server var $User = ""; // numele utilizatorului var $Password = ""; // parola utilizatorului
var $Link_ID = 0; // rezultatul lui mysql_connect()
// rezultatul celei mai recente mysql_query() var $Query_ID = 0; // rezultatul curent al lui mysql_fetch_array() var $Record = array(); var $Row; // num ărul rândului curent
var $Errno = 0; // starea de eroare a interog ării
var $Error = ""; // metode
…
}
96
Sabin Corneliu Buraga – Tehnologii Web
Pentru început trebuie s ă scriem codul care stabile ște conexiunea cu serverul de baze
de date MySQL. În caz de e șec, va trebui s ă semnalăm acest lucru programului care ma-
nipulează o instanță a clasei noastre. Vom furniza în continuare metoda connect() care
va utiliza func ția auxiliară halt() :
// opre ște execuț ia în caz de eroare fatal ă
function halt($msg) {
printf("<p>Database error: %s\n", $msg);
printf("<p>MySQL error: <b>%s (%s)</b>\n",
$this->Errno, $this->Error); die("Session halted."); }
// conectarea la baza de date
function connect() { if ($this->Link_ID == 0) { // înc ă nu exist ă o conexiune
$this->Link_ID = mysql_connect ($this->Host,
$this->User, $this->Password);
// succes sau e șec?
if (!$this->Link_ID)
$this->halt("Connect failed"); // deschide baza de date
if (! mysql_query (sprintf("use %s", $this->DataBase),
$this->Link_ID))
$this->halt("Cannot use database" . $this->DataBase); } }
Implementarea metodei query() poate fi urmă toarea:
// trimite o interogare serverului MySQL
function query($query_str) {
// realizeaz ă conectarea…
$this->connect(); // încearc ă să execute interogarea
$this->Query_ID = mysql_query ($query_str, $this->Link_ID);
// iniț ial stabilim pointerul pe prima înregistrare
$this->Row = 0; // salveaz ă erorile
$this->Errno = mysql_errno() ;
$this->Error = mysql_error() ;
// eroare fatal ă?
if (!$this->Query_ID) $this->halt("Invalid SQL: " . $query_str);
return $this->Query_ID; }
Mai sunt necesare a fi specificate metodele next_record() și seek() :
// furnizeaz ă dacă mai exist ă o înregistrare
function next_record() {
// salveaz ă într-un tablou înregistr ările
$this->Record = mysql_fetch_array ($this->Query_ID);
$this->Row++;
// salveaz ă erorile
$this->Errno = mysql_errno() ;
$this->Error = mysql_error() ;
97
Sabin Corneliu Buraga – Tehnologii Web
// returneaz ă înregistrarea g ăsită
$stat = is_array($this->Record);
if (!$stat) {
// nu mai exist ă o altă înregistrare
mysql_free_result ($this->Query_ID);
// se elibereaz ă interogarea
$this->Query_ID = 0;
}
return $stat; } // furnizeaz ă o înregistrare dup ă poziția ei
function seek($pos) {
$status = mysql_data_seek ($this->Query_ID, $pos);
if ($status)
$this->Row = $pos; return;
}
În acest moment putem să realizăm o interogare particular ă asupra unei baze de date
MySQL con ținând informa ții despre studen ți. Pentru aceasta, trebuie s ă completăm pa-
rametrii $Host , $DataBase , $User și Password . Vom utiliza o clas ă derivată Data-
Base_Stud astfel:
class DataBase_Stud extends DataBase_SQL {
var $Host = "localhost"; var $User = "busaco"; var $Password = "";
var $DataBase = "students";
}
Codul PHP pentru afi șarea numelui și vârstei tuturor studen ților din anul IV este ur-
mătorul:
<?php // instan țierea obiectului
$db = new DataBase_Stud;
// conectarea la serverul MySQL
$db->connect(); // formuleaz ă interogarea SQL
$query = "select name, age from students where year = 4"; $db->query($query);
?>
<html> <body> <h3>Studen ții anului IV</h3>
<hr> <!– parcurgem toate înregistr ările găsite –>
<?php while($db->next_record()) { ?> <!– Numele îngro șat –>
<p><b><?php print $db->Record["name"] ?></b></p>
<!– Vârsta cu italice –>
<p><i><?php print $db->Record["age"] ?></i></p> <hr /> <?php } ?> </body>
</html>
98
Sabin Corneliu Buraga – Tehnologii Web
Firesc, înainte de a utiliza acest script, trebuie s ă creăm o bază de date MySQL pe care
o vom numi stud, iar în cadrul acesteia vom genera o tabel ă students con ținând informa-
ții despre studen ți (omitem r ăspunsurile sistemului dup ă execuț ia fiecărei comenzi SQL):
$ mysql -h localhost -u busaco -p
Enter password: ********
mysql> create database stud;
mysql> use stud; mysql> create table students(
-> year int(1),
-> name char(50), -> age int(2), -> id char(4), -> pic char(80)
-> );
mysql> create unique index stud_idx on students ( id );
Ultima linie construie ște un index pe baza câmpului de identificare a unui student ( id),
index denumit stud_idx .
Deoarece sistemul de gestiune a bazelor de date lucreaz ă în context multi-utilizator, va
trebui să acordăm dreptul de acces asupra unei baze de date (de exemplu, pentru selec ția,
inserarea și ștergerea de înregistr ări) prin intermediul comenzii SQL grant . Pentru ca
utilizatorul busaco să se poată conecta la baza de date de pe sistemul local și să poată
executa comenzile SQL select , insert și delete vom scrie:
mysql> grant usage on stud.* to busaco@localhost; mysql> grant select, insert, delete on stud.* to busaco@localhost;
În figura de mai jos putem observa opera țiunile efectuate în cadrul unei tranzac ții de
date între navigator și serverul Web, utilizându-se și un server MySQL:
Executarea unei interog ări SQL dintr-un script PHP
Pașii efectua ți sunt:
1. Inițierea de către navigator a unei conexiuni HTTP cu serverul Web;
2. Preprocesarea codului PHP de c ătre interpretorul PHP;
3. Trimiterea interog ării SQL con ținute de codul PHP spre serverul MySQL;
99
Sabin Corneliu Buraga – Tehnologii Web
4. Returnarea rezultatelor interog ării SQL;
5. Returnarea de c ătre motorul PHP a codului HTML generat, în urma proces ării
întregului program PHP;
6. Trimiterea documentului HT ML spre navigatorul Web.
În cadrul clasei DataBase_MySQL mai putem implementa urm ătoarele metode utile:
// numărul de înregistr ări găsite
function num_rows() {
return mysql_num_rows ($this->Query_ID);
}
// numărul de câmpuri
function num_fields() {
return mysql_num_fields ($this->Query_ID);
}
// valoarea unui câmp particular
function get_field($field) { return $this->Return[$field]; }
Se pot imagina, de asemeni, clase similare și pentru alte sisteme de management al ba-
zelor de date ( e.g., PostgreSQL, Oracle, ODBC).
Procesarea documentelor XML în PHP
Pentru a procesa documentele XML în cadrul programelor PHP, va trebui s ă avem la
dispoziție un analizor XML instalat pe server , de exemplu un procesor SAX sau DOM.
După cum deja am v ăzut, în cazul proces ării prin SAX se declan șează un anumit eve-
niment care va trebui tratat de o func ție definită de programator. Pentru a ata șa funcț ii
evenimentelor XML, ne vom folosi de o serie de func ții PHP predefinite:
• xml_set_element_handler() stabilește funcțiile care vor fi apelate
pentru procesarea elementelor XML (pentru tag-urile de început și de sfârșit);
• xml_set_character_data_handler() stabilește funcția care va fi ape-
lată atunci când analizorul întâlne ște un nod de tip CDATA (text);
• xml_set_processing_instruction_handler() definește funcția care
va fi executat ă la apariția unei instruc țiuni de procesare.
Alte funcții importante puse la dispozi ție sunt:
• xml_parser_create() inițializează analizorul XML și returneaz ă
o instanță a sa;
• xml_parser_free() eliberează memoria alocat ă analizorului;
• xml_set_object() stabilește adresele func țiilor care vor fi utilizate de
analizor pentru a realiza proces area documentului XML dorit;
100
Sabin Corneliu Buraga – Tehnologii Web
• xml_parser_set_option() se folose ște la setarea unor op țiuni de ana-
liză XML ( e.g., modul de tratare a scrierii cu majuscule sau minuscule
a tag-urilor);
• xml_get_error_code() furnizeaz ă codul de eroare în urma
eșecului proces ării.
Pot fi amintite, de asemenea, func țiile dând mai multe amă nunte despre erorile surve-
nite în timpul analizei: xml_error_string() și xml_get_current_line_number() .
Funcția xml_parse() returneaz ă, în caz de e șec, o serie de coduri de eroare ale c ăror
constante simbolice predefinite pot fi consultate în manualul PHP.
Vom defini o clas ă pe care o vom folosi ulterior la procesarea documentelor XML
(vom salva acest cod în fi șierul parseXML.php ).
<?php
// o clas ă pentru prelucrarea documentelor XML
class parseXML { var $xml_parser; /* instan ța analizorului XML */
var $xml_file; /* numele fi șierului XML */
var $html_code; /* codul HTML generat */
var $open_tags; /* mul țimea tag-urilor de început */
var $close_tags; /* mul țimea tag-urilor de sfâr șit */
// constructor
function parseXML() {
$this->xml_parser = "";
$this->xml_file = "";
$this->html_code = "";
$this->open_tags = array();
$this->close_tags = array();
} // destructor
function destroy() {
if ($this->xml_parser)
xml_parser_free($this->xml_parser);
}
// metode
// seteaz ă tag-urile de început
function set_open_tags($tags) { $this->open_tags = $tags; }
// seteaz ă tag-urile de sfâr șit
function set_close_tags($tags) { $this->close_tags = $tags;
}
// seteaz ă numele fi șierului XML
101
Sabin Corneliu Buraga – Tehnologii Web
function set_xml_file($file) {
$this->xml_file = $file;
}
// furnizeaz ă codul HTML generat
function get_html_code() { return $this->html_code;
}
// tratarea evenimentului de
// apari ție a unui tag de început
function start_element($parser, $name, $attrs) {
if ($format = $this->open_tags[$name])
$this->html_code .= $format;
}
// tratarea evenimentului de
// apari ție a unui tag de sfâr șit
function end_element($parser, $name) { if ($format = $this->close_tags[$name])
$this->html_code .= $format; }
// tratarea evenimentului de
// apari ție a unui element de tip CDATA
function character_data($parser, $data) { $this->html_code .= $data;
}
// tratarea evenimentului de
// apari ție a unei instruc țiuni de procesare
function processing_instruction($parser, $target, $data) {
switch (strtolower($target)) {
case "php": eval($data);
break;
}
}
// func ția de analiz ă propriu-zis ă
function parse() {
// instan țiază procesorul XML
$this->xml_parser = xml_parser_create();
// înregistreaz ă funcțiile de analiz ă
xml_set_object($this->xml_parser, &$this);
// seteaza op țiunile de analiz ă
// (tag-urile nu sunt rescrise cu caractere mari) xml_parser_set_option($this->xml_parser, XML_OPTION_CASE_FOLDING, false);
// seteaz ă funcțiile de procesare a elementelor XML
xml_set_element_handler($this->xml_parser,
102
Sabin Corneliu Buraga – Tehnologii Web
"start_element", "end_element");
xml_set_character_data_handler($this->xml_parser,
"character_data");
xml_set_processing_instruction_handler($this->xml_parser,
"processing_instruction");
// deschide fi șierul XML
if (!($fp = fopen($this->xml_file, "r"))) die("could not open XML source");
// proceseaz ă fișierul
while ($data = fread($fp, 4096)) {
if (!xml_parse($this->xml_parser, $data, feof($fp))) {
// eroare de procesare
die(sprintf("XML error: %s at line %d",
xml_error_string(xml_get_error_code($this->xml_parser)),
xml_get_current_line_number($this->xml_parser)));
}
} /* while */ } /* parse() */
} /* class */
?>
Folosind aceast ă clasă, putem transforma un document XML în cod HTML, dup ă
cum se poate remarca din exemplul de mai jos, unde va fi prelucrat fi șierul cu impresii
despre un anumit sit Web și va fi generat un tabel HTML.
Documentul XML con ținând impresii privitoare la un sit Web are structura de mai jos:
<impresie data="01 Nov 2006, 11:33" client="fenrir.infoiasi.ro (193.231.30.197)">
<nume email="socrate@tuiasi.ro">Radu Filip</nume>
<ocupatia>Student</ocupatia>
<virsta>18-25</virsta>
<text> Salut!…
Ce mai faci?
</text>
</impresie>
Codul-surs ă PHP este dat în continuare:
<?php
// necesit ă prezen ța clasei definite mai sus
require("parseXML.php"); // substitu ția tag-urilor XML cu cod HTML
// se folosesc dou ă tablouri asociative
$open_tags = array(
103
Sabin Corneliu Buraga – Tehnologii Web
"impresii" => "\n<!– generat de parseXML –>\n" .
"<table>",
"impresie" => "<tr style=\"text-align: center\">",
"nume" => "<td><h4>",
"ocupatia" => "<td><p style=\"color: blue\">",
"virsta" => "<td><p><i>",
"text" => "<td><p class=\"text\">");
$close_tags = array(
"impresii" => "</table>\n" .
"<!– sfâr șitul gener ării parseXML –>\n",
"impresie" => "</tr>",
"nume" => "</h4></td>",
"ocupatia" => "</p></td>",
"virsta" => "</i></p></td>",
"text" => "</p></td>");
// instan țiază și inițializează analizorul
$parser = new parseXML(); $parser->set_xml_file("impresii.xml"); $parser->set_open_tags($open_tags);
$parser->set_close_tags($close_tags);
// ruleaz ă analizorul
$parser->parse(); // afiș ează rezultatul
echo $parser->get_html_code(); // distruge obiectul
$parser->destroy();
?>
Clasa definit ă este suficient de general ă pentru a putea fi utilizată pentru orice tip de
document XML. Tag-urile netratate de progra mul nostru vor fi ignorate.
De multe ori însă ar fi de dorit s ă realizăm anumite prelucr ări asupra datelor stocate de
fișierele XML. Putem înc ă să ne slujim de parseXML . De exemplu, am dori ca utilizatorul
(sau autorul sitului) s ă poată trimite mesaje celor care și-au l ăsat impresiile. Pentru aceasta
vom defini o clas ă derivată din clasa parseXML și vom redefini func țiile
start_element() și end_element() :
<?php require("parseXML.php");
// folosirea mo ștenirii pentru a defini
// un alt comportament class parseXML2 extends parseXML {
// indic ă dacă există atributul "email"
var $is_email = 0;
104
Sabin Corneliu Buraga – Tehnologii Web
// redefinirea metodelor
function start_element($parser, $name, $attrs) {
// apeleaz ă metoda din clasa de baz ă
parseXML::start_element($parser, $name, $attrs); // pune și link spre adresa e-mail
if (!strcmp($name, "nume")) { if ($attrs["email"]) {
$format = "<a title=\"Trimite mesaj la " .
$attrs["email"] .
"\" href=\"mailto:" . $attrs["email"] . "\">"; $this->html_code .= $format;
$this->is_email = 1;
}
else
$this->is_email = 0;
}
}
function end_element($parser, $name) { // închide
if (!strcmp($name, "nume")) {
if ($this->is_email) {
$format = "";
$this->html_code .= $format;
}
}
// apeleaz ă metoda din clasa de baz ă
parseXML::end_element($parser, $name);
}
}
?>
Noul membru de tip dat ă is_email este folosit pentru a putea închide corect tag-urile
elementului <a> (se poate întâmpla ca atributul email să nu apară). Restul codului r ămâ-
ne același, în loc de $parser = new parseXML() trebuind fi scris ă linia
$parser = new parseXML2() .
O posibil ă rulare a script-ului PHP de mai sus poate avea ca efect
pagina Web din cadrul capturii-ecran urm ătoare:
105
Sabin Corneliu Buraga – Tehnologii Web
Afișarea datelor XML în urma unei proces ări SAX
Desigur, dac ă facem numai prelucr ări asupra documentelor XML, ne putem dispensa
de definirea celor două tablouri asociative open_tags[] și close_tags[] , iar în func ții-
le startElement() și endElement() putem insera orice cod dorim.
O altă metodă de procesare este descris ă în capitolul 4 al c ărții S. Buraga
(coord.), Aplicații Web la cheie. Studii de caz implementate în PHP, Polirom, Ia și,
2003.
Un exemplu complet de procesare DOM a un ui document XML este furnizat în con-
tinuare. Intenț ionăm să procesăm conținutul unui fi șier XML referitor la proiectele pro-
puse spre implementare studen ților urmând disciplina „Reț ele de calculatoare”. Acest
document, numit projects.xml , va avea structura (evident, e oferit aici doar un frag-
ment):
<!– Document XML continind informatii despre proiectele propuse
la "Retele de calculatoare" (fragment)
Autor: Sabin-Corneliu Buraga – busaco@infoiasi.ro
Versiune: 1.6 / 2002-2004
Ultima actualizare: 04 noiembrie 2004
–>
<p:projects xmlns:p="urn:infoiasi.ro:projects"
update="04 noiembrie 2004">
<project class="B">
106
Sabin Corneliu Buraga – Tehnologii Web
<title>HangmanS</title>
<desc>
Sa se implementeze un server care sa permita…
</desc>
<stud>1</stud>
<url></url>
</project>
<project class="A">
<title>NetChatS</title> <desc>
Sa se conceapa un server de chat.
</desc>
<stud>2</stud>
<url>http://www.infoiasi.ro/~busaco/gaen/</url>
</project>
<project class="A">
<title>Super Proiect</title> <desc>
Un super proiect pentru niste super studenti!
</desc>
<stud>3</stud>
<url>http://www.super.org/</url>
</project>
<!– si altele… –>
</p:projects>
Pentru procesarea datelor, vom putea implementa urm ătorul script PHP 4:
<?php /* Un program PHP care proceseaz ă un document XML folosind DOM
Func ționează pentru PHP versiunea 4.x
Autor: Sabin-Corneliu Buraga – busaco@infoiasi.ro (c)2001, 2004
Ultima actualizare: 04 noiembrie 2004
*/
// locul unde sunt stocate fi șierele
define ("PATH", '');
# De exemplu, pentru Windows cu Apache2Triad instalat in 'apache2':
# define ("PATH", 'c:\\apache2\\htdocs\\php-examples\\');
// variabila globala indicând daca documentul a fost modificat
$modified = 0;
// încărcăm documentul XML
if (!$doc = domxml_open_file(PATH . "projects.xml")) {
echo "<p>A ap ărut o eroare la procesarea documentului!</p>\n";
107
Sabin Corneliu Buraga – Tehnologii Web
exit;
}
// rădăcina documentului
$root = $doc->document_element();
// afișăm informa ții generale despre document
echo "<p>Elementul radacina este <" . $root->node_name() . ">.</p>";
// afișăm informa ții privitoare la proiecte
$projs = $root-> get_elements_by_tagname ("project");
foreach ($projs as $proj) {
// preluam nodurile <title>
$titles = $proj-> get_elements_by_tagname ("title");
foreach ($titles as $title) { echo "<p>Proiect: " . $title-> get_content ();
}
// verific ăm care e clasa proiectului
if ($proj-> has_attribute ("class")) {
echo " de clasa " . $proj-> get_attribute ("class") . "</p>";
}
else {
echo " de clasa necunoscuta.</p>";
// nu exista atributul "class", îl cream
// implicit, proiectul e de clas ă D
$attr = $proj-> set_attribute ("class", "D");
// marc ăm documentul ca fiind modificat
$modified = 1;
}
}
// dacă documentul a fost modificat, îl afi șăm
if ($modified) {
$xmldoc = $doc-> html_dump_mem ();
echo "<pre>" . htmlentities($xmldoc) . "</pre>";
}
?>
În ceea ce prive ște realizarea de transform ări XSLT, putem recurge la func ționalitățile
oferite de extensia Sablotron disponibil ă în versiunea 4 a mediului. Func ția de transformare
XSL are forma:
function xslt_transf ($xml, $xsl) {
$xp = xslt_create (); // cre ăm procesorul XSLT
$rez = @ xslt_process ($xp, $xml, $xsl); // transform ăm
if (!$rez) { // o eroare
echo "Eroare XSLT: " . xslt_error ($xp) .
108
Sabin Corneliu Buraga – Tehnologii Web
" (" . xslt_errno ($xp) . ")";
return 1;
}
echo $rez; // afi șăm rezultatul transform ării
xslt_free ($xp); // eliber ăm memoria
return 0;
}
La finalul acestei sec țiuni, menționăm că în PHP 5 pentru realizarea valid ărilor XML
vom recurge la metodele puse la dispozi ție de clasa DOMDocument . Pentru valid ări con-
form schemelor XML exist ă schemaValidate() , iar cele DTD cu validate() .
Exemplul de mai jos ilustreaz ă modul de validare via o schemă XML:
<?php
$doc = DOMDocument::load ('projects-xsd.xml');
echo 'Documentul este ' .
$doc->schemaValidate ('http://localhost/projects.xsd') ?
'valid' : 'invalid';
?>
109
Sabin Corneliu Buraga – Tehnologii Web
4. Servicii Web
Premise
După cum am mai men ționat, originile și scopurile Web-ului iau în considera ție constitui-
rea unui spaț iu de comunicare inter-uman ă prin intermediul partaj ării cunoștinț elor și ex-
ploatarea puterii computaț ionale puse la dispozi ție de calculatoarele inter-conectate. Se
poate remarca u șor că interacțiunea dintre om și Web se rezolvă prin intermediul formu-
larelor Web, iar interac țiunea dintre ma șini se desf ășoară pe Web într-o manier ă limitată.
Nevoile industriei au crescut, dorindu-se existen ța unor solu ții multi-platform ă, slab-
conectate – acestea conduc la integrarea aplica țiilor, serviciilor și sistemelor, prin folosirea
tehnologiile Web actuale. Aceast ă integrare trebuie s ă se realizeze într-un mod flexibil, ad
hoc, în funcție de necesit ăți. O altă necesitate prive ște crearea și exploatarea unor servicii
atașabile ( pluggable ) și „inteligente”, software-ul fiind v ăzut în termeni de serviciu și nu
drept aplicaț ie mamut („ software as service ”). Aceasta pune premisele constituirii unor ofer-
tanți de servicii de aplica ții (application service provider ). Acesta conduce la proiectarea și
(re)folosirea unor standarde pentru îndeplinirea cerinț elor legate de vehicularea, disponi-
bilitatea, mentenan ța, securitatea și regăsirea datelor.
Mai mult decât atât, trebuie puse bazele c onstituirii unei arhitecturi destinate dezvolt ă-
rii de aplica ții distribuite orientate spre Web. Software -ul trebuie divizat în servicii care se
pot compune, menite a se conecta și orchestra în mod spontan în cadrul proceselor de
afaceri sau din alte medii. Este o viziune a software-ului bazat pe componente Web ( com-
ponent-based software ), în contrast cu aplica țiile monolitice, clasice. Desigur, software-ul
standard („vechi”) trebuie integrat în această nouă arhitectur ă pentru a se proteja investi-
țiile făcute.
Soluția este dat ă de un model, cunoscut sub numele de arhitectura orientat ă spre servicii
(SOA – Service Oriented Architecture ). Arhitectura SOA impune adoptarea unui stil de dez-
voltare de aplicaț ii considerate drept servicii ce vor fi invocate de alte aplica ții.
Prin SOA se înțelege o perspectivă asupra unei arhitecturi software care defi-
nește utilizarea de servicii oferind func ționalități solicitate de utilizatori. Resursele
rețelei sunt astfel disponibile gra ție unei suite de servicii independente ale c ăror
implement ări sunt necunoscute.
SOA presupune c ă noile servicii pot fi create pe baza celor deja existente, într-o manie-
ră sinergică, dar componentele sistemului în ansamblu trebuie s ă aibă un grad mare de
independen ță (de-coupling ). În func ție de schimbă rile ce pot interveni în cadrul cerin țelor
(business requirements ), serviciile pot fi re-compuse sau orchestrate diferit.
110
Sabin Corneliu Buraga – Tehnologii Web
Conceptul de serviciu Web bazat pe XML
În mod obi șnuit, putem implementa serviciile Web recurgând la script-uri CGI sau diverse
servere de aplicaț ii. Interacțiunea tradi țională poate decurge în urmă toarele dou ă moduri.
Prima manier ă este cea func țională (de tip cerere/r ăspuns): utilizatorul (nu neap ărat
uman) viziteaz ă o pagină și formuleaz ă o cerere, fie traversând o leg ătură hipertext, fie
prin intermediul unui formular. Serviciul (implementat de un program conceput într-un
anumit limbaj, precum Perl, PHP, C# ori Java) întoarce un r ăspuns, adic ă o reprezentare
– uzual, marcat ă în HTML – a resursei solicitate. Astfel, se acceseaz ă de la nivelul clientu-
lui o anumit ă funcționalitate specific ă pusă la dispozi ție de un server Web.
Cea de a doua este una conversa țională (de tip solicitare/r ăspuns). Suplimentar, se d ă
posibilitatea exprim ării unor întreb ări suplimentare în vederea rafin ării cererii: serviciul
solicită date de la utilizator pentru a returna un r ăspuns mai bun.
Se poate observa c ă serviciul Web, respectând „tradi ția”, expune o interfa ță-utilizator
(conceput ă în limbajul de marcare HTML în marea majoritate a cazurilor) prin interme-
diul căreia are loc interac țiunea. Cererile sunt captate via formulare, utilizatorii umani tre-
buind să interpreteze etichetele ( labels) atașate câmpurilor de dialog, pentru a cunoaște ce
tipuri de date pot fi introduse – se asigur ă câmpuri textuale, liste de op țiuni, butoane de
tip checkbox și radio etc. De asemenea, utilizatorii umani trebuie s ă interpreteze r ăspunsul
oferit de serviciu prin parcurgerea rezultatului red ării de către browser a reprezentă rii
(HTML) expediate de server.
Pentru un calculator, activit ățile expuse mai sus sunt dificil de realizat, deoarece pro-
gramul de interpretare a rezultatului depind e de succesiunea de marcaje ale paginii Web
recepț ionate. Orice modificare, minor ă sau nu, a tag-urilor din cadrul documentului con-
duce la rescrierea script- ului de prelucrare a ie șirii oferite de serverul Web. Aceast ă metodă
de „capturare” a informa țiilor incluse într-un document HTML se mai nume ște și
Web/HTML scrapping și se dovede ște dificil de aplicat în cazul prelucr ării de structuri
complexe de date.
Serviciile Web bazate pe XML fac explicite specifica țiile implicite, putând fi folosite în
cadrul interac țiunii dintre ma șini. Mai mult decât atât, pot fi invocate și în cazul necu-
noașterii apriori a interacț iunii cu alte aplica ții/servicii Web.
Nu există o definiție unanim acceptat ă a conceptului de serviciu Web.
Conform IBM, reprezint ă o aplicație modular ă bazată pe tehnologiile Internet
menită a îndeplini activit ăți specifice și conformându-se unui format tehnic speci-
fic. Corpora ția Microsoft consider ă serviciile Web ca fiind partea de procesare a
datelor unei aplica ții (application logic ) disponibil ă la nivel de program și beneficiind
de funcționalitățile oferite de Internet. Dup ă Sun, un serviciu Web este o aplica ție
111
Sabin Corneliu Buraga – Tehnologii Web
care accept ă cereri din partea altor sisteme dispuse în Internet sau intranet, me-
diate de tehnologii de comunica ție neutre și agile.
Un serviciu Web ofer ă o funcționalitate specific ă accesată pe baza unui schimb de me-
saje marcate în XML. Acest schimb de mesaje e guvernat de anumite reguli. Suplimentar,
un serviciu Web se pot autodescrie, folosind meta-date (date referitoare la date).
Serviciile Web implic ă utilizarea unor protocoale de comunica ție, având asociate des-
crieri ale datelor procesate și alte interac țiuni cu aplica ții terțe. Identificarea unui serviciu
Web se realizeaz ă prin intermediul URI-urilor, transfer ul de date recurge în mod uzual la
HTTP, iar definirea structurat ă a datelor vehiculate se face via XML. Un serviciu Web
poate fi considerat ca fiind compus dintr-o colec ție de func ții împachetate, v ăzute drept
entitate unică și publicate în spa țiul WWW cu scopul de a fi folosite de alte programe.
Ca exemple de opera ții ce pot fi puse la dispoziț ie de serviciile Web, le amintim pe ur-
mătoarele:
– transformarea datelor primite ( e.g., conversii de valori în alte unit ăți de măsură);
– dirijarea mesajelor (mai ales în cazul „magistralelor” de date specifice, disponibile
la nivel de întreprindere);
– interogări asupra diverselor servere de baze de date relaț ionale, obiectuale sau na-
tive XML (de exemplu, furnizarea catalo agelor de produse, a coordonatelor unor
localități, a situației unui cont bancar, a istoricului cumpă răturilor efectuate online
etc.);
– orchestrarea conversa țiilor între diferite entit ăți (jucând, din acest punct de vede-
re, rol de mediatori sau agen ți);
– realizarea de proces ări (calcule) diverse;
– aplicarea de politici de acces asupra resurselor;
– rezolvarea unor excep ții ce pot surveni într-un context;
– solicitarea de aprob ări de la utilizator ( e.g., a execuției unor aplica ții de către o altă
entitate).
Drept principale caracteristici ale serviciilor Web men ționăm:
– accesarea, în manier ă publică, se realizează printr-o adres ă; serviciile Web pot fi
considerate ca reprezentând puncte terminale ( end points ) ale comunicării între ma-
șini, similar modelului folosit de protoc oalele de transport ale stivei TCP/IP;
– abilitatea de a prelucra orice tip de date , din moment ce datele de intrare sunt do-
cumente XML (conforme unei scheme de validare);
112
Sabin Corneliu Buraga – Tehnologii Web
– posibilitățile de dezvoltare pe baza platformelor, arhitecturilor și limbajelor exis-
tente;
– adaptabilitatea (un serviciu Web poate fi extins, utilizând eventual, în mod trans-
parent, alte aplica ții sau invocând la rândul să u alte servicii Web).
Serviciile Web sunt c ărămizile pentru crearea de sisteme distribuite deschise, permi-
țând organiza țiilor și dezvoltatorilor independen ți să-și facă disponibile pe Web bunurile
digitale într-un mod rapid și facil.
Orice aplicaț ie-client ( script Perl, applet Java, program C cu interfa ță text sau grafic ă,
aplicație .NET, pagin ă ori serviciu Web etc.) poate „consuma” – într-o varietate de mo-
dalități – datele ob ținute de la un serviciu invocat printr-o metod ă standardizat ă, bazată
pe standardele Web în vigoare.
Componentele arhitecturale ale serviciilor Web
Vom puncta în continuare principalele co mponente folosite în invocarea, definirea și re-
găsirea serviciilor Web.
În primul rând, apare necesitatea dezvolt ării unui protocol de comunicare (transport)
între mașini eterogene care să faciliteze vehicularea de mesaje permiț ând interacț iunile
complexe dintre calculatoare și având un con ținut oricât de complex. Mai mult decât atât,
trebuie oferit suport pentru asigurarea extensibilit ății, luându-se în calcul problemele de
securitate, fiabilitate și performanță ce pot surveni. Acest protocol va trebui s ă pună la
dispoziție un mecanism de invocare și de transmitere structurat ă a datelor.
Trebuie, astfel, g ăsit un limbaj pentru transmisia în format XML a parametrilor de in-
trare și întoarcerea r ăspunsului primit de la serviciul Web invocat.
Principalele protocoale de comunica re utilizate în prezent sunt XML-RPC și SOAP.
XML-RPC ofer ă o specifica ție și un set de implement ări pentru realizarea de apeluri
de proceduri la distan ță, în spiritul mecanismului RPC ( Remote Procedure Call ). A fost pro-
iectat pentru a fi cât mai simplu, în acela și timp îns ă permițând și transmiterea, procesarea
și returnarea unor structuri complexe.
SOAP reprezintă o recomandare a Consor țiului Web, propunând facilit ăți sofisticate
și oferind o palet ă largă de posibilit ăți de reprezentare (serializare și deserializare) a date-
lor vehiculate – vezi capitolul 4 din L. Alboaie, S. Buraga, Servicii Web , Polirom, Ia și, 2006.
Un mesaj SOAP este compus din trei p ărți:
– Un plic ( envelope ) care define ște cadrul de lucru pentru a descrie ceea ce con ți-
ne mesajul și modul de procesare a acestui con ținut. Datele din corpul mesa-
113
Sabin Corneliu Buraga – Tehnologii Web
jului pot fi transportate indiferent de protocolul folosit (uzual, e folosit
HTTP);
– Un set de reguli de codificare ( encoding rules ) pentru exprimarea instanț elor ti-
purilor de date definite în aplica ție;
– O conven ție de reprezentare ( representation ) a apelurilor de metode implemen-
tate de serviciul Web și răspunsurilor furnizate în urma invoc ării acestora.
De asemenea, SOAP poate specifica și o cale de la expeditor la destinatar, via un in-
termediar ( proxy) opțional, în vederea realiz ării de dirijă r i d e m e s a j e ( SOAP routing ). O
eroare (excep ție) privitoare la func ționalitatea serviciului este semnalat ă printr-un mesaj
special, denumit SOAP fault .
În vederea exploată rii funcționalităților puse la dispozi ție de un serviciu Web, trebuie
oferită o descriere a acestuia. Apare necesitatea unui limbaj de descriere, menit a r ăspun-
de la întreb ări precum „Care e sintaxa mesajelor vehiculate?”, „Cum se desf ășoară trans-
ferul de date?” și „Cum g ăsim un serviciu Web?”.
Soluția este furnizată d e W S D L ( Web Service Description Language ). Limbajul permite
separarea descrierii abstracte a func ționalității oferite de un serviciu de detaliile concrete
(de tipul „cum” și „unde” este disponibilă acea func ționalitate). WSDL descrie serviciile
Web începând cu mesajele interschimbate între entitatea care ofer ă și cea care invoc ă un
anumit serviciu. Mesajele sunt „povestite” în manier ă abstractă și apoi sunt asociate unui
protocol de re țea, precizându-se de asemenea și un format (o sintax ă). Un mesaj const ă
dintr-o colec ție de date de anumite tipuri, iar schimb ul de mesaje este descris ca o opera-
ție. Tipurile de date se definesc via scheme XML, la nivel conceptual folosindu-se un
model de date reprezentat printr-un s et de componente – mesaj, port, manier ă de atașare,
serviciu – având specificate diverse propriet ăți. La nivel sintactic, se recurge la XML.
Apare înc ă o cerință: instituirea unui mecanism pentru publicarea și regăsirea, în ma-
nieră publică, a unui serviciu Web. Este posibil ca o anumit ă funcționalitate oferit ă de un
grup de servicii Web s ă poată fi regăsită prin intermediul unor interog ări formulate de
partea care intenț ionează să foloseasc ă acea func ționalitate.
Pentru aceasta, s-a constituit un catalog al tuturor furnizorilor de servicii Web publice
în vederea reg ăsirii informa țiilor dorite: UDDI ( Universal Description, Discovery, and Integra-
tion), oferind o baz ă de date distribuit ă a serviciilor Web din prisma tipurilor de afaceri
electronice pe care acestea le pot modela.
Conceptual, datele stocate într-un catalog UDDI pot fi împ ărțite în urmă toarele trei
categorii:
114
Sabin Corneliu Buraga – Tehnologii Web
– paginile albe ( white pages ) semnific ă informații generale referitoare la o compa-
nie furnizoare de servicii (numele companiei, descrierea tipurilor de afaceri
efectuate, adresa etc.);
– paginile aurii ( yellow pages) includ scheme de clasificare a companiilor și/sau
serviciilor disponibile (de exemplu, coduri de clasificare pe criterii geografice,
ale categoriei de afaceri, taxonomii referitoare la produsele comercializate și
altele);
– paginile verzi ( green pages ) specifică informații tehnice despre un serviciu Web
specific ( e.g., o adresă Web spre descrierea acestuia, o adres ă privitoare la in-
vocarea serviciului etc.).
Uzual, căutarea în cadrul UDDI se realizeaz ă în funcție de clasa din care face parte
afacerea, dup ă un nume de serviciu sau dup ă locația geografic ă a furnizorului. Detalii sunt
furnizate la adresa www.uddi.org .
Maniera de interogare a registrului UDDI
Funcționalitățile de căutare sunt implementate via servicii Web, astfel încât accesul la
registrul UDDI se realizeaz ă prin intermediul protocolului SOAP descris mai sus. UDDI
va pune la dispozi ție documentul WSDL corespunz ător unui serviciu compatibil cu cere-
rea formulat ă.
115
Sabin Corneliu Buraga – Tehnologii Web
Suplimentar, actualmente sunt disponibile o serie de specifica ții și iniț iative adiționale
privitoare la diverse aspecte referitoare, printr e altele, la adresarea, descoperirea, securita-
tea și asigurarea inter-operabilit ății serviciilor Web.
Modalități de implementare ș i exploatare
Existența serviciilor Web este insuficient ă, fără a avea la îndemân ă instrumente suplimen-
tare de implementare, exploatare și integrare. Un aspect important este dat de faptul c ă
informațiile și serviciile trebuie s ă fie accesibile de pe orice tip de calculator și de oriunde,
apărând necesitatea utiliz ării unei platforme independente de dispozitiv, al cărei rol poate
fi jucat de o ma șină virtuală.
Noile servicii dezvoltate pot fi compuse din serviciile Web deja existente, accesibile în
mod transparent. Ne situ ăm astfel la nivel de middleware oferind atât func ționalități (im-
plementate de codul-surs ă al unor programe concepute în limbaje diverse), cât și suport
pentru inter-operabilitate.
Soluția este oferit ă de implementarea și exploatarea unui cadrul de lucru ( framework )
Web cu suport pentru SOA. Un astfel de cadru de lucru trebuie s ă asigure suportul pen-
tru protocoalele Web și cele înrudite (HTTP, SMTP, FTP etc.), plus pentru familia XML.
De asemenea, trebuie s ă se pună la dispozi ție mijloace pentru catalogarea, descoperi-
rea și integrarea serviciilor Web via UDDI și descrierea func ționalității și intrări-
lor/ieșirilor gra ție limbajului WSDL, cu posibilitatea gener ării automate de documente
WSDL asociate serviciilor Web implementate. Suplimentar, dezvoltatorii vor putea re-
curge la facilit ăți de specificare și atașare a unui context de execu ție, luându-se în calcul
factori precum autorizarea (cine poate invoca un anumit serviciu), localizarea (unde e lo-
calizat serviciul: platform ă, server, port folosit și altele), planificarea (când poate fi rulat
serviciul) etc.
Pentru accesul la aplica ții și sisteme tradi ționale ( legacy) sau la servere de stocare
(backend servers ), cadrul de lucru va trebui s ă ofere un nivel de integrare. Mai mult decât
atât, este necesar ă existența unui nivel de interfa țare (frontend ) via un server Web, care pre-
supune existenț a unei/unor mașini virtuale și a unui motor de asigurare a fluxului de acti-
vități (workflow engine ). La nivelul cel mai de sus, se afl ă ofertantul de servicii Web sau utili-
zatorul direct al acestora.
Actualmente, exist ă o sumedenie de tehnologii, produse și ofertanți de servicii Web,
dintre care le enumer ăm doar pe urm ătoarele: Apache Axis implementat în Java, Borland
Delphi/JBuilder Web Services, IBM Web Serv ices Toolkit, JBoss, Microsoft .NET
Framework, NuSOAP și PEAR::SOAP pentru PHP, modulul SOAP::Lite pentru Perl,
Web Services Developer Pack pus la dispozi ție de mediul Java. De asemenea, exist ă im-
plementări oferite și alte companii precum Apple, BEA, Fujitsu, Hewlett-Packard,
Oracle, SAP, Sybase etc.
116
Sabin Corneliu Buraga – Tehnologii Web
Mai trebuie să remarcăm faptul c ă au apărut diverși ofertanți de servicii Web, dintre
care îi enumer ăm pe Amazon, Blogger, cddb (CD DataBase), eBay, European
Bioinformatics Institute, Google, Interfax, LiveJournal, PayPal, RedHat, MSN (Virtual
Earth), Shopsync, Xignite și Yahoo!.
Dezvoltarea și invocarea de servicii Web
În majoritatea cazurilor, serviciilor Web func ționează conform paradigmei client/server:
serverul ruleaz ă permanent, unul sau mai mul ți clienți trimit spre acesta cereri SOAP via
un protocol de transport (cel mai uzua l, HTTP), iar serverul întoarce un r ăspuns.
În cazul serviciilor Web, standardele sunt esenț iale pentru asigurarea inter-
operabilității. Codificarea con ținutului mesajelor vehiculate (cererea și răspunsul) prin
SOAP adopt ă formatul XML, iar descrier ea serviciului Web se bazeaz ă pe limbajul
WSDL.
Trebuie să remarcăm, încă o dată, că nu există nici o restric ție în alegerea limbajului
de programare în care se vor implementa serviciul Web și posibilii lui clien ți (programe
desktop , aplicații Web, alte servicii Web etc.). Indife rent ce limbaj, instrument, platform ă
sunt folosite, în esen ță dezvoltarea și utilizarea serviciilor Web prezint ă aceleași caracteris-
tici și adoptă șabloane de proiectare similare.
Unele instrumente SOAP implementeaz ă propriul server Web, folosind HTTP (de
exemplu, SOAP::Lite sau Microsoft Visual Web Developer ). Altele – precum extensia Soap
pentru PHP sau biblioteca gSOAP – presupun instalarea în cadrul unui server Web parti-
cular, astfel încât daemonul HTTP va manevra mesajele SOAP spre o componentă proxy ,
care realizeaz ă invocarea serviciului Web în manier ă transparent ă pentru programator. O
serie de instrumente SOAP suport ă un mecanism de transport configurabil care permite
selecția, la nivel de aplica ție, a protocolului de transport.
Instrumentele SOAP furnizeaz ă o component ă proxy , menită a procesa și interpreta
mesajul SOAP în vederea invoc ării codului aplica ției. Aceast ă component ă trebuie să aibă
în responsabilitate recunoa șterea stilului de codificare, translatarea datelor din format na-
tiv – de exemplu, obiecte Java sau .NET – în XML ( și invers) și altele.
În ciuda diferenț elor de implementare, instrumentele pentru dezvoltarea de servicii
Web prin SOAP urmeaz ă același model.
În continuare, ne propunem să detaliem modul de implementare și de invocare a
unor servicii Web pe baza uneltelor open source existente pentru PHP. Pentru început, vom
construi un server și un client SOAP simplu în PHP, utilizând extensia Soap disponibil ă
în versiunea 5 a acestui server de aplica ții (ca alternativă , se poate recurge și la biblioteca
NuSOAP care poate fi folosit ă și în PHP 4).
117
Sabin Corneliu Buraga – Tehnologii Web
Astfel, trebuie s ă implement ăm un server SOAP care va oferi accesul la un serviciu
Web incluzând o singur ă metodă – furnizeazaCantit() . Aceasta va avea ca parametru
de intrare un șir de caractere desemnând un sortiment de portocale și va returna cantita-
tea existent ă, dacă acel sortiment exist ă. Nu vom furniza o descriere WSDL asociat ă ser-
viciului, invocarea putându-se realiza explicit, dup ă cum vom vedea mai jos. Codul-surs ă
al acestui serviciu simplu este dat în continuare:
<?php
try {
// nu oferim nici o descriere WSDL,
// stabilim URI-ul serviciului
$server = new SoapServer (null,
array('uri' => 'urn:portocale.info'));
// adă ugăm metodele implementate
$server-> addFunction ('furnizeazaCantit');
// a șteptăm cereri SOAP
$server-> handle();
} catch ( SOAPFault $exception) {
echo 'A ap ărut o excep ție: ' . $exception;
}
// func ție care furnizeaz ă cantitatea
// dintr-un sortiment de portocale function furnizeazaCantit ($numeSortiment) {
// de obicei, aici vom efectua o interogare SQL
switch ($numeSortiment) { case 'japoneze': return 33;
case 'albastre': return 74;
default : return 'inexistent';
}
}
?>
Primul argument al constructorului desemneaz ă adresa (URL-ul) documentului
WSDL descriind serviciul, în acest caz fiind null . Spațiul de nume prin care e identificat
serviciul dezvoltat este dat în situa ția de față de un URN – urn:portocale.info . Fieca-
re funcție implementat ă va fi adăugată cu addFunction() . De asemenea, unui serviciu i
se poate asocia o clas ă prin intermediul metodei setClass() . Cererile SOAP vor fi re-
zolvate via handle() care va avea în responsabilitate și (de)serializarea datelor.
Deoarece extensia Soap este inclus ă în distribu ția standard PHP 5, pentru rularea pro-
gramului de mai sus nu va trebui inst alat nimic suplimentar. În exemplific ările de față am
recurs la PHP versiunea 5.0.4 sub diverse versiuni ale serverului Apache 2.0.
118
Sabin Corneliu Buraga – Tehnologii Web
Recurgând tot la extensia Soap, vom concepe acum un client care va invoca metoda
expusă de serviciul Web pentru o serie de so rtimente de portocale. Liniile de cod PHP
sunt urmă toarele:
try {
$client = new SoapClient (null,
array('location' =>
'http://localhost/sxml/oranges-server.php',
'uri' => 'urn:portocale.info'));
// realiz ăm o suită de invoc ări ale metodei dorite
foreach (array('albastre', 'japoneze', 'celeste') as $sortiment) {
$rez = $client-> __call('furnizeazaCantit',
array($sortiment));
echo "<p>Stocul de portocale $sortiment
este <strong>$rez</strong>.</p>";
}
} catch ( SOAPFault $exception) {
echo 'A ap ărut o excep ție: ' .
$exception-> faultstring ;
}
Deoarece nu avem la dispozi ție descrierea WSDL a serviciului, vom folosi __call()
pentru invocarea metodei furnizeazaCantit() . Excepțiile ce pot surveni sunt captura-
te graț ie construc ției try … catch incluse în PHP 5.
Obiectul SOAPFault încapsuleaz ă informaț iile privitoare la un fault SOAP; în cazul de
față, am utilizat proprietatea faultstring pentru a afi șa mesajul de excep ție. Eșuarea
unui apel SOAP poate fi verificat ă și cu is_soap_fault() .
În urma itera țiilor realizate, vom obț ine un rezultat precum ce l din captura-ecran ur-
mătoare.
Tipul ră spunsului primit este unul eterogen (fie întreg, fie string), în funcție de existen-
ța sortimentului de portocale pentru care realiz ăm invocarea metodei.
119
Sabin Corneliu Buraga – Tehnologii Web
Invocarea serviciului Web implementat în PHP 5
Pentru aprofundarea subiectului, recomand ăm consultarea lucr ărilor
L. Alboaie, S. Buraga, Servicii Web , Polirom, 2006 și S. Buraga, Tehnologii
XML , Polirom, 2006.
120
Sabin Corneliu Buraga – Tehnologii Web
121 PPaarrtteeaa IIVV –– RReeggăăssiirreeaa iinnffoorrmmaațțiiiilloorr ppee WWeebb
„Unde se găsește ultimul port de unde nu vom mai ridica ancora?”
Herman Melville
1. Preliminarii
2. Motoare de c ăutare
3. Meta-c ăutătoare
4. Alte mijloace de reg ăsire a informaț iilor
Sabin Corneliu Buraga – Tehnologii Web
122
Sabin Corneliu Buraga – Tehnologii Web
1. Preliminarii
Fiind bazat pe hipertext, spa țiul WWW are ca prim obiectiv oferirea unui mecanism facil
de a stoca și de a furniza, ulterior, informa ții, într-o manier ă non-secvenț ială.
Conform studiilor întreprinse în ultimii ani, utilizatorii care petrec mai mult de cinci
ore pe Internet alocă peste 70% din timp c ăutării de informa ții. Pentru a localiza resursele
dorite, un procent de 85%-90% dintre utilizatori apeleaz ă la motoarele de c ăutare.
Astfel, importan ța acestor aplica ții se dovede ște de necontestat, actualmente existând
disponibile pe Web o multitudine de c ăutatoare și meta-căutatoare, generale sau speciali-
zate.
Motoarele de c ăutare pot oferi servicii de c ăutare pe baz ă de indecși (i.e. Altavista) sau
pe baza unor ierarhii de termeni – aș a-numitele servicii director (cum ar fi Yahoo!). În ulti-
ma perioad ă, aceste tipuri de servicii au devenit hibride, primul dintre motoarele de c ăuta-
re care a adoptat tehnicile mixte fiind Excite.
123
Sabin Corneliu Buraga – Tehnologii Web
2. Motoare de c ăutare
Preambul
Au fost evidenț iate mai multe modalit ăți de regă sire a informa țiilor disponibile pe Web,
în funcție de inten țiile utilizatorilor. Printre cele mai importante se enumer ă:
• scanarea ( scanning ) – utilizatorii parcurg, superficial, o arie largă de informa-
ții, aparținând de obicei unui anumit subiect sau unui grup de subiecte conexe;
• răsfoirea (browsing , surfing ) – utilizatorii viziteaz ă locaț iile care le capteaz ă in-
teresul, fără a avea stabilit un model mental al informaț iilor dorite;
• căutarea (searching ) – utilizatorii sunt motiva ți să găsească o categorie parti-
culară de informa ții țintă. De cele mai multe ori este folosit ă căutarea bazat ă pe
cuvinte-cheie ( e.g. „procesare XML”) sau pe construc ții formulate în limbaj natu-
ral, cum ar fi „Unde g ăsesc documenta ții despre design Web?”;
• explorarea ( exploring ) – utilizatorii investigheaz ă legăturile referitoare la o
anumită resursă informativ ă și pe cele conexe;
• hoinăreala ( wandering ) – utilizatorii realizeaz ă o navigare complet nestructu-
rată.
De remarcat faptul c ă, în mod frecvent, utilizatorii nu parcurg la un moment dat decât
o singură pagină WWW, apar ținând unui server particular, f ără a avea o vedere de an-
samblu a modului de structurare a tuturor documentelor de la acea adres ă. Astfel, spa țiul
Web prezint ă următoarele caracteristici negative:
• modelul plat de memorare a datelor
Documentele nu sunt stocate în mod structurat pe serverele Web. Structura
hipertext pe care, eventual, o formeaz ă acestea poate fi recunoscut ă de cele mai
multe ori doar examinând URI-urile asociate. Uzual, paginile nu posedă legături
către documentul pă rinte („rădăcina” sitului – un fi șier al cărui nume difer ă în
funcție de serverul Web folosit, pentru Apache și IIS de exemplu fiind
/index.html , respectiv /default.htm ).
• legăturile unidirecționale
Limbajul HTML nu ofer ă decât posibilitatea de specificare a leg ăturilor unidi-
recționale, simple. Este dificil de alc ătuit o hart ă locală care să ilustreze toate sur-
sele și destinațiile legăturilor dintre paginile Web ale unui sit. Re țelele sofisticate
de legături conduc la o navigare greoaie și pot deveni frecvent surse de confuzie.
124
Sabin Corneliu Buraga – Tehnologii Web
• lipsa unei h ărți globale de navigare
Nu poate fi realizată o hartă globală de navigare prin întreg spa țiul WWW, într-
o manieră ierarhică (arborescent ă), deoarece structura hipertext de ansamblu a
Web-ului este necunoscut ă.
• menținerea legăturilor
Legăturile fiind stocate în interiorul documentelor, posibilitatea de a adă uga di-
rect adnot ări sau de a modifica leg ăturile dintr-o pagin ă este deținută doar de
proprietarul acesteia. Men ținerea integrit ății legă turilor pentru situri Web care
conțin un num ăr foarte mare de documente se dovede ște dificilă. De cele mai
multe ori se apeleaz ă la programe de verificare a validit ății legă turilor și de con-
struire a ierarhiilor de leg ături între paginile unui sit Web.
În concluzie, pentru a avea acces la informaț iile dorite, de cele mai multe ori se recurge
la facilitățile oferite de unul sau mai multe dintre motoarele de c ăutare disponibile.
Interacțiunea cu un motor de c ăutare
Interfața de căutare a unui motor de c ăutare este o component ă importantă a sistemului,
oferind în func ție de motor posibilit ăți de formulare a cererilor prin intermediul diver șilor
operatori logici, în limbaj natural, explorând ierarhii de domenii catalogate (directoare
Web), stabilind localizarea paginilor etc.
Majoritatea motoarelor de c ăutare utilizeaz ă o convenț ie de compunere a interog ărilor.
Pot fi introduse și rela ții desemnate prin intermediul operatorilor AND, OR, NOT și
NEAR. Urmeaz ă o descriere succint ă a fiecăruia dintre ace ști operatori:
• termen 1 AND termen 2
Se folosește atunci când dorim ca paginile returnate de motor s ă aibă în com-
ponență ambii termeni. De multe ori, semnul plus (caracterul „ +”) prefixând fie-
care termen înlocuie ște funcția lui AND: +termen 1 +termen 2.
• termen 1 OR termen 2
Îl vom folosi în situa ția când dorim ca paginile c ăutate să conțină măcar unul
dintre cei doi termeni specifica ți.
• NOT termen
Dacă vrem ca paginile s ă nu includ ă termenul specificat vom utiliza acest ope-
rator (o construc ție echivalent ă este -termen ).
125
Sabin Corneliu Buraga – Tehnologii Web
• termen 1 NEAR termen 2
Vom specifica acest operator pentru situaț iile în care dorim ca paginile că utate
să conțină cei doi termeni localiza ți la mică depă rtare unul de cel ălalt (vecin ătate
de 20-200 de cuvinte, în func ție de serviciul de c ăutare ales).
Pentru gruparea și schimbarea preceden ței operatorilor se pot utiliza parantezele „ ()”.
Se mai poate folosi și construc ția "listă de termeni" , ghilimelele însemnând fap-
tul că se va realiza o c ăutare exact ă a secvenț ei de termeni din lista dat ă. De exemplu:
"Proiectare Web" +sfaturi -utilitare
De asemenea, se oferă și posibilitatea de c ăuta în titlurile paginilor Web, prin interme-
diul unui construc ții de forma:
title: șir căutat
De exemplu, pentru a c ăuta „Linux” în titlurile paginilor, vom putea scrie:
title: Linux
O altă facilitate este aceea de a g ăsi toate paginile care includ ancore c ătre o adres ă spe-
cificată, prin folosirea cuvântului-cheie link. Astfel, pentru a ob ține lista tuturor docu-
mentelor care includ o anumit ă adresă e-mail am putea introduce:
link: busaco@infoiasi.ro
În mod obi șnuit, ne vom sluji foarte rar de toate aceste facilit ăți puse la dispozi ție, pre-
ferând formularea unui interog ări compuse dintr-un singur cuvânt sau a unei propoziț ii în
limbaj natural. Tehnologia Ask Jeeves – www.askjeeves.com – încorporat ă de Altavista
este utilizat ă pentru procesarea cererilor formulate în limbaj natural (în spe ță, în limba
engleză), problemele care trebuie s ă fie rezolvate fiind cele legate de dezambiguizarea
termenilor, eliminarea cuvintelor nerelevante sau expandarea interog ării (de exemplu, pot
fi automat formulate noi cereri con ținând sinonime ale cuvintelor furnizate de utilizator).
De asemenea, majoritatea motoarelor ofer ă posibilitatea de rafinare ( refine) a interog ării
sau de specificare a unor cereri avansate de c ăutare ( advanced search).
De reținut însă faptul că nici un motor nu poate fi perfect, serviciile de c ăutare oferite
neputând avea o acurate țe de 100%. Pentru testarea serviciilor de c ăutare se iau în consi-
derație mai mulț i factori, dintre care pot fi amintiț i: acuratețea, posibilitatea de c ăutare
avansată, ergonomia în utilizare și acordarea de alte facilit ăți.
La finalul acestei sec țiuni, putem men ționa că actualmente cele mai bine cotate sau po-
pulare motoare de c ăutare sunt Google , Yahoo!, Ask Jeeves , All The Web, AOL Search și
126
Sabin Corneliu Buraga – Tehnologii Web
HotBot . Alte alegeri se pot îndrepta c ătre Altavista , Gigablast sau LookSmart . Printre noii
veniți, se enumer ă Clusty și MSN Search .
Structura intern ă a unui motor de c ăutare
În general, un motor de c ăutare este constituit din trei componente de baz ă:
1. o aplica ție, denumit ă robot Web ( spider , crawler ), având misiunea de a parcurge spaț iul
WWW și de a vizita anumite pagini, extr ăgând informa ții despre ele. Aceste infor-
mații vor fi stocate pe serverul/serverele motorului de c ăutare, într-o baz ă de date
sau într-un index. Robo ții Web vor fi prezenta ți în cadrul urm ătoarei secțiuni;
2. un depozit de memorare a informa țiilor despre paginile parcurse de robot, numit
index (catalog ). Acest index con ține de cele mai multe ori câte o copie a fiec ărei pa-
gini și a URI-ului corespunz ător acesteia, organizarea informa țiilor în cadrul inde-
xului efectuându-se conform unor criterii specifice;
3. un mecanism de evaluare (ranking ) a importan ței paginilor din index în conformitate cu
cererea formulat ă de utilizator, cerere introdus ă prin intermediul unei interfe țe Web
(partea vizibil ă a motorului de c ăutare). În ordinea importan ței, adresele paginilor
(plus alte informa ții) sunt returnate – sub forma un ui document Web – utilizatoru-
lui care a formulat cererea. Utilizatorul este cel care va decide care pagin ă (sau grup
de pagini) întrunește preferinț ele sale.
Diferențele dintre motoarele de c ăutare opera ționale în acest moment sunt date de fie-
care component ă în parte.
127
Sabin Corneliu Buraga – Tehnologii Web
Arhitectura intern ă a unui motor de că utare
Roboții Web
Roboții Web , regăsiți și sub numele de păianjeni (spiders ), sunt programe care tra-
versează în mod automat structura hipertext a spa țiului WWW, cu scopul extrage-
rii unor informaț ii.
Trebuie să facem o distinc ție clară între robo ții Web și navigatoarele Web, acestea din
urmă fiind aplicaț ii acționate de om.
Activitatea unui robot Web const ă în a transmite o cerere HTTP că tre un server Web
– pornind de la un identificator uniform de resurse (URI) – și în a extrage informa țiile
corespunz ătoare dintr-o reprezentare a unei resurse și din toate documentele desemnate
de legăturile acesteia.
Roboții Web se pot utiliza în diverse scopuri, principalele fiind cele detaliate mai jos:
• analiza statistic ă – prin traversarea complet ă a unui sit Web particular, robotul poate
furniza diverse statistici pre țioase referitoare la resursele procesate, precum media
documentelor stocate pe acel server, procentul de documente de un anumit tip,
128
Sabin Corneliu Buraga – Tehnologii Web
lungimea medie a unei pagini, gradul de interconectare cu alte documente, locale
sau la distanță etc. De fapt, primul robot implem entat a fost conceput tocmai cu
scopul declarat de a contoriza toate serverele Web din lume, pentru a se cerceta cât de întins este spa țiul hipertext.
De asemenea, roboț ii Web pot fi utiliza ți la descoperirea diverselor modele de date
(pattern-uri) prin explorarea unei cantităț i apreciabile de informa ții disponibile pe
Web, fiind astfel implica ți în activit ăți de descoperire a resurselor – cunoscute în li-
teratura de specialitate prin sintagma „minerit al datelor” ( data mining); de asemenea,
se poate efectua și un „minerit al rela țiilor” ( relation mining ), pentru descoperirea
posibilitelor rela ții stabilite între resursele Web. Aceste aspecte sunt imperios nece-
sare în domenii precum comer țul electronic;
• menținerea legăturilor – în prezent, este foarte important s ă fie menț inută în bune
condiții starea leg ăturilor stabilite între diverse documente Web. Un robot poate
ajuta la descoperirea și rezolvarea a șa-numitelor „leg ături moarte” care indic ă resur-
se inexistente. De și serverele Web pot înregistra toa te cererile care nu pot fi satisfă –
cute din cauza specific ării adreselor invalide, administ ratorul unui sit Web de pro-
porții poate recurge la asistență din partea unui robot pentru descoperirea automat ă
a legăturilor eronate.
Roboții pot verifica, de asemenea, și structura documentelor (X)HTML, semnalând
erorile de design și de stil ale acestora, precum și eludarea unor reguli privind acce-
sibilitatea con ținutului. Serviciul de validare oferit de Consorț iul Web reprezint ă
tocmai un astfel de robot;
• oglindire – tehnica oglindirii ( mirroring ) este preluată de la arhivele FTP și constă în
copierea într-o altă locație a întregii structuri arborescente a unui sit (adic ă a tuturor
fișierelor sale, în mod recursiv) și în reactualizarea periodic ă a acestor copii. Oglin-
direa resurselor asigur ă fiabilitate, vitez ă mai mare de transfer, evitarea înc ărcării
traficului de re țea, acces neconectat ( off-line) etc.
Pentru Web, oglindirea poate fi realizat ă de un robot, care trebuie să aibă în res-
ponsabilitate și rescrierea referin țelor la alte documente, pă strarea integrit ății hiper-
textului și actualizarea regulat ă a paginilor WWW. Oglindirea poate fi evitat ă,
folosindu-se în mod inteligent memoria cache a serverelor proxy (intermediare), care
oferă posibilități de actualizare selectiv ă și de organizare a resurselor. O categorie
specială de astfel de robo ți este cea a programelor a șa-numite download managers , ca
exemple putând fi menț ionate utilitarele wget sau ProZilla din distribu țiile Linux ori
programele Download Express , FreshDownload, GetRight , LeechGet și Teleport disponibi-
le în Windows;
• descoperirea resurselor – probabil cea mai important ă aplicație a roboților Web este uti-
lizarea acestora la descoperirea resurselor. Cre șterea progresiv ă a volumului de in-
formații disponibile pe Web are drept consecin ță principală conceperea de aplica ții
pentru sumarizarea, indexarea și monitorizarea modifică rilor resurselor WWW.
129
Sabin Corneliu Buraga – Tehnologii Web
Astfel, fiecare motor de c ăutare, conț inând baze de date privind localizarea și tipul
de informa ții dorite de utilizatori, apeleaz ă la serviciul robo ților Web pentru desco-
perirea resurselor care înglobeaz ă aceste informa ții.
Un avantaj suplimentar al robo ților este cel dat de capacitatea acestora de a moni-
toriza schimbările survenite în cadrul unor pagi ni Web indicate de utilizatori;
• utilizări combinate – desigur, robo ții pot îndeplini sarcini multiple, ca de exemplu
descoperirea resurselor în paralel cu realizarea de statistici Web sau men ținerea in-
tegrității legă turilor și, concomitent, detectarea schimb ărilor survenite în cadrul do-
cumentelor Web.
E necesar să facem o serie de observa ții:
Un aspect important care trebuie luat în considera ție în exploatarea robo ților
Web este timpul de actualizare a bazelor de date ale motoarelor de c ăutare. Robo-
ții de căutare a informa țiilor sunt cei care vor trebui s ă decidă care informa ții sunt
importante pentru a fi transmise programelor de indexare.
Rularea în manier ă necontrolat ă a roboților Web de c ătre utilizatorii finali care
ar putea folosi opț iuni inadecvate sau ar rula mai multe instan țe de program poate
conduce la abuzuri nedorite asupra unui sit sau grupuri de situri Web.
Roboții Web, în special cei netestaț i insuficient, pot fi ineficien ți sau pot avea
vicii de arhitectur ă astfel încât să dăuneze traficului de informa ții, mai ales dac ă
sunt folosi ți de persoane neavizate ori de neprofesioni ști. Implement ări eronate
pot determina robo ții să intre în arii aproape infinite denumite găuri negre (atunci
când, de exemplu, un document are o leg ătură care se referă la el însu și, iar pro-
gramul nu detecteaz ă acest aspect). De asemenea, robo ții nu trebuie s ă acceseze
tipuri de date f ără relevanță, având dimensiuni considerabile ( e.g.: arhive, fi șiere
executabile, fi șiere multimedia etc.).
De cele mai multe ori, fiecare motor de c ăutare are implementat propriul
robot, sensibil la diverse situa ții care pot surveni pe Web. De exemplu, robo ții de
la Excite (Inktomi), Go (InfoSeek) și Lycos nu pot indexa paginile con ținând
cadre, iar cei de la FAST și Google au probleme cu h ărțile de imagini senzitive
(care pot îngloba leg ături spre alte documente).
Trebuie de menț ionat faptul că fiecare creator al unui robot Web trebuie s ă ofere in-
formații privind identificarea acestuia (nume, loca ție, grup de programatori etc.). De
exemplu, unii roboț i personali (utiliza ți de aplica țiile de oglindire a siturilor sau de motoa-
rele de căutare experimentale) pot fi recunoscu ți prin nume ca BackRub (folosit în perioa-
da pre-Google), WebMapper ori wget. De asemenea, robo ții principalelor motoare de c ăuta-
re actuale se identific ă prin Googlebot (de la Google), Infoseek sau Scooter (de la Altavista).
130
Sabin Corneliu Buraga – Tehnologii Web
Pentru evitarea accesului robo ților în zone Web lipsite de relevan ță, conținând date
temporare ori private, s-a adoptat un standard pentru excluderea robo ților. Acesta stipuleaz ă că
orice robot care acceseaz ă un anumit server Web va accesa în primul rând un fi șier text
denumit robots.txt . Acest fișier va trebui stocat în directorul r ădăcină al serverului,
specificând p ărțile din sit care vor fi evitate la parcurgerea automat ă (pentru evitarea g ău-
rilor negre sau din alte raț iuni).
Un exemplu de astfel de fi șier este dat mai jos:
# /robots.txt pentru http://www.infoiasi.ro
User-agent: * # to ți roboții
Disallow: /tmp/ # date temporare Disallow: /busaco/work/ # spa țiu privat
Anumiți roboți pot utiliza tag-uri specifice (ascunse) dintr-o pagin ă Web care să dicteze
un anumit comportament pentru acea pagin ă (așa cum se întâmpl ă în cazul programului
de oglindire Teleport).
Nu toate paginile vor avea aceeași importanță pentru robot, ț inându-se cont de mai
mulți factori. Se pot lua în calcul:
• compatibilitatea cu posibil ele cereri ale utilizatorilor,
• num ărul legă turilor care au, la rândul lor, leg ături spre pagina analizat ă pe
robot – gradul de „citare” a documentului,
• relevan ța conținutului paginii,
• num ărul de legă turi conț inute de pagină și metrica loca ției (o pagin ă din
domeniul .com se consider ă a fi mai importantă decât una a domeniului .za).
Importanța unui document Web depinde, a șadar, de contextul apari ției acestuia.
Managementul indexului
Component ă secundă a unui motor de c ăutare, indexul (catalogul ) este alcătuit dintr-o serie
de baze de date stocate de un server (modul ) de stocare , constituindu-se un depozit (distribu-
it) de date. Acest depozit va avea o capacitate considerabil ă, memorând documentele in-
dexate returnate de robotul asociat motorului de c ăutare.
Modulul de stocare realizeaz ă diverse activit ăți, cele mai importante fiind:
• inserarea datelor noi privitoare la paginile parcurse de robo ți,
• actualizarea con ținutului vechilor documente stocate,
• programarea diverselor cereri de accesare a informa țiilor despre o serie de docu-
mente.
De cele mai multe ori aceste date sunt comprimate.
131
Sabin Corneliu Buraga – Tehnologii Web
Modulul de indexare și meta-date este responsabil cu extragerea meta-datelor din paginile
colectate și cu indexarea atât a meta-datelor, cât și a documentelor (X)HTML. Pentru in-
dexarea con ținutului textual al documentelor, uzual vor fi luate în considera ție toate cu-
vintele, exceptând a șa-numitele cuvinte stop (cu o lungime mai mic ă sau egală cu trei carac-
tere și desemnând prepozi ții, conjunc ții sau interjec ții; de exemplu „ a”, „the”, „in” din
limba englez ă). Unele motoare de c ăutare ( e.g.: Google sau Lycos) vor contoriza și numă-
rul de apari ții ale celor mai frecvente cuvinte dintr-o pagin ă Web și vor realiza indec și
suplimentari și/sau vor stabili categoria în care va fi încadrat ă acea pagină .
Desigur, pot fi adoptate și alte tehnici (eventual, mai complexe).
Extragerea meta-datelor variaz ă în funcție de motorul de c ăutare. Cea mai popular ă
tehnică este cea a index ării documentelor pe baza cuvintelor-cheie furnizate fie explicit de
creatorul acestor documente, fie în urma unei catalog ări automate realizate de un robot.
Trebuie să menționăm aici și faptul c ă indexarea se poate realiza manual, de c ătre experți
umani – este cazul catalogului Open Directory .
Anumite motoare de c ăutare ( i.e. Altavista) permit înscrierea unei pagini în baza de da-
te, solicitând introducerea unor cuvinte-cheie pe baza c ărora să se efectueze opera țiunea
de indexare.
În activitatea de catalogare a informa țiilor, de multe ori intervine ierarhizarea datelor în
funcție de subiectul pe care-l trateaz ă, această clasificare conducând la apari ția serviciilor
director (de genul Yahoo! sau dmoz.org ), bazate pe generarea de taxonomii (arbori de con-
cepte).
De asemenea, pentru fiecare document se calculeaz ă numărul de legă turi care se refer ă
la o anumit ă pagină și numărul total de legă turi conț inute de acea pagin ă. Aceste valori
sunt denumite tehnic hit-uri.
Indecșii pot cuprinde indec și text obiș nuiți, dar și indec și ai meta-datelor extrase.
Meta-datele și indecșii se stocheaz ă pe dispozitive separate de cele ale depozitului de
date (de cele mai multe ori se utilizeaz ă un sistem de management al bazelor de date rela-
ționale).
Depozitul de documente indexate ofer ă trei moduri de acces:
• acces direct (random access) – se realizează pe baza identificatorului unic asociat fiec ărei
pagini indexate;
• acces bazat pe interog ări (query-based access ) – vor fi furnizate toate documentele care sa-
tisfac o anumit ă cerere. Cererea poate s ă se refere la diverse atribute ale me-
ta-datelor ( e.g.: autor, titlu, loca ție) sau la con ținutul textual al paginilor;
132
Sabin Corneliu Buraga – Tehnologii Web
• acces flux de date (streaming access ) – este folosit atunci când din depozitul de date se
extrage un grup de pagini pentru a fi trimis ca flux de date spre o anumit ă aplicație
(de exemplu, atunci când se reindexeaz ă o serie de pagini).
În cadrul depozitului de date este de dorit s ă se memoreze cea mai recent ă versiune a
paginilor traversate de robo ții Web. Trebuie avute în vedere aspecte importante precum
consistența indecș ilor și eliminarea paginilor vechi/inexistente pe Web . Astfel, corespunz ător fiecă-
rei pagini pot fi ata șate două valori numerice pentru a specifica timpul de viață permis și
respectiv pentru a contoriza acest timp. Timpul de via ță permis reprezint ă perioada de
stocare a unui document f ără a necesita actualizarea ori ștergerea sa din depozit. Contorul
este decrementat periodic pân ă când devine nul, caz în care robotul Web va trebui s ă
proceseze noi informaț ii referitoare la acea pagin ă. Desigur, fiecare motor de c ăutare va
adopta propria manier ă de stabilire a timpului de via ță. De asemenea, robo ții Web pot
avea proprii lor parametri pentru realizarea acestei actualiz ări regulate, ținând cont de di-
verse rațiuni, cum ar fi cele legate de congestia re țelelor.
Pentru asigurarea scalabilit ății, depozitul de date poate fi unul distribuit, constituindu-
se în acest scop o colec ție de noduri de stocare interconectate, controlul realizându-se prin
intermediul unui server de manageme nt al nodurilor. Acest server menț ine o tabel ă cu
starea fiec ărui nod de stocare: capacitatea total ă de memorare, spaț iul liber, nivelul frag-
mentării datelor, num ărul și tipul de acces ări, modul de operare a nodului etc. Pentru
sporirea eficienț ei, nodurile pot con ține pagini grupate pe dive rse criterii (cuvinte-cheie,
tematică, localizare etc.). Depozitul de date distribu it poate fi considerat ca fiind o singur ă
resursă de calcul, constituind un cluster sau un Grid.
Mecanismul de că utare și de evaluare
A treia component ă a unui motor este reprezentat ă de mecanismul de c ăutare și de evaluare a
paginilor Web furnizate utilizatorului în urma cererii acestuia, formulat ă prin intermediul
unei interfe țe puse la dispozi ție de motorul de c ăutare.
Interfața de căutare (denumit ă frecvent motor de interogare ) este o component ă importan-
tă a sistemului, oferind, în func ție de motor, posibilit ăți de formulare a cererilor prin in-
termediul diver șilor operatori logici, în limbaj natural, explorând ierarhii de domenii cata-
logate (directoare Web), stabilind localizarea paginilor etc.
Am discutat mai sus despre modul de formulare a interog ărilor adresate motorului de
căutare.
Procesul de evaluare a interog ării specificate de utilizator poate fi derulat conform ur-
mătoarelor etape:
1. analizarea cererii formulate de utilizator;
2. căutarea în indec șii corespunz ători termenilor r ămași după analiza cererii;
133
Sabin Corneliu Buraga – Tehnologii Web
3. scanarea tuturor documentelor ca re întrunesc întregul set de condiț ii de
căutare;
4. evaluarea gradului de relevan ță a fiecă rei pagini în func ție de cererea for-
mulată;
5. eliminarea duplicatelor și sortarea în ordinea relevan ței;
6. afișarea adreselor celor mai relevante N documente (eventual furnizându-
se și alte informa ții, precum lungimea documentului, formatul, limba, con-
textul apariț iei etc.).
Nu toate motoarele de c ăutare urmeaz ă toate fazele descrise mai sus. Unele dintre ele
nu realizeaz ă decât par țial sau chiar deloc eliminarea duplicatelor ( e.g.: Excite sau Lycos).
Alte motoare vor afi șa paginile g ăsite grupate pe termeni sau vor oferi leg ături către al-
te documente stocate pe acela și server Web.
Sistemul de evaluare depinde de motorul de c ăutare ales. Calculul relevan ței documen-
telor se poate baza pe:
tehnici de clasificare umană – resursele sunt clasificate manual, de c ătre experți (la
o astfel de abordare recurge, de exemplu, Open Directory);
informații privitoare la utilizarea unei resurse – în acest caz, sunt importante tim-
pul de viață al resursei și periodicitatea vizitei;
conectivitate – se are în vedere analizarea rela țiilor resursei considerate cu altele
(similare).
De exemplu, în cazul lui Google, sunt men ținute mai multe meta-date despre docu-
mentele indexate decât la alte motoare, ceea ce conduce la o precizie ridicat ă. Sunt me-
morate chiar și pozi ția în cadrul documentului, tipul de font și modul de scriere ale in-
formațiilor. În plus, rezultatele ob ținute în urma fiecărei interogă ri emise de utilizator
sunt salvate temporar, putând fi folosite la evaluarea unor cereri similare viitoare.
Relevanța paginii (page rank ) se calculeaz ă și pe baza corela țiilor dintre relevan ța calcu-
lată de motor și cea observat ă din interacț iunea cu utilizatorul (gradul de relevan ță a unei
resurse poate sc ădea, dacă se observ ă ca acea resurs ă nu este considerată spre vizitare de
către utilizator, de și e plasat ă printre primele). Motorul Google calculeaz ă acest page rank
în funcție de structura hipertext, o legă tură de la pagina A la pagina B reprezentând un
„vot” dat paginii B de c ătre A. Cu cât un sit e mai important, cu atât page rank -ul asociat
lui este mai mare.
Cititorii interesa ți de mai multe detalii referitoare la page rank pot consulta adresa
http://www.iprcom.com/papers/pagerank .
134
Sabin Corneliu Buraga – Tehnologii Web
3. Meta-c ăutătoare
Pentru a formula interog ări și a primi rezultate de la o multitudine de motoare de c ăutare,
utilizatorii au posibilitatea de a apela la serviciile oferite de un meta-că utător. Funcția prin-
cipală a acestuia este cea de a compila toate listele de pagini obț inute de la motoarele
obișnuite (interogate eventual în manier ă paralelă) și de a prezenta utilizatorului cele mai
relevante documente g ăsite. Deseori, un meta-c ăutător are implementat propriul sistem
de evaluare a relevan ței paginilor, în funcț ie de anumite criterii proprii sau formulate de
utilizator. Un exemplu este Mamma – www.mamma.com .
De asemenea, un meta-c ăutător poate oferi o vedere ierarhizat ă a paginilor g ăsite, de
genul structurii de directoare Web (ierarhii de termeni) pe care acestea le formeaz ă.
O serie de meta-c ăutătoare sunt direcț ionate spre domenii specifice, folosind bazele de
date furnizate de unul sau mai multe motoare de c ăutare de succes. Prin astfel de meta-
căutătoare, putem avea acces la diverse servicii specializate ( e.g., software, adrese po ștale,
documente multimedia etc.).
Structura unui meta-motor
Anatomia unui meta-motor de c ăutare este ilustrat ă în figura de mai jos.
Dispecerul de cereri poate diviza interog ările complexe date de utilizator în sub-cereri,
fiecare sub-cerere fiind expediat ă unui motor de c ăutare clasic. Nu toate meta-motoarele
de căutare trimit în manier ă concurent ă cereri motoarelor de c ăutare.
Monitorul de performanță supravegheaz ă starea fiec ărui motor de c ăutare. Atunci când
unul dintre motoare devine neopera țional sau inaccesibil din ra țiuni legate de re țea, se
poate decide în mod automat ca respectiva cerere s ă fie dată spre prelucrare altui motor.
De asemenea, monitorul de performan ță are ca misiune și primirea listelor de adrese ale
paginilor g ăsite.
Modulul responsabil de interfa ța cu utilizatorul va furniza un formular electronic pen-
tru a fi completat cu interogarea dorit ă. După primirea rezultatelor de la motoarele de
căutare, listele cu URI-uri vor fi compilate, eliminându-se informa țiile redundante și cele
contradictorii. Deoarece fiecare motor de că utare va returna o list ă de pagini într-un for-
mat propriu, meta-motorul de c ăutare va realiza și o convertire la un format comun care
va fi prezentat clientului.
Unele meta-motoare de c ăutare pot oferi informaț ii privind relevan ța resurselor c ăutate
sau legăturile dintre ele – este cazul meta-motorului Kartoo, disponibil la adresa
www.kartoo.com .
135
Sabin Corneliu Buraga – Tehnologii Web
Structura general ă a unui meta-motor de că utare
136
Sabin Corneliu Buraga – Tehnologii Web
4. Alte mijloace de reg ăsire a informaț iilor
În cadrul acestei sec țiuni, vom prezenta o serie de detalii interesante privitoare la alte sur-
se de informare disponibile pe Web: forumurile, siturile de tip wiki, blog-urile și portalurile
Web – toate, componente ale Web-ul social (denumit și „Web 2.0”), ală turi de alte tehno-
logii, paradigme și stiluri arhitecturale de aplica ții Web.
Forumurile Web
O primă soluție este oferit ă de forumurile on-line , scopul acestora fiind acela de a pune la
dispoziție un cadru Web de realizare a unor discu ții (uzual, în regim asincron), pe diferite
teme.
O platformă de management al forumurilor poate, eventual, oferi suport pentru a
structura firele ( thread -urile) subiectelor abordate, în vederea reg ăsirii facile a mesajelor
dorite, în func ție de tematic ă. De asemenea, un astfel de sistem poate permite, printre
altele: accesul autorizat sau anonim, realizarea de sondaje ( poll-uri), notificarea automat ă a
utilizatorilor asupra apari ției unui ră spuns la un mesaj, c ăutarea pe diverse criterii, redac-
tarea facilă a mesajelor prin folosirea marcajelor (X)HTML etc.
Există diverse aplica ții care ofer ă suport pentru crearea și întreținerea de forumuri, din-
tre care se pot menț iona phpBB , un popular instrument open-source , și JForum.
Siturile colaborative de tip wiki
Un wiki reprezint ă un sit Web care permite utilizatorilor s ă adauge diverse tipuri de con-
ținuturi, sem ănând în acest sens cu forumurile Web, dând în plus posibilitatea vizitatori-
lor să editeze acel con ținut.
Termenul wiki se referă și la software-ul colaborativ utilizat pentru crearea acestor ti-
puri de situri. Denumirea provine din limba hawaian ă (în aceast ă limbă , „wiki wiki” în-
seamnă „foarte rapid”).
Primul sit de tip wiki s-a numit WikiWikiWeb și a fost folosit începând cu anul 1995 în
cadrul comunit ății speciali știlor în proiectare software. P ărintele (creatorul) lui este Ward
Cunningham. Pe parcursul anilor, diverse alte comunit ăți virtuale au dezvoltat sisteme
wiki, în prezent considerându-se c ă Wikipedia (lansat în 2001) este situl wiki cel mai cu-
prinzător, reprezentând o veritabilă sursă de cunoaștere.
137
Sabin Corneliu Buraga – Tehnologii Web
Varianta în limba român ă a enciclopediei Wikipedia
Caracteristica principal ă a unui sit wiki este aceea c ă permite ca documentele Web să
poată fi redactate u șor în manier ă colectivă folosind un limbaj de marcare. O pagin ă fă-
când parte dintr-un wiki este referit ă ca fiind o „pagin ă wiki”, iar o colec ție de pagini –
uzual, puternic interconectate prin intermediul hiperlegă turilor – se nume ște un „ wiki”.
Crearea și actualizarea documentele sunt facil de realizat, în general orice modificare fi-
ind reflectat ă instantaneu în cadrul sitului (nu se opereaz ă o „cenzur ă” prealabilă , iar utili-
zatorii nu trebuie s ă fie autentificaț i pentru a efectua schimbă ri). Marcarea paginilor wiki
recurge la un limbaj de adnotare simplu, dar unele servere wiki oferă facilități suplimenta-
re de editare. Leg ăturile hipertext spre alte pagini wiki sunt marcate prin intermediul unor
simboluri speciale (de genul parantezelor acolade sau a caracterului „/”).
Pentru controlul istoricului modific ărilor, exist ă două funcții importante: istoricul revi-
ziilor ( revision history ) și managementul diferen țelor de con ținut ( diff feature ). Persoana care
menține wiki-ul poate folosi astfel de instrumente pentru a elimina unele schimb ări efec-
tuate de vizitatori. În vederea prevenirii vandalismului, unele sisteme wiki limitează drep-
138
Sabin Corneliu Buraga – Tehnologii Web
turile de editare ori impun autentificarea utilizatorilor care inten ționează să opereze modi-
ficări de conț inut.
Pentru a dezvolta un sit wiki, se pot folosi aplica ții precum MediaWiki , MoinMoin ,
TWiki , UseMod sau XWiki, disponibile în regim open-source . Serverul XWiki este folosit ca
platformă pentru situl Facult ății de Informatic ă a Universității „A. I. Cuza” din Ia și.
Ca și în cazul altor sisteme de management al con ținutului, criteriile principale care
trebuie avute în vedere pe ntru a decide ce sistem wiki este cel optim sunt gradul de popu-
laritate al software-ului, facilit ățile oferite pentru editare, managementul utilizatorilor, fa-
cilitățile groupware (forum, galerie de fotografii, sistem intern de mesagerie etc.), controlul
accesului, abilitatea de import/ export a altor tipuri de con ținut ( e.g.: documente HTML,
fișiere PDF, documente Word), suportul multilingv, extensibilitatea, portabilitatea și
scalabilitatea. Pentru mai multe detalii, pute ți consulta și lucrarea S. Buraga (coord.), Ten-
dințe actuale în proiectarea și dezvoltarea aplica țiilor Web , Matrix Rom, Bucure ști, 2006.
Weblog -urile
Un Weblog (sau blog, pe scurt) reprezintă o pagină Web care conț ine diverse fragmente de
informație puse la dispoziț ie de către o persoan ă posibililor vizitatori. Termenul provine
de la cuvintele „Web” (WWW) și „log” (jurnal) și a fost introdus în premier ă de Jorn
Barger în decembrie 1997.
La adresa www.usemod.com/cgi-bin/mb.pl?WebLog sunt disponibile informa ții
privitoare la istoricul și adresele unor situri referitoare la blog-uri.
Un blog poate fi considerat un mijloc de comunicare inter-personală , natura sa
putând varia de la o form ă de jurnal on-line până la depozit de informa ții privitoare
la un domeniu (tehnic sau nu).
Un astfel de blog este redactat (între ținut) fie de o singur ă persoană, fie de un grup. Lu-
ând în consideraț ie tematica abordat ă, un blog poate fi încadrat în urmă toarele categorii
principale: personal, comunitar, oferind nout ăți, specializat, colaborativ, politic, corpora-
tist.
După Greg Hard, „ blogging -ul nu reprezint ă doar un blog. Este o manier ă de partajare la
nivelul întregii lumi a opiniilor și gândurilor personale. Dac ă punem la dispozi ție informa-
ții de interes, atunci trebuie s ă partajăm hiper-leg ături și să facem disponibile comentariile
din cadrul altor blog-uri. Legă turile hipertext reprezint ă punctul forte al Web-ului, iar în
cazul Weblogging -ului ele sunt elementul cheie.”
Din punctul de vedere al strategiei realiz ării afacerilor electronice sau a instituirii unei
comunități on-line , „blogging- ul este una dintre cele mai rapide c ăi de actualizare a sitului
propriu” (Eric Dolecki).
139
Sabin Corneliu Buraga – Tehnologii Web
Unele blog-uri devin depozitare a unor informa ții științifice de excepț ie sau sunt folosite
pentru organizarea de concursuri la nivel regional, na țional sau chiar mondial – un astfel
de exemplu este cel al competi ției Imagine Cup inițiate în lumea întreag ă de către corpora-
ția Microsoft, folosind tehnologiile Web proprii în cadrul sitului TheSpoke .
La fel, în domeniul e-learning , siturile dedicate unor discipline pot avea asociate astfel de
blog-uri, folosite atât la prezentarea unor informa ții suplimentare referitoare la anumite
subiecte ale materiei predate la curs și/sau laborator, cât și ca instrumente de comunicare
– de cele mai multe ori, informală – dintre studenț i și cadrele didactice (titularul discipli-
nei, persoanele implicate în predarea seminarului sau laboratorului etc.).
De asemenea, un alt context de utilizare a blog-urilor este cel reprezentat de intranetul
întreprinderilor virtuale, un blog putând deveni un instrument indispensabil de inter-
comunicare la nivel de echipe de lucru în cadrul unui proiect. Din aceast ă perspectivă ,
blog-ul poate fi o component ă important ă a aplicațiilor de tip groupware (teamware ).
Conținutul unui blog nu trebuie s ă fie exclusiv textual, exis tând blog-uri care ofer ă pre-
zentări multimedia (audio – de succes sunt MP3 blog-urile, fotografii, video – denumirea
acestei categorii fiind videoblog sau, pe scurt, vlog).
Anatomia unui blog este relativ simpl ă, structura sa incluzând:
un titlu (eventual un subtitlu – acest subtitlu poate fi considerat ca fiind un slogan
asociat blog-ului),
o listă a mesajelor (intr ărilor) curente, redactate de autorul/autorii blog-ului ori de
terți vizitatori,
o listă de legă turi spre alte situri sau blog-uri de interes (a șa-numitul blogroll ),
eventual, diverse alte componente (sigl ă, adrese spre liste de discu ții, statistici etc.).
Unele subiecte interesante pot fi discutate separat, utilizatorii având posibilitatea – via
unor formulare Web – s ă-și introduc ă propriile opinii sau sugestii în cadrul blog-ului. Une-
le blog-uri oferă facilități de inserare a emoticon -urilor sau de detectare automat ă a adreselor
Web introduse. Desigur, discu țiile pot fi monitorizate de proprietarul blog-ului, iar unele
mesaje necorespunz ătoare pot fi eliminate complet sau par țial de către acesta.
Pentru a putea referi un anumit mesaj (care poate disp ărea de pe prima pagin ă a blog-
ului, atunci când dinamica sa este mare), utilizatorii pot s ă se foloseasc ă de așa-numita
legătură permanent ă (permanent link ) asociată acestuia. Astfel, un mesaj poate fi accesat fie
direct, fie parcurgând lista mesajelor (numite și post-uri) existente.
O componentă opțională o reprezint ă motorul de c ăutare intern ă, vizitatorii având po-
sibilitatea să regăsească, pe baza unor criterii ( e.g.: cuvinte-cheie incluse în subiect, data
redactării, autor etc.), informa țiile cuprinse în lista mesajelor care compun blog-uri.
140
Sabin Corneliu Buraga – Tehnologii Web
De asemenea, cele mai multe sisteme de management al Weblog -urilor dau posibilitatea
programelor (robo ți sau agen ți Web) să indexeze ori s ă manipuleze con ținutul mesajelor
via fișierele RSS ( Really Simple Syndication ) sau Atom asociate. Formatul RSS/Atom permite
calculatoarelor s ă interschimbe informaț ii privitoare la conț inutul siturilor Web (în acest
caz, al blog -urilor). Fiind bazat pe meta-limbajul XML, un document RSS/Atom este u șor
de procesat sau de creat, existând diverse instrumente – numite agregatori de con ținut – care
extrag, sumarizeaz ă și stocheaz ă datele RSS/Atom.
Disponibile de cele mai multe ori în regim open-source , pot fi folosite o serie de instru-
mente de administrare comod ă a blog-urilor (atât din punct de vedere al con ținutului pro-
priu-zis, cât și al configur ării și modific ării preferin țelor referitoare la interfa ța Web), pre-
cum Blogger , Blosxom , Blojxom, LiveJournal , Manila , MovableType sau WordPress. Aceste aplica-
ții se încadreaz ă în categoria sistemelor de management al conț inutului ( CMS – Content
Management System).
Portalurile Web
Web-ul reprezint ă un mediu de partajare a diverselor informa ții, specifice unui domeniu
de interes: afaceri, comunit ăți umane, divertisment etc. Unul dintre mijloacele de punere
la dispozi ție a informa țiilor și serviciilor este portalul Web. Dezvoltarea portalurilor este
susținută de faptul c ă organizațiile trebuie și pot să ofere informa țiile și serviciile bazate
pe Web în formatul necesar utilizator ului. Aceasta este o schimbare important ă, în primul
rând deoarece majoritatea organiza țiilor, inclusiv universit ățile, și–au organizat informa ția
rareori în alt format decât cel necesar membrilor comunit ăților. Acest nou și interesant
aspect al managementului Web oferit de portaluri se bazeaz ă pe ideea cre ării și adminis-
trării sistemelor informa ționale al c ăror scop de baz ă este men ținerea rela țiilor pozitive
dintre susținătorii unei institu ții și acea institu ție.
Portalurile Web pot pune, în plus, la dispozi ție și alte servicii, precum accesarea unui
cont de poșt ă electronic ă, cursul valutar, starea meteo, înscrierea la liste de discu ții și alte-
le. Astfel, un portal poate fi privit drept integrator de conț inut, fără a oferi îns ă doar o
colecție nestructurat ă de legături spre alte situri.
Principalele categorii de portaluri sunt:
portalurile generale – destinate unei largi categorii de utilizatori;
portalurile academice – folosite în e-science , oferind acces la resursele distribuite (in-
formații, aplicaț ii, servicii de cercetare etc.) ale unei re țele de excelență într-un
anumit domeniu;
portalurile educaționale – utilizate în e-learning , pentru a pune la dispoziț ie diverșilor
cursanți materiale cu caracter educa țional;
portalurile de întreprindere – disponibile în intranet-ul sau extranet-ul unei organizaț ii
aliniate problematicilor e-business .
141
Sabin Corneliu Buraga – Tehnologii Web
Ca exemple de portaluri generale putem men ționa Yahoo! sau MSN (Microsoft Network),
care oferă – printr-o interfa ță unică – acces la mai multe categorii de servicii standard
(poștă electronic ă, știri, starea vremii, cota țiile bursiere etc.). Un exemplu autohton de
portal este reprezentat de home.ro. Unele aplicaț ii de tip portal dau posibilitatea accesului
la informaț ii și servicii via dispozitive mobile, de cele mai multe ori wireless .
Pentru facilitarea colabor ării on-line dintre cercet ători, se poate recurge la func ționalită-
țile unui portal academic. De cele mai multe, un astfel de portal reprezint ă interfața cu o
infrastructur ă de calcul destinat ă unor proiecte științifice de anvergur ă, desfășurate la ni-
vel de stat, continental sau chiar mondial, gra ție tehnologiilor Grid. Portalul poate oferi
suport pentru că utarea și regăsirea informaț iilor, indiferent de localizarea lor fizic ă, dar
poate permite și executarea de activit ăți (task-uri) pe mai multe mașini, privite ca un sis-
tem unic de calcul. Ca exemple de astfel de aplica ții putem enumera Large Hadron Collider
Computing Grid funcționând la CERN, CrossGrid utilizat în chirurgia vascular ă virtuală ori
myGrid în domeniul bioinformaticii.
Drept exemple de aplica ții pentru implementarea portalurilor putem men ționa BEA
Secure Portal , eZ Publish , IBM Enterprise Information Portal , Microsoft SharePoint , Oracle Portal
sau PHP Nuke . Tehnologiile Java pun la dispozi ție componente de tip portal numite
portlet-uri.
142
Sabin Corneliu Buraga – Tehnologii Web
143 EExxeerrcciițțiiii șșii tteemmee pprrooppuussee
„Înainte să vă supărați pe cel care v ă pune la treabă , amintiți-vă că fără presiune nu se formeaz ă diamantele.”
Mary Case
1. Ce deosebire este între un proxy și un server Web?
2. Precizaț i care dintre urm ătoarele URI-uri sunt corecte:
telnet:fenrir.infoiasi.com:8080
mailto:w3.com@w3.org http://students.infoiasi.ro/~busaco/www/ http://MyDocuments.org/scrisoare.cgi?query=Listing ftp;//ftp.uaic.ro/Readme.tex
3. Fie formularul stocat intr-o pagina de pe serverul www.neu.ro :
<form nethod="POST" action="/cgi-bin/add.cgi"> <input name="Un nume" style="width: 300px" value="dati un nume" /> <input type="hidden" name="Control" value="W " />
<input type="submit" value="Trimite" style="color: blue" />
</form>
În urma ap ăsării butonului de tip submit , fără ca utilizatorul s ă modifice formularul, ce
URI va primi serverul Web? Ce metod ă de transfer HTTP a fost folosit ă?
4. Se consider ă programul de mai jos:
<?php class Animal { var $nume="C", $ani, $kg="0";
function Animal($n="rocodilescu",
$a="33", $k="333") { $this->nume.=$n; $this->ani=$a; $this->kg=($k || $this->nume)? $k+$this->kg++:$k+$ani; }
function seteazaAni($a="3") {
$this->ani .= $a.$a; } function furnizeazaAni() {
Sabin Corneliu Buraga – Tehnologii Web
return $this->ani;
} }
$m = new Animal(); #m->seteazaAni($m->kg-$m->kg[1]); $t = new Animal("oarne", $m->furnizeazaAni());
$ani = $t->furnizeazaAni()-$m->ani+$ani."0";
?>
Ce tip și valoare vor avea variabilele $ani , $m->kg , $t->kg și $kg? Argumenta ți.
5. Fie urmă torul script PHP:
<?php class S { var $s1 = "WEB";
var $s2 = "wEb";
function S($s1 = "s1") { $m = "S" . func_num_args(); $this->$m($s1); }
function S0() {
echo $this->s1; } function S1($s1) { echo $s1?"->$s2":$this->s2;
}
function S2($s1) { echo "$this->s2"; } }
$s = new S($s1);
echo $s2; $s = new S(); ?>
Precizaț i ce va afi șa navigatorul Web în urma apel ării acestui script (presupunem c ă
motorul PHP este opera țional).
6. Să se marcheze în XML datele privitoare la medicamentele dintr-o farmacie: nu-
mele medicamentului, produc ătorul, furnizorul, cantitatea, pre țul, indicațiile și contra-
indicaț iile, valoarea livr ărilor dintr-o lună etc.
7. Să se imagineze un set de documente XML care sa stocheze informaț ii relative la
mersul trenurilor (orar, sta ții intermediare, tipuri de trenuri) și la rezervarea locurilor si
eliberarea de bilete la anumite trenuri. Se vor specifica spa ții de nume și maniere de vali-
dare (DTD-uri și/sau scheme XML) pentru fiecare document în parte.
8. Să se organizeze în format XML datele referitoare la proprietățile imobiliare ale
unei persoane, în vederea realiz ării ulterioare de programe pentru determinarea tuturor
imobilelor unei persoane, listarea persoanelor dintr-un imobil, situa ția imobilelor dintr-un
cartier etc.
144
Sabin Corneliu Buraga – Tehnologii Web
9. Să se modeleze ca documente XML informa țiile privitoare la cursele aeriene fur-
nizate de o anumit ă companie și apoi să se realizeze o aplica ție Web care s ă le proceseze.
Eventual, se vor implementa și diverse servicii Web pentru a furniza detalii referitoare la
cursele disponibile pe un anumit traseu ori la o dat ă calendaristic ă.
10. Să se stocheze ca document(e) XML informa țiile incluse de o agend ă de birou,
permițându-se realizarea de adnot ări pe zile, s ăptămâni, luni, includerea de leg ături Web,
programarea de întâlniri etc. S ă se implementeze aplica ția Web care să proceseze aceste
informații, folosindu-se atât modelul DOM, cât și interfața SAX.
11. Să se conceapă , în orice limbaj de programare preferat, un script CGI care s ă fie
utilizat pentru evaluarea expresiilor matematice cu paranteze.
12. Să se realizeze o aplica ție (sit) Web pentru vizualizarea și trimiterea de ilustrate
electronice, pe diverse teme (peisaje, ora șe celebre, figuri de personalit ăți, opere de art ă
etc.). Informa țiile vor fi stocate exclusiv în documente XML.
13. Să se realizeze un studiu comparativ al manierelor de procesare (SAX și DOM) a
aceluiași document XML, pe mai multe platforme ( e.g., Linux și Windows), recurgându-se
la mai multe limbaje de programare (de exemplu, Perl și PHP). O posibil ă statistică va
putea lua în calcul numă rarea elementelor unui document XML având structura:
<doc><element atribut=”valoare” /></doc> , unde <element> va putea apărea
de zece mii, zece sute de mii și, respectiv, zece milioane de ori.
14. Să se implementeze o aplica ție Web pentru stocarea în manier ă distribuit ă a dife-
ritelor tipuri de teste de cuno ștințe care pot fi folosite în regim de testare sau auto-testare
la diverse discipline. Pe baza autentific ării, titularii de curs vor putea gestiona colec ția de
teste de la discipline diferite (accesare întrebări și răspunsuri, realizare de teste prin alege-
rea întreb ărilor după diverse criterii sau aleatoriu etc.). Studen ții vor putea avea acces la
module de auto-testare pe diverse domenii, contra-cronometru sau nu ( demo-uri ale unor
teste reale în regim de examen). Testele vor putea fi de mai multe tipuri ( single/multiple
choice, cu diferite modalit ăți de acordare a punctajelor, cu întreb ări dependente una de cea-
laltă etc.), bazate sau nu pe cronometrare. Aplica ția va putea oferi rapoarte privitoare la
prestaț ia unui anumit student la o disciplină , eventual diferite statistici – numerice și gra-
fice – referitoare la gradul de cuno ștințe ale studen ților (e.g., numărul răspunsurilor erona-
te, timpul realizat, întreb ările la care n-a r ăspuns nici unul dintre studen ții testați etc.).
Se vor oferi posibilit ăți de căutare de teste pe dive rse criterii – domeniu de interes (i.e.
limbajul PHP), cuvinte cheie ( e.g., moștenire multipl ă), grad de dificultate etc. – și de res-
tricționare a accesului (de exemplu, doar studen ții înscriși la cursul de programare Web
vor beneficia de (auto-)testare la acest obiect).
Toate informaț iile vor fi stocate în cadrul unor documente XML.
145
Sabin Corneliu Buraga – Tehnologii Web
15. Să se creeze o aplica ție Web care s ă ofere accesul la conț inut documentar, struc-
turat pe teme și sub-teme de interes (e.g., Programare :: Limbaje :: Scripting :: Perl ori IA ::
Recunoaștere forme :: Re țele neurale :: Auto-învăț are). Se va avea în vedere faptul c ă documenta-
țiile:
pot fi stocate în diverse formate (proprietare sau nu), în manier ă distribuită (pe
mai multe ma șini),
vor putea fi accesibile în limbi multiple ( e.g.: engleză și/sau română ),
vor putea fi de un anumit tip (carte, manual de referin ță, specifica ție, tutorial
etc.), într-un anumit stadiu (ciorn ă, propus pentru standardizare, final etc.).
Pentru fiecare resurs ă, se vor re ține cel puț in următoarele date:
autor(i);
titlu;
tip (carte, articol, raport tehnic, referat etc.);
editor ( e.g., Springer Verlag, Prentice-Hall,…);
an al apari ției;
loc al apari ției;
rezumat;
cuvinte cheie (i.e. Web, XML, c ăutare structurat ă, DOM);
legătură spre documentul complet (dac ă există) sau spre o oglindire local ă.
Acest sit va putea oferi statistici privind cele mai accesate documente, localizarea clien-
ților și va oferi posibilitatea de a fi ad ministrat via Web, de la distan ță. Soluțiile de stocare
a datelor vor recurge la tehnologiile XML.
146
Sabin Corneliu Buraga – Tehnologii Web
147 RReessuurrssee bbiibblliiooggrraaffiiccee
„Este bine s ă existe un sfâr șit în fiecare c ălătorie, dar în final cea mai important ă este chiar c ălătoria.”
Ursula K. LeGuin
Alboaie, L, S. Buraga, Servicii Web , Polirom, Ia și, 2006:
http://www.infoiasi.ro/~busaco/books/ws/
Anghel, T., Programarea în PHP. Ghid practic , Polirom, Ia și, 2005
Apparao, V. et al. (eds.), Document Object Model (DOM) Level 1 Specification , W3C Recommendation,
Boston, 1998: http://www.w3.org/TR/REC-DOM-Level-1
Berlung, A. et al. (eds.), XML Path Language (XPath) 2.0 , W3C Working Draft, Boston, 2005:
http://www.w3.org/TR/xpath20/
Berners-Lee, T., Fielding, R., Masinter, L., Uniform Resource Identifiers (URI): Generic Syntax , RFC
2396, Internet Engineering Task Force (IET F), 2004: http://www.ietf.org/rfc/rfc2396.txt
Booth, D., Liu, C. (eds.), Web Services Description Language (WSDL) Version 2.0 Part 0: Primer , W3C
Candidate Recommendation, Boston, 2006: http://www.w3.org/TR/wsdl20-primer
Bray, T. et al. (eds.), Extensible Markup Language 1.0 (4th Edition) , W3C Recommendation, Boston,
2006: http://www.w3.org/TR/xml
Bray, T. et al. (eds.), Namespaces in XML (2nd Edition) , W3C Recommendation, Boston, 2006:
http://www.w3.org/TR/REC-xml-names
Buraga, S., Tehnologii XML , Polirom, Ia și, 2006:
http://www.infoiasi.ro/~busaco/books/xml/
Buraga, S., Proiectarea siturilor Web (ediția a doua), Polirom, Ia și, 2005:
http://www.infoiasi.ro/~design/
Buraga, S., Semantic Web , Matrix Rom, Bucure ști, 2004: http://www.infoiasi.ro/~sweb/
Buraga, S. et al., Programare Web în bash și Perl, Polirom, Ia și, 2002:
http://www.infoiasi.ro/~cgi/
Buraga, S. (coord.), Tendințe actuale în proiectarea și dezvoltarea aplicaț iilor Web , Matrix Rom, Bucu-
rești, 2006: http://www.infoiasi.r o/~busaco/books/nw05/
Buraga, S. (coord.), Situri Web la cheie. Solu ții profesionale de implementare , Polirom, Ia și, 2004:
http://www.infoiasi.ro/~ busaco/books/webapps/
Buraga, S. (coord.), Aplicații Web la cheie , Polirom, Ia și, 2003:
http://www.infoiasi.ro/~phpapps/
Sabin Corneliu Buraga – Tehnologii Web
Cabrera, L.F., Kurt, C., Web Services Architecture and Its Specifications , Microsoft Press, 2005
Clark, J. (ed.), XSL Transformations (XSLT) – Version 1.0 , W3C Recommendation, Boston, 1999:
http://www.w3.org/TR/xslt
Clark, J., DeRose, S. (eds.), XML Path Language (XPath) Version 1.0 , W3C Recommendation, Bos-
ton, 1999: http://www.w3.org/TR/xpath
Daum, B., Merten, U., System Architecture with XML , Elsevier Science, 2003
Erl, T., Service-Oriented Architecture: Concep ts, Technology, and Design, Prentice Hall PTR,
2005
Fallside, D., Walmsley, P. (eds.), XML Schema Part 0: Primer (Second Edition), W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/xmlschema-0/
Freed, N., Borenstein, N., Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet
Message Bodies , RFC 2045, Internet Engineer ing Task Force (IETF), 1996:
http://www.ietf.org/rfc/rfc2045.txt
Freed, N., Borenstein, N., Multipurpose Internet Mail Extensio ns (MIME) Part Two: Media Types , RFC
2046, Internet Engineering Task Force (IETF), 1996: http://www.ietf.org/rfc/rfc2046.txt
Geroimenko, V., Dictionary of XML Technologies and the Semantic Web , Springer-Verlag, 2004
Gettys, J. et al., Hypertext Transfer Protocol – HTTP/1.1 , RFC 2616, Internet Engineering Task
Force (IETF), 1999: http://www.ietf.org/rfc/rfc2616.txt
Guruge, A., Web Services: Theory and Practice , Digital Press, 2004
Jacobs, I., Walsh, N., Architecture of the World Wide Web, Volume One , W3C Recommendation, Bos-
ton, 2004: http://www.w3.org/TR/webarch/
Le Hors, A. et al. (eds.), Document Object Model (DOM) Level 2 Core Specification , W3C
Recommendation, Boston, 2000: http://www.w3.org/TR/DOM-Level-2-Core
Le Hors, A. et al. (eds.), Document Object Model (DOM) Level 3 Core Specification , W3C
Recommendation, Boston, 2004: http://www.w3.org/TR/DOM-Level-3-Core
Mitra, N. (ed.), SOAP Version 1.2 Part 0: Primer , W3C Recommendation, Boston, 2003:
http://www.w3.org/TR/soap12-part0/
Shiflett, C., HTTP Developer’s Handbook , Sams Publishing, 2003
Tanasă, Ș., Olaru, C., Dezvoltarea aplica țiilor Web folosind Java , Polirom, 2005
Weerawarana, S. et al., Web Services Platform Architecture , Prentice Hall PTR, 2005
* * *, Apache2Triad: http://apache2triad.sourceforge.net/
* * *, Apache XML : http://xml.apache.org/
* * *, Café con Lèche : http://www.cafeconleche.org/
* * *, Exemple privitoare la limbajele XML : http://www.xmlpitstop.com/
* * *, Expat : http://expat.sourceforge.net/
* * *, Funda ția Mozilla : http://www.mozilla.org/
* * *, IBM’s DeveloperWorks Web Services :
http://www-136.ibm.com/deve loperworks/webservices
* * *, libxml : http://xmlsoft.org/
* * *, MSDN (Microsoft Developer Network): http://msdn.microsoft.com/
* * *, Organizaț ia OASIS (Organization for the Advancement of Structured Information Standards) :
* * *, O’Reilly OnLAMP: http://www.onlamp.com/
* * *, Resurse privind programare pe partea de server : http://www.devshed. com/Server_Side/
* * *, SAX (Simple API for XML) : http://www.saxproject.org/
148
Sabin Corneliu Buraga – Tehnologii Web
* * *, Situl dedicat dezvoltatorilor MySQL: http://dev.mysql.com/
* * *, Situl oficial PHP: http://www.php.net/
* * *, Sun’s XML Technologies : http://java.sun.com/xml
* * *, The Open Sourcery : http://theopensourcery.com/
* * *, UDDI (Universal Description, Discovery, and Integration): http://www.uddi.org/
* * *, Web Services Activity : http://www.w3.org/2002/ws/
* * *, World-Wide Web Consortium , Boston, 2007: http://www.w3.org/
* * *, XML.com : http://www.xml.com/
* * *, Yahoo! Developer Network : http://developer.yahoo.net/
* * *, ZVON: http://www.zvon.org/
149
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Sabin Corneliu Buraga – Tehnologii Web Autorul acestei lucr ări – Dr. Sabin Corneliu Buraga – este cadru didactic la Facultatea de Informatic ă a… [631063] (ID: 631063)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
