Sunteți pe pagina 1din 290

Introducere1

n volumul intitulat Ghidul managerului pentru noile tehnologii informatice i


de comunicaie2, elaborat de aceiai autori, care a aprut n editura Lucman n
noiembrie 2002, am vizat n partea a cincea doar o prezentare frugal a
tehnologiei ASP. Am acordat mai mult atenie XML.
Aici vom avea n vedere aplicaii elaborate cu trei tehnologii: JSP, ASP i PHP,
deci ne vom ntlni i cu limbajele respective.
Ideea c un sit comercial poate fi realizat doar cu ajutorul pachetului Microsoft
FrontPage este greit din start. Un sit comercial este mult mai complex dect un sit
obinuit. i el se bazeaz pe unul dintre limbajele de tip script, deci pentru scenarii:
Java, JavaScript, VBScript, JScript, PHP sau PERL (Practical Extraction Report
Language), PerlScript.
PHP i PERL merg pe filozofia Common Gateway Interface. Acest CGI se bazeaz pe
un formular completat de vizitator dar atenie, pentru fiecare client Web care accede un
sit elaborat cu PHP sau PERL, se ncarc n memoria serverului att programele ct i
cte o copie a interpretorului. Este o risip de memorie!
ASP i JSP au schimbat puin filozofia CGI. Avem tot timpul s v lmurim cum!
Stimate manager, vei fi nevoit s citii aceast carte sau s apelai la un cunosctor al
unuia din aceste limbaje. Oricum, v mai trebuie ceva bani pentru achiziionarea unui
mediu de dezvoltare serios (vezi mai jos, medii IDE) i pentru un pachet software pentru
administrarea bazelor de date.
Java i VBScript sunt limbajele de baz ale tehnologiilor JSP, Java Server Pages i
respectiv ASP, Active Server Pages.
Medii IDE pentru proiectarea siturilor comerciale
Mai oportun este ca situl comercial s se realizeze cu ajutorul unui mediu de dezvoltare
aa-zisul IDE, Integrated Development Environment. Un astfel de mediu are

1
Cursul Aplicaii de comer electronic i tehnologii predat de profesorul dr. Somnea Dan, la
facultatea R.E.I. an II, din anul 2002/2003 n locul cursului de Internet.

2
Putei comanda la editura Lucman (tel./fax: 021-223-7755, sau comenzi@lucman.ro) un exemplar.
Editura are depozitul la adresa: Bucureti, str. Sevastopol nr.24. Mai sunt cca- 30 exemplare. Dac
lucrarea s-a epuizat, suntei trecut n lista de ateptare. Rotativa se pornete dac se adun cel puin
300 comenzi ferme. Pn acum s-au scos dou tiraje, unul de 250 (sept. 2002) i al doilea de 330
exemplare (nov. 2002). Urmeaz ca n luna sept. 2003 s se scoat un numr de cca. 350 exemplare,
plus cte comenzi ar apare ntre timp. Exemplarele au fost destinate n principal formelor de
nvmnt de zi i distan, pentru facultatea R.E.I. Au fost i cumprtori izolai care au ... apucat
cartea, pentru c tiau de aceti autori de la editura tehnic, cnd publicau acolo.
instrumente pentru crearea unui proiect, scrierea programelor, depanarea lor (punerea la
punct) . Programele sunt componentele sitului.
Exist medii care sunt orientate spre suprafee grafice. Iat cteva denumiri: Allaire
JRun Studio, Apache Tomcat Servlet and JavaServer Pages Development with
VisualAge for Java, Borland /Inprise JBuilder, Microsoft Visual InterDev, seria de
servere .net Microsoft Entreprise (vezi mai jos), Macromedia Dreamweaver MX etc.
Containere pentru servleturi/pagini JSP alias servere de aplicaii Web
Ca s dezvoltai i s testai un sit comercial trebuie i o reea de PC-uri pentru ncercare.
Ultima condiie este extrem de greu de simulat. De aceea s-au scris diverse simulatoare
de ncercare pentru a afla cum se comport situl la diverse trafice de ncrcare i condiii
de reea.
Pentru producia de situri comerciale dinspre platforma JSP sunt containerele pentru
servleturi i pagini JSP: Allaire JRun, Apache Tomcat, BEA Weblogic Entreprise
Server, iPlanet Web Server Entreprise Edition, Sun NetObject, IBM WebSphere
Application Server, Oracle Application Server, Inprise Application Server.
Lumea serverelor Microsoft .Net Entreprise i Visual Studio
Dinspre platforma ASP citm strategia materializat de Microsoft Distributed Network
Architecture, adic arhitectura unui sistem distribuit de la corporaia cu acelai nume, ce
a stat la baza unei serii de zece servere plus serverul Windows 2000.
Despre aceste servere nu putem emite pretenii de a le avea n A.S.E.! Instrumentul de
dezvoltare al acestora a fost precis mediul IDE Microsoft Visual Studio InterDev!
Sunt n total vreo zece servere. Pentru alte detalii, vezi i Epilog i referina /8/, o
documentaie plin de fraze ditirambice, aa cum sunt majoritatea comunicrilor i
brourilor celor care caut s se fac nelei posibililor lor consumatori de produse
software. Pentru conformitate redm o mostr de fraz: Microsoft Commerce Server
2000 permite afacerilor ?! din diferite domenii construirea de soluii e-commerce
scalabile (Sic !) personalizate, care optimizeaz experiena clientului i le ofer
managerilor un timp real (hopa !!!) de analiz i control al afacerilor online. Spunei i
dumneavoastr domnule profesor Pruteanu ce ditrambi sunt aceti ! Ai neles
ceva stimai actuali i posibil viitori manageri? S tii c nu nvinuim pe traductor ci,
pe creatorii unor atari fraze cu salarii sfidtoare. Dar mai bine s ne oprim ! i ce este
mai grav este c cei ndrituii a-i face public marfa , i bat joc de munca celor care
concep aceste produse software din interiorul corporaiei Microsoft !
Iat deci o veritabil dilem pentru un potenial administrator de sit comercial ca
lumea! Nu este cazul s fii dezorientai!
S revenim pe pmnt !
Ca s aflai ceva despre efortul de realizare al unui sit comercial mai nepretenios,
ncercai s parcurgei acest manual, jumtate scris n limba romn i jumtate n limba
francez.
n capitolele scrise n limba romn ne ocupm de tehnologiile JSP i ASP, plecnd de
la instrumente freeware fr a avea acces la pachetul Macromedia Dreamweawer MX.
Capitolele scrise n limba francez constituie o parte din cursul predat studenilor
economiti de ctre profesorul dr. Mihai Calciu la Universitatea Lille I i, care are n
vedere tocmai acest pachet alturi de aplicaiile EasyPHP, phpMyAdmin sub Windows
i mai ales Linux.
Afirmam mai sus ceva legat de acel soft pentru bazele de date. Fiecare din siturile
comerciale trebuie s apeleze la baze de date. Deci trebuie s avei n vedere ca
programatorul pe care l angajai s mai tie i unele comenzi ale limbajului de
interogare structurat, SQL, Structured Query Language.
Dac vrei s recurgei la tehnologia PHP, deci i la limbajul mySQL (tot SQL),
examinai i referina /5/, dar mai ales s aruncai un ochi n capitolele scrise n francez
din aceast carte.
Pentru partea dedicat tehnologiei ASP parcurgei capitolele 7-10, unde am explicat un
exemplu de sit comercial testat n stadiul preliminar i care poate fi mbuntit.
Pentru o privire asupra fiecreia dintre tehnologiile JSP, ASP i PHP, bazate pe
Macromedia Dreamweaver MX, citii i capitolele din partea a doua. n ce ne privete,
n A.S.E. nu avem acces la Dreamweaver i ne mulumim i cu ce avem. i avem unele
instrumente din platforma Windows!
Am fi avut mai multe i pe partea de dezvoltare a aplicaiilor de e-commerce, dac am fi
acceptat instalarea pe staiile din laboratoarele studeneti a unuia dintre dialectele Linux
n varianta WorkStation, de pild Suse, cu o suprafa grafic KDE!
n partea dedicat prezentrii tehnologiei JSP vei afla c, cu modestul cadru de
dezvoltare (se folosete termenul kit n englez) J2SE, Java 2.0 Standard Edition al
corporaiei Sun MicroSystems, cu un container pentru servleturi i pagini JSP Resin
1.1.4 sau JRun Standard 3.0, ambele cu regim de freeware, fr drept de folosire pentru
producia de situri comerciale aductoare de profit i, cu un programator cunosctor al
limbajului Java, nzestrat cu mult rbdare, putei ncropi un sit comercial. Pentru acesta
citii capitolele 1-6.
ntre pachetele cu funcia de container pentru servleturi i pagini JSP citm n primul
rnd pe Jakarta Tomcat. Un serios concurent este ns JRun, al firmei Allaire n dou
variante: Standard i Studio. Ultimul este pe bani! Primul este shareware! Vezi i mai
jos.
Tehnologia JSP a fost i este dezvoltat cu asiduitate de corporaia Sun Microsystems,
n timp ce tehnologia ASP este opera celor de la Microsoft.
Cadrul de lucru J2SE se poate descrca de la adresa: http://java.sun.com/products/jdk.
Mai indicat este ns s procurai ediia Entreprise a aceluiai cadru i anume J2EE.
Aceasta este ns distribuit sub licen cu prealabila perioad de testare (shareware).
Att J2SE ct i J2EE nu folosesc suprafaa grafic. Tot atunci se instaleaz automat i o
bibliotec de pachete cu clase Java, denumit JRE, Java Runtime Environment, adic
maina virtual Java, Java Virtual Machine (vezi capitolul 1). Exist cte un JRE pentru
fiecare cadru de lucru.
Cadrele de lucru J2SE i J2EE mai sunt denumite i SDK 2 Standard Edition, respectiv
pentru SDK 2 Entreprise Edition.
Versiuni de motoare servlet
Recomandm n ordine pe: Tomcat. Acesta a ajuns la versiunea 5. Merg foarte bine i
versiunile mai vechi 3.1 sau 3.2, care au regimul de licen deschis.
Exist apoi aplicaia firmei Caucho Technologies denumit Resin. Prin anul 2000 a fost
o versiune distribuit sub licen deschis cu numrul 1.1.4. Pe aceasta o vom
implementa pe staiile studeneti din corpul 1000, etajul 4. Pachetul este creaia lui
Ferguson Scott. Dac ai vizita portalul www.Caucho.com ai constata c versiunile mai
noi sunt pe bani cu trecere prin perioada de evaluare.
n sfrit, compania Allaire posed pachetul JRun (versiunile Standard i Studio).
Regimul de open source nu are dect versiunea 3.0 standard. Intrai i la:
http://www.allaire.com ca s v convingei c totul este acum shareware deci pe bani!
Pentru a crea cu trud un sit n ASP, recurgem la Microsoft FrontPage, MS Access,
editorul wordpad i cam att!
Ar fi fost mai bun Microsoft Visual InterDev. Nu emitem pretenii la Microsoft SQL
Server n loc de MS Access.
Acas avei de regul Windows 98. Sub acesta exist Microsoft Personal Web Server,
versiunea a patra. Sub Windows 2000 Workstation Professional, dac l avei, se recurge
la Microsoft Information Internet Server 5.0. IIS a aprut pe vremea sistemului
Windows NT/4 varianta Server. IIS nu este acceptat i de Windows NT/4 Workstation!
Din pcate toate acestea nu suport servleturi Java, dect dac cumprai de la firm
adausurile de rigoare! Folosesc ns cu dezinvoltur limbajul VBScript i obiectele
ActiveX Data, ADO. ActiveX este dezvoltat dup modelul obiectelor din componente,
COM, Component Object Model. Acest ActiveX cruia n romglez i se spune
controale ActiveX este accesibil att pe partea client (deci MSIE, nu i Netscape) ct
i pe partea de server.
Insistm! Sub browserul Netscape obiectele ActiveX sunt ignorate!
nainte de a trece mai departe, Windows 98 etc. permit instalarea motorului Caucho
Resin 1.1.4.
Dar ce ofer alii n materie de motoare servlet?
ncepem cu AOL / Netscape. Pn de curnd a tronat Netscape Java Web Server ca
server Web. El a fost nlocuit ns de ctre mai noul iPlanet Web Server Entreprise
Edition. Acesta a nlocuit i un alt server Web de la Netscape, denumit Netscape
Entreprise Server.
Exist piese software i pentru platforme Unix, AIX/Linux. Despre aceste platforme
vezi referina /2/. Sub Linux troneaz Tomcat.
Pro XML!
Toate browserele se feresc s rmn n urm i ncearc s se alinieze la standardul i
limbajul XML i la standardele XSL, XLST, Xpath etc. n mod tot mai hotrt. Conduc
detaat doar editorul/browserul Mozilla de la NCSA i total necunoscutul editor/browser
InDelv de la www.indelv.com. Sunt singurele care se descurc n XSLT, adic XLS
Transformations.
Nici nu ndrznim a v indica s procurai i rsfoi o alt referin de peste 800 pagini,
cu fraze ntortocheate, chiar din limba n care a fost conceput, englez. Este totui o
munc meritorie i enorm depus de ctre doamna sau domnioara Lee Anne Phillips,
un exeget n materie de documentare asupra standardelor XML / XHTML. Este vorba
de: XML, XPath, XLink, Xpointer, de limbajele de stil, precum: CSS1, CSS2, DSSSL,
XSL, XSLT. Cartea s-a numit n original Special Edition Using XML i a fost tradus
la editura Teora sub denumirea de XML. A aprut la editura american QUE, n anul
2000 iar la noi, un an mai trziu. Bravii notri traductori nu au desclcit i unele fraze
prea lungi din lucrarea original! What a pitty!
Am presupus poate greit c ai rsfoit referina /1/, pag. 208-233. Ai fi aflat destule
despre folosirea intens a limbajului XML n schimburile electronice de documente
finanicar-contabile dintre verigile implicate n tranzacii din siturile: B2B, B2C, C2C.
Vezi totui i partea a doua din limba francez.
Pentru ai fi independeni ntructva de referina /1/ am alctuit anexa A. Aici tratm
HTML, DHTML i o scurt iniiere n XHTML, ca s depim aceast referin. n
IT&C intervalul de timp ideal pentru actualizarea documentaiilor este semestrul! Anul
este prea lung!
S pornim la drum ntr-o manier ct de ct metodic.

Conveniile de scriere
Textul obinuit este cules cu acest set de caractere (font). Listele de programe sunt
culese cu acest corp de liter:
<html>
<head><title>Razboiul din Irak!</title>

cnd nu sunt numerotate sau aa:


01. <html>
02. <head><title>Razboiul din Irak!</title>

cnd sunt numerotate.


Procedeele de operare sunt anunate prin pictograma alturat.
Observaiile importante sunt anunate prin pictograma alturat
1
Capitolul

Universul termenilor platformei


Java
Vom explica pe nelesul dumneavoastr o serie de termeni din universul Java.
Au trecut destul de muli ani de cnd acest limbaj concureaz cu deosebit succes
familia de limbaje C/C++. Java este adulat i de ctre IBM et. Co, n ciuda
efortului venerabilei corporaii Microsof. Din cauza proliferrii unui numr
imens de pachete de clase i componente, se poate spune c Java i triete a
doua tineree, acum n perioada programrii orientate spre componente.

Client Web i server Web

A adar s intrm n universul termenilor platformei Java!


S adncim fa de referina /1/ dou noiuni i anume, cea de client Web i cea
de server Web. Dou calculatoare comandate fiecare de cte un program,
comunic ntre ele. Unul dintre programe servete la rsfoirea spaiului Web. I se mai
spune program de vizitare, de navigare. Cine nu a folosit Microsoft Internet Explorer
(MSIE)! Acestuia s i spunem client Web sau browser.
Pe cellalt calculator, gazd a sitului vizitat, se afl un alt program denumit server Web.
El este specializat n executarea programelor scrise ntr-unul din limbajele pentru
scenarii.
S complicm puin lucrurile! Exist i un server Web dar poate exista i un aa-zis
server de aplicaii Web. I-am spus mai sus motor servlet.
Dei tratm tehnologia JSP, admitei o parantez! n tehnologia ASP, serverul MS IIS
este i gazda aplicaiilor. Acest IIS interpreteaz pe loc instruciunile programelor cu
extensia .asp, componente ale unei aplicaii i genereaz dinamic un document tip html
care ajunge la PC-ul gazd a browserului MSIE. Terminat paranteza!
Aici este vorba ns de tehnologia JavaServer Pages. Serverul de aplicaie poate prelua
i sarcina serverului Web clasic, pe lng aceea de container pentru servleturi. Mai poate
s se ntmple ns i aa: s trimit serverului Web clasic servleturile ca s le
gestioneze, adic s le pun la dispoziia cererilor clienilor Web. Oricum, serverul de
aplicaii are n aceast a doua ipostaz doar funcia productor de servleturi.
Protocolul http i dialogul dintre client Web server Web. Lanul
slbiciunilor !
Spuneam mai sus c serverul Web dialogheaz cu clientul Web pe baza unui protocol.
Cel mai adesea acesta este http. Acesta nu este legat de servleturi. Vizitatorul vede pe
ecranul PC-ului gazd a browserului MSIE un formular. Cum credei c a aprut el aici?
A fost generat de ctre programul servlet. Vizitatorul completeaz datele n rubricile
formularului. Ele pleac la server, cnd s-a recurs la butonul pentru trimitere. Datorit
unui alt program dinainte proiectat i anunat n servlet, ce este asociat acestui formular,
se analizeaz aceste date i se construiete rspunsul. El este expediat napoi la clientul
Web tot sub forma unui document generat n HTML.
Acest schimb de replici client server respect oricum protocolul http deci formatul
HyperText Transport Protocol, care nu ne intereseaz pe noi nespecialitii IT!
n lumea browserelor i din nou obsesia XML!
Apropo, pe lng programul de navigare (sau vizitare) browser MSIE, se folosesc cu
aplomb i altele cum sunt: Netscape Navigator sau Communicator. Poate ai auzit i de
NCSA Mozilla sau venerabilul NCSA Mosaic. Ultimul este opera celor de la Centrul
pentru Arhitecturi de Supercomputere al Universitii Minnesota, Illinois. La NCSA,
(National Center for Supercomputing Architecture) cu un deceniu n urm, Mark
Andersen a conceput i elaborat Mosaic. Era primul browser grafic. Mai nainte Tim
Berners Lee a conceput Viola, un browser de tip text orinetat spre emultaor de terminal
VT-xxx. Studenii din anii terminali, urmaii lui Mark, dezvolt cu dezinvoltur n
referatele lor, nucleul unei noi versiuni de browser denumit Mozilla. Este aliniat la
standardul XML 1.0! Cunoate i interpreteaz corect structurile acestui limbaj extins
pentru marcaje, eXtensible Markup Language i chiar i abloanele limbajului de stiluri,
XSL, eXtensible StyleSheet Language.

Ce este XSL?
S zicem c am descris n XML (vezi i: /1, 2, 9, 16/) un articol de revist i descrierea
arat astfel:
LISTA 1.1 Aspectul documentului de intrare (scris n XML)

01. <?xml version=1.0>


02. <article fname=19990101_xsl>
03. <title>XML Style Sheets</title>
04. <date>January 1999</date>
05. <copyright>1999, Benoit Marchal</copyright>
06. <abstract>Style sheets add flexibility to document viewing.</abstract>
07. <keywords>XML, SXL </keywords>
08. <section>
09. <title>Styling</title>
10. <section>
11. <p>Style sheets are inherited form SGML, an XML ancestor. Style sheets
originated in publishing and document management applications. XSL is XMLs
standard style sheet, see <url>http://www.w3.org/Style</url>.</p>
12. </section>
13. <section>
14. <title>How XSL Works</title>
15. <p>An XSL style sheet is a set of rules where each rule specifies how to format
certain elements in the document. It has rules for title, paragraphs and
keywords.</p>
16. <p>With XSL, these are powerful enough not only to format the document but
also to reorganize it, e.g. by moving the title to the front of page or extracting
the list of keywords. This can lead to exciting applications of XSL outside the
realm of traditional publishing. ...</p>
17. </section>
18. <section>
19.
20. </section>
21. </article>

Am reprodus o parte din exemplul clasic al lui Benoit Marchal (referina /9/) care l-a
pasionat tocmai acest XSL i XSLT mai mult dect XML n sine. Observai o serie de
balize inventate pentru descrierea componenei unui articol. E vorba de titlul articolului
(liniile 02 i 03), de data apariiei sale (linia 04) etc. Mai jos vedem baliza abstract care
nfoar coninutul (liniile 06 i 21), de o serie de titluri de seciuni i de seciunile n
sine. n fine intrm i pe teritoriul oarecum al HTML, unde apar balize pentru paragrafe,
deci pentru frazele textului.
Acum s presupunem c dispunem de un procesor XT, cum este cel al lui James Clark,
vezi /14/, care citete la intrare documentul de mai sus de tip XML. Procesorul are un
transformator XSL, deci un XSLT. Acesta folosete un limbaj cu instruciuni n toat
regula! Iat pentru cazul nostru acest transformator de aspect de document:
LISTA 1.2 Instruciunile de transformare (scrise n limbaj XSLT)

01. <?xml version=1.0 encoding=ISO-8859-1?>


02. <xsl:stylesheet xmlns=http://www.w3.org/1999/XSL/Transform
xmlns=http://www.w3.org/TR/REC-html4.0>
03. <xsl:output method=html/>
04. <xsl:template match=/>
05. <HTML>
06. <HEAD>
07. <TITLE>About Style Sheets</TITLE>
08. </HEAD>
09. <BODY>
10. <xsl:apply-templates/>
11. </BODY>
12. </HTML>
13. </xsl:template>
14. <xsl:template match=section/title>
15. <P><I><xsl:apply-templates/></I></P>
16. </xsl:template>
17. <xsl:template match=article/title>
18. <P><B><xsl:apply-templates/></B></P>
19. </xsl:template>
20. <xsl:template match=url>
21. <A TARGET=_blank>
22. <xsl:attribute name=HREF>
23. <xsl:apply-templates/>
24. </xsl:attribute>
25. <xsl:apply-templates/>
26. </A>
27. </xsl:template>
28. <xsl:attribute name= HREF>mailto :<xsl :apply-templates/>
29. </xsl:attribute>
30. <xsl:apply-templates/>
31. </A>
32. </xsl:template>
33. <xsl:template match=p>
34. <P><xsl:apply-templates/></P>
35. </xsl:template>
36. <xsl:template match=abstract | date | keywords | copyright/>
37. </xsl:stylesheet>

Pe scurt ce se realizeaz mai sus! A fost scris conform regulilor limbajului XSLT un
grupaj de instruciuni de comandare a procesorului XSLT. Privii documentul iniial.
Acolo am ntlnit categoriile sintactice: article/title adic titlu de articol, date, copyright,
abstract, keywords, article/section, url i href. Pentru fiecare n lista de mai sus st scris
ce s se genereze n XHTML cnd se ntlnete o atare categorie sintactic.
Pe baza acestor reguli de producie, transformatorul a generat la ieire un document cu
structura XHTML (vezi i anexa A). Mai mult nu detaliem.
Iat acest document XHTML:
LISTA 1.3 Documentul rezultat la ieirescris n limbaj XHTML)

01. <!DOCTYPE html PUBLIC


02. <HTML><HEAD><TITLE>About Style Sheet</TITLE></HEAD>
03. <BODY>
04. <P><B>XML Style Sheets</B></P>
05. <P><I>Styling</I></P>
06. <P>Style sheets are inherited form SGML, an XML ancestor. Style sheets
originated in publishing and document management applications. XSL is XMLs
standard style sheet, see <A TARGET=_blank
href=>http://www.w3.org/Style>http://www.w3.org/Style</A>.
07. <P><I>How XSL Works</I></P>
08. <P>An XSL style sheet is a set of rules where each rule specifies how to format
certain elements in the document. It has rules for tile, paragraphs and
keywords.</P>
09. <P>With XSL, these are powerful enough not only to format the document but
also to reorganize it, e.g. by moving the title to the front of page or extracting
the list of keywords. This can lead to exciting applications of XSL outside the
realm of traditional publishing. ...</P>
10.
11. </BODY>
12. </HTML>
Dac privii cu atenie lista 1.2, toate balizele sunt scrise cu litere mari! Cum arta la
intrare documentul XML (lista 1.1) i cum arat acum, dup transformare (lista 1.3).
Toate browserele MSIE 5.x, nu cunosc versiunea 1.0 XML ci, una din versiunile
anterioare: 0.91 i 0.92 care impuneau i respectarea unor alinieri canonice la marginea
stng, fa de versiunea 1.0!
Ca s nu rmnem datori la ntrebarea Ce este XML? v spunem pe scurt c este un
fel de limbaj pentru marcaje, n care ns inventm propriile balize (tags). Stricteea
sintactic v va stresa. Orcie scriei, trebuie verificat sintactic cu un document ... pe post
de veritabil ... grmtici, acel DTD adic definiia tipului de document, Document Type
Definition!
n fiierul XML spunei care document va fi verificatorul i aici ncepe chinul, dac
scriei dumneavoastr n XML. Noroc c sunt generatoare automate de documente
XML (vezi : /13/) ca i convertoare de structuri XML XHTML(vezi : /14/).
XML este limbajul n care comunic curent verigile implicate n lanul unei tranzacii de
comer electronic (vezi i /3/).
Protagonitii lanului unei tranzacii de comer electronic.
Primul este cumprtorul secolului XXI, posesorul unei cartelele de credit. i spunem n
englez consumer. Este vorba apoi de banca care a emis acest card, denumit n
englez issuer, apoi de banca verificatoare, acquirer, de banca creditoare a reelei de
depozite, merchant bank i n sfrit, de angrosistul sistemului de depozite denumit n
englez, merchant. Toate documentele financiar-bancare circul ntre aceste verigi graie
mijloacelor de comunicaie i calculatoarelor cuplate la aceasta, nzestrate cu programe
adecvate. Programele instalate la diversele sedii ale acestor verigi vorbesc n XML,
deci nfoar (balizeaz spun snobii XML) datele documentelor fianciar-contabile n
haina preteniosului XML. Etapa XML a reprezentat transpunerea birocraiei
unificate EDIFACT a rilor din defuncta Pia Comun. EDIFACT nseamn
Exchange Data Interface for Administration, Commerce, and Transport. Evident, se
respect ntr-un mod riguros rigida sa sintax.

Modelul master slave cu trei straturi


S insistm puin asupra comunicrii dintre programele client i server. n jargon i se
spune model cu dou, trei sau n starturi, 2-tier, 3-tier, respectiv n-tier master-slave. S ne
oprim la modelul 3-tier: stratul client, client tier, stratul intermediar, middle tier i n
sfrit, stratul final, data tier, unde se afl fiierele bazei de date.
La nivelul client, programul de vizitare trimite cererea (adic datele completate n
rubricile formularului) la serverul Web. Acesta are acum rol de strat intermediar. El nu
poate interoga direct baza de date. Poate ai solicitat ca s vi se furnizeze sortimentele de
articole vndute de depozitele acelui sit comercial vizitat. Atunci se adreseaz unui
server specializat de baze de date.
Lumea bazelor de date
Bazele de date sunt deservite de alte sisteme specializate precum: Oracle, IBM DB2,
Ingres, Informix, mySQL, PostGRES, etc.
Serverul intermediar nu traduce el cererea ntr-un limbaj tiut serverul specializat n
cutri de informaie prin bazele de date. Este instruit prin program (servlet n jargon
JSP). ntrebarea ajunge la stratul data tier. Aici se alctuiete un rspuns. I se spune tabel
cu rezultatele gsite.
Revenim la servlet. Acesta primete tabelul rezultat i construiete un alt tabel cu balize
HTML dup care, cu ajutorul serverului Web, l trimite mai departe clientului Web. Pe
ecranul staiei gazd a browserului se red acest document i vizitatorul afl ceea ce a
solicitat. n fine acum v e clar!
Applet, servlet, container
n tehnologia JSP, limbajul folosit este Java vezi figura 1.1. Fluxul de caractere
(rspunsul) ajunge la client, unde este interpretat de ctre MSIE. Datorit unei piese
software de care nu am vorbit, browserul MSIE interpreteaz i aa-zisele miniaplicaii
Java, applets.
n dreptunghiul startului intermediar observai dou subnivele, unul pentru prezentare i
altul pentru accesul la bazele de date. Este nivelul denumit EJB, Entreprise Java Bean.
Aici se afl un servlet construit cu un veritabil arsenal de mijloace EJB!

FIGURA 1.1 Cele trei niveluri ale modelului 3-tier master-slave


(reproducere din manualul devapp.pdf al Allaire JRun, varianta standard)

Cum am spus mai sus termenul applet, un diminutiv de la application, este tradus lejer
prin miniaplicaie. Avei unul mai bun? Pn gsii dumneavoastr o traducere mai bun
s v spunem ce este!
Este un program scris iniial n limbajul Java, care a fost compilat, deci tradus, din forma
surs ntr-o form intermediar, cea de cod de octei (bytecode). Acest cod este
interpretat pe PC-ul care gzduiete clientul Web. O condiie ns! Pe acest PC trebuie
s fi fost instalat n prealabil un component software, alturi de browserul MSIE. Este
aa numita main virtual Java.
Servlet este tot o miniaplicaie rulat la server. I se mai spune i miniaplicaie server.
Termenul are dou sensuri.
Primul se refer la o ntreag activitate desfurat n spatele serverului Web i ai aflat
mai sus care este aceasta.
Al doilea sens, este acesta: dac aplicaia este complex (deci cuprinde clasele tip
Entreprise Java Bean), ea va include programe care converseaz optim cu bazele de
date.
Noi nu ne-am permis n acest manual s ajungem pn la nivelul cadrului de lucru
J2EE, oprindu-ne la J2SE. Motivul ? Un software cu regim shareware nu are ce cuta la
un laborator studenesc.
Component, pachet, clas, metod, et. Co.
Un component este o parte a aplicaiei. Pe de alt parte, n diversele locuri ale
componentului se apeleaz la metodele i clasele unor pachete. Pachetul nu este o
subdiviziune a componentului! Un pachet are mai multe clase gata dezvoltate.
Dac aplicaia sitului comercial nu conine clase simandicoase tip EJB, ne mulumim
cu clasele cadrului de lucru J2SE. Containerul care o execut nu este container EJB ci
unul simplu ! Dac am avut fericita ocazie de a dezvolta aplicaii de e-commerce
pornind de la J2EE, avem ocazia de a ne ntlni i cu containerul EJB!
n 1999, firma BEA Systems a oferit aplicaia Weblogic pe CD-ul care a nsoit referina
/4/, pentru o perioad limitat de timp ancorat absolut la acea perioad calendaristic.
Era o demonstraie a unei aplicaii de tip EJB. Acum ea este neoperaional din motivul
artat mai devreme!
Tot pe acelai CD sunt ns trei motoare servlet open source: Caucho 1.1.4, Allaire Jrun
3.0 Standard i Tomcat 3.0. Ele pot fi folosite n compania fiierelor cadrului JDK2
varianta SE i este totui ceva dect nimic!
JDK este un instrument pentru dezvoltarea de programe scrise n limbajul Java. Maniera
de lucru este primitiv! Instrumentele sale din care este alctuit acest cadru nu sunt
pregtite pentru suprafee grafice de lucru. Programatorul care le folosete trebuie s
memoreze tot felul de comenzi lungi i greoaie. Este un adevrat chin pentru cel cruia
i-ai trasa sarcina construirii sitului comercial!
Vei remarca la partea scris n limba francez, recomandarea just de folosire a
aplicaiei Macromedia Dreamweaver MX, ca substitut al acestei primitive abordri.
ntre altele acest Dreamweaver tie Java, VBScript, VBasic i PHP!
Diferena dintre servlet, scriptlet i pagina JSP
Un program scris n limbajul Java este un fiier de tip text cu extensia .java.
Pagina JSP este tot un program scris conform regulilor sintactice ale limbajului JSP. i
ea este tot un fiier de tip text dar are extensia .jsp.
n lipsa unui mediu de dezvoltare (Dreamweaver nu este un mediu de dezvoltare n
adevratul sens al cuvntului) recurgem la editorul Wordpad. n corpul paginii JSP se
pot ntlni i instruciuni Java. Sunt aa-zisele scenarii, scriptlets. Comenzile din
limbajul JSP mpreun poriuni de cod Java pur din acete scenarii sunt transformate de
ctre motorul servlet (Tomcat, Caucho, JRun etc.) n fiiere cu extensia .java. Deci
motorul este un programator automat, care va genera cod surs Java. Tot acesta
comand compilarea n cod de octei, deci v scutete de a memora complicatele
comenzi ale cadrului JDK2!

Maina virtual Java


Maina virtual Java (n englez Java Virtual Machine JVM) reprezint marea revoluie
a platformei Java Sun Microsystems. A ajuns pn n cuptoarele cu microunde, celulare,
PDA-uri. Este ntr-un cuvnt cheia portabilitii platformei! Aceast JVM a fost scris
ntr-un limbaj tradiional, de regul C. JVM este n fond un program i nu un dispozitiv
hardware. Este un fel de mediu de execuie. Pentru fiecare platform hard/soft exist
cte o main JVM. Este implantat ntr-o memorie flash a unui terminal portabil. La
PC-ul staionar sau la laptop, notebook, nu este nevoie de memorie flash! Rostul su
este s ronie codul de octei de care vorbeam mai sus.
Gazda mainii JVM poate fi un:
PC al platformei IBM (bazat pe Pentium IV, III, II) ;
Laptop cu microprocesor Pentium IV, III Mobile sau Pentium II MMX ;
PDA Palm, Compaq sau HP, cu microprocesor de tipul Motorola sau ;
Apple model iBook, IMac, cu microprocesor PowerPC.
Pentru fiecare exist cte o main virtual Java!
Notai c sunt destule sisteme de operare. Amintim:
Familia Windows, 95, 98, Me, NT/4, 2000, 2002;
Linux cu cele vreo apte dialecte ale sale: Caldera, Red Hat, Debian, SuSE,
Mandrake, Turbo, Slackware;
n lumea celularelor: GeOS, Palm OS, Windows CE, actualul Pocket PC;
Pentru platforma Macintosh: Apple OS i MacOS;
Pentru staii Sun, Solaris,
Pentru mainframes IBM ES 9000, multe sisteme de operare pe care nu le mai
enumerm ;
Pentru megaminicalulatoare IBM AS/400 la fel ;
Pentru arhitecturi IBM RISC/6000, AIX-ul, Unix-ul corporaiei IBM ;
Pentru defuncta corporaie DEC cu ale sale miniuri PDP-11, megamini-uri
VAX 780, Ultrix, etc.
Citii prile a doua i a treia a referinei /1/. Lumea nu st pe loc.
Att codul surs ct i codul de octei sunt coduri absolut independente de platform.
Maina virtual este dependent de idiosincraziile sistemului de operare ca i de
arhitectura hardware! Cei mai mari realizatori de maini virtuale Java sunt corporaiile
Sun Microsystems i IBM. Ei i ofer gratis mainile JVM!
n platforma IBM PC, unul din fiierele cadrului JDK instaniaz maina virtual
Java. Nu ne intereseaz care este acea component a JDK. Cum o instaniaz? JVM se
trezete n clipa n care i dai s execute un applet sau un servlet.
Dar oare nu este mai lent s se interpeteze un cod de octei dect s se ruleze un cod
main nativ! Aa este, dar nu uitai c dispunem azi de microprocesoare teribil de
puternice i mai sunt i atia bolnavi mintali amatori de creare de virui informatici!

Applet i servlet
Att appletul ct i servletul sunt programme, adic aplicaii. Sunt stocate n fiiere cu
extensia .class. Nu mai sunt de tip text ci binar! Appletul este interpretat la PC-ul gazd
de ctre browser (MSIE etc.) graie faptului c acest browser colaboreaz cu maina
JVM. Servletul rezid la calculatorul gazd a serverului Web. i aici se afl o main
JVM.

Clase Java beans


Clasa, instanierea, constructorul, obiectul
Clasa este un tipar, aa cum folosete croitorul ! Dar este mai mult de atta! n ea s-au
nmagazinat datele, parametrii dar i inteligen! Inteligena este gzduit de metodele,
algoritmele dac vrei, care opereaz cu aceste date i parametri trimii din exterior prin
interfaa clasei.
ablonul clasei nate obiectul clasei. A instania spun programatorii i neleg ce am
afirmat adineaori.
La instaniere, fiecare clas recurge la un aa-zis constructor. Este tot un program. El
produce obiectul. Asimilai rezultatul constructorului cu imaginea memorat, dup
folosirea declanatorului aparatului foto!
Ce vor s nsemne aceste clase tip Java Beans. Mai nti etimologia cuvntului: Bean
l traducem prin pstaie (de fasole sau mazre dar este prea grotesc). Butrii nrii de
cafea ce lucreaz la sediul general al corporaiei Sun Microsystems au adoptat
denumirea Bean, fiindc tot ncepuser cu Java. Java este denumirea cafenelei unde se
prepar la nisip cafeaua. Probabil c nu e a unui romn! Dac era, i-ar fi spus Ada-
Kaleh-ul iar corporaia poate l-ar fi adoptat n loc de Java!
Clasele Beans sunt tot clase Java care respect un tipic de programare (vezi
capitolul 6).
Program, subprogram
Ca s explicm afirmaia de mai sus, s folosim jargonul generaiei a treia de limbaje de
programare. Fie dou programe P1 i P2. P1 cheam P2 de multe ori. Spunem c P2
este o subrutin, o funcie, un subprogram. La generaia a patra, deci aceea a limbajelor
orientate spre obiecte, i se spune metod. P1 trimite date lui P2. Nu intrm n detalii
cum! n jargon spunem acestor date, parametri reali, argumente reale. P2 aplic
algoritmul, adic i face numrul su i prelucreaz aceste valori, i ntoarce
rezultatele. C le transmite sau nu lui P1 i cum le transmite, aceasta este mai puin
important. Algoritmul este conceput i scris dinainte. El trebuie s se refere la aceste
date prin adrese de memorie. Adresele nu sunt cele din spaiul programului P1 ci sunt
zone de memorie interne lui P2. Sunt deci locuri din memorie, crora li s-au asociat n
mod convenional denumiri simbolice dac vrei. Aceste locuri le numim argumente
fictive, parametri fictivi. Aici se aduc valorile parametrilor reali.

Ce conine o aplicaie complex de sit


comercial
n figura de mai jos, reproducere din manualul de firm al pachetului Allaire JRun
varianta Standard, se disting dou categorii de componente.
Primele sunt aplicaiile care conin obinuitele pagini JSP i servlet-uri. Motorul servlet
JRun mai are destule alte fiiere ablon (template). Evident, exist i alte componente
dar din motive didactice nu mai le enumerm. i aa nu ne ocupm aici de biblioteci
taglib i de abloane.
A doua categorie este constituit din aa-zisele clase tip Entreprise Java beans, EJB.
Sunt tot fiiere. Li se spun i biblioteci de clase EJB. Accesul se efectueaz prin
intermediul unei interfee adecvate EJB. Aceasta, la rndu-i, este alctuit dintr-o suit
de fiiere parametru, care conin valorile unei proprieti (considerai-le un fel de
parametri fictivi).
Faptul c sunt mai multe aplicaii Web, nu trebuie s constituie o nelmurire! Un motor
servlet JRun (dar i alte tipuri de motoare servlet) este n stare s se ocupe simultan de
mai multe situri comerciale.
FIGURA 1.2 Osatura unor aplicaii complexe de tipul sitului comercial
(reproducere din manualul devapp.pdf al Allaire JRun, varianta standard)

Relaia dintre serverul Web i motorul servlet


Pn acum nu a aprut poate prea clar aceast nuan. Caucho Resin este un motor
servlet ca de altfel i Allaire JRun.
JRun poate s funcioneze ca server propriu Web clasic i, n acelai timp pe post de
container pentru servleturi i pagini JSP, deci de server de aplicaie.
De asemeni, admite ca treaba serverului Web clasic s nu o mai fac el ci un server Web
extern. Deci comunic cu unul dintre serverele Web clasice.
Tomcat este mai comod dect Jrun ! Nu se obosete ci, recurge la serviciile serverului
clasic extern Apache Web Server.
n figura de mai jos se vd care servere Web clasice pot fi folosite de ctre motorul
servlet JRun. Este vorba de: Personal Web Server (PWS, Windows 95/98), Information
Internet Server (IIS, Windows 2000, 2002), Netscape Entreprise Server (NES) sau, n
sfrit de Apache. Mai observai acele dreptunghiuri mici denumite conector, connector.
Ei bine conectorul este un program specializat (i se mai spune n englez i driver). Nu
divagm!
Serverul propriu Web al aplicaiei JRun apare pe figur sub numele de JRun Web
Server. Aceasta pe de o parte. Pe de alt parte, remarcai c pe acelai PC pot funciona
mai multe motoare servlet JRun.
Ele sunt procese (tasks, vezi mai jos). Unul dialogheaz datorit rulrii aplicaiilor de
comer electronic cu Apache, NES i cu IIS, iar cellalt, cu serverele Web Apache i
JRun.
FIGURA 1.3 Relaia dintre diversele categorii de servere implicate
(reproducere din manualul devapp.pdf al Allaire JRun, varianta standard)

Deci :
Exist pe de o parte un container pentru servleturi i pagini JSP, cruia i spun unii
pe scurt server JRun i prodcu confuzie. Mai bine spunei-i server de aplicaii
Web.
Exist un alt server denumit server Web care se ocup de prelucrarea cererilor de la
PC-uri ce gzduiesc clieni Web i administreaz uneori i servleturile.
Coninutul unui rspuns al serverului este fie o pagin static, fie una dinamic.
Pagina static este un fiier cu extensia .html, adicp un docmuent anost de tip
HTML. Poate avea una sau mai multe appleturi sau nici un applet.
Pagina dinamic este ceva generat. Este un fiier cu una dintre extensiile .jsp, .asp,
.php etc. Cnd se solicit aceast pagin, are loc mai nti o prelucrare la server.
Rezult mai nti un flux de caractere HTML care, odat ajuns la PC, este redat pe
ecran.

Arhive de fiiere ale unui sit comercial


Fiierele care au extensia .jar sunt de fapt arhive. tii poate de zip, arj sau rar. Sunt
arhive construite cu winzip, arj sau winrar!
i n cadrul de lucru JDK exist un program pentru crearea i administrarea arhivei de
fiiere, cum poate folosii cu dezinvoltur pe WinZip sau WinRAR.
Apropo, WinZip tie structura tip JAR. Nu am informaii dac i aplicaia WinRAR a
aflat de aceast structur! Un sit comercial are fiiere care au diverse extensii.
Ce tipuri de documente pot intra ntr-o arhiv:
Fiierele cu pagini statice de cas.
Fiiere cu extensia .java (servlet-uri java).
Fiiere executabile .class.
Documente care descriu structura aplicaiei sitului comercial, dup rigoarea
limbajului XML. Acestea au extensia .xml.
i alte tipuri dar preferm pentru motive didactice a le ignora.
Toat aceast colecie de fiiere alctuiesc o anume ierarhie de directoare. Fiecare firm
realizatoare de motor servlet a cutat s i impun propria structur de desfurare. Va
fi acceptat pn la urm tipicul structurii grupului Jakarta. Vei observa uneori n acest
manual dou tipuri de ierarhii, pe de o parte aceea proprie firmei Allaire i pe de alta,
aceea a firmei Caucho.
Ei bine, aceste fiiere sunt comprimate i arhivate cu un utilitar denumit jar, ce se afl n
J2EE i J2SE. JAR nseamn Java ARchive.
Development phase, Deployment phase
Desigur de la maina pe care s-a conceput situl pn la maina int, deci gazd a sitului,
aplicaia este transportat n mod comprimat. Faza de punere la punct se numete n
englez development. Componentele aplicaiei sunt nglobate ntr-o arhiv. Aici se
conserv ntreaga ierarhie. Aceasta trebuie n prealabil desfurat (n englez,
deployment). Rezult ierarhia de directoare cu fiierele sitului.
Desfurarea trebuie efectuat mai nainte de momentul lansrii n exploatare a sitului.
Cei de la Allaire au voit ca extensia s se cheme WAR i nu JAR, adic Web Archive.
De fapt un fiier cu extensia .war este o structur de date .jar. (J de la Java).
Fake-root directory
Nu este cazul s intrm n amnunte tehnice de genul unde este directorul de implantare
tip rdcin deplasabil, fake-root, ce se poate planta n undeva n ierarhia general a
sistemului de operare. Fiecare motor servlet are propriul su fake-root.
Nu pe dumneavoastr stimate manager trebuie s v intereseze unde se afl exact acest
director ci, pe cel care se ocup de implementarea i ntreinerea programelor sitului
comercial. Poate suntei chiar dumenavoastr i, v felicitm atunci, fiindc suntei un
manager modern!
Proces, multitasking, multithreading, soclu i
port
Dei am explicat primele dou noiuni n referina /1/, le relum i aici.
Proces
S considerm c folosii editorul Winword ca s punei la punct un document. La un
moment dat, fiindc suntei cuplat prin modem la linia telefonic, vine un caracter (liter
sau cifr) prin linie. Acesta nu trebuie pierdut, altfel s-ar altera nelesul mesajului. Este
grija sistemului de operare existent pe maina dumneavoastr de calcul s ntrerup
executarea programului WinWord fr s simii i s transfere controlul spre
programul care se ocup de recepia caracterelor. S zicem c acest program este
clasicul dialer.exe. Winword trebuie s nu i piard contextul pn unde ai ajuns cu
punerea la punct a documentului, ca s fii n stare s v continuai treaba. Exist un
planificator de aa-zise procese, task scheduler, care se ocup de aceast trecere de la un
proces la altul.
Procesul (task) este un program ajuns ntr-un anume context.
Multitasking
Sistemul de operare a alocat zona de memorie pentru pstrarea acestui context. Aici a
fost salvat, adic s-a memorat coninutul registrelor microprocesorului, dup care
acelai task scheduler s-a ocupat de aplicaia dialer.exe. i ea ajunsese ntr-un anume
context. El este pstrat altundeva, nu peste contextul lui WinWord ! n consecin,
planificatorul va rencarca registrele microprocesorului cu valorile specifice de la
contextul anterior unde rmsese dialer.exe. Apoi se va ocupa de preluarea caracterului.
Dup preluare, va dezactiva aplicaia dialer.exe, pstrndu-i noul context, dup care
va reface contextul aplicaiei WinWord, .a.m.d. i aceasta poate de sute de ori ntr-o
secund, fr ca dumneavoastr s sesizai!
Acesta este mediul tipic de lucru denumit multitasking, multiproces.
Multithreading
Java permite i multithreading-ul. Este un fel de multitasking care face risip de spaiu
de memorie. De data aceasta, microprocesorul apelaz la o instruciune special de
schimbare a spaiului de adresare. Are loc o comutare ultrarapid de coninut de
registre ale microprocesorului spre spaiile de adres. Deci descarc-ncarc aceste
registre speciale. Se zice c se trece de la un fir de execuie la altul. Un program ocup
un anume spaiu din memoria operativ. Contextul acum nu se mai limiteaz la doar cei
civa zeci sau sute de octei, cum era n cazul multitasking-ului. Pur i simplu aplicaia
X are mai multe astfel de spaii mari rezervate n memorie
Portul, soclul
Portul i soclul sunt cu totul altceva O aplicaie tip server dialogheaz cu o aplicaie tip
client prin mesaje. Mesajele aparin protocolului ntrebuinat: http, ftp, smtp etc. Trebuie
neaprat o zon de memorie, un bite de lettre. S-i zicem i pe romnete, cutie potal.
Acesta este soclul. Soclul are un numr, o adres. Este portul. Nu intrm n alte
amnunte tehnice, dar soclul respect cerinele protocolului respectiv. De pild ftp
folosete porturile 20 (pentru handshaking) i 21, http recurge la portul 80. Sau Allaire
Jrun ascult la portul 8100, n timp ce serverul Web Apache, portul 80, Tomcat i
Resin folosesc portul 8080 etc.
Dup ce lansm browserul vom anuna n fereastra de adresare a sa (n cazul Netscape
se opereaz cu noiunea de Location, nu Address) c vrem s lansm un sit, de pild aa:
http://localhost:8080/test/mysit.jsp
Aici situl comercial se afla pe aceiai main de calcul, dar bine mersi putea ca s se afle
undeva pe alt fus orar i atunci, n loc de localhost trebuia s menionm adresa
serverului gazd a sitului comercial.

Jalonul alias cookie


Protocolul http este unul care nu are posibilitatea s nregistreze faptul c un vizitator a
efectuat mai multe intrri tip cerere/rspuns la acelai sit. Specialitii numesc acest
protocol HTTP drept unul fr stri.
Cnd s-a nscut acest sistem Web (vezi detalii n referina /1/), cam tot atunci a aprut i
HTML. Era pe la nceputul anilor 90. HTTP a avut un succes formidabil, dei nu s-a
preocupat s memoreze la serverul Web starea unei sesiuni. Att clientul ct i serverul
folosesc protocolul http. Internatutul cere. Serverul caut i gsete documentul. Apoi
trimite rspunsul.
S-a urmrit ca HTTP s fie ct mai rapid, mai simplu, deci ct mai compact. De aici
succesul!
Fiecare cerere a clientului Web este tratat separat de ctre server. Este un eveniment
izolat. HTTP nu tie c internautul a mai vizitat acel sit i nu i propune s memoreze
acest istoric al vizitelor sale.
Atunci, undeva trebuie pstrate aceste jaloane, identificatoare de sesiune, cookies! Mai
departe, vezi n capitolul 6 i n cazul aplicaiei complexe a sitului comercial din partea
dedicat tehnologiei ASP (capitolele 7-10).
2
Capitolul

Primii pai cu tehnologia JSP


JSP, Java Server Pages este o tehnologie de vrf. St la baza celor mai mari
situri comerciale. Este concurat de tehnologia ASP. Prima a fost dezvoltat de
ctre corporaia Sun Microsystems, a doua, de ctre corporaia Microsoft.

Paii procesului de generare ai unui servlet


Modurile de solicitare a servletului de la serverul Web de ctre clientul Web

P entru nceput s contemplm figura 2.1. Ce observm din ea? Faptul c clientul
Web solicit servletul fie:
n modul indirect, prin adresarea clasic n stilul URL, aa cum am artat
http://adresa-sit/dir/.../dir/pagina.jsp, fie
n mod direct, prin schema de adresare tot tip URL, dar n forma urmtoare:
http://adresa-sit/dir/.../dir/servlet.
Nu descriem aplicaii lansate prin schema a doua n cartea de fa. Faptul c se
ntrebuineaz una sau alta din cele dou scheme de mai sus, i este total indiferent
serverului Web, aflat la mijloc n figura 2.1.
Pagina JSP poate conine linii cu text tip HTML i scenarii (scriptlet n englezete),
scrise n limbaj Java, mai rar n JavaScript. La prima apelare a unei pagini JSP are loc
generarea unui fiier surs .java i traducerea n foma .class. Toate accesele ulterioare
efectuate de ctre clientul Web sunt rezolvate imediat, deoarece imaginea servletului
(.class) rmne n memoria cache a serverului Web (vezi referina /1/ pentru termenul
cache). Deci se vor ocoli paii de compilare i ncrcare.

FIGURA 2.1 Cei trei protagoniti implicai ntr-o sesiune la un sit comercial
(reproducere din manualul devapp.pdf al Allaire JRun, varianta standard)
i paii enumerai mai sus:

FIGURA 2.2 Paii de transformare ai unei pagini jsp (reproducere din manualul
devapp.pdf al Allaire JRun, varianta standard)

Un prim exemplu de pagin JSP n cteva


variante
1. Mai nti de toate s reinem c trebuie pornit unul din motoarele
servlet. La staii am implementat doar motorul Caucho 1.1.4, acesta
fiind cel mai rapid n comparaie cu JRun i cel mai mic consumator de
spaiu. Totui paii urmtori vor releva i cazul motorului JRun 3.0.
2. Crem apoi cu editorul Notepad (Windows) urmtorul document n care apar
banalele balize ale limbajului pentru hipertexte. Este bine s v reamintii acest
limbaj. V recomandm s citii anexa A.
LISTA 2.1 Un prim exemplu banal, welcome1.jsp

<html>
<head>
<title>Welcome!</title>
</head>
<body>
<H3 ALIGN="CENTER">Welcome to our store!</H3>
<CENTER><FONT FACE="Verdana" COLOR="darkgreen" SIZE="4">We sell the
&lt;&lt;BEST&gt;&gt; products!</FONT>
</CENTER>
</body>
</html>

3. Stocm (salvm) pagina n directorul dedicat aplicaiilor curent testate.


n cazul motorului JRun, directorul de cas (fake-root) va fi notat cu
<HOME_JRun>. Concret acesta va fi c:\Program Files\Allaire\JRun.
n cazul motorului Caucho Resin l vom nota <HOME_Resin> i, concret se afl
n directorul c:\Resin1.1.4\doc. S nu confundm ns aceste directoare de
cas cu directoarele aplicaiilor curent testate. Directorul aplicaiei curente este
la:
(JRun ) <HOME_JRun>/servers/default/default-app
(Resin) <HOME_Resin>/test
Ultimele observaii:
Nu vom intra n amnunte de implementare a motoarelor. Semnalm doar c JRun
i Resin, la pornirea lor la cald, ruleaz automat un aa numit scenariu de
configurare. n cazul JRun el se cheam local.properties, iar n contextul
motorului Resin, httpd.conf. El conine tot felul de comenzi i valori necesare
iniializrii motorului respectiv.
V rugm s nu tergei din greeal aceste fiiere cu scenarii sau, s salvai
exemplele n alte directoare. n caz contrar, ar trebui s nvai cum s modificai
aceste scenarii pentru configurare!
Lansm browserul MSIE. Schemele URL vor fi urmtoarele:
http://localhost:8080/test/welcome2.jsp (pentru Resin1.1.4), respectiv
http://localhost:8100/welcome2.jsp (pentru JRun)
Fiecare motor va genera n mod automat servletul sub forma unui cod surs Java,
dac pagina conine una sau mai multe poriuni cu scenarii (scriptlets n englez).
Motorul va realiza de asemeni traducerea (compilarea) codului surs n cod de
octei (.class). Va avea aceiai denumire.
Pentru aplicaia de mai sus nu a existat nici un scenariu. Deocamdat!
Fiindc fiierul a avut extensia .jsp, motorul a generat n mod automat un program scris
n limbajul Java n directorul:
<HOME_Resin>/work/_test/_jsp
n urma compilrii, alturi de fiierul surs va fi nregistrat i fiierul cu denumirea
_welcome1__jsp.class.

FIGURA 2.3 Aspectul documentului din lista 1.1

Rostul su a fost s creeze i s trimit la clientul Web acel text din lista de mai sus.
Deci pagina a fost generat dinamic!

Primul scriptlet
Fiierul welcome1.jsp putea foarte bine s aib una dintre extensiile .html sau .htm,
deoarece este un document tip html, fr nici un scriptlet. n acel caz ar fi fost o pagin
static, moart! Fiierul welcome2.jsp n schimb are un scenariu, scriptlet.
Scriptletul e delimitat de separatorii: <% i %>. Privii aplicaia welcome2.jsp.
LISTA 2.2 Fiierul welcome2.jsp

01. <html>
02. <head>
03. <title>Welcome!</title>
04. </head>
05. <body>
06. <%
07. out.println("<H3 ALIGN=\"CENTER\">" + "Welcome to our store !" + "</H3>");
08. out.println("<CENTER><FONT FACE=\"Verdana\" COLOR=\"DARKGREEN\"
SIZE=\"4\">" + "We sell the &lt;&lt;BEST&gt;&gt; products!" +
"</FONT></CENTER>");
09. %>
10. </body>
11. </html>

Explicaii
n cazul de fa, scriptletul este alctuit din dou instruciuni 07 i 08. Denumirea out se
refer la obiectul implicit out al JSP. El are misiunea de a reda un flux de caractere la
fiierul logic de ieire al aplicaiei (de regul ecranul). Denumirea println se refer la
metoda pentru realizarea dezideratului amintit. n lista aplicaiei welcome1.jsp erau
aceste linii:
<H3 ALIGN="CENTER">Welcome to our store!</H3>
<CENTER><FONT FACE="Verdana" COLOR="darkgreen" SIZE="4">We sell the
&lt;&lt;BEST&gt;&gt; products!</FONT>

Cu ce difer? Prin mai multe lucruri. Primul lucru care sare n ochi este faptul c apare o
parantez rond deschis, apoi un grup de aa-zis literali, delimitai de semne plus i la
final de o paranteza rond nchis. n sfrit, totul se termin prin caracterul punct i
virgul. Orice instruciune Java se termin cu acest caracter ; .
Literalul este un ir de litere i cifre (caractere) flancate de ghilimele. Semnul plus
servete la alipirea acestor literali.
Argumente reale i fictive (parametri reali i fictivi)
Metoda println() este un fel de subprogram, aa cum afirmam mai sus. n consecin,
acest subprogram va avea o list de parametri reali (argumente reale). O astfel de list
este nconjurat de parantezele ronde. n cazul exemplului nostru s-a folosit un singur
parametru. Dac lista ar fi avut mai multe argumente, atunci ar fi avut forma: (arg1,
arg2, ... ). Deci virgulele urmau fiecrui parametru, excepie fcnd ultimul.
S descifrm acum acest lung ir de caractere al unicului argument. Observai existena
balizelor din HTML dar i a textului obinuit. V recomandm totui s recitii sau s
citii anexa A, pentru a v explica mai departe la ce se refer aceste balize i secvene
escape (adic notaiile: &lt; , &gt; ).
Iat o parte din textul generat de ctre Caucho pentru pagina welcome2.jsp:
LISTA 2.3 Codul generat de ctre motorul servlet Resin la prima executare
a fiierului welcome2.jsp
/*
* JSP generated by Resin 1.1.4 -- Thu Sep 7 09:00:17 PDT 2000
*/

package _jsp._test;
import java.io.*;
import javax.servlet.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import javax.servlet.http.*;

public class _welcome2__jsp extends com.Caucho.jsp.JavaPage{

public void
_jspService(javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws IOException, javax.servlet.ServletException
{
javax.servlet.jsp.PageContext pageContext =
com.Caucho.jsp.QJspFactory.create().getPageContext(this, request, response, null, true, 8192,
true);
javax.servlet.jsp.JspWriter out = (javax.servlet.jsp.JspWriter) pageContext.getOut();
com.Caucho.jsp.ByteWriteStream _jsp_raw_out;
_jsp_raw_out = (com.Caucho.jsp.ByteWriteStream) out;
javax.servlet.ServletConfig config = getServletConfig();
javax.servlet.Servlet page = this;
javax.servlet.http.HttpSession session = pageContext.getSession();
javax.servlet.ServletContext application = pageContext.getServletContext();
com.Caucho.jsp.QBodyContent _jsp_endTagHack = null;
try {
_jsp_raw_out.write(_jsp_string0, 0, _jsp_string0.length);

out.println("<H3 ALIGN=\"CENTER\">" + "Welcome to our store!" + "</H3>");


out.println("<CENTER><FONT FACE=\"Verdana\" COLOR=\"DARKGREEN\" SIZE=\"4\">" +
"We sell the &lt;&lt;BEST&gt;&gt; products!" + "</FONT></CENTER>");
_jsp_raw_out.write(_jsp_string1, 0, _jsp_string1.length);
} catch (Exception e) {
pageContext.handlePageException(e);
} finally {
JspFactory.getDefaultFactory().releasePageContext(pageContext);
}
}
...
<html>\r\n<head>\r\n<title>Welcome!</title>\r\n</head>\r\n<body>\r\n".getBytes();
_jsp_string1 = "\r\n</body>\r\n</html>\r\n".getBytes();
}
}

Nu v vom cere s scriei aa ceva niciodat! Citii ns cu luare aminte observaiile


extrem de importante de la sfritul acestui prim capitol.
Aspectul ferestrelor document ale ambelor aplicaii welcome1.jsp i welcome2.jsp sunt
identice din punct de verdere al browserului. El este redat n figura 2.3.
Fereastra tip document a browserului
Programul de vizitare, navigatorul sau browserul, cum vrei s i spunei, este o aplicaie.
O aplicaie poate exista la un moment dat sub forma a unuia sau mai multe procese.
Fiecrui proces i este asociat o fereastr de tip document. La urma urmei, browserul
poate gestiona una sau mai multe fiiere cu extensia .htm/.html. Fiecrui fiier i
corespunde o fereastr document, un anume context. Fereastra document este n cadrul
ferestrei de aplicaie.

Expresii
Iat urmtorul caz :
LISTA 2.4 Fiierul welcome3.jsp

01. <html>
02. <head>
03. <title>Welcome!</title>
04. </head>
05. <body>
06. <%="<H3 ALIGN=\"CENTER\">" + "Welcome to our store!" + "</H3>" %>
07. <%="<CENTER><FONT FACE=\"Verdana\" COLOR=\"DARKGREEN\"
SIZE=\"4\">" + "We sell the &lt;&lt;BEST&gt;&gt; products!" +
"</FONT></CENTER>" %>
08. </body>
09. </html>

Explicaii i parafraze
Ce observm acum? Faptul c n pagina welcome3.jsp apar dou scenarii n loc de unul.
Pot fi oricte! Mai remarcm apoi c se folosete cte un semn egal.
S ne fixm atenia asupra textelor ce urmeaz semnelor egal (liniile 06 i 07). Textele
sunt aproape identice cu ce am scris mai sus la welcome2.jsp. Este totui o diferen!
Privii acele bare inverse ce apar din loc n loc n faa ghilimelelor.
Am fost obligai s folosim aceti dublei de caractere \" din motivul urmtor: HTML
folosete ghilimelele pentru atributele balizelor sale. Deoarece limbajul Java folosete
tot ghilimele pentru literali (nu numai apostrofii), trebuie adaugat sistematic aceast bar
invers (backslash) naintea ghilimelei care delimiteaz o valoare de atribut HTML.
Forma echivalent a textului de mai sus se exprim din punct de vedere sintactic n felul
acesta:
<%=expresie_Java %>

Semantica, adic nelesul acestei transcrieri este: evalueaz pe loc expresia aflat n
dreapta semnului egal i execut ce se cere n cadrul ei. Expresia de mai sus este o
alipire (concatenation, concatenare cum spun informaticienii) de literali.
S apar data i ora!
LISTA 2.5 Pagina welcomets0.jsp n care apar data i ora

01. <%@ page import='java.text.*, java.util.Date' %>


02. <html><head><title>Welcome!</title></head>
03. <body><font color="ultramarine">
04. <center>
05. <%
06. String data_ora = DateFormat.getInstance().format(new Date());
07. %>
08. <p>Today is: <%=data_ora %>
09. </center></font></body>
10. </html>

FIGURA 2.4 Aspectul documentului

Explicaii i parafraze
Constatm pe prima linie a listei directiva page. Limbajul JSP este alctuit din: etichete,
directive i comenzi din cadrul scenariului JSP.
Scenariul JSP l-am ntlnit pn acum sub forma expresiei i instruciunii din limbajul
Java. Unii le spun declaraii. Dar s nu ne pierdem n terminologie!
Directivele stabilesc proprietile unei pagini JSP. Una dintre directive este i page
(pagin). Ea are multe funcii. Nu ne propunem a le nfia ca ntr-un manual de
referin.
n cazul de fa, directiva page asum c limbajul va fi Java (lipsete atributul language
= nume-limbaj), dar anun motorul s preia informaiile deja definite dintr-o serie de
pachete externe aplicaiei.
ntregul eafodaj de clase Java se bizuie pe o ierarhie de clase grupate n pachete.
Pachetele sunt ataate unor noduri ale ierarhiei.
Ce nseamn a importa ?
S traducem: preia tot ce este nevoie n acest exerciiu din nodul java.text.* i din
clasa java.util.Date. Aadar cuvntul import este al doilea atribut al directivei page.
Prezena asteriscului indic faptul c vor fi motenite datele i metodele claselor care
cuplate la nodul ierarhic java.text.
n al doilea caz, se va prelua exact clasa java.util.Date, care se ocup de tratarea datei
calendaristice. Acum urmeaz ceva cu totul nou! Scenariul din liniile 06-08 conine o
instruciune de atribuire Java. Mai nti i nti se declar o variabil denumit data_ora.
Ea are tipul ir de caractere (adic String). Instruciunea de atribuire are forma sintactic:
tip variabila = expresie;

Tipul ei poate lipsi. n dreapta semnului egal se afl o expresie cam ciudat, care const
dintr-o nlnuire de denumiri separate prin puncte. DateFormat este numele unei clase
care aparine clasei printe java.text.Format.
n schimb, getInstance() este denumirea uneia dintre metodele acestei clase. Faptul c
dup denumirea aceasta urmeaz paranteze, ne dm seama c este o metod. Ea va
prelua o instan a obiectului Date, deci un ir cu data i ora momentului. Acest
instantaneu are un anumit tipic de scriere anglo-saxon. Denumirea format este numele
unei metode a clasei java.text.Format, clasa printe a clasei java.text.DateFormat. Deci
observai ce afirmam mai sus cu privire la motenire.
Clasa java.text.Format este fiica clasei printe java.lang.Object. Aadar obiectul Format
motenete o parte din caracteristicile obiectului generic Object, cruia i ataeaz i alte
nsuiri specifice!
S relum firul explicaiei simpliste. Mai observm c imediat dup cuvntul format
urmeaz paranteze, dar nu una dup alta, ca la getInstance(). ntre paranteze apar dou
cuvinte new i Date(). Date este un obiect? Nu! Fiindc este scris cu liter mare! i
totui este urmat de paranteze, deci ar trebui s fie o metod. i aa i este! Este o
metod special.
Orice clas are o metod special denumit constructor, care are respect denumirea
exact a clasei. Momentul vizitrii sitului comercial este exprimat printr-un numr cu
zecimale (n jargon Java double). Este o valoare cu un format anume, cruia
programatorii i spun double (vezi i capitolul urmtor). Metoda format convertete
aceast valoare ntr-un ir de caractere (String), ca informaia s devin inteligibil. Se
respect tipicul fusului orar pe care a fost generat sistemul de operare la maina
respectiv. PC-ul pe care am alctuit acest manual avea un Windows NT instalat pe
fusul orar GMT+2, deci ora Balcanilor. De aceea observai n figura 2.4 un mod mai
familiar nou, anume: zz.ll.aaaa. Nu s-a asumat tipicul anglo-saxon (adic: aaaa.mm.dd
hh:mm:ss, unde aaaa este anul din patru cifre, mm, a cta lun din an, dd, a cta zi din
lun, hh a cta or din zi, al ctelea minut, a cta secund).
Odat adus aceast valoare a momentului la forma de ir, din el prelum cu metoda
getInstance() partea referitoare la dat i cea referitoare la or.
Iat i o alt manier de anunare a momentului vizitrii sitului (vezi figura 2.5).

FIGURA 2.5 Aspectul ferestrei documentului browserului MSIE, pentru fiierul wts.jsp
Adic n loc de 04 apare denumirea aprilie. Mai mult chiar, apar i patru iniiale : EEST
ba chiar i secunda! Ca s realizm un aspect similar celui din figura 2.5, aplicaia a
trebuit s fie modificat astfel:
LISTA 2.6 Pagina wts.jsp, o alt manier de publicare a datei i orei vizitrii sitului

01. <%@ page import='java.text.*, java.util.Date' %>


02. <html><head><title>Welcome!</title></head>
03. <body>
04. <center>
05. <%
06. int FULLDATE = 0;
07. int FULLTIME = 0;
08. String data_ora =
DateFormat.getDateTimeInstance(FULLDATE,FULLTIME).format(new Date());
09. %>
10. <p>Today is: <%=data_ora %>
11. </center></body>
12. </html>

Explicaii
Apar dou variabile FULLTIME i FULLDATE, fiecare iniializate cu zero. Metoda
getInstance() s-a nlocuit cu metoda getDateTimeInstance(), ca s se preia ntregul flux
de caractere. Anterior, am ignorat n mod deliberat secundele i tipul orei standard!
Observai secundele i iniialele EEST, adic ora standard a Europei de Est. Denumirea
aprilie a aprut ca urmare a faptului c FULLDATE a fost egal cu zero.
Acum s facem s apar semnificaia prescurtrii EEST. Privii lista i aspectul
corespunztor din figura 2.6.
LISTA 2.7 Lista fiierului wts1.jsp

01. <%@ page import='java.text.*, java.util.Date' %>


02. <html><head><title>Welcome!</title></head>
03. <body>
04. <center>
05. <%
06. int FULLDATE = 0;
07. int FULLTIME = 0;
08. String data_ora =
DateFormat.getDateTimeInstance(FULLDATE,FULLTIME).format(new Date());

09. String acronim = data_ora.substring(25,29);


10. %>
11. <p>Today is: <%=data_ora %></p>
12. <p>Acronim <%=acronim %> means Eastern Europe Standard Time!</p>
13. </center></body>
14. </html>
FIGURA 2.6 Aspectul ferestrei documentului browserului MSIE, pentru fiierul wts1.jsp

Explicaii
Scenariul nu s-a complicat dect cu cteva linii. Am declarat variabila acronim.
Limbajul Java cere obligatoriu ca o variabil s fie nu numai declarat ci, i iniializat
cu o valoare! Obiectului data_ora i-am ataat metoda substring. Metodei i-am dat dou
jaloane i anume de la ce liter i pn la ce liter s extrag o poriune de literal. Aici
am punctat exact locul celor patru litere, EEST. irul este reprezentat n memorie din
caractere care ocup fiecare cte un octet. Indexul ncepe de la zero, vezi figura 2.7.
1 0 a p r i l i e 2 0 0 3 1 2: 0 7: 3 6 E E S T
coloana 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
FIGURA 2.7 Reprezentarea irului de caractere n memorie

i numele vizitatorului sitului!


Privii figura 2.8.

FIGURA 2.8 Aici apare i denumirea clientului

Iat codul care conduce la un astfel de aspect:


LISTA 2.8 Un scenariu n care prelucrm doi parametri pasai prin adresa n stilul URL

01. <%@ page import='java.text.*, java.util.Date' %>


02. <html><head><title>Welcome!</title></head>
03. <body><font color="ultramarine">
04. <center>
05. <%
06. int FULLDATE = 0;
07. int FULLTIME = 0;
08. String data_ora =
DateFormat.getDateTimeInstance(FULLDATE,FULLTIME).format(new Date());
09. %>
10. <p>Today is: <%=data_ora %>
11. <p></font>
12. <font color="blue" size="+4">
13. <%
14. String firstName = request.getParameter("fName");
15. String lastName = request.getParameter("lName");
16. out.println("Welcome dear Mr/Mrs/Miss " + lastName + " " + firstName);
17. %>
18. </center></font></body>
19. </html>

Ca s funcioneze acest exemplu, trebuie s recurgei la specificaia URI (URL)


urmtoare:
http://localhost:8080/test/welcome4.jsp?fName=numele_dvs.&lName=prenumele dvs.

Explicaii
Remarcai scenariul din liniile 14-16. Am declarat variabilele firstName i lastName.
Le-am iniializat cu valori. n acest sens am folosit tuplul
nume_obiect.denumire_metod

deci request.getParameter(). Obiectul s-a numit request (vezi capitolul urmtor) iar
metoda, getParameter().

S adugm un fond muzical i un efect de


animaie sitului!
V rugm s rulai urmtorul exemplu de pagin JSP (lista 2.8) pe o configuraie care s
aib placa de sunet, difuzoare, browserul MSIE (neaprat, fiindc pe alte browsere nu
este recunoscut baliza MARQUEE din HTML), iar browserul s fie instalat n mod
standard, adic s fie n stare s recunoasc obiecte multimedia muzicale (fiierele cu
extensia .au, .avi i/sau .voc). Fiiere cu unul dintre aceste sufixe ar trebui s existe pe
PC-ul dumneavoastr.
Plasai n final secvena muzical, pe care s o redenumii melos.au, chiar n acelai
director test, ca i exemplul welcome5.jsp, acesat firete, dac fiierul muzical a avut
tipul de date .au. Lansai apoi motorul servlet i dai comanda care se vede n linia
Address, din figura 2.9.
LISTA 2.9 Un sit muzical!

01. <html>
02. <head>
03. <title>Welcome!</title>
04. </head>
05. <body>
06. <%="<H3 ALIGN=\"CENTER\">" + "Bine ati venit stimate cumparator!" + "</H3>"
%>
07. <%="<CENTER><br><EMBED SRC=\"melos.au\" >" %>
08. <%
09. int m = 5;
10. String marfuri[] = { "electronice", "mobila", "cosmetice", "pentru gradinarit",
"camping" };
11. out.println("<MARQUEE>Azi va oferim o bogata gama de sortimente de marfuri:
</MARQUEE>");
12. for (int i = 0; i < m; i++ ) {
13. switch (i) {
14. case 0: out.print("<font color=\"brown\">" + marfuri[i] + "</font>");
15. break;
16. case 1: out.print("<br><font color=\"blue\">" + marfuri[i] + "</font>");
17. break;
18. case 2: out.print("<br><font color=\"darkblue\">" + marfuri[i] + "</font>");
19. break;
20. case 3: out.print("<br><font color=\"green\">" + marfuri[i] + "</font>");
21. break;
22. case 4: out.print("<br><font color=\"darkgreen\">" + marfuri[i] + "</font>");
23. break;
24. }
25. }
26. %>
27. <%="</CENTER>" %>
28. </body>
29. </html>

FIGURA 2.9 Mult zgomot pentru ... nimic!

Explicaii i parafraze
S l descifrm, mai ales c este plin de obiecte de efect! Mai nti i nti suntem de
acum experi n scriptlet-uri. Vedem n acest exerciiu vreo patru scenarii. Primele dou
sunt identice cu cele din lista 2.3.
Al doilea scriptlet se ocup de muzic! Remarcai baliza EMBED (linia 07) din
HTML, prin care anunm browserul c urmeaz s interpreteze cu ajutorul unui add-
on, adic al unui program ter (un player) partitura melos.au.
S privim al treilea scriptlet (liniile 09-26). Este primul contact cu instruciunile
limbajului Java. Se declar (adic se aloc i se iniializeaz) o variabil de tip ntreg,
denumit m. Ea are valoarea 5. Se declar apoi un masiv de iruri denumit marfuri.
Valorile fiecrui element al su sunt literalii. Sunt n total cinci elemente, exact ct am
stabilit pentru m. Mai departe remarcai instruciunea deja familiar, out.println().
Vedei baliza MARQUEE, ce este specific doar browserelor Microsoft. Textul flancat
de perechea <MARQUEE>, </MARQUEE> va aluneca pe ecran.
Ce nseamn notaia for (int i = 0; i < m; i++)? Este o instruciune Java. Se citete aa:
pentru i (variabil de indexare de tipul ntreg) cu valori de la 0, pn la 5, mai puin
valoarea 5 (i < 5) din 1 n 1, execut grupul de instruciuni aflat ntre acolade. Acest
grup l denumim i corp. Este compus aici doar dintr-o singur instruciune, switch. Pot
fi oricte instruciuni. Dac este doar o instruciune nu mai trebuie folosite acoladele. Nu
am greit c le-am scris, dar ca s nu uitm aceste acolade le vom aduga sistematic.
Citim aa: cnd i va avea valoarea egal cu 0, se execut instruciunile cazului zero
(case 0:). Apoi se sare dup instruciunea switch. Variabila i crete cu o unitate datorit
notaiei i++. Valoarea i se va compara cu 5. Fiindc ea este egal cu 1, se va executa
out.println i break-ul acestui caz (case 1), .a.m.d. V-ai prins!
Mai observai ceva i anume c out.print() adreseaz cte un singur element al
masivului. Privii figura 2.9, unde apar aceste valori n mod distinct. S nu v deranjeze
c au diverse culori. Noi le comandm cu acele balize font color! Deci n cazul i ne
referim la al i-lea element, marfuri[ i ]. Cnd i a ajuns la valoarea 5, nu se mai intr n
corpul for.

Cteva observaii extrem de motivate


1. Categoric, nu ne propunem a v nva limbajul Java, ca pe studentul facultii
de Informatic Economic. Nu ar avea nici un rost s insistm, ntruct profilul
facultii R.E.I. nu este cel de formare de dezvoltatori de situri comerciale.
2. n postura posibil de manager, am dori s aflai n urma audierii acestui curs i
s apreciai corect efortul celui care a primit de la dumneavoastr misiunea de a
se ocupa de crearea i ntreinerea unui sit comercial.
3. Foarte muli dintre dumneavoastr suntei absolveni de secie real. n ultimele
clase v-ai ntlnit cu programarea! Unii ai avut i destule ore, alii mai
puine pe semetru.
4. Majoritatea ai deprins a lucra cu suprafee de lucru ale familiei Microsoft
Windows de la primul curs de Iniiere n informatic! Oricum, v vd colindnd
cu dezinvoltur prin situri dup tiri, brfe, muzic MP3, avei frecvent csue
potale la Hotmail, Yahoo etc.!
5. De-a-lungul timpului am observat un interes aparte la unii dintre studenii ai
anului doi, spre teme de cas practice nu numai de copia la mntuial un referat
din Internet, cumprat pe bani de la binevoitori, fr s v mai nelegei
coninutul! Este o mod duntoare ! La ce ai mai intrat n facultate!
6. Exist ntre dumneavoastr oameni care public curent pe Web! Nu este mare
scofal! Facem aceasta la lucrrile de laborator, la Yahoo Geocities, de vreo trei
ani ncoace!
7. Ultimele cinci serii de studeni au deprins limbajul HTML. Nu am avut timp ai
nva pe studenii seriei anului universitar 2002/2003 i ASP, deoarece am
consacrat prea multe cursuri unor elemente despre reele, aa cum era structurat
anterior cursul denumit Internet!
8. Am ataat n aceast carte o parte din cursul profesorului Mihai Calciu, pe care
acesta l pred studenilor economiti de la Universitatea Lille I. Se refer la trei
tehnologii JSP, ASP i PHP.
9. Noi nu o s ne rezumm dect la a v sensibiliza n JSP i ASP la stadiul nu
de scriere de programe ci de recunoatere de secvene. De aceia o s vi se admit
i la proba de verificare cartea pe mas. Vai acelora care nu citesc n prealabil
cartea ! Dac v-ar cdea n mn Birotica i Internet la cumpna mileniilor,
elaborat de ctre aceiai autori, aprut la editura Lucman n dec. 2000, ai
constata c n ultima parte vorbeam de limbajul de scenarii PERL sub mediul
Linux.
10. Ca i la Universitatea Lille, avem i noi de vreo doi ani ncoace un server
propriu de Linux SuSE. Nu este vizibil de la staiile laboratoarelor, dect ntr-o
fereastr DOS, ntruct aici nu s-a admis includerea i a unei suprafee grafice
Linux. De la etajul 4 se poate lucra n fereastr tip Term-Linux, din linia de
comand. Este prea !
11. Vrem s micorm acest decalaj stimai studeni ntre studenii romni i cei
francezi. Destul cu mnuirea mausului! Destul cu nvarea lejer a folosirii PC-
ului doar pentru colindarea prin spaiul Web! Din liceu i din coala primar
deprindei aceste lucruri!
Concluzia: Trecem la un alt stadiu de profesionalism, de fapt mergem n pas cu ...
lumea!
nainte de a ncheia iat o procedur :
Este absolut necesar ca naintea folosirii browserului de serviciu (de regul MSIE), s
pornii motorul servlet Resin.

Efectuai un clic pe pictograma httpd aflat pe suprafaa de lucru. Vor apare


dou ferestre cu fond negru. n fereastra mare se anun c motorul ateapt mesaje
la portul cu numrul 8080. Pe durata testrii nu nchidei aceste ferestre. Minimizai-
le sau plimbai-le oriunde pe ecran. Dac le-ai nchidei oprii motorul!
La final de capitol
Aadar n acest capitol am nvat:
1. Modurile prin care un client Web solicit servicii unui servlet. Am aflat c sunt
trei protagoniti implicai: MSIE, adic clientul Web, serverul Web i n sfrit
motorul. Toate trei pot fi pe aceiai staie, dar pot fi n puncte diferite!
2. C sunt cinci pai prin care se metamorfozeaz o pagin JSP, ajungnd la final
n a fi executat pe serverul Web.
3. Care sunt specificaiile de adres n stil URI (URL) pentru lansarea n lucru a
unei pagini JSP n contextul celor dou motoare, Allaire JRun i Caucho Resin.
4. Ce este acela un scriptlet. Am i elaborat vreo cteva scenarii.
5. Ce nseamn out.println.
6. Ce nseamn irul <%=expresie_Java %>.
7. Cum declar i se iniializeaz variabile.
8. Ce semnificaie are scrierea de denumiri cuplate prin puncte, specific mediului
programrii orientate pe obiecte.
9. Destule despre limbajul Java, n ultimul listing cu situl muzical!
3
Capitolul

Directive i obiecte JSP


Pentru a putea rsfoi cteva din caracteristicile acestui limbaj, nu mai putem
pleca de la o aplicaie de e-commerce, deoarece dac am face aa, ar trebui s
venim acum n faa dumneavoastr stimate cititorule cu exemple complicate i v-
am bulversa!

S
o lum pe ndelete! Nu avem ce face, trebuie s trecem n revist doar cteva
dintre virtuile acestui limbaj. Numai n acest capitol se va ntmpla s puem pe
primul loc limbajul, nu aplicaia ! i totui vom avea i aici aplicaii utile.

Directiva include file


Mecanismul directivei include file
n capitolul precedent aminteam de directiva page. JSP posed mai multe directive. S
ne referim acum la directiva include. Sintaxa ei este urmtoarea:
<%@ include file=path %>

Aici path este termenul englezesc i nseamn specificaie de cale. Se tie nc de la MS-
DOS c un fiier se afl undeva ntr-un anume director, care este fiul altui director
Deci specificaia se poate scrie: dir/dir/.../dir/nume-fiier.extensie.
S privim cazul de mai jos. Sunt dou pagini JSP. Iat listele :
LISTA 3.1 Din pagina welcome6.jsp apelm pagina antet.jsp

01. <%@ page import='java.text.*, java.util.Date' %>


02. <%@ include file="antet.jsp" %>
03. <html>
04. <body><font color="#2288ef"><center>
05. <%
06. String datum = DateFormat.getDateInstance().format(new Date());
07. %>
08. <p>Heute ist am: <%=datum %>
09. </font></center></body></html>
i pentru pagina antet.jsp:
01. <body>
02. <center><table width="90%" border="0">
03. <tr>
04. <td><font color="#2288ef"><H1 align="center">Willkommen im ... Obst und Geme
Haus! </H1></td>
05. </tr>
06. <tr><td><%="<CENTER><br><EMBED SRC=\"melos.au\" >" %></td></tr>
07. </table>
08. </center>
09. </body>

Explicaii i parafraze
S ne fixm atenia pe prima dintre liste. Observm pe linia 02 directiva include. La
ntlnirea unei atari directive, motorul va prelua liniile listei a doua, dup care va
continua cu parcurgerea listei welcome6.jsp. n tot acest timp, motorul servlet va
verifica sintaxa comenzilor JSP. Dac le va gsi n regul, va genera codul java.
n lista antet.jsp distingem un obiect de tip multimedia (coloana sonor, melos.au). Este
n linia 06. Mai vedem i cteva balize ce se refer la un tabel. Nu ieim din subiectul
acestui capitol. Vei citi singuri partea referitoare la HTML, pentru a pricepe ce
nseamn aceste balize!
i nc ceva! Literele naionale germane sunt admise i afiate corespunztor. Ele fac
parte ntr-adevr din pagina de cod ISO 8859-1. Ea se refer la primele 256 caractere
din Unicode. Dac n primele 128 simboluri apar simbolurile alfabetului englez i
american, n urmtoarele 128 coduri se afl diacriticele ctorva naiuni europene
privilegiate.
Acum s contemplai aspectul acestei pagini rezultate din fuzionarea paginilor
welcome6.jsp i antet.jsp.

FIGURA 3.1 Aspectul ferestrei documentului paginii rezultante welcome.jsp i antet.jsp

Aceasta a fost metoda static de pasare a informaiei ntre pagini. De fapt, aici nu s-a
transmis nimic, dect comanda ca s fie incluse liniile fiierului antet.jsp n fiierul
welcome6.jsp.
S examinm n continuare modalitatea de pasare efectiv a parametrilor ntre dou
pagini.

Cum pasm parametrii ntre paginile JSP


Recurgem la obiectul implicit request i la dou metode ale sale, getAttribute() i
setAttribute(). Fiierul a1.jsp trimite fiierului b1.jsp valoarea parametrului titlu.
LISTA 3.2 Parametrul pasat ntre pagini

<html><body>
<%request.setAttribute("titlu", "Salutare!"); %>
<%@ include file=b1.jsp %>
<%-- Aici urmeaza alte linii ale fisierului a1.jsp -->
</body></html>

i
<head>
<title><%=request.getAttribute("titlu")%></title>
</head>

FIGURA 3.2 Aspectul ferestrei browserului dup rularea acestor dou pagini

Explicaii
Observai cuvntul Salutare afiat n titlul ferestrei. Pasarea are loc prin metodele
getAttribute() i setAttribute() ale obiectului request.

Diferena dintre jsp:include i jsp:forward


Exist i alt mod de pasare de valori a parametrilor ntre pagini i anume, prin etichetele
jsp:include i jsp:forward.
Notaia jsp:action este cunoscut sub numele de aciune standard. I se mai spune
etichet, deoarece se face un salt de la un program la altul. Sunt mai multe astfel de
etichete, dar ne referim doar la jsp:include, fr a-i arta sintaxa mai greoaie i la
jsp:forward, pentru care venim cu un exemplu practic.
Cu jsp:action apelm o pagin static (extensia .htm/.html) sau o pagin dinamic
(extensia .jsp) din pagina curent .jsp. Parametrii reali sunt pasai paginii apelate cu
eticheta jsp:param. Mai mult vedem n anexa B. O explicaie la cele scrise n aceast
anex se impune.
Eticheta jsp:include este nsoit de dou atribute, page i flush. Ambele sunt obligatorii.
Sintaxa este urmtoarea:
<jsp:include flush=true page=adresa_URL />

sau aa:
<jsp:include flush=true page=adresa_URL>
<jsp:param name=denumirea_parametrului value=valoarea_sa />
</jsp:include>

Pentru ambele descrieri sintactice se recurge la descrierea sintactic din XML. Cnd
observm o terminaie de genul />, nu urmeaz nici un corp. Precis nu cunoatei XML !
S o lum prin HTML. Cnd scriem fluxul:
<p>Acesta este un paragraf.</p>

observm un marcaj p cu cele dou balize. Corpul marcajului este textul n sine. Cnd
vrem s referim o poz, n HTML scriem aa:
<img src=poza>

Observai c dup aceast baliz nu mai este nici o alt baliz </img> . Nu urmeaz nici
un corp ntre cele dou balize. n HTML este permis aceast lejeritate. n XML, ea este
taxat drept eroare sintactic! i atunci nu se admite dect scrierea:
<img src=poza />

Deci dup /> nu urmeaz nici un corp.


S privim din nou cele dou forme sintactice ale etichetei jsp:include. La prima form
sintactic se merge pe ideea c nu pasm nici un parametru. A doua form sintactic are
n schimb un corp, pe rndul al doilea. Pe rndul al treilea apare iar denumirea, etichetei
precedat de o bar nclinat. Corpul este alctuit din una sau mai multe etichete
jsp:param. Cele trei puncte nseamn o posibil repetare a etichetei jsp:param. Fiecare
parametru are deci o astfel de etichet.
Deci paginii apelate putem s nu i trimitem la urma urmei nici un parametru, unul sau
mai muli parametri reali.
Fiecare etichet jsp:param are un nume logic de paramteru (name) i o valoare (value) a
acestuia.
S lmurim i diferena dinre jsp :include i jsp :forward. O pagin JSP genereaz un
flux de caractere ce sunt destinate clientului Web n ultima instan. Acesta, pn s
ajung la clientul Web, este stocat n mod temporar ntr-o zon tampon (buffer). Cnd
atributul flush are valoarea adevrat (true), are loc golirea forat a acestui tampon.
Pagina spre care este transferat controlul este anunat prin atributul page.
Privii acum figura 3.3.
FIGURA 3.3 Diferena dintre etichete jsp:include i jsp:forward (reproducere
din manualul devapp.pdf al Allaire JRun, varianta standard)

Diferena dintre jsp:forward i jsp:include este unde revine controlul. n cazul forward,
el nu mai revine la pagina apelant.
Iat un exemplu concret al directivei jsp:forward. Un proprietar de sit (comercial sau
Web) pleac n vacan. El vrea neaprat s treac la un aspect nou al sitului la o dat
care nimerete cnd se afl n vacan. Noul aspect l numim newFakeRoot, iar fostul
aspect, oldFakeRoot. Iat acum lista acestui exemplu:
LISTA 3.3 Pagina nachdatum.jsp

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


02. <%
03. // Exemplu de folosire a evaluarii la momentul executiei paginii tip jsp
04. // cu incepere de la data an luna zi ora min sec trec pe noul fake root
05. // al sitului web. Ich bin im urlaub!

06. String oldFakeRoot = "oldsite.html";


07. String newFakeRoot = "newsite.html";
08. // Creeaza doua instante
09. Calendar h = Calendar.getInstance();
10. Calendar m = Calendar.getInstance();
11. Date hDatum = h.getTime();
12. // Fixeaza momentul trecerii la noul aspect 11 iulie 2003, ora 10.30.00 pe obiectul m
13. m.set(2003,7,11,10,30,00);
14. // Citeste momentul curent
15. Date mDatum = m.getTime();
16. // Compara momentele; s-a ajuns la ora H?
17. boolean resultComp = hDatum.after(mDatum);
18. if ( resultComp ) { // sunt la data lansarii noului aspect al sitului sau dupa? %>
19. <jsp:forward page="<%=newFakeRoot%>" />
20. <% } else { // sunt la un moment anterior datei fixate de comutare a fakerutului! %>
21. <jsp:forward page="<%=oldFakeRoot%>" />
22. <% } %>
Explicaii i parafraze
Importm pachetele java.util.*. Declarm variabilele oldFakeRoot i newFakeRoot, care
vor puncta paginile de cas, deci nceputurile ierarhiilor directoarelor celor dou situri.
Pagina de cas a sitului vechi se numete oldsite.html, iar pagina de cas a sitului nou se
va numi newsite.html. Mai departe crem dou instane (h i m) de obiecte tip Calendar.
Cnd auzii exprimarea creeaz o instan..., maina virtual Java va aloca o zon de
memorie pe care o va pregti n mod corespunzator. Mai departe, se aloc variabilele
hDatum i mDatum. Se instaniaz i aceste dou variabile ca obiecte de tipul Date.
Obiectul m primete valoarea datei i orei cnd se va trece pe noua pagin de cas. n
mDatum se va depune aadar irul de caractere 11 iulie 2003, ora 10.30. Obiectul
hDatum trebuie creat i ncrcat cu momentul curent. Se compar cele dou iruri
hDatum cu mDatum. Cnd se ajunge la data i ora respectiv, se trece automat pe noul
aspect. Urmrii instruciunea de comparaie. Atunci coninutul variabilei resultComp va
fi mai mare dect 0, deci se va executa eticheta jsp:forward. Aici se va evalua dinamic
expresia <%=newFakeRoot%>.
Dup executarea saltului spre pagina newsite.html, controlul nu mai revine n pagina
chemtoare, nachdatum.jsp, cum s-ar fi ntmplat dac am fi folosit jsp:include.
n fond i la urma urmei ce este o pagin JSP? Este un text ablonizat format din
poriuni HTML i scenarii scrise n Java (sau JavaScript).

Despre obiecte implicite i explicite


Nou obiecte implicite
JSP opereaz cu obiecte implicite i explicite. Sunt nou obiecte implicite. Iat-le:
application (aplicaia), config (configurarea), exception (tratarea excepiilor, erorilor),
out (scrierea n pagina curent a unui flux de caractere), page (pagina), pageContext
(contextul paginii), request (cererea), response (rspunsul) i session (sesiunea). Ai
observat n exemplele date pn acum directiva import. Cu ea anunam JVM c avem
nevoie de o serie de clase. Clasele produc obiecte. Fiecare clas are cel puin unul sau
mai multe metode pe post de constructori, care servesc la crearea obiectului. Spunem: se
instaniaz obiectele!
n cazul obiectelor implicite, maina virtual Java este aceea care instaniaz din oficiu.
n cazul propriilor noastre clase sau a sutelor de clase, care nu sunt abstracte i aparin
unuia dintre pachetele Java, se recurge la operatorul de instaniere new.
Maina virtual Java import n mod automat patru pachete de baz. Un pachet conine
un set de clase aezate ntr-o ordine ierarhic.
Ele sunt: java.lang.*, javax.servlet*, javax.servlet.jsp* i javax.servlet.http*.
Nu ne intereseaz ce conin n detaliu.
Obiectul aplicaie
S dm drept exemplu o pagin unde recurgem la obiectul application. Din acest
exerciiu vom afla deosebirea dintre un obiect implicit (application) i obiectul explicit
(Date). Iat coninutul fiierului:
LISTA 3.4 Exemplu de folosire al obiectelor application i Date

<%@ page import="java.util.Date,java.text.DateFormat" %>


<html>
<head><title>Exemplu de obiecte implicite si explicite</title></head>
<body>
<table>
<tr>
<td>Numele serverului</td>
<td>"<%= application.getServerInfo() %>"</td>
</tr>
<tr>
<td>Specificatia reala de cale</td>
<td>"<%= application.getRealPath("/") %>"</td>
</tr>
<tr>
<td>Ora curenta</td>
<td>"<%= DateFormat.getTimeInstance().format(new Date()) %>"</td>
</tr>
</body></html>

Explicaii i parafraze
Lista se refer la un tabel banal care se conformeaz sintaxei venerabilului HTML. Prin
comanda import anunm maina virtual Java c vor fi utilizate metodele a dou clase
i anume, java.util.Date i java.text.DateFormat.
Clasa Date creaz un obiect cu acelai nume. Este un obiect explicit, dovad folosirea
operatorului de instaniere new. ntotdeauna cnd vedei acest cuvnt, s tii c s-a cerut
instanierea, adic generarea obiectului cu acelai nume. Deci notaia new Date()
nseamn apelarea constructorului clasei Date. Acesta aloc n memorie un spaiu
suficient pentru structura de date cerut de ctre obiect. Informaia n sine a acestui
obiect este o valoare egal cu numrul microsecundelor scurse de la 1 ianuarie 1970 ora
0 (meridianul Greenwich) pn n momentul apelului. Formatul acestei valori este un un
ntreg reprezentat pe un numr dublu de octei, 8 nu 4.
Cu ajutorul metodei format(), valoarea aceasta este transformat ntr-un ir de caractere,
unde apar data i ora.
Metoda getTimeInstance() aparine clasei java.text.DateFormat. Ea extrage doar ora. Ei
bine, i obiectul clasei java.text.DateFormat este tot unul de tipul explicit. Vei zice c
nu este, deoarece nu apare operatorul new, cum a fost n cazul de mai sus! V vom
rspunde aa: clasa DateFormat este o clas de un tip abstract. Aceasta nseamn ceva i
nu mai intrm n detalii. n acest caz nu este nevoie s fie instaniat cu new. O clas
care nu este abstract creeaz un obiect numai cu ajutorul constructorului, deci cu new.
Java posed destule clase abstracte. Din aceiai categorie a acestor clase abstracte face
parte i clasa Enumeration din exerciiul urmtor.
Obiectul application este tot unul de tipul abstract. De fapt toate cele nou obiecte au la
baz clase abstracte. i toate sunt la fel de importante. Pentru oricare din cele nou
obiecte implicite, maina JVM realizeaz automat instanierea. n exemplul analizat aici
se cer informaii despre motor i despre specificaia real de cale unde se afl el.
Motorul este un servlet, deci un fiier. Ca atare se afl ntr-un anume director. Pn la
acest director se urmeaz o cale prin ierarhia directoarelor. n cazul motorului Resin
privii rspunsul din figura urmtoare.

FIGURA 3.4a Rspunsul motorului Resin

Pentru motorul servlet JRun, observai aspectul ferestrei documentului n figur.

FIGURA 3.4b Rspunsul motorului JRun

Metoda getRealPath() ntoarce directorul unde se afl paginile JSP, care urmeaz ca s
fie transformate n servleturi.
n cazul motorului servlet Resin, directorul este c:/Resin1.1.4/doc. Directorul doc are
drept fiu pe directorul test. De aceea apare n adres i test.
n cazul motorului JRun 3.0 directorul este:
c:/Program Files/Allaire/JRun/server/default/default-app.
Deoarece exerciiul aplicdate.jsp se afl chiar n acest director, n adres nu mai apare
nici un alt director. Porturile celor dou motoare difer. JRun comunic cu browserul
client prin portul 8100, n timp ce Resin, prin portul 8080.
Obiectul implicit request
Iat acum un exemplu de folosire a obiectului implicit request cu unele metode ale sale.
Cu metoda getProtocol() se preiau valorile cmpurilor antetului protocolului http.
Programatorii Java denumesc aceste cmpuri, antete. Orice protocol are un antet format
din octe, cu tot felul de cmpuri. Fiecare cmp are o denumire i un anumit format.
Aplicaia nu face altceva dect s etaleze coninuturile acestor cmpuri. Se recurge la
obiectul clasei abstracte Enumeration.
LISTA 3.5 Fiierul aplicatie.jsp

01. <%@ page import="java.util.Enumeration" %>


02. <body>
03. <P>Iata numele protocolului folosit: <%= request.getProtocol() %>
04. <p>Si numarul portului: <%= request.getServerPort() %>
05. <p>Si valorile catorva antete:
06. <% // parcurge lista de denumiri de antete din obiectul request
07. Enumeration enumerare = request.getHeaderNames();
08. while (enumerare.hasMoreElements()) {
09. String headerName = (String) enumerare.nextElement(); %>
10. <LI><B><%=headerName%></B> = <%=request.getHeader(headerName) %>
11. <% } %>
12. </body></html>

FIGURA 3.5 Aspectul ferestrei documentului browserului pentru pagina aplicatie.jsp

Explicaii i parafraze
S privim liniile cu numerele 03 i 04. Cerem informaii despre protocolul folosit ntre
server i client ca i numrul portului. Apoi, se instaniaz o variabil denumit
enumerare (linia 07). Atunci cnd se execut instruciunea din linia 07, variabila
enumerare va conine o serie de iruri de caractere cu denumirile antetelor
protocolului HTTP.
Ca i for, i instruciunea while comand o bucl. Corpul ei (liniile 08-11) este delimitat
de dou acolade. n acest corp pot fi una sau mai multe instruciuni. Acestea sunt
executate atta timp ct este adevrat condiia de dup cuvntul while. Condiia se afl
ntre parantezele rotunde.
S descifrm condiia: atta timp ct n obiectul enumerare mai exist un element care
trebuie tratat preia acest element. Fiecare antet (element) este un ir de caractere.
Crem variabila headerName (linia 09). Aici prelum ir dup ir coninuturile antetelor
http, cu metoda nextElement().
Observai n figura de mai sus rspunsurile asupra crora nu ne oprim, deoarece sunt
destul de tehnice. Am recurs iniial la metoda getHeaderNames() a obiectului request.
Pentru obiectul denumit enumerare, al clasei Enumeration, vei remarca c nu am recurs
la instanierea explicit cu new. Totui JVM a efectuat instanierea i tii i de ce.
Conversii de tip, cast
Ce s nsemne oare cuvntul String scris ntre parantezele ronde din linia 09? Este o aa
numit conversie. Mai exact se transform tipul expresiei din dreapta semnului egal n
alt tip i anume cel aflat n stnga semnului egal, naintea denumirii variabilei.
n cazul exemplului, ceea ce rezult din expresia enumerare.nextElement() nu are
formatul unui ir. Pentru c n stnga semnului egal se ateapt un String, se aplic
aceast conversie. Nu orice conversie este admis. Nu intrm n detalii!
Comentarii n pagina JSP
S recapitulm puin diferitele tipuri de comentariilor n cadrul paginilor JSP.
Forma comentariului de tip text i eventual evaluarea expresiilor JSP este:
<!-- text, expresii JSP -->

Principalul scop este comentarea codului surs. El accept ns i prezena expresiilor


JSP, pe care le i evalueaz. Aceasta cel puin se poate observa n fereastra afiat pe
traseul View Source (browserul MSIE). De pild, dac scriem:
<!Aceasta pagina a fost generata la data de <%= (new
java.util.Date()).toLocaleString() %> -->

motorul servlet vede totui expresia JSP. n fereastra codului surs vom observa scris
Aceasta pagina a fost generata la data de 08 05 02 12:04:50. Deci se preia momentul
cnd se execut acest servlet la serverul Web.
Exist apoi comentariul ascunde cod care are forma:
<%- - fragment de scenariu scos din circuitul transformrii JSP n Java servlet -->

i este util n faza de punere la punct al unei pagini JSP. Orice fragment dintr-o pagin
JSP, ncadrat de cei doi delimitatori, va fi ignorat de ctre motorul servlet, inclusiv
expresiile tip JSP.
Ierarhii ale claselor n Java
Ca s nelegem aceste ierarhii fr a deveni mari cunosctori ai conveniilor Java, s
apelm iar la un exemplu din viaa de toate zilele.
S ne gndim la ora cu a sa forfot i cu al su aer poluat, cu numrul tritorilor din
cuprinsul su pe timpul zilei i al nopii. S-i atribuim oraului rangul de obiect generic.
Strada este o subdiviziune a oraului. Ea poate fie mai larg, mai ngust, poate avea
diverse debite orare de vehicule de-a-lungul a 24 ore. Obiectul strada motenete de la
obiectul ora poluarea, forfota. Introduce o caracteristic nou i anume, unde se afl n
ora, n zona ultracentral, central .a.m.d.
Blocul se afl pe o anumit strad la o anumit adres. Obiectul bloc motenete de la
strad i ora toate caracteristici de pn aici i n plus adaug adresa individual,
numrul de etaje, cu sau fr curte, cu sau fr scuar etc.
Observai deci o ierarhie a obiectelor n natur. Pe msur ce coborm tot mai jos pe
scara ierarhic, apar obiecte i mai precis conturate. Obiectul generic, oraul, avea o
serie de proprieti po1, po2. Obiectul strada motenete aceste proprieti i mai adaug
altele: ps1, ps2, .a.m.d.
Programarea orientat pe obiecte (POO) are n vedere astfel de reprezentri precum:
oraul, strada, blocul. Obiectele s-au nscut datorit unor planuri, unei experiene ce
conduce la construcia ablonului, datorit arhitecilor. S spunem acestei experiene
metod.
Revenim la POO. Metodele aparin unei clase. Clasa este alctuit din abloane i
metode, deci inteligen, experien n realizare. V-ai prins deci!
i n platforma Java exist un ntreg arbore genealogic al claselor. Clasele deriv unele
din altele.
Obiectul exception
S ne ocupm acum de obiectul exception. S ne nchipuim c vrem s producem n
mod deliberat o eroare de program, pe care s o trateze obiectul exception. Redm lista
exemplului. Mai nti fiierul exception_apel.jsp, unde am declarat variabila denumit d
n formatul dubl precizie cu o valoare foarte mic, 10-324:
LISTA 3.6a Pagina exception_apel.jsp

<%@ page errorPage="exception.jsp" %>


<html><body>
<%
// exceptie de depasire
double d = 1.0E-324;
%>
</body></html>

i imediat pagina de tratare a erorii, exception.jsp:


LISTA 3.6b Pagina exception.jsp

<%@ page isErrorPage="true" %>


<html>
<body>
<p>Producem o eroare deci recurgem la obiectul exception si pagina
pregatita in acest sens</p>
<br><%= exception %>
</body></html>
Rezultatul este redat n figura de mai jos.

FIGURA 3.6 Aspectul ferestrei n cazul Resin 1.1.4

Explicaii i parafraze
Ce se ntmpl aici. Aceast foarte mic valoare nu poate fi reprezentat n Java. Ca
atare, declaraia de la nceputul listei anun maina virtual c exist o rutin care se
ocup de interceptarea excepiilor. Denumirea rezervat a parametrului din directiva
page este cuvntul errorPage, scris neaprat cu P mare!
Pagina JSP, care are misiunea de interceptor de erori, va avea obligatoriu atributul
isErrorPage n directiva page. Observai maniera de scriere. Primul cuvnt este scris cu
litere mici, urmeaz apoi cuvinte alipite scrise fiecare cu litere mari. nc ceva: observai
valoarea true, adevrat, n dreapta semnului egal:
<%@ page isErrorPage="true" %>

Deoarece acest element nu poate fi reprezentat, datorit atributului true, JVM preia
tratarea excepiei de date depire de valoare la limita inferioar de reprezentare a
numerelor reale, underflow i implic i pagina noastr. Remarcai insipidul mesaj de
eroare. ntre multele sale cuvinte apare i numeric underflow.

La final de capitol
n acest capitol:
1. Am studiat mecanismul includerii cu ajutorul directivei include file.
2. Apoi a venit rndul lmuririi rostului etichetelor jsp:include i jsp:forward. Mai
puin am vorbit despre eticheta jsp:param (vezi i anexa B).
3. Am enumerat denumirile celor nou obiecte implicite.
4. Am scos n eviden diferena dintre un obiect implicit i unul explicit.
5. Am lmurit ce este instanierea.
6. Ne-am ocupat de obiectul aplication. Desigur am ntlnit o parte dintre metodele
acestui important obiect.
7. Am scos n eviden deosebirea dintre obiectul explicit Date i obiectul abstract
DateFormat.
8. Ne-am referit apoi la obiectul request i la unele dintre metodele sale. Ne-am
ntlnit cu anteturile protocolului HTTP i cu o clas abstract denumit
Enumeration.
9. Am avut prilejul prezentrii conversiei de tip cast.
10. A venit apoi rndul formatelor pentru comentariul din cuprinsul paginilor JSP.
11. A urmat explicarea conceptului de ierarhie a obiectelor i motenirea unora
dintre proprietile acestora.
12. i am ncheiat cu prezentarea obiectului exception.
4
Capitolul

Generarea irurilor de interogare,


a formularelor i a cadrelor
Ne propunem s v artm cum se pot genera iruri de interogare. Ne ntlnim
i cu o aplicaie mai lung. Rostul ei este de a nscrie pe vizitatori unui sit.
nscrierea se face pe baz de formular. Ca s fie mai ergonomic, vizitatorul vede
formularul n cadrul de sus, iar n cadrul de jos apar eventuale mesaje de
eroare, dac l-a completat greit. Desigur, n caz de reuit, va fi ntiinat despre
o tombola cu premii. Deci vom vedea paginile care administreaz aceste dou
cadre tip HTML (frames).

Generarea irurilor de interogare

U
n ir de interogare este un ir de caractere creat i alipit la adresa n stil URL. El
pleac la servlet cnd vizitatorul a selectat acea legtur de tip hypertext.
Probabil c v-ai ntrebat, cnd ai colindat situl www.google de pild, ce sunt
acele iruri interminabile de caractere, care apar n partea de jos a ferestrei browserului.
Aceasta se ntmpl cnd punctai cu mausul o legtur de tipul hypertext spre o adres
URL i, s-a ataat acesteia un astfel de tren de caractere.
Ei bine, aici v artm cum facem ca s trimitem aceste iruri de caractere la servlet.
Firete, exemplul este doar unul didactic. Iat exerciiul:
LISTA 4.1 Pagina fruct1.jsp

<html>
<body>
Fructul meu favorit este:
<UL>
<LI><a href="fruct2.jsp?fruct=pepene">pepene</a>
<LI><a href="fruct2.jsp?fruct=struguri">struguri</a>
<LI><a href="fruct2.jsp?fruct=mar">mar</a>
<LI><a href="fruct2.jsp?fruct=mar&fruct=par">mar si par</a>
</UL>
</body>
</html>

Explicaii i parafraze
Este o banal pagin HTML. Baliza <UL> anun o list de denumiri. Fiecare element
al listei este marcat prin cte o baliz <LI>. Ceea ce este important urmeaz acum.
Observai c imediat n dreapta balizei <LI> apare baliza <a href=...>hot link</a>. Ce
remarcai de pild la legtura:
<LI><a href="fruct2.jsp?fruct=pepene">pepene</a>

Faptul c imediat dup jsp urmeaz semnul ntrebrii apoi irul de caractere:
fruct=pepene. Cnd selectm cu mausul legtura tip hypertext, n partea de jos apare
acest ntreg ir dintre ghilimele, pe care l vom denumi specificaie URL complet.
Mai observai ceva: denumirea servletului care va trata aceste iruri de interogare este
fruct2.jsp.
Lista acestei pagini este mai jos. Ea recurge la metoda getParameterNames(). Aceast
metod ntoarce un obiect de tipul Enumeration. Cu acest gen de obiect ne-am ntlnit n
capitolul anterior. Acolo l-am denumit enumerare. Nu-i nimic! Aici s l denumim
e. Variabila nume_sir va prelua pe rnd denumirile elementelor.
Se spune c se analizeaz. (parsing) pas cu pas acest ir de catene
atribut=valoare&atribut=valoare ... .
n cazul de fa irul nu a fost format dect dintr-un singur caten atribut=valoare. n
schimb pentru legtura:
<LI><a href="fruct2.jsp?fruct=mar&fruct=par">mar si par</a>

sunt dou catene cuplate prin semnul &. Operatorul & ca notaie se conserv n multe
limbaje. Este operatorul care servete pentru alipirea a doi literali. Este folosit i n ASP,
nu numai n Java sau JSP. Pe ecran vedem marcat cu alt culoare legtura de tip
hypertext: mar si par. Nu am scris-o cu literele noastre naionale, deoarece nu am recurs
la pagina de cod ISO-8859-2. Deci paginii fruct2.jsp i va parveni acum irul de
interogare:
fruct2.jsp?fruct=mar&fruct=par

Metoda getParameterNames() va detecta aceste dou catene, atribut=valoare desprite


de semnul &.
Masive de date
Ce rost are masivul de date notat aa: valori[]? El preia valorile catenelor. Masivul va
cpta din mers dimensiunea doi, cnd am ales cu mausul legtura mr i pr.
Dimensiunea sa se stabiliete dinamic. Primul element al masivului valori va conine
mr iar al doilea, pr.
Cum tie bucla for s se opreasc dup cele dou elemente n mod automat?
Expresia valori.length() va comunica buclei for s se execute de exact dou ori.
Variabila lista_de_valori este o zon de tip ir (String). Aici se construiete pas cu pas
un ir de caractere, care const din aceste valori. Nu se preia fruct=mar, ci numai mar.
Dar dup mar apare o virgul.
Rulai i dumneavoastr acest exerciiu. Aici nu mai redm aspectul ferestrei.
LISTA 4.2 Pagina fruct2.jsp

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


<%
for (Enumeration e = request.getParameterNames(); e.hasMoreElements(); )
{
String nume_par = (String) e.nextElement();
String[] valori = request.getParameterValues(nume_par);
String lista_de_valori = valori[0];
for (int i = 1; i < valori.length; i++)
{ //iau la rand valorile din catenele nume = valoare
lista_de_valori += ", " + valori[i];
}
out.println("<br>" + nume_par + " = " + lista_de_valori);
}
%>

Explicaii i parafraze
Instruciunea out.println() va afia coninutul variabilei lista_de_valori.
Ce se ntmpl dac legtura este format din mai multe cuvinte. Aceasta d probleme
unor browsere. MSIE nu are probleme. El substituie fiecare spaiu dintre cuvinte (cazul
pepene galben) cu cte un semn plus. Netscape Communicator (versiunile mai vechi,
cum este de pild versiunea a cincea) se oprete la primul spaiu.
Ca s nu se ntmple acest lucru, se va apela la metoda encode() a clasei
java.net.URLEncoder. La ntlnirea unor caractere speciale, cum este spaiul, se produce
o substituire. n locul spaiului se trimite o secven escape alctuit din trei caractere i
anume: % 2 i 0, deci %20.
Tabelul de mai jos red o parte din aceste caractere speciale i ce caractere se trimit
serverului.
TABELUL 4.1 Secvene escape ale unor caractere speciale
din specificaile URL complete

Caracterul special Secvena escape Caracterul special Secvena escape


Spaiu %20 sau semnul plus ; %3B
! %21 < %3C
%22 = %3D
# %23 > %3E
$ %24 ? %3F
% %25 [ %5B
& %26 \ %5C
( %28 ] %5D
) %29 ^ %5E
Caracterul special Secvena escape Caracterul special Secvena escape
+ %2B %60
/ %2F { %7B
: %3A | %7C
; %3B } %7D
< %3C ~ %7E

n continuare, redm lista integral a paginii fruct4.jsp.


LISTA 4.3 Pagina fruct4.jsp

<%@ page import="java.net.URLEncoder" %>


<!-- Tratare corecta a valorilor care sunt alcatuite din cuvinte separate prin spatiu -->
<!-- Trebuie daca se executa acest jsp cu Netscape Communicator nu cu MSIE! -->
<html>
<body>
Fructul meu favorit este:
<UL>
<LI><a href='fruct2.jsp?fruct=<%=URLEncoder.encode("pepene
galben")%>'>pepene galben</a>
<LI><a href="fruct2.jsp?fruct=struguri">struguri</a>
<LI><a href="fruct2.jsp?fruct=mar">mar</a>
<LI><a href="fruct2.jsp?fruct=mar&fruct=par">mar si par</a>
</UL>
</body>
</html>

Explicaii
Ea nu difer mult de lista anterioar, fruct1.jsp. Singurul element nou este directiva page
unde se import clasa posesoare a metodei encode i aplicarea ei doar la prima legtur,
unde apar dou cuvinte, pepene galben.
Acum urmeaz un exerciiu mai lung.

Generarea unui formular i a cadrelor


S ne ocupm de crearea unui sit denumit MyPisi.com. Acesta nscrie vizitatori pe baza
completrii unui formular. Fereastra documentului este mprit n dou cadre (frames).
Cadrul superior afieaz formularul unde vizitatorul i nscrie datele sale personale. El
va participa la o tombol cu premii. Ca atare, trebuie s completeze neaprat rubricile
(cmpurile) acestui formular. Rspunsurile nu sunt memorate n vreo baz de date ci,
sunt afiate n cadrul situat n partea de jos a ferestrei documentului. Aspectul ferestrei l
vedei n figura 4.1a. Am mers pe aceast compromis ca s nu complicm lucrurile i aa
complicate!
Se poate observa c vizitatorul a uitat s completeze unele rubrici obligatorii. Ca atare,
va fi ntinat prin mesaje adecvate n cadrul de jos. Tot n acest cadru, vizitatorul va fi
ntiinat de rspunsurile date, ce vor fi luate n considerare la tombol. Firete, nu a fost
vizibil ntregul formular n aceast figur ca i mesajele din cadrul din partea de jos.
Situl este alctuit din trei pagini JSP: una pentru crearea celor dou cadre, denumit
mypisi.jsp, una denumit mypisi_formular.jsp. Ea afieaz formularul. Ultima list,
mypisi_raspunsuri.jsp, conine eventualele mesaje prin care se atrage atenia
vizitatorului c nu a completat unele rubrici. Dar tot n acest fiier se trateaz i cazul
cnd el a completat corect formularul. Doar prima list este redat complet. Celelalte
fiiere fiind lungi, le-am prezentat doar parial.

FIGURA 4.1a Aspectul ferestrei sitului MyPisi.com

Aadar iat prima list:


LISTA 4.4a Pagina mypisi.jsp

<HTML>
<HEAD>
<TITLE>mypisi.com - Versiunea cu cadre</TITLE>
</HEAD>

<FRAMESET ROWS="300,*" BORDER="Yes">


<FRAME NAME="form" SRC="mypisi_formular.jsp" SCROLLING="Auto"
FRAMEBORDER="yes">
<FRAME NAME="results" SRC="mypisi_raspunsuri.jsp" SCROLLING="Auto"
FRAMEBORDER="No">
</FRAMESET>
</HTML>

Explicaii i parafraze
Distingem titlul ferestrei documentului. Prin baliza <FRAMESET> anunm c sunt
dou cadre. Primul este tratat de fiierul mypisi_formular.jsp, iar cadrul de jos, de ctre
mypisi_raspunsuri.jsp. Ambele cadre vor afia automat barete de defilare (scroll), dac
dimensiunea cadrului va fi mai mare dect poriunea din ecran destinat ferestrei
respective. Cadrul superior are chenar, cellalt de jos, nu.
Trecem la lista mypisi_formular.jsp al crui coninut l redm pe parcurs.
Formularul este anunat aa :
<FORM NAME='form1' ACTION='mypisi_raspunsuri.jsp' TARGET='results'
METHOD='POST'>

El are denumirea logic form1. n atributul ACTION este menionat servletul. El va


analiza valorile completate de vizitator. S-a recurs la metoda de tratare POST. Metoda
adaug specificaiei URL imediat dup semnul ?, catene unite prin caracterul &. O
caten arat aa:
denumire_logic_de_cmp = valoare

Privii figura. n partea de deasupra este redat efigia sitului. Ea este aezat centrat. De
aceea se recurge la baliza <DIV>. Poza ocup o zon de 200 pe 80 pixeli. n caz c
browserul client nu o poate reda, el fiind unul de tipul negrafic sau, poate vizitatorul i-a
dezactivat facilitatea de redare grafic, atunci va aprea mesajul genericul sitului.
<DIV ALIGN="center">
<IMG SRC="images/peisaj.jpg" WIDTH="200" HEIGHT="80" ALT="[genericul
sitului]" BORDER="0">
</DIV>

Cmpurile sunt: unul nevizualizat aici (tipul hidden), al doilea, numele de familie, apoi
prenumele participantului, mai departe codul su numeric personal, sexul, adresa sa de
e-mail, cele dou parole ale csuei potale, un mic loc rezervat unui rspuns al
vizitatorului ce va face cu PC-ul ctigat. Iat partea a ntia a formularului:
LISTA 4.4b Partea a ntia a formularului, pagina mypisi_formular.jsp

<TABLE CELLPADDING=3 CELLSPACING=0 BORDER=0 WIDTH=600>


<THEAD>
<TH COLSPAN=2>Va multumesc ca vizitati situl MyPisi.com unde veti
completa datele ca sa participati la urmatoarea tombola cu premii. Mult
noroc!<P></P>
</TH>
</THEAD>
<TR>
<TD>Numele de familie:</TD>
<TD><INPUT TYPE='text' NAME='nume' VALUE=''></TD>
</TR>

<TR>
<TD>Si codul numeric personal al dvs.:</TD>
<TD><INPUT TYPE='text' NAME='cnp' VALUE=''></TD>
</TR>
<TR>
<TD>Sexul:</TD>
<TD><INPUT TYPE='radio' NAME='sex' VALUE='masc'>masc &nbsp;
<INPUT TYPE='radio' NAME='sex' VALUE='fem'>fem
</TD>
</TR>
<TR>
<TD>Email:</TD>
<TD><INPUT TYPE='text' NAME='email' VALUE='></TD>
</TR>

Explicaii i parafraze
Tabloul nu are chenar (BORDER=0) are 600 pixeli lime i un antet. Atributele NAME
conin denumirile logice ale fiecrei rubrici.
Codul numeric personal (cnp) va fi verificat i trebuie s aib neaprat cele 13 cifre.
Majoritatea rubricilor sunt de tip text, fr o valoare anume preafiat.
Rubrica sex este de tipul buton radio (vezi anexa A) i are dou opiuni. Nici una dintre
acestea nu este selectat de la nceput. n schimb, opiunile au denumirile logice masc i
respectiv fem. Lng aceste opiuni este desenat cte un cercule (de unde i denumirea
de radiobutton). Observai prescurtrile masc i respectiv fem, din faa cerculeelor.
Urmtoare rubric se refer la adresa de e-mail. Servletul va verifica formatul uzual al
csuei potale. Csua se cere a fi completat, deoarece utilizatorul va opta sau nu
pentru trimiterea mesajelor cu caracter promoional sau, pur i simplu pentru a fi
ntiinat c a ctigat PC-ul la tombol!
Urmeaz dou cmpuri, fiecare cu regim de parol (password). Este parola csuei
potale. Tot ce tastai aici va fi afiat prin asteriscuri.
Acum s privim partea a doua a formularului. Pe aceasta o reproducem integral.
LISTA 4.4c Partea a doua a formularului, fiierul mypisi_formular.jsp

<TR>
<TD>Ce veti face cu PC-ul daca il castigati?</TD>
<TD><TEXTAREA NAME='destinat' VALUE='raspundeti' COLS=30
ROWS=5></TEXTAREA></TD>
</TR>
<TR>
<TD COLSPAN=2><INPUT TYPE='checkbox'
NAME='send_promo'><B>Da, as
dori sa imi trimteti mesaje promotionale prin email!</B>
</TD>
</TR>
<TR>
<TD ALIGN='center'>
<INPUT TYPE='reset' VALUE='Sterg formular'>
</TD>
<TD ALIGN='center'><INPUT TYPE='image' SRC='images/letmewin.jpg'
HEIGTH='300' WIDTH='120' BORDER=0></TD>
</TR>
</TABLE>
</FORM>
Explicaii i parafraze
Distingem cmpul HTML de tipul textarea. Aici vizitatorul va rspunde eventual la
ntrebarea pus. Este primul dintre cmpurile opionale.
Urmtorul cmp, tot opional, are denumirea logic send_promo. Are tipul casetei de
bifare, checkbox. Ocup ambele coloane ale tabelului (COLSPAN=2). Aici vizitatorul
opteaz ntre a primi sau refuza mesajele promoionale.
Ultimele resurse grafice ale formularului sunt: un buton tip reset, pentru tergerea
rubricilor formularului. Al doilea nu este un buton tip submit ci o poz. De regul tiai
c prin clic pe un buton de tipul submit se trimit datele formularului (deci irul de
interogare) la serverul Web. Ei bine, aici am renunat aparent la un astfel de buton. Fiind
ns ultima resurs a formularului, va fi considerat automat buton de tip submit! Sigla
este denumit letmewin.jpg i se afl n directorul images. Acest subdirector este fiul
directorului ce gzduiete cele trei pagini ale sitului. Sigla este centrat i are 300 pe 120
pixeli. Nu este afiat n chenar (BORDER=0).
S ne ocupm i de scriptletul unde apare codul pur Java. Acesta este coninut n fiierul
mypisi_raspunsuri.jsp. Iat-l:
Lista 4.5a. Prima parte a listei servletului mypisi_raspunsuri.jsp

<%
String afisareContinut = "";
String mesajEroare = "";
boolean bSucces = false; // in caz de reusita a completarii formularului
String vizitator = getValues( request, "vizitator" );
String nume = getValues( request, "nume" );

String cnp = getValues( request, "cnp" );
String sex = getValues( request, "sex" );
String email = getValues( request, "email" );

String cuvant_secret_confirm = getValues( request, "cuvant_secret_confirm" );
String destinat = getValues( request, "destinat" );

Explicaii i parafraze
Mai sus declarm dou variabile de tip ir afisareContinut i respectiv mesajEroare.
Fiecare din ele nu conin nici un caracter la nceput. Variabila bSucces are tipul logic.
Remarcai convenia de notaie i anume litera b, de la boolean, chiar n faa denumirii.
Bineneles c nu acest b confer acestei variabile tipul logic ci, cuvntul cheie boolean.
Variabila este poziionat iniial pe valoarea logic false.
Urmeaz o serie de declaraii de variabile de tip ir. Remarcai coincidena denumirilor
acestor variabile cu denumirile logice ale cmpurilor formularului att ct au fost
ilustrate n listele de mai sus. Ceea ce a completat vizitatorul n fiecare rubric este
preluat de metoda getValues(). Aceasta are un scop extrem de ergonomic i anume,
menine permanent pe ecran rspunsurile deja date, neoblignd pe vizitator ca s
recompleteze tot formularul de la nceput, dac a greit sau a uitat un cmp obligatoriu.
n continuare, redm lista cu partea de prelucrare pas cu pas a valorilor preluate din
rubricile formularului. Iat-o:
LISTA 4.5b Partea a doua a paginii mypisi_raspunsuri.jsp
// Prelucrare valori ale campurilor ajumse la server
if( "POST".equals(request.getMethod()) ) {

// Realizeaza validarea campurilor


if( nume.equals("") ) {
mesajEroare += "<LI>Trebuie sa specificati numele dvs. de familie.!";
}

if( cnp.equals("") ) {
mesajEroare += "<LI>Trebuie sa specificati codul numeric personal!";
}
if( cnp.length()!= 13 ) {
mesajEroare += "<LI>Codul numeric personal obligatoriu are 13 cifre!";
}

if( email.equals("") ) {
mesajEroare += "<LI>Trebuie sa specificati numele casuta dvs. de email.";
// email prezent, dar e necesar sa vad daca nu ati pierdut pe drum caracterul @
} else {
int atPos = email.indexOf('@');
// Format gresit daca nu-s '@' + '.' dupa semnul '@'
if( atPos == -1 || email.indexOf('.',atPos+2) == -1 ) {
mesajEroare += "<LI>Va rog o adresa corecta de email!";
}
}
if( cuvant_secret.equals("") ) {
mesajEroare += "<LI>Trebuie neaparat parola dvs.!";
}

if(!cuvant_secret.equals(cuvant_secret_confirm) ) {
mesajEroare += "<LI>Trebuie NEAPARAT ca parolele sa se potriveasca!";
}

// Exista cel putin un mesaj eronat, le adaug la antet spre a le anunta vizitatorului
if(!mesajEroare.equals("") ) {
mesajEroare = "<P>Va rugam corectati urmatoarele erori ca sa puteti participa la
concurs cu PC-ul castigator</P>" + mesajEroare;
} else {
// Fara erori, seteaza flagul ca sa afisezi raspunsurile date de vizitator
bSucces=true;
afisareContinut = " +
"<BR><B>Numele de familie:</B> " + nume +

"<BR><B>Email:</B> " + email +
"<BR><B>Parola:</B> (nu putem reda parola introdusa pentru motive de
secu., dar s-ar putea sa fie blah" + cuvant_secret + "blah)" +

"<BR><B>Sa va trimitem mesaje promotionale:</B> " + send_promo;
}
} // if POST
%>
Explicaii i parafraze
Mai nti prin instruciunea
if( "POST".equals(request.getMethod()) ) {

ne asigurm c metoda de transmitere folosit este metoda POST.


Apoi vedem dac a rmas necompletat vreo rubric. n caz afirmativ, variabila
mesajEroare va alipi mesajul adecvat la alte mesaje deja nscrise n aceasta.
Remarcai ceva la instruciunile care se ocup de rubrica cnp. Se verific lungimea
irului cnp prin metoda length(). n caz c nu s-au introdus exact 13 caractere, se alipete
n mesajEroare mesajul: Codul numeric personal obligatoriu are 13 cifre!.
Acum s ne concentrm atenia asupra cmpului relativ la csua potal. Cu funcia
indexOf(), se caut caracterul @ din ir. El trebuie ca s fie neaprat prezent, altfel
variabila atPos va conine valoarea -1. Se mai verific tot cu aceiai metod prezena a
cel puin unui punct n irul adresei. Att indexOf() ct i length() aparin clasei String.
Deci formatul adresei csuei potale ar trebui s fie cel puin aa:
nume@domeniu.server
Instruciunea:
if(!cuvant_secret.equals(cuvant_secret_confirm) ) {
mesajEroare += "<LI>Trebuie NEAPARAT ca parolele sa se potriveasca!";

are menirea de a vedea dac cele dou cmpuri au acelai coninut. n caz contrar,
variabila mesajEroare va prelua mesajul.
Prin intruciunile:
if( ! mesajEroare.equals("") ) {
mesajEroare = "<P>Va rugam corectati urmatoarele erori ca sa puteti participa la
concurs cu PC-ul castigator</P>" + mesajEroare;

analizm dac variabila mesajEroare a rmas vid, deci vizitatorul nu a completat greit
formularul. Semnul mirrii situat n faa denumirii spune acest lucru: dac variabila
mesajEroare nu este vid, deci exist mesaje de eroare aici, se va afia Va rugam
corectati urmatoarele erori ca sa puteti participa la urmat de mesajele acumulate n
variabila mesajEroare. n cazul c variabila mesajEroare este vid, deci formularul e
completat fr greeal, bSucces va primi valoarea logic adevrat. n acest caz, n
variabila afisareContinut vor apare toate rspunsurile date de vizitator (ca n figura
4.1b).
S urmrim acum partea a treia a listei fiierului mypisi_raspunsuri.jsp:
LISTA 4.5c Partea a treia a paginii mypisi_raspunsuri.jsp

01. <HTML>
02. <HEAD>
03. <TITLE>My Pisi Paradise!</TITLE>
04. <STYLE>
05.
06. </STYLE>
07. </HEAD>
08. <BODY>
09. <%// Afiseaza mesaj de eroare daca bSucces e nul, deci ceva e in
neregula
10. if(!bSucces ) { %>
11. <TABLE CELLPADDING=3 CELLSPACING=0 BORDER=0 WIDTH=600>
12. <TR><TD CLASS='red' COLSPAN=2><%=mesajEroare %></TD></TR>
13. </TABLE>
14. <%// Altfel afiseaza raspunsurile
15. } else { %>
16. <H3>Va multumim pentru ca ati avut rabdare sa completati formularul cu
informatie! Fiti pe faza! Redam raspunsurile date de dumneavoastra.</H3>
17. <%=afisareContinut %>
18. <% } // if!bSucces%>
19. </BODY>
20. </HTML>

Explicaii i parafraze
Ce remarcai mai sus? Mai nti marcajele unei foi de stiluri (liniile 04 i 06) pe care nu
o mai redm. Apoi faptul c inspectm variabila bSucces (linia 10). Dac formularul a
fost corect completat, bSucces va avea valoarea true. Deci nu se va afia partea cu datele
de eroare ci acel text plasat ntre balizele <H3> ... </H3> (linia 16). Dup aceea ar urma
s ntiinm pe vizitator despre datele concrete referitoare la tombol. Aceasta o facem
referindu-ne la afisareContinut (linia 18).

Limbajul Java amar precum cafeaua!


Acum a venit i rndul prezentrii metodei getValues(), redat n ultima parte a paginii
mypisi_raspunsuri.jsp:
LISTA 4.5d Ultima parte a paginii mypisi_raspunsuri.jsp,
metoda getValues() redat parial

<%!
// Folosesc o metoda de convenienta in loc sa tot initializez valoarea asumata cu ""
de fiecare data
public String getValues( HttpServletRequest request, String nume )
{
return getValues( request, nume, "" );
}

public String getValues( HttpServletRequest request, String nume, String


defaultValue )
{
String val_de_retur = defaultValue;
String valori[] = request.getParameterValues( nume );
// Nici o valoare nu a fost furnizata
if( valori == null ) {
// Nu faci decat sa preiei valoarea asumata a variabilei
val_de_retur
// Furnizata numai o valoare
} else if( valori.length == 1) {
val_de_retur = valori[0].trim();

}
return val_de_retur;
}
%>

Explicaii i parafraze
Aparent, observai dou abloane ale metodei getValues(). Primul ablon are o list cu
dou argumente fictive, n timp ce al doilea, o list cu trei argumente fictive! Nu este
nici o diferen ntre exprimarea argument fictiv i parametru fictiv! Acestui ablon,
programatorul Java i spune n englez method signature, semntura metodei!
Metoda este public, adic este accesibil din exteriorul fiierului, dovad prezena
cuvntului cheie public din fiecare ablon. Metoda ntoarce un rezultat de tipul ir de
caractere (String). Imediat dup denumirea metodei, urmeaz lista de parametri fictivi.
Primul este obiectul denumit request. I-am lsat denumirea neschimbat n englez.
Puteam s l denumim i altfel! Obiectul aparine clasei HttpServletRequest. ntruct am
redat parial aceast list, trebuie s ne justificm cu o explicaie totui clar!
Dac ai instalat un motor servlet, atunci n cadrul mainii virtuale Java instalate odat
cu J2SE, va fi adugat un grup suplimentar de clase. Acestea se ocup de protocoalele
transport. Exist o clasa general a servleturilor denumit GenericServlet. Ea este
destinat servleturilor care nu recurg la un anume protocol. n cazul de fa este folosit
protocolul http. V reamintim c la acest exemplu, indiferent motorul folosit (Resin,
Jrun au altul), specificaia URL ncepe mereu cu http://...
Aceast clas generic GenericServlet are drept fiu clasa HttpServlet. La rndu-i, ea
folosete dou obiecte implicite, cerere, deci request, i rspuns, response. n exemplul
de fa nu avem nevoie dect s prelum datele completate de vizitator, deci cererea sa.
Metoda getValues() mai are un al doilea parametru fictiv denumit nume. De pild,
remarcai linia:
String cnp = getValues( request, "cnp" );

din lista 4.5a. Se apeleaz metoda getValues() prin ablonul cu doi parametri fictivi,
specificnd c ne trebuie doar cmpul cu denumirea cnp.
n momentul apelului se intr n primul grup de acolade, unde exist o singur
instruciune:
return getValues( request, nume, "" );

De fapt apelm metoda getValues() pentru trei parametri fictivi. Este adevrat c se
execut o instruciune return. Dup cuvntul return ar trebui s urmeze eventual un
nume de variabil. n locul lui, ne-am referit direct la rezultatul ntors de ctre metoda cu
trei parametri.
Acum n ce const trucul! Al treilea parametru fictiv primete valoarea . Deci de fapt
nscriem un ir vid n rubric, adic tergem rubrica. Ce face acum servletul? El se
pregtete pentru primirea unui alt coninut, nscris de vizitator. n acest timp,
formularul e permanent afiat. Umple, schimb coninutul rubricilor pn la apsarea
tastei Enter.
Cnd apas aceast tast (aciunea echivaleaz cu trimiterea napoi la serverul Web a
noilor valori), la servlet sosete un nou ir de interogare cu coninutul cel nou. Cnd se
execut instruciunea:
String cnp = getValues( request, "cnp" );

metoda getValues() i face datoria n mod docil!


S ptrundem n corpul metodei cu trei parametri fictivi. Primul lucru pe care l face,
este s atribuie variabilei val_de_retur valoarea parametrului fictiv, defaultValue. Dar n
variabila defaultValue s-a ncrcat irul vid. Apoi se preia coninutul prin intermediul
metodei getParameterValues().
Cnd vizitatorul apas pe tasta Enter, se trimit absolut toate valorile cmpurilor
formularului, nu numai cel al cnp! Deci sosesc la servlet att valorile deja introduse ct
i cele abia modificate i, desigur chiar i cele nc neintroduse! Cum aa? Da!
Vizitatorul s-a grbit, nu a mai completat tot formularul, i a apsat pe Enter. n stnga
semnului egal al instruciunii:
String valori[] = request.getParameterValues( nume );

se ateapt un masiv denumit valori datorit metodei getParameterValues(), care


ntoarce o adres la o zon unde vor fi nscrise coninuturile rubricilor formularului.
Observai cele dou paranteze drepte, imediat dup denumirea masivului. Aceasta spune
c variabila valori este un masiv. Programatorii spun variabilelor simple variabile
scalare. La nceput masivul nu are nici un element. Fiindc n faa denumirii valorii
apare cuvntul cheie String, va avea tipul ir de caractere.
Ce se ntmpl dac o rubric ar conine mai multe cuvinte spearate prin spaii? De
pild, cmpul unde se rspunde ce va face n caz c a ctigat. La momentul trimiterii
cuvintelor, se produce o transliterare. n locul spaiilor apar semne plus ntre cuvinte.
n rubrica Ce vei face cu vizitatorul a rspuns cu nu stiu. La server se trimite
fluxul nu%2Bstiu. Conform tabelului 4.1, %2B este atribuit semnului plus. Unde a
disprut el dintre cuvintele nu i stiu ? MSIE l-a eliminat mai nainte de a se reda
valoarea acestui cmp.
Desigur, n cazul celorlalte cmpuri coninutul este alctuit dintr-un singur cuvnt. Poate
doar cmpul prenumelui s aib mai multe cuvinte. Din list am eliminat o parte a
codului surs spre a nu complica lucrurile.
FIGURA 4.1b Aspectul ferestrei sitului MyPisi.com

La final de capitol
Aici ne-am ocupat de metodele care ajut la analizarea irurilor de caractere de
interogare. Ne-am ocupat de metoda getParameterNames() a obiectului request, apoi de
metoda length() obiectului String.
A venit apoi rndul tratrii corecte a irurilor unde se recurge la caractere neacceptate de
unele browsere, acele secvene escape, pentru care am redat i un tabel.
n ncheiere am tratat cazul unui sit unde se culeg date prin intermediul unui formular.
S recunoatem c n cazul acestui exerciiu mai complicat v-ai dat seama c trebuie s
revizuii puin HTML-ul! i aici am abordat o serie de metode cum sunt: equals(),
indexOf(), ambele ale clasei String.
Am abordat frontal codul surs Java al unei metode care nu aparine vreunui pachet
java. Metoda se numete getValues(). A fost unul din puinele prilejuri de ntlnire cu
limbajul Java! V-am artat cod Java, v-am explicat destule despre el, dar nu v cerem a
nva acest limbaj insipid ci numai s recunpatei c aceasta este o scriere sintactic
Java!
5
Capitolul

Accesul la bazele de date, clasele


de tip Java beans
Dup unii bean s-ar traduce prin boab de cafea! Rposatul profesor Leon
Levichi este mai puin cosmopolit! n dicionarul aprut sub ndrumarea sa,
bean nseamn fasole, bob, dovleac, bostan, n nici un caz bob de cafea.
Vom descrie o aplicaie Java bazat pe cadrul de lucru J2SE. Am creat baza de
date cu MS Access. Ca atare am fost nevoii s recurgem la un program de
comand (driver) pus la dispoziie pentru accesul la structuri tip .mdb. Este
driverul de tip punte JDBC:ODBC al corporaiei Sun Microsystems din J2SE.
El servete la accesul o baz de date a platformei ODBC, dar are unele
probleme! Aa ne explicm de ce au aprut destule firme, care ofer cte un
astfel de driver tip punte i care n mod precis c nu au anomalii. De aceea au i
regimul shareware. J2SE este freeware.
Tot n acest capitol vom arta c sunt i alte tipuri de drivere pentru accesul la
baze de date venind dinspre platforma Java. O parte din aplicaia descris aici
conine i o clas pregtit conform tipicului Java beans. Nu vom aminti dect
tangenial acest tipic.

A
adar bazele de date sunt surse de date din punct de vedere logic. Ne aflm n
platforma Java, iar drumul pn la platforma Windows este lung! Exist multe
structuri de date; unele fac parte din ODBC, altele din OLE DB etc. ODBC
vizez conectarea la structuri de date tip Asthon Tate dBase, FoxPro, Visual FoxPro,
Borland Paradox Microsoft Access, etc. ODBC nseamn Object DataBase
Connectivity, deci conectare deschis spre structurile de baze de date Windows (vezi
partea a treia a referinei /1/). Auzii pe un specialiti exprimndu-se: ODBC Data
Sources sau i mai ermetic surse de date ODBC!
Dinspre platforma Java spre platforma ODBC se ajunge n vreo patru moduri de acces.
Cel mai ieftin dar i mai lent mod este cel realizat prin intermediul unui program de
comand (driver) dezvoltat de ctre corporaia Sun Microsystems. Driverul este o punte
de legtur, care comunic cu un alt conector (driver) din platforma Windows. n
englez aceast pies software se cheam JDBC:ODBC bridge.

Puin despre modelele de acces JDBC


JDBC nseamn Java DataBase Connectivity, cenctare la baze de date dinspre java. Aa
cum afirmam adineaori, cel mai lent este driverul de tip punte. Driverul face parte din
cadrul de lucru J2SE. Figura de mai jos red locul acestei puni ntre cele dou platforme
ODBC-Windows pe de o parte, i maina virtual Java, pe de alta.
Servletul lanseaz o comand de interogare a bazei de date, cu respectarea regulilor
sintactice ale limbajului pentru interogare de tip structurat, Structured Query Language,
repesctnd n acelai timp i sintaxa limbajului Java. Deoarece nu v redm listele scrise
n cod Java, nu avem cum a v demonstra c aa este.

FIGURA 5.1 Modelul de acces la baze de date tip JDBC:ODBC (dup referina /4/)

Cele dou drivere, puntea JDBC:ODBC pe de o parte, i driverul propriu-zis ODBC pe


de alta, au fiecare sarcini bine stabilite. De la clientul Web se emite cererea. De pild,
vrem s aflm toi cumprtorii unui magazin virtual, de la litera H. Cererea vine la
servlet. Se interogheaz o baz de date MS Access.
n alt ordine de idei, o baz de date este alctuit dintr-unul sau mai multe tabele. Din
aceste tabele se obine rezultatul care ne intereseaz. El are forma tot a unui tabel cu
coloanele: numele i prenumele vizitatorului. Tabelul aa cum sosete de la MSAccess
nu ar putea fi redat direct n fereastra documentului HTML. n consecin, prin
intermediul aceluai server ce coopereaz cu driverele amintite mai sus este adus la
forma familiar limbajului HTML.
Mai exist i alte trei tipuri de modele de acces la bazele de date. Cel mai scump este
acela care asigur accesul direct la structura bazei de date. I se spune n englez Native
Protocol Pure Java. Evident acest tip de driver cost bani! n schimb, el mrete n mod
dramatic viteza de rspuns i merge i bine (vezi /4/ i http://www.easysoft.com).

Prezentarea paginilor aplicaiei


Ne-am gndit s dezvoltm o aplicaie ct mai simpl, deoarece driverul JDBC:ODBC
de tip punte din J2SE nu a funcionat bine, cel puin n contextul sistemului Windows
2000 Professional! Multe firme ofer n regimul shareware un driver tip punte dar i
altele evoluate. Nu am testat oferta firmei EasySoft, una dintre multele firme, fiindc nu
am mai descrcat produsul!
nelegem politica celor de la Sun Microsystems, cnd suportul Entreprise Java Beans,
este cumprat de manageri cu stare! Este normal ca aceste piese software s fie
impecabil puse la punct! Nu avem nici o pretenie!
Am scris o aplicaie bazat pe un formular cu doar trei cmpuri: numele vizitatorului,
prenumele su i codul su numeric personal. Aceste trei rubrici alctuiesc i cmpurile
unei tabele denumite visitors a bazei de date mydb.mdb. Ca suport pentru baze de date
am ales aplicaia MS Access.
Observaie: Trebuie spus c un sit comercial accesat de mai mult de 30 utilizatori, pierde
n vitez n mod dramatic dac s-a bazat pe MS Access i nu pe MS SQL Server!
i aa simpl, aplicaia a avut nevoie de o clas tip Java Bean, a crei list nu a fost
prezentat din motive de lungime.
nchipuii-v aceast clas ca pe o cochilie. La variabilele clasei tip Bean nu avem
acces direct, ele fiind de tip privat. n schimb avem acces la proprietile (metodele) ei,
prin intermediul unor etichete JSP. Relum ideea mai jos, dup terminarea prezentrii
acestei aplicaii. Vei observa eticheta jsp:useBean n multe din paginile aplicaiei.
Toate fiierele cu sufixul .jsp ce aparin acestei aplicaii vor aparine de directorul:
<HOME_Resin>/mydb.
Clasa tip Bean va fi stocat ntr-un alt director, i anume:
<HOME_Resin>/mydb/WEB-INF/classes/jsp.
De ce aici i nu altundeva? Pentru c orice container servlet/JSP respect convenia de
amplasare a fiierelor unei aplicaii complexe din platforma Java ntr-o ierarhie care are
un anumit tipic. Despre acest tipic nu avem de gnd s v vorbim. Pentru a nu face
urmrirea prea greoaie, am considerat oportun s evitm explicarea fiierului descriptor
al unei atari ierarhii, intitulat web.xml, care cere cunoaterea XML i, care este amplasat
conform aceluiai standard n directorul:
<HOME_Resin>/mydb/WEB-INF.
Crem deci cu MS Access o baz de date denumit mydb.mdb. Procedeul este acesta:
1. Activm aplicaia MS Access (Start Programs MS Access).
2. Din caseta de dialog alegem opiunea pentru crearea unei noi baze
de date, Blank Database.
3. Apare caseta denumit fiier nou de tip baz de date, File New DataBase. Aici
precizm la nume fiier, File name, denumirea bazei: mydb. Denumirea are
automat extensia .mdb. Alegem directorul unde dorim ca s o salvm. Fie el:
<HOME_Resin>/mydb. Numele acestui director ct i cel al bazei de date nu
trebuie s v conduc la confuzie. Sunt dou lucruri absolut distincte!
4. Acionm butonul Create.
5. Apare o alt caset de dialog, de unde se alege prima opiune, creare tabel n
modul de proiectare vedere a structurii, Create Table in Design View. n fapt
vom crea un tabel pe care l vom denumi n final visitors.

FIGURA 5.2 Aspectul ferestrei de creare a unui tabel cu MS Access

6. nscriem cele trei cmpuri cnp, nume i prenume n aceast ordine. Cmpul cnp
va fi de tipul text i va avea 13 poziii. Va servi drept cheie primar. Orice tabel
trebuie s aib un cmp de indexare. El va conine cheia primar, fiindc dup
ea se face sortarea sau indexarea. Celelalte dou cmpuri, nume i prenume, vor
fi tot de tipul text i vor avea cte 20 caractere. ntruct operarea este extrem de
intuitiv, nu mai redm acest procedeu. Aspectul structurii este cel din figura
5.3
FIGURA 5.3 Aspectul structurii tabelului visitors

FIGURA 5.4 aspectul casetei de dialog Data Sources (ODBC)

Indiferent c folosim doar driverul ODBC din platforma Microsoft, trebuie s anunm
acest driver c va avea acces la o surs de date. Denumirea sursei nu va fi mydb.mdb
ci myVisitors. Pentru aceasta iat procedeul:
7. Dac folosim sistemul Windows 2000 Professional, activm Data Sources
(ODBC). Traseul este: Start Settings Control Panel Administrativ
Tools Data Sources (ODBC). Dac folosim varianta Windows 98, traseul va
fi altul: Start Programs Control Panel ODBC Data Sources. Apare o
caset complex, similar cu aceea din figura 5.4. n aceast figur ns apare
deja dnumirea logic a sursei de date mydb.mdb. Observai c ea se numete
myVisitors i este de tip utilizator (user) nu de tipul sistem (system). Nu
divagm! nchipuii-v c nu este iniial. Revenind la procedura n sine.
8. Ni se cere denumirea sursei de date. Precizm de la claviatur denumirea
myVisitors. O scriem exact aa. Dac am scrie codul clasei Java bean, am vedea
c exact aa o menionm!
9. Apoi selectm un driver de tip Microsoft Access (*.mdb).
10. Mai departe, prin clic pe butonul Finish, apare o ultim caset denumit
Database. Aici selectm fiierul cu extensia .mdb. El se afl ntr-un alt director
dect cel afiat iniial n caset.
11. Pentru aceasta cltorim, cu butonul browse, n directorul unde se afl baza i,
prin clic pe denumirea ei am terminat procedura.
Am adus la cunotina driverului ODBC c sursa de date myVisitors este asociat
fiierului mydb.mdb.
Redm integral pagina de baz denumit mydb.jsp, ca de altfel toate fiierele .jsp ale
acestei aplicaii cu excepia clasei bean. Nu am vrut a o denumi index.jsp, dei puteam
foarte bine s i spunem i aa! Pentru uurarea urmrii explicaiilor am preferat
numeroatarea liniilor.
Lista 5.1 Pagina principal mydb.jsp

01. <%-- mydb.jsp --%>


02. <%@ page language="java" import="java.sql.*, java.io.*, java.util.*"
errorPage="eroare.jsp" %>
03. <jsp:useBean id="bd" scope="session" class="jsp.DBBean"/>
04. <html>
05. <body>
06. <h3 align="center">Lucru cu baza de date mydb</h3>
07. <form action="purgeDB.jsp" method="post">
08. <br>Pentru eliminarea tuturor vizitatorilor din tabelul visitor, BD mydb, clic pe
<b>Golesc tabel</b>.</td>
09. <table border="0" bgcolor="#FFFFAA">
10. <th>Codul numeric personal</th>
11. <th>Numele</th>
12. <th>Prenumele</th>
13. <th><input type="submit" value="Golesc tabel"></th>
14. <%
15. bd.connect();
16. ResultSet rs = bd.viewVisitors();
17. while (rs.next()) {
18. %>
19. <tr>
20. <td><input name="cnp" value="<%= rs.getString("cnp") %>"></td>
21. <td><input name="nume" value="<%= rs.getString("nume") %>"></td>
22. <td><input name="prenume" value="<%= rs.getString("prenume") %>"></td>
23. </tr>
24. <% }
25. %>
26. </table>
27. </form>
28. <% bd.disconnect(); %>
29. <hr>
30. <form action="refillDB.jsp" method="post">
31. <table border="0">
32. <tr>
33. <td>Pentru reumplerea tabelului din BD mydb, clic pe <b>Reincarc
tabel</b>.</td>
34. <td><input type="submit" value="Reincarc tabel"></td>
35. </tr>
36. </table>
37. </form>
38. <form action="delrec.jsp" method="post">
39. <table border="0">
40. <tr>
41. <td>Ca sa elimini vizitatorul, precizezi codul numeric personal, si clic pe
<b>Elimin vizitator</b>.</td>
42. <td><input name="cnp_anume"></td>
43. <td><input type="submit" value="Elimin vizitator"></td>
44. </tr>
45. </table>
46. </form>
47. <form action="addvisitor.jsp" method="post">
48. <table border="0">
49. <tr>
50. <td>Ca sa adaugi un vizitator, clic pe <b>Adaug vizitator</B>.</td>
51. <td><input type="submit" value="Adaug vizitator"></td>
52. </tr>
53. </table>
54. </form>
55. </body>
56. </html>

Explicaii i parafraze
Este o list lung i plin de nouti! S o lum sistematic. Prima linie este un
comentariu unde menionm denumirea paginii. Acesta putea fi desigur continuat cu
intrri pentru: autor, data crerii, numrul versiunii, data penultimei modificri sau pur i
simplu toate modificrile realizate de la nceputul crerii acestui program, dar ar fi lungit
lista.
Urmtoarea linie este una tiut. Anunm cu directiva page ce pachete vor fi importate.
Dar mai apare ceva i anume atributul errorpage. i acesta ne este cunoscut. El anun
denumirea paginii care se ocup de tratarea excepiilor i anume fiierul eroare.jsp
n schimb, linia 03 reprezint un impact. Aici anunm pagina mydb.jsp prin intermediul
etichetei jsp:useBean despre o clas de tip bean. Accesul se va efectua prin intermediul
unei denumiri logice prescurtate, bd, nu prin denumirea fizic jsp.DBBean. Acest
identificator cum spun programatorii apare n destule linii dup cum se va vedea mai
jos. n continuare, urmtorul atribut este cel al domeniului (scope=session). Este
necesar o parantez.
Ce este domeniul ?
Orice obiect JSP declarat are un domeniu unde este recunoscut semantic de contextul
programului. V amintii c unul din obiectele implicite este i sesiunea, session. Un
obiect cu domeniul session este accesibil atta vreme ct clientul Web (MSIE) menine
o sesiune de lucru cu serverul Web. Pot exista la un moment dat mai multe sesiuni la
aceiai pagin. Dac este aa, atunci motorul servlet va anula dup un interval de timp
sesiunea, n cazul cnd acestea ar rmne inactiv pentru prea mult timp. Recomandm
s v aruncai ochii i prin capitolul 6.
De ce se face aceasta? Pentru motivul c nu exist o modalitate de a ti de la serverul
Web, c un vizitator a nchis sesiunea la acel PC aflat la distan. Acolo ruleaz clientul
Web. Desigur, exist i posibilitatea nchiderii forate a sesiunii cu metoda invalidate() a
obiectului session. La ea se apeleaz dac vizitatorul sitului s-a deconectat n mod
explicit iar legtura de date a funcionat. Pentru termenul legtur de date vezi referina
/1/.
Aa cum exist un domeniu pentru obiectul session, exist un domeniu i pentru
obiectul request. Cererea de la clientul Web dureaz att timp ct este prelucrat.
Exist i un domeniu pentru obiectul page, pagin ca i pentru obiectul application,
aplicaie.
Un obiect cu domeniul pagin este accesibil doar din pagina unde a fost creat. Nu mai
prelungim paranteza i revenim la exerciiul nostru.
Ne rentoarcem al linia 03. Ultimul atribut din eticheta jsp:useBean este class. Aici se
anun c se va folosi un cod de octei denumit: jsp.DBBean. tim deja c are
terminaia .class. Denumirea jsp este cea a unui pachet cu clase tip Java bean. Pachetul
n cazul aplicaiei de fa a avut doar o singur clas tip Bean. Pachetul va fi pn la
urm materializat printr-un director care va conine toate fiierele tip bean. Faptul c am
notat cu litere mari nu este o convenie anume. DB vine de la DataBase. Nu trebuie
neaprat denumirea Bean!
n linia 07 anunm un formular. Cnd va fi acionat butonul de tip submit se va
comanda pornirea servletului purgeDB.jsp.
Ai putea crede c toate liniile de program care urmeaz se ocup de golirea tabelului
visitors (purge), dar nu este aa! S nu confundai denumirea myVisitors dat sursei de
date deci bazei n sine cu denumirea tabelului visitors!
Acest formular adpostete un tabel HTML (linia 09) cu trei coloane (liniile 10-12). A
patra coloan va conine butonul de tip submit pe care scrie Golire tabel.
n linia 15 ne conectm logic la baza de date myVisitors alias mydb.mdb. Am spus c
nu reproducem codul programului DBBean.java. n cadrul rutinei connect() se activeaz
driverul tip punte. El are o denumire lung i neinteresant.
Linia 16 conine o instruciune de atribuire a limbajului Java. n partea stng se invoc
metoda viewVisitors() a clasei DBBean. Aceasta are denumirea logic bd. Metod
ntoarce un tabel rezultat denumit rs care este un obiect cu structura tip ResultSet.
n linia 17 se intr ntr-o bucl while. n fond i al urma urmei, trebuie s vizualizm
tabelul cu vizitatori. Aceasta o facem cu metoda next() a obiectului ResultSet.
Deoarece afiarea se face cu ajutorul HTML, ieim din scriptlet. Vezi n linia a 18-a,
separatorul de ieire. Revenim n scriptlet n linia a 24-a. Vei ntreba de ce? Pentru c
while are un corp delimitat de dou acolade i pentru c urmtoarele linii se refer la
HTML. Observai acolada de ncheiere din linia a 24-a.
n cuprinsul liniilor 19 23 extragem din tabelul visitors valorile stocate n cmpurile
nregistrrii. Pentru aceasta recurgem pentru fiecare cmp n parte la metoda getString().
Deoarece metoda aparine clasei ResultSet, vom plasa denumirea rs naintea denumirii
metodei, separnd-o printr-un punct, deci scriem rs.getString(nume).
Liniile 26 i 27 se refer la HTML. Prsim din nou scenariul n linia 25 pentru a reveni
n linia 28, ca s realizm deconectarea logic de la baz.
Ce rost au liniile 2022? Ele redau coninutul tabelului visitors n fereastra document a
browserului MSIE. Deci pagina aceasta va afia de fapt coninutul tabelului visitors.
Anunm pe vizitator c are la-ndemn butonul Golire tabel, dac dorete s elimine
toate nregistrile. Linia 30 anun un alt formular pentru care este pregtit s i fac fa
servletul refillDB.jsp. Formularul are un tabel fr chenar (linia 31, BORDER=0),
compus dintr-un singur rnd (tr, vezi liniile 32 i 35, cu dou celule (td, liniile 33 i 34).
Linia 34 conine butonul Reincarc tabel. Dac se acioneaz mai nti butonul Golire
tabel i apoi butonul Reincarc tabel, se vor genera trei nregistri n visitors. Datele
acestor nregistrri sunt declarate n cadrul metodei populateVisitors() din clasa de tip
bean care nu a fost etalat aici.
ncepnd cu linia 38 observm un al treilea formular de care se ocup servletul
delrec.jsp, tergerea logic a unei nregistrri. V-ai cam obinuit cu tipicul de
programare! i acest formular are un tabel fr chenar (linia 39) alctuit dintr-o singur
rnd (liniile 40 i 44). Rndul conine trei celule definite n liniile 41, 42 i 43. Aici se
cere furnizarea prealabil a codului numeric personal. Butonul pentru eliminare are
notat pe el cuvintele Elimin vizitator.
Linia a 47-a definete al patrulea formular de care se ocup servletul addvisitor.jsp. Este
un tabel cu un singur rnd cu dou celule. Butonul Adaug vizitator dup cum i spune
numele, declaneaz ceva ce nu apare aici explicit ca la cazul de mai sus, delrec.jsp.
Acum s contemplm fiierul refillDB.jsp. Fiind de acum obinuii cu tipicul de
programare nu am mai numerotat aceste linii.

Lista 5.2 Pagina refillDB.jsp

<%-- refillDB.jsp --%>


<%@ page language="java" import="java.sql.*, java.io.*, java.util.*"
errorPage="eroare.jsp" %>
<jsp:useBean id="bd" scope="session" class="jsp.DBBean"/>
<html>
<head>
<title>Reumplere baza Visitors.</title>
</head>
<body>
<%
bd.connect();
bd.populateVisitors();
bd.disconnect();
%>
Vizitatori adaugati. <br/>
Click <a href="mydb.jsp">here</a> ca sa vezi continutul tabelului visitors.
</body>
</html>

Explicaii i parafraze
i pagina refillDB.jsp are domeniul sesiune. i aici observai un scriptlet, unde apar cele
trei metode afiliate la clasa DBBean: connect(), populateVisitors() i disconnect().
Afilierea se realizeaz prin asocierea denumirii bd la denumirea metodei. Dup ce se
efectueaz popularea cu trei vizitatori ntr-o alt fereastr de tip document, se anun
mesajul Vizitatori adugai. Un rnd mai jos apare o legtur tip hypertext cu ajutorul
creia se revine la pagina de baz mydb.jsp.
Cum arat aspectul paginii principale dup adugarea celor trei nregistrri vedei n
figura urmtoare.
FIGURA 5.5 Aspectul paginii principale a aplicaiei mydb.jsp

nainte de a continua cu prezentarea listelor aplicaiei vei observa n figur butoanele


celor patru formulare, Golire tabel, Rencarc tabel, Adaug vizitator i Elimin
vizitator.
Acum s ne ocupm de pagina purgeDB.jsp. Aici apare ceva nou i anume linia n care
prin metoda getParameterValues iniializm un masiv de tip ir de caractere, care este
denumit cam prozaic s.
Lista 5.3 Pagina purgeDB.jsp

<%-- purgeDB.jsp --%>


<%@ page language="java" import="java.sql.*, java.text.*, java.io.*, java.util.*"
errorPage="eroare.jsp" %>
<jsp:useBean id="bd" scope="session" class="jsp.DBBean"/>
<html>
<body>
<%
String[] s = request.getParameterValues("cnp");
bd.connect();
bd.purgeVisitors(s);
bd.disconnect();
%>

Vizitatori eliminati! <br/>


Click <a href="mydb.jsp">here</a> ca sa vezi rezultatul.
</body>
</html>

Explicaii i parafraze
Masivul va conine la finalul executrii acestei pagini toate codurile numerice personale.
Acest masiv este pasat apoi metodei purgeVisitors(). Tot aa ntr-o fereastr de tipul
document se anun c vizitatorii au fost eliminai i, printr-o legtur tip hypertext se
revine la pagina de baz, mydb.jsp.
A venit rndul paginii addvisitor.jsp. Am remarcat la pagina de baz c nu mai erau
prezente metodele connect() etc. Am schimbat voit locul lor, dei nu eram ndreptii s
o facem aici n interiorul acestei pagini. n fiierul addvisitor.jsp aflm c graie
formularului definit aici, se apeleaz alt pagin denumit addrec.jsp. Deocamdat
addvisitor() definete un tabel HTML format din trei rnduri, conform celor trei cmpuri
ale tabelului visitors. Fiecare rnd are cte dou celule. n celula din stnga apare n clar
un text de invitare la dialog. Se cer: codul numeric personal, numele i prenumele.
Lista 5.4 Pagina addvisitor.jsp

<%-- addvisitor.jsp --%>


<html>
<body>
<h1>Adauga vizitatorul</h1>
<form action="addrec.jsp" method="post">
<table>
<tr>
<td>Codul numeric personal (13 cifre), ex: 1790205400234: </td>
<td><input type="text" name="cnp" size="13"></td>
</tr>
<tr>
<td>Numele: </td>
<td><input type="text" name="nume" size="30"></td>
</tr>
<tr>
<td>Prenumele: </td>
<td><input type="text" name="prenume" size="30"></td>
</tr>
</table>
<br/>
<input type="submit" value="Adauga vizitatorul!" />
</form>
</body>
</html>

Explicaii
Evident, trebuia s existe i un buton submit pe care este menionat Adauga
vizitatorul!.
Ct privete fiierul addrec.jsp el este tot o pagin referitoare la un obiect tip sesiune,
cum sunt de altfel toate fiierele acestei aplicaii.
Lista 5.5 Pagina addrec.jsp

<%-- addrec.jsp --%>


<%@ page language="java" import="java.sql.*, java.io.*, java.util.*"
errorPage="eroare.jsp" %>
<jsp:useBean id="bd" scope="session" class="jsp.DBBean"/>
<html>
<body>
<%
String Cnp = request.getParameter("cnp");
String Nume = request.getParameter("nume");
String Prenume = request.getParameter("prenume");

bd.connect();
bd.addVisitors(Cnp, Nume, Prenume);
bd.disconnect();
%>
Vizitator adaugat.
<br>Clic <a href="mydb.jsp">aici</a> ca sa vezi rezultatul.
</body>
</html>
Explicaii
Aici ns exist un scriptlet. n trei rnduri distingem cum se extrag din formular prin
inetrmediul obiectului request coninuturile cmpurilor tabelului visitors. Odat aflate
aceste valori, se lanseaz pe rnd metodele de conectare, connect(), de adugare a
vizitatorului, addVisitors() i la final, de deconectare logic, disconnect(). Toate sunt
codificate n cadrul paginii tip Bean a crei liste nu o vom reda aici.
Urmeaz s vorbim despre pagina delrec.jsp. Aceasta preia ntr-o variabil String
denumit Cod_np, codul numeric personal. Informaia se preia din specificaia URL i
vine din cmpul denumit logic cnp_anume (privii lista). Tot n acelai scriptlet se
execut de acum obinuita secven de conectare, apel de procedur deleteVisitor() i de
deconectare logic la baza de date.
Ultimele dou pagini de mai sus sunt croite dup aceiai filozofie de afiare a
rezultatului ntr-o fereastr separat de tip dcoument, cu o legtur de revenire la pagina
de baz mydb.jsp.
Lista 5.6 Pagina delrec.jsp

<%-- delrec.jsp --%>


<%@ page language="java" import="java.sql.*, java.io.*, java.util.*"
errorPage="eroare.jsp" %>
<jsp:useBean id="bd" scope="session" class="jsp.DBBean"/>
<html>
<body>
<%
String Cod_np = request.getParameter("cnp_anume");
bd.connect();
bd.deleteVisitor(Cod_np);
bd.disconnect();
%>
<br>Click <a href="mydb.jsp">aici</a> ca sa vezi efectul!
</body>
</html>

Explicaii i parafraze
A rmas de prezentat scurta pagin de tratare a erorii, eroare.jsp. tim de la capitolul
anterior ce nseamn true pentru atributul isErrorPage. Aceast pagin este ntr-adevr
pagina interceptoare a erorilor. Dup mesajul generic Semnalm o eroare, prelum
prin intermediul obiectul exception mesajul acelei erori produse. toString() este metoda
de tip ir, care are menirea de publicare a mesajului n sine.
Lista 5.7 Pagina eroare.jsp

<%-- eroare.jsp --%>


<%@ page language="java" isErrorPage="true"%>
<html>
<body>
<h2>Semnalam o eroare.</h2>
<h4>Ea este:</h4><%= exception.toString() %><BR>
<br>Luati legatura cu administratorul retelei!
</body>
</html>

Foarte puin despre clase tip Bean


O clas de tipul Bean trebuie s ne-o nchipuim ca pe o cochilie n care s-a nmagazinat
inteligen! Mai departe similtudinea nu merge.
Dispunem de trei etichete pentru a avea acces n interiorul cochiliei i anume:
jsp:setProperty, jsp:getProperty i jsp:useBean.
Proprietile sunt metode publice ca i clasa de tip Bean de altfel. Denumirea unei
metode are un tipic pe care l vom explica mai uor pe exemplul simplu care urmeaz.
Cu eticheta jsp:setProperty transmitem valori spre proprietatea respectiv.
Cum arat formatul sintactic al etichetei jsp:setProperty? Unul dintre formate arat cam
aa:
<jsp:setProperty name=nume_clasa_Bean, property=numeProprietate,
value= ir_de_caractere>

n cadrul clasei Bean trebuie s existe o astfel de proprietate dar care, remarcai felul
cum este ea scris:
public tip setNumeProprietate(tipProprietate argument) {
corpul metodei
}

Constructorul clasei tip Bean trebuie s aib i el un tipic de scriere pe care l vei
remarca din exemplul de mai jos.
Iat acest exemplu. El este format dintr-o pagin JSP i o clas tip Bean. Directorul se
denumete stridie. Directorul stridie este fiu al directorului:
<HOME_Resin>.
Mai nti redm intergral codul surs al paginii JSP:
Lista 5.8 Pagina stridie.jsp

<jsp:useBean id="stridia" class="jsp.AusterBean" />


<jsp:setProperty name="stridia" property="molusca" value="Nu stiu, n-am mancat" />
<html>
<body><table border="0">
<tr>
<td>Ce gust are stridia?</td>
<td><jsp:getProperty name="stridia" property="molusca" />
</tr>
</table></body></html>

Clasa bean se afl la fel ca n cazul exemplului de mai sus n directorul:


<HOME_Resin>/stridie/WEB-INF/classes/jsp.
Iat acum codul surs al clasei de tipul Bean:
Lista 5.9 Fiierul AusterBean.java

package jsp;
public class AusterBean {
// variabilele clasei sunt totdeauna intangibile din exterior
private String meckerel;

public String getMolusca() {


return meckerel;
}

public void setMolusca(String fiinta) {


meckerel = fiinta;
}

// Constructorul clasei
public AusterBean() {
meckerel = "";
}
}

Explicaii i parafraze
S ne concentrm mai nti asupra ultimei liste. Primul lucru pe care l remarcai este c
aici apar instruciuni tipice ale limbajului Java.
Orice clas de tip Bean are constructor. Al doilea lucru este declaraia:
package jsp;

Cu ea anunm container servletul c clasa AusterBean va aparine unui pachet denumit


jsp, deci va fi gsit n directorul redat mai sus.
Alt lucru care sare n ochi este faptul c clasa este public, deci accesibil din exterior,
deci i din pagina stridie.jsp.
n schimb meckerel, unica variabil a clasei este inaccesibil din exterior. De ce?
Remarcai cuvntul cheie private din faa denumirii. Meckerel nseamn stridie n
englez, iar n german i se spune Auster. Aceasta nu este o convenie de notaie ci, un
... bzdc al programatorului n a denumi n fel i chip variabilele, proprietile i clasa.
Repetm, nici chiar denumirea clasei nu trebuie s se termine neaprat cu Bean.
Clasa conine dou proprieti, getMolusca() i setMolusca(). Cu ajutorul primeia
obinem coninutul variabilei meckerel. Cu setMolusca() n schimb, nscriem un ir de
caractere preluat de ctre argumentul fictiv fiinta. Valoarea se preia din lista stridie.jsp.
Observai atributul value din:
<jsp:setProperty name="stridia" property="molusca" value="Nu stiu, n-am mancat" />
Remarcai i constructorul clasei AusterBean. El nu ntoarce nimic i nu primete ceva
prin list. n momentul n care motorul servlet execut eticheta jsp:useBean, are loc
automat o instaniere a clasei respective. Despre instaniere am tot vorbit. E ca i cnd s-
ar ntlni o instruciune de genul
AuserBean variabila = new AusterBean();
S aezm dou linii aproape unda de alta.
<jsp:setProperty name="stridia" property="molusca" value="Nu stiu, n-am mancat" />
din fiierul stridie.jsp i,
public void setMolusca(String fiinta) {
din fiierul AusterBean.java. Remarcai ceva care poate scpa neobservat i anume
cuvntul este transcris cu liter mic n fiierul stridie.jsp (molusca) i cu liter mare n
fiierul AusterBean.java (Molusca), dei este precedat de get sau set. Acesta este tipicul
de programare Bean! Fr acest tipic nu merge acest mecanism de tip Bean!
Ca s executm acest exerciiu cu motorul resin1.1.4, trebuie dat adresa:
http://localhost:8080/stridie/stridie.jsp
Mai trebuie realizat ceva. Un container servlet este n fond tot un program. Menirea lui
este de a executa servleturi. Acest motor este ghidat la momentul pornirii de un fiier
scenariu denumit httpd.conf (n cazul resin), sau de altul n cazul altui motor servlet
(JRun, Tomcat).
Nu ne apucm acum s redm lista acestui fiier, deoarece am divaga. Vom arta doar
liniile adugate acestuia:
<!-- adaugat 6 mai 2003 -->
<web-app id='stridia'>
<servlet-mapping url-pattern='/servlet/*' servlet-name='AusterBean'/>
<servlet servlet-name='AusterBean' servlet-class='jsp.AusterBean'/>
</web-app>

Explicaii i parafraze
Prima linie este un comentariu JSP. Urmtoarele linii sunt scrise dup tipicul unui fiier
XML. Marcajul <web-app> flancheaz un grup de dou linii. Marcajul are ntotdeauna
dou balize, cea de nceput <web-app> i de final, </web-app>.
V recomandm s parcurgei paginile dedicate limbajului XML din referina /1/.
Acest grup de dou linii din interior nu l explicm n totalitate. Rostul su este s
anunm motorul servlet resin c trebuie s compileze tot ce gsete n directorul
<HOME_Resin>/stridie/WEB-INF/classes/jsp.
deci un fiier surs Java. Pe acest motor nu l intereseaz c fiierul conine o clas tip
Bean sau nu. De fiecare dat cnd vom lansa aplicaia stridie.jsp, deci dm adresa URL
de mai sus, dac nu exista deja fiierul AusterBean.class, motorul va compila fiierul
AusterBean.java. Reamintim c orice fiier Java compilat are aceiai denumire cu accea
a fiierului surs, dar extensia va fi .class. Este acel cod de octei, bytecode de care
vorbeam n introducere.
S privim acum lista fiierului stridie.jsp. Trimitem de fapt irul de litere:
Nu stiu, n-am mancat.
Privii aspectul ferestrei documentului acestei aplicaii adhoc.

FIGURA 5.6 Aspectul ferestrei n contextul browserului MSIE

La final de capitol
Am prezentat:
1. Cteva elemente despre metodele de acces la platforma ODBC venind dinspre
maina virtual Java. Am explicat rostul fiecruia din cele dou drivere . Vezi i
figura 5.1.
2. Am analizat n detaliu aplicaia mydb.jsp, evitnd partea propriu-zis a clasei de
tip Bean, DBBean.java.
3. A venit rndul prezentrii n sine a tipicului unei clase de tipul Bean, i, aici am
insistat pe un exemplu adhoc asupra legturii dintre container servlet i pagina
JSP i clasa n sine.
6
Capitolul

Sesiuni i jaloane
S traducem termenul cookie prin prjituric este prea de tot! Pragmatism tipic
american n alegerea denumirilor facilitilor! Le vom spune jaloane. Jalonul nu
este o ascunztoare de virui informatici!

S
puneam n introducere c protocolul HTTP este unul care nu are posibilitatea s
nregistreze dac un vizitator a efectuat mai multe intrri tip cerere/rspuns la
acelai sit.
HTTP-ul a rmas acelai protocol simplu, eficient i rapid! Pentru c pe Tim Berners
Lee, primul realizator al HTTP, nu l-a preocupat problema comerului electronic, deci
problema coului electronic
Chiar i azi, fiecare cerere a unui client Web efectuat prin http, este tratat ca un
eveniment izolat.
Nu merge aa ceva ntr-un sit comercial. O operaiune comercial nu este ceva static.
Cumprtorul ncarc i descarc coul cu produse. Serverul trebuie s in minte cine i
ce marf a pus n co.
JSP are dou componente cu care poate urmri sesiunile unui cumprtor.
Fie folosete un identificator unic de sesiune, ce este alocat vizitatorului la prima cerere
a unei pagini JSP. Informaia va fi stocat la PC-ul clientului Web.
Fie recurge la un obiect sesiune, ce este stocat la server.
Dei serverele Web clasice nu memoreaz o cerere a unui client Web, dup ce acesteia i
s-a rspuns, motorul servlet poate pstra obiecte sesiune unice pentru fiecare cerere.
JSP implementeaz obiectul session, dar auzim afirmaiile: domeniul session i
obiectul session. A nu se face o confuzie ! Obiectul este o structur de date i de
punctatori spre metodele clasei care l-a generat. Domeniul este zona din program unde
este recunoscut acest obiect!
Blocului stocat pe disc i se spune jalon, cookie. Aici nu pot intra dect cel mult elemente
simple, date personale, deci variabile simple n sensul limbajului Java. ntr-un obiect
sesiune stocat la server se admit i structuri complexe de date.
Tehnologia JSP a permis ataarea unor faciliti avansate referitoare la gestionarea strii
sesiunilor.
S ne ocupm acum de cele mai relevante metodele ale obiectului sesiune.

Metodele obiectului sesiune


n acest exemplu scurt recurgem la cteva dintre metodele sale de baz.
LISTA 6.1 Pagina sesiune1.jsp

<!--
Fisier: sesiune1.jsp
<html>
<%@ page import="java.util.*,java.text.DateFormat" %>
<body>
<%
out.println("Sesiunea este noua? " + session.isNew() );
// Care este id-ul acestei sesiuni?
out.println( "<br>Identificatorul sesiunii este: " + session.getId() );
// Si la ce data si ora am creat-o?
out.println( "<br>Data si ora crearii sesiunii este: " +
DateFormat.getInstance().format(new Date(session.getCreationTime())) );
// Obtin data si ora ultimei accesari a obiectului Session:
out.println( "<br><br>Ultima accesare a fost la (format ilizibil): " +
session.getLastAccessedTime() );
// Transform sesiunea curenta intr-una nevalabila si eliberez toate obiectele
(variabilele simple sau chiar obiectele stocate in ea
// session.invalidate();
%>
</body>
</html>

Explicaii i parafraze
S remarcm existena metodelor:
1. isNew(): ntoarce o valoare logic (adevrat sau fals), dup cum a fost sau nu o
sesiune nou. Privii figura 6.1, unde din a doua sesiune obinut prin lansarea
din nou a browserului MSIE, s-a creat contextul sesiunii noi. De unde i acel
true anunat n fereastra celei de a doua lansri.
2. getId(): se obine un identificator al sesiunii. Este treaba JVM de a livra un ir
unic de caractere pe post de identificator de sesiune.
3. getCreationTime(): ntoarce data i ora crerii sesiunii.
4. getLastAccesedTime(): anun momentul ultimului acces la acea pagin din
sesiunea curent. n exerciiul de fa acest moment a coincis cu data i ora
crerii, fiindc cele dou metode de creare i acces erau n aceiai pagin JSP.
5. invalidate(): anuleaz accesul la coninutul blocului sesiunii. Revenim mai jos
cu explicaii mai clare pentru aceast metod.
n figur distingei dou ferestre de tip document, fiecare corespunde unei sesiuni
distincte. Fiecare sesiune are un identificator unic, momente sunt diferite la aceiai dat,
deoarece am ateptat circa un minut naintea celei de a doua folosiri a browserului
MSIE.

FIGURA 6.1 Cele dou sesiuni, fiecare id-ul su (context Resin)

S mai observm ceva: metoda getLastAccesedTime() ntoarce data i ora sub forma
unei valori ntregi stocate pe opt octei (tipul de dat long). Valoarea nu este inteligibil.
Acelai tip de dat ntoarce i metoda getCreationTime(). Prelucrat ns cu metode
adecvate (Date, DateFormat) valoarea datei se transform ntr-una inteligibil.
Mergem mai departe! S nscriem o valoare simpl n cadrul obiectului sesiune. O vom
face cu metoda setAttribute(). i am ales ca s trimitem chiar id-ul sesiunii pe postul
de variabil simpl n sens Java. Ea este denumit idSesiune. Privii listele exemplului.
Am profitat de prezena unui formular, deci de existena obiectului request i, prin
intermediul etichetei jsp:forward, am trimis din motive didactice i acest idSesiune.
n acest exerciiu, sesiunea se extinde logic pe cele trei pagini sesiunePreiaId.jsp,
sesiuneSetezId.jsp i sesiuneAfisezId.jsp. Pagina chemtoare n care se afl formularul
se numete sesiunePreiaId.jsp. Deci lansm aplicaia prin adresa:
http://localhost:8080/test/sesiunePreiaId.jsp n contextul motorului Resin 1.1.4. Aspectul
l vedei n figura 6.2a. Dac am fi folosit JRun 3.0, atunci comanda ar fi fost:
http://localhost:8100/sesiunePreiaId.jsp. Iat cele trei pagini JSP.
LISTA 6.2a Fiierul sesiunePreiaId.jsp(context Resin)

<html>
<body>
<form name="setezId" method="post" action="sesiuneSetezId.jsp">
<% String idSesiune = session.getId(); %>
<center><table>
<tr><input type="submit" name="Buton" value="<%=idSesiune %>"</td></tr>
</table></center></body></html>
LISTa 6.2b Fiierul sesiuneSetezId.jsp(context Resin)

<%
// Setez variabila tip session cu numele de "idSesiune"
session.setAttribute( "idSesiune", request.getParameter("Buton") );
%>
<jsp:forward page="sesiuneAfisezId.jsp"/>
<%@ page import = "java.util.*" %>
LISTA 6.2c Fiierul sesiuneAfisezId.jsp(context Resin)

<html>
<body>
Id-ul sesiunii este <%=session.getAttribute("idSesiune")%>!
<%
out.println("<br>Id de sesiune a fost transmis printr-un cookie " +
request.isRequestedSessionIdFromCookie() );
out.println("<br>Id de sesiune a fost transmis printr-o adresa URL " +
request.isRequestedSessionIdFromUrl() );
%>
</body>
</html>

i aspectul pe ecran al exemplului:

FIGURA 6.2 Afiarea id-ului sesiunii (context Resin)

Explicaii i parafraze
Nu am redat aspectul iniial de pe ecran al ferestrei pentru acest exerciiu ns, prima
dat vei observa un buton de formular, care are inscripionat pe el chiar valoarea
identificatorului sesiunii. Servletul care prelucreaz acest formular este
sesiuneSetezId.jsp (form are atributul action). La momentul efecturii clicului pe acest
buton, cererea ajunge la pagina sesiuneSetezId.jsp. Acest servlet nscrie cu ajutorul
metodei setAttribute(), id-ul sesiunii n idSession. Valoarea o preia cu ajutorul obiectului
request i al metodei getParameter() din cmpul denumit Buton din formular,.
Cu ajutorul etichetei jsp:forward se expediaz aceast valoare la pagina
sesiuneAfisezId.jsp. Privii lista 6.2c. n aceast pagin deosebii trei metode. Prima
dintre ele, getAttribute(), accede obiectul sesiune. De fapt intereseaz coninutul lui
idSesiune pe care-l afim. Urmtoarele dou metode ne spun pe care traseu s-a trimis
id-ul sesiunii. Id-ul unei sesiuni poate veni fie prin adres URL, fie prin jalon (cookie).
Cnd lucrm cu session, lucrm de fapt n fundal cu jalonul (cookie). Aici el a fost
trimis prin cookie, de unde i valoarea true. Metodele de explorare au denumiri lungi i
clare:
isRequestedSessionIdFromCookie, respectiv isRequestedSessionIdFromURL
A mai rmas s artm cum se memoreaz un obiect cu structur de date mai complex
n cuprinsul obiectului session. Iat cum se procedeeaz n cazul memorrii unui vector
cu elemente. Privii lista exemplului urmtor unde apar i alte metode ale obiectului
session.
LISTA 6.3 Un fiier cu multe metode ale obiectului session, SesiuneVector.jsp

01. <!--
02. Fisier: SesiuneVector.jsp
03. Inspirat dupa exemplul lui David Aden, cap. 10 "JSP Development", ed. Sams
2001
04. dar modificat mai ... multicel -->
05. <html>
06. <head>
07. <title>Vector cu obiecte Session</title>
08. </head>
09. <body>
10. <%@ page import="java.util.*" %>
11. <%
12. // Creez o variabila de lucru
13. String s = "";
14. // Creez un vector denumit vec
15. Vector vec = new Vector();
16. // Si il umplu cu valori
17. vec.addElement("pantoful marca x");
18. vec.addElement("gluga marca y");
19. vec.addElement("camasa z ");
20. // Creez un obiect complex denumit Vectorul propriu, caruia ii atasez valoarea
obiectului vec.
21. session.setAttribute("VectorulPropriu", vec);
22. // Citesc valoarea parametrului "VectorulPropriu" din obiectul Session
23. Vector vec1 = (Vector) session.getAttribute("VectorulPropriu");
24. // Buclez prin acest vector citit si ii afisez elementele
25. out.println( "<br>Imprim vectorul stocat in obiectul Session:" );
26. for ( int x=0; x < vec1.size(); x++ )
27. out.println( "<br>vec1 " + x + ": " + vec1.elementAt(x) );
28. // Obtin o valoare specifica din vector
29. s = (String) ((Vector) session.getAttribute("VectorulPropriu")).elementAt(2);
30. out.println( "<br>Afisez valoarea elementului 3 direct din vector:" );
31. out.println( s );
32. out.println( "<br>Iata o lista a tuturor variabilelor din " +
33. "Obiectul Session:");
34. // Obtin o lista a tuturor parametrilor obiectului Session
35. Enumeration enum = session.getAttributeNames();
36. // Prin intermediul lui Enumeration extrag valorile parametrilor din obiect
37. while ( enum.hasMoreElements() ) {
38. s = (String) enum.nextElement();
39. out.println( "<br>Numele variabilei Session: " + s );
40. }
41. // Afisez intervalul de asteptare ca la clientul web sa se intample ceva
42. out.println( "<br>Time-outul este de: " + session.getMaxInactiveInterval() + "
secunde. Schimb timeoutul la 10 minute");
43. // Setez time-out-ul la 10 minute
44. session.setMaxInactiveInterval(60*10);
45. // Si afisez acest time-out, interval de asteptare
46. out.println( "<br>Noul time-out este de: " + session.getMaxInactiveInterval() + "
secunde");
47. // Incerc sa afisez o valoare de atribut inexistenta
48. out.println( "<br>Exista parametrul u1234? Evident ca nu si va raspunde prin sir
vid, adica: " + session.getAttribute("u1234"));
49. // Inscriu parametrul u1234 in obiectul sesiune:
50. session.setAttribute("u1234", "HIP HIP URA!");
51. // Incerc sa afisez o valoare de atribut care exista acum
52. out.println( "<br>Exista parametrul u1234? Acum da si va raspunde prin sirul HIP
HIP URA!: " + session.getAttribute("u1234"));
53. out.println( "<br>Sterg parametrul u1234? Va raspunde prin null" );
54. // Indepartez acest parametrul u1234 din obiectul sesiune:
55. session.removeAttribute("u1234");
56. // Incerc sa afisez o valoare de atribut care nu mai exista
57. out.println( " Dar acum mai exista parametrul u1234? " +
session.getAttribute("u1234"));
58. %>
59. </body>
60. <html>

Explicaii i parafraze
Liniile 01-04 alctuiesc un comentariu. Directiva page (linia 10) anun maina JVM c
este nevoie de clasele nodului java.util.*. De ce acest nod generic din ierarhie? Deoarece
n cuprinsul exemplului de fa operm att cu clasa Enumeration ct i cu clasa Vector.
Am fi putut specifica explicit java.util.Vector i java.util.Enumeration, dar mai bine am
inclus totul, adic java.util.*. S nu credei c servletul va deveni mai voluminos. La
momentul importrii se vor seleciona doar clasele efectiv apelate n aceast pagin.
Crem variabila de tip ir denumit s (n linia 13) i vectorul vec (linia 15). Iniializm
elementele sale cu ajutorul metodei addElement() vezi liniile 17-19. nscriem n
fiecare element, literalii pe care de altfel i i remarcai. n primul element vec[0], se va
nscrie textul pantoful marca x, .a.m.d. Numerotarea unui vector ncepe n
programare de la zero nu de la unu!
Graie metodei setAttribute(), stocm ntregul vector (linia 21).
Apoi, creem o alt instan denumit vec1. Cu ajutorul metodei getAttribute(), se preia
ntregul vec i se atribuie lui vec1 (linia 23).
Parcurgem element dup element, coninutul vectorului vec1 pe care l i afim de
altfel (liniile 26-27). Metoda de selecie este elementAt(x). Observai c indexul x ia
valori de la 0 la 2; x este indexul buclei for.
Se permit i referiri directe la elemente unui vector (vezi linia 29). Aici se preia n
variabila s coninutul elementului al treilea (index 2) al vectorului vec1.
Acum s ne amintim din nou de clasa Enumeration, ntlnit n aceast carte. Cu ea
palpm ntregul obiect sesiune i aflm ce se afl n cadrul su. Exist doar obiectul
denumit VectorulPropriu. Observai n linia 21 felul cum am memorat acest obiect n
dreptul lui VectorulPropriu. La fel i-am zis i cnd am dorit s regsim vectorul (linia
23), i cnd am adresat chiar un element din el (linia 29). n fiecare caz am recurs la
getAttribute().
S mergem mai departe! n poriunea liniilor 34-40, unde am comentat din plin aceast
list n detrimentul lungirii ei, aflm lista tuturor parametrilor obiectului sesiune.
Orice sesiune va fi dezactivat de ctre serverul Web n mod automat, dup scurgerea
unui interval de timp de inactivitate la clientul Web. Cu linia 42 aflm mrimea time-
out-ului.
Putem schimba mrimea acestui interval de ateptare cu ajutorul metodei denumite
setMaxInactiveInterval(), vezi linia 44. Am dorit ca obiectul s vieuiasc 10 minute
x 60 secunde. Metoda aparine de obiectul session, ca de altfel i metoda de aflare a
acestui interval, getMaxInactiveInterval(). Observai c se lucreaz cu secundele ca
unitate de msur!
Am ajuns aproape de sfritul acestei liste. Fixai-v acum atenia asupra liniei 48. Cnd
ncercm s aflm dac ar exista o variabil cu o astfel de denumire n obiectul sesiune,
ni se rspunde printr-un ir vid c nu exist!
Dac ns nscriem n acest bloc (linia 50) parametrul u1234 i i atam valoarea HIP
HIP URA! cu ajutorul metodei setAttribute(), la citirea coninutului parametrului u1234,
se va anuna acest text (linia 52).
Prin metoda invalidate() se elimin toi parametrii din obiectul session. Cu metoda
removeAttribute() din linia 55 ndeprtm doar un parametru. Deci invalidate terge
totul din obiectul session, n timp ce removeAttribute, doar ce dorim din el.
S privim aspectul acestui exerciiu rulat cu MSIE n figura de mai jos.
FIGURA 6.3 Aspectul documentului MSIE dup rularea servletului sesiune3.jsp

Foarte puin despre clasa cookie


Aceast clas este una de tipul explicit. Deci vom apela la operatorul new ca s crem
un obiect cookie. Repetm! Cnd recurgem la obiectul session, se spune c lucrm n
fundal cu cookie. Se recomand folosirea obiectului session, dar i cu cookie putem
face ceva.
n ce ne privete, avem rezerve asupra acestor cookies. Orice browser poate dezactivata
aceast facilitate i atunci toat strdania se duce de rp! Exist ase metode n clasa
cookie i anume: getName(), setValue(), getValue(), setMaxAge(), getMaxAge() i
clone().
Cnd vrem s crem un jalon procedm astfel:
Cookie prjituraMea = new Cookie(cuki,bigi-bigi);

Denumirea blocului cookie este cuki, iar valoarea bigi-bigi, acel gel dulce pe care l
savuram n copilrie! E ceva turcesc. Acum totul se nscrie pe discul PC-ului gazd a
browserului cu care s-a intrat la sit.
Ca s trimitem la clientul Web odat cu rspunsul acest ... bigi-bigi, vom recurge la
metoda addCookie() a obiectului response, deci vom zice:
Response.addCokie(prajituricaMea);

Observai caracterul terminal punct i virgula cu care se sfrete orice instruciune


scris n limbaj Java. Ai remarcat poate la JSP c liniile care se refer la expresii JSP
sau la directive JSP nu recurg la punct i virgul.
Ca s memorm n ... prjituraMea un ir s cum este cel creat n lista de mai sus, vom
proceda aa:
setValue(s);
Spre a se afla valoarea acestui ir recurgem la metoda:
getValue();

Cu metodele setMaxAge(int numr_secunde) i getMaxAge() stabilim, respectiv aflm


durata de via a unui obiect de tip cookie, n secunde.
n sfrit, prin metoda clone(), ... reproducem un jalon ca obiect.

La final de capitol
Am ajuns la finalul tehnologiei JSP. n acest capitol am abordat cteva exerciii
referitoare la suportul Java pentru mbogirea protocolului http, adic protocolul fr
stri. Am enumerat metodele obiectului sesiune i am amintit n final cele ase metode
ale obiectului cookie.
Nu am mai tratat n aceast carte problema securizrii tranzaciilor, descurajai de acces
oprit la folosirea cadrului de lucru J2EE, cu care am fi putut construi un sit n toat
regula! Suportul API Mail pentru mesaje electronice, lipsete de asemeni din J2SE, aa
c ne oprim aici cu regret!
Nu am mai explicat nici partea referitoare la etichetele taglib, adic la biblioteca de
etichete personalizate din acelai motiv!
Nu ne rmne dect s privim spre tehnologia concurent Active Server Pages, ASP,
fiindc s recunoatem a fost mai accesibil mediului universitar!
ntrebri i rspunsuri
ntrebri fr rspunsuri
1. Ce tipuri de piese software reprezint denumirile ca: Symantec Visual Caf,
Allaire JRun Studio, Apache Tomcat Servlet and JSP Development with
VisualAge for Java?
2. tii denumiri de motoare servlet extrem de cunoscute?
3. Ce tii dspre serverle Microsoft?
4. Cam ce piese software mai modeste ne vor duce la realizarea unui sit comercial
construit dup tehnologia JSP?
5. Cine este promotorul tehnologiei JSP i ce nseamn JSP?
6. Ce sunt J2SE, J2EE?
7. Ce este un container?
8. Dinspre tehnologia ASP spre ce pachete s ne ndreptm?
9. Ce limbaj nu tiu serverele IIS i PWS (Windows)? Care este ns limbajul
statuat la Microsoft pentru tehnologia ASP?
10. Ce este un client Web, dar un server Web?
11. Dai exemple de clieni Web i servere Web din platforma Windows.
12. Ce este XML, dar XSL, dar XSLT?
13. Explicai modelul 3-tier master slave.
14. Servletul rezid la serverul Web sau n cadrul containerului pentru servleturi i
pagini JSP?
15. Containerul pentru servleturi i pagini JSP este tot una cu motorul servlet?
16. Ce condiii trebuie s se ndeplineasc pentru ca de la staii s avem acces la o
aplicaie gen sit comercial?
17. Care este raportul dintre un component, un pachet i o clas?
18. JDK folosete sau nu suprafee grafice?
19. Care este diferena dintre servlet, scriptlet i pagina JSP?
20. Ce extensie are un applet i unde se afl el?
21. n ce const maina virtual Java?
22. Dup compilarea unui fiier surs .java se obine un fiier cu extensia .class.
Cum se numete el?
23. Ce este clasa, constructorul i la ce este folosit?
24. La nivelul generaiei a treia de limbaje se vorbete de subprogram, funcie,
subrutin. Dar la nivelul generaiei a patra care este termenul folosit?
25. Ce nseamn Java Bean (vezi i capitolul 6)?
26. Privii figura 1.3. Care ar fi relaia dintre un server Web clasic i un motor
servlet?
27. Ce tii despre JAR i WAR?
28. Ce conin fiierele cu sufixul .html (.htm)?
29. De ce pagin static, de ce pagin dinamic?
30. Explicai termenii development i deployment.
31. Ce este un proces, multitasking i multithreading?
32. La ce valori de port schimb replici motorul JRun dar motorul Resin? Ce
nseamn port i soclu?
33. Ce nseamn cookie?
34. Cum se obine un servlet cu un motor specializat?
35. Care sunt cei trei protagoniti implicai n schimbul de informaie dintr-o sesiune
la un sit comercial?
36. Ce este aa-zisul fake-root?
37. Este corect adresa URL urmtoare: http://localhost:8088/test/pagina.jsp?
38. n instruciunea out.println( ); ce reprezint out, dar println?
39. Dai un exemplu de similitudine a clasei, pachetului, obiectului i metodei
(indicaie vezi finalul capitolului 3).
40. Se face sau nu distincie ntre literele mici i mari n denumirile unei clase? Este
tot una cu a scrie javax.servlet.jsp.JspWriter cu javax.servlet.jsp.jspwriter?
41. Ce este o metod n sensul Java?
42. Explicai rostul etichetelor jsp:include i jsp:forward.
43. Ce rost au etichetele jsp:useBean, jsp:setProperty i jsp:getProperty?
44. Care sunt delimitatorii unei directive?
45. Explicai rostul motenirii.
46. Metodele care ncep cu cuvntul set i get dintr-o clas Bean ce conin n
continuare n denumire?
47. Ce restricii se cer variabilelor unei clase tip Bean?
48. Contemplai listele mai jos. Mai nti pagina example3a.jsp:
<html>
<head><title>Session Example</title></head>
<body>
<p>
<h1> Where will your balance take you?</h1>
<br>
<%-- Get paramaters from the request object --%>
<% String firstName = request.getParameter("fname"); %>
<% String balance = request.getParameter("bal"); %>
<%-- Convert the bal paramater from String to double --%>
<% double accountBalance = Double.valueOf(balance).doubleValue(); %>
<%--
Write input paramaters to the session object
The session object cannot store a double.
You must first convert it to a Double.
--%>
<%
session.setAttribute("userName", firstName);
Double tempAccountBalance = new Double(accountBalance);
session.setAttribute("userBalance", tempAccountBalance);
%>
<%-- Output results --%>
Balance for <%=firstName %>: <%=accountBalance %> <br>
<br><br>
Would you like to <A href="example3b.jsp">invest your money</a>?.
<br><br>
Do you need a <a href="example3c.jsp">job</a>.
</body>
</html>

apoi example 3b.jsp:


<html>
<body>
<%-- Get name from the session object --%>
<% String fname = (String) session.getAttribute("userName"); %>
<h2>Hi <%=fname %> </h2>
<%-- Get balance and convert to double --%>
<%
Double tempBal = (Double) session.getAttribute("userBalance");
double accountBalance = tempBal.doubleValue();
%>
<%-- Got enough money too invest? --%>
<% if(accountBalance > 100.00) { %>
Your balance of $<%= accountBalance %> is sufficient for investing.
We offer a number of investment opportunities, including: <br>
<li>Bonds<br>
<li>CDs<br>
<li>Mutual funds<br>
<% } %>
<%-- Is balance too low? --%>
<% if(accountBalance <= 100.00) { %>
Your balance is too low for investing. It looks like you need a <a
href="example3c.jsp">job</a>.
<% } %>
</body>
</html>

i n final, example3c.jsp:
<html>
<body>
<%-- Get paramaters from the session object --%>
<% String fname = (String) session.getAttribute("userName"); %>
<h2>Hi <%=fname %></h2>
<h2>Available positions include:</h2>
Software Engineer<br>
QA<br>
Technical Writer<br>
</body>
</html>

Dup pornirea motorului JRun i a browserului MSIE se d comanda:


http://localhost:8100/example3a.jsp?bal=345.56&fname=Oprea
Descifrai dumneavoastr ce rost au aceste fiiere i coninutul lor.
52. Explicai listele de mai jos: mai nti fiierul includedir.jsp:
<html>
<body>
<%@ include file="inc\antet.inc" %>
<%@ include file="inc/corp.inc" %>
</body>
</html>

apoi fiierul antet.inc din directorul inc fiu al directorului test:


<head>
<title>Exemplu de includere a unui fisier cu directiva include</title>
<style type="text/css">
<!--
body { background-color:blue; color:white; }
-->
</style>
</head>

i n final, corp.inc:
<body>
<h1 align="center">Exemplu de folosire a directivei Include</h1>
<hr/>
<font face="Verdana"><p>Aici e un prim paragraf.</font>
<font face="Times Roman"><p>Aici e al doilea paragraf.</font>
<font face="Arial"><p>Merg ambele feluri de slash-uri si asa ("\") si asa ("\"), cand
incluzi cu directiva file fisiere.</font>
</body>
53. Ce se ntmpl aici?
<%@ page language='java' %>
2 + 3.14 / 5 - int(4.44) = <%= 2 + 3.14 / 5 - (int)4.44 %>

ntrebri cu rspunsuri
1. n adresa urmtoare http://localhost:8080/test/welcomets0.jsp cum v dai seama
c s-a folosit motorul servlet Resin i nu JRun
2. Care este ordinea de evaluare a unei expresii JSP: a. De la stnga la dreapta sau
b. De la dreapta la stnga. Iat expresia:
<%= new File(application.getRealPath(request.getServletPath())) %>

3. Privii lista urmtoare. Ce se realizeaz cu ea?


<html>
<! >
<! Servlet comentar1.jsp >
<! Autor Dan Somnea editia 0 >
<! Revizia 2. Azi 6 feb. 2003 >
<! >
<%@include file="inc/antet.inc" %>
<body>
<p> Urmeaza ca prin acest truc sa by-passez un fragment de cod JSP.
<p> Veti remarca ca (deschizand cu View - Source pagina sursei html), de aici va lipsi
<p> tocmai fragmentul de cod JSP baipasat!
<P>
<!--
<%-- Aceasta pagina a fost generata la data
si ora = <%= (new java.util.Date()).toLocaleString() %>
--%>
-->
<!--Aceasta pagina a fost generata la data de <%= (new
java.util.Date()).toLocaleString() %> -->
</body>
</html>

4. Cum facem s vedem rezultatul ultimei expresii din lista de mai sus?
5. Ce condiii trebuie s fie ndeplinite ca o pagin jsp s funcioneze ca pagin
interceptoare de erori?
6. Ce este greit n liniile de mai jos?
<LI><a href="fruct2.jsp!fruct=mar">mar</a>
<LI><a href="fruct2.jsp?fruct=mar?fruct=par">mar si par</a>

7. Unde se transmite irul de interogare urmtor:


<LI><a href="fruct2.jsp?fruct=mar">mar</a>

8. Care este irul de interogare de mai sus? Comentai i detaliai (contextul


browserelor Netscape, MSIE)
9. Un obiect implicit, out de exemplu, trebuie instaniat de noi sau nu, adic vom
scrie ceva de genul JspWriter out = new.javax.servlet.jsp.JspWriter(); n ce
limbaj se scrie aici?
10. Orientndu-v dup lista 4.2 ncercai s descriei cu cuvintele dumneavoastr ce
face programul de mai jos:
<%@ page import="java.util.Enumeration" %>
<%
for (Enumeration e = request.getParameterNames();
e.hasMoreElements(); )
{
String nume_par = (String) e.nextElement();
String[] valori = request.getParameterValues(nume_par);
String lista_de_valori = valori[0];
int i;
while (i < valori.length)
lista_de_valori += ", " + valori[i];
out.println("<br>" + nume_par + " = " + lista_de_valori);
}
%>

11. Cine este servletul care preia datele formularului din lista 4.4b? Ce se transmite
la serverul Web? Cnd se transmite?
12. De ce i se spune radio button unei resurse de formular HTML?
13. Ce nseamn boolean?
14. Privii lista 4.5a. Cnd ntlnim ceva de genul acesta:
String vizitator = getValues( request, "vizitator" );

nseamn c metoda getValues() a obiectului request are acces la ntregul ir de


perechi atribut=valoare corespunztor tuturor rubricilor formularului sau doar la
ceva anume?
15. Contemplai lista 4.5b. Fixai-v atenia asupra liniei:
if( cnp.equals("") ) {

Ce sunt: if, cnp i equals? Ce se realizeaz aici?


16. Fie urmtoarea instruciune:
String tabelHTML = <table border=\0\><tr><td>celula 1</td></tr></table>;

Ce rost au caracterele \ care preced ghilimelele? Cine este tabelHTML?


17. Fie instruciunea de atribuire urmtoare:
String tableC = tabC+</tr></table>;

Ce este tabC, dar grupul de caractere ncadrat de ghilimele?


18. Privii lista 4.5d. Cum tie containerul servlet c aici este un program scris n
limbaj Java?
19. Cnd scriem:
"<%= DateFormat.getTimeInstance().format(new Date()) %>"

de ce nu folosim operatorul de instaniere new n expresia de mai sus?


20. Privii lista de mai sus. De ce se scrie new Date()?

Rspunsuri
1. Resin, deoarece este portul 8080. Serverul JRun Default folosete portul 8100.
2. b.
3. Este o pagin jsp. n prima parte este un comentariu clasic al HTML. Urmeaz o
directiv pentru includerea fiierului antet.inc. El rezid n subdirectorul inc.
Urmeaz liniile banale ale unui document de tip HTML. Observm un scriptlet;
dovad prezena separatorilor <% i %>. Acesta este ns ncadrat de separatorii
comentariului de tip ascunde cod, <%-- i -->. Cnd vei vizualiza coninutul
sursei cu MSIE pe traseul View, Source Code, vei observa c acest scriptlet
lipsete cu desvrire din fereastra denumit cod surs, Source Code. Sunt
redai doar delimitatorii comentariului. Mai departe, vedem alt comentariu tot de
tipul ascunde cod. Aici ns apare o expresie JSP. Rezultatul evalurii sale se
poate vedea doar n fereastra Source Code i red data i ora conform tipicului
de scriere al fusului local.
4. Dm la o parte separatorii <!i -->
5. Dou condiii: n directiva page s fie atributul isErrrorPage plasat pe true, s
existe o expresie <%=exception %>.
6. Dou lucruri. n prima linie se folosete semnul mirrii n locul semnului de
interogare, iar n a doua, semnul interogrii n loc de caracterul &.
7. La serverul Web unde este prelucrat de un servlet.
8. fruct2.jsp?fruct=mar. Dac am avea dou sau mai multe cuvinte separate prin
caractere care dau probleme la unele browsere (Netscape) trebuie s recurgem la
metoda de substituire, encode a clasei URLEncoder. Ea substituie blancurile cu
caracterele %20 etc. MSIE nu are probleme!
9. Nu! Noi nu vom scrie niciodat linia din limbajul Java. Cel care o genereaz este
motorul servlet.
10. Se face exact acelai lucru care se realizeaz cu lista 4.2 doar c se recurge la
blocul while. Variabila de indecsare a blocului while ne ajut s alctuim pas cu
pas un literal ce const din valorile sosite n irul de interogare URL, pe care
metoda getParameterNames() le preia din ir. Obiectul request este specializat n
analizarea perechilor atribut=valoare.
11. Fiierul mypisi_raspunsuri.jsp. Un ir de interogare este alctuit din perechi de
atribute=valoare i este delimitat prin caractere &. Semnul interogrii (?) separ
partea de baz a adresei n sens URL de restul irului. Dac valoarea este
alctuit din mai multe cuvinte, pot apare semne plus (secvene escape) la
serverul Web n locul spaiilor sau semne %20 aa cum sunt redate n tabelul
4.1. La momentul cnd am acionat butonul de tip submit, faptul este echivalent
cu apsarea pe tasta Enter, cnd ar fi fost focalizat ultima rubric a
formularului. Focalizat, adic cea care era redat mai distinct!
12. Citii anexa A.
13. Este un cuvnt cheie al limbajului Java, prin care variabila este una logic.
Boolean poate avea doar dou valori: adevrat (true) sau fals (false).
14. Da are acces la tot irul de perechi, dar extrage doar valoarea rubricii vizitator!
15. Cuvntul if este o instruciune din limbajul Java. Servete la testarea unei
condiii. Se verific dac variabila cnp conine un ir vid. Cnd rubrica cnp,
cod numeric personal, ar rmne necompletat, n variabila cnp nu va fi nimic.
Cuvntul equals se refer la denumirea metodei clasei String. n sfrit, cnp este
o variabil de tip String.
16. Prezena barei inverse naintea ghilimelelor este necesar deoarece ghilimelele
sunt considerate delimitator de literal (Java). i, HTML folosete ghilimelele cu
alt sens. Ca s ajung a fi tratate de HTML, orbim compilatorul prin plasarea n
faa ghilimelelor a acestui caracter (\). Denumirea tabelHTML este o variabil
de tip ir de caractere.
17. Denumirea tabC trebuie s fie definit tot ca variabil de tip ir, aa cum este
definit i variabila tableC. Expresia dintre ghilimele este un literal n sensul
limbajului Java.
18. Datorit delimitatorilor <%! i %>.
19. DateFormat este o clas abstract ca i clasele obiectelor implicite. Numai c
obiectul DateFormat are o utilizare mai sporadic de aceea nu mai este instaniat
automat de ctre JVM.
20. Date este o clas explicit nu abstract. De aceea este nevoie de operatorul new.
7
Capitolul

Primii pai n tehnologia ASP


Microsoft a avut oportuna idee de a dezvolta colecia obiectelor ActiveX i
limbajul Visual Basic, un liant al tuturor programelor din suita Office. Nu ne
apucm s explicm ce este ActiveX i Visual Basic (VB). Presupunem c avei
cunotine extrem de puine despre un limbaj de programre procedural. VB este
reprezentat de cteva subfamilii: Visual Basic nativ, Visual Basic for
Applications (cel al Excel-ului), Visual Basic for Scripting (prescurtat VBScript).
VB nativ este familiar tehnologiei ASP.NET. Varianta VBScript este folosit n
tehnologia ASP.
Cnd vorbim de tehnologia ASP, siturile Web, deci i siturile comerciale, sunt
administrate de unul dintre serverele Web ale platformei Microsoft Windows.
Este vorba fie de Personal Web Server (Windows 98) fie de Information Internet
Server (Windows NT), vezi i introducerea.
Cu ncepere din acest capitol ne vom ocupa mai n detaliu de tehnologia Active
Server Pages, dect am fcut-o n referina /1/.
Exist preri potrivit crora tehnologia ASP ar fi mai oportun pentru
construirea siturilor mai ... firave! Este o abnormitate! Nou ni se pare destul de
prietenoas i destul de flexibil aceast tehnologie. Oricum, politica rspndirii
tehnologiilor este una de care nu este cazul s ne ocupm.

S
vedem mai nti de ce avem nevoie n materie de suport software cu pretenii
mai modeste. Am spus-o i n introducere, fr un pachet care face legtura cu
bazele de date (MS Access, n cel mai bun caz, MS SQL Server) nu putem face
un pas! Vizitatorii unui sit comercial trebuie nregistrai, la fel i courile lor de
cumprturi, comenzile pe care le fac. Unde altundeva dect n baze de date.
Cnd vrem ca s aib acces simultan la magazinul virtual mai mult de 30 vizitatori,
cumprtori este nevoie de Microsoft SQL Server.
n sfrit, doar pentru scop didactic, ne este extrem de suficient MS Access.
Limbajul de baz al tehnologiei ASP este Visual Basic for Scripting, VBScript.
Ar mai trebui s recurgem la serviciile unui container pentru servleturi?
Nu, fiindc acest VBScript este un limbaj interpretat pe loc de ctre serverul Web al
platformei Windows! Deci nu mai are loc o traducere prealabil a codului surs
VBScript ntr-un cod de octei, cum era n cazul tehnologiei Java Server Pages.
Scade ntr-adevr puin performana, dac avem parte de un sit foarte vizitat i, mai
avem i proasta inspiraie de a recurge la MS Access n loc de MS SQL Server!
Este cert c viteza de execuie a unui cod de octei este mai mare dect interpretarea
unui program surs! Bibliotecile EJB din platforma Java se spune c sunt extrem de
perfomrante. De aceea sunt vndute pe bani grei! Au de ce s se ngmfe cei de la Sun,
dar politica lor eremetic de acceptare a unei versiuni tiny n mediul didactic nu prea a
fost agreat de ctre Sun!
Apropo de portabilitatea cu care se laud platforma Java. Microsoft nu este o firm de
neluat n seam. Vezi i informaiile despre acele servere 2000 ale platformei anunate n
introducerea la carte n limba romn. Alte dovezi : cei de firma ChiliSoft (vezi /6/) au
conceput prin anul 1999 pachetul Chili!ASP, prin care s-a permis folosirea tehnologiei
ASP de sub controlul serverelor Apache, Netscape Entreprise, OReilly Website Pro,
Lotus Domino Go Webserver. Se spune c ar exista PWS sau IIS chiar pentru platforma
Macintosh.
Chit chat! S trecem mai bine la fapte!

Ce este o pagin ASP?


Este un fiier de tip text ca i pagina .jsp. Aici ns extensia este .asp. Acest fiier conine
n afara nelipsitelor poriuni scrise n HTML i scenariile realizate n VBScript, JScript.
Nu ne ocupm dect de VBScript. Privii dou ipostaze simple n lista de mai jos.
LISTA 7.1 Pagina salut1.asp

<HTML><BODY>
<%
' Folosirea obiectului implicit Response
response.Write("Bine ati venit in magazinul nostru virtual!")
%>
<%
' O pagina in care afisez data si ora
%>
<p>Acum suntem in data de <%=DATE()%>.
<p>Si la ora <%=TIME()%>
</BODY></HTML>
Explicaii i parafraze
Remarcai c am recurs la litere mari pentru a marca prile mai evidente ale HTML ca
i denumirile funciilor DATE( ), pentru dat, sau TIME( ), pentru or. Mai remarcai c
separatorii pentru scriptlei sunt identici ca la tehnologia JSP.
Sunt admise comentarii n interiorul scenariului aa cum se vede mai sus. Comentariul
ncepe cu un apostrof n prima coloan. Dac plasai cometariile n afara scriptleilor ei
apar n fereastra browserului!
n sfrit, remarcai caracterul identic al expresiilor. Tehnologia ASP are alt termen
pentru expresii. i spune dat de ieire. Ct privete delimitatorii pentru datele de ieire
ei sunt identici ca la Java Server Pages, i anume: <%= i %>. Iat cum arat aspectul
documentului din ferestra clientului Web (MSIE):

FIGURA 7.1 Aspectul ferestrei documentului MSIE, pentru pagina salut1.asp

ntr-o pagin ASP se admit scenarii scrise ntr-un dialect al limbajului JScript (un fel de
JavaScript al Microsoft). Exist chiar i PerlScript. Nu ne ocupm i de aa ceva!
Sunt cteva probleme de lmurit.
Mai nti ce flux de caractere se trimite spre clientul Web? La browserul MSIE nu ajung
i scenariile ci numai rezultatul interpretrii acestora. Interpretarea are loc la serverul
Web. VBScript am spus-o i o repetm, nu este un limbaj care s necesite compilare ci
interpretare.
A interpreta nseamn a executa pe loc acea instruciune VBScript! Cnd modificm o
pagin cu extensia .asp cu orice editor de texte (dup ce accedem situl prin adresa sa n
sensul URL, vezi partea de sus a figurii 7.1, http://localhost/alias/nume_pagina.asp),
serverul Web ncarc fiierul nume_pagina.asp, care se afl n directorul echivalent
aliasului. Apoi, interpreteaz pe loc instruciunile din scenariile aflate n aceast pagin.
Deci la clientul Web vine exact fluxul de caractere din poza de mai sus!
Cine este response, dar Write? Suntem doctori n tehnologia JSP! Dac nu, atunci
response este denumirea obiectului rspuns (ntocmai ca la JSP). Metoda nu mai este
println( ) ci, Write.
S ne relaxm fa de JSP! Nu se mai cere acea exactitudine n privina transcrierii
denumirilor metodelor i obiectelor. n ASP nu se face distincie ntre literele mici i
mari ca n tehnologia JSP. Slav Domnului!
Am afirmat mai sus denumirea alias. Dup instalarea serverului Web, sistemul de
operare Windows pornete automat acest server (IIS sau PWS, depinde de sistemul de
operare instalat). n acest manual am recurs la serviciile serverului Microsoft IIS 5,
fiindc sistemul de operare instalat era Windows 2000 Professional Workstation.
Cum a aprut acel cuvnt olga n adresa de mai sus? Iat procedeul:

1. Am efectuat clic pe pictograma aflat pe suprafaa de lucru.


Am ales fila Advanced, avansat (figura 7.3). A aprut o fereastr
asemntoare cu aceea din figura de mai jos. Prin intermediul butonului
Browse, rsfoire, am ajuns n directorul c:\Inetpub\wwwroot\olga. De fapt
directorul c:\Inetpub\wwwroot este aa-zisul fake-root al serverului IIS (PWS),
iar olga este un subdirector al su.

FIGURA 7.2 Fereastra Add Directory

2. n alias am scris exemple didactice, apoi am efectuat clic pe OK. n acest


moment am revenit n fereastra din figura urmtoare i de aici am ieit n modul
uzual.
FIGURA 7.3 Fila Advanced a serverului Web (PWS, IIS)

FIGURA 7.4 Fila olga Properties a directorului cu acelai nume

3. Procedura nu s-a terminat. Ajungem n directorul olga (prin MyComputer, sau


Windows Explorer), efectum clic pe dreapta, cu mausul plasat chiar pe
denumirea olga.
4. Alegem opiunea properties, proprieti (figura 7.4) apoi fila sharing, adic
accesibil i altora. Selectm opiunea Share this folder, acces la acest director
pentru toi. Accesul va fi doar n citire nu i n scriere! V recomandm s nu
permitei accesul la scenariu i n scriere! Denumirea alias n cazul de mai sus
este chiar a unui subdirector la directorul wwwroot. Putea foarte bine ca situl
nostru s fie n cu totul alt loc pe disc. Atunci, am fi urmat procedura de mai
sus. Trebuia nscris rubrica alias (figura 7.2) o denumire pentru specificaia de
cale, care ar fi rezultat din rsfoirea ierarhiei de directoare, ca s ajungem n
directorul gazd a paginii ASP. n acest caz, denumirea de alias se justific
ntruct ea substituie complicata specificaie de cale la acest director!
Gata! De aici ncolo, calea este liber! Remarcai tipicul adresei URL din figura 7.1 de
mai sus.
Fake-root-ul, adic rdcina mutant a serverului Microsoft IIS (PWS) este de regul
c:\Inetpub\wwwroot. i acest server are un director AdminScript, care este plin cu tot
felul de fiiere scrise n limbajul VBScript. Toate au extensia .vbs. Rostul lor este de a
pregti, iniializa aplicaia PWS, alias IIS, cnd se lanseaz aceasta.
Ne oprim aici cu chestiunile prea tehnice i revenim la iniierea n ASP. S ne ocupm
acum de scrierea unui mesaj lung care s aib i caractere speciale. Privii lista 7.2.
LISTA 7.2 Pagina salut_cam_lung.asp

<HTML><BODY>
<%
Response.write "Bine ati venit in magazinul nostru virtual " &_
"construit dupa regulile tehnologiei Active Server " &_
"Pages. Aici sunt preturile cele mai scazute. Daca " &_
"gasiti altundeva in oras ceva mai ieftin de vineri " &_
"pana luni, veniti luni dimineata inapoiati marfa " &_
"si va restituim banii pe loc!"
%>
<P><FONT FAMILY="Verdana" SIZE="5" COLOR="BLUE">
<%
' Ocolirea diacriticelor
response.write server.htmlencode("Ne zice: <<La ...ache!>>")
%>
</FONT></BODY></HTML>

FIGURA 7.5 Aspectul documentului salut_cam_lung.asp


Explicaii i parafraze
Remarcai sintaxa irului de caractere din instruciunea response.write. Mai remarcai
lejeritatea scrierii cuvntului response. Nu se face distincie ntre literele mari i cele
mici.
Pentru trimiterea caracterelor cu probleme cum sunt caracterele < i >, dar i altele,
care au un rost n limbajul VBScript, trebuie recurs la metoda htmlencode(). Putea fi
transcris i ca HTMLEncode() sau HtmlEncode() etc.
Aceast metod este a obiectului implicit server.
Cu ce obiecte implicite lucrm n ASP?
Numai cu ase obiecte, nu cu nou, ca n JSP. Acestea sunt denumite: aplicaii
(applications), server, cerere (request), rspuns (response), sesiune (session) i contextul
obiectului (objectcontext). Nu vi se pare mai lizibil notaia Applications, Response,
Request, . . . , ObjectContext? Sigur c da! Dar nu este o obligaie a transcrie exact aa!
Nu v speriai c nu o s ne apucm s v povestim ce rost are fiecare obiect implicit. n
exerciiul nostru despre un sit comercial ne vom ntlni numai cu request, foarte rar cu
response, server i session.

Cteva noiuni despre VBScript


Am aflat deja sintaxa comentariului i faptul c nu se face distincie ntre literele mici i
mari.
VBScript opereaz cu variabile. De pild scriem:
pretProdus = 0

Variabila scalar pretProdus capt valoarea zero. Este o variabil numeric. Evident
c putem memora valori cu zecimale. Exist desigur operatorii pentru: adunare, scdere
etc. Nu intrm n detalii. Exist i variabile de tip text, ca mai jos:
sqlString = "SELECT DISTINCT categorie_produs FROM Produse "

Faptul c scriem cu litere mari este doar din motivul lizibitii. Variabila sqlString este
tot una cu sqlstring sau SQLstring. Ea capt o valoare. I se spune literal. Literalul este
ncadrat de ghilimele. De fapt exemplul de fa se refer la nceputul unei comenzi SQL.
Dar despre SQL vom vorbi n paragraful urmtor.
Variabilele de tip text se pot alipi (de la englezescul concatenate). Iat un caz:
sqlString = sqlString & "WHERE stare_produs=1 "

Coninutul variabilei sqlString se prelungete cu literalul WHERE ... Deci acum


sqlString va conine textul SELECT DISTINCT categorie_produs FROM Produse
WHERE stare_produs=1. Operatorul de alipire este &.
Exist i variabile care preiau obiecte:
numeProdus = RS("nume_produs")
Aici obiectul este RecordSet, un tabel rezultat n care se livreaz un rspuns dup
analiza unei baze de date. Mai multe tabele alctuiesc o baz de date.
Exist i constante de tip citete numai. Iat un caz:
CONST numVitrina = 3

n numeVitrina nu mai putem nscrie alt valoare i nu i putem schimba tipul.


S ne referim puin la unele instruciuni pe care le ntlnim n exemplul nostru complex
de sit comercial.
Mai nti instruciunea if. Dm cteva ipostaze. Primul este unul mai simplu:
IF caracteristiciProdus = "" THEN
caracteristiciProdus = "nil"
END IF

Dac variabila caracteristiciProdus nu conine nici un literal (n jargon se spune: conine


un ir vid, i notaia din program este ), atunci ea va primi textul literal nil. Cei care
lucrau n urm cu vreo 25 ani n urm n limbajul Pascal i amintesc c irul vid se
numea nil i l notau . Observai delimitatorii literalului. Orice IF se ncheie cu un
ENDIF.
Putem scrie aa:
IF cat = "" THEN cat = "Acasa"

sau aa:
IF cat = "" THEN
cat = "Acasa"

efectul este acelai: dac variabila cat este vid (deci nil n sensul Pascal), atunci lui cat i
se va atribui literalul Acasa.
Evident instruciunea IF poate avea i alternativa ELSE, ca mai jos:
IF RS.EOF THEN
dejaInBD = FALSE
ELSE
dejaInBD = TRUE
END IF

Dac obiectul notat prin RS, de tipul RecordSet, a fost parcurs i s-a ajuns la finalul su,
adic la EOF, end of file, atunci variabila dejaInBD capt valoarea logic FALSE, n
caz contrar, valoarea TRUE. Deci n VBScript se opereaz i cu variabile logice i nu
numai cu cele ntregi sau cu zecimale.
S mai complicm puin lucrurile! Exist i tot felul de funcii. Iat un prim caz:
IF isNumeric(newQ) THEN
RS("cantitate_cos") = newQ
END IF
Dac n variabila newQ se afl o valoare numeric ntreag sau cu zecimale
(isNumeric), atunci cmpul denumit cantitate_cos din rezultatul RS, va prelua coninutul
variabilei newQ. Deci funcia a fost isNumeric(). Alt caz:
FUNCTION SELECTED(valoare1, valoare2)
IF cSTR(valoare1) = cSTR(valoare2) THEN
SELECTED = "SELECTED"
END IF
END FUNCTION

Aici apare o funcie de bibliotec cSTR() i o funcie creat adhoc, denumit


SELECTED. Acesta nu este dect un tipic de scriere. Am dorit s fie mai vizibil
denumirea funciei SELECTED. Funcia cSTR() convertete un ntreg n ir de caractere
(literal). Variabilele pstrtoare de numere ntregi sunt denumite valoare1 i valoare2. n
cazul contextului de fa, valoare1 i valoare2 sunt parametrii fictivi, argumentele
fictive. Acestea primesc drept coninut valori din partea argumentelor reale la momentul
apelului. Dac coninutul este identic (operatorul de comparaie este aici semnul egal),
se va atribui variabilei SELECTED valoarea SELECTED. E admis aa ceva? Da ! Nu
am greit! Funcia noastr va ntoarce un rezultat, iar acesta am hotrt s fie irul de
caractere SELECTED. Putea foarte bine s ntoarc un ntreg sau un numr zecimal sau
o valoare logic adevrat (TRUE) sau fals (FALSE).
Iat o expresie mai complicat n IF:
IF newQ = "" OR newQ = "0" THEN
RS.Delete

Cnd coninutul variabilei newQ este cifra 0 sau nimic (nil adic ir vid n sens Pascal),
numai atunci se execut tergerea rndului curent din obiectul RS. Aici am ntlnit la
lucru att SQL ct i VBScript!
Privii alt fel de operator de comparaie:
IF RS("caracteristici_produs") <> "nil" THEN

Semnele <>, numai cnd sunt alturate, au semnificaia de diferit. Deci dac rubrica
caracteristici_produs din RecordSet este diferit de textul nil, se execut ce urmeaz
dup THEN.
IF topVitrina <= numVitrina THEN skip = 1

Cnd coninutul variabilei topVitrina este mai mic sau egal (<=) dect coninutul
variabilei numVitrina, atunci variabila skip va cpta valoarea 1.
IF NOT RS.EOF AND camp_cautare <> "" THEN

Dac nu s-a ajuns la finalul tabelului rezultat alias obiectul RS i dac n acelai timp
valoarea din camp_cautare este diferit de un ir vid, atunci se execut toate
instruciunile ce urmeaz dup THEN.
Acum iat o comparaie pe dos:
IF NOT RS.EOF THEN
numeProdus = RS("nume_produs")
pretProdus = RS("pret_produs")
caracteristiciProdus = RS("caracteristici_produs")
categorieProdus = RS("categorie_produs")
produsDeVitrina = RS("produs_de_vitrina")
ENDIF

Explicaii
Dac nu s-a ajuns la finalul obiectului RecordSet, reamintim este un tabel cu diverse
coloane cu anumite denumiri, se vor transmite valorile lor unor variabile locale precum:
numeProdus etc.
S mai trecem la alte funcii de bibliotec. De pild aici:
parolanoua = TRIM( Request( "parolanoua" ) )

variabila parolanoua i va modifica coninutul. Dac ea coninea abc de f, dup ce se


execut funcia TRIM (trimitere blancuri la spate) ea va deveni abcdef . Cu alte
cuvinte spaiile (programatorii le spun i blancurile) se adun la coada literalului.
Sau iat ceva cu o notaie i mai fistichie:
eliminProdus = TRIM(Request("pq" & RS("id_cos")))

Variabila eliminProdus va fi alctuit din dou iruri alipite. Primul ir conine literele p
i q, scrise alturat. n continuare al doilea ir provine de la ceea ce ntoarce obiectul
RecordSet din coloana id_cos. S ne nchipuim c acest id_cos ar avea 34. irul
rezultant va fi pq34.
Cnd vedei obiectul request, s facei automat n cap asociaia urmtoare: aici este
vorba de o cerere care vine de la clientul Web la serverul Web. Aceast cerere provine
fie n urma unui clic efectuat pe butonul submit al formularului, fie de la un ir de
interogare aflat pe o legtur de tip hypertext.
S adncim ultima afirmaie. Atunci suntem obligai ca s ntrerupem seria explicaiilor
asupra limbajului VBScript, i s trecem la limbajul ASP.

irul de interogare n ASP


Iat un exemplu format din dou pagini care trateaz iruri de interogare:
LISTA 7.3 Pagina lafructar.asp

01. <html>
02. <head><title>La fructar</title> </head>
03. <body>
04. Alege doar un fruct:
05. <%
06. ceFructAleg = "Mandarine de Grecia"
07. ceFructAleg = Server.URLEncode( ceFructAleg )
08. ceSortAleg = "Mandarine mai mici, dar suculente"
09. ceSortAleg = Server.URLEncode( ceSortAleg )
10. %>
11. <p><a
href="aleg.asp?fructe=<%=ceFructAleg%>&tip=<%=ceSortAleg%>">Mandarine
de Grecia</a>
12. <%
13. ceFructAleg = "Mandarine de Cipru"
14. ceFructAleg = Server.URLEncode( ceFructAleg )
15. ceSortAleg = "Mandarine mai mari, cu coaja mai groasa dar extrem de dulci"
16. ceSortAleg = Server.URLEncode( ceSortAleg )
17. %>
18. <p><a
href="aleg.asp?fructe=<%=ceFructAleg%>&tip=<%=ceSortAleg%>">Mandarine
de Cipru</a>
19. <%
20. ceFructAleg = "Ionatane de Turcia"
21. ceFructAleg = Server.URLEncode( ceFructAleg )
22. ceSortAleg = "Mere mari Ionatane"
23. ceSortAleg = Server.URLEncode( ceSortAleg )
24. %>
25. <p><a
href="aleg.asp?fructe=<%=ceFructAleg%>&tip=<%=ceSortAleg%>">Ionatane
Turcesti</a>
26. <%
27. ceFructAleg = "Mere de Voinesti"
28. ceFructAleg = Server.URLEncode( ceFructAleg )
29. ceSortAleg = "Mere mai mici dar grozav de aromate"
30. ceSortAleg = Server.URLEncode( ceSortAleg )
31. %>
32. <p><a
href="aleg.asp?fructe=<%=ceFructAleg%>&tip=<%=ceSortAleg%>">Mere de
Voinesti</a>
33. </body>
34. </html>

i pagina aleg.asp
LISTA 7.4 Pagina aleg.asp

<html>
<head><title>La fructar</title> </head>
<body>
Ai ales urmatoarea marfa:
<p>Fructul <%=Request.QueryString( "fructe" )%>
<p>Sortul <%=Request.QueryString( "tip" )%>
</body>
</html>

Explicaii i parafraze
S ne fixm atenia pe pagina intitulat lafructar.asp. Ea conine mai multe scenarii.
Privii delimitatorii de scriptleturi din dreptul liniilor cu numerele 05, 10, 12, 17, 19, 24,
26 i 31.
Denumirea Server din faa funciei URLEncode se refer la obiectul server. De
exemplu, instruciunea din linia 21 va ncrca n variabila denumit ceFructAleg o
valoarea, rezultat din transformarea funciei URLEncode(). URLEncode face cam
acelai lucru ca i funcia HTMLEncode(), ntlnit mai sus. Ea nlocuiete caracterele
speciale (spaii etc.) cu aa-zisele secvene escape ntlnite n capitolul 5, tabelul 4.1
(tehnologia JSP).

Din nou VBScript


Dup aceast divagaie s revenim la VBScript.
Am afirmat c obiectul implicit request se ocup i de iruri de interogare. Cnd facei
un clic pe una dintre legturile de tip hypertext din figura 7.6, se trimite spre serverul
Web un ir de interogare. Privii liniile numeroatate cu 11, 18, 25 sau 32. Tot ce vine
dup semnul ntrebrii se numete ir de interogare. Observai acum lista paginii
aleg.asp. n liniile 05 sau 06 apare obiectul request. Deci obiectul request se ocup i de
irurile de interogare. Aceasta am dorit a v spune.
Avem tot timpul s explicm mult mai uzitatul caz al formularului, unde obiectul
request i face simit prezena din nou.

FIGURA 7.6 Aspectul documentului paginii lafructar.asp

S abordm buclele for i while n ASP.


Bucla for este delimitat de instruciunile for i next:
FOR i = 1 To LEN( digits) STEP 1
checkSum = checkSum + CINT( MID( digits, i, 1 ) )
NEXT

Explicaii i parafraze
Blocul for este alctuit aici doar dintr-o singur instruciune. Pot fi oricte la numr. Se
admite i for n for! Variabila de indexare este i. LEN este o funcie de bibliotec ce
ntoarce numrul de caractere din variabila digits. Admitei c variabila digits ar conine
drept literal, un ir de cifre 23456. Atunci len(digits) va da valoarea 5. Variabila de
indexare i va crete cu cte o unitate (Step 1). Evident dup STEP putea urma o expresie
complicat.
S vedem ce se ntmpl n variabila checkSum. Aici se totalizeaz nite valori
numerice. Valoarea numeric este obinut graie funciei de conversie din tip caracter n
tip ntreg. Se numete CINT(). Evident ce trebuie convertit trebuie s fie un ir de cifre.
Provoi acum funcia MID(). Ea acioneaz precum un vizor care se mut de la un
caracter la altul al irului. Mai exact se preia din irul digits doar cte o singur cifr. De
ce numai una? Fiindc este scris forma MID(digits, i,1), acel 1 din ultima poziie spune
c este vorba de un singur caracter. De fiecare dat coninutul variabilei i crete cu cte
o unitate. Prima dat i este egal cu 1, apoi cu 2, .a.m.d. Deci se iau la rnd cifrele i se
extrag din digits. Atunci checkSum va conine n final 2+3+4+5+6, deci valoarea 20.
S privim un caz mai complicat de bloc for:
01. FOR EACH resursa IN Request.Form
02. %>
03. <input name="<%=resursa%>" type="hidden"
value="<%=Server.HTMLEncode(Request(resursa))%>">
04. <%
05. NEXT

Explicaii i parafraze
Aici am numerotat liniile. Scenariul este alctuit doar din liniile 01 i 05. De ce? Privii
ordinea delimitatorilor. Mai nti n linia 02 se afl delimitatorul de sfrit de scenariu.
Se intr pe teritoriul HTML n linia 03. n linia 04 se revine napoi. Ce se realizeaz n
linia 03? Aici se preia n variabila resursa, valoarea ntoars de metoda HTMLEncode a
obiectului Server. Aceast metod a preluat la rndu-i, de la obiectul request (denumit
tot resursa) un ir de caractere. Acest ir de caractere este denumirea unei rubrici de
formular. Din lista de mai sus nu apare explicit acest lucru. Vei vedea aceiai secven
cnd va fi vorba de lista respectiv a exemplului de sit comercial, tratat mai jos pe
ndelete. Deci una peste alta n variabila resursa vor figura pe rnd denumirile rubricilor
unui formular.
Remarcai i enunul din linia 01. Obiectul request se ocup de rubricile formularului i
preia denumirile logice ale acestora. C aceste rubrici sunt de tipul ascuns, hidden, este
mai puin important. O rubric (echivalentul lui input name = ...) de tip ascuns
(type=hidden) nu se afieaz pe ecranul browserului!
S privim spre o construcie de bloc while. Iat secvena:
01. WHILE NOT RS.EOF
02. %>
03. <tr>
04. <td><%=RS( "id_comanda" )%></td>
05. <td><%=RS( "data_intrare_comanda" )%></td>
06. <td><%=RS( "nume_produs" )%></td>
07. <td><%=arataStareComanda( RS( "stare_Comanda" ), RS(
"data_livrare_comanda" ) )%></td>
08. </tr>
09. <%
10. RS.MoveNext
11. WEND
Explicaii i parafraze
Scenariul este alctuit din liniile 01, 10 i 11. Att! Restul liniilor sunt din HTML.
Denumirile tr i td sunt balizele unui tabel HTML. n celulele tabelului afiat pe ecran,
se preia rubric dup rubric datele obiectului RS n acest exemplu. Coninutul su se
afieaz pe ecran cu expresii de genul:
RS(nume-de-rubric)

n linia 07 se afieaz rezultatul funciei arataStareComanda(), o funcie compus de


programator i nu din biblioteca VBScript. Ea folosete dou argumente de intrare.
Blocul WHILE este delimitat de separatorul WEND. Instruciunea din linia 10 mut
cursorul obiectului RecordSet la rndul urmtor. Considerai acest rezultat RecordSet
un table cu rnduri. Acest avans la urmtorul rnd are loc pn se ajunge la sfritul
tabelului (condiia RS.EOF din WHILE). Deci dup WHILE urmeaz expresia
condiional. Aceasta este evaluat de fiecare dat mai nainte ca s se execute ntregul
grup de instruciuni dintre separatorii WHILE i WEND. Grupul acestor instruciuni,
corpul while, se execut atta timp ct condiia se ndeplinete.
Aici operatorul NOT inverseaz exprimarea. Spunem aa: ct timp nu s-a ajuns la
sfritul tabelului, execut instruciunile corpului while.
S aruncm acum o privire spre funcia arataStareComanda(). Iat coninutul:
LISTA 7.5 Funcia arataStareComanda

01. FUNCTION arataStareComanda( starea, dataLivrare )


02. ' Care este starea comenzii
03. SELECT CASE starea
04. CASE 0
05. arataStareComanda = "In curs"
06. CASE 1
07. arataStareComanda = "Produs nu este in stoc"
08. CASE 2
09. arataStareComanda = "Livrat la data de " & dataLivrare
10. CASE ELSE
11. arataStareComanda = "Stare necunoscuta"
12. END SELECT
13. END FUNCTION

Explicaii i parafraze
Linia 02 conine un comentariu. Evident, acesta ncepe cu apostrof. Linia 03 se refer la
alt instruciune i anume la SELECT CASE. n funcie de valoarea variabilei
(argumentul fictiv) denumit aici starea, se execut una dintre ramurile CASE.
Argumentul stare a primit la apelare o anumit valoare i anume, ce s-a transmis prin
RS(stare_Comanda).
Mai departe, se sare imediat dup cuvntul END SELECT. Deci se ajunge la ieirea din
funcie. Funcia mai face un lucru i anume, atribuie celui de al doilea argument fictiv
dataLivrare, un text. El va fi unul dintre literalii cazurilor de mai sus. Acest argument
fictiv va transmite mai departe celui de al doilea argument real al apelului funciei
arataStareComanda(arg1, arg2) valoarea respectiv. Ea va fi aceea afiat pe ecran. n
construcia SELECT de mai sus, sunt trei cazuri distincte CASE 1, 2 i 3 i un caz
general, CASE ELSE.
Acum s vedem ce se realizeaz n instruciunile de mai jos:
FUNCTION apostrof12(Sirul)
apostrof12 = REPLACE(Sirul, "'", "''")
END FUNCTION

Explicaii i parafraze
Funcia are un singur argument fictiv intitulat Sirul. n cadrul su, se nlocuiete fiecare
apostrof cu doi apostrofi. Funcia REPLACE este o funcie de bibliotec VBScript. De
ce trebuie aceast substituie? Uneori n cadrul cmpurilor unui formular putem avea
valori precum aceasta: ScottsCompany, compania lui Scotts. Dac ar rmne acest
apostrof i, am vrea s nscriem aceast valoare ntr-o baz de date MS Access,
comanda INSERT INTO (SQL) nu ar funciona normal. MS Access (i MS SQL
Server) consider apostroful un delimitator de literal. Ca atare, nu s-ar nregistra dect
cuvntul Scott i nu ntregul text Scotts Company. Comanda INSERT INTO ... s-ar
opri la primul apostrof din valoare.
Pentru a preveni aceast terminare prematur, dublm apostroful, exact cum fceam cu
ghilimelele de mai sus. Este oportun s ne referim puin i la limbajul SQL. O vom face
imediat dup ce tratm un ultim aspect legat de funciile VBScript.
n exemplul de mai sus am trimis valori argumentelor fictive starea i dataLivrare. Iat
un caz mai complicat ce este folosit n cadrul sitului comercial:
LISTA 7.6 Funcia verificParola

01. FUNCTION verificparola(byVal numeclient, byVal parola, byRef Con)


02. sqlString = "SELECT id_client FROM Clienti " &_
03. "WHERE nume_client='" & numeclient & "' " &_
04. "AND parola_client='" & parola & "'"
05. SET RS = Con.Execute(sqlString)
06. IF RS.EOF THEN
07. verificparola = - 1
08. ELSE
09.
10. END FUNCTION

Explicaii i parafraze
Este vorba de funcia verificParola. Ea are trei argumente fictive. Primele dou primesc
direct valoarea. Acest mod de transmitere prin valoare este cel uzual. Asta nseamn c
n cadrul funciei se vor aloca dou zone de memorie. Se copiaz aici valorile
argumentelor reale. Ultimul argument fictiv comunic cu argumentul real prin
adres (byRef). El comunic cu obiectul denumit Con, care are legtur cu conexiunea
logic la baza de date. Amnm explicaiile despre Con. Ce nseamn prin adres. Se
aloc un grup de octei, dar aici se memoreaz adresa care puncteaz spre acel obiect
complicat Con. n liniile 02 04 observai o comand SQL. De asemeni, o vom explica
n paragraful urmtor. La fel i comanda SQL din linia 05. Restul liniilor sunt de acum
cunoscute dumneavoastr din prezentrile fcute.
Am ales acest exemplu pentru a puncta aceste dou moduri de transmitere a coninutului
argumentelor reale n cele fictive.
Ce vrea s nsemne transmiterea prin valoare am explicat.
Insistm la transmiterea prin referin. n loc s se dedubleze ntreaga structur de date,
care se ntinde pe destui octei, cum este cazul obiectului Con, se trimite doar un numr.
Acesta este adresa de memorie unde se afl stocai toi aceti octei referitori la obiectul
Con. Dac s-ar trimite i acest parametru prin valoare, ar fi i o risip inutil de spaiu de
memorie dar i de timp. Nu are sens! Funcia verificParola() va ntoarce valoarea
ntreag -1, cnd nu este ceva n regul cu parola vizitatorului sitului.

O privire fugar asupra limbajului structurat de


interogare SQL
SQL nseamn Structured Query Language. Este prea de demult aprut ca s fie nevoie
s justificm n faa unui nespecialist de ce i se spune structurat i de interogare. Cu
comenzile SQL ntr-adevr n primul rnd interogm bazele de date. S nu rmnei cu
impresia c cu SQL doar interogm. Ca s interogm trebuie mai nti s crem baza,
apoi tabelele sale, s ncrcm aceste tabele cu informaie. De abia acum putem extrage
informaiile pe care le dorim sau s le modificm. Nu mai spunem nimic despre trecutul
limbajului de interogare structurat i mai ales despre viitorul su!
SQL este un limbaj vast. De aceea preferm s decupm doar chestiunile care ne
intereseaz i pe care le vom ntlni n aplicaia noastr de comer electronic din
capitolele urmtoare.
Limbajul are multe instruciuni, funcii i proceduri. n exemplul nostru va fi vorba de o
baz de date, mypisi.mdb (.mdb este extensia unei baze create cu aplicaia MSAccess).
Baza mypisi.mdb are vreo patru tabele: Produse, Clienti, Comenzi i Cos. Fiecare tabel
poate fi creat, ca de altfel i baza n sine, cu anumite instruciuni SQL.
Am creat baza mypisi.mdb i tabelele sale cu ajutorul interfeei grafice a aplicaiei
MSAccess.
Un tabel are cum tim un antet cu mai multe rubrici. Considerai antetul drept structura
de descriere a tabelului, iar rndurile sale drept nregistrri cu date.
Cnd trebuie s accedem unul sau mai multe tabele ale unei baze de date, dintr-un
program scris n VBScript? Va trebui ca mai nti s se stabileasc o conexiune logic
cu acea baza. Despre ea nu vom vorbi aici.
Orice baz de date este la urma urmei o resurs fizic. Programul o vede ns ca pe o
resurs logic. Du-te-vino-ul informaiilor dintre program i tabelele bazei nu s-ar putea
realiza dect dup conectarea prealabil la ea.
n capitolul urmtor vom descrie procedurile pentru atribuirea unei denumiri logice
pentru aceast conexiune, dei am abordat acest subiect i n capitolele dedicate
tehnologiei JSP.
Suntem mai interesai acum s tratm SQL-ul ca atare, deci cteva dintre instruciunile
sale. Iat de pild cnd scriem comanda aceasta:
SELECT id_produs, nume_produs FROM Produse

nelegem c selectm doar rubricile, cmpurile id_produs i nume_produs din tabela


Produse, una din tabelele bazei mypisi.mdb.
Dac am fi dorit s accedem toate rubricile tabelului am fi scris aa:
SELECT * FROM Produse

Dac vrem s selectm cele dou cmpuri i s ordonm dup nume produs n ordinea
alfabetic (programatorii spun n ordinea lexicografic ascendent!) vom recurge la o
comand de genul acesta:
SELECT id_produs, nume_produs FROM Produse ORDER BY nume_produs

O selecie dup anumite criterii comport o comand SELECT de forma:


SELECT * FROM Produse WHERE id_produs = 3

Aici ne intereseaz doar produsul al crui identificator este egal cu 3. Cmpul id_produs
are tipul numr nu text, de unde i valoarea sa numeric.
Cnd scriem n VBScript comenzile SQL, trebuie s respectm sintaxa limbajului
VBScript. Atunci iat un exemplu concret:
sqlString = "SELECT id_produs, nume_produs FROM Produse " &_
"ORDER BY nume_produs"

Comanda este un literal nregistrat n variabila sqlString. Fiindc acesta am vrut s l


transcriem pe dou rnduri, am recurs la acest delimitator compus din dou caractere:
&_. Recunoatem c este destul de ciudat!
O alt ipostaz tipic:
RS.Open "SELECT * FROM Produse WHERE id_produs=" & idProdus

Aici folosim metoda Open a obiectului RecordSet denumit aici RS. Ca argument real
pasat acestei metode, este literalul. Ne reamintim c un literal este ncadrat de ghilimele
n VBScript. De ce i notaia & idProdus? Dac ai citit cele cteva pagini consacrate
limbajului VBScript, atunci ar trebui s tii c operatorul de alipire este &. Faptul c n
loc de 3 am scris idProdus, a fost pentru c aici ne referim la o variabil i nu la o
valoare. Firete, ne-am luat msurile de prevedere de a ncrca n prealabil variabila
idProdus cu valoarea numeric, mai nainte de a executa aceast metod.
Cum ar fi artat din punct de vedere sintactic comanda de mai sus? Aa:
SELECT * FROM Produse WHERE id_produs = idProdus
S trecem la alt tabel cu alte cmpuri. Putem s selectm din tabela Clienti, toi clienii
cu numele Ionescu n coloana nume_client. n acest caz comanda ar fi artat aa:
SELECT nume_client FROM Clienti WHERE nume_client = Ionescu

Mergem mai departe! O comand SQL SELECT, scris n limbajul VBScript arat cam
aa:
sqlString = "SELECT DISTINCT categorie_produs FROM Produse "
sqlString = sqlString & "WHERE stare_produs=1 "
sqlString = sqlString & "ORDER BY categorie_produs"

Mai sus sunt de fapt trei instruciuni VBScript. n finalul parcurgerii acestora, variabila
sqlString va conine ntreaga comand SQL:
SELECT DISTINCT categorie_produs FROM Produse WHERE stare_produs=1
ORDER BY categorie_produs

A aprut un lucru nou i anume cuvintele ORDER BY. Separatorul ORDER BY


ordoneaz nregistrrile tabelului dup valorile din cmpul categorie_produs. Dac
lipsete separatorul ASC sau DES, se presupune ASC, adic ordinea de la A la Z.
Destul cu SELECT! S trecem la alt comand SQL i anume la INSERT.
Cnd scriem aa:
INSERT INTO Produse ( nume_produs, pret_produs, caracteristici_produs,
categorie_produs, stare_produs ) VALUES ( LCD Relisys TL561, 11999000,
17/ 0.29 pixel/ rezolutie maxima1024x768/luminozitate 300:1/TCO99 TUV FCC_B
UL ISO 13406-2,monitor,activ )

de fapt anunm din VBScript c vom recurge la o inserie a unui rnd n tabelul
Produse. Valorile pe care le nscriem n noua nregistrare se afl n lista de dup
separatorul VALUES.
Deci INSERT ca form, este urmat de separatorul INTO, apoi de denumirea tabelului,
de o list de denumiri de rubrici. Lista este ncadrat de paranteze ronde. Mai departe
vine separatorul VALUES i n final, din nou o list de valori sau de variabile VBScript.
Dac sunt valori, atunci cele de tip literal sunt ncadrate ntre apostrofi. n schimb
valorile ntregi (pret_produs, 11999000) se transcriu direct fr apostrofi.
Dac aceste valori ar fi provenit din variabile de tip VBScript i dac, aceste variabile se
numeau numeProdus, pretProdus, caracteristiciProdus, categorieProdus i stareProdus,
am fi rescris comanda n modul urmtor. De data aceasta am respectat regulile sintactice
ale limbajului VBScript. Este ceva mai complicat, dar urmrii cu atenie:
sqlString = "INSERT INTO Produse " &_
"( nume_produs, pret_produs, caracteristici_produs, categorie_produs, stare_produs )
VALUES ( " &_
" '" & numeProdus & "', " &_
pretProdus & ", " &_
" '" & caracteristiciProdus & "', " &_
" '" & categorieProdus & "', " &_
stareProdus & " )"
Explicaii i parafraze
Observai separatorul pentru prelungirea unui literal pe mai multe linii n VBScript. Mai
observai (poate mai greu) prezena unor apostrofi ncadrai de ghilimele. Aceasta
deoarece elementele listei VALUES sunt ncadrate de apostrofi. V amintii de funcia
apostrof12. Spuneam cu acea ocazie c trebuie s dublm apostrofii. n transcrierea
VBScript se ncepe cu un apostrof i, dac valoarea ar conine un apostrof, interpretorul
de comenzi SQL s-ar mpotmoli la primul apostrof terminal de valoare. De exemplu
valoarea Scotts Company nu s-ar nregistra corect n tabel.
M rog, noi n romnete nu folosim apostrofii n denumiri!
nc ceva. Doar un singur cmp, pretProdus este numeric n acest exemplu. Celelalte trei
cmpuri sunt de tip text.
Observaie: Pe cei care cunosc SQL i rog s nu se supere c nu ne abatem de la subiect,
ca s povestim multiplele tipuri de date din SQL. Ar fi o prea mare parantez care nu ar
fi necesar unui nespecialist n programare.
Privii cu atenie c denumirea pretProdus nu mai este ncadrat de apostrofi, cum se
ntmpl cu celelealte trei cmpuri.
O alt comand SQL este i cea de actualizare a rndurilor unui tabel. Se numete,
UPDATE. Iat una din formele sale:
UPDATE Produse SET nume_produs = ' DVD-ROM', pret_produs = 4999000,
caracteristici_produs = 'diverse caracteristici, categorie_produs = 'DVD'",
produs_de_vitrina = 1, stare_produs= 'ACTIVA'
WHERE id_produs = 4

Explicaii i parafraze
Aici cmpurile pret_produs i produs_de_vitrina sunt numerice, n timp ce restul
cmpurilor sunt de tip text, caracter este acelai lucru. Deci se menine consistent
regula apostrofilor.
Transcrierea VBScript mai general este mai greoaie. Apar i o serie de variabile n loc
de valori exacte. Iat-o:
sqlString = "UPDATE Produse SET " &_
"nume_produs='" & apostrof12( numeProdus ) & "'," &_
"pret_produs=" & cCUR( pretProdus ) & "," &_
"caracteristici_produs='" & apostrof12( caracteristiciProdus ) & "'," &_
"categorie_produs='" & apostrof12( categorieProdus ) & "'," &_
"produs_de_vitrina=" & produsDeVitrina & "," &_
"stare_produs=" & stareProdus & " WHERE " &_
"id_produs=" & idProdus

Explicaii i parafraze
Important este c UPDATE schimb coninutul acelei nregistrri din tabela Produse,
care are un identificator de produs egal cu cel coninut n variabila idProdus. Se vor
schimba doar cmpurile aflate dup separatorul SET.
O a patra comand SQL este cea de eliminare a unor rnduri (nregistrri) din tabel. Se
numete DELETE. Prezentm chiar un exemplu de comand scris la VBScript!
sqlString = "DELETE FROM cos " &_
"WHERE id_client_cos=" & idclient

Aici tabela este denumit cos. Se refer la coul de cumprturi. Evident, denumirile
variabilelor unui limbaj nu sunt acceptate dect n transcrierea anglo-saxon. Nici vorb
de caracterele noastre diacritice.
Se elimin din aceast tabel doar rndurile care au n cmpul id_client_cos o valoare
identic cu coninutul variabilei idclient.
Observaie general:
Pentru a nu ne bulversa n exemplul magazinului virtual de mai jos, am convenit ca
toate denumirile de variabile VBScript s le transcriem fr trsur de unire, n timp ce
denumirile de cmpuri de tabele s aib acest caracter _.
Ce se realizeaz n secvena de mai jos?
sqlString = "SELECT DISTINCT categorie_produs FROM Produse "
sqlString = sqlString & "WHERE stare_produs=1 "
sqlString = sqlString & "ORDER BY categorie_produs"

Explicaii i parafraze
Este vorba de o selectare din tabela Produse a denumirilor distincte din cmpul
categorie_produs. Selectm doar produsele alese pentru a fi vndute (stare_produs = 1).
Ele sunt ordonate cresctor dup coninutul rubricii categorie_produs. Atenie! ntr-un
tabel de produse pot exista multe produse ce aparin aceleiai categorii. Dac nu am
recurge la separatorul DISTICT, s-ar prelua mult mai multe nregistrri. Cu DISTINCT
se va seleciona doar cte o nregistrare care are o valoare distinct.
Dar n secvena de mai jos ce facem?
sqlString = "SELECT id_cos FROM cos " &_
"WHERE id_client_cos=" & idClient & " " &_
"AND id_produs_cos=" & idProdus

Singurul element nou este operatorul logic AND. Traducem: selecteaz din tabela cos
dup cmpul id_cos doar unde id_client_cos are valoarea din idCleint I id_produs_cos
are valoarea din idProdus.
Cam att despre SQL, acest vast subiect despre s-au scris zeci de tratate!

La final de capitol
Aici am aflat:
1. Care sunt cerinele software pentru a aborda tehnologia ASP din punct de vedere
al variantelor de sisteme de operare Windows n circulaie.
2. Ce este o pagin ASP cu cteva exemple concrete.
3. Procedeele de operare pentru a pune pe rol serverul Web i driverul ODBC.
4. Cum se scriu liniile lungi, cum se lucreaz cu obiectele implicite.
5. Care sunt obiectele implicite ale tehnologiei ASP.
6. Cteva reguli sintactice ale limbajului Visual Basic for Scripting.
7. i la sfrit, ne-am uurat sarcina explicrii lungilor liste de programe ale
exemplului de sit electronic din capitolele urmtoare, printr-un compendiu la
obiect despre limbajul de interogare structurat, SQL.
8
Capitolul

S construim un catalog de
produse pentru un sit comercial
Pregtii-v s avei rbdare cu carul! Vom folosi tehnologia ASP. Presupunem
c avei ceva cunotine minimale de Visual Basic de la primul curs de iniiere n
informatic sau mcar ai citit capitolul anterior!
Primul lucru care ne intereseaz este s definitivm

Caietul de sarcini al aplicaiei

S
untem proprietarii unor depozite de produse din domeniile IT&C. Vrem s
alctuim un magazin virtual. Aceast aplicaie intr n categoria B2C.
Pentru explicarea acestui termen recomandm una dintre referinele /1, 6/ sau
partea a doua n limba francez.
Ne-am inspirat oarecum din exemplul mai vast tratat n /6/. Vai ns, inem cont c sunt
destui hoi i crackeri. Pentru termenul cracker vezi referina /1/. E cam acelai lucru. A
se citi hoi electronici. Aa c vom diferi mult de exemplul de sit comercial dat n
aceast referin.
Revenind la sarcinile pe care trebuie s le realizeze programul sitului nostru, vizitatorii
noi vor trebui nregistrai pe baz de formular. Cei vechi vor recurge doar la informaia
de login, adic numele i parola.
La nregistrare, clientul va anuna adresa de email de destinaie. Nu am ales soluia
instrumentelor electronice de plat ci banii lichizi achitai la momentul livrrii obiectelor
transportate la domiciul clientului. Ce trai ar fi fost pe crackeri!
Pe pagina principal a magazinului virtual se vor perinda cele mai noi produse la
vnzare, dup strategia proprie de reclam a administratorului sitului. El poate trimite e-
mail-uri spre clienii tradiionali.
Evident, vizitatorul va ti ce conine coul su de cumprturi, ori de cte ori va revizita
situl. I se va cere s se legitimeze prin formular de login. Dac este impostor, va fi
anunat c nu mai are ce cuta n acest sit, i c a fost anunat la poliie. Oricum, ca s
ajung aici un impostor i va freca minile i se va arunca precis s cumpere ct mai
mult pe banii altui cumprtor cinstit. Nu! Nu-i va merge! Va fi oprit la plata! E
adevrat: la orice arm se gsete o contra arm .
Coul se va goli n tabelul livrare a comenzilor, cnd vizitatorul va accepta ntocmirea
facturii de plat. Vizitatorul va putea modifica coninutul coului su pn la momentul
acceptrii ntocmirii comenzii ferme, de fapt a ordinului de plat. Nu l elaborm aici!
n principiu, fiecare produs ar trebui s aib cte o poz cu aspectul su i neaprat o
serie de caracteristici specifice. Nu am avut timp ca s desenm aspectul produselor
vndute. De aceea multe din pozele produselor nu apar n fereastra browserului.
Evident, trebuie s permitem potenialului cumprtor de componente electronice s
caute orice produs n rafturile depozitului. El trebuie s nu dovedeasc cine tie ce
cunotine tehnice. i le va forma pe parcurs dup vizite repetate. Reamintim c este un
magazin de articole i accesorii din IT, deci este vorba de PC-uri, servere, memorii,
discuri, accesorii, pagere, PDA-uri etc.
Nu am securizat paginile ca numai administratorul s poat umbla la unele pagini, din
motive didactice.
Nu vom arta cum am folosit FrontPage, ntruct scopul acestui manual nu este de a v
nva proiectarea Web. Nici nu vom prezenta ciclul de dezvoltare, fiindc nu trebuie s
devenii programatori i ceea ce e mai ru, nu am posedat Microsoft Visual InterDev.
Am mers pe ideea bazei software de la laboratoare, adic editorul WordPad, serverul IIS
i nelipsitul client Web MSIE. Totui pe fiecare staie am instalat, aa cum spuneam n
introducere, dou servere, resin pentru tehnologia JSP i IIS pentru ASP. Acum folosim
tehnologia ASP, deci serverul MS IIS. Nu am avut acces la aplicaia MS SQL Server.
Am fost mulumii i cu MS Access.
Aadar s ncepem!

Baza de date i tabelele sale (MSAccess)


n primul rnd crem cu MS Access o baz de date denumit mypisi. Procedeul este
acesta:
1. Activm aplicaia MS Access (Start Programs MS Access).
2. Din caseta iniial de dialog alegem opiunea pentru crearea unei
noi baze de date, Blank Database.
3. Apare caseta de dialog denumit fiier nou de tipul baz de date, File New
DataBase. Aici precizm n nume fiier, File name, denumirea bazei, mypisi.
Denumirea are automat extensia .mdb. Alegem directorul unde dorim s o
salvm. Acionm butonul Create.
4. Apare o alt caset de dialog. Aici alegem prima opiune, aceea de creare a unui
tabel n modul de proiectare denumit vedere a structurii de date, Create Table in
Design View. De fapt, vom crea cele patru tabele: Produse, Clienti, Cos i
Comenzi.
5. Precizm n ordine cele cmpurile pentru Produse etc. Indiferent c folosim doar
driverul ODBC fiind n platforma Microsoft, trebuie s anunm acest driver c
va avea acces la o surs de date. Denumirea sursei va fi sd. Pentru aceasta
iat procedeul:
6. Dac folosim sistemul de operare Windows 2000 Professional, activm Data
Sources (ODBC); traseu este: Start Settings Control Panel
Administrativ Tools Data Sources (ODBC). Dac folosim varianta Windows
98, traseul va fi altul: Start Programs Control Panel ODBC Data
Sources. Apare o caset complex, similar cu aceea din figura 5.4, capitolul 6.
n acea figur apare denumirea logic a sursei de date mydb.mdb, deoarece
acolo ne ocupam de o alt baz de date. Principiul se pstreaz! Acum ns sursa
de date va fi de tip sistem i nu de tip utilizator (user). Aceasta nseamn ceva i
nu mai divagm! Revenind la procedura n sine.
7. Ni se cere denumirea sursei de date. Precizm sd. O scriem exact aa.
8. Apoi selectm un driver de tipul Microsoft Access (*.mdb).
7. Mai departe, prin clic pe butonul Finish, apare o ultim caset de dialog
Database. Aici selectm fiierul mypisi.mdb. El se afl ntr-un alt director dect
cel afiat iniial n caset. Pentru aceasta cltorim n directorul unde este baza
i, prin clic pe denumirea ei, ajungem la final. Am anunat driverul ODBC c
sursa de date sd corespunde fiierului mypisi.mdb.
Cmpurile celor patru tabele sunt urmtoarele:
I. Tabelul Produse este alctuit din:
id_produs, are tipul autonumber, deci are regim de cheie primar
pentru indexare,
nume_produs de tipul text, maximum 50 caractere,
caracteristici_produs, text, maximum 255 caractere,
pret_produs, currency,
stare_produs, de tip numr i
produs_in_vitrina tot de tip numr.
Starea produsului poate activ sau nu. Activ nseamn la vnzare. Produs_in_vitrin
dac difer de zero, nseamn c produsul este selectat pentru a fi afiat pe pagina
primar a sitului, deci n vitrina magazinului virtual. Selecia n programul nostru se
face aleator cu ajutorul funciei RND (VBScript).
II. Tabelul Clienti este alctuit din:
id_client, autonumber, pe post de cheie primar,
nume_client, text, maximum 50 caractere,
parola_client, idem,
email_client, ibidem,
cod_postal_client, numr.
III. Tabelul cos destinat coului pentru cumprturi, are rubricile:
id_cos, autonumber, pe post de cheie primar,
id_client_cos, numr,
id_produs_cos, idem,
cantitate_cos, ibidem.
IV. La final, tabelul Comenzi este compus din:
id_comanda, numr, pe post de cheie primar,
id_produs_comanda, numr,
cantitate_comanda, idem,
id_client_comanda, ibidem,
data_intrare_comanda, date/time,
data_livrare_comanda, idem.
Observaie: Un cmp care are regimul de cheie primar impune de la sine ca
valoarea sa s fie unic n acel tabel.

Cum adugm produsele i cum administrm


tabelul respectiv
ncepem cu prezentarea unei pagini la care are de regul acces doar administratorul.
Mai nainte dou observaii importante:
1. Nu am inclus n sistem vreo interdicie pentru vizitatorul obinuit, din motive de
conciziune a codului. Nu aa se procedeaz ns n realitate. Trebuie ngrdit
accesul vizitatorilor la paginile la care are acces doar administratorul.
2. Redm integral listele programelor sitului.
Prima pagin este denumit adaugProdus.asp. Iat coninutul acesteia:
LISTA 8.1 Pagina adaugProdus.asp

<html>
<head><title>Adaug Produs</title></head>

<body bgcolor="gray">
<form method="post" action="adminproduse.asp">
<center>
<table width="600" border=1 bgcolor="lightyellow" cellpadding="4" cellspacing="0">
<tr>
<td colspan="2" bgcolor="yellow"><font face="Arial" size="3"><b>Adaug
Produsul</b></font>
</td>
</tr>
<tr>
<td><b>Nume produs:</b></td>
<td><input name="numeProdus" size="50" maxlength="50"></td>
</tr>
<tr>
<td><b>Pret produs:</b></td>
<td><input name="pretProdus" size="10"></td>
</tr>
<tr>
<td><b>Caracteristici produs:</b></td>
<td><input name="caracteristiciProdus" maxlength="255" size="50"></td>
</tr>
<tr>
<td><b>Categorie produs:</b></td>
<td><input name="categorieProdus" size="50" maxlength="50"></td>
</tr>
<tr>
<td><b>Stare produs:</b></td>
<td><select name="stareProdus"><option value = "0">INACTIV<option value =
"1">ACTIV</select></td>
</tr>
<tr>
<td colspan=2 align="right"><input type="submit" value="Adaug Produs"></td>
</tr>
</table>
</center>
<input name="adaugProdus" type="hidden" value="1">
</form>
</body>
</html>

Explicaii i parafraze
Pagina care va prelua valorile completate de operatorul datelor, atunci cnd acesta va
introduce produsele se cheam adminproduse.asp (linia 05). Pagina de mai sus este un
banal formular HTML care nu are nici un scenariu ASP. Ar fi putut avea sufixul .htm
sau .html. Totui am stabilit ca s aib sufixul .asp, deoarece ea nu mai este static ci
una dinamic. Nu uitai c pagina trebuie s vin de la serverul Web.
Reamintim s citii anexa A pentru a v pune oarecum la punct cu HTML. Privii mai
jos aspectul documentului, dac se d comanda:
http://localhost/abc/adaugProdus.asp

FIGURA 8.1 Aspectul ferestrei document MSIE (contextul: adaugProdus.asp)

S ne referim acum la pagina adminproduse.asp:


LISTA 8.2 Pagina adminProduse.asp

01. <!-- #INCLUDE FILE="functii.asp" -->


02. <%
03. ' Atribuim unor variabile locale
04. ' valorile din rubricile formularului

05. adaugProdus = TRIM( Request( "adaugProdus" ) )


06. actualizezProdus = TRIM( Request( "actualizezProdus" ) )
07. idProdus = TRIM( Request( "idProdus" ) )
08. numeProdus = TRIM( Request( "numeProdus" ) )
09. pretProdus = TRIM( Request( "pretProdus" ) )
10. caracteristiciProdus = TRIM( Request( "caracteristiciProdus" ) )
11. categorieProdus = TRIM( Request( "categorieProdus" ) )
12. produsDeVitrina = TRIM( Request( "produsDeVitrina" ) )
13. stareProdus = TRIM( Request( "stareProdus" ) )

14. ' Atribuirea valorilor asumate pentru rubrici necompletate

15. IF numeProdus = "" THEN


16. numeProdus = "nil"
17. END IF

18. IF pretProdus = "" or NOT isNUMERIC( pretProdus ) THEN


19. pretProdus = 0
20. END IF

21. IF caracteristiciProdus = "" THEN


22. caracteristiciProdus = "nil"
23. END IF
24. IF categorieProdus = "" THEN
25. categorieProdus = "nil"
26. END IF

27. ' Deschid conexiunea logica la BD


28. Set Con = Server.CreateObject( "ADODB.Connection" )
29. Con.Open "sd"
30. %>

31. <html>
32. <head><title>Administrare Produse</title></head>
33. <body bgcolor="gray">

34. <%

35. ' Adaug un produs nou

36. IF adaugProdus <> "" THEN


37. sqlString = "INSERT INTO Produse " &_
38. "( nume_produs, pret_produs, caracteristici_produs, categorie_produs,
stare_produs ) VALUES ( " &_
39. " '" & numeProdus & "', " &_
40. pretProdus & ", " &_
41. " '" & caracteristiciProdus & "', " &_
42. " '" & categorieProdus & "', " &_
43. stareProdus & " )"

44. Con.Execute sqlString


45. %>

46. <center>
47. <table width="600" cellpadding="4" cellspacing="0" bgcolor="lightyellow">
48. <tr>
49. <td><%=numeProdus%> a fost adaugat in BD, tabelul produse</td>
50. </tr>
51. </table>
52. </center>
53. <p>

54. <%
55. END IF

56. ' Actualizarea unui produs, deja prezent in BD, tabelul produse

57. IF actualizezProdus <> "" THEN


58. sqlString = "UPDATE Produse SET " &_
59. "nume_produs='" & apostrof12( numeProdus ) & "'," &_
60. "pret_produs=" & cCUR( pretProdus ) & "," &_
61. "caracteristici_produs='" & apostrof12( caracteristiciProdus ) & "'," &_
62. "categorie_produs='" & apostrof12( categorieProdus ) & "'," &_
63. "produs_de_vitrina=" & produsDeVitrina & "," &_
64. "stare_produs=" & stareProdus & " WHERE " &_
65. "id_produs=" & idProdus
66. Con.Execute sqlString
67. %>

68. <center>
69. <table width="600" cellpadding="4" cellspacing="0" bgcolor="lightyellow">
70. <tr>
71. <td><%=numeProdus%> was updated in the database</td>
72. </tr>
73. </table>
74. </center>
75. <p>

76. <%
77. END IF
78. %>

79. <center>
80. <table width="600" border=1 bgcolor="lightyellow" cellpadding="4"
cellspacing="0">
81. <tr>
82. <td colspan="2" bgcolor="yellow"><font face="Arial" size="3"><b>Admin.
produse</b></font></td>
83. </tr>
84. <tr>
85. <td align="center"><table border="1" size="400" cellpadding="3" cellspacing=0
bgcolor="white">

86. <%
87. sqlString = "SELECT id_produs, nume_produs FROM Produse " &_
88. "ORDER BY nume_produs"
89. SET RS = Con.Execute( sqlString )

90. WHILE NOT RS.EOF


91. %>

92. <tr>
93. <td><a href="actualizezprodus.asp?pid=<%=RS( "id_produs")%>"><%=RS(
"nume_produs" )%></a></td>
94. </tr>

95. <%
96. RS.MoveNext
97. WEND
98. %>

99. </table>
100. </td>
101. </tr>
102. <tr>
103. <td><a href="adaugProdus.asp">Adaug produs</a>
104. </td>
105. </tr>
106. </table>
107. </center>
108. </body>
109. </html>

Explicaii i parafraze
n prima linie anunm c se va include n prealabil fiierul functii.asp. Aici sunt grupate
toate funciiile aplicaiei. Aceast directiv se citete automat la nceputul fazei de
interpretare a paginii n sine. Deci nu are importan locul acesteia. Putea s fie la final,
i s-ar fi citit tot naintea nceperii interpretrii instruciunilor VBScript. Primul scriptlet
este anunat n linia 02.
Dup comentariul aferent, n liniile 05-13 prelum valorile completate pentru produsul
respectiv.
Privii denumirile logice ale rubricilor din lista adaugProdus.asp. Acolo este un
formular. Obiectul request poate recurge i la alte colecii. Aici este vorba de colecia
formular.
Puteam scrie canonic aa: request.Form(adaugProdus). Ar fi fost redondant, deoarece
din context s-a dedus c este vorba despre o colecie Form. Cum adic colecie?
Formularul este o resurs HTML. El conine o colecie de rubrici de tip text, sau de tip
caset de verificare etc.
Mai departe se urmrete ca n rubricile rmase necompletate s se nscrie fie textul
nil, dac acel cmp este de tip text, fie cifra 0, dac acea rubric este de tip numeric.
Aceasta se realizeaz cu triadele IF ... ENDIF.
Urmrii preul produsului. Se poate ntmpla ca operatorul din grab s introduc o
liter. Atunci n pretProdus se nregistreaz valoarea 0.
Desigur, am putea complica funcie de analizare i s trimitem un mesaj de avertizare.
Dac v pasioneaz programarea, putei modifica dumneavoastr aceast rutin. Nu
uitai s o includei n pagina de funcii, denumit functii.asp.
Am ajuns la liniile 28 i 29. Aici se realizeaz conexiunea logic cu baza de date
mypisi.mdb Afirmam mai sus c obiectul Con are o structur complicat. Nici nu avem
de gnd s o prezentm. n ASP anunm obiectul server ca s creeze un obiect din
categoria Activex Data Object (ADO) i anume unul de tip baza de date (DB). Apoi s
recurg la metoda conectare (Connection). Mai departe, cu metoda Open afiliat
obiectului Con, se cere ca denumirii sd (numele logic al sursei de date) s i se atribuie
un numr logic (programatorii i spun handle). Dac treaba nu reuete (poate ai uitat s
anunai componenta ODBC Data Sources c pentru denumirea sd, s-a asociat o resurs
fizic, mypisi.mdb, aflat undeva pe ierarhia directoarelor), desigur programul se
termin anormal cu un mesaj bulversant!
S presupunem c ai urmat procedeul de asociere artat mai sus. n acest caz vine
rndul instruciunii din linia 36. Aici exist o variabil pe post de semafor, denumit
adaugProdus. Ea - fii siguri - va avea o valoare diferit de , motiv pentru care se va
pregti n variabila sqlString o comand de inserie. Privii linia cu numrul 36 din lista
adaugProdus.asp. Acolo s-a introdus n semaforul adaugProdus valoarea 1. nseamn c
ntr-adevr s-a parcurs formularul care solicit date despre produsul, ce urmeaz a fi
adugat n tabelul Produse. n linia 44 se execut (Execute) comanda INSERT prin
intermediul obiectului Con. Mai simplu se realizeaz inseria. n linia 49 se anun c
produsul cutare s-a introdus n baz.
Privii cum arat aspectul paginii n fereastra document a browserului MSIE, dac se d
comanda:
http://localhost/abc/adminproduse.asp

FIGURA 8.2a. Aspectul imediat dup lansarea paginii adminProduse.asp

Distingem un tabel cu diferite produse. Fiecare produs este un hypertext. Deci cnd
am efectua clic pe el, va apare un ecran de genul celui din figura urmtoare:

FIGURA 8.2b. Ce vedem dac alegem un produs spre a-l actualiza (adminProduse.asp)
Cum a fost posibil ca s transformm datele unui tabel n legturi de tip hypertext? Iat
cum: privii cu atenie liniile 90 97.
Observai o bucl WHILE. n cadrul ei se afieaz rnd dup rnd ntr-un tabel HTML
coninutul cmpului nume_produs din tabelul Produse. n cadrul rndului exist o
celul. Coninutul acesteia este de fapt o referin de tip hypertext (HTML) la
nregistrarea din tabelul Produse. Dac este aleas, va genera un ir de interogare, n care
apare i parametrul pid, adic numrul nregistrrii din tabelul Produse. Pe baza lui se
citete din aceast tabel coninutul acelei nregistrri. Va apare pe ecran o fi similar
cu aceea din figura 8.1, doar c apare butonul Actualizare produs.
Aceast pagin de administare a produselor a fost scris i pentru cazul cnd
administratorul vrea s modifice datele unui produs. Dac este aa, atunci s-a parcurs o
alt serie de instruciuni datorate efecturii clicului pe butonul actualizare produs. Altfel
spus s-a declanat executarea paginii actualizezProdus.asp. Din aceast cauz i
semaforul actualizezProdus va fi schimbat la valoarea 1. Atunci IF-ul din linia 57 va
gsi acest semafor poziionat pe 1. n consecin, se execut grupul de linii 58-65. De
fapt, aici se pregtete n variabila sqlString, comanda de actualizare UPDATE, aa cum
am vzut mai sus la breviarul pentru SQL.
n continuare, n linia 66 se face aceast actualizare, dup care se anun n linia 71 c
treaba s-a ncheiat cu bine. Observai expresia <%=numeProdus%>.
S privim acum instruciunile paginii actualizezProdus.asp:
LISTA 8.3 Pagina actualizezProdus.asp

01. <%
02. ' Obtin ID-ul produsului
03. idProdus = Request("pid")

04. ' Deschid conexiunea logica la BD


05. Set Con = Server.CreateObject("ADODB.Connection")
06. Con.Open "sd"

07. ' Deschid obiectul RecordSet


08. Set RS = Server.CreateObject("ADODB.Recordset")
09. RS.ActiveConnection = Con
10. RS.CursorType = 3
11. RS.Open "SELECT * FROM Produse WHERE id_produs=" & idProdus

12. IF NOT RS.EOF THEN


13. numeProdus = RS("nume_produs")
14. pretProdus = RS("pret_produs")
15. caracteristiciProdus = RS("caracteristici_produs")
16. categorieProdus = RS("categorie_produs")
17. produsDeVitrina = RS("produs_de_vitrina")
18. IF isNULL(produsDeVitrina) THEN produsDeVitrina = 0
19. stareProdus = RS("stare_produs")
20. END IF
21. ' Inchid obiectul Recordset
22. RS.Close
23. FUNCTION SELECTED(valoare1, valoare2)
24. IF cSTR(valoare1) = cSTR(valoare2) THEN
25. SELECTED = "SELECTED"
26. END IF
27. END FUNCTION
28. %>

29. <html>
30. <head><title>Actualizare produs</title></head>
31. <body bgcolor="gray">
32. <form method="post" action="adminproduse.asp"><center>
33. <table width="600" border="1" bgcolor="lightyellow" cellpadding="4"
cellspacing="0">
34. <tr>
35. <td colspan="2" bgcolor="yellow"><font face="Arial" size="3"><b>Actualizare
Produse</b></font></td>
36. </tr>
37. <tr>
38. <td><b> Nume produs:</b></td>
39. <td><input name="numeProdus" size="50" maxlength="50"
value="<%=Server.HTMLEncode(numeProdus)%>"></td>
40. </tr>
41. <tr>
42. <td><b>Pret produs:</b></td>
43. <td><input name="pretProdus" size="10" value="<%=pretProdus%>"></td>
44. </tr>
45. <tr>
46. <td><b>Caracteristici produs:</b></td>
47. <td><input name="caracteristiciProdus" size="50" maxlength="255"
value="<%=Server.HTMLEncode(caracteristiciProdus)%>"></td>
48. </tr>
49. <tr>
50. <td><b>Categorie produs:</b></td>
51. <td><input name="categorieProdus" size="50" maxlength="50"
value="<%=Server.HTMLEncode(categorieProdus)%>"></td>
52. </tr>
53. <tr>
54. <td><b>Produs nou de vitrina:</b></td>
55. <td><select name="produsDeVitrina"><option value="0" <%=SELECTED("0",
produsDeVitrina)%>>Normal<option value="1" <%=SELECTED("1",
produsDeVitrina)%>>Lavitrina</select></td>
56. </tr>
57. <tr>
58. <td><b>Stare produs:</b></td>
59. <td><select name="stareProdus"><option value="0" <%=SELECTED("0",
stareProdus)%>>INACTIV<option value="1" <%=SELECTED("1",
stareProdus)%>>ACTIV</select></td>
60. </tr>
61. <tr>
62. <td colspan=2 align="right"><input type="submit" value="Actualizare
produs"></td>
63. </tr>
64. </table>
65. </center>
66. <input name="idProdus" type="hidden" value="<%=idProdus%>">
67. <input name="actualizezProdus" type="hidden" value="1">
68. </form>
69. </body>
70. </html>

Explicaii i parafraze
Prima grij pe care am avut-o este s prelum valoarea lui pid, deci indexul rndului din
tabelul Produse. Pe baza lui, dup deschiderea logic din liniile 05 i 06, crem un tabel
rezultat RecordSet. L-am denumit RS. Din el accedem chiar produsul a crei actualizare
intenionm a o face. Atta timp ct nu am ajuns la sfritul tabelului RS (linia 12)
prelum informaiile despre acest produs (liniile 13-19) n variabile locale. La final, n
linia 22 nchidem din punct de vedere logic tabelul rezultat RS.
Funcia SELECTED apare aici ... ca nuca n perete! Totui am fcut-o din motive pur
didactice. n caz contrar, ar fi fost nevoie s v rugm s citii paginile care trateaz
pagina functii.asp, lucru destul de neplcut dumneavoastr. Paginii acesteia i va veni
rndul mult mai jos!
Oricum, pentru elegana exerciiului de programare, nu ar fi fost nevoie s mai scriem
instruciunile ei aici. Deci tot ce trebuia s facem era s adugm acea declaraie de
includere a paginii functii.asp i totul era rezolvat. Cum? Vom vedea mai jos!
Srim descifrarea acestei funcii de care avem nevoie puin mai jos i intrm n partea
html a paginii (linia 29). Aici este anunat o resurs de tip formular HTML (privii
linia 32), care este deservit de pagina adminproduse.asp.
Formularul este redat sub forma unui tabel (linia 33). El are aspectul identic cu cel din
pagina adaugProdus.asp, doar c acum apare i coninutul rubricii produs_de_vitrin. n
linia 55 observai c ne intereseaz coninutul acestui cmp. n HTML l denumim
produsDeVitrina. Cu funcia SELECTED facem un lucru foarte simplu! Explorm
coninutul cmpului stareProdus. Dac acel produs era la vnzare, atunci acest cmp ar
fi avut valoarea 1 n tabelul Produse. n consecin, parametrul fictiv valoare1 ar fi
preluat coninutul 1, caz n care s-ar fi afiat n dreptul rubricii din formular textul n
vitrin. n caz contrar, s-ar fi afiat textul normal. V propunem o prim ntrebare:
1. Este un exerciiu de programare: ce denumire ar fi fost mai nimerit pentru
aceast funcie n loc de SELECTED, dac am fi voit s exprime faptul c este
n vitrina. Dup aceea unde trebuia s modificai codul de instruciuni n sine ca
s beneficiai de aceast nou denumire mai nimerit.

Afiarea produselor
Pe administrator l intereseaz un catalog cu categoriile de produse i un catalog in
extenso.
Pagina listaCatalog.asp rspunde la prima problem, iar pagina listaProduse.asp la a
doua.
Mai nti s ne ocupm de pagina listaCatalog.asp:
LISTA 8.4 Pagina ListaCatalog.asp

01. <%
02. ' Creez obiectul catRS, unde se va forma tabelul categoriilor de produse
03. Set catRS = Server.CreateObject("ADODB.Recordset")
04. catRS.ActiveConnection = Con
05. sqlString = "SELECT DISTINCT categorie_produs FROM Produse "
06. sqlString = sqlString & "WHERE stare_produs=1 "
07. sqlString = sqlString & "ORDER BY categorie_produs"
08. catRS.Open sqlString
09. %>

10. <% IF cat = "Acasa" THEN %>


11. <font color="red"><b>Acasa</b></font><UL>
12. <% ELSE %>
13. <a href="index.asp?cat=Acasa">Acasa</a><UL>
14. <% END IF %>

15. <% WHILE NOT catRS.EOF %>


16. <% IF catRS("categorie_produs") = cat THEN %>
17. <li><font color="red"><b>
18. <%=catRS("categorie_produs")%></b></font>
19. <% ELSE %>
20. <li><a
href="index.asp?cat=<%=Server.URLEncode(catRS("categorie_produs"))%>">
21. <%=catRS("categorie_produs")%></a>
22. <% END IF %>
23. <%
24. catRS.MoveNext
25. WEND
26. %>
27. </UL>
28. <% catRS.Close %>

Explicaii i parafraze
Prima chestiune pe care o realizm mai sus este s pregtim o instan a obiectului
RecordSet, pe care aici l vom numi catRS. n el vom pstra un tabel prescurtat cu
categoriile de produse. V reamintim c unul din cmpurile tabelului Produse este
categorie_produs. Deci trebuie s parcurgem toate nregistrrile tabelului i s
vizualizm doar categoriile distincte de produse din depozit.
Cum facem acest lucru? Cu ajutorul unei comenzi SQL n care neaprat trebuie s apar
opiunea DISTINCT. Privii liniile 05-07. Aici se prepar n variabila local sqlString
comanda respectiv. S tii c denumirea sqlString nu este rezervat. Am lsat-o la fel
denumit ca i n exemplul din referina /6/.
n liniile 10-14 prin construcia IF ... END IF urmrim coninutul variabilei cat. Dac ea
conine literalul Acas, deci. nc nu am vizitat vreo categorie i, suntem n pagina
primar a sitului, acest text va fi redat cu culoarea roie. Altfel, cnd am alege o
categorie de produs, textul Acasa va fi redat cu o nuan mai palid. Privii figurile 8.3a
i 8.3b. Cuvntul Acas se observ clar n prima figur.
Mai departe s examinm blocul WHILE . . . WEND din liniile 17-27. Prin IF-ul din
linia 16, examinm dac tabelul rezultat catRS a fost ncrcat cu o categorie, adic am
ieit din pagina primar pentru a cuta informaii despre produsele care aparin unei
anumite categorii.
FIGURA 8.3a. Pagina primar a sitului mypisi.shop,
nainte de selectarea categoriei monitoare

FIGURA 8.3b. Pagina primar a sitului mypisi.shop, dup selectarea categoriei monitoare
Orice categorie vizitat va fi redat cu culoarea roie pe cuvintele legturii de tip
hypertext. Iniial toate categoriile apar cu alt culoare, cea pentru legturi nc nevizitate.
Acest schimbare de culori este doar pentru a demonstra elasticitatea tehnologiei ASP.
Observai n linia 20 cum se atribuie variabilei cat rezultatul metodei URLEncode.
Acest metod aparine obiectului Server. Informaia legturii de hypertext se afl ntre
paranteza unghiular nchis a balizei <a href ... > i paranteza unghiular deschis a
balizei </a>. Conintul ei este rezultatul evalurii expresiei:
<%=catRS(categorie_produs)%>

Din aceast evaluare se obine denumirea categoriei. Rostul metodei MoveNext asociat
obiectului catRS este acela de a trece la urmtoarea nregistrare a tabelului catRS. La
final, nchidem logic obiectul catRS (linia 28).

S privim acum lista paginii listaProduse.asp. Ea se ocup de afiarea produselor dup


categorii.
LISTA 8.5 Pagina ListaProduse.asp

01. <%
02. ' In variabila prodRS formez tabelul cu produse pentru acea categorie, cat
03. Set prodRS = Server.CreateObject("ADODB.Recordset")
04. prodRS.ActiveConnection = Con

05. sqlString = "SELECT id_produs, nume_produs, caracteristici_produs " &_


06. "FROM Produse WHERE categorie_produs='" & cat & "' " &_
07. "AND stare_produs=1 " &_
08. "ORDER BY nume_produs "
09. prodRS.Open sqlString
10. %>

11. <table width="350" border="0" cellpadding="4" cellspacing="0">

12. <%
13. WHILE NOT prodRS.EOF
14. %>

15. <tr>
16. <td>
17. <% IF prodRS("caracteristici_produs") <> "nil" THEN %>
18. <IMG SRC="<%=prodRS("nume_produs")%>.jpg" hspace="4" vspace="4"
border="0" align="center">
19. <% END IF %>
20. </td>
21. <td>
22. <a href="produs.asp?pid=<%=prodRS("id_produs")%>">
23. <b><%=prodRS("nume_produs")%></b></a>
24. <br><%=prodRS("caracteristici_produs")%>
25. <br><a href="produs.asp?pid=<%=prodRS("id_produs")%>"></a>
26. </td>
27. </tr>
28. <tr>
29. <td colspan="2" align="center">&nbsp;</td>
30. </tr>

31. <%
32. prodRS.MoveNext
33. WEND
34. %>

35. </table>

Explicaii i parafraze
Aici pregtim o instan a unui tabel rezultat denumit prodRS. Obiectul Con are un
numr logic (acel handel de care vorbeam mai devreme). Ceea ce facem aici este s
obinem acest numr logic, deci ne conectm logic la baza mypisi.mdb.
n continuare, dac ai citit cu atentie explicaiile de pn aici, atunci v va veni mai uor
s recunoatei ce se ntmpl n liniile urmtoare ale acestui program.
De pild, n liniile 05-08 pregtim comanda de selectare a trei coloane id_produs,
nume_produs i caracteristici_produs din tabelul Produse. Selectarea se face doar pentru
o anumit categorie (variabila cat ne spune care anume).
Mai este o condiie i anume: se selecteaz doar acele produse puse la vnzare
(stare_produs = 1). Ordonarea se face alfabetic dup numele produsului.
Blocul WHILE . . . WEND, delimitat de liniile 13-33, este similar celui de la programul
ListaCatalog.asp. S explicm totui ce se petrece n linia a 18-a. Dac produsul are
specificate caracteristici, atunci exist i poza cu aspectul su. Ai observat poze de
produse n figurile 8.3a i 8.3b. Este prea miglos s compui artistic poze cu un maus!
De aceea pozele nu arat prea bine.
n linia 18 se evalueaz expresia i se obine coninutul cmpului nume_produs. Acesta
este alipit la sufixul .jpg i se obine denumirea fiierului pozei. n referina /6/ se
consacra nc o coloan n tabelul Produse pentru denumirea fiierului cu poza
produsului.
Poza este plantat n prima celul a tabelului HTML. n celula alturat afim
denumirea produsului (expresia <%=RS(nume_produs)%>) i caracteristicile sale
(expresia <%=RS(caracteristici_produs)%>). Exist chiar i o legtur de tip
hypertext care genereaz un ir de interogare. n acest ir este implicat i parametrul pid,
deci numrul produsului selectat cu ajutorul mausului.
A venit n sfrit rndul paginii principale a sitului, index.asp.
LISTA 8.6 Pagina de cas a sitului, index.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <%
03. ' Atribui categoria curenta variabilei locale cat
04. cat = TRIM( Request( "cat" ) )
05. inreg = TRIM(Request("inreg"))
06. ' response.write "index.asp: inreg = " & inreg & "<BR>"
07. ' Semafor stare inregistrare client vechi sau nou
08. ' inreg = 0 valoare de blocaj
09. ' inreg = 1 client nou
10. ' inreg = 2 client vechi

11. IF cat = "" THEN cat = "Acasa"


12. ' Deschid conexiunea logica la BD
13. Set Con = Server.CreateObject( "ADODB.Connection" )
14. Con.Open "sd"
15. %>

16. <html>
17. <head>
18. <title>Mypisi.shop</title>
19. </head>
20. <body link="#ffaa55" vtext="red" bgcolor="antiquewhite">
21. <center>
22. <table width="640" border="0" bgcolor="#eeddcc" cellspacing="0"
cellpadding="0">
23. <tr>
24. <td align="center" colspan="2"><img border="0" src="logo.jpg"></td>
25. </tr>
26. <tr>
27. <td width="160"><a href="cosuri.asp">Stare cos</a></td>
28. <td width="160"><a href="inreg.asp">La prima vizita a sitului</a></td>
29. <td width="160"><a href="login.asp">Vizitator vechi</a></td>
30. <td width="160"><a href="plata.asp">Stare comanda</a></td>
31. </tr>
32. </table>
33. <table width="640" border="0" bgcolor="#ffffff" cellpadding="0" cellspacing="0">
34. <tr>
35. <td valign="top">
36. <table cellpadding="0" cellspacing="0" border="0">
37. <tr>
38. <td valign="bottom"><img src="cauta.jpg" vspace=0 border="0"></td>
39. </tr>
40. <tr>
41. <td><table width="198" cellpadding="4" cellspacing="0" bgcolor="lightyellow"
border="1">
42. <tr>
43. <td width="186">
44. <form method="post" action="cauta.asp">
45. <input name="camp_cautare" size="15">
46. <input type="submit" value="Cauta">
47. </form>
48. </td>
49. </tr>
50. </table>
51. </td>
52. </tr>
53. <tr>
54. <td></td>
55. </tr>
56. <tr>
57. <td valign="bottom"><img src="categorii.jpg" vspace="0" border="0"></td>
58. </tr>
59. <tr>
60. <td><table width="200" cellpadding="4" cellspacing="0" bgcolor="lightyellow"
border="1">
61. <tr>
62. <td><font size="3"><b><!-- #INCLUDE FILE="ListaCatalog.asp" --
></b></font></td>
63. </tr>
64. </table>
65. </td>
66. </tr>
67. </table>
68. </td>
69. <td valign="top">
70. <% IF cat = "Acasa" THEN %>
71. <!-- #INCLUDE FILE="Vitrina.asp" -->
72. <% ELSE %>
73. <!-- #INCLUDE FILE="ListaProduse.asp" -->
74. <% END IF %>
75. </td>
76. </tr>
77. </table>
78. <hr width=640>
79. Inspirat dupa exemplul sitului din cartea "Teach Yourself E-Commerce
Programming with ASP in 21 Days", Stephen Walter si Jonathan Levine, seria
SAMS Teach Yourself, SAMS, 2000, dar modificat mult ca filozofie in privinta
vizitatorilor vechi si noi.
80. <br>Fara suport pentru card electronic, doar pentru scop didactic, elab. prof. dr.
Somnea Dan, 2003.
81. </center>
82. </body>
83. </html>

Explicaii i parafraze
n linia 01 includem n modul static un fiier denumit adovbs.inc. El conine muli
parametri ai aa-zisei biblioteci ActiveX Data Object. Limbajul este evident Visual
Basic for Scripting; de unde i prescurtarea adovbs. Nu ne apucm a-l diseca. Putem
nelege ASP i fr a-l prezenta!
Remarcai variabilele cat i inreg. Prima se refer la categoria selectat cu mausul, a
doua la tipul vizitatorului. tim c TRIM este o funcie de bibliotec a limbajului
VBScript i tim i ce face.
Evident, variabilele cat i inreg nu conin la nceput dect acest ir () adic nimic. n
linia 06 vedei o scriere de testare acum invalidat. A servit n faza de punere la punct a
sitului. S ignorm comentariile din liniile 07-10, care se refer la un semafor privitor la
tipurile de vizitatori, noi sau vechi. Motivul? Ar trebui s ntrerupem explicaiile acestui
program pentru a trece prin alt liste. Nu este oportun! Urmeaz deschiderea conexiunii
logice la baza de date (12-13). Am explicat-o cu lux de amnunte mai sus la lista
adminproduse.asp.
Aceast pagin primar mparte fereastra n parcele dup tehnica tabelrii fr chenare
din HTML. Pagina nu a fost totui proiectat cu un editor specializat pentru publicarea
pe Web ci cu editorul WordPad, lucrnd direct n HTML. A fost mai primitiv, dar am
avute unele avantaje de care nu voi vorbi deloc! Evident, este bine s folosii un editor
Web gen FrontPage! Atenie ns, FrontPage 98 pierde pe drum poriuni de cod ASP,
muncite de dumneavoastr!
Revenim. Mai nti apare sigla magazinului virtual (linia 24). Imediat vin patru legturi
de tip hypertext (liniile 27-30). Mergem mai departe! Mai jos n fereastr, n partea
stng a acesteia apare rubrica dedicat cutrii. De ea se ocup poriunea cuprins ntre
liniile 44-47. Imediat urmeaz o alt zon pentru afiarea categoriilor de produse (linia
62, privii i figura 8.3a).
n dreapta ferestrei pe o lime mai mare este vitrina magazinului virtual. Aici se perind
pozele acelor mrfuri livrate ce constituie nouti de ultim or. Felul cum se face
selecia lor va fi artat mai jos, cnd va fi vorba de pagina vitrina.asp.
Observai c apar i primele chestiuni legate de partea finaciar: acele cuvinte subliniate
Stare comanda i evident, starea coului de cumprturi al vizitatorului.
Cnd efectum clic pe Stare cos (linia 27) srim de fapt la pagina cosuri.asp etc.
La fel, dup ce completm mica fereastr rezervat cutrii i efectum un clic pe
butonul Cauta, se sare la programul caut asp. Acest buton aparine formularului
gestionat de programul cauta.asp (linia 44).
Chiar dac este situat abia n linia 62, includerea static a fiierului ListaCatalog.asp are
loc mai nainte de a se porni interpretarea paginii index.asp. Se alipete la index.asp
acest fiier.
Vom ntlni imediat mai jos i cazul includerii dinamice de pagini.
Privii liniile 70-74. n funcie de coninutul variabilei cat se alipete fie pagina
vitrina.asp, fie pagina ListaProduse.asp, fie pagina vitrina.asp. Prima dat cat are
coninutul Acasa, deci se va alipi pagina vitrina.asp.
Cnd ns ncepem s colindm prin situl virtual dup categorii de produse, cat nu mai
conine acest text ci, categoria care a fost selectat. Drept consecin, se va ncrca
cellalt program, ListaProduse.asp.
Wow! Its really great!

Ultimele nouti expuse n vitrin


Dac este aa, s vedem cum stm cu vitrina magazinului virtual!
Deci s examinm pagina vitrina.asp.
LISTA 8.7 Pagina vitrina.asp

01. <%
02. ' Resetez generatorul aleator
03. Randomize
04. ' Declar o constanta
05. CONST numVitrina= 3

06. ' Regaseste produsele alese pentru a fi in Vitrina e-shop-ului


07. sqlString = "SELECT id_produs, caracteristici_produs, nume_produs " &_
08. "FROM Produse WHERE produs_de_vitrina= 1 " &_
09. "AND stare_produs=1 " &_
10. "ORDER BY nume_produs "

11. ' In variabila locala formez tabelul produselor vedeta,


12. ' cele care au valoarea 1 in campul produs_de_vitrina (tabelul produse)

13. SET Vitrina = Con.Execute( sqlString )


14. IF NOT Vitrina.EOF THEN
15. Vitrina_Masiv = Vitrina.GetRows()
16. Vitrina.Close

17. ' Afisez produsele noi in vitrina


18. topVitrina = UBOUND( Vitrina_Masiv, 2 ) + 1
19. skip = topVitrina / numVitrina
20. IF topVitrina <= numVitrina THEN skip = 1
21. %>
22. <table width="350" border="0" cellpadding="4" cellspacing="0">
23. <%
24. FOR i = 0 TO topVitrina - 1 STEP skip
25. offset = RND * ( skip - 1 )
26. idProdus = Vitrina_Masiv( 0, i + offset )
27. caracteristiciProdus = Vitrina_Masiv( 1, i + offset )
28. numeProdus = Vitrina_Masiv( 2, i + offset )
29. %>
30. <tr>
31. <td>
32. <% IF caracteristiciProdus <> "nil" THEN %>
33. <IMG SRC="<%=numeProdus%>.jpg" hspace="4" vspace="4" border="0"
align="center">
34. <% END IF %>
35. </td>
36. <td><a href="produs.asp?pid=<%=idProdus%>">
37. <b><%=numeProdus%></b></a>
38. <br><a href="produs.asp?pid=<%=idProdus%>">Obtine mai multa
informatie</a>
39. </td>
40. </tr>
41. <tr>
42. <td colspan="2"></td>
43. </tr>
44. <%
45. NEXT
46. %>
47. </table>
48. <%

49. END IF
50. %>

Explicaii i parafraze
Sare n ochi acel cuvnt Randomize din linia 03. Comentariul de deasupra spune ce
face. VBScript are un generator normalizat de numere aleatoare uniform distribuite.
Funcia RND ntoarce un numr aleator uniform distribuit ntre 0,000...01 i 0,999... De
aceea se spune normalizat!
Constanta numVitrina stabilete numrul produselor expuse n vitrin. tim c n liniile
07-10 prelum trei coloane din tabelul Produse dup un criteriu: produsul este la vnzare
(stare_produs conine 1) i, coloana produs_de_vitrina este tot 1 (produsul este o
noutate). Administratorul bazei stabilete care produse merit s fie considerate noutile
acelei perioade. Tot el schimb manual n 0 valorile din coloana produs_de_vitrina,
cnd aceste produse ... i-au fcut veacul! Desigur selecia se face alfabetic dup
numele produsului.
n linia 13 obinem o instan a unui tabel rezultat, deci un obiect de tipul RecordSet.
Merge orice denumire nu numai RS ! Am ales denumirea Vitrina. Aici exista i mai
mult de trei produse noi la un moment dat . Dar n vitrin ncap numai trei (numVitrina
= 3). Cu metoda GetRows() a obiectului Vitrina, ncrcm totul ntr-o matrice VBScript
denumit Vitrina_Masiv. tii ce este o matrice? Este un tablou care are mai multe linii
i coloane. Liniile sunt alocate produselor iar coloanele matricei corespund n ordine
coloanelor tabelului Produse: id_produs, caracteristic_produs i nume_produs. Privii
din nou comanda SELECT de mai sus!
n linia 18 apelm la funcia de bibliotec UBOUND special pentru matrici. Observai
c se comunic acestei funcii cine este matricea i cte dimensiuni are. UBOUND
ntoarce numrul liniilor acestui masiv. l mrim cu o unitate. De ce? Nu intrm n
detalii de teoria numerelor!
Mai departe, n variabila skip, stabilim din cte n cte linii srim prin aceast matrice.
Pot fi mai mult de trei produse cu caracter de noutate n tabelul Produse! Dac s zicem
exist 8 produse noi, 8 mprit la 3 (topVitrina) d 2,66...! Privii la linia a 24-a. Aici
ncepe un bloc FOR. Spunem acum c dup STEP urmeaz o expresie VBScript a crei
valoare va servi blocului FOR. Valoarea nu va fi de tipul cu zecimale, ci una ntreag,
trunchiat la ntregul imediat inferior. Deci skip va avea 2! Deci vom sri din dou n
dou linii. Ce ne facem c avem 8 nouti i toate trebuie s fie expuse n vitrin!
Politica de advertising o rezolv RND adc alegerea la ntmplare! El ne ofer o valoare
cuprins ntre 0,000...01 i 0,999... . n fond i la urma urmei prin acest offset alegem
cnd rndurile pare cnd pe cele impare din matrice. n coloana a ntia se afl
id_produs. Programatorii numr de la 0 nu de la 1! De aceea vedei
Vitrina_Masiv(0,i+offset). Deci n idProdus va intra chiar numrul identificator al
produsului fericit, c a fost selectat pentru afiare n fereastra document a acelui
vizitator x. RND ntotdeauna ofer alt numr la urmtoarea apelare a sa. Deci alt
vizitator va primi n fereastra sa poate alte linii din Vitrina_Masiv. Chiar acest vizitator
dac mai reintr puin mai trziu va primi pe ecran pozele altor produse. Its fantastic!
Really fantastic!
Mai departe, considerm c suntei cunosctori ai HTML! Este vorba de un tabel n
sensul acestui limbaj (linia a 22-a). Tabelul este fr chenare, are spaii de patru pixeli
ntre celule, nu are margini ntre coninutul celulei i chenarul acesteia. Tabelul are un
rnd (tr din linia 30). n coloana din stnga (31-35) afim poza produsului nou iar n
celula alturat, (36-39) datele referitoare la acesta, .a.m.d.!

Cutarea produsului dup anumite


caracteristici
Am spus mai sus c n pagina principal a sitului se recurge frecvent la cutri. Pagina
care va trata aceste investigri ale vizitatorului se numete cauta.asp. S o descifrm!
LISTA 8.8 Pagina cauta.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <%

03. ' Atribui categoria curenta variabilei locale cat


04. cat = TRIM(Request("cat"))
05. ' Obtin comanda de cautare
06. IF cat = "" THEN cat = "Acasa"
07. camp_cautare = TRIM(Request("camp_cautare"))

08. ' Conectare la BD


09. Set Con = Server.CreateObject("ADODB.Connection")
10. Con.Open "sd"
11. %>

12. <html>
13. <head>
14. <title>Mypisi.shop</title>
15. </head>
16. <body link="#ff4040" vtext="lightred" bgcolor="fucsia">
17. <center>
18. <table width="640" border="0" bgcolor="#eeddcc" cellspacing="0"
cellpadding="0">
19. <tr>
20. <td colspan="2" align="center"><img src="logo.jpg"></td>
21. </tr>
22. <tr>
23. <td align="right" valign="bottom"><a href="cosuri.asp">Stare cos</a><td>
24. <td><a href="plata.asp">La plata!</a></td>
25. </tr>
26. </table>
27. <table width="640" border="0" bgcolor="#ffffff" cellpadding="0" cellspacing="0">
28. <tr>
29. <td valign="top">
30. <table cellpadding=0 cellspacing="0" border="0">
31. <tr>
32. <td valign="bottom" bgcolor="pink"><img src="cauta.jpg" vspace="0"
border="0"></td>
33. </tr>
34. <tr>
35. <td>
36. <table width="200" cellpadding="4" cellspacing="0" bgcolor="lightyellow"
border="1">
37. <tr>
38. <td><form method="post" action="cauta.asp">
39. <input name="camp_cautare" size="15">
40. <input type="submit" value="Cauta">
41. </form>
42. </td>
43. </tr>
44. </table>
45. </td>
46. </tr>
47. <tr>
48. <td></td>
49. </tr>
50. <tr>
51. <td valign="bottom"><img src="categorii.jpg" vspace=0 border="0"></td>
52. </tr>
53. <tr>
54. <td><table width="200" cellpadding="4" cellspacing="0" bgcolor="lightyellow"
border="1">
55. <tr>
56. <td><font size="3"><b><!-- #INCLUDE FILE="ListaCatalog.asp" --
></b></font></td>
57. </tr>
58. </table>
59. </td>
60. </tr>
61. </table>
62. </td>
63. <td valign="top">
64. <%
65. sqlString = "SELECT id_produs, caracteristici_produs, nume_produs " &_
66. "FROM Produse " &_
67. "WHERE stare_produs = 1 " &_
68. "AND (nume_produs LIKE '%" & camp_cautare & "%' " &_
69. "OR caracteristici_produs LIKE '%" & camp_cautare & "%') " &_
70. "ORDER BY nume_produs "
71. SET RS = Con.Execute(sqlString)

72. IF NOT RS.EOF AND camp_cautare <> "" THEN


73. %>
74. <table width="350" border="0" cellpadding="4" cellspacing="0">
75. <tr>
76. <td colspan="2"><font color="darkblue" size="3"><b>Rezultatul
cautarii:</b></font></td>
77. </tr>
78. <%
79. WHILE NOT RS.EOF
80. %>

81. <tr>
82. <td>
83. <%
84. IF RS("caracteristici_produs") <> "nil" THEN
85. %>
86. <IMG SRC="<%=RS("nume_produs")%>.jpg" hspace="4" vspace="4"
border="0" align="center">
87. <%
88. END IF
89. %>
90. </td>
91. <td><a
href="produs.asp?pid=<%=RS("id_produs")%>"><b><%=RS("nume_produs")%
></b></a></td>
92. </tr>
93. <%
94. RS.MoveNext
95. WEND
96. %>
97. </table>
98. <%
99. ELSE
100. %>
101. <table width="350" border="0" cellpadding="4" cellspacing="0">
102. <tr>
103. <td><font face="Arial" color="darkblue"><b>Nici un produs nu are caracteristicile
cerute de dvs. <br>Puteti cauta si dupa numele produsului. Deoarece nu il stiti,
puteti cauta dupa un cuvant de pilda: 15", TCO, pixel, boxe, mouse, DVD, CD,
disc etc. <br>Se intra in tabelul in campul caracteristicilor produsului! <br.Se
afiseaza tot ce are acel cuvant, grup de cuvinte separate prin blanc.</td>
104. </tr>
105. </table>
106. <%
107. END IF
108. %>
109. </td>
110. </tr>
111. </table>
112. </center>
113. </body>
114. </html>

Explicaii i parafraze
Mai nti de toate anexm la ea fiierul parametrilor ActiveX Data Object. Apoi
prelum parametrul cat. Dac aceast variabil va avea chiar textul Acasa, atunci nu am
recurs nc la o selectare a unei categorii.
Nu suntem obligai s punctm o anume categorie la vizitarea sitului, mai nainte de a
specifica un criteriu de cutare. Dac totui exist o informaie de cutare n variabila
camp_cautare (vezi liniile 07 i mai ales linia 39), acest coninut va servi drept criteriu
de cutare. Nu am folosit nc rubrica de cutare. Deci camp_cutare nu va conine
nimic. n acest caz programul caut un ir vid i nu va gsi ceva n coloana
caracteristici_produs din tabelul Produse i nici n coloana denumirilor de produs.
Atunci se va afia un mesaj (linia 103): Nici un produs nu are caracteristicile .
Dar s revenim. Ne conectm logic la baza de date (09-10). Alocm un tabel de 640
pixeli pe lime (linia 18). n rndul nti al su afim imaginea logo.gif, care este sigla
magazinului. Privii figura 8.3a acel text Mypisi. Vedei c nu apare centrat. Acum o a
doua ntrebare:
2. Unde am greit de nu apare aceast poz centrat c doar am specificat
align=center. Rspuns: am scris colspan=2 n loc de 4.
Mai devreme erau doar dou coloane. Pe rndul doi apar n fiecare coloan legturile de
tip hypertext de care vorbeam mai sus. Programele care se ocup de aceste legturi sunt
cosuri.asp (linia 23), plata.asp (linia 24).
Sub acest tabel urmeaz altul fr chenare (linia 27). Este mai greu de observat. n fond,
fiecare rnd are doar o celul. n prima sa linie (28), n celula respectiv (linia 29)
afim o poz denumit cauta.jpg. Este acel cuvnt ncadrat de o tent de culoare (vezi
figura 8.3a). n rndul al doilea, pe doar 200 pixeli (linia 36) alocm un alt tabel cu
chenar de un pixel (36).
Tabelul are doar o singur linie i o celul! n ea (linia 38) anunm c este un formular
cu dou cmpuri logice, nume_cautare (linia 38) i butonul de cutare (linia 40). n linia
39 este o fereastr de 15 caractere, unde nscriem cuvintele pe care le cutm.
Formularul care se ocup de cutare puncteaz spre programul cauta.asp, adic
programul pe care l explicm aici.
Urmeaz partea legat de categorii. Mai nti este afiat o poz (linia 51), denumit
categorii.jpg. Poza este acel cuvnt Categorii ncadrat de o tent de culoare.
Mai departe, n linia 54 ncepe un alt tabel. Nu mai numrm al ctelea este! i acesta
are tot 200 pixeli lime i un chenar de un pixel ca i tabelul rezervat cutrii. Restul de
440 pixeli sunt rezervai vitrinei sitului.
n unica celul a sa (linia 56) anunm c alipim static lista ListaCatalog.asp la pagina
index.asp.
n liniile 65-70 pregtim comanda de selectare dup rubricile: id_produs,
caracteristici_produs i nume_produs. Se caut doar n nregistrrile cu produse la
vnzare (stare_produs=1).
Acum urmeaz ceva interesant! Observai n liniile 68 i 69 acel cuvnt LIKE. Este un
operator de cutare generic al SQL. n fereastra criteriului de cutare am nscris unul,
poate dou cuvinte. Fie acest criteriu H120, V30 sau TCO. Se caut n ambele
coloane, nume_produs i caracteristic_produs, ceva asemntor (LIKE) ca denumire cu
acest criteriu.
Morala! Putem cuta dup denumirea complet sau incomplet a produsului. Exemple:
Reli sau Relisys sau sys sau LCD sau, i mai exact, Relisys TL 561, n fine doar 561.
Putem cuta i dup o caracteristic a sa (exemple TCO sau FCC sau pixel etc.) Nu este
necesar a nscrie dect un cuvnt cel mult. Restul face LIKE. De fapt se nelege c este
o cutare generic, cu ceva asemntor cu acea rdcin. La momentul executrii
comenzii de cutare vom avea ceva de genul: %561% sau %pixel% .
Remarcai rdcina ncadrat de dou caractere procent.
Se execut apoi comanda n linia 71. Deci se lanseaz o cutare prin cele dou cmpuri
ale tabelelei Produse. Tot ce se gsete conform acestor criterii generice de cutare
ajunge ntr-un tabel rezultat tip RecordSet, denumit RS, aa cum am fcut-o de multe
ori. Rndurile acestui tabel sunt apoi anunate pe ecran cu blocul instruciunilor din
liniile 79-95. Se afieaz chiar i poza produsului cutat (linia 86) nu numai denumirea
sa (linia 91).
Dac nu exist nici un criteriu asemntor cu cel cerut de vizitator, se anun mesajul
din linia 103, aa cum spuneam poate prea devreme mai sus.

La final de capitol
n acest capitol am parcurs:
1. Caietul de sarcini al sitului mypisi.
2. Tabelele i rubricile (cmpurile) sitului.
3. Procedeul de operare al asocierii sursei de date la directorul care gzduiete baza
de date mypi.mdb.
4. Programul de nscriere a produselor n tabelul Produse, adaugProdus.asp
5. Programul de administrare al parcului de produse, adminProduse.asp.
6. Programul de schimbare al coninutului unui produs, actualizezProdus.asp.
7. Afiarea unui catalog de categorii de produse, listaCatalog.asp.
8. Afiarea tuturor produselor unei anumite categorii, listaProduse.asp
9. Pagina principal a sitului index.asp
10. Alegerea i expunerea n vitrin a produselor noi, vitrina.asp.
11. Cutarea generic, programul cauta.asp.
9
Capitolul

nregistrarea vizitatorilor unui sit


comercial n ASP
Mai avei rbdare? Abia am nceput! Vizitatorii trebuie nregistrai. Ce mai
ateptm!

S
vedem cum nregistrm vizitatorii notri. De aceasta se ocup mai multe pagini
i anume: login.asp i inreg.asp al cror liste sunt redate n continuare.

Circuitul noilor vizitatori


Mai nainte s redm aspectul formularului de nscriere.

FIGURA 9.1 Formularul de nscriere pentru vizitatori noi, tabelul Clienti

Aici diferim mai mult de exerciiul din referina /6/. Sunt dou feluri de vizitatori, noi i
vechi. Ne ocupm de formularul celor noi. La acest formular se ajunge cnd efectuai
clic pe Vizitatori noi (vezi figura 8.3b), dac am intrat prin La prima vizita a sitului.
Iat lista programului:
LISTA 9.1 Pagina inreg.asp

01. <%
02. ' Preiau valorile provenite din formular (obiect request)
03. ' si le inscriu in variabile locale VBS
04. numeclientnou = TRIM( Request( "numeclientnou" ) )
05. parolanoua = TRIM( Request( "parolanoua" ) )
06. emailclient = TRIM( Request( "emailclient" ) )
07. adresaclient = TRIM( Request( "adresaclient" ) )
08. codpostalclient = TRIM( Request( "codpostalclient" ) )
09. inreg = TRIM( Request( "inreg") )

10. ' response.write "inreg = " & inreg & "<BR>"


11. %>

12. <html>
13. <head><title>Inregistrare</title></head>

14. <body bgcolor="white">


15. <center>
16. <table width="500" border="0" cellpadding="4" cellspacing="0">
17. <tr>
18. <td bgcolor="blue"><font color="white"
face="Arial"><b>Inregistrare</b></font></td>
19. </tr>
20. <tr>
21. <td>
22. <form method="post" action="adaugVizitator.asp"
23. <input name="inreg" type="hidden" value="1">
24. <input name="pid" type="hidden" value="<%=idProdus%>">
25. <font face="Arial" size="2"><p><b>Informatii cerute pentru clientii noi:</b></font>
26. <font face="Courier" size="2"><br><b>Nume client:</b>
27. <input name="numeclientnou" size="20" maxlength="20"
value="<%=Server.HTMLEncode( numeclientnou )%>">
28. <br><b>Parola:</b><input name="parolanoua" size="20" maxlength="20"
value="<%=server.HTMLEncode( parolanoua )%>">
29. <br><b>Adresa de email:</b><input name="emailclient" size="30"
maxlength="75" value="<%=Server.HTMLEncode( emailclient )%>"></font>
30. <font face="Arial" size="2" color="darkgreen">
31. <p><b>Informatia de adresa:</b></font>
32. <font face="Courier" size="2">
33. <br><b>Adresa:</b><input name="adresaclient" size="50" maxlength="50"
value="<%=Server.HTMLEncode( adresaclient )%>">
34. <br><b>Codul postal cel nou:</b><input name="codpostalclient" size="20"
maxlength="20" value="<%=Server.HTMLEncode( codpostalclient )%>"></font>
35. <input type="submit" value="Inregistrare">
36. </font>
37. </form>
38. </td>
39. </tr>
40. </table>
41. </body>
42. </html>
Explicaii i parafraze
Prelum datele completate n rubricile formularului n variabilele locale din liniile 04-
09. Linie a 10-a este o una de testare, din faza de punere la punct a sitului. Fiind acum
transformat ntr-un comentariu, nu i exercit aciunea. n clipa n care efectum clic
pe butonul Inregistrare (linia 35) al formularului (linia 22), s-au preluat deja n dou
cmpuri ascunse (hidden) valorile inreg (linia 23, o valoare egal cu 1) i pid,
identificatorul produsului, vezi linia 24; valoarea este dat dup ce are loc evaluarea
expresiei <%=idProdus%>. Aceast pagin poate fi referit i din alt program.
Contextul l d identificatorul produsului. Reinei denumirile logice ale cmpurilor
vizibile ale formularului.
Ele sunt: numeclientnou, parolanoua, emailclient, adresaclient i codpostalclient.
Cnd acionai butonul nregistrare, se trece la pagina adaugVizitator.asp. S o redm
acum pe aceasta.
LISTA 9.2 Pagina adaugVizitator.asp

01. <!-- #INCLUDE FILE="functii.asp" -->


02. <%

03. ' client nou


04. numeClientnou = TRIM( Request( "numeClientnou" ) )
05. parolanoua = TRIM( Request( "parolanoua" ) )
06. inreg = TRIM( Request( "inreg" ) )

07. ' response.write "inreg = " & inreg & "<BR>"


08. ' response.write "client nou = " & numeclientnou & "<BR>"
09. ' response.write "parola noua = " & parolanoua & "<BR>"
10. ' response.end

11. ' Deschid conexiunea logica cu BD


12. Set Con = Server.CreateObject( "ADODB.Connection" )
13. Con.Open "sd"

14. ' Este vorba de o noua inregistrare


15. IF error = "" THEN
16. adaugClient
17. END IF
18. %>
19. <html>
20. <body bgcolor="yellow">
21. <center>
22. <table width="400" border="3" cellpadding="10" cellspacing="7">
23. <tr>
24. <td>Multumim ca ne vizitati. Va rugam sa tineti minte parola dvs.</td>
25. </tr>
26. <tr>
27. <td>Ne scuzati, dar ca sa ne ferim de hoti va vom solicita la un moment dat
datele de identificare pentru fiecare marfa pe care intentionati sa o adaugati in
cosul de cumparaturi!</td>
28. </tr>
29. </table>
30. <form action="index.asp" method="post">
31. <input name="inreg" type="hidden" value="2">
32. <input type="submit" value="Succes la cumparaturi!">
33. </form>
34. </body>
35. </html>

Explicaii i parafraze
Aceast list este scurt! Observai instruciunile de testare a sitului (liniile 07-09) i
acea instruciune de stopare brutal a execuiei (10). Ea acioneaz ca un punct de
ntrerupere a execuiei unui program, fr posibilitatea de a relua executarea sa, ntr-un
mediul de depanare precum Microsoft Visual InterDev. Dup ce deschidem conexiunea
logic la baza de date mypisi.mdb (liniile 12-13), dac semaforul error nu a avut nimic,
deci formularul a fost corect completat la toate rubricile, vom aduga clientul n tabelul
Clieni (lansm subrutina adaugClient din linia 16). Aceast subrutin se afl n lista
functii.asp de care ne ocupm mai jos.
Avertizm pe vizitator c pregtim situl contra hoilor! Deci s i in minte parola.
Evident , ca s mai descreim fruntea onetilor notri vizitatori, n linia 32, le urmm
totui succes la cumprturi!

Circuitul cumprtorilor tradiionali


Vizitatorul tradiional intr prin legtura hypertext Vizitator vechi. n acest moment se
va intra n pagina login.asp. Iat lista ei n continuare:
LISTA 9.3 Pagina login.asp

01. <%
02. numeclient = TRIM( Request( "numeclient" ) )
03. parola = TRIM( Request( "parola" ) )
04. inreg = TRIM(Request( "inreg" ) )

05. ' response.write "login.asp: nume client " & numeclient & "<BR>"
06. ' response.write "login.asp: parola client " & parola & "<BR>"
07. ' response.write "login.asp: inreg " & inreg & "<BR>"

08. %>
09. <html>
10. <head><title>Client vechi</title></head>
11. <body bgcolor="white">
12. <center>
13. <table width="500" border="0" cellpadding="4" cellspacing="0">
14. <tr>
15. <td bgcolor="red"><font color="white" face="Arial"><b>Login</b></font>
16. </td>
17. </tr>
18. <tr>
19. <td>
20. <form method="post" action="verificclient.asp">
21. <input name="idclient" type="hidden" value="<%=idclient%>">
22. <font face="Arial" size="2">Va rog numele si parola dvs.:</font>
23. <font face="Courier" size="2"><p><b>Nume client vechi:</b><input
name="numeclient" size="20"></b>
24. <br><b>Parola:</b><input name="parola" size="20"></b>
25. <input type="submit" value="Login">
26. </font>
27. </form>
28. </td>
29. </tr>
30. </table>
31. </body>
32. </html>

Explicaii i parafraze
Distingem n cuprinsul acesteia un tabel HTML i un formular tot HTML, cu dou
rubrici vizibile (numeclient, parola, vezi liniile 22 i 23) i unul invizibil, deci hidden
(idclient, linia 21). V rugm s remarcai c inreg este inut sub control n mod
permanent prin instruciunea din linia 04.
La acionarea butonului pe care scrie Login (25) se predau programului verificclient.asp
coninuturile acestor rubrici ca i cmpul invizibil inreg!
Iat-ne ajuni i la programul verificclient.asp:
LISTA 9.4 Pagina verificclient.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <!-- #INCLUDE FILE="functii.asp" -->

03. <%
04. numeclient = TRIM( Request( "numeclient" ) )
05. parola = TRIM( Request( "parola" ) )
06. inreg = TRIM( Request( "inreg" ) )

07. ' response.write "verficclient.asp: inreg = " & inreg & "<BR>"

08. ' Conectare la BD


09. Set Con = Server.CreateObject("ADODB.Connection")
10. Con.Open "sd"

11. sqlString = "SELECT id_client, nume_client, parola_client FROM Clienti " &_
12. "WHERE nume_client='" & numeclient & "' " &_
13. "AND parola_client='" & parola & "'"
14. SET RS = Con.Execute(sqlString)

15. IF RS.EOF THEN


16. %>
17. <html>
18. <body bgcolor="red">
19. <P><FONT FACE="Verdana" COLOR="WHITE">A-ati uitat parola stimate
vizitator. Va trebui sa va inregistrati ca client nou.
20. <P>Pacat nu mai aveti acces la fostul dvs. cos de cumparaturi!
21. </FACE>
22. <form method="post" action="index.asp">
23. <input name="inreg" type="hidden" value="0">
24. <input type="submit" value="Inapoi">
25. </form>
26. </body>
27. </html>
28. <%
29. ELSE
30. cid = RS("id_client")
31. %>
32. <html>
33. <body bgcolor="#55eeaa">
34. <center>
35. <table width = "300" border="1" cellpadding="15" cellspacing="5">
36. <tr>
37. </tr>
38. <tr>
39. <td colspan="2" align="center"><img src = "logo.jpg"></td>
40. </tr>
41. <tr>
42. </tr>
43. </table>
44. <form method="post" action="index.asp">
45. <input type="submit" value="Inapoi">
46. <input type="hidden" name = "cid" value="<%=RS("id_client")%>"></td>
47. <input type="hidden" name ="inreg" value="2"></td>
48. </form>
49. </body>
50. </html>
51. <%
52. ' response.write "verificclient: idclient = " & cid & "<BR>"
53. ' response.end
54. END IF
55. %>

Explicaii i parafraze
Includem static cele dou fiiere adovbs.inc i functii.asp n primele dou linii. n liniile
04 - 05 urmrim numele i parola vizitatorului nou, ca i semaforul inreg, pentru a
prinde impostorii! Urmeaz s cutm vizitatorul n tabelul clienilor. Atunci, mai nti
ne conectm logic la baza de date (09-10), apoi preparm comanda de selecie (11-13)
Distingem aici i coloana id_client, pe lng celelalte dou menionate mai sus. Vom
avea nevoie permanent de acest identificator al clientului la coul de cumprturi i la
emiterea comenzii. Vom cuta clientul nostru dup numele i parola introduse.
n cazul c nu este nimeni n tabelul clienilor, tabelul rezultat RS va fi vid, adic nu va
avea nici un rnd. Ca atare se va ridica de la nceput condiia de EOF (linia 15). n acest
caz, bietul nostru client va primi ca mesaj ceva dezarmant i pe fond de culoare roie!
O parantez. Aici programul ar putea fi perfecionat. Clientului nou nu ar trebui s nu i
se solicite s inventeze o parola. Mai indicat este cum se procedeaz la numeroase
situri printre care i situl free.fr. Aici se genereaz parola care apoi i parvine celui care
vrea s se nscrie la acest sit prin pot la adresa menionat. Revenim. Acum unica
modalitate este aceasta: clientul trebuie ca s intre sub un nume puin schimbat i i
precizeze o alt parol. Este deagreabil i pentru acesta dar i este neproductiv pentru
administrator, deoarece va colecta pn la urm o tabel cu vizitatori uituci!
Dac clientul i-a cunoscut parola, evident comanda de cutare va ntoarce un tabel cu
un singur rnd (se merge pe ramura ELSE, deci secvena dintre liniile 30-54). Din acest
rnd se va prelua identificatorul clientului, cid (linia 46), ce va fi transmis tot drept
parametru ascuns. n acest timp, clientul este invitat s foloseasc butonul Inapoi.
Totodat, n linia 47 se nscrie n semaforul inreg valoarea 2! n sfrit clientul a cptat
statutul de client vechi! i inreg are regimul ascuns.
Am tot evitat abordarea fiierului cu funcii pentru acest sit. A venit i timpul lor. Deci
s vedem ce conine pagina functii.asp. V prevenim c este cea mai voluminoas list,
dar nglobeaz destule subrutine i funcii.

Colecia de funcii i subprograme a sitului


Am spus n aceast carte care este diferena dintre o funcie i o subrutin n partea
legat de tehnologia JSP.
LISTA 9.5 Funcii utile paginilor acestui sit

01. <%
02. FUNCTION apostrof12(Sirul)
03. apostrof12 = REPLACE(Sirul, "'", "''")
04. END FUNCTION

05. SUB adaugJalon(numele, valoarea)


06. Response.Cookies(numele) = valoarea
07. Response.Cookies(numele).Expires = "31.12.2003"
08. Response.Cookies(numele).Path = "/"
09. Response.Cookies(numele).Secure = FALSE
10. END SUB

11. FUNCTION verificparola(byVal numeclient, byVal parola, byRef Con)


12. ' response.write "verificparola: numeclient = " & numeclient & "<BR>"
13. ' response.write "verificparola: parola = " & parola & "<BR>"

14. sqlString = "SELECT id_client FROM Clienti " &_


15. "WHERE nume_client='" & numeclient & "' " &_
16. "AND parola_client='" & parola & "'"
17. SET RS = Con.Execute(sqlString)
18. IF RS.EOF THEN
19. verificparola = - 1
20. ELSE
21. verificparola = RS("id_client")
22. adaugJalon "numeclient", numeclient
23. adaugJalon "parola", parola
24. END IF
25. END FUNCTION

26. FUNCTION SELECTED(valoare1, valoare2)


27. IF cSTR(valoare1) = cSTR(valoare2) THEN
28. SELECTED = "SELECTED"
29. ELSE
30. SELECTED = ""
31. END IF
32. END FUNCTION

33. SUB eroareInFormular(mesajDeEroare)


34. %>

35. <html>
36. <head><title>Eroare in formular</title></head>
37. <body bgcolor="lightyellow">
38. <center>
39. <table width="500" border="1" cellpadding="4" cellspacing="0">
40. <tr>
41. <td><font face="Arial" size="3" color="darkblue"><b>Informatie introdusa este
eronata:</b></font>
42. <font size="2" color="red"><b><br><%=mesajDeEroare%></b></font><br>
43. <form method="post" action="inreg.asp">
44. <input name="error" type="hidden" value="1"><% campuriFormular %>
45. <input type="submit" value="Inapoi">
46. </form>
47. </td>
48. </tr>
49. </table>
50. </center>
51. </body>
52. </html>
53. <%

54. Response.End
55. END SUB

56. SUB campuriFormular


57. FOR EACH resursa IN Request.Form
58. %>
59. <input name="<%=resursa%>" type="hidden"
value="<%=Server.HTMLEncode(Request(resursa))%>">
60. <%
61. NEXT
62. END SUB

63. ' Functii pentru inregistrare


64. SUB adaugClient
65. ' Obtin campurile de inregistrare
66. numeclientnou = TRIM(Request("numeclientnou"))
67. parolanoua = TRIM(Request("parolanoua"))
68. emailclient = TRIM(Request("emailclient"))
69. adresaclient = TRIM(Request("adresaclient"))
70. codpostalclient = TRIM(Request("codpostalclient"))

71. ' Verific campurile obligatorii


72. IF numeclientnou = "" THEN
73. eroareInFormular "Trebuie sa specificati numele dvs."
74. END IF

75. IF parolanoua = "" THEN


76. eroareInFormular "Trebuie si parola dvs."
77. END IF

78. IF emailclient = "" THEN


79. eroareInFormular "Neaparat adresa dvs. de email."
80. END IF

81. IF adresaclient = "" THEN


82. eroareInFormular "Trebuie sa specificati adresa dvs."
83. END IF

84. IF codpostalclient = "" THEN


85. eroareInFormular "Trebuie sa specificati codul dvs. postal."
86. END IF

87. ' Verificare format email


88. IF formatgresitEmail(emailclient) THEN
89. eroareInFormular "Format gresit de casuta postala."
90. END IF

91. ' Oare nu este deja in BD acest client


92. IF dejaInBD(numeclientnou) THEN
93. eroareInFormular "Introduceti un alt nume. Cel introdus exista deja in tabelul
clienti din BD."
94. END IF

95. ' Adaug un client la BD


96. sqlString = "INSERT INTO Clienti (" &_
97. "nume_client, parola_client, email_client, adresa_client, cod_postal_client" &_
98. ") VALUES (" &_
99. " '" & apostrof12(numeclientnou) & "', " &_
100. " '" & apostrof12(parolanoua) & "', " &_
101. " '" & apostrof12(emailclient) & "', " &_
102. " '" & apostrof12(adresaclient) & "', " &_
103. " '" & apostrof12(codpostalclient) & "')"

104. Con.Execute sqlString

105. numeclient = numeclientnou


106. parola = parolanoua

107. adaugJalon "numeclient", numeclient


108. adaugJalon "parola", parola
109. END SUB

110. SUB actualizezClient

111. ' Preia campurile din formular


112. adresaclient = TRIM(Request("adresaclient"))
113. codpostalclient = TRIM(Request("codpostalclient"))
114. ' Verific campurile obligatorii

115. IF adresaclient = "" THEN


116. eroareInFormular "Nu ati introdus adresa."
117. END IF

118. IF codpostalclient = "" THEN


119. eroareInFormular "Nu ati introdus codul postal de client."
120. END IF

121. ' Actualizez informatia din BD referitoare la client


122. ' sqlString = "UPDATE Clienti SET " &_
123. ' "adresa_client='" & apostrof12(adresaclient) & "'," &_
124. ' "cod_postal_client='" & apostrof12(codpostalclient) & "' " &_
125. ' "WHERE id_client=" & idclient

126. ' Con.Execute sqlString


127. END SUB

128. FUNCTION formatgresitEmail(cp)


129. IF INSTR(cp, "@") = 0 OR INSTR(cp, ".") = 0 THEN
130. formatgresitEmail = TRUE
131. ELSE
132. formatgresitEmail = FALSE
133. END IF
134. END FUNCTION

135. FUNCTION dejaInBD(nClient)


136. sqlString = "SELECT nume_client FROM Clienti " &_
137. "WHERE nume_client='" & apostrof12(nClient) & "'"

138. SET RS = Con.Execute(sqlString)


139. IF RS.EOF THEN
140. dejaInBD = FALSE
141. ELSE
142. dejaInBD = TRUE
143. END IF
144. RS.Close
145. END FUNCTION

146. FUNCTION arataStareComanda( starea, dataLivrare )


147. ' Care este starea comenzii
148. SELECT CASE starea
149. CASE 0
150. arataStareComanda = "Produs nu este in stoc"
151. CASE 1
152. arataStareComanda = "In curs de livrare"
153. CASE 2
154. arataStareComanda = "Livrat la data de " & dataLivrare
155. CASE ELSE
156. arataStareComanda = "Stare necunoscuta"
157. END SELECT
158. END FUNCTION
159. %>
Explicaii i parafraze
Prima funcie denumit apostrof12, se ocup de dublarea acelui apostrof stingher.
Reamintim contextul: v aducei aminte de acea valoare Scotts Company i de prolmea
de la SQL. Funcia are ca parametri literalul ce urmeaz a fi transliterat.
Urmeaz s ne ntlnim acum cu acele jaloane, cookies, prezentate cu lux de amnunte
n capitolul 6.
Subrutina care se ocup de nregistrarea unui jalon am denumit-o adaugJalon. Are doi
parametri fictivi, numele i valoarea. Din punct de vedere al tehnologiei ASP, cookie
este o colecie ca i coleciile Form, ServerVariables ale obiectului request. Request are
n total vreo cinci colecii. Nu le prezentm.
n linia 07 nregistrm ntr-un fiier din directorul Cookie al sesiunii utilizatorului
Windows, un jalon cu denumirea stabilit de coninutul primit de paramterul numele.
Mai clar, pentru ca s nregistrm un jalon denumit foo i sub denumirea de Gheorghita
Marius, care s expire la 31 dec. 2003, recurgem la dou linii ca acestea:
Request.Cookie(foo) = Gheorghita Marius
Request.Cookie(foo).Expire = 31.12.2003

Deoarcere dorim ca acest jalon s fie persistent, recurgem la atributul Expires (linia 07).
n lipsa acestui atribut jalonul va dinui doar att ct dureaz sesiunea utilizatorului.
Aplicaia de fa i mai paseaz parametrii i prin intermediul acestui jalon.
Un jalon persistent este o soluie nefericit, pentru c spaiul dedicat jaloanelor este
limitat. ntr-un singur sit Web nu se admit dect maximum 25-30 blocuri tip cookie. Per
total, un calculator nu poate nmagazina dect pe vreo 4 Kb, ceea ce ar reveni la cca.
250-300 jaloane.
S ne ocupm mai pe scurt de funcia de verificare a parolei, denumit verificparola,
ntruct am fcut-o deja n paragraful consacrat prezentrii limbajului VBScript. Ea
ncepe de la linia a 11-a. Are trei parametri. Primii doi sunt pasai prin valoare, iar Con
este pasat prin referin. Funcia prepar o comand de selecie, pentru c verific parola
unui client din tabelul clienilor. Comanda este format n liniile 14-16. Executarea are
loc n linia a 17-a. Atunci se obine o instan a unui obiect tip RecordSet denumit RS.
Dac acest tabel rezultat nu are nici un rnd, clientul nu exist, deci se ndeplinete de la
nceput condiia EOF. Ca atare, funcia va ntoarce -1.
Poate c ai remarcat pn acum acea linie
idclient = verificparola(numeclient, parola, Con)

Dac exist, vedei cum are loc marcarea clientului (linia 21) i cum crem acele dou
jaloane de care am spus mai sus (liniile 22 i 23).
Despre funcia SELECTED am mai vorbit n paragraful despre VBScript. Se compar
doi literali. Comparaia are loc n sensul lexicografic al codului UNICODE. Secvena
lexicografic aranjeaz caracterele astfel: !, @, #, $, %, ^, &, cifrele 0, 1, 2, 3, ..., 9, apoi
literele mici, cele mari .a.m.d.. Blancul are valoarea cea mai mic, mai mic chiar dect
semnul mirrii. Mirai-v dar aceasta este secvena lexicografic. Ea corespunde unor
coduri binare stabilite pentru aceste caractere (vezi /1/).
A venit rndul subrutinei eroareInFormular (linia 33). Acesta preia mesajul de eroare n
unicul parametru fictiv. Aceast funcie este apelat de ctre subrutina adaugClient, ce
va fi prezentat mai jos.
Ea cheam la rndu-i subrutina campuriFormular (linia 56). Aici ntlnim instruciunea
FOR EACH proprietate IN obiect.colecie

VBScript nu opereaz numai cu date logice, ntregi, date zecimale i iruri de caractere
ci i cu obiecte ActiveX. Request este un obiect ActiveX. Form este o colecie a lui
request.
Formularul are o serie de cmpuri logice. Ca orice bucl FOR, ea se termin printr-un
NEXT (este vorba de grupul 57 - 61). Corpul ei nu face altceva dect s extrag i s
afieze valoarea acelui cmp, pentru ca vizitatorul s nu mai fie nevoit a-l completa, deci
de a pierde timpul cu reumplerea ntregului formular, n caz de eroare de completare!
Cu ncepere de la linia a 63-a i pn la linia a 109-a se ntinde subrutina adaugClient.
Se preiau coninuturile rubricilor irului de interogare (liniile 66-70), se elimin spaiile
redondante (TRIM).
Apoi se cerceteaz valorile rubricilor formularului de nscriere prin triadele IF ... END
IF. n caz de rubric necompletat, se anun mesajul respectiv i se revine la pagina
inreg.asp.
Se verific n linia 88 corectitudinea formatului csuei potale cu funcia denumit
formatgresitEmail.
Ne ntrebm n linia 92 dac vizitatorul nu se afl deja n tabelul clieni. Acest caz apre
cnd cineva ar recurge la acelai nume!
n sfrit, n zona 96-103 compunem comanda de inserare a valorilor acelui client.
Executarea ei se produce n linia 104. Se memoreaz n dou variabile locale numele i
parola clientului, apoi n final, se nregistreaz n blocuri tip cookie numele clientului i
parola sa.
Am vzut care sunt dezavantajele acestor cookie. Mai este unul: dac posesorul unui PC
dezactiveaz intenionat facilitatea de nregistrare a jaloanelor, aplicaia aceasta nu va
mai funciona corect!
Funcia care verific corectitudinea formatului csuei potale se afl n liniile 128-134.
Ea recurge la serviciile unei funcii de bibliotec VBScript cu numele INSTR (adic in
string, n ir). Se caut n irul de caractere al adresei de e-mail un caracter @ i cel puin
un punct. Funcia ntoarce valoarea logic FALSE, dac formatul csuei potale nu este
corect!
O alt funcie adhoc, dejainBD verific existena n tabelul Clieni a unui aceluiai nume
(liniile 135-145). Preparm comanda de cutare SQL n tabelul clienilor i o executm.
Cutm un client cu numele nClient (parametrul fictiv). Dac exist aa ceva, atunci
funcia va ntoarce valoarea logic adevrat, TRUE. n caz contrar, ea va ntoarce
valoarea logic fals, FALSE.
Ca exerciiu v adresm o alt ntrebare:
3. V solicitm s descifrai subrutina actualizezClient (liniile 110-127).
Ultima funcie din acest lung periplu se refer la starea comenzii. O comand emis la
cererea vizitatorului trece ca orice tranzacie prin stadiile: n curs de livrare, a fost livrat
la data de ... sau are o stare necunoscut. Toate aceste cazuri sunt decelate de
instruciunea compus SELECT din liniile 148-157.
10
Capitolul

Coul de cumprturi i partea


legat de comenzi i pli
Nu disperai! Suntem la finalul exemplului. Situl electronic nu poate fi conceput
fr coul de cumprturi programele care se ocup de formele de plat.

Coul de cumprturi, interceptarea e-


hoilor

P rogramul de baz este cosuri.asp. Programul nsoitor este denumit


adaugacos.asp.
Orice client are propriul su co electronic care este pstrat ntr-un tabel denumit
cos, pn cnd acesta dorete comanda ferm. Coul este piesa strategic pentru
compartimentul de marketing al proprietarului magazinului virtual.
Ca s nu adormii citind aceste liste, a venit rndul ca s v ntrebm mai des n care linii
se realizeaz obiectivele de mai jos pentru pagina cosuri.asp:
LISTA 10.1 Pagina cosuri.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <!-- #INCLUDE FILE="functii.asp" -->
03. <%

04. ' Obtin id-ul produsului


05. idProdus = TRIM(Request("pid"))
06. numeclient = TRIM(Request("numeclient"))
07. inreg = TRIM(Request("inreg"))
08. parola = TRIM(Request("parola"))
09. ' response.write "cosuri: nume client este " & numeclient & "<BR>"
10. ' response.write "cosuri: parola = " & parola & "<BR>"
11. ' response.write "cosuri: inreg " & inreg & "<BR>"
12. ' Deschid conexiunea logica cu BD
13. Set Con = Server.CreateObject( "ADODB.Connection" )
14. Con.Open "sd"

15. idclient = verificparola(numeclient, parola, Con)


16. ' response.write "cosuri: idclient este " & idclient & "<BR>"
17. ' response.end
18. IF idclient > 1 AND inreg = "2" THEN
19. %>
20. <!-- #INCLUDE FILE="adaugcos.asp" -->
21. <%
22. ELSE
23. %>
24. <!-- #INCLUDE FILE="login.asp" -->
25. <%
26. END IF
27. %>

Explicaii i parafraze
1. n ce mod se includ fiierele adovbs.inc i functii.asp?
2. Comentariul din linia 04 este incomplet. Ce credei c se obine n liniile 05-08?
3. Acele response.write sunt instruciuni sau comentarii? Ce este response dar ce este
write (indicaie: response este tot un obiect implicit ca i request).
4. Unde se obine acel numr logic (handle) de acces la baza de date (specificai
liniile)?
5. Variabila idclient este tot una cu idClient? Ce valori poate conine aceasta?
(indicaie: avei n vedere i pagina functii.asp)
6. Pentru care valori ale semafoarelor idclient i inreg se alipete pagina adaugcos.asp?
7. Dar pagina login.asp?
8. A scrie END IF este tot una cu a scrie ENDIF?
Iat, v-am mai trezit poate din letargia pe care ai captat-o, citind adormii ce fac aceste
liste!
S continum ntr-o manier similar i cu pagina adaugCos.asp a crei list o vedei
mai jos:
LISTA 10.2 Pagina adaugCos.asp

01. <!-- #INCLUDE FILE="functii.asp" -->


02. <%
03. ' Obtin identificatorul produsului si clientului
04. idProdus = TRIM(Request("pid"))
05. numeclient = TRIM(Request("numeclient"))
06. parola = TRIM(Request("parola"))
07. ' response.write "adaugcos.asp: nume client este " & numeclient & "<BR>"
08. ' response.write "adaugcos.asp: parola = " & parola & "<BR>"
09. idclient = verificparola(numeclient, parola, Con)
10. ' response.write "adaugcos.asp: idclient este " & idclient & "<BR>"
11. ' response.end

12. ' Caut in tabelul cos sa vad daca am client deja cu un anume id
13. ' si chiar cu un acelasi id de produs, ca sa il insumez
14. IF idProdus <> "" THEN
15. sqlString = "SELECT id_cos FROM cos " &_
16. "WHERE id_client_cos=" & idClient & " " &_
17. "AND id_produs_cos=" & idProdus

18. SET RS = Con.Execute(sqlString)


19. IF RS.EOF THEN
20. sqlString = "INSERT INTO cos (" &_
21. "id_client_cos, " &_
22. "id_produs_cos, " &_
23. "cantitate_cos " &_
24. ") VALUES (" &_
25. idClient & ", " &_
26. idProdus & ", 1)"
27. ELSE
28. sqlString = "UPDATE cos SET " &_
29. "cantitate_cos=cantitate_cos+1 " &_
30. "WHERE id_cos=" & RS("id_cos")
31. END IF
32. RS.Close
33. SET RS = Nothing

34. Con.Execute sqlString


35. END IF

36. ' Actualizez cantitatile din cosul de cumparaturi


37. IF Request("updateQ") <> "" THEN
38. SET RS = Server.CreateObject("ADODB.Recordset")
39. RS.ActiveConnection = Con
40. RS.CursorType = adOpenDynamic
41. RS.LockType = adLockOptimistic
42. sqlString = "SELECT id_cos, cantitate_cos FROM cos " &_
43. "WHERE id_client_cos=" & idClient
44. RS.Open sqlString

45. WHILE NOT RS.EOF


46. newQ = TRIM(Request("pq" & RS("id_cos")))
47. eliminProdus = TRIM(Request("pq" & RS("id_cos")))
48. IF newQ = "" OR newQ = "0" THEN
49. RS.Delete
50. ELSE
51. IF isNumeric(newQ) THEN
52. RS("cantitate_cos") = newQ
53. END IF
54. END IF
55. RS.MoveNext
56. WEND
57. RS.Close
58. SET RS = Nothing
59. END IF
60. %>

61. <html>
62. <head><title>Cosul de cumparaturi</title></head>
63. <body bgcolor="white">
64. <center>
65. <font face="Arial" size="3" color="darkgreen"><b>Cosul de cumparaturi al
domnului/doamnei/d-soarei. <%=numeClient%></b></font>
66. <%

67. ' Obtin id-ul cosului de cumparaturi


68. sqlString = "SELECT id_cos, nume_produs, " &_
69. "pret_produs, cantitate_cos " &_
70. "FROM cos, produse " &_
71. "WHERE id_client_cos=" & idClient & " " &_
72. "AND id_produs_cos = id_produs " &_
73. "ORDER BY id_cos DESC"

74. SET RS = Con.Execute(sqlString)


75. IF RS.EOF THEN
76. %>
77. <p><b>Cosul este gol!</b><p>
78. <form action="verificclient.asp">
79. <input type="submit" value="Scuzati o verificare de rutina!">
80. </form>
81. <%
82. ELSE
83. totalDePlata = 0
84. %>
85. <form method="post" action="cosuri.asp">
86. <input name="updateQ" type="hidden" value="1">
87. <input name="numeclient" type="hidden" value="<%=numeclient%>">
88. <input name="parola" type="hidden" value="<%=parola%>">
89. <table bgcolor="lightyellow" border="1" cellpadding="4" cellspacing="0">
90. <tr bgcolor="lightgreen">
91. <th>Produsul</th>
92. <th>Pretul (lei)</th>
93. <th>Cantitatea (buc)</th>
94. </tr>
95. <%
96. WHILE NOT RS.EOF
97. totalDePlata = totalDePlata + (RS("pret_produs") * RS("cantitate_cos"))
98. %>
99. <tr>
100. <td><%=Server.HTMLEncode(RS("nume_produs"))%></td>
101. <td><%=RS("pret_produs")%></td>
102. <td><input name="pq<%=RS("id_cos")%>" type="text" size="4"
value="<%=RS("cantitate_cos")%>"></td>
103. </tr>
104. <%
105. RS.MoveNext
106. WEND

107. IF totalDePlata > 80000000 THEN


108. ' Posibil impostor intercepteaza-l
109. ' Aici nu am cum sa-i prind pe impostori
110. ' Oricum astia se arunca la furat pe banii lui ... Trahanache!
111. ' Daca stiti dvs. alta metoda mai buna ziceti-mi-o!
112. ' Il iau pe nemteste daca tot mananca lebedele!
113. %>
114. <center>
115. <table border="3" cellpadding="13" cellspacing="5">
116. <tr>
117. <td>Entschuldigung! Aber Sie sind ein impostor!
118. <P>Die Polizei ist alarmiert gewessen!
119. <P>Ihre Eintritt caput im unseren Site!
120. </td>
121. </tr>
122. </center>
123. </table>
124. <%
125. ELSE
126. %>
127. <tr bgcolor="yellow">
128. <td colspan="2" align=right><b>Total de plata:</b></td>
129. <td><%=totalDePlata%></td>
130. </tr>
131. <tr>
132. <td colspan="3"><table border="0">
133. <tr>
134. <td align="right"><input type="submit" value="Schimb continutul cosului"></td>
135. </form>
136. <form method="post" action="completarecomanda.asp">
137. <input name="numeclient" type="hidden" value="<%=numeclient%>">
138. <input name="parola" type="hidden" value="<%=parola%>">
139. <td><input type="submit" value="Finalizarea comenzii"></td>
140. </form>
141. <form action="index.asp">
142. <td><input type="submit" value="Mai cumpar!"></td>
143. </form>
144. </tr>
145. </table>
146. </td>
147. </tr>
148. </table>
149. <%
150. END IF
151. END IF
152. %>
153. </center>
154. </body>
155. </html>
Explicaii, parafraze i ntrebri
1. Funcia TRIM este una creat de noi n pagina functii.asp sau nu? Ce realizeaz
ea?
2. Cmpul pid este un cmp logic sau nu?
3. Ce rost au acele apostrofuri din prima linie? (vezi liniile unde apar cuvintele
response.write)
4. Ce este response, dar write?
5. Dac am fi scris con i nu Con era greit?
6. Dac am fi scris fr virgule parametrii din parantezele ncadratoare de dup
cuvntul verificparola era greit?
7. Care este sensul semantic al cuvntului verificparola?
8. Ce vrea s nsemne n linia 14 operatorul de comparaie <> , dar notaia ?
9. Ce face comanda SQL din liniile 15-17?
10. Dar cea din linia 18 ?
11. Dar comanda SQL din liniile 20-26?
12. Cum spunem denumirii RS, ce este ea n fond un obiect, un tabel?
13. n care linii se execut comenzi SQL?
14. Ce s nsemne oare IF RS.EOF THEN?
15. Pe ramura ELSE are loc o (spunei dvs. ce anume)?
16. De unde i pn unde ine IF-ul din linia 14?
17. Dar IF-ul din linia 19?
18. Dac RS este un obiect atunci close (linia 33) ce este?
19. n care linie are loc creterea cu o unitate a numrului bucilor produsului
adugat n co?
Aici ne oprim!
S privim acum linia 36. Aici se anun prin comentariu c va avea loc o actualizare a
coninutului coului de cumprturi, dac semaforul updateQ, plasat n alt program este
diferit de zero.
Creem un obiect tip RecordSet, dar alegem un aa-zis cursor evoluat. Cnd apelm un
obiect RecordSet, acesta este deschis n modul cel mai economic ca volum de resurse
implicate. Aceasta revine la a i se pune la dispoziie un cursor, ce permite doar micarea
de avansare spre sfritul tabelului rezultat, cum i se mai spune obiectului tip RecordSet.
Exist ns i deschiderea tabelului cu un cursor static:
RS.CursorType = adOpenStatic

ca i deschiderea cu un cursor dinamic:


RS.CursorType = adOpenDynamic

cum se poate vedea n acest program. Instruciunea din linia 41 anun faptul c se poate
modifica coninutul tabelului. n acest sens se folosete proprietatea LockType a
obiectului RS, plasat pe valoarea adLockOptimistic.
n figura 10.1 vedem un co cu trei produse: maus, laptop i DVD. Sunt comandate
dou buci de maus. Cumprtorul se rzgndete i nscrie un zero n dreptul
laptopului, deci renun la marf. Apoi selecteaz butonul Schimb coninutul coului.

FIGURA 10.1 Aspectul coului cumprtorului Vernescu Florica

n urmtorul moment se reafieaz coul fr acest laptop.


Acum v ntrebm din nou:
31. Ce se realizeaz n liniile 46 ?
32. De unde i pn unde (ca numr al liniilor) se ntinde blocul while?
33. Ce este RS dar Open?
n cadrul acestui bloc semaforul newQ preia coninutul pq urmat de un numr, care este
identificatorul coului. n semaforul eliminProdus memorm literalul pd, urmat de
identificatorul coului.
Dac newQ este vid sau (OR) este egal cu 0 (linia 48) se elimin acel produs din co.
Altfel (liniile 51-53) rmne s se verifice dac newQ este numeric. Dac este aa,
nseamn c vizitatorul a nscris o nou valoare n dreptul acelui produs, deci schimb
coninutul coului. Cu RS.MoveNext se avanseaz la urmtorul produs din coul id_cos.
n linia 57 se nchide logic tabelul RS. Mai mult chiar, RS preia condiia Nothing, nimic.
Altfel spus, tabelul rezultat dispare de pe ecran.
Din nou v ntrebm:
34. Ce se realizeaz n liniile 68-73, dar n linia 74?
35. Ce condiie se verfic n linia 75?
36. Ce marcheaz acel separator din linia 76?
Costul total valoric al coului se formeaz n variabila totalDePlata; n linia 83 acest
total este iniializat.
n proximul bloc while se urmrete produs cu produs, rubrica numr de buci i se
multiplic cu costul produsului. ntrebare:
37. Care este linia unde se efectueaz o atare operaie?
Dac totalul depete valoarea de 80 milioane (linia 107) se consider c este vorba de
un impostor, deoarece numai un ho cumpr ct mai mult pe banii altuia! Aici este
poate o lips a programului c am recurs la un aa compromis. Nu mai lsm ca acel
client i acel co s se transforme n ordin de plat ca s nenorocim un pltitor de bun
credin! n liniile urmtoare i zicem impostorului ce se va ntmpla n limba german!

FIGURA 10.2 Aspectul coului unui posibil impostor care a profitat de acces la coul
cumprtoarei Vernescu Florica
Emiterea comenzii
Cnd efectum un clic pe butonul Finalizarea comenzii, va intra n aciune fiierul
denumit completarecomanda.asp. ntrebare:
38. Care este linia din programul de mai sus unde se anun c va intra n aciune
programul completarecomanda.asp?
S ne ocupm de lista sa:
LISTA 10.3 Pagina completareComanda.asp

01. <!-- #INCLUDE FILE="functii.asp" -->


02. <%

03. ' Obtin ionfo de login


04. numeclient = TRIM( Request( "numeclient" ) )
05. parola = TRIM( Request( "parola" ) )

06. ' response.write "completarecomanda.asp: nume client = " & numeclient &
"<BR>"
07. ' response.write "completarecomanda.asp: parola sa = " & parola & "<BR>"
08. ' response.end

09. ' Deschid conexiunea logica la BD


10. Set Con = Server.CreateObject( "ADODB.Connection" )
11. Con.Open "sd"
12. idclient = verificparola(numeclient, parola, Con)
13. IF idclient > 0 THEN
14. %>
15. <!-- #INCLUDE FILE="finalcomanda.asp" -->
16. <% ELSE %>
17. <!-- #INCLUDE FILE="login.asp" -->
18. <%
19. END IF
20. %>

Explicaii, parafraze i ntrebri


Nu scpai de ntrebri! Aadar:
39. n care linie se creaz o instan a obiectului Con?
40. Dac exist un client, atunci ce ntoarce verificparola? (indicaie : examinai
pagina functii.asp)
41. Dac idclient este egal cu -1 (funcii.asp), care fiier se va include?
Finalizarea i urmrirea comenzii
Programul care va realiza efectiv finalizarea comenzii este denumit
finalcomanda.asp. i redm mai jos lista:
LISTA 10.4 Pagina finalComanda.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <!-- #INCLUDE FILE="functii.asp" -->

03. <%
04. ' Regasesc informatiile de inregistrare
05. sqlString = "SELECT * FROM clienti " &_
06. "WHERE id_client=" & idClient

07. ' Adauga noua adresa si informatia de plata


08. ' Mai intai care este id-ul clientului

09. SET RS = Con.Execute( sqlString )


10. IF NOT RS.EOF THEN
11. adresaclient = RS( "adresa_client" )
12. codpostalclient = RS( "cod_postal_client" )
13. END IF

14. ' Deschid conexiunea logica la BD


15. Set Con = Server.CreateObject( "ADODB.Connection" )
16. Con.Open "sd"

17. ' Incep o tranzactie


18. Con.BeginTrans

19. ' Transfer datele din tabelul cos in tabelul comenzi


20. sqlString = "INSERT INTO comenzi (" &_
21. "id_comanda, " &_
22. "id_produs_comanda, " &_
23. "cantitate_comanda, " &_
24. "id_client_comanda, " &_
25. "data_intrare_comanda, " &_
26. "stare_comanda " &_
27. ") SELECT " &_
28. "id_cos, " &_
29. "id_produs_cos, " &_
30. "cantitate_cos, " &_
31. "id_client_cos, " &_
32. "NOW(), " &_
33. "0 " &_
34. "FROM cos WHERE " &_
35. "id_client_cos =" & idclient
36. Con.Execute sqlString

37. ' Goleste cosul de cumparaturi fiindca s-a transferat totul in comanda de livrare
38. sqlString = "DELETE FROM cos " &_
39. "WHERE id_client_cos=" & idclient
40. Con.Execute sqlString

41. ' Finalizez tranzactia


42. Con.CommitTrans
43. %>

44. <html>
45. <head><title>Comanda gata de plasare</title></head>
46. <body>
47. <center>
48. <table border=1 width=500 bgcolor="lightyellow" cellpadding="10"
cellspacing="0">
49. <tr>
50. <td><font face="Arial" size="3"><b>Va multumim pentru acceptarea livrarii
produselor!</b><br><form action="index.asp">
51. <input type="submit" value="Mai cumpar"></form>
52. </td>
53. </tr>
54. </table>
55. </body>
56. </html>

Explicaii, parafraze i ntrebri


Cercetm s vedem dac n tabelul clieni exist un client cu numrul din idClient.
42. Care sunt liniile unde se realizeaz acest lucru?
Dac tabelul rezultat RS nu este vid, deci clientul exist, prelum n adresaclient i
codpostalclient valori din coloanele obiectului RS. Privii liniile 11 i 12.
n linia 18 aplicm metoda BeginTrans() din cadrul bibliotecii ADO, Activex Data
Object. Metoda este afiliat obiectului Con, conexiunea logic.
O parantez. Ca s ne ocupm de operaiile cu baze de date, obiectul tip ADO denumit
aici Con, este nsoit de trei metode: una pentru debutul tranzaciei, BeginTrans(), alta
pentru sfritul ei, CommitTrans() i n sfrit a treia, destinat relurii unei tranzacii
neterminate corect (pentru termenul rollback, vezi referina /1/). Este denumit chiar
RollBackTrans(). ncheiem paranteza!
Trimitem apoi coninutul coului posesorului idClient pe de-a-ntregul n alt tabel din
baza mypisi.mdb, cu numele de comenzi. ntrebri:
43. De la ce linie ncepe secvena de transfer a datelor n aceast tabel?
44. Ce realizeaz comanda INSERT i ce cmpuri sunt implicate?
45. Care este criteriul de selecie din aceast comand? Descifrai-i sensul su
semantic?
46. Care linii din codul de mai sus conduc la radierea coului clientului din baza
cos?
Mai avem de tratat dou pagini. Mai nti iat lista paginii plata.asp:
LISTA 10.5 Pagina plata.asp

01. <!-- #INCLUDE FILE="adovbs.inc" -->


02. <!-- #INCLUDE FILE="functii.asp" -->
03. <%

04. ' Informatii de login


05. numeclient = TRIM(Request("numeclient"))
06. parola = TRIM(Request("parola"))

07. ' response.write "numeclient = " & numeclient & "<BR>"


08. ' response.write "parola = " & parola & "<BR>"

09. ' Deschid o conexiune logica la BD


10. Set Con = Server.CreateObject("ADODB.Connection")
11. Con.Open "sd"

12. ' Obtin ID-ul clientului


13. idClient = verificParola(numeclient, parola, Con)
14. ' response.write "idclient = " & idclient & "<BR>"
15. ' response.end

16. IF idClient > 0 THEN


17. %>
18. <!-- #INCLUDE FILE="starecomenzi.asp" -->
19. <% ELSE %>
20. <!-- #INCLUDE FILE="login.asp" -->
21. <%
22. END IF
23. %>

La lista de mai sus parc am fi tentai a v ruga ca s


47. Descifrai singuri!
Am ajuns la ultima pagin a sitului, cea denumit starecomenzi.asp:
LISTA 10.6 Pagina stareComenzi.asp

01. <!-- #INCLUDE FILE="functii.asp" -->


02. <%
03. ' Obtin ID-ul clientului
04. idClient = verificParola(numeclient, parola, Con)
05. ' response.write "idclient = " & idclient & "<BR>"
06. ' response.end

07. IF idclient > 1 THEN


08. sqlString = "Select comenzi.*, nume_produs " &_
09. "from comenzi, produse " &_
10. "WHERE id_produs_comanda=id_produs " &_
11. "AND id_client_comanda=" & idclient & " " &_
12. "ORDER BY data_intrare_comanda DESC"

13. SET RS = Con.Execute( sqlString )


14. %>
15. <html>
16. <head><title>Starea comenzii</title></head>
17. <body>
18. <center>
19. <%
20. IF RS.EOF THEN
21. %>
22. <b>Nu ati lansat nici o comanda</b>
23. <%
24. ELSE
25. %>
26. <table cellpadding="4" cellspacing="0" bgcolor="lightyellow" border="1">
27. <tr>
28. <th>ID comanda</th>
29. <th>Data comanda</th>
30. <th>Nume produs</th>
31. <th>Stare comanda</th>
32. </tr>
33. <%
34. WHILE NOT RS.EOF
35. %>
36. <tr>
37. <td><%=RS( "id_comanda" )%></td>
38. <td><%=RS( "data_intrare_comanda" )%></td>
39. <td><%=RS( "nume_produs" )%></td>
40. <td><%=arataStareComanda( RS( "stare_Comanda" ), RS(
"data_livrare_comanda" ) )%></td>
41. </tr>
42. <%
43. RS.MoveNext
44. WEND
45. %>
46. </table>
47. <%
48. END IF
49. ELSE
50. %>
51. <p><form action="index.asp">
52. <input type="submit" value="Intrati din nou in magazin!">
53. </form>
54. </center>
55. </body>
56. </html>
57. <%
58. end if
59. %>

Explicaii, parafraze i din nou ntrebri


Dac clientul din coninutul variabilor locale numeclient i parola, este gsit n tabelul
clienilor (linia 07), atunci idClient va fi diferit de valoarea -1.
Se va prepara comanda de selectare din dou tabele, comenzi i produse. Din tabelul
produse ne intereseaz coloanele nume_produs i id_produs, iar din tabelul comenzi,
id_client_comanda i id_produs_comanda.
Criteriul de cutare va fi coincidena pe de o parte a identificatorului produsului pentru o
anume comand cu id_produs i totodat i pe de alt aprte a identificatorul clientului
acelei comenzi, id_client_comanda, cu idclient. Ordonarea se face dup data de intrare a
comenzii, data_intrare_comanda.
Cnd nu ntoarce nici un obiect RecordSet (linia 20) se intr prin ramura THEN. n caz
contrar, se parcurge rnd dup rnd, marf dup marf, cu bucla WHILE acest tabel
rezultat. n prealabil se afieaz un antet (liniile 28-31). Funcia arataStareComanda
ntoarce coninutul strii comenzii i data sa de livrare, dup care se reintr n sit.
ntrebare:
47. Care se realizeaz n linia 40 de fapt?

La final de capitol
n acest ultim capitol al tehnologiei ASP ne-am ocupat de :
1. Pagina de baz a prii legate de coul de cumprturi, cosuri.asp.
2. Cum se adaug un produs n coul de cumprturi, adaugCos.asp.
3. Cum este prins un posibil impostor, adaugCos.asp.
4. Cum se emite un ordin de plata de fapt, cum se transmite coninutul coului din
tabelul cos n tabelul comezi, vezi paginile: completarecomanda.asp,
finalcomanda..asp, plata.asp i starecomenzi.asp.
ntrebri i rspunsuri
Nu vom adresa dect ntrebri crora le dm i rspunsurile. Nu vom cere s se scrie un
cod n ASP aa cum am fcut-o de altfel i la tehnologia JSP. Motivaia o cunoatei: am
dorit ca s v facei o idee asupra efortului pe care un programator angajat la firma
dumneavoastr ar primi sarcina dificil de realizare a unui sit comercial.
ntruct au fost destule ntrebri adresate pe parcursul expunerii acestei tehnologii, ne
rezumm aici la un ir restrns de ntrebri. Aadar:

ntrebri
Observaie: Numerotarea lor a nceput din cadrul acestor capitole dedicate prezentrii
tehnologiei ASP.
49. Ce realizeaz comanda SQL de mai jos:
SELECT nume_autor FROM Autori WHERE nume_autor = Eminescu

50. Dar ce realizeaz comanda SQL de mai jos:


SELECT nume_autor FROM Autori WHERE nume_autor LIKE %escu

51. Ce realizm cu comanda urmtoare:


INSERT clienti (nume_client, adresa_client) VALUES (Ionescu, Bucuresti, str.
Cuza Voda nr 123)

52. Ce urmrim s facem n cazul de mai jos


UPDATE Parole SET nume_client = Popescu, parola = gigi_cel_jedy WHERE
nume_client = Ionescu

53. Ce este greit n comanda de mai jos:


INSERT clienti (nume_client, adresa_client) VALUES (Scotts Company,
Bucuresti, str. Cuza Voda nr 123)

54. Comanda terge ntreaga tabel Parole sau nu?


DELETE Parole WHERE parola = top_secret

55. La urma urmei ce este un obiect RecordSet?


56. Explicai ce se realizeaz n secvena de mai jos:
Myfile = page0.asp
IF Myfile = page0.asp THEN
%>
<!-- #INCLUDE FILE = index.asp - - >
<%
END IF
%>
IF Myfile = page1.asp THEN
%>
<!-- #INCLUDE FILE = otherpage.asp - - >
<%
END IF
%>

Rspunsuri doar la aceste ntrebri


49. Selecia nregistrrilor din tabelul Autori dup autorul Eminescu.
50. O selecie a tuturor nregistrrilor cu nume de autori care se termin cu escu.
51. Inserm o nregistrare n tabelul clienti cu valorile care se vd.
52. S modificm n tabelul Parole dou coloane ale sale, nume clientului i parola
sa, doar acolo unde numele clientului este Popescu.
53. Trebuie aa scris:
INSERT clienti (nume_client, adresa_client) VALUES (Scotts Company, Bucuresti,
str. Cuza Voda nr 123)

54. Nu, numai nregistrrile a cror parol este top_secret.


55. Un tabel cu rnduri.
56. Dac variabila myfile conine literalul page0.asp, se ncarc dinamic pagina
page1.asp. n caz contrar, se alege otherpage.asp pentru alipirea dinamic la
pagina din care se face apelul cu secvena de mai sus.
<%
Libelle = Zisei eu Ura!
%>
<form method=post action=pagina.asp>
<input name=ce type=text value=<%=Libelle%>
<input type=submit value=Trimite>
</form>

Corect este aa:


Libelle = Server.HTMLEncode(Zisei eu Ura!)

Introduction1
Le e-commerce
Le progrs technique dans le domaine des circuits intgrs permis de dcliner
les dimensions de lordinateur. Les mainframes taient prioritairement destins
aux centres de calcul territoriaux qui traitaient les donnes pour plusieurs units
conomiques, les mini-ordinateurs taient utiliss comme ordinateurs
dentreprise et les micro-ordinateurs traitaient les donnes dun service ou
bureau. Ont suivi les ordinateurs de bureau (desktop). Ladoption large des
ordinateurs personnels grce aux programmes de bureautique (traitement de
texte, tableur,) a men une certaine dmocratisation de linformatique. Les
simplifications apportes aux ordinateurs personnels et leurs systmes
dopration, ncessaires pour assurer les moindres cots, leur ont apport un
handicap par rapport la protection des donnes, la capacit de travailler
simultanment avec plusieurs utilisateurs (multi-user) ou dexcuter plusieurs
processus en mme temps (multi-tasking).

La monte en puissance de linformatique


La monte en puissance des ordinateurs personnels a permis ladoption au dbut
des annes 1990 du systme Unix par les ordinateurs PC, sous le nom dj
clbre de Linux. Ceci a men la confrontation de deux cultures et philosophies
informatiques diffrentes. Lune qui vient dun monde de linformatique
professionnelle, attentive la scurit de linformation, aux capacits de
communication et favorable aux systmes ouverts, reprsente par Linux ; lautre
qui vient du monde de linformatique utilisateur, commerciale avec des tendances
monopolisatrices reprsente par Windows. Indiffremment de la manire dont
va se solder la confrontation des systmes Linux et Windows, ce qui est retenir
de cette volution, cest que la notion de terminal non-intelligent a disparu et avec
elle aussi la notion dinformatique centralise. Paralllement se sont beaucoup
dveloppes les technologies de rseau dordinateurs et linformatique distribue.
Le modle dordinateur central supposait la concentration des calculs et
traitements de donnes dans lordinateur central qui devait servir de multiples
terminaux passifs, qui ne faisaient rien dautre que de faciliter laffichage et la
saisie de donnes. Avec le remplacement des terminaux par des ordinateurs de
bureau qui disposent dintelligence et de capacits de calcul de plus en plus
importantes, on arrive naturellement une dmocratisation du traitement des
donnes dans le rseau. Le rle dordinateur central disparat et apparaissent un

1
Introducerea la Cours de commerce lctronique predat de domnul prof. Dr. Mihai Calciu,
la Universitatea I Lille. Sunt prezentate doar o parte din capitole. Restul i actualizri se pot
vedea la http://mihai.calciu.free.fr.
ou plusieurs ordinateurs qui jouent le rle de serveurs. En parallle, le rle du
terminal disparat et apparat celui de lordinateur client.
Aujourdhui, le multimdia utilise lordinateur pour intgrer et assurer un accs
interactif pour du contenu statique (textes, images et graphiques) et dynamique
(audio, vido et animations). Lhypermdia combine laccs nud et liens de
lhypertexte avec du contenu multimdia. Le World Wide Web est un cadre de
communication hypermdia bas sur lordinateur et le rseau Internet, qui permet
aux consommateurs et aux firmes de fournir du contenu hypermdia et dy
accder de manire interactive.

Le e-commerce
Le commerce lectronique ou e-commerce est dfini comme tant la vente et
lachat travers les mdias digitaux. Les possibilits visuelles et multimdia et le
caractre intuitif de la navigation de type nud et lien ont dabord rvl
lInternet comme un nouveau canal de distribution pour la vente en dtail. Les
premires applications taient de type boutique lectronique ou magasin on-line.
Elles utilisaient les pages web crites en langage html pour la prsentation de
linformation et des langages de programmation disponibles sur les serveurs.
Le site web o lon peut acheter des biens et des services, nest quune forme de
commerce lectronique. Elle reprsente une faible partie du chiffre daffaires du
secteur. Plus rcemment, le commerce lectronique est pass une vitesse
suprieure. A cot des boutiques lectroniques on-line apparaissent de nouvelles
formes dintermdiation commerciale appeles places de march, qui runissent
de linformation en provenance de multiples offreurs sur Internet. Se dveloppent
aussi les formes dynamiques de commerce comme les enchres, le regroupement
ad-hoc des acheteurs, le troc lectronique et les marchs boursiers.
Pour pouvoir supporter ces nouvelles formes de commerce et le commerce entre
entreprises, il est ncessaire dautomatiser de nombreux changes dinformation.
Cela suppose le transfert dinformation structure dun ordinateur un autre pour
des traitements automatiques. Historiquement, la premire forme de commerce
lectronique a t le magasin on-line ou le shopping cart. Les vendeurs
communiquaient directement avec les consommateurs par lintermdiaire de
leurs sites web en utilisant les mthodes de marketing traditionnelles. Cest la
forme la plus adapte la communication homme-machine. Cette dmarche sest
avre coteuse, spcialement pour les dtaillants. Le nombre grandissant des
sites de vente en ligne et de leurs messages publicitaires inondait les acheteurs et
rendait difficile le choix des fournisseurs.
Avec la difficult grandissante des vendeurs et acheteurs de se retrouver de
manire intuitive et efficace, est apparu le besoin de crer des places de march
on-line. Les places de march sont des intermdiaires dignes de confiance qui ont
comme premire mission dagir en qualit de lieu central de collecte aidant les
acheteurs et les vendeurs se retrouver et faire du commerce de manire
efficace.
La place de march se substitue au besoin de lacheteur deffectuer une seule
transaction avec une seule entit et prend en charge la facturation du client,
lintermdiation des services post-achat, la gestion de retours et dautres
situations. En dautres termes, la place de march devient un marchand de
rfrences qui remplace les diffrents vendeurs. Dans ces conditions, pour assurer
la fluidit dans la collecte et la prsentation de loffre et dans le droulement des
transactions, une forte automatisation des transferts dinformation structure
(documents, formulaires) est ncessaire par la communication de machine
machine, pour faciliter le commerce silencieux . Conus pour servir aussi bien
le commerce de dtail (b-to-c, business to consumer) que celui de gros (b-to-b,
business to business), les lieux de march connaissent une meilleure diffusion et
atteignent des degrs defficience et de rduction des cots, suprieurs dans le
b-to-b.
La typologie des lieux de march quon observe actuellement permet de
distinguer au moins trois catgories : les mga, micro et mta lieux de march.
Les mga places de march ont un caractre horizontal. Elles couvrent un trs
large spectre de catgories de produits et proposent des gammes de produits
plutt larges que profondes. Elles cherchent satisfaire un large spectre de
besoins pour un grand nombre de consommateurs. Les catgories de produits
sont multiples. Dans chaque catgorie, loffre de produits est multiple et provient
dune multitude de producteurs. Les micro places de march sont verticales par
dfaut. Elles apportent loffre la plus grande de produits dans la mme catgorie.
Elles se distinguent par la profondeur de la gamme de produits. Les mta lieux de
march nont pas de correspondant off-line. Ils cherchent offrir des solutions
des problmes la place de catalogues de produits.
Mme sils sont capables long terme de rduire les chanes traditionnelles de
distribution en liminant des intermdiaires, ils se dvelopperont court terme
lintersection des canaux de distribution traditionnels.

Le e-business
Naturellement, les possibilits visuelles et multimdia ont dabord rvl
lInternet comme un nouveau canal de distribution pour la vente en dtail. On
sest vite aperu que les implications taient beaucoup plus larges et que le e-
commerce affectait encore plus profondment les changes entre entreprise (le b-
to-b). En dveloppant leurs interfaces dchange, les entreprises doivent adapter
leurs structures et processus internes, leur back-office, pour faire face aux
exigences de flexibilit, synchronisation et ractivit induites par les nouveaux
mcanismes dchange. Ce qui les amne une refonte de leurs systmes
dinformation dans des systmes de e-business.
Le e-business se dfinit comme lintgration des applications de front et back-
office dans un moteur qui permet de redfinir les modles daffaires et de
maximiser la valeur pour le client. Les systmes dinformation des entreprises ont
subi lombre de lInternet une rvolution silencieuse. On renonce maintenant
aux applications traditionnelles, construites pour rsoudre des problmes
spcifiques lentreprise, souvent avec des ressources maison. Les systmes
modernes sont actuellement constitus autour dun nombre rduit de
composantes nommes applications dentreprise, le plus souvent commerciales.
Les entreprises ressentent de plus en plus la pression de la diffusion des
possibilits de commande en libre-service, du cot excessif des conseils
techniques avant la vente, un cot croissant des erreurs de commande, des
problmes de coordination engendrs par la prolifration des canaux de vente et
la complexit croissante des produits. Elles cherchent augmenter lefficacit de
la force de vente, coordonner les ventes en quipe, faciliter la tche du client, lui
permettre de configurer ou personnaliser loffre.
Les applications de marketing direct permettent, partir des adresses de mener
des campagnes de diffusion de messages promotionnels envers des clients ou
prospects. Lautomatisation du management des campagnes et des processus de
marketing direct facilite la gestion et le dploiement de tels programmes, en
automatisant la gestion des rponses, la segmentation de la clientle et assure des
aspects logistiques des vnements.
La planification de ressources de lentreprise ou ERP (enterprise resource
planning) se trouve au cur de lentreprise, derrire la vente et la gestion de la
relation client et devant lachat et les relations avec les fournisseurs. LERP nest
pas un seul systme mais un cadre qui contient des applications administratives
(finance, comptabilit), de gestion des ressources humaines (salaires, primes),
planification des ressources de fabrication (MRP ou manufacturing resource
planning). LERP est le systme dopration interne de lentreprise, cest la
colonne vertbrale du e-business. Les entreprises qui lont adopt ont vu leurs
stocks et leurs cots se rduire et ont constat une amlioration gnrale de leur
fonctionnement. Le e-commerce favorise la diffusion de lERP.
Lintgration des applications dentreprise ou lEAI (enterprise applications
integration), permet de faire communiquer tout type dapplications, que ce soit
des dveloppements maison ou des progiciels intgrs. LEAI noccupe pas
une position particulire dans le flux de transformation : achat, production, vente.
Dans lindustrie de l'automobile, de grands acteurs comme Ford, General Motors
et plus rcemment Renault, mettent en commun leurs fournisseurs sur une place
de march (e-marketplace). Ces industriels, qui il y a quelques annes
construisaient encore eux-mmes la majeure partie de leurs vhicules, vont
pouvoir se recentrer sur le marketing, la gestion du client ou la distribution, et
proposer ainsi des vhicules mieux adapts aux besoins des usagers.
Droul dans un nouveau cadre concurrentiel caractris par la drgulation et la
globalisation, le processus dintgration inter et intra-entreprises, dtermin par
ladoption des NTIC, modifie de manire substantielle les systmes
dorganisation et dchange des entreprises. On assiste progressivement au
passage de systmes dorganisation hirarchiques, de commande vers des
systmes collaboratifs, de type rseau. Les changes inter et intra entreprises sont
de moins en moins transactionnels et de plus en plus relationnels. Mme sil
sagit dvolutions technologiques normales, on peut considrer lInternet comme
un phnomne clair qui a imprgn ces changements dun esprit ouvert et
humain.
Par le recours aux nouvelles technologies en gnral, et Internet en particulier,
lentreprise grce une information mieux matrise et plus rapidement transmise
ses employs pour leur permettre de prendre plus vite les dcisions les plus
efficaces, peut russir augmenter son chiffre daffaires et en mme temps
diminuer ses cots.
1
Chaptre

Le commerce lectronique et ses


technologies

L objectif du cours est dintroduire aux technologies Internet adapts la


mise en place de solutions de commerce lectronique. Le premier chapitre
propose une introduction au commerce lectronique et la
programmation de pages serveur ASP, PHP et JSP. Seront prsentes les formes du
commerce lectronique et des technologies disponibles pour la cration de sites Web
commerciaux1.
Les trois chapitres suivants (2, 3 et 4) sont un cours acclr d'ASP, PHP et JSP dans le
contexte du commerce lectronique. On tudie la cration de scripts dans les pages
serveur (ASP, PHP ou JSP) permettant d'enregistrer des informations provenant des
clients. On montre galement comment effectuer un suivi de ces informations l'aide de
cookies et de variables de session. Enfin, on montre comment manipuler des fichiers
partir de pages serveur (ASP, PHP ou ASP) La mise en place proprement dite du
magasin en ligne commencera au Chapitre 5, avec la cration de pages permettant de
grer un catalogue de produits. La cration des pages des produits dun magasin en ligne
sera aborde dans le Chapitre 6. Et dans le Chapitre 7 comment permettre au clients
d'effectuer des recherches dans le catalogue de produits. Dans les chapitres 9 et 10 on
construira un panier de courses virtuel (caddie lectronique) en faisant appel des
variables de session et des tables dune base de donnes. Des mises jours des cours
ainsi que dautres supports et application seront disponibles en ligne ladresse
http://mihai.calciu.free.fr .
Une application Web est un site Web qui contient des pages stockes sur un serveur
Web et dont le contenu est partiellement ou totalement indtermin. Le contenu final
d'une page est dtermin uniquement lorsque l'utilisateur requiert une page depuis le

1
Ce support de cours utilise et adapte le texte de S. Walther et J. Levine "E-Commerce,
programmation avec ASP3" (Campus Press, Paris, 2000) dautres technologies (PHP et JSP) qui
sont ouvertes et permettent aux tudiants de mettre en ligne des applications de e-commerce
gratuitement.
serveur Web. Le contenu final d'une page variant d'une requte une autre en fonction
des actions de l'utilisateur, ce type de page est appele page dynamique. Les applications
Web sont construites de manire rpondre diffrents types de dfis et de problmes.
Cette section dcrit les utilisations courantes des applications Web et donne un exemple
simple.
Tout systme interactif doit tre capable de ragir (rpondre) aux inputs (entre ou
requtes) qui lui sont adresses. Les systmes de commerce lectronique nchappent
pas cette exigence. Il est essentiel que le systme soit capable de recevoir des requtes
de la part du client et quil soit capable dafficher des rponses adaptes. Le service web
(le protocol http) intgre les fonctionnalits fondamentales dune telle interaction que la
technologie des pages serveur utilise et dveloppe de manire substantielle. Dans la
majorit des solutions (notamment dans ASP) ces fonctionnalits sont encapsules dans
des objets spcialiss pour la Rponse et la Requte. Dans ce chapitre on traitera les
sujets suivants2: Utilisation de l'objet Response (Rponse) pour envoyer du contenu au
serveur Web. Utilisation de l'objet Request (Requte) pour traiter les chanes de requte
HTML. Utilisation de l'objet Request pour extraire les informations saisies par les
utilisateurs dans des formulaires HTML. Utilisation de l'objet Request pour obtenir les
en-te tes de navigateurs et les variables de serveur. Nous sommes maintenant prts
commencer la mise en place d'un site de commerce lectronique faisant appel des
pages ASP, PHP ou JSP. Ce chapitre vous prsentera les deux objets ASP les lus
importants Response et Request. Ces objets vous permettront d'interagir avec les clients
visitant votre site.

Introduction au commerce lectronique


Dynamique du commerce lctronique

L a croissance exponentielle du Web fait la une de tous les mdias. Il n'est pas
difficile de comprendre pourquoi. Le taux dadoption du commerce
lectronique ne cesse de crotre.
A l'heure actuelle, le commerce lectronique gnre dj un chiffre d'affaires
global plus important que celui de l'aronautique ou des tlcommunications.
eBay, une entreprise fonde il y a moins de cinq ans par quelqu'un qui voulait
simplement trouver Un moyen plus efficace de vendre la collection de distributeurs
de bonbons de sa femme, vient de racheter Butterfield & Butterfield, une maison
de vente aux enchres vieille de 135 ans. Amazon, une entreprise qui n'a, elle aussi,
que cinq ans, vend cinq fois plus de livres en ligne que la plus grande chane
traditionnelle de librairies des Etats-Unis, Barnes and Noble.

2
Ce support de cours utilise et adapte le texte de S. Walther et J. Levine "E-Commerce,
programmation avec ASP3" (Campus Press, Paris, 2000) dautres technologies (PHP et JSP) qui
sont ouvertes et permettent aux tudiants de mettre en ligne des applications de e-commerce
gratuitement.
Evolution des technologies
Il n'y a pas si longtemps, la cration de sites Web, en particulier les sites de
commerce lectronique, tait rserve des programmeurs diplms et
exprimentes. Pour mettre en ligne un magasin lectronique, il tait ncessaire de
matriser la syntaxe complexe de langages tels que le Perl, voire de langages de
programmation de bas niveau tels que le C++.
Heureusement, ont t dveloppes des technologies permettant de crer
rapidement des sites Web commerciaux : l'ASP (Active Server Pages) de
Microsoft, le PHP (Persnal Home Pages)s, CFS (ColdFusion) de Allaire et JSP
(Java Server Pages) de Sun.
Toutes ses solutions supportent des sites de commerce lectronique de grande
envergure. Par exemple Dell.fr ou de Fnac.com (deux sites qui ont recours des
pages ASP).
Dans ce chapitre
Le prsent chapitre est une introduction aux deux sujets de ce cours: le commerce
lectronique et les pages serveur. Nous traiterons les questions suivantes:
Quelles sont les formes du commerce lectronique?
Quelles technologies sont disponibles pour le commerce lectronique?
Que sont les pages ASP, PHP ou JSP?

Formes de commerce Iectronique


B2B, B2C et C2C
Le commerce lectronique est l'achat ou la vente de produits ou de services via un
rseau lectronique ; a l'heure actuelle, le support le plus courant pour ce type de
transaction est Internet.
Il y trois sortes de transactions lectroniques. Premirement, elles peuvent avoir
lieu entre une entreprise et un client (on appelle ce type de commerce lectronique
B2C pour business to consumer) ; c'est ce genre de transaction qui vient en premier
a lesprit lorsqu'on pense au commerce lectronique. Amazon est par exemple une
entreprise "B2C". Amazon permet aux particuliers de trouver et d'acheter tout ce
qui les intresse en matire de livres, de CD, d'lectronique et de vido. Le "B2C"
peut s'appliquer a des services aussi bien qu'a des produits.
Deuxime type de commerce lectronique : celui qui implique des transactions
entre deux entreprises (on dit aussi B2B pour business to business). Ce type de
commerce lectronique est moins mdiatise. Cisco Systems, qui cre une grande
partie de l'infrastructure physique d'Internet permettant aux entreprises de
communiquer est une entreprise "B2B".
Enfin, une forme de commerce lectronique qui a connu un succs important ces
dernires annes est celle qui implique un rapport direct entre consommateurs
finaux (ou C2C, pour consumer to consumer). Les exemples les plus connus de ce
type d'entreprise sont eBay aux Etats-Unis ou iBazar en France. eBay et iBazar
permettent a leurs clients de vendre des objets par des enchres publiques et
prlvent une commission pour chaque objet vendu.
Info
Aux origines du commerce lectronique, il y a l'EDI ou Electronic Data Interchange.
LEDI est une mthode structure de transmission des informations d'un ordinateur a
l'autre. Il a t dvelopp pour permettre aux entreprises d'changer lectroniquement
des documents tels que des factures ou des commandes. LEDI peut galement servir
transmettre d'autres types dinformations il est, par exemple, utilis aux Etats-Unis pour
transfrer des dossiers d'tudiants ou de patients entre diffrents organismes.
Avec la diffusion du web smantique et le passage du HTML au XML les solutions EDI
propritaires et chres pour les PMEs sont remplacs progressivement par des solutions
ouvertes fonctionnant sur Internet.
Plus que du payement lctronique
On considre souvent que l'lment essentiel du commerce lectronique est la
slection d'un produit par le client suivie de son achat au moyen d'une carte
bancaire. Autrement dit, les cartes bancaires seraient la composante essentielle du
commerce lectronique. Ce n'est pas toujours vrai. Supposons par exemple que
vous ts le propritaire d'une (vraie) boutique vendant dlectromnager. Il peut
tre intressant pour vous de mettre en place un site Web faisant office de
catalogue pour tous les produits que vous vendez, mme si vous n'offrez aucun
moyen a vos visiteurs d'acheter vos produits en ligne. L'intrt de votre site Web
sera simplement d'inciter les clients potentiels se rendre dans votre boutique. Il
s'agit la d'une forme tout a fait envisageable de commerce lectronique.
Info
Pour plus d'informations gnrales sur le commerce lectronique, vous pouvez vous
rendre sur le site du ministre franais de l'conomie
(voir http://www.finances.gouv.fr/electrophees/index.htm) ou, pour des informations
plus compltes, mais en anglais, celui du gouvernement des Etats-Unis, a l'adresse
http://www.ecommerce.gov.

Solutions propritaires: exemple les produits


Microsoft pour le commerce lectronique
Presentation des solutions Microsoft
Pour tester ces solutions on part du principe que vous utilisez la fois un serveur
Web Microsoft et un logiciel de base de donnes Microsoft.
Microsoft propose deux serveurs Web le "serveur Web personnel", Personal Web
Server ou PWS, et Internet Information Server, ou IIS.
Vous devrez galement avoir accs une base de donnes, Microsoft Access ou
Microsoft SQL Server au choix. Les pages qui suivent rsument brivement les
diffrences qui existent entre ces logiciels elles indiquent en outre quels autres
outils Microsoft peuvent tre employes pour crer des sites Web commerciaux.
Personal Web Server
Le logiciel Personal Web Server (PWS) peut etre employ de deux manires
diffrentes. IT peut servir hberger un site trs faible trafic (pour partager des
documents sur lintranet d'une entreprise, par exemple). Il peut galement servir A
tester un site avant d'en transfrer le contenu sur Internet Information Server
Il est fortement dconseille d'utiliser PWS pour hberger un "vrais site Web
Internet. PWS ne permet de grer qu'un nombre limite de connexions simultanes.
Internet Information Server
Contrairement PWS, IIS peut prendre en charge des centaines, voire des milliers
de connexions simultanes. Microsoft fait appel IIS pour son propre site
(http://www.microsoft.com) qui est le quatrime le plus visite de tout le Web, avec
environ cinq millions de visiteurs par jour.
IIS ne peut tre utilis que sous Windows NT Server ou Windows 2000 et plus. Il
est inclus avec ces deux systmes d'exploitation.
Info
Si vous avez des projets de site Web trs ambitieux, utilisez IIS avec Windows 2000
Advanced Server. Windows 2000 Advanced Server autorise le clustering de serveurs, ce
qui permet de repartir un site Web sur plusieurs machines.
Access
Pour crer un site Web commercial) vous aurez besoin d'une base de donnes
permettant de stocker les informations relatives aux produits et aux commandes.
Microsoft Access est une base de donnes bureautique et non une base de donnes
client serveur telle que SQL Server (voir ci-dessous). De ce fait, vous ne devez
utiliser Access que pour tester votre site Web ou pour crer un site A faible trafic.
En principe, une base de donnes Access ne peut prendre en charge qu'un
maximum de 30 connexions simultanes.
Une fois que vous avez cre votre site Web l'aide d'Access, vous pouvez le
transformer en base de donnes SQL Server l'aide doutils de migration intgrs
Access 2000.
SQL Server
Microsoft SQL Server peut prendre en charge des milliers de connexions
simultanes et des bases de donnes d'une taille de plusieurs teraoctets. En
pratique, les possibilits de SQL sont largement suffisantes, quelle que soit la taille
du magasin que vous projetez de mettre en ligne. Une grande partie des sites de
commerce lectronique les plus importants du Web font d'ailleurs appel SQL
Server.
Visual lnterDev
Microsoft Visual InterDev est un environnement de dveloppement pour la
cration de sites Web. A la base, il s'agit d'un Editeur de texte trs perfectionn
permettant de crer et de modifier des pages Web sur un serveur local ou distant.
Visual InterDev peut tre employ pour crer des pages ASP ou des pages HTML
"normales".
Visual Interdev est fortement intgr SQL Server. Visual InterDev peut servir
crer et a modifier des tables de bases de donnes et des procdures. Il peut tre
employ avec n'importe quelle base de donnes ODBC ou OLE DB.
Vous n'avez pas besoin de Visual InterDev pour crer des pages ASP. Nimporte
quel diteur de texte standard peut faire l'affaire, par exemple le Bloc-notes ou le
Wordpad, qui sont fournis avec toutes les versions de Windows. Cependant, Visual
lnterDev facilite la gestion des pages dans le cas d'un site important et est fourni
avec plusieurs outils de dbogage.
Info
Il y a dautres produits Microsoft pour la cration de pages Web comme Word ou
FrontPage. Nous ne conseillons pas l'emploi de Word et de FrontPage pour la cration
de sites Web comprenant des pages ASP. Ils ont tendance modifier le code source
d'une page sans prvenir. Autrement dit, il sont susceptible de faire disparatre ou de
rendre inutilisable un script ASP que vous avez pass des heures a crire.

Autres solutions: la formule EasyPHP, les solutions


JAVA et Dreamweaver
Presentation
Il y dautres solutions moins onreuses et contraignantes qui sont quivalentes
ASP. Ici on a retenu celles qui tournent autour des pages serveur PHP et JSP.
Pour tester ces solutions il faut disposer dun serveur Web et un logiciel de base de
donnes. Il serait bien que les services offerts par ces logiciels soit disponibles chez
les hbergeurs de sites web.
Le serveur de pages web Apache
Le serveur web qui domine lInternet est Apache. Approximativement 60% des
sites web publis utilisent ce serveur de pages web. Il est inclus dans la formule
EasyPHP qui est disponible gratuitement sur Internet. Grce sa rapidit et sa
solidit, le serveur web Apache est adopt par beaucoup de fournisseurs daccs
Internet (ISP) comme free.fr.
Le serveur de bases de donnes MySQL
Toutes les applications de commerce electronique reposent sur des serveurs de
bases de donnes. MySQL est un serveur de bases de donnes rput tre un des
plus rapides dans le monde. Grce cette rapidit et sa solidit il t adopt
entre autres par la NASA. Il est aussi inclus dans le package EasyPHP avec un
programme trs puissant (intitul phpMyAdmin.php) qui permet de grer les bases
de donnes en ligne. Laccs une base de donnes MySQL et le service PHP de
gestion de la base de donne en ligne est aussi mis disposition gratuitement.
Lditeur de sites web Dreamweaver
Dreamweaver (version MX6) de Macromdia est peut-tre actuellement le
meilleur diteur de sites web. A part la cration de pages web statiques qui
intgrent les volutions dans la technologie client comme le HTML dynamique (les
calques et le feuilles de style en cascade CSS), le XHTML, le XML, Dreamweaver
dans ses dernires versions couvre aussi la cration dapplications web, laissant le
choix entre les technologies de pages serveur ColdFusion, ASP.NET, ASP, JSP et
PHP. Cette volution de ldition de pages web vers ldition dapplications web
exprime la tendance sur le march et a t possible pour Macromedia grce la
fusion avec la socit Allaire, un expert des solutions cot serveur et propritaire de
la formule ColdFusion.
Dreamweaver est un logiciel commercial. Des versions dessaye qui possdent
toutes les fonctionalits de la version dfinitive et valables pendant plusieurs
semaines peuvent tre tlcharges du site web de Macromedia.
En absence du logiciel Dreamweaver, nimporte quel diteur de texte standard peut
faire l'affaire, par exemple le Bloc-notes ou le Wordpad, qui sont fournis avec
toutes les versions de Windows. Microsoft Word est aussi un trs bon diteur de
pages web statiques, il ne doit pas tre utils pour crer des pages serveur pour les
mmes raisons que celle voques dans le cas de lditeur de pages web Frontpage.

Que sont les pages serveur


Pages statiques et pages dinamiques
Les chapitres qui suivent sont consacrs la cration de sites Web commerciaux a
l'aide de pages serveur.
Une page serveur est un fichier situ sur votre serveur Web et contenant l'extension
.asp, .php ou .jsp. Ces extensions permettent de distinguer les pages serveur d'un
fichier HTML "normal", dont l'extension est .htm ou .html.
Lorsqu'un internaute se rend sur un site Web et demande un fichier HTML normal,
le serveur Web va simplement chercher ce fichier sur le disque dur ou dans la
mmoire (cache) de l'ordinateur et l'envoie au navigateur de l'utilisateur. Le
navigateur interprte le contenu HTML du fichier et l'affiche.
Lorsqu'une requte porte sur une page HTML normale, le serveur Web ne prend
pas en compte le contenu du fichier il se contente d'envoyer le fichier sans le traiter
en aucune faon ; c'est le navigateur de l'utilisateur qui se charge ensuite
d'interprter le contenu du fichier HTML.

Les pages serveur


Lorsqu'une requte porte sur une page serveur en revanche, le serveur Web a un
rle plus actif (et se fait parfois aid par un serveur dapplications). Avant que le
fichier ne soit envoy au navigateur de l'utilisateur, il est d'abord trait par le
serveur Web (ou le serveur dapplications). Le serveur interprte et excute tous les
scripts en ASP, PHP ou JSP d'une page avant de l'envoyer au navigateur de
l'utilisateur.
Ainsi, le Listing 1.1 est une page serveur trs simple qui affiche l'heure courante.
LISTING 1.1: Affichage de l'heure courante par des pages serveur
(.asp, .php ou .jsp)
HEURE.ASP HEURE.PHP HEURE.JSP
01. <HTML> 01. <HTML> 00. <%@ page
02. <HEAD><TITLE>Heure 02. <HEAD><TITLE>Heure import="java.util.*"%>
courante<ITITLE></HE courante<ITITLE></HEAD 01. <HTML>
AD> > 02. <HEAD><TITLE>Heure
03. <BODY> 03. <BODY> courante<ITITLE></HEAD>
04. Void 1'heure courante: 04. Void 1'heure courante: <? 03. <BODY>
<%= TIME() %> print (Date("h:i :s A")); ?> 04. Void 1'heure courante: <%
05. </BODY> 05. </BODY> Calendar now =
06. </HTML> 06. </HTML> Calendar.getInstance(); %>
<%=
now.get(Calendar.HOUR_O
F_DAY)
+":"+now.get(Calendar.MIN
UTE) %>
05. </BODY>
06. </HTML>
Lorsqu'un internaute demande le fichier heure.xxx, le serveur constate qu'il
s'agit d'une page serveur du fait de son extension (.asp, .php ou .jsp). Ainsi,
avant d'envoyer le fichier au navigateur de l'utilisateur, il effectuera un
traitement des scripts contenus dans le fichier.
ASP Analyse
Le texte <%=TIME( )%> de la ligne 04 du fichier heure.asp sera remplac
par lheure courante. Lheure est produite dynamiquement par lordinateur
serveur suite linterprtation du script.
PHP Analyse
Le texte <? print (Date("h:i:s A")); ?> de ligne 04 du fichier heure.php sera
remplac par lheure courante. La fonction PHP date() retourne une date sous
forme d'une chane, au format donn par la chane format
JSP Analyse
Dans heure.jsp le scriptlet <% Calendar now = Calendar.getInstance(); %> cre
un objet de type Calendar nomm now comme nouvelle instance du composant
Calendar (Calendrier). Ensuite dans lexpression <%= now.get
(Calendar.HOUR_OF_DAY ) + ":" + now.get( Calendar.MINUTE ) %> sont
affichs les valeurs des proprits heure et minute de lobjet cre.
Les pages serveur produisent du pur html
Le Listing 1.2 montre le fichier qui sera effectivement envoy au navigateur
Web. Notez qu'il s'agit d'un fichier HTML normal. Tous les scripts sont
traits par le serveur avant que le fichier ne soit envoy l'utilisateur. Les
pages serveur tant traites au niveau du serveur et non au navigateur, elles
sont compatibles avec tous les navigateurs Web.
LISTING 1.2 : Le fichier heure.xxx aprs traitement (xxx reprsente asp, php ou
jsp)
01. <HTML>
02. <HEAD><TITLE>Heure courante<ITITLE></HEAD>
03. <BODY>
04. Voir 1'heure courante : 4.55.36 AM
05. </BODY>
06. </HTML>

Scripts des pages serveur


Avantages des scripts
Les pages serveur contiennent des scripts serveur. ASP utilise Microsoft Visual
Basic Scripting Edition (VBScript) comme langage de script. Cependant une page
ASP peut contenir des scripts crits dans d'autres langages, par exemple en Jscript
(la version Microsoft du JavaScript) ou en PerlScript. PHP utilise des scripts en
langage PHP et JSP utilise le Java.
Les langages de script tels que le VBScript se distinguent des langages de
programmation complets tels que le Visual Basic ou le Java par une syntaxe et des
rgles simplifies. Ainsi, en VBScript, il n'est pas ncessaire de dclarer un type de
donnes particulier pour les variables.
De plus contrairement au Visual Basic ou au Java, une page ASP n'a pas besoin
d'tre compile pour tre excute. Si vous modifiez une page ASP, celle-ci est
automatiquement recompile lors de la prochaine requte.
L'avantage de l'utilisation d'un langage de script lors de la cration de pages Web
est que le site Web reste ainsi facilement modifiable, mme aprs sa mise en ligne.
Si vous dcouvrez un bogue sur votre site Web, il suffit d'ouvrir dans le Bloc-notes
la page ou se trouve le problme et de le corriger.
Richesse des langages complets
Le fait que les pages ASP utilisent un langage de script ne signifie pas qu'elles
soient lentes ou que leur porte soit limite. Les scripts ASP sont excuts dans le
mme process que le serveur Web et font appel au multithreading. De ce fait, une
page ASP peut prendre en compte un grand nombre de connexions simultanes.
JSP arrive au mme fins que ASP en passant par une solution plus lgante et
astucieuse qui permet de profiter de toute la puissance dun langage de
programmation complet comme le Java.

Objets et composants des pages serveur


Intert des objets et composants
Les possibilits des pages serveur seraient trs limites si elles ne pouvaient
contenir que des scripts. Elles pourraient afficher l'heure courante et toutes sortes
de messages, mais elles ne fourniraient aucun moyen d'obtenir des informations
venant de l'utilisateur, de stocker des donnes dans une base de donnes ou de crer
des fichiers sur le serveur. Heureusement, une page ASP peut contenir des
composants serveur.
En gnral, les composants disposent de mthodes, de proprits et de collections.
Les mthodes d'un composant dterminent quelles actions il est possible d'effectuer
avec ce composant. Les proprits d'un composant peuvent tre lues ou modifies
pour dfinir l'tat du composant. Enfin, les collections d'un composant sont des
ensembles de cls et de paires de valeurs associes au composant.
Supposons que un livre soit un composant. Ce composant disposera de mthodes
dterminant ce qu'il est possible de faire avec lui le lire, l'utiliser pour caler une
table ou le dchirer. Il prsentera des proprits poids ou nombre de pages, par
exemple. Enfin, il disposera d'une collection de cls et de paires de valeurs :
chaque numro de page (les cls) y est associe une page de texte (les valeurs).
Exemples dobjets et composants
Les pages ASP comprennent deux types de composants les composants intgrs et
les composants supplmentaires.
Les six composants intgrs des pages ASP sont les suivants:
1. Objet Application reprsente les informations pouvant tre partages entre
tous les utilisateurs d'une application ASP.
2. Objet ObjectContext : est utilise' avec les pages ASP transactionnelles.
3. Objet Request : reprsente toutes les informations envoyes au serveur par
le navigateur, y compris les variables de formulaire et les chanes de
requte.
4. Objet Response : reprsente toutes les informations envoyes au navigateur
par le serveur, y compris le contenu HTML envoy par la page ASP.
5. Objet Server permet de faire appel a diffrentes fonctions du serveur.
6. Objet Session : reprsente les informations concernant une session
utilisateur donne.
Info
La nouvelle version dASP faisant partie de Windows 2000 comprend un objet integr
supplmentaire, ASPError. Cet objet reprsente les informations concernant les erreurs
ayant eu lieu sur une page ASP.

Illustration
Le Listing 1.3 montre par exemple comment utiliser les fonctionnalits des pages
serveur (en ASP lobjet Response) pour afficher le texte "Bonjour !" dans le
navigateur.
LISTING 1.3: Bonjour
BONJOUR.ASP BONJOUR.PHP BONJOUR.JSP
01. <HTML> 01. <HTML> 01. <HTML>
02. <HEAD><TITLE>Bonjour 02. <HEAD><TITLE>Bonjour 02. <HEAD><TITLE>Bonjour</
</TITLE> </HEAD> </TITLE> </HEAD> TITLE> </HEAD> <BODY>
<BODY> <BODY> 03. <%= "Bonjour! %>
03. <% Response.Write 03. <? print "Bonjour! ?> 04. </BODY>
"Bonjour! %> 04. </BODY> 05. </HTML>
04. </BODY> 05. </HTML>
05. </HTML>
Divers composants supplmentaires sont fournis avec ASP. Voici ceux que vous
utiliserez sans doute le plus couramment:
Ad Rotator. Ce composant sert afficher des bannires publicitaires sur un site
Web. Il permet de spcifier avec quelle frquence chaque bannire sera affiche.
Browser Capabilities. Ce composant permet de renvoyer un code HTML diffrent
en fonction des possibilits du navigateur. Il servira par exemple envoyer des
pages avec des frames uniquement aux navigateurs prenant en charge cette
fonction.
Content Linking. Ce composant permet de relier plusieurs pages HTML entre
elles pour y faciliter la navigation. Il servira par exemple a relier entre elles les
pages d'un livre en ligne.
File Access. Ce composant permet de travailler avec le systme de fichiers de
l'ordinateur, pour ouvrir et enregistrer des fichiers texte, par exemple.
Contrairement aux composants intgrs, avant de pouvoir utiliser un composant
supplmentaire, il faut en crer une instance. La page ASP du Listing 1.4 cre une
instance du composant AdRotator et affiche une bannire publicitaire.
LISTING 1.4: Utilisation du composant Ad Rotator
<HTML>
<HEAD><TITLE>Banni&egrave;re publicitaire</TITLE></HEAD> <BODY>
<% Set LaPub = Server.CreateObject("MSWC.Adrotator") %>
<CENTER><%=LaPub.GetAdvertisernent("adrot.txt" )%></CENTER> </BODY>
</HTML>
ASP-Analyse
Les script ASP cre un objet de type AdRotator nom LaPub, qui ensuite
affiche les banires dans lordre indiqu dans le fichier adrot.txt
On observe que lutilisation du composant AdRotator en ASP ressemble
beaucoup avec lutilisation du composant Calendar dans heure.jsp dans le
listing 1.1.
Info
Quelle est Ia diffrence entre un composant et un objet? Un objet est une instance d'un
composant. Les objets ASP intgrs sont nomms objets et non composants parce qu'ils
sont cres de manire implicite.
En JSP et aussi en Java la place de composant on parle de classe ou de JavaBean.
Vous n'tes pas oblig de vous contenter des composants livrs avec ASP. Il
existe des centaines de composants cres par diffrents diteurs de logiciels que
vous pouvez inclure dans vos scripts. Les composants vous serviront par
exemple a envoyer des fichiers de l'utilisateur vers le serveur a transfrer des
fichiers entre serveurs on envoyer et recevoir du courrier lectronique. Vous
pouvez galement crer vos propres composants l'aide de langages tels que
Visual Basic, le C++ ou le Java.

Conclusion
Les pages serveur et laccs aux bases de donnes
ASP comprend un ensemble particulier d'objets qui mritent une description
spare: les objets de donnes ActiveX (ActiveX Data Objects, ou ADO). Les
objets ADO permettent d'accder a une base de donnes partir dune page ASP.
Les objets ADO peuvent tre employs pour insrer, modifier et supprimer des
lignes dans le tables des bases de donnes. Ils peuvent galement servir extraire
un ensemble d'enregistrements partir d'une requte et afficher ces
enregistrements dans une page ASP
Dans ce cours, vous verrez comment utiliser les objets ADO pour stocker et
extraire des donnes dans des bases de donnes Access et SQL Server. Cependant,
les objets ADO peuvent tre utilises avec n'importe quelle base de donnes ODBC
o OLE DB, et en particulier les bases de donnes Oracle, Sybase, Informix, DB2
et Ingres.
En PHP il y des fonctions adaptes chaque serveur de bases de donnes qui
assurent les traitement voqus. En JSP il y plthore de composants Java qui
assurent ces fonctionalits.
En rsum
Ce chapitre a introduit les deux principaux sujets de ce cours: Le commerce
lectronique et les pages serveur. Dans la premire partie de ce chapitre, nous
avons voqu la croissance rapide du commerce lectronique et les diffrentes
formes qu'il pouvait prendre.
Dans la seconde partie, nous avons parl des technologies Microsoft et non-
Microsoft permettant de crer des sites Web commerciaux.
La troisime partie, enfin, tait consacre aux pages serveur. Nous y avons vu en
quoi une page serveur diffrait d'une page HTML normale et qu'elle pouvait faire
appel a des scripts, des objets, des composants et, pour accder des bases de
donnes, des objets spcialiss daccs aux donnes.
Questions Rponses
Q Quelles sont les limitations des pages ASP? Peuvent-elles servir crer
n'importe quel type de site Web commercial?
R Comme vous lavez vu dans ce chapitre, les pages ASP sont actuellement
utilises sur certains des sites les plus importants et les plus visits du Web. Ainsi,
Dell vend quotidiennement pour plus de 20 millions d'euros de matriel
informatique via ses sites, qui font appel IIS et aux pages ASP.
La technologie ASP est trs polyvalente. S'il y manque une fonction, elle peut tre
ajoute par 1'intermdiaire de composants personnaliss.
Q Quels systmes d'exploitation sont compatibles avec ASP?
R Lcs pages ASP fonctionnent en natif sons Microsoft NT 4.0, sons Microsoft NT
Workstation 4.0 avec Peer Web Services et sous Windows 95, 98 avec Personal
Web Server
Avec Chili!ASP de Chili!Soft (http://www.chilisoft.com), les pages ASP peuvent
egalement fonctionner sous Solaris SUN et AIX IBM. Chili!ASP permet aux pages
ASP de fonctionner sur les serveurs Apache, Netscape Enterprise, FastTrack, Lotus
Domino Go et Website Pro de O'Reilly.
Il existe une version de Personal Web Server et des pages ASP, mais celle-ci n'est
malheureusement plus prise en charge par Microsoft.
Testez vos connaissances
1. Quelles sont les trois formes de commerce lectronique ?
2. Personal Web Server pent-il tre employ pour un site Web commercial
recevant des milliers de visiteurs par jour ?
3. Access peut-il tre employ pour un site Web commercial recevant des milliers
de visiteurs par jour ?
4. Est-il ncessaire d'utiliser Visual InterDev pour crer des pages ASP ?
5. Comment le serveur Web distingue-t-il une page ASP d'une page HTML
normale?
6. Les pages ASP sont-elles compatibles avec tous les navigateurs Web ?
7. Est-il possible de crer des scripts ASP en utilisant un autre langage que le
VBScript?
2
Chaptre

Comprendre les applications Web 1


Utilisations courantes des applications Web
Prsentation
Les applications Web peuvent tre utilises de diverses faons par les utilisateurs et les
dveloppeurs, notamment pour :
Permettre aux utilisateurs de trouver rapidement et facilement des informations sur
un site Web riche en contenu.
Ce type d'applications Web permet aux utilisateurs de rechercher, d'organiser et de
parcourir le contenu leur convenance. Les exemples incluent des rseaux intranet
d'entreprises, tels Microsoft MSDN et Amazon.com.
Collecter, enregistrer et analyser des donnes fournies par les utilisateurs.
Auparavant, les donnes saisies dans des formulaires HTML taient envoyes sous
forme de messages lectroniques aux employs ou sous forme d'applications CGI pour
le traitement. Une application Web peut enregistrer les donnes d'un formulaire
directement dans une base de donnes et crer des rapports Web pour l'analyse. Les
exemples incluent des pages de banques en ligne, de contrle des stocks, des sondages
et des formulaires de commentaires.
Mettre jour des sites Web dont le contenu change souvent.
Une application Web vite au crateur d'avoir mettre frquemment jour le
code HTML du site. Les fournisseurs de contenu tels que les rdacteurs en chef
alimentent l'application Web et celle-ci met automatiquement le site jour, comme par
exemple The Economist et CNN.

1
Adapt du systme daide du logiciel ddition de sites Web Dreamweaver MX.
Exemple d'application Web
Prsentation
Vincent, professionnel de la cration Web, utilise Dreamweaver depuis de nombreuses
annes. Il est charg de la maintenance des sites intranet et Internet d'une entreprise de
taille moyenne comptant 1000 employs. Le responsable du service marketing, lui
soumet un jour un problme. Pour mieux cibler la clientle son service aurait besoin de
la date de naissance des clients. Malgr le faite que lentre dans le site web commercial
de la socit passe par un formulaire denregistrement qui prvoit optionnellement la
date de naissance, on constate que les client ne remplissent pas ces informations. Le
responsable marketing suggre quil faut trouver des astuces pour inciter les clients de
saisir leur date de naissance.
Vincent propose entre autre doffrir aux clients qui enregistrent leur date de naissance
loccasion de connatre toute instant leur biorythme2.
Cahier des charges de lapplication
Cette application Web excutera les tches suivantes :
Permettre aux clients de saisir leur login sur une page Web au moyen d'un
simple formulaire HTML
Stocker la date de naissance des clients dans une base de donnes
Calculer les biorythmes pour le mois courant en fonction de la date de
naissance
Permettre aux clients de suivre leurs prvisions de forme (biorythmes) au fil du
temps
Permettre au responsable marketing d'accder la liste des clients enrichie avec
les dates de naissance.
Vincent met rapidement en place l'application l'aide de Dreamweaver MX, logiciel
dot des outils ncessaires la cration rapide et facile de ce type d'applications.

Fonctionnement d'une application Web


Prsentation
Une application Web est un ensemble de pages ordinaires et dynamiques. Une page
ordinaire n'est pas modifie lorsqu'un utilisateur la consulte : le serveur Web transmet la

2
Les biorythmes sont des cycles ou des rythmes nergtiques de la vie quenregistrent les individus
depuis leur naissance, qui se rptent avec une certaine priodicit (tous les 23 jours pour le
biorythme physique, tous les 28 jours pour le biorythme intellectuel et tous les 33 jours pour le
biorythme affectif) et qui ont connu une certaine vogue et reconnaissance scientifique, mais qui
actuellement relvent plus de lastrologie. Pour une illustration on peut consulter ladresse Internet
http://www.astro.qc.ca/biorythme/.
page au navigateur qui la sollicite sans la modifier. A l'inverse, une page Web
dynamique est modifie par le serveur avant d'tre transmise au navigateur qui la
sollicite. C'est pourquoi cette page est dite dynamique.
Vous pouvez par exemple crer une page pour afficher les rsultats du programme de
mise en forme et faire en sorte que certaines informations (telles le nom et les rsultats
de l'employ) soient dtermines lorsqu'une page est sollicite par un employ.

Traitement des pages Web ordinaires


Prsentation
Un site Web ordinaire comprend un jeu de pages et de fichiers HTML associs hbergs
sur un ordinateur excutant un serveur Web.
Un serveur Web est un logiciel qui fournit des pages Web en rponse des requtes de
navigateurs Web. Une requte de page est gnre lorsqu'un utilisateur clique sur un lien
d'une page Web, choisit un signet dans le navigateur ou saisit une URL dans le champ
Adresse du navigateur et clique sur OK.
Le contenu final d'une page Web est dtermin par le crateur de la page et n'est pas
modifi lorsqu'un utilisateur la sollicite.
Example
<html>
<head>
<title>Appeler le Department</title>
</head>
<body>
<strong>Appler le Department</strong><br>
Parler quelquun du dpartement Marketing.
</body>
</html>

Chaque ligne du code HTML de la page est rdige par le crateur avant que la page ne
soit place sur le serveur. Ce code HTML n'tant pas modifi une fois la page sur le
serveur, cette page est dite statique.
Pages statiques et dynamiques
Remarque : au sens strict du terme, une page dite statique peut ne pas tre statique
du tout. Une image survole ou une animation Flash, par exemple, peuvent animer une
page statique. Cependant, ce systme d'aide qualifie une page de statique si elle est
adresse au navigateur sans modifications.
Processus de traitement des pages Web ordinaires
Lorsqu'un serveur Web reoit une requte de page statique, il lit la requte, localise la
page et la transmet au navigateur qui l'a sollicite, tel qu'indiqu dans la figure
ci-dessous :
FIGURE 1 Processus de traitement des pages Web ordinaires

Source: Systme daide de Dreamweaver


Figure 2. Processus de traitement des pages dynamiques

Source: Systme daide de Dreamweaver


Dans le cas des applications Web, certaines lignes de code ne sont pas dtermines au
moment o l'utilisateur sollicite la page. Ces lignes doivent tre dtermines via un
mcanisme avant que la page ne soit transmise au navigateur. Ce mcanisme est
prsent dans la section suivante.

Traitement des pages dynamiques


Prsentation
Lorsqu'un serveur Web reoit une requte de page Web ordinaire, il transmet
simplement cette page au navigateur requrant. Le serveur Web ragit diffremment
lorsqu'il reoit une requte de page dynamique : il transmet cette page une extension
logicielle spciale charge d'achever la page. Ce logiciel spcial est appel serveur
d'application. Le serveur d'application lit le code de la page, termine cette page en
fonction des instructions figurant dans le code, puis en retire le code.
Il en rsulte une page statique que le serveur d'application renvoie au serveur Web,
lequel transmet alors cette page au navigateur requrant. Le navigateur reoit
uniquement du code HTML pur lorsque la page lui est transmise.
Accs une base de donnes
Prsentation
Un serveur d'application vous permet de travailler avec des ressources ct serveur
telles que les bases de donnes. Une page dynamique peut, par exemple, ordonner au
serveur d'application d'extraire des donnes de la base de donnes et de les insrer dans
le code HTML de la page.
L'instruction d'extraction des donnes de la base est nomme requte de base de
donnes. Une requte est compose de critres de recherche rdigs dans un langage de
base de donnes appel SQL (Structured Query Language). La requte SQL est rdige
dans les scripts ou les balises ct serveur de la page.
Le pilote de base de donnes
Un serveur d'application ne peut pas communiquer directement avec une base de
donnes car le format propritaire de cette dernire rend les donnes indchiffrables, de
la mme manire qu'un document Word ouvert dans Bloc-notes est indchiffrable. Le
serveur d'application peut communiquer uniquement via un pilote de base de donnes.
Un pilote de base de donnes est un logiciel qui agit comme un interprte entre le
serveur d'application et la base de donnes.
Les requtes SQL et les jeux denregistrements
Une fois que le pilote a tabli la communication, la requte est excute par rapport la
base de donnes et un jeu d'enregistrements est cr. Un jeu d'enregistrements est un
sous-ensemble de donnes extraites d'une ou de plusieurs tables de base de donnes. Le
jeu d'enregistrements est renvoy au serveur d'application et les donnes sont utilises
dans la page dynamique. Voici un exemple simple de requte de base de donnes
rdige en SQL :
SELECT nom, prenom, annee FROM clients
Cette instruction cre un jeu d'enregistrements trois colonnes et le remplit de lignes
comportant le nom, le prnom et les points de mise en forme de tous les employs de la
base de donnes.
Processus de traitement des pages dynamiques avec accs une base de donnes
Voici une illustration du processus d'interrogation de la base de donnes via des requtes
et de la transmission des donnes au navigateur :
Figure 3. - Processus de traitement des pages dynamiques
avec accs une base de donnes

Source: Systme daide de Dreamweaver


Choix du serveur de bases de donnes
Vous pouvez utiliser pratiquement toutes les bases de donnes avec votre application
Web, si vous possdez les pilotes de base de donnes requis.
Si vous prvoyez de crer de petites applications peu onreuses, vous pouvez utiliser
une base de donnes fichier, cre par exemple sous Microsoft Access. Si vous
prvoyez de crer des applications stratgiques robustes, vous pouvez utiliser une base
de donnes serveur, cre par exemple avec Microsoft SQL Server, Oracle 9i ou
MySQL.
Si votre base de donnes rside sur un systme autre que votre serveur Web, assurez-
vous qu'il existe une connexion rapide entre les deux systmes pour un fonctionnement
efficace et rapide de votre application Web.
Cration de pages dynamiques
Utilisation des langages de programmation intgrs
La cration d'une page dynamique consiste crire d'abord le code HTML, puis
ajouter les scripts et les balises ct serveur au code HTML pour rendre la page
dynamique. Lorsque vous visualisez le code obtenu, le langage apparat incorpor dans
le code HTML de la page. Par consquent, ces langages sont appels langages de
programmation HTML intgrs.
Exemple dinstructions de programmation
L'exemple ci-dessous utilise le code JSP (Java Server Pages) :
<html>
<body>
<b>Appeler le Department</b><br>
<% departement="Marketing"%>
Parler quelquun du <%= departement %>.
</body>
</html>

Les instructions incorpores dans cette page excutent les actions suivantes :
1. Cration d'une variable appele departement et assignation de la chane
Marketing cette variable.
2. Ecriture de la valeur de la chane de la variable, Marketing , dans le
code HTML.
Rsultats renvoys par le serveur dapplications
Le serveur d'application renvoie la page suivante au serveur Web :
<html>
<body>
<b>Appeler le Department</b><br>
Parler quelquun du Marketing.
</body>
</html>

Le serveur Web transmet la page au navigateur requrant, lequel l'affiche de la manire


suivante :
Appeler le Department
Parler quelquun du Marketing.
Quelques technologies
Le langage de script ou de balise utilis dpend de la technologie du serveur. Les
langages les plus employs pour les cinq technologies de serveur prises en charge par
Dreamweaver MX sont :
TABLEAU 1. Les technologie serveur supports par Dreamweaver

Technologie de serveur Langage

ColdFusion CFML (ColdFusion Markup Language)

ASP.NET Visual Basic


C#

Pages ASP (Active Server Pages) VBScript


JavaScript

JSP (JavaServer Pages) Java

PHP PHP
Source : les systme daide de Dreamweaver

Dreamweaver peut rdiger les scripts ou les balises ct serveur ncessaires au


fonctionnement de vos pages, mais vous pouvez aussi les crire manuellement dans
l'environnement de codage Dreamweaver.

Choix d'une technologie de serveur


Choix par rapport au langage de script matris
Vous pouvez utiliser Dreamweaver MX pour crer des applications Web l'aide de cinq
technologies de serveur : ColdFusion, ASP.NET, ASP, JSP ou PHP. Chacune de ces
technologies correspond un type de document dans Dreamweaver. Le choix de l'une
de vos applications Web repose sur plusieurs facteurs, notamment votre niveau de
connaissance des diffrents langages de script et le serveur d'application que vous
envisagez d'utiliser.
Si vous n'avez jamais cr d'applications Web ou d'applications en gnral, vous
prfrerez srement utiliser ColdFusion en raison de son environnement de script
serveur convivial intgr Dreamweaver. Dreamweaver prend galement en charge
d'autres technologies de serveur, telles que JSP, PHP, ASP ou ASP.NET.
Choix par rapport au serveur
Votre choix de technologie de serveur dpend galement du serveur d'application que
vous souhaitez utiliser pour votre application Web. Un serveur d'application est un
logiciel qui aide un serveur Web traiter des pages Web contenant des scripts ou des
balises ct serveur. Par exemple, si vous disposez de ColdFusion MX, vous pouvez
choisir ColdFusion comme technologie de serveur. Si vous avez accs au serveur
Microsoft Internet Information Server 5 (IIS) avec la plate-forme .NET, vous pouvez
choisir ASP.NET. Faites appel PHP si vous avez accs un serveur Web avec un
serveur d'application PHP ; JSP peut galement convenir si vous pouvez accder un
serveur Web avec un serveur d'application JSP, tel que Macromedia JRun.
Ressources pour les technologies de pages serveur
Vous trouverez une version de ColdFusion MX destine aux dveloppeurs sur
le CD Dreamweaver MX (version Windows uniquement) et sur le site Web de
Macromedia.
Pour plus d'informations sur les serveurs d'application, voir Configuration d'un
serveur d'application.
Pour en savoir plus sur ColdFusion, consultez la documentation ColdFusion
dans Dreamweaver (Aide > Utilisation de ColdFusion) ou visitez le site Web
de Macromedia (http://www.macromedia.com/fr/software/coldfusion/)
Pour en savoir plus sur ASP.NET, visitez le site Web Microsoft (http://asp.net/
- en anglais).
Pour en savoir plus sur ASP, visitez le site Web Microsoft
(http://msdn.microsoft.com/library/default.asp?URL=/library/psdk/iisref/aspgui
de.htm - en anglais).
Pour en savoir plus sur JSP, visitez le site Web de Sun
(http://java.sun.com/products/jsp/ - en anglais).
Pour en savoir plus sur PHP, visitez le site Web de PHP (http://www.php.net/ -
en anglais).

Configurer Dreamweaver pour ASP, PHP et JSP


Prsentation
Pour construire des applications web avec Dreamweaver, il y quelques logiciels
serveurs installer et quelques instructions de configuration suivre.
Prrequis en terme de logiciels serveurs
Pour pouvoir tester les applications en local (sur le mme ordinateur) avant de les
publier sur un ordinateur distant, on doit sassurer que des logiciels adapts: serveurs de
pages web et/ou dapplications web, ainsi que des serveurs de bases de donnes sont
installs et fonctionnent sur lordinateur local.
ASP
Les serveurs de pages et dapplications web de type ASP sont Microsoft IIS,
fourni avec Windows NT Server, Windows 2000 et Windows XP Professionnel.
Microsoft ; PWS, version rduite de IIS fonctionnant sous Windows 98 et NT
Workstation et Sun Chili!Soft ASP, dont il existe une version pour Windows,
Linux, Solaris et d'autres plates-formes.
Les serveurs de bases de donnes ne sont pas fournis avec Windows mais doivent
tre installs sparment. Des serveurs de bases de donnes usuels sous Windows
sont Acces, Oracle ou SQL Server.
JSP
Des serveurs dapplication adapts sont Apache Tomcat (gratuit), IBM
Websphere, Macromedia Jrun, BEA Weblogic. Tomcat sinstalle facilement en
tandem avec le serveur de pages web Apache qui est disponible dans la formule
freeware EasyPHP. Comme serveur de base de donnes on peut utiliser MySQL
qui est galement disponible dans EasyPHP.
PHP
Dans la solution EasyPHP serveur d'application PHP est intgr au serveur de
pages web Apache par le module mod_php. Et les serveur de bases de donnes
MySQL fait aussi partie de lensemble.
Dfinition dune application web en Dreamweaver
La dfinition d'un site Dreamweaver pour l'application Web se droule en trois
tapes :
1. Dfinition d'un dossier situ sur le disque dur comme dossier local
Dreamweaver dans lequel seront stockes les copies de travail des fichiers du
site (voir Dfinition d'un dossier local).
2. Dfinition d'un dossier situ sur l'ordinateur excutant le serveur Web comme
dossier distant Dreamweaver (voir Dfinition d'un dossier distant).
3. Dfinition de l'emplacement vers lequel Dreamweaver doit transfrer les pages
dynamiques devant tre traites pendant la procdure de cration du site (voir
Dfinition du dossier de traitement des pages dynamiques).
Pour accder la boite de dialogue de dfinition dun site choisissez dans le menu de
Dreamweaver : Site> Nouveau site pour crer un site nouveau ou Modifier les sites pour
changer la dfinition dun site existant. Puis quand la bote de dialogue Dfinition du
site s'ouvre si l'assistant s'affiche, cliquez sur Avanc.
Exemples de configurations JSP, ASP et PHP
Voici titre dexemple la dfinition des versions ASP, JSP et PHP du site qui contient
les exemples de ce cours, intitul cours_comelec:
TABLEAU 2 Dfinition dune application web en utilisant les technologies ASP,
JSP et PHP

Type dapplication web PHP JSP ASP


Infos locales
Nom du site cours_comelec_php cours_comelec_jsp cours_comelec_asp
Dossier racine D:\Program D:\Program D:\MesDocuments\com
Files\EasyPHP\www\c Files\Apache Tomcat elec_asp\_asp\
ours_comelec 4.0\webapps\tomcat-
docs\appdev\comelec_j
sp\web\
http du site http://localhost/cours_c http://localhost:8080/co D:\MesDocuments\com
omelec/ urs_comelec/ elec_asp\
Infos distantes
Accs FTP FTP *
Hte FTP ftpperso.free.fr claree.univ-lille1.fr -
Rpertoire du hte ./cours_comelec /opt/tomcat/webapps/co -
urs_comelec/
Nom dutilisateur mihai.calciu calciu -
Mot de passe ******** ******** -
Serveur dvaluation
Modle serveur PHP MySQL JSP ASP VBscript
Accs Local/Rseau Local/Rseau Local/Rseau
Dossier du serveur D:\Program D:\Program D:\MesDocuments\com
dvaluation Files\EasyPHP\www\c Files\Apache Tomcat elec_asp\_asp\
ours_comelec 4.0\webapps\cours_co
melec
Prfixe URL http://localhost/cours_c http://claree.univ- http://localhost/comelec
omelec/ lille1.fr/cours_comelec/ _asp/
* En absence dun hbergeur pour la version ASP ce site fonctionne seulement en locale

Termes frquemment utiliss


Un glossaire
Cette section rpertorie les termes frquemment employs.
Un serveur d'application est un logiciel qui aide un serveur Web traiter des pages Web
contenant des scripts ou des balises ct serveur. Lorsqu'une page de ce type est requise
par le serveur, le serveur Web transmet cette page au serveur d'application afin qu'il la
traite avant de l'envoyer au navigateur.
Les serveurs d'application les plus utiliss sont Macromedia ColdFusion, Macromedia
JRun Server, la plate-forme .NET de Microsoft, IBM WebSphere et Apache Tomcat.
Une base de donnes est un ensemble de donnes stockes sous forme de tables.
Chaque ligne d'une table correspond un enregistrement de donnes et chaque colonne
correspond un champ de l'enregistrement, tel qu'illustr ci-dessous.
Un pilote de base de donnes est un logiciel qui agit comme un interprte entre un
serveur d'application et une base de donnes. Les donnes d'une base de donnes sont
stockes dans un format
propritaire. Un pilote de base de
donnes permet l'application Web
de lire et de manipuler des donnes
qui, sans cela, seraient
indchiffrables.
Un systme de gestion de base de
donnes (SGBD ou systme de base
de donnes) est un logiciel utilis
pour crer et manipuler des bases de
donnes. Les systmes de base de
donnes les plus courants sont
Microsoft Access, Oracle 9i et
MySQL.

Une requte de base de donnes dsigne l'opration permettant d'extraire un jeu


d'enregistrements d'une base de donnes. Une requte est constitue de critres de
recherche exprims en langage de base de donnes appel SQL. La requte peut, par
exemple, spcifier que seules certaines colonnes ou certains enregistrements doivent tre
inclus dans le jeu d'enregistrements.
Une page dynamique est une page Web
qui est personnalise lors de son excution
par un serveur d'application et cela avant
que la page ne soit transmise un
navigateur.
Un jeu d'enregistrements est un sous-
ensemble de donnes extraites d'une ou
plusieurs tables d'une base de donnes, tel
qu'illustr ci-dessous :
Une base de donnes relationnelle est une base de donnes contenant plusieurs tables
qui partagent des donnes. La base de donnes suivante est relationnelle car deux tables
partagent la colonne DepartmentID.
Une technologie de serveur est une technologie utilise par un serveur d'application
pour modifier des pages dynamiques lors de l'excution.
L'environnement de dveloppement Dreamweaver MX prend en charge les
technologies de serveur suivantes :
Macromedia ColdFusion
Microsoft ASP.NET
Pages ASP (Active Server Pages) de Microsoft
Pages JSP (JavaServer Pages) de Sun
PHP (PHP Hypertext Preprocessor)
Vous pouvez galement utiliser l'environnement de codage de Dreamweaver pour
dvelopper des pages destines une technologie de serveur quelconque non rpertorie
ci-dessus.
Une page statique est une page Web qui n'est pas modifie lors de son excution par un
serveur d'application avant que la page ne soit envoye un navigateur.
Une application Web est un site Web qui contient des pages stockes sur un serveur
Web et dont le contenu est partiellement ou totalement indtermin. Le contenu final de
ces pages est dtermin uniquement lorsque l'utilisateur requiert une page depuis le
serveur Web. Le contenu final d'une page variant d'une requte une autre en fonction
des actions de l'utilisateur, ce type de page est appele page dynamique.
Un serveur Web est un logiciel qui fournit des pages Web en rponse des requtes de
navigateurs Web. Une requte de page est gnre lorsqu'un utilisateur clique sur un lien
d'une page Web, choisit un signet dans le navigateur ou saisit une URL dans le champ
Adresse du navigateur et clique sur OK.
Les serveurs Web les plus courants sont Microsoft Internet Information Server,
Microsoft Personal Web Server, Apache HTTP Server, Netscape Enterprise Server et
iPlanet Web Server.
ANNEXE - Cration de lapplication biorythme avec
Dreamweaver
Cahier des charges de lapplication
Lapplication biorythme dcrite en dbut du chapitre devra excuter les tches
suivantes :
Permettre aux clients de saisir leur login sur une page Web au moyen d'un
simple formulaire HTML
Stocker la date de naissance des clients dans une base de donnes
Calculer les biorythmes pour le mois courant en fonction de la date de
naissance
Permettre aux clients de suivre leurs prvisions de forme (biorythmes) au fil du
temps
Permettre au responsable marketing d'accder la liste des clients enrichie avec
les dates de naissance.
Adaptation du cahier de charges la technologie utilise
Connaissant ces exigences et les possibilits de Dreamweaver les taches peuvent tre
mieux prciss et ordonnes de la manire suivante:Crer une base de donnes avec une
table biorythme_clients dans laquelle seront stockes les informations client (login, mot
de passe, nom et prnom, mail, date de naissance)
Crer un formulaire HTML pour permettre aux clients de senregistrer dans la
base de donnes en saisissant leurs donnes personnelles.
Permettre au responsable marketing d'accder la liste des clients enrichie avec
les dates de naissance.
Calculer les biorythmes pour le mois courant en fonction de la date de
naissance
Permettre aux clients de suivre leurs prvisions de forme (biorythmes) au fil du
temps

Cration de la table clients dans la base de


donnes
Gestion de la base de donnes en ligne
Chaque serveur de bases de donnes est second par un logiciel dadministration qui
souvent permet de crer et de grer la base de donnes en ligne sur le web. Free.fr utilise
et met la disposition de chaque abonn le logiciel phpMyAdmin qui est aussi inclus
dans le paquet EasyPHP.
Pour crer la table clients dans la base de donnes dont on dispose, on se connecte avec
un navigateur web au service dadministration de la base (pour ladministration distante
sur free.fr on va utiliser ladresse http://sql.free.fr et pour ladministration locale sur
notre ordinateur on va utiliser ladresse http://localhost/mysql/).
Si on travaille sur le serveur de bases de donnes local on slectionne la base de donnes
de lapplication biorythme. Si on travaille sur le serveur de bases de donnes distant de
free.fr on ne contrle quune seule base et elle est prslectionne.
Cration de la table clients avec un programme dadministration
Dans la base de donnes slectionne on cre une nouvelle table avec huit colonnes
(champs) en remplissant le formulaire HTML comme dans la figure 4.

FIGURE 4 Formulaire de cration dune table dans le programme phpMyAdmin

Crer une table clients en SQL


Si on matrise le langage SQL (qui est la norme pour toutes les logiciels de bases de
donnes professionnels) on peut utiliser la commande SQL suivante pour crer la mme
table sans passer par les formulaire de la figure 4.
LISTING 2.1 Comande SQL de cration dun table dans un base de donnes

CREATE TABLE `biorythme_clients` (


`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nom` VARCHAR(50) NOT NULL,
`mail` VARCHAR(50) NOT NULL,
`login` VARCHAR(10) NOT NULL,
`pass` VARCHAR(8) NOT NULL,
`jour` SMALLINT NOT NULL,
`mois` SMALLINT NOT NULL,
`annee` INT NOT NULL,
UNIQUE (`nom`)
);
Cration dun formulaire HTML pour permettre aux
clients de senregistrer
Cration dune page serveur
Avec la table clients cre on ouvre en Dreamweaver lapplication biorythme (dans cette
exemple elle apparat comme une sous-application du site cours_comelec).
Une nouvelle page dynamique est cre. Elle va accueillir le formulaire denregistrement
des clients. Parmi toutes les technologies serveurs proposes (ColdFusion,ASP,
ASP.NET, JSP, PHP) cest une page de type PHP qui sera choisi. Dans cette page on
crit un texte qui invite les clients de senregistrer et on sauvegarde la page sous le nom
enregistrer.php (dans le dossier biorythme).
Dfinition de la connxion la base de donnes
Ensuite une connexion la base de donnes sera dfinie pour tre utilise dans cette
page. Dans le menu Dreamweaver on choisi Fentre -> Base de donnes -> + suivi par
loption Connexion MySQL. Dans la boite de dialogue qui saffiche sont introduits les
lments qui dfinssent la connexion. Ils diffrent en fonction de la localisation du
serveur de bases de donnes comme lillustre le tableau 3.
TABLEAU 3 - Dfinition dune connexion un serveur de bases
de donnes local et distant

Distant Local
Nom de la connexion Conn_biorythme_client_distant Conn_biorythme_client_local
Seveur MySQL sql.free.fr Localhost
Nom dutilisateur mihai.calciu root
Mot de passe *********
Base de donnes mihai.calciu Biorythme

FIGURE 5 Menu daccs aux objets dapplication gnriques


et spcifiques en Dreamweaver
Slection de lobjets dapplication appropri
A laide des objets dapplication de Dreamweaver3, on peut gnrer automatiquement la
page denregistrement des clients. Dans la figure 5 on voit la liste des objets
dapplication gnriques et laccs des objets dapplication spcifiques chaque
technologie serveur.
Configuration de lobjet formulaire dinsertion dEnregistrements
Les objets gnriques rassemblent les interactions les plus courantes avec le serveur de
bases de donnes ils permettent de raliser en quelques clicks des pages dapplication
qui aurait ncessit un travail de programmation relativement important.
La figure 6. montre comment on configure lobjet Formulaire dinsertion
denregistrement. Cet objet insre du code serveur et du HTML dans la page courante,
laide dune interface gnrique, indpendante de la technologie serveur utilise.
Il sagit de code HTML qui construit le formulaire partir de la dfinition des champs
dans la base de donnes et de code serveur (PHP, ASP ou JSP) qui fait la connexion la
base de donnes et insre la valeur des champs du formulaire dans une ligne
(enregistrement) de la table.
FIGURE 6 Cration dune page denregistrement des clients avec lobjet
Formulaire dinsertion de Dreamweaver

3
Ce ne sont pas des objets dans le sens de la programmation oriente objets mais des wizards.
Cration automatique du formulaire denregistrement
Le rsultat est une page serveur (enregistrer.php) capable de soutenir le dialogue avec le
client et denregistrer les donnes saisies (voir figure 7).
Figure 7 Page serveur qui enregistre les clients

Permettre au responsable marketing d'accder


la liste des clients.
Les objets tableau dynamique, barre et tat de navigation
Lopration inverse lenregistrement dans la base est laffichage de la liste des clients
dj enregistrs. Elle aussi est obtenue avec peu deffort grce Dreamweawer. Lobjet
tableau dynamique qui produit le code HTML dun tableau qui affiche dynamiquement
un nombre prfix denregistrements du jeu denregistrements slectionns de la base
par une requte SQL. Si le jeu denregistrements est plus grand que le nombre fix de
lignes dans une page, on peut faciliter la navigation parmi les pages multiples du tableau
dynamique laide dautres objets. Ces objets sont la barre de navigation et ltat de
navigation du jeux denregistrement (voqus dans le figure 5).
Illustration
Voici une illustration :
FIGURE 8 Page daccs la liste des clients
Calculer les biorythmes pour le mois courant en
fonction de la date de naissance
Prsentation des calculs
La formule de calcul des biorythmes est sin (2*PI*jours_depuis_naissance/priode), o
la priode est spcifique pour chaque rythme ou cycle (23, 28 ou 33 jours). Pour calculer
les biorythmes il faut calculer le nombre de jours vcus par lindividu depuis sa
naissance et la formule se charge du calcul.
Transmission des donnees lapplication (formulaire ou chane de requte?)
Le client doit transmettre la page dapplication charg de faire les calculs (par exemple
biorythme.php) le jours, le mois et lanne de naissance. Ces informations peuvent tre
transmises travers un formulaire install dans la page appelante ou elles peuvent tre
communiques directement dans une chane de requte comme dans lexemple prsent
dans la figure 9.
FIGURE 9. Calcul du biorythme dans un page en utilisant
des informations de la chane de requte

Explication des chanes de requte


En fonction de la localisation de la page lappel prendra une des formes suivantes :
http://localhost/cours_comelec/biorythme.php?jour=6&mois=9&annee=1984
(pour le site local) ou
http://mihai.calciu.free.fr/cours_comelec/biorythme.php?jour=6&mois=9&ann
ee=1984 (pour le site distant).
Aprs le point dinterrogation on trouve les variables de la chane de requte avec les
valeurs qui leur sont attribues. Ce sont ces variables et leurs valeurs que la page serveur
doit capter et utiliser dans les calculs. Dans le code serveur de type PHP ont peut utiliser
directement le nom des variables (prcd du signe $) pour accder leurs valeurs.
Exemple en PHP
Voici le code de la page PHP qui calcule le nombre de jours vcus par la personne et
ensuite les valeurs de son biorythme.
LISTING 2.2 - Code de la page PHP qui calcule le biorythme

01. <body bgcolor="#FFFFCC">


02. <p align="left">Bonjour,</p>
03. <p align="left">Vous &ecirc;tes n&eacute; le <? echo "$jour.$mois.$annee"; ?></p>
04. <? $jours_depuis_naissance = (date("U")-date("U",
mktime(0,0,0,$mois,$jour,$annee)))/(3600*24); ?>
05. <p align="left">Vous avez v&eacute;cu : <?php echo $jours_depuis_naissance; ?>
06. jours </p>
07. <p align="left">Les valeurs de vos biorythmes sont :</p>
08. <table><tr><td>Type de
biorythme</td><td>physique</td><td>affectif</td><td>intellectuel</td> </tr>
09. <tr><td>P&eacute;riodicit&eacute; (en
jours)</td><td>23</td><td>28</td><td>33</td></tr>
10. <tr>
11. <td>Valeur du biorythme</td>
12. <td><?php echo sin(2*3.1416*$jours_depuis_naissance/23); ?></td>
13. <td><?php echo sin(2*3.1416*$jours_depuis_naissance/28); ?>&nbsp;</td>
14. <td><?php echo sin(2*3.1416*$jours_depuis_naissance/33); ?>&nbsp;</td>
15. </tr>
16. </table>
17. </body>
18. </html>
Analyse
Lapplication affiche dabord la ligne 3, la valeur du jour, du mois et de lanne
de naissance rcupre de la chane de requte. Ensuite ces valeurs rentrent dans
la formule de calcul du nombre de jours depuis la naissance de la ligne 4, qui
utilise de fonction spcialise de PHP pour traiter les dates et le temps. On voit
bien que la diffrence entre la date daujourdhui et la date de naissance retourne
le nombre de secondes vcues qui est transform en jours depuis la naissance en
divisant par le nombre de secondes dune journes (3600*24). Ensuite dans les
cellules dun tableau HTML aux lignes 12 14 sont calculs les valeurs des trois
types de biorythmes en utilisant la formule voqu.
Une fois enregistrs avec leur date de naissance, les clients peuvent suivre leurs
biorythmes tout simplement en sidentifiant sur le site avec leur login et mot de
passe. Pour cela la page serveur doit :
se connecter la base de donnes et slectionner lenregistrement avec les
donnes du client ;
utiliser les donnes extraites pour fournir un message personnalis et les
calculs que le client attend.
La connexion la base de donnes, la slection de la table biorythme_clients et
lextraction du jeu denregistrement se fera de la mme manire que dans les
pages prcdentes.
3
Chaptre

Interaction des sites de commerce


electronique avec le visiteur
LAffichage dynamique ou la rponse du serveur
(l'objet Response)
Rappels
Les prcdents chapitres taient une introduction aux pages serveur. Nous y avons vu
quune page serveur est une page HTML normale contenant des scripts; ces scripts
peuvent tre utiliss pour envoyer des informations au navigateur de manire
dynamique.
Qu'est-ce qu'un contenu dynamique? Le contenu d'une page HTML normale est
statique. Chaque fois qu'un utilisateur demande une page HTML, son contenu reste
inchang. Une page serveur, en revanche, peut tre diffrente chaque fois que
l'utilisateur tente d'y accder.
Dans le contexte d'un site Web commercial, il est souvent ncessaire de fournir un
contenu dynamique l'utilisateur. Ainsi, si vous proposez vos clients d'afficher vos
produits par catgorie, cette liste de produits devra tre gnre de manire dynamique
pour les diffrentes catgories de produits. De mme, une fois que 1'utilisateur est prt
passer commande, la page du bon de commande doit, elle aussi, tre gnre de manire
dynamique.
Les formes et objets de la Rponse
Pour crer du contenu dynamique partir d'une page ASP, vous pouvez utiliser 1'objet
ASP intgre Response. Celui-ci reprsente toutes les informations envoyes du serveur
Web au navigateur Web. En JSP lobjet Rponse est masqu par la balise expression
<%= et %>, il prend la main dans la servlet (le programme qui reprsente la page JSP
aprs sa traduction en langage JAVA). En PHP la fonction print offre les
fonctionnalits quon recherche.
Ainsi, la page serveur du Listing 3.1 affiche la date et lheure courantes. Chaque fois
que l'utilisateur accdera cette page, la date et l'heure affiches seront diffrentes.
LISTING 3.1: Affichage d'une page dynamique

ASP JSP PHP


01. <HTML> 01. <HTML> 01. <HTML>
02. <HEAD><TITLE>Date et 02. <HEAD><TITLE>Date et 02. <HEAD><TITLE>Date et
heure</TITLE></HEAD> heure</TITLE></HEAD> heure</TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. <% 04. <%= 04. <?
05. Response.Write NOW() 05. new java.util.Date() 05. print (Date("h:i :s A"));
06. %> 06. %> 06. ?>
07. </BODY> 07. </BODY> 07. </BODY>
08. </HTML> 08. </HTML> 08. </HTML>

Analyse
Comme vous pouvez le constater, La plus grande partie du Listing 2.1 est compose
de code HTML. Le contenu dynamique est gnr dans le corps (BODY) de la page
HTML. Les lignes 4 6 contiennent un script trs simple.
Pour ASP la ligne 5, la mthode Write de l'objet Response est utilise pour afficher
la date et l'heure courantes, pour lesquelles on fait appel la fonction VBScript
NOW (). En JSP on affiche la valeur de lobjet Date, dont un instance est cre par la
linstruction new. En PHP on utilise la fonction print pour afficher la valeur de
lobjet Date dans un format indiqu par la chane de format.
Les mthodes daffichage
En gnral, les mthodes daffichage servent afficher la valeur d'une fonction,
d'une variable ou dune chane. Ainsi, la page serveur du Listing 3.2 affiche le texte
(chane de caractres) "Bienvenue sur notre site".
LISTING 3.2: Bienvenue sur notre site

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Bienvenue 02. <HEAD><TITLE>Bienvenue 02. <HEAD><TITLE>Bienvenue
</TITLE></HEAD> </TITLE></HEAD> </TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. <% 04. <%= 04. <?
05. Response.Write "Bienvenue 05. "Bienvenue sur notre site" 05. print "Bienvenue sur notre
sur notre site" 06. %> site";
06. %> 07. <IBODY> 06. ?>
07. <IBODY> 08. </HTML> 07. <IBODY>
08. </HTML> 08. </HTML>

Affichage de chanes longues


Si vous souhaitez afficher des chanes de caractres trs longues, vous pouvez repartir
les chanes sur plusieurs lignes en faisant appel des oprateurs adapts. Voici par
exemple une page serveur affichant les premires lignes de La Chartreuse de Parme de
Stendhal:
LISTING 3.3: Chanes longues

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>cha&i 02. <HEAD><TITLE>cha&icirc; 02. <HEAD><TITLE>cha&icir
circ;nes nes c;nes
longues<ITITLE></HE longues<ITITLE></HEAD> longues<ITITLE></HEAD
AD> 03. <BODY> >
03. <BODY> 04. <%= 03. <BODY>
04. <% 05. "Le 15 mai 1796, le general 04. <?
05. Response.Write "Le 15 Bonaparte " + 05. print "Le 15 mai 1796, le
mai 1796, le general 06. "fit son entre dans Milan general Bonaparte ".
Bonaparte " &_ la tte de cette jeune arme 06. "fit son entre dans Milan
06. fit son entre dans "+ la tte de cette jeune
Milan la tte de cette 07. "qui venait de passer le arme ".
jeune arme " &_ pont de Lodi, " + 07. "qui venait de passer le
07. "qui venait de passer le 08. "et d'apprendre au monde pont de Lodi, ".
pont de Lodi, qu'aprs tant de sicles " + 08. "et d'apprendre au monde
08. et d'apprendre au 09. "Csar et Alexandre qu'aprs tant de sicles ".
monde qu'aprs tant de avaient un successeur." 09. "Csar et Alexandre
sicles " &_ 10. %> avaient un successeur."
09. "Csar et Alexandre 11. </BODY> 10. ?>
avaient un successeur." 12. </HTML> 11. </BODY>
10. %> 12. </HTML>
11. </BODY>
12. </HTML>

Analyse
Dans les scripts ASP, JSP et PHP des lignes 4 10, on montre comment afficher une
chane qui, dans le code, est repartie sur plusieurs lignes. En ASP la combinaison de
caractres &_ sert indiquer que la chane se poursuit sur la ligne suivante. En JSP
(en langage JAVA) le signe + est aussi un oprateur de concatnation de chanes de
caractres. En PHP le point joue le rle de lien entre plusieurs chanes de caractres.
Affichage de caractres spciaux
Certains caractres ne s'afficheront pas correctement. Il s'agit des chevrons ouvrant et
fermant (< et >) ainsi que des guillemets.
Le problme vient du fait que ces caractres ont une signification spciale en HTML.
Les chevrons servent marquer le dbut et la fin des balises HTML. Lorsque le
navigateur rencontre ce type de caractre dans une page, il l'interprte comme
appartenant une balise HTML.
Pour rsoudre ce problme, les caractres doivent tre codes avant d'tre envoys au
navigateur. Cette tche est trs simple effectuer dans le cas d'une page ASP. Il
suffit d'utiliser la mthode HTMLEncode() de l'objet Server pour coder la chane
avant son envoi au navigateur.
Ainsi, la page ASP du Listing 3.4 code correctement la chane ">>N'hsitez pas
comparer nos prix ! <<" avant de l'envoyer au navigateur.
LISTING 3.4: Codage HTML d'une chane

01. <HTML>
02. <HEAD><TITLE>Codage HTML dune cha&icirc;ne</TITLE></HEAD>
03. <BODY>
04. <%
05. Response.Write Server.HTMLEncode(">>N'h&eacute;sitez pas &agrave; comparer nos
prix! <<")
06. %>
07. </BODY>
08. </HTML>

Vous constaterez par la suite qu'il est souvent ncessaire de coder ainsi les chanes
lorsqu'on travaille avec des formulaires HTML. Nous verrons d'ailleurs dans ce
chapitre comment utiliser la mthode HTMLEncode() avec un formulaire HTML
(voir la section "Utilisation de la collection Form" ci-dessous).
Affichage des guillemets
Le langage VBScript fait appel aux guillemets pour marquer le dbut et la fin des
chanes. Cela pose un problme lorsque la chane elle-mme contient des
guillemets. En effet, le VBScript, Java ou PHP interprteront un guillemet situ
l'intrieur d'une chane comme la fin de cette chane. Ainsi, le Listing 3.5 gnrera
une erreur.
LISTING 3.5 : Mauvaise utilisation des guillemets

01. <HTML>
02. <HEAD><TITLE>Mauvaise utilisation des guillemets</TITLE></HEAO>
03. <BODY>
04. <%
05. Response.Write "Il lisait "La Chartreuse de Parme"."
06. %>
07. <~BODY>
08. </HTML>

Analyse
Le Listing 3.5 gnre une erreur cause des guillemets de la ligne 5. Le
VBScript, Java et PHP interprtent le deuxime guillemet comme la fin de la
chane.
II existe deux moyens de rsoudre ce problme. Le premier consiste insrer
deux guillemets de suite. Le VBScript interprte deux guillemets successifs
comme on seul guillemet la page ASP du Listing 3.6 montre comment utiliser
cette mthode. En JSP (Java) et PHP en prcdera le guillemets afficher par le
caractre \.
LISTING 3.6. Bonne utilisation des guillemets

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Bonne 02. <HEAD><TITLE>Bonne 02. <HEAD><TITLE>Bonne
utilisation des utilisation des utilisation des
guillemets</TITLE></HEA guillemets</TITLE></HE guillemets</TITLE></HEA
D> AD> D>
03. <BODY> 03. <BODY> 03. <BODY>
04. <% 04. <%= 04. <?
05. Response.Write "Il lisait 05. "Il lisait \"La Chartreuse 05. print "Il lisait \"La
""La Chartreuse de de Parme\"." Chartreuse de Parme\"." ;
Parme""." 06. %> 06. %>
06. %> 07. </BODY> 07. </BODY>
07. </BODY> 08. </HTML> 08. </HTML>
08. </HTML>

Deuxime mthode pour traiter les guillemets


Il existe en ASP une deuxime mthode pour insrer des guillemets dans une
chane VBScript. Celle-ci consiste a utiliser la fonction CHR() de VBScript. Le
Listing 3.7 fait appel cette mthode.
LISTING 3.7: Bonne utilisation des guillemets

01. <HTML>
02. <HEAD><TITLE>Bonne utilisation des guillemets</TITLE></HEAD>
03. <BODY>
04. <%
05. Response.Write "Il lisait " & CHR(34) & "La Chartreuse de Parme "& CHR(34)
06. %>
07. </BODY>
08. </HTML>

Vous pouvez faire appel, au choix, l'une ou l'autre de ces deux mthodes, en
fonction de vos prfrences.
Utilisation des dlimiteur de sortie <%= et %>
Plutt que d'utiliser la mthode Write de l'objet Response pour envoyer du contenu
au navigateur, vous pouvez utiliser les dlimiteurs <%= et %>. Ainsi, le Listing 3.8
utilise ces dlimiteurs la place de la mthode Write pour afficher l'heure courante.
LISTING 3.8 : Dlimiteurs de sortie

01. <HTML>
02. <HEAD><TITLE>D&eacute;limiteurs de sortie</TITLE></HEAD>
03. <BODY>
04. <%=TIME()%>
05. </BODY>
06. <~HTML>
Analyse
La ligne 4 permet d'afficher l'heure courante. File utilise les dlimiteurs <%= et
%> pour envoyer au navigateur la valeur de la fonction VBScript TIME ().
Diffrence entre les dlimiteurs <%= %> <% %>
En ASP et JSP il est important de ne pas confondre les dlimiteurs de sortie
<%= et %> avec les dlimiteurs de script <% et %>. Les premiers permettent
d'envoyer du contenu au navigateurs. Les seconds servent marquer le dbut et
la fin d'un script.
Quand doit-on utiliser en ASP les dlimiteurs <%= et %>, et quand doit-on
utiliser la mthode Write de l'objet Response? Les deux mthodes sont
parfaitement interchangeables. Cependant, l'utilisation des dlimiteurs de sortie
<%= et %> est souvent plus pratique lorsqu'il faut afficher les valeurs d'une
srie de variables ou de fonctions dans une page ASP.
Ainsi, le Listing 3.9 pourrait faire appel la mthode Write, mais le code est
plus facile lire lorsqu'on emploie les dlimiteurs <%= et %>.
LISTING 3.9: Affichage d'une srie de valeurs

01. <HTML>
02. <HEAD><TITLE>D&eacute;limiteurs de sortie</TITLE></HEAD>
03. <BODY>
04. <br>Nous sommes le <%=DATE()%>
05. <br>et il est <%=TIME()%> heures.
06. </BODY>
07. </HTML>

Terminer l'excution d'un script avec l'objet Response


Jusqu' maintenant, il n'a t question que d'une seule mthode de l'objet Response,
la mthode Write, qui permet d'envoyer do contenu au navigateur Web de
l'utilisateur. La mthode End est une autre mthode trs utile de l'objet Response.
Elle permet d'arrter l'excution d'un script.
Ainsi, le Listing 3.10 contient deux messages. Le deuxime message du script n'est
pas affiche" par le navigateur parce que la mthode End de l'objet Response est
appele entre le premier et le second message.

LISTING 3.10: Arrt de l'excution d'un script

01. <HTML>
02. <HEAD><TITLE>Arr&ecirc;t de 1'ex&eacute;cution d'un script</TITLE><~HEAD>
03. <BODY>
04. <
05. Response.Write "Premier message
06. Response. End
07. Response.Write "Second message
08. %>
09. <IBODY>
10. </HTML>

Analyse
La ligne 5 permet d'afficher le premier message. Dans la ligne 6, la mthode
End de l'objet Response est appele. Cette mthode provoque l'arrt immdiat
du traitement de la page. De ce fait, seul le contenu gnr par les lignes 1 5
est envoy au navigateur.

La requte adress au serveur (l'objet Request)


Prsentation
La rponse reprsente tout le contenu envoy par le serveur Web au navigateur. La
requte reprsente quant lui tout le contenu envoy par le navigateur au serveur
Web. Cet objet vous servira obtenir des informations en provenance de vos
clients.
Les collections de la requte
L'objet Request dispose de quatre collections trs utiles:
La collection QueryString, qui reprsente les variables de chanes de
requte ;
La collection Form, qui reprsente les champs de formulaire HTML;
La collection ServerVariables, qui reprsente les en-ttes de navigateurs et
les variables de serveurs;
La collection Cookies, qui reprsente les cookies du navigateur.
Dans les sections ci-dessous, vous apprendrez utiliser les trois premires de ces
collections. Il sera question de la quatrime collection (Cookies) dans le chapitre
suivant.

Utiliser les chanes de requte


Prsentation
Une chane de requte est la partie d'une URL qui apparat aprs le point
d'interrogation. Voici un exemple d'URL contenant une chane de requte:
http: //fr.search.yahoo.com/search/fr?p=Active+Server+Pages

Dans cet exemple, la chane de requte contient une variable nomme p dont la
valeur est "Active Server Pages". Si vous entrez cette chane dans le champ
d'adresse de votre navigateur, celui-ci affichera toutes les pages de Yahoo! en
rapport avec l'ASP.
Les chanes de requte servent transmettre des informations du serveur au
navigateur. En gnral, l'utilisateur ne saisit pas directement une chane de requte
dans le champ d'adresse U navigateur. En revanche, il est courant de crer dans une
page un lien contenant une chane de requte.
Faire un choix
Les chanes de requte peuvent permettre l'utilisateur de faire un choix. Ainsi, on
client pourra cliquer sur diffrentes catgories de produits pour en afficher la liste.
La page ASP du Listing 3.11 permet au visiteur de faire son choix entre deux
catgories de produits: Les pommes Reine des reinettes, et les pommes Golden
delicious.
LISTING 3.11 Choix de pommes

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Pomme 02. <HEAD><TITLE>Pomme 02. <HEAD><TITLE>Pomme
s</TITLE></HEAD> s</TITLE></HEAD> s</TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. veuillez choisir un type de 04. veuillez choisir un type de 04. veuillez choisir un type de
pomme&nbsp; pomme&nbsp; pomme&nbsp;
05. <p><a 05. <p><a 05. <p><a
href="page2.asp?pomme href="page2.jsp?pomme= href="page2.php?pomme
=reinette">Reine des reinette">Reine des =reinette">Reine des
reinettes</a> reinettes</a> reinettes</a>
06. <p><a 06. <p><a 06. <p><a
href="page2.asp?pomme href="page2.jsp?pomme= href="page2.php?pomme
=golden">Golden golden">Golden =golden">Golden
delicious</a> delicious</a> delicious</a>
07. </BODY> 07. </BODY> 07. </BODY>
08. </HTML> 08. </HTML> 08. </HTML>

Analyse
Les pages html du Listing 3.11 comprennent deux liens hypertexte vers une
page nomme page2.asp et respectivement page2.jsp ou page2.php. Le premier
lien passe une chane de requte nomme pomme avec la valeur reinette. La
seconde chane de requte se nomme galement pomme sa valeur est golden. En
cliquant sur l'ou ou l'autre lien, le visiteur peut choisir le type de pomme
afficher.
Rpondre au choix
Dans la page serveur page2.xxx, il est possible de savoir sur quel lien
l'utilisateur cliqu en faisant appel aux paramtres de requte. Le Listing 3.12
correspond la page page2.xxx.
LISTING 3.12 : Utilisation d'une chane de requte

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Page 02. <HEAD><TITLE>Page 2 02. <HEAD><TITLE>Page 2
2 </TITLE></HEAD> </TITLE></HEAD> </TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. <% 04. <% 04. <?
05. pomme = 05. String pomme = 05. $pomme =
Request.OueryString("p request.getParameter("pom $HTTP_GET_VARS["pom
omme") me");%> me"];
06. Response.Write "Vous 06. <%= "Vous avez 06. print "Vous avez
avez s&eacute;lectionn&eacute; s&eacute;lectionn&eacute;
s&eacute;lectionn&eacut la vari&eacute;t&eacute; la vari&eacute;t&eacute; ".
e; la "+pomme $pomme
vari&eacute;t&eacute; " 07. %> 07. ?>
& pomme 08. </BODY> 08. </BODY>
07. %> 09. </HTML> 09. </HTML>
08. </BODY>
09. </HTML>

Analyse
ASP : Ligne 5, la collection QueryString de l'objet Request sert rcuprer le
contenu de la variable de chane de requte pomme. Le contenu de cette
variable est affecte a one variable locale VBScript, pomme.
JSP : Ligne 5, la mthode getParameter de l'objet request sert rcuprer le
contenu de la variable de chane de requte pomme. Le contenu de cette
variable est affecte a one variable locale Java de type chane (String), pomme.
Enfin, la valeur de cette variable est affiche ligne 6.
PHP : Ligne 5, la collection $http_GET_VARS de PHP sert rcuprer le
contenu de la variable de chane de requte pomme. Le contenu de cette
variable est affecte a une variable locale PHP, pomme.
ASP,JSP et PHP : Enfin, la valeur de cette variable est affiche ligne 6.
Passer plusieurs variables de chane de requte
Il est possible de passer plusieurs variables de chane de requte l'aide d'une
seule chane de requte. Il suffit pour cela de sparer les variables les unes des
autres l'aide de caractres &. Ainsi, la page ASP du Listing 3.13 passe deux
variables de chane de requte, fruit et varit.
LISTING 3.13 Passage de plusieurs variables de chane de requte

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Fruits 02. <HEAD><TITLE>Fruits<IT 02. <HEAD><TITLE>Fruits<ITI
<ITITLE></HEAD> ITLE></HEAD> TLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. S&eacute;lectionnez 04. S&eacute;lectionnez un 04. S&eacute;lectionnez un
un type de fruit type de fruit type de fruit
05. <p><a 05. <p><a 05. <p><a
href="page2b.asp?fruit href="page2b.jsp?fruit=poir href="page2b.php?fruit=poir
=poire&variete=crassa e&variete=crassane">Poir e&variete=crassane">Poire
ne">Poire passe- e passe-crassane </a> passe-crassane </a>
crassane </a> 06. <p><a 06. <p><a
06. <p><a href="page2b.jsp?fruit=po href="page2b.php>p?fruit=p
href="page2b.asp?fruit mme&variete=reinette">rei omme&variete=reinette">rei
=pomme&variete=rein ne des reinettes</a> ne des reinettes</a>
ette">reine des 07. <p><a 07. <p><a
reinettes</a> href="page2b.jsp?fruit=po href="page2b.php?fruit=po
07. <p><a mme&variete=golden">Po mme&variete=golden">Pom
href="page2b.asp?fruit mme golden delicious</a> me golden delicious</a>
=pomme&variete=gold 08. </BODY> 08. </BODY>
en">Pomme golden 09. </HTML> 09. </HTML>
delicious</a>
08. </BODY>
09. </HTML>

Analyse
Les liens hypertexte du Listing 3.14 contiennent des chanes de requte
comprenant deux variables chacune: fruit et varit. Lorsque l'utilisateur clique
sur l'un de ces liens hypertexte, les deux variables de chane de requte sont
passes la page page2b.xxx.
Accder au variables de la chane de requte
Lorsque plusieurs variables de chane de requte sont envoyes une page,
vous pouvez accder chacune dentre elles par l'intermdiaire de la collection
QueryString. Le Listing 3.12 montre comment rcuprer le contenu des deux
variables de chane de requte fruit et varit.
LISTING 3.14: Rcupration de plusieurs variables de chane de requte

ASP JSP PHP


01. <HTML> 01. <HTML> 01. <HTML>
02. <HEAD><TITLE>Fruit 02. <HEAD><TITLE>Fruit 02. <HEAD><TITLE>Fruit
s&eacute;lectionn&eacute s&eacute;lectionn&eacute s&eacute;lectionn&eacute
;</TITLE></HEAD> ;</TITLE></HEAD> ;</TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. Vous avez choisi&nbsp; 04. Vous avez choisi&nbsp; 04. Vous avez choisi&nbsp;
05. <p>Fruit&nbsp: 05. <p>Fruit&nbsp: 05. <p>Fruit&nbsp: <? print
<%=Request.QueryString( <%=request.getParameter $fruit; ?>
"fruit")%> ("fruit")%> 06. <p>Vari&eacute;t&eacute;
ASP JSP PHP
06. <p>Vari&eacute;t&eacute; 06. <p>Vari&eacute;t&eacute; &nbsp; : <? print $variete;
&nbsp; : <%= &nbsp; : <%= ?>
Request.Querystring("vari request.getParameter("var 07. </BODY>
ete")%> iete")%> 08. </HTML>
07. </BODY> 07. </BODY>
08. </HTML> 08. </HTML>

Analyse
La ligne 5, les dlimiteurs <%= et %> sont utiliss pour afficher la valeur de la
variable de chane de requte fruit. La ligne 6 affiche la valeur de la variable de
chane de requte type.
Passer des caractres spciaux dans des chanes de requte
Il n'est pas possible d'inclure directement des espaces ou d'autres caractres
spciaux dans le nom ou la valeur d'une variable de chane de requte.
Supposons par exemple que vous souhaitiez passer la chane "reine des
reinettes" dans une variable de chane de requte. Vous pourriez tre tent de le
faire comme dans la page ASP du Listing 3.15.
LISTING 3.15: Chane de requte contenant des espaces

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Fruits</ 02. <HEAD><TITLE>Fruits</ 02. <HEAD><TITLE>Fruits</
TITLE></HEAD> TITLE></HEAD> TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. <a 04. <a 04. <a
href="page2b.asp?fruit="r href="page2b.jsp?fruit="rei href="page2b.php?fruit="r
eine des ne des eine des
reinettes">Pommes<la> reinettes">Pommes<la> reinettes">Pommes<la>
05. </BODY> 05. </BODY> 05. </BODY>
06. </HTML> 06. </HTML> 06. </HTML>

Analyse
La ligne 4 contient un lien hypertexte avec une variable de chane de requte
nomme fruit. Cependant, si vous cliquez sur ce lien, la valeur de la chane de
requte ne sera pas correctement passe la page page2b.xxx . Sa valeur sera
coupe au niveau du premier espace.
Lencodage URL
Pour pouvoir passer une chane de requte comprenant des espaces ou des
caractres spciaux (caractres accentues, en particulier), vous devez d'abord
coder la chane dans un "style URL". Lorsqu'une chane est ainsi code, tous les
caractres posant problme sont remplacs ; les espaces, par exemple, sont
remplaces par des signes "+"
Pour coder de cette manire une chane de requte, utilisez la mthode
adapte pour chaque technologie serveur. La chane "reine des reinettes" est
ainsi correctement code avant d'tre passe.
LISTING 3.16: Codage URL d'une chane de requte

ASP JSP PHP

01. <HTML> 01. <HTML> 01. <HTML>


02. <HEAD><TITLE>Fruits</TI 02. <HEAD><TITLE>Fruits</TI 02. <HEAD><TITLE>Fruits
TLE></HEAD> TLE></HEAD> </TITLE></HEAD>
03. <BODY> 03. <BODY> 03. <BODY>
04. <% 04. <% 04. <?
05. valeur = "reine des 05. String valeur = "reine des 05. $valeur = "reine des
reinettes" reinettes" reinettes";
06. valeur = 06. valeur = 06. valeur =
Server.URLEncode(valeur) java.net.URLEncoder.enco urlencode($valeur);
07. %> de(valeur); 07. ?>
08. <a 07. %> 08. <a
href="page2b.asp?fruit=<% 08. <a href="page2b.php?fruit
=valeur%>">Pommes</a> href="page2b.jsp?fruit=<% =<? print
09. </BODY> =valeur%>">Pommes</a> $valeur ; ?>">Pommes
10. </HTML> 09. </BODY> </a>
10. </HTML> 09. </BODY>
10. </HTML>

Analyse
Dans le Listing 3.16, la chane "reine des reinettes" est code avant dtre
ajoute a la mme de requte. Ligne 5, la chane reine des reinettes" est
affecte la variable valeur. Ligne 6, la valeur de la variable est code laide
de la mthode adapt chaque technologies serveur :
ASP : utilise la mthode URLEncode de l'objet Serveur ;
JSP : utilise la mthode encode de lobjet URLEncoder qui se trouve
dans la bibliothque java.net ;
PHP : utilise la fonction urlencode() ;
Ligne 8, la variable est ajoute la chane de requte.

Utiliser les Formulaires


Prsentation
Pour permettre aux visiteurs de s'enregistrer ou de s'abonner votre site Web, de
remplir un questionnaire ou de saisir leur numro de carte bancaire, vous devez
faire appel aux formulaires HTML. Pour rcuprer les informations entres par
l'utilisateur dans le formulaire HTML, il y des fonctionnalits disponibles dans
chaque technologie serveur.
Un formulaire simple
Ainsi, la page du Listing 3.17 contient on formulaire HTML simple demandant a
l'utilisateur de saisir son prnom.
LISTING 3.17 : Saisie du prnom jsp, php

01. <HTML>
02. <HEAD><TITLE>Saisie du
pr&eacute;nom<ITITLE></HEAD>
03. <BODY>
04. Veuillez entrer votre pr&eacute;nom
05. <FORM method="post"
action="page2d.xxx">
06. <INPUT name="prenom"
type="text">
07. <INPUT type="submit" value="OK">
08. </FORM>
09. </BODY>
</HTML>

Analyse
Le Listing 3.17 contient on formulaire HTML simple comprenant on champ
nomm "prnom". La Ligne 6 affiche ce champ ; la ligne 7 affiche on bouton
d'envoi comprenant la mention "OK".
Rponse personalise
Lorsqu'on utilisateur saisit son prnom et qu'il clique sur le bouton OK, les
donnes du formulaire sont envoyes la page page2d.xxx. Dans cette page, la
valeur du champ prnom pourra tre obtenue en faisant appel la collection
Form de l'objet Request. Le Listing 3.18 montre comment utiliser cette
collection.
LISTING 3.18: Utilisation du contenu d'un champ de formulaire

ASP JSP PHP


01. <html> 01. <html> 01. <html>
02. <head> 02. <head> 02. <head>
03. <title>Affichage du 03. <title>Affichage du 03. <title>Affichage du
pr&eacute;nom</title> pr&eacute;nom</title> pr&eacute;nom</title>
04. </head> 04. </head> 04. </head>
05. <body> 05. <body> 05. <body>
06. <% 06. <% String prenom= 06. <? $prenom =
prenom=Request.Form("pr request.getParameter("p $HTTP_POST_VARS['pr
enom"); %> renom"); %> enom']; ?>
07. Bonjour <%= prenom %> et 07. Bonjour <%= prenom 07. Bonjour <? print
bienvenue sur notre site %> et bienvenue sur $prenom ?> et
08. </body> notre site bienvenue sur notre site
09. </html> 08. </body> 08. </body>
09. </html> 09. </html>
Analyse
En Dreamweaver, le champ de formulaire est rcupr du menu Fentre-
>Liaison->Variable de demande ou de formulaire (les nom varient en fonction
de la solution serveur choisie.
ASP : utilise la collection Form de lobjet Request ;
JSP : utilise la methode getParameter de lobjet request ;
PHP : utilise le tableau $HTTP_POST_VARS ;
Gnration dune rponse adapt
LISTING 3.19: Apprciation du site par les visiteurs

ASP JSP PHP

01. <html> 01. <html> 01. <html>


02. <head> 02. <head> 02. <head>
03. <title>Votre 03. <title>Votre 03. <title>Votre
appr&eacute;ciation</title appr&eacute;ciation</title appr&eacute;ciation</title
> > >
04. </head> 04. </head> 04. </head>
05. <body> 05. <body> 05. <body>
06. <% note = 06. <% int note = 06. <? $note =
cINT(Request.Form("note Integer.parseInt(request.g intval($HTTP_POST_VA
")) %> etParameter("note")); %> RS['note']); ?>
07. Merci d'avoir 07. Merci d'avoir 07. Merci d'avoir
particip&eacute; &agrave; particip&eacute; &agrave; particip&eacute; &agrave;
ce sondage<p> ce sondage<p> ce sondage<p>
08. <% IF note < 3 THEN 08. <% if(note < 3){ %> 08. <? if($note < 3){ ?>
09. Response.Write "Merci 09. <%= "Merci pour votre 09. <? print "Merci pour
pour votre confiance !" confiance !" %> votre confiance !" ; ?>
10. ELSE 10. <% }else{ %> 10. <% }else{ %>
11. Response.Write 11. <%= "Comment a, 11. <? print "Comment a,
"Comment a, vous vous n'aimez vraiment vous n'aimez vraiment
n'aimez vraiment pas pas notre magasin ?" %> pas notre magasin ?" ; ?>
notre magasin ?" 12. <% } %></p> 12. <? } ?></p>
12. END IF %></p> 13. </body> 13. </body>
13. </body> 14. </html> 14. </html>
14. </html>

Analyse
La page rcupre la valeur du bouton radio slectionn par le visiteur. Ligne 6
la valeur du bouton est extraite laide de la mthode adapt de chaque
technologie et la valeur qui est transmise en tant que chane de caractre est
convertie en nombre entier.
Lignes 7 12 affichent un message parmi deux en fonction de lapprciation
reue de la part du rpondant.
Vrifier que tous les champs sont remplis
Listing 3.20: Formulaire de carte bancaire

01. <HTML>
02. <HEAD><TITLE>Formulaire de carte
bancaire</TITLE></HEAD>
03. <BODY>
04. <b>Veuillez compl&eacute;ter les
champs ci-dessous&nbsp;:</b>
05. <FORM METHOD="POST"
ACTION="page2f.xxx">
06. <p>Nom
07. <br><INPUT name="client"
SIZE="30">
08. <p>Num&eacute;ro de carte bancaire
09. <br><INPUT name="numerocarte"
size="15">
10. <p>Date d'expiration
11. <br><INPuT name="expirationcart"
size="15">
12. <p><INPUT type="submit"
value="OK">
13. </FORM>
14. </BODY>
15. </HTML>

Si le visiteur oublie d'entrer son nom, son numro de carte bancaire ou sa date
d'expiration la commande ne pourra aboutir. Le Listing 3.21 montre comment une
page ASP peut vrifier qu'aucun champ n'est rest vide.
Des prcautions suplmentaires
LISTING 3.21: Vrifier que tous les champs ont t remplis asp php

01. <%
02. SUB formulaireErreur( erreur
03. %>
04. <HTML>
05. <HEAD><TITLE>Erreur</TITLE></HEAD>
06. <BODY>
07. <% erreur %>
08. <FORM method="post" action="pagel.asp"><p>
09. <INPUT TYPE="submit" value="Retour">
10. </FORM>
11. </BODY>
12. </HTML>
13. <%
14. Response.End
15. END SUB
16. ' Extraction du contenu du formulaire
17. client=TRIM( Request.Form("client")
18. numerocarte=TRIM( Request.Form("numerocarte"))
19. expirationcarte=TRIM( Request.Form("expirationcarte"))
20. 'On verifie que tous les champs ont et remplis
21. IF client="" THEN
22. formulaireErreur "Vous n'avez pas indique~ votre nom."
23. END IF
24. IF numerocarte = " " THEN
25. formulaireErreur "Vous n'avez pas indiqu votre numro de carte bancaire"
26. END IF
27. IF expirationcarte = " " THEN
28. formulaireErreur "Vous n'avez pas indiqu la date d'expiration de votre carte."
29. END IF
30. %>
31. <HTML>
32. <HEAD><TITLE>Merci</TITLE></HEAD>
33. <BODY>
34. Vos informations de carte bancaire ont bien t enregistres.
35. </BODY>
36. </HTML>

Analyse
La page ASP do Listing 3.21 affiche on message d'erreur Si l'utilisateur ne
remplit pas tous les champs du formulaire. Les lignes 17 A 19 servent extraire
le contenu des champs de formulaire l'aide de la collection Form et l'affecter
des variables locales.
Notez que la fonction VBScript TRIM() est applique au contenu de chacun
des champs. Cette fonction permet de supprimer les espaces se trouvant au
dbut et a" la fin d'une chane (les navigateurs ont tendance ajouter des
espaces supplmentaires chaque champ de formulaire lors de son envoi).
Dans les lignes 21 29, chaque variable est compare one chane de longueur
nulle. Si l'une des variables est vide, un sous-programme nomme
formulaireErreur est appel, et un message d'erreur est passe ce sous-
programme.
Le sous-programme des lignes 2 a 15 affiche one page HTML prsentant le
message d'erreur qui lui a t passe. Il contient galement on formulaire
affichant on bouton renvoyant l'utilisateur sur la page prcdente (celle do
Listing 3.21).
Notez que la mthode End de l'objet Response est appele la dernire ligne du
sous-programme formulaireErreur (ligne 14). Cette mthode arrte l'excution
du script ; ainsi, seul le message d'erreur est affiche.
Si le sous-programme formulaireErreur nest pas appel, la page HTML des
lignes 31 36 est affiche. Cette page ne s'affiche que si lutilisateur a saisi
toutes les informations demandes ; elle confirme que les informations de carte
bancaire ont t enregistres.
Nouvel affichage du contenu des champs de formulaire
Il n'y a rien de plus nervant que de remplir un formulaire sur un site Web et de
voir s'afficher ensuite un message d'erreur qui oblige saisir de nouveau tout le
contenu des champs. Lorsquun utilisateur omet de remplir un champ, il est
prfrable d'afficher nouveau toutes les informations qu'il a saisies. Pour ce
faire, vous devrez renvoyer au navigateur les donnes saisies dans les champs
do formulaire initial.
Vous avez cr ci-dessus un formulaire HTML contenant trois champs de
formulaire: un
pour le nom do client, un pour le numro de sa carte bancaire et un pour la date
d'expiration de sa carte. Si un client entre son numro de carte bancaire et sa
date dexpiration, mais qu'il omet de saisir son nom, le message d'erreur qui
s'affiche comprend un bouton renvoyant vers le formulaire initial. Lorsque ce
formulaire est de nouveau affich, les informations de numro et de date
d'expiration de la carte bancaire auront disparu.
Pour rsoudre ce problme, il est ncessaire de modifier les deux pages dont il a
t question ci-dessus. Vous devrez d'abord modifier le sous-programme
formulaireErreur pour qu'il renvoie toutes les informations que le client a entr
dans les champs du formulaire (voir Listing 3.22).
LISTING 3.22 Passer les champs de formulaires la page prcdente

01. <%
02. SUB formulaireErreur( erreur
03. %>
04. <HTML>
05. <HEAD><TITLE>Erreur</TITLE></HEAD>
06. <BODY>
07. <% erreur %>
08. <FORM method="post" action="pagel.asp"><p>
09. <% FOR EACH item IN Request.Form %>
10. <INPUT name="<%=item%> type="hidden"
11. value="<%=Server.HTMLEncode( Request.Form( item ) )%>">
12. <% NEXT %>
13. <INPUT TYPE="submit" value="Retour">
14. </FORM>
15. </BODY>
16. </HTML>
17. <%
18. Response.End
19. END SUB
20. ' Extraction du contenu du formulaire
21. client=TRIM( Request.Form("client")
22. numerocarte=TRIM( Request.Form("numerocarte"))
23. expirationcarte=TRIM( Request.Form("expirationcarte"))
24. 'On verifie que tous les champs ont et remplis
25. IF client="" THEN
26. formulaireErreur "Vous n'avez pas indique~ votre nom."
27. END IF
28. IF numerocarte = " " THEN
29. formulaireErreur "Vous n'avez pas indiqu votre numro de carte bancaire"
30. END IF
31. IF expirationcarte = " " THEN
32. formulaireErreur "Vous n'avez pas indiqu la date d'expiration de votre carte."
33. END IF
34. %>
35. <HTML>
36. <HEAD><TITLE>Merci</TITLE></HEAD>
37. <BODY>
38. Vos informations de carte bancaire ont bien t enregistres.
39. </BODY>
40. </HTML>

Analyse
La page ASP do Listing 3.22 a t modifie pour renvoyer toutes les donnes
que l'utilisateur saisies dans les champs de formulaire. Les lignes 9 12
contiennent un script qui cre le champ de formulaire masqu pour chacun des
lments de la collection Form. Lorsqu'un utilisateur clique sur te bouton OK,
toutes tes informations initiales du formulaire sont correctement renvoyes la
page pagel.asp.
Notez que la mthode HTMLEncode() de l'objet Serveur est employe pour
coder le contenu des attributs VALUE des champs de formulaire masques. Ce
codage est indispensable pour viter les erreurs qui se produiraient si
l'utilisateur entrait des guillemets ou d'autres caractres spciaux dans un champ
de formulaire.
La page pagel.asp doit, elle aussi, tre modifie pour afficher toutes les donnes
initiales du formulaire. Pour cela, une valeur par dfaut est affecte chacun
des champs do formulaire HTML. Le Listing 3.23 montre la version modifie
de la page pagel.asp.
LISTING 3.23: Formulaire de carte bancaire modifi

01. <%
02. client = TRIM(Request.Form("client"))
03. numerocarte = TRIM(Request.Form("numerocarte"))
04. expirationcarte = TRIM(Request.Form("expirationcarte"))
05. %>
06. <HTML>
07. <HEAD><TITLE>Formulaire de carte bancaire</TITLE></HEAD>
08. <BODY>
09. <b>Veuillez compl&eacute;ter les champs ci-dessous&nbsp;:</b>
10. <FORM METHOD="POST" ACTION="page2.asp">
11. <p>Nom
12. <br><INPUT name="client" SIZE="30"
13. value="<%=Server.HTMLEnCOde(client)%>">
14. <p>Num&eacute;ro de carte bancaire
15. <br><INPUT name="numerocarte" size="15"
16. <value="<%=Server.HTMLEncode(numerocarte)%>">
17. <p>Date d'expiration
18. <br><INPUT name="expirationcarte" size="15"
19. value="<%=Server.HTMLEncode(expirationcarte)%>">
20. <p><INPUT type="submit" value="OK">
21. </FORM>
22. </BODY>
23. </HTML>

Analyse
La page ASP du Listing 3.23 rcupre les donnes initialement saisies dans les
champs formulaire et les affiche nouveau en utilisant l'attribut VALUE de
chaque lment de formulaire. Dans les lignes 1 5, les donnes initiales du
formulaire sont obtenues partir de page page2 asp, qui les a passes l'aide
des champs de formulaire masqus de page2.asp.
Dans les lignes 10 21, les champs de formulaire sont affichs. Notez l'ajout de
lattribut VALUE chaque champ de formulaire ; cet attribut sert A afficher les
donnes initialement saisies dans le formulaire.
Obtention de chanes de requte et de variables de formulaire
Vous avez vu ci-dessus comment utiliser la collection QueryString pour obtenir
des variables de chanes de requte et la collection Form pour obtenir des
variables de formulaire HTML. Il s'agit dans les deux cas de collections de
l'objet Request.
Dans certaines situations, on cherche obtenir une variable passe soit en tant
que variable de chane de requte, soit en tant que variable de formulaire. Il est
possible d'effectuer une recherche portant sur toutes les collections de l'objet
Request en ne spcifiant aucune collection particulire. Ainsi, la page ASP du
Listing 3.24 contient la fois un formulaire HTML et un lien hypertexte
contenant une chane de requte.
LISTING 3.24: Formulaire HTML et chane de requte

01. <HTML>
02. <HEAD><TITLE>Formulaire et chaine de requete<~TITLE></HEAD>
03. <BODY>
04. <a href="page2.asp?var=bonjour">cliquez ici<Ia>
05. <p>
06. <FORM method="POST" ACTION="page2.asp">
07. <INPUT name--"var" size="10">
08. <INPUT type="submit" value="OK">
09. </FORM>
10. </BODY>
11. </HTML>

Analyse
Le lien hypertexte et le formulaire HTML se rfrent tous deux la mme page,
page2.asp.
Tous deux contiennent galement une variable du mme nom, var. Lorsque le
visiteur clique sur le lien, la variable var est passe la page page2.asp avec la
valeur "bonjour"
Lorsque le formulaire est envoy, le texte saisi par l'utilisateur dans le champ de
formulaire var est pass la page page2.asp.
Dans la page page2.asp, vous pouvez ensuite rcuprer le contenu de la variable
var qu'il ai t pass l'aide d'une chane de requte ou d'un formulaire HTML.
Le Listing 3.25 montre comment rcuprer le contenu de la variable quelle que
soit la manire dont son contenu est pass.
LISTING 3.25 Obtention d'une chane de requte ou dune variable de formulaire

01. <HTML>
02. <HEAD><TITLE>Form and Query String</TITLE></HEAD>
03. <BODY>
04. <%
05. myvar = Request("myvar")
06. Response.Write myvar
07. %>
08. </BODY>
09. </HTML>

Analyse
Ligne 5, la variable var est obtenue l'aide de l'objet Request. La valeur de var
est affiche avec la ligne 6.
Aucune collection de l'objet Request n'ayant t spcifie ligne 5, la recherche
de l'lment myvar porte sur toutes les collections de l'objet Request (y compris
les collections QueryString et Form). La recherche dans les collections
s'effectue dans l'ordre suivant:
1. QueryString
2. Form
3. Cookies
4. ClientCertificate
5. ServerVariables
Plusieurs collections comprennent une variable du mme nom, l'objet Request
renverra la variable provenant de la premire collection o la variable a t trouve.
Info
La collection ServerVariables est traite ci-dessous, et a collection Cookies dans
le prochain chapitre. La collection ClientCertificate dpasse quant elle le cadre
de ce cours
Variables de serveur
La dernire partie de ce chapitre est consacre la collection ServerVariables.
Cette collection comprend un assortiment de variables reprsentant les en-ttes de
navigateur et 1es proprits des serveurs Web. Vous apprendrez utiliser la
collection ServerVariables pour dterminer le nom de la page ASP courante, le
nom de la page prcdemment visite par l'internaute, l'adresse IP de l'internaute
ainsi que le type de navigateur qu'il utilise.
Obtenir du nom de Ia page en cours
La collection ServerVariables comprend une variable nomme SCRIPT_NAME
qui reprsente le nom de la page ASP courante. Cette variable renvoie le chemin
virtuel de la page sur le serveur Web. Ainsi, le script du Listing 3.26 affiche son
propre nom.
LISTING 3.26: La variable de serveur SCRIPT_NAME

01. <HTML>
02. <HEAD><TITLE>Nom de la page</TITLE></HEAD>
03. <BODY>
04. Le nom de cette page est
05. <%= Request.ServerVariables("SCRIPT_NAME")%>
06. </BODY>
07. </HTML>

Analyse
La page du Listing 3.26 utilise la commande SCRIPT_NAME la ligne 5
pour renvoyer le nom et le chemin de la page. Ainsi, si le nom physique
complet de la page est d:\inetpub\wwwroot\pagesweb\pageweb.asp, la
variable SCRIPT_NAME renverra le chemin virtuel /pagesweb/pageweb.
asp.
La variable de serveur SCRIPT_NAME renvoie le chemin virtuel de la page
courante et non sur chemin physique. Pour renvoyer le chemin physique
d'une page, il existe deux moyens qu consistent soit employer la mthode
MapPath() de l'objet Server pour transformer le chemin virtuel en chemin
physique, soit faire appel la variable de serveur PATH_TRANSLATED.
Le script du Listing 3.27 montre l'utilisation de ces deux moyens pour
obtenir le chemin physique de la page courante.
LISTING 3.27: Obtention du chemin physique

01. <HTML>
02. <HEAD><TITLE>Nom de la page<~TITLE></HEAD>
03. <BODY>
04. Le nom de cette page est
05. <%
06. ' Renvoi du chemin physique avec Mappath()
07. chemin = Request.Servervariables("SCRIPT_NAME")
08. Response.Write Server.MapPath(chemin)
09. %>
10. <HR>
11. <%
12. Renvoi du chemin physique avec PATH_TRANSLATED
13. Response.Write Request.Servervariables( "PATH_TRANSLATED"
14. %>
15. <IBODY>
16. </HTML>

Analyse
Lignes 6 8, le chemin physique est renvoy l'aide de la mthode MapPath()
de l'objet Serveur. Ligne 7, le chemin virtuel de la page courante est obtenu
1'aide de la variable de serveur SCRIPT_NAME; ligne 8, le chemin virtuel est
transform en chemin physique et affich.
Lignes 12 et 13, le chemin physique de la page courante est obtenu partir de la
collection ServerVariables l'aide de la variable de serveur "PATH
TRANSLATED".
La variable de serveur SCRIPT_NAME est utile lors de la cration de sous-
programmes et de fonctions qui doivent tre utilises sur diffrentes pages.
Ainsi, vous souhaiterez peut-tre rer un formulaire d'erreur standard qui
renvoie la mme page. En utilisant la variable de serveur SCRIPT_NAME
dans ce formulaire, celui-ci pourra tre rendu indpendant de la page.
Identifier la dernire page visite
La collection ServerVariables peut tre utilise pour renvoyer la valeur de l'en-
tte REFERER du navigateur. L'en-tte REFERER contient le nom de la page
partir de laquelle le visiteur accd la page courante. II peut s'agir d'une page
de votre propre site Web ou de toute autre page d'Internet. La page ASP du
Listing 3.28 affiche la valeur de l'en-tte REFERER.
LISTING 3.28: Obtention de l'en-tte REFERER

01. <HTML>
02. <HEAD><TITLE>en-tte REFERER</TITLE></HEAD>
03. <BODY>
04. <% referrer=Request.Servervariables( "HTTP~REFERER" ) %>
05. Vous venez de la page <%=referer%>
06. </BODY>
07. </HTML>

La variable REFERER n'aura aucune valeur si le visiteur a saisi directement


l'adresse de la page dans le champ d'adresse de son navigateur. Par ailleurs, certains
navigateurs anciens r prennent pas en charge l'en-tte REFERER.
L'en-tte REFERER est utile pour savoir d'o viennent les visiteurs de votre site.
Cela peut par exemple vous permettre d'afficher un message spcifique aux
visiteurs provenant du Site Yahoo!
Identifier I'adresse Internet du visiteur
La variable de serveur REMOTE_ADDR permet d'obtenir l'adresse IP d'un
visiteur. Cette information peut tre utilise pour savoir partir de quels
fournisseurs d'accs se connectent linternautes. REMOTE ADD peut aussi limiter
l'accs de vos pages certains visiteurs.
La page ASP du Listing 3.29 utilise la variable REMOTE_ADDR pour afficher
l'adresse IP du visiteur.
LISTING 3.29: Obtention de 1'adresse IP d'un visiteur

01. <HTML>
02. <HEAD><TITLE>Addresse IP</TITLE><~HEAD>
03. <BODY>
04. <% IP = Request.ServerVariables("REMOTE_ADDR") %>
05. Votre adresse IP est <%=IP%>
06. </BODY>
07. </HTML>

Info
Il nest pas possible d'utiliser l'adresse IP d'un visiteur pour suivre ses
dplacement sur votre site. En effet, de nombreux fournisseurs d'accs
attribuent plusieurs adresse. P A un seul utilisateur. De ce fait, I'adresse IP du
visiteur peut changer chaque fois qu' accde une nouvelle page de votre site.

Identifier le navigateur du visiteur


II peut tre trs utile de connatre le type de navigateur utilis par le visiteur. Ainsi,
certaines balises HMTL telles que <MARQUEE> ou <IFRAME> sont reconnues
par Internet Explorer, mais pas par Netscape Navigator. Le fait d'identifier le
navigateur employ par votre visiteur vous permet ensuite de lui faire parvenir
diffrentes pages selon qu'il utilise Internet Explorer ou Netscape Navigator.
Pour identifier le type de navigateur utilis, faites appel a la variable de serveur
USER_AGENT La page ASP du Listing 3.30 montre comment est utilise cette
variable.
LISTING 3.30 Utilise de variable USER_AGENT

01. <HTML>
02. <HEAD><TITLE>Browser Type</TITLE></HEAD>
03. <BODY>
04. <% Navigateur = Request.ServerVariables( "HTTP_USER_AGENT" ) %>
05. Vous utilisez Te type de navigateur suivant: <%= Navigateur %>
06. </BODY>
07. </HTML>
Dans le cas d'un visiteur utilisant Internet Explorer 5 pour Windows NT, la chane
renvoye par l'en-tte USER_AGENT sera la suivante
Mozilla.4.0 (compatible; MSIE 5.0; Windows NT; DigExt)
Netscape Navigator 3.04 pour Windows NT renverra la valeur suivante
Mozilla/3.04 (WinNT; I) Netscape Navigator 4.0 pour Windows NT renverra la
valeur suivante Mozilla/4.07 (WinNT; I NaY) sufix, le navigateur Opera version
3.51 renverra la valeur Mozilla/4.0 (compatible; Opera l3.0; Windows NT 4.0) 3.51
En rsum
Prsentation
Dans ce chapitre, vous avez fait connaissance avec les deux fonctionnalits les plus
importantes des pages serveur la Rponse et la Requte. Vous avez appris utiliser
ces objets pour interagir avec les visiteurs de votre site Web.
Dans la premire partie, vous avez appris afficher du contenu dans le navigateur
du visiteur et manier la mthode Write de l'objet Response ainsi que les
dlimiteurs de script <%= %>. Vous avez galement appris utiliser la mthode
End de l'objet Response pour arrter excution d'un script ASP
Ensuite, nous nous sommes intresss aux collections lies aux requtes, celles qui
captent les chanes de requte, les lments de formulaire HTML et variables
serveur qui permet d'obtenir les en-ttes de navigateur et les proprits du serveur.
Questions/ Rponses
Q Y a-t-il une limite la quantit de donnes qu'il est possible de passer a
l'aide dune chane de requte ou d'une variable de formulaire?
R La rponse cette question dpend du navigateur. Les limites imposes par
Netscape et par Internet Explorer diffrent.
D'une manire gnrale, vitez de crer des chanes de requte d'une longueur
suprieure 1 000 caractres. Souvenez-vous galement que le codage des chanes
de caractres peut considrablement augmenter leur longueur; en effet, lors du
codage certains caractres sont convertis en plusieurs caractres. Ainsi, le point est
converti en une suite de trois caractres (%2E).
Les variables de formulaire permettent de passer des quantits d'informations
beaucoup plus importantes. Netscape Navigator permet de faire passer jusqu'
environ 30000 caractres dans une seule variable de formulaire ; dans Internet
Explorer il n'y apparemment pas de limite la longueur de la variable.
Q Est-il ncessaire de toujours spcifier une collection particulire lorsqu'on
utilise 1'objet Request?
R Lorsqu'on extrait one variable de formulaire nomme myvar de l'objet
Request, on peut employer au choix Request.Form ("myvar") ou
Request("myvar"). Lorsqu'on extrait une variable de chane de requte nomme
var, on peut employer au choix Request.QueryString("myvar") ou
Request("myvar").
Microsoft recommande de toujours spcifier la collection lors de l'extraction d'on
variable de l'objet Request. Lorsque vous spcifiez une collection particulire, la
recherche n'aura besoin de s'appliquer qu' cette collection et non toutes les autre.
Cependant, en pratique les bnfices en termes de performances sont ngligeables.
Si vous prfrez faire les choses dans les rgles, spcifiez systmatiquement la
collection; vous estes plus paresseux, vous pouvez omettre le nom de la collection
sans que cela a beaucoup de consquences.
Atelier
Presentation
Les questions et les exercices ci-dessous sont destins tester vos connaissances
sur les informations traites dans ce chapitre. Vous trouverez les rponses dans
lAnnexe "Rponses aux questions".
Testez vos connaissances
1. Existe-t-il une diffrence entre l'utilisation de la mthode Write de l'objet
Response dune part et celle des dlimiteurs <%= et %> d'autre part pour
envoyer du contenu au navigateur?
2. La page ASP ci-dessous passe la variable de chane de requte var qui a la
valeur Active Server Pages. Cependant, le script contient une erreur qui
l'empche de fonctionner correctement. Saurez-vous le corriger?
<html>
<head><title>Script corriger</title></head> <body>
<%
var = "Active Server Pages"
%>
<a href=page2.asp?var=<%=var%>">cliquez ici</a> </body>
</html>
3. Comment faire afficher au navigateur la chane "Elle lisait "La Chartreuse
de Parme" en utilisant la methode Write de l'objet Response ?
4. Comment faire en sorte qu'un script affiche toutes les variables de la
collection Form de l'objet Request?
Exercice
Crez une page ASP contenant on formulaire HTML permettant de saisir des
informations sur un produit (nommez cette page infosproduit.asp). Le formulaire
HTML contiendra deux champs de formulaire nommes nomproduit et prixproduit.
Le contenu du formulaire doit tre envoy une page nomme infosproduits.asp.
Crez ensuite un script ASP dans la page infosproduit2.asp qui vrifie que les
champs nomproduit et prixproduit ont tous deux une valeur. Si l'un ou l'autre de ces
champs est vide, le formulaire HTML permettra de revenir la page
infosproduits.asp (ce formulaire rendra les informations initialement saisies dans le
premier formulaire). Dans le cas contraire, affichez le message "Les informations
produit ont bien t enregistres.".
Annexe- Installation de EasyPHP et premiers pas
en PHP1
Installer EasyPHP
Tlcharger EasyPHP sur le site www.easyphp.org
Double cliquer sur l'executable tlcharg
Slectionner le rpertoire d'installation et suivre la procdure
Lancer EasyPHP
On ne peut pas proprement parler du lancement d'EasyPHP, il s'agit en fait de la
mise en route du serveur Apache et de MySQL. A l'installation, un raccourci vers
EasyPHP est cr dans le rpertoire "Dmarrer/Programmes/EasyPHP". Une fois
EasyPHP lanc, une icone se place dans la barre des tches cot de l'horloge. Un
clic droit permet d'accder diffrents menus :
Fichier Log : renvoie aux erreurs gnres par Apache et MySQL
Configuration : donne accs aux diffrentes configurations d'EasyPHP
Administration : ouvre la page d'administration des alias et du rpertoire
des bases de donnes.
Web local : ouvre le web local
Dmarrer/Arrter : dmarre/arrte Apache et MySQL
Redmarrer : redmarre Apache et MySQL
Quitter : ferme EasyPHP
Utiliser le rpertoire www ou les alias Pour que vos pages PHP soient
interprtes, il est impratif de placer vos fichiers dans le rpertoire www ou dans
un alias que vous avez cr. Pour visualiser vos pages il vous suffit alors d'ouvrir le
"web local" ou d'accder vos alias via la page d'administration.
Vos premires pages en PHP
Il existe autant de faon de programmer en PHP qu'il existe d'diteurs spcialiss
ou non (diteurs html, coloration synthaxique, saisie semi-automatique ...). Nous
allons, dans cet exemple, utiliser un simple diteur de texte (ex. : notepad).
Ouvrez un nouveau fichier

1
Source : Manuel dinstallation de EasyPHP.
Tapez la structure d'une page HTML vierge :
<html>
<head>
<title>Ma premire page en PHP</title>
</head>
<body>
</body>
</html>

L'exemple consiste afficher la date courante. Le code PHP s'intgre


directement au code HTML et commence par <? (ou <?php) et se termine
par ?>. Affichage de la date courante :
<html>
<head>
<title>Ma premire page en PHP</title>
</head>
<body>
Date courante : <? print (Date("l F d, Y")); ?>
</body>
</html>

Enregistrement de la page.
Crez un nouveau rpertoire dans le rpertoire www (ou dans un alias).
Enregistrez votre premire page en PHP en lui donnant une des extensions
suivantes : php, php3, php4.
Ceci n'est pas une rgle absolue, mais correspond la configuration
d'EasyPHP. Il vous sera peut-tre ncessaire, si vous choisissez d'hberger
vos pages chez un hbergeur dont la configuration est diffrente, de modifier
ces extensions.
Pour notre exemple on choisit une extension en .php : "date.php"
Visualisation du rsultat.
Pour fixer les esprits
A NE PAS FAIRE : aller dans le rpertoire www (ou dans le rpertoire d'un
alias) puis dans le rpertoire correspondant votre projet et double cliquer
sur votre page d'exemple. Vous obtiendrez coup sr une page d'erreur.
A FAIRE : lancer EasyPHP, ouvrir le "web local", slectionner votre
rpertoire de travail puis cliquer sur "date.php". Vous obtiendrez alors une
page qui vous affichera la date courante; par exemple : "Date courante :
Sunday May 13, 2001".
A vous maintenant de crer vos propres dveloppements.
4
Chaptre

Mise en place dun catalogue de


produits1
Sommaire
Objectifs
Crer une base de donnes pour un magasin en ligne.
Crer une table de produits pour stocker les informations sur les produits.
Se connecter une base de donnes partir d'une page serveur
Utiliser des scripts serveur pour ajouter de nouveaux produits a la base de
donnes
Utiliser des scripts serveur pour modifier les informations existantes sur les
produits
Prsentation
Dans ce chapitre, vous allez aborder la mise en place de votre magasin en ligne.
Vous verrez comment crer et grer une gamme de produits 1'aide de scripts
serveur, et apprendrez quelques techniques trs utiles dans le contexte de la gestion
d'une base de donnes.

Cration de la base de donnes du magasin


Prsentation
La premire tape de la cration dun magasin en ligne est la cration d'une base de
donnes qui stockera toutes les informations concernant vos produits. Dans ce

1
Ce support de cours utilise et adapte le texte de S. Walther et J. Levine "E-Commerce,
programmation avec ASP3" (Campus Press, Paris, 2000) dautres technologies (PHP et JSP) qui
sont ouvertes et permettent aux tudiants de mettre en ligne des applications de e-commerce
gratuitement.
cours, nous ferons appel des bases de donnes Access et MySQL, mais les scripts
serveur de ce chapitre et des chapitres suivants de ce cours devraient fonctionner
avec d'autres bases de donnes; il vous suffira le cas chant d'y apporter quelques
modifications mineures. Vous pourrez par exemple les faire fonctionner trs
facilement avec des bases de donnes SQL Server ou Oracle.
Attention
Microsoft Access n'est pas une base de donnes approprie que pour tester un
site ou pour un site a faible frquentation. Si vous pensez que votre site sera trs
frquent vous devriez sans doute envisager de passer Microsoft SQL Server
ou MySQL.
La transformation d'une base de donnes Access en base de donnes SQL
Server se fait trs facilement avec les outils de mise a jour fournis par
Microsoft. Ceux-ci sont livrs avec Access 2000. Si vous utilisez Access 97,
vous pouvez les tlcharger a partir de Iadresse
http://officeupdate.microsoft.com/France /downloadcatalog/dtdaccess.asp
(faites dfiler la page jusqu'en bas pour trouver le fichier).

Cration dune base de donnes Access


1. Suivez les tapes ci-dessous pour crer une nouvelle base de donnes
Access
2. Lancez Access en choisissant Dmarrer, Programmes, Microsoft Access.
3. Dans la boite de dialogue qui apparat, choisissez 1'option Nouvelle base
de donnes Access (voir Figure 4.1).
FIGURE 4.1 - Cration d'une nouvelle base de donnes.
4. Dans la boite de dialogue Fichier Nouvelle base de donnes, nommez votre
base de donnes shopDB et enregistrez votre nouvelle base de donnes sur
votre disque dur (mmorisez l'endroit o vous l'avez enregistre !).
Une fois ces tapes effectues, vous disposez sur votre disque dur d'un nouveau
fichier nomm shopDB.mdb. Cette base de donnes vous servira stocker des
informations sur vos produits, vos utilisateurs et vos commandes.
Cration dune base de donnes MySQL
La collection EasyPhp vien avec un program crit en php qui permet de grer les
bases de donnes en ligne. Le programme sappelle phpMyAdmin et il est utilis
par le service de gestion de bases de donnes disponible sur Internet chez free.fr.
Vous lancez ce programme avec le navigateur web en tapant :
http://localhost/mysql/ pour linstallation locale et http://sql.free.fr/ pour le service
disponible chez free.fr.
FIGURE 4.2 - Cration d'une nouvelle base de donnes MySQL

Assurer laccs un service de bases de donnes accessible par des pages serveur
est ce qui distingue actuellement les fournisseurs dapplications (ASP
Application Service Providers) des simples fournisseurs de services Internet (ISP
Internet Service Providers)
Les ASP comme free.fr offrent une base de donnes chaque utilisateur qui fait la
demande, la base portera le nom de lutilisateur tel quenregistr avec le
fournisseur daccs.

Cration de la table Produits


Prsentation
Si vous avez suivi les paragraphes prcdents, vous avez cr une nouvelle base de
donnes Access et MySQL. Cependant, une base de donnes seule nest pas d'une
grande utilit. Avant de pouvoir stocker des informations dans une base de
donnes, vous devez y ajouter une ou plusieurs tables de base de donnes.
Une table de base de donnes est structure de la mme faon qu'une feuille de
calcul ou qu'un livre de comptes. Elle contient une ou plusieurs lignes divises en
une ou plusieurs donnes. Chaque colonne ou champ a un nom et sert enregistrer
un type particulier d'information. Chaque ligne reprsente un enregistrement de
base de donnes.
Les champs de la table produits
Si les informations sur les produits du magasin en ligne taient stockes dans une
table de base donnes nomme produits, cette table comprendra les huit colonnes
suivantes:
id : Cette colonne contient un identificateur numrique unique pour chaque
produit de la table.
nom : Cette colonne contient le nom du produit, par exemple Panier
Cadeau.
prix : Cette colonne contient le prix du produit, par exemple 22,5 euros;
image : Cette colonne contient le chemin de l'image du produit.
categorie : Cette colonne contient la catgorie du produit. Dans le cas d'une
librairie en ligne, par exemple, cette colonne pourra contenir des valeurs
telles que roman policier ou bande dessine.
courtedesc : Cette colonne contient une description rapide du produit, par
exemple : ce panier cadeau contient une bouteille de sauternes et un foie
gras d'oie mi-cuit.
longuedesc : Cette colonne contient une description complte du produit. Il
peut s'agir d'une page entire d'informations.
statut : Cette colonne contient des informations sur le statut actuel du
produit. Elle pourra par exemple indiquer qu'un produit ne doit pas,
provisoirement, tre propos la vente.
Crer la table produits avec Access
Pour crer la table produits, procdez comme suit
1. Si Access n'est pas ouvert, lancez-le en choisissant Dmarrer, Programmes,
Microso-Access. Slectionnez l'option permettant d'ouvrir un fichier
existant, puis slectionnez la base de donnes shopDB.
2. Une fois la base de donnes shopDB ouverte, double-cliquez sur l'option
Crer une table en mode Cration. La fentre de la Figure 4.3 apparat.
FIGURE 4.3 Cration d'une table en mode Cration

3. Entrez les informations appropris dans la table (laissez vide la colonne


Description).
4. Faites de la colonne id la cl primaire en slectionnant cette colonne dans
la grille et en cliquant sur l'icne cl primaire (la cl).
5. Enregistrez la nouvelle table en cliquant sur l'icne d'enregistrement (la
disquette) et en choisissant le nom Produits.
FIGURE 4.4 - Cration de la table produits en ligne sur MySQL

(avec phpMyAdmin )

Cration de la table produits en ligne sur MySQL (avec phpMyAdmin )


CREATE TABLE `produits` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`nom` TEXT NOT NULL,
`prix` FLOAT NOT NULL,
`image` TEXT NOT NULL,
`categorie` TEXT NOT NULL,
`courtdesc` BLOB NOT NULL,
`longuedesc` BLOB NOT NULL,
`statut` INT NOT NULL
);

Usages de la table
Vous venez de crer une table nomme produits. Chaque ligne de la table
reprsentera un produit particulier du magasin en ligne. Dans le reste de ce
chapitre, nous verrons comment utiliser des scripts serveur pour se connecter la
base de donnes et modifier les informations qui y sont contenues.

Connexion une base de donnes


Utilisation des DSN
Dans cette partie, vous verrez comment ouvrir une connexion avec une base de
donnes laide d'un script serveur. Cependant, avant de pouvoir ouvrir cette
connexion, vous devez fournir la page serveur des informations sur
l'emplacement physique de la base de donnes. En d'autres termes, vous devez
fournir au script une mthode lui permettant de trouver la base de donnes sur le
disque dur. L'une des mthodes pour y parvenir est de faire appel DSN (Data
Source Name).
Plusieurs types de DSN peuvent tre cres. Si vous crez un DSN fichier (File
DSN), Les informations de connexion la base de donnes seront stockes dans un
fichier. Si vous crez un DSN systme (System DSN), les informations de
connexion seront stockes dans la base de registre de l'ordinateur.
Il ny a pas de raison particulire d'utiliser un type de DSN plutt qu'un autre; tous
deux fonctionnent parfaitement bien. Dans le cas prsent, nous crerons un DSN
systme.
Cration dun dun DSN pour un pilote de base de donnes (ODBC)
1. Ouvrez le panneau de configuration en choisissant Dmarrer, Paramtres,
Panneau de configuration.
2. Double-cliquez sur l'icne source de donnes ODBC.
3. Slectionnez 1'onglet DSN systme, puis cliquez sur Ajouter
4. Slectionnez Microsoft Access Driver et cliquez sur Terminer
5. Dans la boite de dialogue installation ODBC pour Microsoft Access,
cliquez sur le bouton slectionner et retrouvez la base de donnes shopDB
sur votre disque dur (la base de donnes que vous avez cre plus haut).
Cliquez sur OK.
6. Dans le champ nom de la source de donnes, entrez accessShopDSN et
cliquez sur OK (voir Figure 4.4).
7. Cliquez sur OK pour refermer la boite de dialogue Administrateur de
source de donnes ODBC.
FIGURE 4.5 Creation dun DSN en Windows.
Une fois ces oprations effectues, vous avez cre un nouveau DSN systme
nomm accessShopDSN. Vous n'avez besoin de crer qu'un seul DSN par base de
donnes utilise dans vos scripts. Une fois le DSN cr, tous vos scripts peuvent
utiliser le mme DSN pour se connecter la base de donnes. Cependant, si vous
dplacez votre base de donnes, vous devrez mettre jour le DSN en rptant la
procdure ci-dessus.

Info
La procdure permettant de crer un DSN pour une base do donnes SQL
Server Oracle ressemble beaucoup a celle dcrite ci-dessus. Ainsi, pour crer un
DSN pour une base de donnes SQL Server, il vous suffira de choisir SQL
Server Driver ltape 4. Vous devrez galement fournir un login et un mot de
passe SQL Server.
Connexion une base de donnes (ODBC) en ASP
Maintenant que vous avez cr un DSN, vous pouvez l'utiliser pour ouvrir une
connexion avec la base de donnes. Pour crer une connexion, vous devez utiliser
un objet de donnes ActiveX ou ADO (ActiveX Data Object). L'ADO est une
collection d'objets permettant des scripts ASP d'interagir avec des bases de
donnes. Il s'agit d'objets ActiveX pouvant tre utiliss de la mme faon que
n'importe quel composant ASP, par exemple le composant File Access.
Dans une page ASP, une connexion une base de donnes est reprsente par
l'objet ADO Connection. Le Listing 4.1 montre comment utiliser l'objet
Connection avec le DSN que nous venons de crer pour ouvrir une connexion avec
une base de donnes.
LISTING 4.1 Connexion une base de donnes

<%
Set Con = Server.CreateObject("ADODB.Connection")
Con.Open "accessShopDSN"
%>

Analyse
Ce script ouvre une connexion avec [a base de donnes Access shopDB en
faisant appel au DSN accessShopDSN. Ligne 2, une instance de l'objet
Connection est cre. Ligne 3, la connexion la base de donnes est ouverte
l'aide de la mthode open de l'objet Connection.
Dfinition de la connexion une base de donnes avec Dreamweaver en
utilisant le DSN
FIGURE 4.6 Connexion une base de donnes avec Dreamweaver

Usages de la connexion
Ouverture d'une connexion avec une base de donnes peut tre compare
l'tablissement d'une connexion avec un fournisseur d'accs Internet. Une fois la
connexion tablie, des messages peuvent tre envoys dans les deux sens entre le
script ASP et la base de donnes. Vous pouvez par exemple passer un message du
script a la base de donnes pour lui indiquer d'insrer un nouvel enregistrement ou
de mettre a jour une information donne. Dans les deux sections ci-dessous, vous
verrez comment passer ce type de message.

Ajout de produits la table Produits


Prsentation
Les bases de donnes ncessitent d'utiliser un langage spcifique. Pour obtenir
quelque chose d'une base de donnes, vous devez lui parler "dans sa langue". Le
langage de la plupart des bases de donnes modernes, est le SQL (pour Structured
Query Language langage de requte structure).
Ainsi, pour ajouter un nouvel enregistrement a une table de base de donnes
partir d'une page serveur, vous devez d'abord ouvrir une connexion avec la base de
donnes, puis envoyer la base de donnes une chane lui demandant d'insrer un
nouvel enregistrement. Pour insrer un nouvel enregistrement dans une base de
donnes, on fait appel a l'instruction SQL INSERT INTO.
Scripts pour insrer un enregistrement
Le script du Listing 4.2 insre un nouvel enregistrement dans la table produits.
Listing 4.2: Insertion d'un nouvel enregistrement

ASP JSP PHP

01. <% 01. <% Driver 01. <?


02. Set conn = mysql_driver = 02. $conn =
Server.CreateObject("AD 02. (Driver)Class.forName("or mysql_pconnect('localhost
ODB.Connection") g.gjt.mm.mysql.Driver").ne ', 'root', '')
03. conn.Open "accessDSN" wInstance(); 03.
04. sqlString = "INSERT INTO 03. Connection conn = 04. sqlString = "INSERT INTO
produits (nom, prix ) " DriverManager.getConnec produits (nom, prix ) ".
05. "values ( 'Panier cadeau', tion("jdbc:mysql://localhost 05. "values ( 'Panier cadeau',
149.5 )" :3306/shopDB",root,); 149.5 )"
06. Con.Execute sqlString 04. sqlString = "INSERT INTO 06. mysql_query($sqlString ,
07. Con.close produits (nom, prix ) "+ $conn);
08. %> 05. "values ( 'Panier cadeau', 07. ?>
149.5 )"
06. PreparedStatement
statement =
conn.prepareStatement(s
qlString);
07. statement.executeUpdate(
);
08. conn.close();

Analyse ASP
Ce script insre un nouveau produit dans la table produits. Les lignes 2 et 3
ouvrent une connexion avec la base de donnes. Ligne 5, une chane
contenant l'instruction SQL INSERT INTO est affecte la variable
sqlString. L'instruction SQL est excute ligne 7. Ligne 8 enfin, la
connexion avec la base de donnes est referme.
Analyse PHP
Ce script insre un nouveau produit dans la table produits. La ligne 2 ouvre
une connexion avec la base de donnes. Ligne 4, une chane contenant
l'instruction SQL INSERT INTO est affecte la variable sqlString.
L'instruction SQL est excute ligne 6.
Analyse JSP
Ce script insre un nouveau produit dans la table produits. Les lignes 1 et 2
crent un nouvelle instance du pilot jdbc pour mysql. La 3 ouvrent une
connexion avec la base de donnes. Ligne 5, une chane contenant
l'instruction SQL INSERT INTO est affecte la variable sqlString. Un
objet instruction SQL est cre sur la ligne 7 et excut sur la ligne 8. Ligne 9
enfin, la connexion avec la base de donnes est referme.
La syntaxe de base de l'instruction SQL INSERT INTO est trs simple
INSERT INTO nom_table ( liste_colonnes ) VALUES ( liste_valeurs).
nom_table permet d'indiquer a quelle table le nouvel enregistrement doit tre ajout
liste_colonnes permet d'indiquer la ou les colonnes de la table concernes, et
liste_valeurs la ou les valeurs affecter ces colonnes. Les colonnes et les valeurs
doivent tre indiques dans le mme ordre et spares par des virgules.
Lorsque vous insrez des chanes de caractres, des dates ou des heures, les valeurs
doivent tre places entre guillemets. Pour des valeurs numriques, n'utilisez pas de
guillemets.
Si vous excutez le script du Listing 4.2, vous pouvez vous assurer que le nouveau
produit sera ajout la table produits dans Access. Lancez Access, ouvrez la base
de donnes shopDB double-cliquez sur la table Produits. Vous devriez voir
s'afficher l'cran lenregistrement avec les valeurs prvues au Listing 4.2.
Utilisation de variables
La variable sqlString utilisant une chane de caractres comme valeur, celle-ci peut
tre cre de manire dynamique. Le script du Listing 4.3 effectue exactement la
mme opration que le prcdent, ceci prs que la chane y est cre partir de
variables pour les valeurs des colonnes.
LISTING 4.3 Insertion d'un nouvel enregistrement a l'aide de variables

ASP JSP PHP


01. <% 01. <% Driver 01. <?
02. Set conn = mysql_driver = 02. $conn =
Server.CreateObject("AD 02. (Driver)Class.forName("or mysql_pconnect('localhost
ODB.Connection") g.gjt.mm.mysql.Driver").ne ', 'root', '')
03. conn.Open "accessDSN" wInstance(); 03. $nomproduit = Panier
04. nomproduit = Panier 03. Connection conn = cadeau
cadeau DriverManager.getConnec 04. $prixproduit = 149.50
05. prixproduit = 149.50 tion("jdbc:mysql://localhost 05.
06. sqlString = "INSERT INTO :3306/shopDB",root,); 06. $sqlString = "INSERT
produits (nom, prix ) 04. String nomproduit = INTO produits (nom, prix
values ( '" & nomproduit & Panier cadeau ) values ( '". $nomproduit.
"', '" & prixproduit & "')" 05. String prixproduit = ', . $prixproduit . )"
07. Con.Execute sqlString 149.50 07.
08. Con.close 06. String sqlString = 08.
09. %> "INSERT INTO produits 09. mysql_query($sqlString ,
(nom, prix ) "values ( '"+ $conn);
nomproduit +"', '" + 10. ?>
prixproduit + "')"
07. PreparedStatement
statement =
conn.prepareStatement(s
qlString);
08.
09.
statement.executeUpdate(
);
10. conn.close();
Analyse ASP, JSP et PHP
Ce script, comme le prcdent, insre un nouveau produit dans la table
Produits. Cependant, deux variables, nomproduit et prixproduit, servent
stocker les valeurs qui seront ajoutes la base de donnes. Ligne 7, la
variable sqlString reoit une chane construite avec des variables nomproduit
et prixproduit. Ligne 9, enfin, la chane sqlString est excute, et un nouveau
produit est ajoute la base de donnes.
Vous avez peut-tre remarqu que les valeurs affectes la colonne nom
sont mises entre apostrophes, ce qui nest pas le cas pour les valeurs
affectes a la colonne prix. Access utilise les apostrophes de la mme
manire que le VBScript ou le HTML utilisent les guillemets. Ils permettent
d'indiquer le dbut et la fin dune chane. Nom tant une colonne de texte,
vous devez utiliser des apostrophes pour affecter tine valeur a cette colonne.

Cration dune application catalogue produits avec


Dreamweaver
Lapplication catalogue produits devra excuter les taches suivantes
Permettre ladministration du catalogue
Assurer la prsentation du catalogue dans des formats multiples
Ladministration du catalogue doit permettre :
Lajout de nouveaux produits et
La mise jours des informations sur des produits dj prsents dans le
catalogue
La prsentation pourrait se faire sous forme de :
Collection de plusieurs produits sur une page de catalogue ou comme
Fiches de produits o chaque produit occupera une page du catalogue
Toutes les tches voques font partie des tches les plus frquentes dans les
applications lies des bases de donnes et qui pour cette raison sont dj
automatises dans des logiciels de cration dapplication web comme
Dreamweaver.
Dans Dreamweaver on peut insrer ce que lon apple des "objets dapplication"
qui crent des pages serveur adapte chacune des tches voques. Les "objets"
disponibles partir du menu Insrer sont prsentes dans la Figure 4.7
FIGURE 4.7 Objets dapplication disponibles en Dreamweaver

Cration dune application pour ajouter des


produits au catalogue
Prsentation
Dans cette section, nous verrons comment crer un formulaire qui vous permettra
d'ajouter facilement des produits a votre magasin en ligne.
La page nomme addProduits.xxx2 sera cre. Elle contiendra un formulaire HTML
permettant de saisir les informations concernant le produit et ajoute le nouveau
produit a la base de donnes.
Dmarche suivre
Vous pouvez insrer les lments de base d'une page d'insertion en une seule
opration l'aide de l'objet dynamique Formulaire d'insertion d'enregistrement. Cet
objet insre dans la page un formulaire HTML et un comportement de serveur
Insrer l'enregistrement.
Vous avez galement la possibilit d'insrer ces lments sparment l'aide des
outils de formulaire et du panneau Comportements de serveur.
Aprs avoir plac les lments sur la page, vous pouvez personnaliser le formulaire
votre convenance l'aide des outils de conception de Dreamweaver ou modifier
le comportement Insrer l'enregistrement l'aide du panneau Comportements de
serveur.
Pour crer la page d'insertion l'aide de l'objet dynamique Formulaire
d'insertion d'enregistrement :
1. Ouvrez la page en mode Cration, puis choisissez Insertion > Objets
d'application > Formulaire d'insertion d'enregistrement.La bote de
dialogue Insrer le formulaire d'insertion d'enregistrement s'affiche.

2
Lextention .xxx signifie asp, jsp ou php.
2. Compltez les options de la bote de dialogue et cliquez sur OK (les figures
sont dans la prochaine page).
Rsultats
Dreamweaver insre dans la page un formulaire HTML et un comportement de
serveur Insrer l'enregistrement. Les objets de formulaire sont disposs sur la page
sous forme de tableau simple, que vous pouvez ensuite aisment personnaliser
l'aide des outils de conception de page de Dreamweaver (assurez-vous qu'aucun
objet de formulaire ne dpasse les limites du formulaire).
Pour modifier le comportement de serveur, ouvrez le panneau Comportements de
serveur (Fentre > Comportements de serveur) et double-cliquez sur le
comportement Insrer un enregistrement.
La page addProduits.asp qui rsulte comprend un formulaire HTML normal avec
des champs correspondant aux colonnes de la table Produits.
FIGURE 4.8 Boite de dialogue pour configurer une page dinsertion laide de
l'objet dynamique Formulaire d'insertion d'enregistrement
FIGURE 4.9 Page dinsertion des produits au catalogue

Cration dune application pour mettre jour


les produits dun catalogue
Prsentation
Dans cette section, nous verrons comment crer un formulaire qui vous permettra
de mettre jour facilement les produits de votre magasin en ligne.
La page nomme updateProduits.xxx sera cre. Elle contiendra un formulaire
HTML permettant de modifier les informations concernant le produit qui le
numro didentification (rfrence) indiqu dans la chane de requte.
Dmarche suivre3
l'objet dynamique Formulaire de mise jour des enregistrements. Cet objet insre
dans la page un formulaire HTML et un comportement de serveur Mettre jour
l'enregistrement.
Pour que vous puissiez utiliser l'objet dynamique, il faut que votre application Web
soit capable d'identifier l'enregistrement mettre jour et que votre page de mise
jour soit en mesure de le rcuprer.
Vous avez galement la possibilit d'insrer sparment le formulaire HTML et le
comportement de serveur Mettre jour l'enregistrement dans la page l'aide des
outils de formulaire et du panneau Comportements de serveur.
Aprs avoir plac les objets dynamiques sur la page, vous pouvez utiliser les outils
de conception de Dreamweaver pour personnaliser le formulaire ou le panneau
Comportements de serveur pour modifier le comportement de serveur Mettre jour
l'enregistrement.

3
adapt du systme daide de Dreamweaver.
Pour crer la page de mise jour l'aide de l'objet dynamique Formulaire de
mise jour des enregistrements :
1. Ouvrez la page en mode Cration, puis choisissez Insertion > Objets
d'application > Formulaire de mise jour des enregistrements. La bote de
dialogue Insrer le formulaire de mise jour des enregistrements s'affiche.
2. Compltez les options de la bote de dialogue et cliquez OK (les figures
sont dans la prochaine page).
Rsultats
Cet objet insre dans votre page un formulaire HTML et un comportement de
serveur Mettre jour l'enregistrement. Les objets de formulaire sont disposs sur la
page sous forme d'un tableau simple, que vous pouvez ensuite personnaliser l'aide
des outils de conception de page de Dreamweaver (assurez-vous qu'aucun objet de
formulaire ne dpasse les limites du formulaire).
1. Pour modifier le comportement de serveur, ouvrez le panneau Comportements
de serveur (Fentre > Comportements de serveur) et double-cliquez sur le
comportement Mettre jour l'enregistrement.
La page updateProduits.asp qui rsulte comprend un formulaire HTML normal
avec des champs correspondant aux colonnes de la table Produits.
FIGURE 4.10 Boite de dialogue pour configurer une page de mise jour l'aide
de l'objet dynamique Formulaire de mise jour des enregistrements
FIGURE 4.11 Page de mise jour des produits au catalogue

Prsentation du catalogue en ligne


Prsentation
La prsentation laide de pages web dynamiques (ou pages serveur) des produits
enregistrs dans une table de la base de donnes peut prendre des formes multiples.
Ici on montre deux qui semblent tre les plus frquentes. Il sagit de la collection
de plusieurs produits sur une page de catalogue ou de fiches de produits ou chaque
produit occupera une page de la prsentation en ligne.
Dmarche suivre pour obtenir un tableau dynamique4
Pour arriver obtenir ces prsentations il existe en Dreamweaver qui objet serveur
nom tableau dynamique qui offre un format unique de prsentation, qui peut
ensuite tre modifi afin dobtenir des prsentation varies.
L'objet de serveur Tableau dynamique permet de crer un tableau renfermant un
contenu dynamique et d'appliquer le comportement Rgion rpte partir d'une
seule bote de dialogue. Cet objet de serveur est particulirement utile, car il insre
le contenu dynamique d'un jeu d'enregistrements dans le tableau et applique
simultanment le comportement de serveur Rgion rpte.

4
adapt du systme daide de Dreamweaver.
Pour crer un tableau dynamique :

1. Choisissez Insertion > Objets d'application > Tableau dynamique. La bote


de dialogue Tableau dynamique s'affiche.

FIGURE 5.12 - bote de dialogue pour configurer un Tableau dynamique

2. Dans le menu droulant Jeu d'enregistrements, slectionnez le jeu


d'enregistrements utiliser.
3. Slectionnez le nombre d'enregistrements afficher sur chaque page (un
enregistrement la fois permet obtenir des fiches avec un enregistrement
par page).
4. A ce stade, vous pouvez taper les valeurs des bordures du tableau, de la
marge intrieure des cellules et de l'espacement entre les cellules.

La bote de dialogue Tableau dynamique mmorise les valeurs spcifies pour les
bordures du tableau, la marge intrieure des cellules et l'espacement entre les
cellules. Dans le cas de projets qui requirent plusieurs tableaux dynamiques
d'aspect semblable, vous pouvez taper les valeurs de mise en forme du tableau pour
simplifier le dveloppement des pages. Une fois le tableau insr, vous pouvez
toutefois ajuster ces valeurs l'aide de l'inspecteur de proprits du tableau.

5. Cliquez sur OK.

Rsultats
Un tableau et des espaces rservs destins au contenu dynamique dfini dans le
jeu d'enregistrements associ s'insrent sur la page. Le nom de chaque lment
d'enregistrement se place dans la ligne de titre du tableau. Vous pouvez remplacer
les titres par tout texte descriptif ou image pertinente.
La deuxime ligne intgre une Rgion rpte contient les champs du jeu
denregistrements. La rgion rpte est le comportement serveur qui permet
dafficher dans une page plusieurs enregistrements fois en provenance du jeu
denregistrements selon le nombre indiqu dans la boite de dialogue qui dfini le
Tableau dynamique.
FIGURE 4.13 Vue (en mode dition de Dreamweaver) dune page qui contient un
tableau dynamique

Dmarche suivre pour obtenir une barre de navigation du jeu


d'enregistrements5
Vous pouvez crer en une seule opration une barre de navigation de jeu
d'enregistrements l'aide du comportement de serveur correspondant. Elle permet
de naviguer parmi les pages du catalogue en ligne.
Cet objet de serveur ajoute les lments suivants la page :
Un tableau HTML comportant des liens texte ou image.
Un jeu de comportements de serveur Dplacer vers .
Un jeu de comportements de serveur Afficher la rgion .
La version texte de la barre de navigation du jeu d'enregistrements ressemble
ceci :

La version image de la barre de navigation du jeu d'enregistrements ressemble


ceci :

5
adapt du systme daide de Dreamweaver.
Avant de placer la barre de navigation dans la page, assurez-vous que la page
contient un jeu d'enregistrements dans lequel naviguer et une mise en forme pour
afficher les enregistrements.
Aprs avoir plac la barre de navigation sur la page, vous pouvez utiliser les outils
de conception de Dreamweaver pour la personnaliser votre convenance. Vous
pouvez galement modifier les comportements de serveur Dplacer vers et
Afficher la rgion en double-cliquant dessus dans le panneau Comportements
de serveur.
Pour crer la barre de navigation de jeu d'enregistrements l'aide de l'objet
de serveur :
1. En mode Cration, placez le point d'insertion l'endroit de la page o vous
souhaitez que la barre de navigation apparaisse.
2. Ouvrez la bote de dialogue Barre de navigation du jeu d'enregistrements
(Insertion > Objets d'application > Barre de navigation du jeu
d'enregistrements). La bote de dialogue Barre de navigation du jeu
d'enregistrements s'affiche.
3. Dans le menu droulant Jeu d'enregistrements, slectionnez le jeu
d'enregistrements dans lequel naviguer.
4. Dans la section Afficher l'aide de, slectionnez le format d'affichage des
liens de navigation sur la page. L'option Texte place des liens texte sur la
page, tandis que l'option Images permet d'utiliser des images graphiques.
Dans la version image de la barre de navigation, Dreamweaver utilise ses propres
fichiers d'image. Une fois que la barre se trouve sur la page, vous pouvez
nanmoins les remplacer par les vtres.
5. Cliquez sur OK.
Le tableau qui se cre contient des liens texte ou image permettant l'utilisateur,
lorsqu'il clique dessus, de se dplacer dans le jeu d'enregistrements slectionn.
Lorsque le premier enregistrement du jeu s'affiche, les liens ou images Premier
et Prcdent sont masqus. Lorsque le dernier enregistrement du jeu s'affiche,
les liens ou images Suivant et Dernier sont masqus.
Rsultats
Vous pouvez personnaliser la mise en forme de la barre de navigation l'aide des
outils de conception de Dreamweaver.
A laide dun tableau dynamique et dun barre de navigation du jeu
denregistrement, en modifiant la mise en forme, on obtient des prsentations
varies pour les pages dun catalogue en ligne.
Quand on choisit un tableau dynamique qui affiche plusieurs enregistrements la
fois on obtient une page de catalogue qui prsente une collection de plusieurs
produits comme dans la figure suivante:
FIGURE 4.14 Page catalogue o le tableau dynamique affiche plusieurs
enregistrements la fois

Quand le tableau dynamique choisit prvoit un seul enregistrement la fois on


obtient des fiches de produits o chaque produit occupera une page de la
prsentation en ligne. Voici un exemple :
FIGURE 4.15 Page catalogue o tableau dynamique affiche un seul
enregistrement la fois
En rsum
Prsentation
Dans ce chapitre, vous avez vu comment interagir avec une base de donnes 1'aide
de scripts serveur. Vous avez d'abord appris comment crer une nouvelle base de
donnes et comment tablir une connexion avec celle-ci.
Ensuite, vous avez vu comment ajouter des produits votre magasin en ligne via
des pages ASP en faisant appel a' l'instruction SQL INSERT INTO pour ajouter de
nouvelles lignes la table de la base de donnes. Pour finir, vous avez cr des
pages serveur permettant de mettre jour des informations de produit existantes en
utilisant linstruction SQL UPDATE.

Questions/ Rponses
Q Lors de la connexion une base de donnes partir d'une page serveur,
j'obtiens l'erreur "Source de donnes non trouve et nom de pilote non spcifi.
D'ou provient cette erreur?
R Vous verrez s'afficher cette erreur si votre DSN n'est pas correctement
configur. A partir de l'icne Sources de donnes ODBC du panneau de
configuration, vrifiez que vous avez bien cre un DSN. Assurez-vous ensuite que
vous n avez pas fait de faute de frappe en saisissant le nom du DSN dans le script.
Q Y a-t-il une limite au nombre de produits quil est possible de proposer dans
mon magasin en ligne?
R Une table de base de donnes peut contenir des milliards de lignes. Par
consquent, en thorie, il est possible d'ajouter des milliards de produits la table
Produits.
Q Pourquoi Access ne peut-il tre utilis pour un site Web dont le nombre de
visiteurs est trs important?
R Access est une base de donnes individuelle, et non une base de donnes
client-serveur De ce fait, il ne peut grer qu'un nombre limite de connexions
simultanes. Si vous prvoyez que le nombre d'utilisateurs se connectant
simultanment A votre base de donnes dpasse 30, vous devriez srieusement
envisager de passer SQL Server ou MySQL etc.

Atelier
Les questions et les exercices ci-dessous sont destines tester vos connaissances
concernant les informations traites dans ce chapitre. Vous trouverez les rponses
dans l'Annexe A "Rponses aux questions".
Testez vos connaissances
1. Si vous dplacez votre base de donnes Access, quelles mesures devez-
vous prendre pour faire en sorte que vos scripts ASP trouvent la base de
donnes son nouveau emplacement?
2. Ou se trouve I'erreur dans l'instruction SQL ci-dessous ?
INSERT INTO Products ( productname ) VALUES ( Panier cadeau)

3. Pourquoi les apostrophes posent-elles problme lors de l'ajout ou de la


modification des enregistrements d'une base de donnes?
4. Pourquoi les guillemets posent-ils problme lors de l'affichage d'une
variable A l'aide dc l'attribut VALUE dans un formulaire HTML?

Exercice
Comment faire pour ajouter des informations supplmentaires A votre magasin en
ligne Supposons par exemple que vous souhaitiez ajouter un champ pour le numro
de rfrence d'un produit. Comment modifierez-vous la table de base de donnes et
les pages serveur de ce chapitre pour y inclure ce nouveau champ?
Epilog
Dac ai ncercat s v acomodai ct de ct cu idiosincraziile acestor limbaje Java,
VBScript, PHP i SQL, atunci suntem siguri c vei fi n largul dumneavoastr
cnd vei avea parte de un pachet precum : Macromedia Dreamweaver sau
Microsoft Visual Studio sau, una din cele dou suite de instrumente de mai jos.
Ar fi cazul ca n calitate de manageri de sit electronic s punei la dispoziia celor
care se vor ocupa de construcia i ntreinerea sitului dumneavoastr una dintre
suitele la care ne referim acum.
Mulimea serverelor Microsoft pentru comerul electornic
Microsoft nu putea s stea impasibil fa de concuren (IBM, Oracle, BEA,
Allaire, Intershop etc.)
A realizat vreo 11 servere 20001 care au la baz strategia Microsoft DNA 2000,
adic arhitectura distribuit (ntr-un mediu de reea), Distributed Network
Architecture.
De pild s ne uitm la Microsoft Commerce Server 2000. Suita este continuarea
mai vechiului Microsoft Site Server 3.0 Commerce Edition (SSCE). Este aliniat la
standardul XML i vine cu multe mbuntiri.
Arhitectura este organizat pe trei nivele. La nivelul (stratul) de jos gsim
instrumente orientate spre XML, care permit definirea schemelor de date i accesul
facil la ele. La nivelul intermediar nu puteau lipsi componente COM, care
fundamenteaz conceptul de groupware, deci de punere n comun la punct a unui
document (am explicat pe larg acest concept n cartea Birotica i Internet la
cumpna mileniilor , D., Somnea i M., Calciu, ed. Lucman, dec. 2000, lucrare n
prezent epuizat, cnd am tratat suita Microsoft Office 2000).
n fine, la nivelul suprafeei grafice exist complexul de obiecte Visio pentru
realizarea aspectuoas a sitului comercial. Evident, produsul tie ASP, deci
Visual Basic i, PRESUPUNE c tii i dumneavoastr ! Se pot crea profile i
gestiona clienii i partenerii de afaceri.
BizTalk permite construirea unei infrastructuri de comer electronic. Editorul su
XML permite crearea rapid a schemelor de documente financiar-contabile,
considernd structura organizat ca grup de articole de formular, sau altfel.
Ofer un instrument orientat pe suprafa grafic pentru elaborarea de documente.
Se vorbesc dou limbi ! Cea pentru profesionistul din domeniul tehnologiei

1
Windows, SQL, Application Center, Commerce, BizTalk, Contents Management, Exchange, Host
Integration, Internet Security & Acceleration, Mobile Information i SharePoint Portal.
informaiei (IT), care e obligat s tie ASP, SQL i cea pentru administratorul
sitului B2B, B2C, care bine ar fi s aib idee despre VBScript i SQL.
Transformarea documentelor tip BizTalk se face cu ajutorul limbajului XSLT,
eXtensible Stylesheet Language Transformations (pentru scurte explicaii ciii nc
o dat capitolul 1 din limba romn din aceast carte).
Se ofer i un tandem de protocoale pentru mrirea siguranei transportului
documentelor prin reea ntre partenerii de afaceri. Dac traficul este ncrcat, deci
apar erori, se abandoneaz primul protocol i se trece automat la cel de rezerv.
Dac i acum eueaz transportul documentului, el este adugat automat la o coad
de ateptare pentru prelucrarea manual.
Pentru definirea profilelor de clieni st la baza venerabilele Lightweight Directory
Application Protocol, LDAP i Active Directory, reluate sub denumirea de
Microsoft MemberShip Directory, cel folosit n pachetul de origin Microsoft
SCCE (vezi referina /4/). Cu ele se permite un acces securizat pe baz de certificat
de autentificare la datele sitului.
Regulile de asociere la profile i date au la baz un constructor de expresii, aa
numitul expression builder. La rndu-i el mustete de XML. Nu putea lipsi o
bogat bibliotec de pagini ASP, pentru elaborarea a tot felul de documente
specifice comerului electronic, n toate felurile, gestionarea mesajelor electronice
ce vor fi adresate vizitatorilor i cumprtorilor.
Exist evident i un strat (shell) care uureaz completarea prilor comenzilor
SQL, deci se face totul ca s evitai acest limbaj ! Se pot crea i ntreine un arsenal
de cataloage de produse, clasificate dup fel de fel de criterii.
Biztalk permite prin instrumente de tip agent electronic (wizards, vrjitori, cum le
spun voioii notri tineri pasionai de computere) s creai ordine de plat etc., s
realizai tot felul de calcule de taxe.
i IBM WebSphere
Pachetul IBM WebSphere este alctuit dintr-o suit de componente , toate
mbrieaz tehnologia JSP la nivelul EJB, Entreprise Java Bean i evident este
total orientat spre XML.
Are dou variante: standard i profesional. Realizeaz totul ca i cele 10 servere de
mai sus, folosind avantajul tehnologiei JSP, anume construirea unor servleturi
rapide bazate pe cod de octei.
Cred c dac ai parcurs cartea ai putu urmri ceea ce am spus mai sus.
Ca s v facei o idee asupra interesului pentru construcia de situri B2B, B2C,
statisticile indicau o cifr de afaceri pe anul 2000 de vreo 86 miliarde de dolari
pentru suita WebSphere, fa de 26 miliarde pentru suita Microsoft Commerce !
Pentru amnunte vizitai i portalurile :
www.duckhead.com,
www.arn.net,
www.schwin.com i bineneles,
www.ibm.com (cuvinte cheie websphere, ejb, servlet, jsp).
n Acatistul Maicii Domnului pentru cei necjii se spune explicit c:
Bine este a nu iubi buntile acestei lumi dearte i trectoare !
Tlcul : nu ne trebuie neaprat aceste super-produse software ci, i acelea mai
modeste ca pre, dar care cer efort mult mai mare de realizare.
Chiar i aceste instrumente software sunt periculos a fi mnuite fr a poseda
minime cunotine de programare !
Anexa A. Iniiere n HTML, DHTML i
XHTML
HTML, pas cu pas!
Acest limbaj nu este unul de programare ci unul pentru marcaje. Nici nu trebuie
nvat ci doar s ajungei n faza de recunoatere, ca s v descurcai fr sprijinul
vreunui pachet pentru publicarea pe Web, atunci cnd dorii s facei mici adugiri
de aspect i chiar de coninut la un sit deja publicat. De pild, trudii i realizai n
sfrit secvene animate cu vreunul din editoarele mai rsrite gen: GIMP, Flash
sau SwiFT etc.
Limbajul a evoluat pn la versiunea 4.01 i aici s-a oprit. A fost completat ulterior
cu HTML dinamic, DHTML. Din pcate ceea ce a adugat Microsoft n materie de
balize, atribute, nu este recunoscut de clanul AOL+Netscape, Mosaic sau Mozilla,
deci numai de ctre Internet Explorer ! HTML a derivat din limbajul SGML,
limbajul printe al tuturor limbajelor cu marcaje.
Aadar acest HTML este un limbaj simplu pentru pagini de cas afiate cu
programul de vizitare client browser. Cel mai uzitat program este Microsoft
Internet Explorer, MSIE, dar ntr-o msur suficient de mare este i Netscape
Communicator.
Mai multe documente tip html adic pagini de cas, alctuiesc un sit Web. Pagina
de baz, cea din care pleac toate referinele spre alte pagini situate mai jos pe
ierarhia sitului, este notat prin convenie fie index.html sau index.htm (Netscape,
Mosaic, Hotjava, Mozilla etc.), default.htm sau .html (Internet Explorer). Desigur
denumirea aceasta nu este obligatorie, dar n acest caz trebuie menionat i
denumirea paginii primare n irul de tip URL.
HTML are o serie de marcaje. Un marcaj este alctuit dintr-o pereche de balize
(tags), rspndite prin textul documentului. De pild, delimitarea ntregului
document se face cu perechea de balize una pentru nceput <HTML> i cealalt
pentru sfrit, </HTML>. ntre cele dou balize exist text i tot felul de alte
marcaje.
Un document tip .htm este alctuit dintr-un antet i dintr-un corp.
Fiecare nume de baliz poate conine litere mari sau mici. Oricum, literele mici
sunt transformate n litere mari.
Antetul este delimitat de perechea <HEAD> i </HEAD>. Deci:
marcaj_antet ::= <HEAD> </HEAD>
Corpul documentului este definit ca:
marcaj_corp ::= <BODY> i </BODY>.
Textul este alctuit din blocuri i paragrafe. Blocurile sunt delimitate de marcajul
div, deci prin balizele <DIV> i </DIV>. Paragrafele sunt delimitate de perechea
de balize <P> i </P>. ntre cuvinte se las un spaiu. Programele de vizitare ignor
mai mult de un caracter blanc, cod 0x20, ntre cuvinte i, de asemeni i caracterele
de avans la linie nou, cod 0x0d, cod 0x0a, introduse prin folosirea tastei ENTER.
Iat un prim exemplu de document html:
LISTA A-1. Primul pas n HTML
<HTML>
<TITLE>Primul document</TITLE><HEAD>Preambul</HEAD>
<BODY>
<H1>Antet de nivelul 1</H1><H2>Antet de nivelul 2</H2>
<H3>Antet de nivelul 3</H3><H4>Antet de nivelul 4</H4>
<H5>Antet de nivelul 5</H5><H6>Antet de nivelul 6</H6>
</BODY>
</HTML>

FIGURA A-1. Aspectul ferestrei documentului


Vedem apariia unui marcaj nou i anume marcajul html, care ncadreaz
documentul n sine: <HTML>...</HTML>. Sesizm faptul c se admit antete pe
ase nivele. Nu trebuie s confundm antetul de nivelul nti cu titlul ferestrei i cu
cuvintele nscrise n marcajul <HEAD>...</HEAD>. Fiecare are un rost bine
definit. Astfel, dac marcajul html definete din punct de vedere logic documentul,
tot astfel marcajele head i body l divizeaz n cele dou pri ale sale, preambulul
i corpul propriu-zis.
Diferena dintre cele ase marcaje pentru antete o constituie mrimea i stilul ales.
Acestea nu sunt imuabile, cnd recurgei la serviciile unui program din clasa
browser, deci i la Netscape Navigator. Ele pot fi desigur redefinite de dup
dorin.
Sesizai c denumirea Preambul a aprut n fereastra aplicaiei, separat de cuvintele
ncadrate ntre balizele marcajului h1. Totodat denumirea Primul document,
nscris n bareta de sus a ferestrei principale, este informaia aflat n marcajul
title. Desigur c n multe documente sunt folosite aceleai cuvinte att n marcajul
title ct i n h1. Sunt ns situaii unde acestea trebuie s difere. n acest caz,
marcajul h1 se va referi de exemplu la titlul capitolului sau seciunii, n timp ce
marcajul title va pstra titlul sitului Web.
Paragrafele sunt acceptate n documentul de tip html. Spre deosebire de
procesoarele de texte unde caracterele de sfrit de paragraf (marcaje de paragraf,
paragraph marks, n terminologia Winword) sunt luate n consideraie, aici codul
nscris ntr-un document prin apsarea tastei ENTER nu are aceiai semnificaie.
Pentru a realiza un salt la un paragraf nou (nu un rnd nou) vei recurge la baliza
<P>, iar pentru un salt la un rnd nou la baliza <BR>. Iat grupul de cuvinte pentru
primul paragraf:
Acesta este primul paragraf<P>
Ceea ce am scris mai sus este echivalent cu:
<P>Acesta este primul paragraf</P>.
Numrul rndurilor goale este egal cu cel al balizelor <BR> folosite. ntre
paragrafe s-au prevzut mai multe linii libere la momentul vizualizrii
documentului sau la imprimarea sa. S modificm puin lista de mai sus.
LISTA A-2. Documentul din primul exemplu, docA.htm
<HTML>
<TITLE>Primul document</TITLE>
<HEAD>Preambul</HEAD>
<BODY>
<H1>Antet de nivelul 1</H1>
<P align=center>
Acesta este un grup de cuvinte centrat.
</P>
<P align=right>Expeditor...</P>
<A HREF="http://gommit.webconn.com/java/JavaScript/intro/index.htm">
Introducere in JavaScript</A>
<H2>Antet de nivelul 2</H2>
<A HREF="docB.htm#aici">punctati aici ca sa vedeti documentul B</A>
<H3>Antet de nivelul 3</H3>
<H4>Antet de nivelul 4</H4>
<H5>Antet de nivelul 5</H5>
<H6>Antet de nivelul 6</H6>
</BODY>
</HTML>
Aspectul documentului se schimb (vezi figura A-2).

FIGURA A-2. Textul centrat i punctarea unei adrese din spaiul Web
Legturile ntre documente
Acum s nvm cum s adresm alte documente din spaiul Web. Deci ne referim
la legturi de tip hypertext. Un astfel de marcaj are urmtoarele pri componente
(atribute):
<A HREF=unde-anume>cuvinte-cheie</A>
Litera A este iniiala cuvntului anchor, ancor. HREF nseamn hypertext
reference, referin de tip hypertext. Unii traduc acest termen prin hipertext! Nu
exist aa ceva n DEX. Prin cuvintele unde-anume nelegem adresa n stilul
URL al locului din spaiul Web. Urmeaz un cuvnt cheie (pot fi i mai multe) care
se afieaz cu o alt culoare i subliniat. Cnd ajungei cu indicatorul mausului pe
aceast legtur indicatorul va cpta forma unei mnue. Este legtura de tip
hypertext prin care, dac se efectueaz clic, se ajunge n acel document aflat
undeva la antipozi, sau n acelai fiier, depinde unde ai ales s puncteze.
nainte de a folosi mausul, vei observa, cnd ajungei pe aceste cuvinte, cum n
linia de stare va apare adresa acelui document punctat. n sfrit, baliza de
terminare este </A> i nu </A HREF>. n figur am ales adresa unui documentaii
de iniiere n limbajul JavaScript, afllat la situl gommit.web.com n directorul
intro, fiul directorului JavaScript la rndu-i, fiu al directorului java. Pagina de baz
se cheam index.html. Documentul din lista A-2 poart denumirea docA.htm.
Putem puncta chiar n cadrul aceluiai document sau n alt document din acelai
director sau alt director, alt partiie, alt disc, alt staie etc. Observai n cuprinsul
documentului docA.htm din lista A-2, locul de includere al literalului, chiar
deasupra textului pentru antetul de nivel doi:
<A HREF="http://gommit.webconn.com/java/JavaScript/intro/index.htm">
Introducere in JavaScript</A>
Iat acum al doilea document denumit docB.htm. El va conine textul urmtor:

Lista A-3. docB.htm


<P>Anchors can also be used to move to a particular section inside a document, not
only to its starting point.
<P>Suppose you wish to set a link from docA and a specific section in docB.
<P>First you need to set up a named anchor in docB. For instance <A NAME =
"aici"> here</A>. Now when you create the link in docA, include not only the
filename, but also the named anchor, separated by a hash mark.
Ancorele pot fi utilizate chiar n cadrul unei seciuni a documentului, deci nu numai la
nceputul su. n lista de mai sus observai marcajul name:
<A NAME = "aici"> here</A>
Este destinaia legturii nceput prin:
<A HREF = "docB.htm#aici">punctati aici ca sa vedeti documentul B</A>.
Acest literal se afl n docA.htm i puncteaz docB.htm nu la nceput ci undeva n cuprinsul
su, chiar acolo unde apare literalul <A NAME. Cnd textul documentului ar fi destul de
voluminos, atunci s-ar afia poriunea de text imediat dup <A NAME "aici"></a>.n figura A-
3 este redat integral documentul docB.htm. Din docB putem sri napoi n docA sau spre alt
document.
Observaie: de aici nainte nu vom mai prezenta n mod sistematic n denumirile fiierelor i
sufixul.
FIGURA A-3. Coninutul docB vizualizat dup saltul efectuat n cadrul acestuia
Legtura de tip hypertext este un arc de graf care pleac din dreptul balizei <A
HREF...> i care se termin n documentul receptor printr-o baliz <A NAME...>.
Nu mai efectum un atare exerciiu. Mai simpl este sintaxa marcajului, cnd saltul
se efectueaz n cadrul aceluiai document. Am avea n acest caz de exemplu n
docA o baliz de nceput de genul acesta: <A HREF = "#sectiunea_1"> vezi
sectiunea a ntia</A> i, la nceputul acestei seciuni, care aici lipsete n docA, o
baliz <A NAME = "sectiunea_1">.
Observaie: de regul documentul principal este bine s l denumii index. Nu este
obligatorie aceast denumire, dar avantajul este urmtorul : n adresa tip URL nu
mai menionm i denumirea paginii de baz ci numai specificaia de cale, adic
traseul prin ierarhia de directoare spre aceast pagin de cas.
Liste
HTML manevreaz trei tipuri de liste: nenumerotate (unordered, UL),
numerotate (OL), sortate cresctor (ordered) i pentru definiii (defined, DL).
Sintaxa marcajelor pentru fiecare caz n parte este dup cum urmeaz:
LISTA A-4. Un exemplu de liste nenumerotate
<UL> respectiv <OL><LI>element_1<LI>element_2</UL> respectiv </OL>
<DL><DT>nume-definitie_1<DD>definitia n sine, oricate paragrafe
<DT>nume-definitie_2<DD>definitia n sine, idem
</DL>
Nu sunt necesare alte explicaii.

LISTA A-5. Alt tip de liste


<HTML>
<BODY>
<UL>
<LI>Relief
<UL>
<LI>munti<LI>dealuri<LI>campii
</UL>
<LI>Ape
<OL>
<LI>Lacuri naturale
<LI>Lacuri artificiale
<LI>Cursuri de apa
</OL>
</UL>
<DL><DT>URL<DD>Universe Resource Locator<P>Punct in spatiul Web unde se
afla cel putin un document.<P>Mai se intalneste sub initialelel URN sau URI.
<DT>Web<DD>Denumirea prescurtata a sistemului World Wide Web.<P>Sistem
aparut mai intai in Elvetia, la CERN, laboratoarele de fizica particulei.<P>O interfat
unica, prietenoasa pentru necunoscatorii serviciilor clasice TCP/IP si care ofera
acces la servicii de genul:
<UL>
<LI>http<LI>gopher<LI>WAIS><LI>ftp<LI>news<LI>file<LI>telnet<LI>etc.
</UL>
</DL>
</BODY></HTML>
Tabele

Lista A-6. Tabel cu diferite opiuni, inclusiv poz animat


<HTML>
<HEAD><TITLE>Tabel cu diverse optiuni</TITLE></HEAD>
<BODY>
<! Tabel cu chenar de 5 pixeli>
<! 2 pixeli intre celule, si alti 2 pixeli lasati liberi de marginea textului>
<! la chenarul celulei >
<TABLE BORDER=5 CELLPADDING=2 CELLSPACING=3>
<! Titlul tabelului, scris deasupra>
<CAPTION ALIGN=TOP>Tabel cu text si imagini animate</CAPTION>
<! Ce scrie in antetele fiecarei coloane>
<TH>Coloana a 1-a</TH><TH>Coloana a 2-a</TH><TH>Coloana a 3-
a</TH>
<!Prima linie. Textul va fi scris coform optiunii VALIGN, Vezi celulele>
<!Se recurge si la culori de fundal, bgcolor>
<!Celula 3 nu are nimic>
<TR>
<TD HEIGHT="60" VALIGN=TOP>Fara fundal, si in partea de
sus a celulei
</TD>
<TD HEIGHT="60" VALIGN=MIDDLE BGCOLOR="orange">In
centru si fundal portocoaliu
</TD>
<TD HEIGHT="60" VALIGN=BOTTOM BGCOLOR="yellow">In
partea de jos a celulei
si fundal galben
</TD>
</TR>
<! Linia 2. In celula din stanga un glob pamantesc care se roteste>
<! In celula din mijloc un text in care se explica adresarea URL in sens
relativ>
<TR>
<TD><IMG SRC="../../my pictures/image.gif"></td>
<TD>Imaginea globului care se invarteste, are structura gif'89.
se afla in directorul My Pictures. Directorul curent al acestui document este
learningHTML. El este fiu al directorului My Webs. Atat My Webs cat si My Pictures
sunt fii ai directorului Personal. Pentru a ajunge din learningHTML in My Pictures,
urcam o data in sus la My Webs, apoi inca o data in directorul Personal, coboram pe
ramura My Pictures si am ajuns!</TD>
</TR>
</TABLE>
</BODY></HTML>
Aspectul l putei vedea n figur. Remarcai i explicaii n nsui coninutul listei de mai sus.

FIGURA A-4. Tabel cu diverse opiuni

LISTA A-7. Tabel cu csue unite pe vertical i orizontal


<! Tabel cu chenar de un pixel care ocupa 70% din latimea ferestrei documentului >
<!textul din dreptul celulei anunta intentia balizei >
<table border=1 align=center width=70%>
<! Linia 1>
<tr><td colspan=4 >4 celule unite pe linie</td></tr>
<! Linia 2 >
<tr>
<td rowspan=4>3 celule unite pe coloana</td>
<td>col 2, lin 2</td>
<td>col 3, lin 2</td>
<td>col 4, lin 2</td>
</tr>
<! Linia 3 >
<tr>
<td>col2, lin 3</td>
<td colspan=2Celule alaturate unite pe linia 3</td>
</tr>
<! Linia 4 >
<tr>
<td>col2, lin 4</td>
<td colspan=2Celule alaturate unite pe linia 4</td>
</tr>
</table>
Caracterele speciale i cele diacritice

V-ai pus probabil problema cum s folosii chiar caracterele "<" i ">" ca de altfel i
altele n textul dvs. ntr-adevr, ai sesizat c aceste caractere au semnificaie aparte.
Sunt caracterele speciale. Fiecare caracter special va fi descris printr-un grup de litere
terminat cu punctul i virgula sau printr-un grup de cifre, caz n care se spune c e vorba
de secvene escape numerice. O astfel de secven cuprinde irul &#nnn; unde nnn este
un grup de trei cifre zecimale.
Exemple: &#33; este semnul exclamrii (!), &#10; este avansul la linie nou, line
feed, &#09; este tabulatorul orizontal, tab etc.
i caracterele speciale care au definite secvene de tip caracter au secvene echivalente
de tip numeric. De pild, &#34; corespunde ghilimelelor (") etc. Exist i varianta de
secven escape hexazecimal. Ea are forma &#xhhh;. De pild secvena numeric
pentru litera a mic este &065; i cea hexazecimal, &#x041; .
Pagina de cod ISO-Latin-1 nu conine dect o parte din diacriticele romneti. Nu are i
literele (mici i mari) urmtoare: , , i , ci doar pe i . Problema este rezolvat dac
adaptai browserul pe UNICODE, acel sistem de codificare cu doi octei pe caracter.
Singurul acest cod conine toate diacriticile majoritii limbilor.

FIGURA A-5 Aspectul exemplului lista7.htm

Definirea formularelor

S-a introdus marcajul form definit ca: <FORM>...</FORM>. Cu el crem un formular.


n cadrul su pot fi incluse tot felul de elemente grafice: cmpuri de tip text de diferite
forme, butoane, casete de bifare (check boxes), butoane radio (radio buttons), casete de
tip list (list boxes) sau, de tip list derulant (drop down list boxes).
Sintaxa (parial) a marcajului este aceasta:
<FORM ACTION="adres_de_tip_url" METHOD=servlet sau program CGI
ENCRYPT=metoda de criptare>...</FORM>

Atributul ACTION conduce la transmiterea cererii vizitatorului la programul tip CGI


sau serlvet aflat la serverul Web indicat de adresa respectiv. n lipsa acestui atribut,
cererea va fi dirijat spre serverul curent, cel care afieaz pagina de cas respectiv. n
cadrul balizei <FORM> mai pot aprea atributele urmtoare: METHOD i ENCTYPE.
Atributul METHOD precizeaz metoda care va prelucra informaiile introduse de ctre
dvs. de la tastatur sau cu ajutorul mausului. Exist mai multe metode. Cea mai uzitat
este ns POST.
Atributul ENCTYPE precizeaz metoda de criptare folosit n vederea transmiterii
securizate a informaiilor formularului respectiv.
Marcajul form este nsoit de marcajele urmtoare (nu obligatoriu toate prezente n
acelai formular): input, select i textarea.
Cu marcajul input specificm o serie de atribute care le asociem rubricilor, cmpurilor
formularului. n cele ce urmeaz le vom spune elemente, unde vor fi colectate mesajele
de intrare (de la tastatur sau prin acionarea mausului). Iat atributele semnificative:
TYPE, care poate avea una din proprietile:
Text - cmp de intrare de tip ir de caractere; se admit i semnele speciale care ncep cu
caracterul ampersand, &.
Hidden (ascuns) - adic o intrare ce nu va fi afiat dar care graie valorii precizate n atributul
VALUE, va constitui valoarea iniial asumat a atributului cerut, n caz c vizitatorul nu va preciza
o alt valoare n mod interactiv.
Password (parola) - cmp cu regim de parol de acces; ceea ce tastai nu apare dect sub forma
unui caracter de umplere.
Toate acestea trei sunt cmpuri de tipul text. Dar ntr-un formular, sub aceeai baliz
<INPUT>, pot apare i alte elemente de genul acestora:
Caseta de bifare (checkbox), un ptrel n care apare un semn de bifare, cnd va fi selectat cu
mausul.
Butonul radio (radio button), un cercule n care apare un punct, dac l-ai selectat cu mausul.
Butonul de validare (submit, echivalent butonului OK din contextul familiei sistemelor Windows);
dac efectuai un clic pe el, toate informaiile introduse de dvs. vor pleca la serverul http sub forma
unui ir.
Butonul de iniializare (reset) care va servi pentru anularea coninutului cmpurilor acelui formular.
Trebuie doar s efectuai un clic pe el ca s vedei dispariia informaiilor, respectiv a eventualelor
selecii efectuate de dvs. pn atunci.
NAME, este denumirea intern a resursei grafice respective (cmp, caset de bifare etc.), folosite
de creatorul paginii de cas;
VALUE, ce valoare asumat s aib acea resurs; este textul care apare pe unele dintre resurse.
CHECKED, folosit n contextul casetelor sau radio butoanelor. Acele resurse vor fi bifate;
SIZE, mrimea cmpului; se asum 20 caractere; dac aici apar dou valori numerice, a doua se
refer la numrul rndurilor;
MAXLENGTH, numrul maxim de caractere care vor fi acceptate de ctre cmpurile de tip text.
Combinnd aceste ultime dou atribute putei face s apar liste derulante cu barete de defilare.
Iat un formular cu patru cmpuri. Vizitatorul va vedea pe ecran n dreptul cmpurilor
respective marcate cu claritate texte descriptive explicative:
LISTA A-8. Primul formular cu patru cmpuri
<!-- exista un server http local care stie limbajul perl -->
<FORM METHOD="POST">
Introduceti numele: <INPUT NAME="nume1">
Si aici prenumele: <INPUT NAME="nume2"></P>
Iar aici varsta: <INPUT NAME="nume3">
Adresa dvs:<INPUT NAME="nume4"></P>
</FORM>

Remarcai apariia separatorului pentru avansul la o linie nou <P>. Primele dou
cmpuri, botezate intern cu denumirile nume1 i nume2, apar pe prima linie a
formularului. Ele vor avea fiecare o lungime asumat de 20 caractere. Mai departe,
cititorul poate urmri uor celelalte dou cmpuri.
La formularul de mai sus s facem s apar i obiecte grafice: butoane, butoane radio,
casete de bifare. n plus, programul va prelucra valorile cmpurilor. El se afl la serverul
cu adresa hoohoo.ncs.uiuc.edu n directorul htbin-post i se numete post-query.
Secvena HTML este cea din lista urmtoare:
LISTA A-9. Un exemplu mai complet de formular
<FORM METHOD="POST" ACTION="http://hoohoo.ncsa.uiuc.edu/htbin-post/post-
query">
Precizati datele dvs.(optional):</P>
<P> Numele:<INPUT NAME="nume1"> Prenumele:<INPUT NAME="nume2"></P>
<P> Ocupatia:<INPUT NAME="nume3"> Profesia:<INPUT NAME="nume4"></P>
<P> Orasul:<INPUT NAME="nume5"> Tara:<INPUT NAME="nume6"></P>
<P> V-a placut pagina noastra?</P>
<DL>
<DD><INPUT TYPE="radio" NAME="nume7" Value="Da"><I>Da,yes,ja,oui</I>
</DD>
<DD><INPUT TYPE="radio" NAME="nume8" Value="Nu"><I>Nu, no, nein,
non</I></DD>
<P> Daca nu, aveti sugestii de imbunatatire a paginii noastre (max 1000
litere)?:
<INPUT NAME="name9" SIZE="40" MAXLENGTH="1000"> </P>
<P><INPUT TYPE="submit" VALUE="Send"><INPUT TYPE="reset" VALUE="Clear
fields">
<INPUT TYPE="submit" VALUE="Cancel"></FORM></P>
<P>VA MULTUMIM! Clicati <A HREF="#A0">aici</A> ca sa reveniti la inceput.</P>

Textul V-a placut pagina noastr apare pe un rnd izolat (vezi i figura A-4). Urmeaz
o list de tip DD, care specific dou butoane radio. Denumirile lor interne sunt nume7
i respectiv nume8. Cele dou butoane nu apar selectate pe ecran (adic fr punctulee
n interiorul cerculeelor). Prin executarea unui clic pe oricare din ele are loc selecia. n
spe, va apare punctuleul i la folosirea butonului Send, se va transmite coninutul
cmpului, nu ceea ce se vede de fapt pe ecran. Desigur c am fi putut face s apar
selectat orice buton. Pentru acesta era de ajuns s scriem n secvena HTML atributul
CHECKED. Cmpul nume9 este unul de tipul lung. El este nsoit de dou atribute
SIZE i MAXLENGTH. n acest caz, el nu va mai avea doar 20 caractere ci 1000.
Echivalentul butonului prin care realizai funcia de efectuare a aciuni, deci de validare
(cum este OK din Windows) are aici tipul submit. Butonul va avea afiat n cadrul su
eticheta Send (transmite) nu OK, deoarece aa am dorit.
Mai apar dou butoane: unul de tip reset, pe care scrie Clear fields i cellalt de tip
submit, pe care scrie Cancel. Un singur clic efectuat pe butonul de tip reset, va face s
dispar coninutul cmpurilor formularului. Are loc deci o iniializare a formularului.

FIGURA A-6. Aspectul formularului

Prin executarea unui clic pe butonul Send, va fi transmis la server un ir de caractere cu


valorile din cmpurile, n ordinea aceea cum apar ele pe ecran. Deci dac la nume ai
precizat Ionescu, la prenume, Gheorghe etc., irul va arta astfel:

nume1=Ionescu&nume2=Gheorghe&nume3=... .

Acest ir de catene alipite vor fi prelucrate de ctre programul post_query.


n schimb, un clic pe butonul Cancel va echivala cu renunarea la transmiterea acestui
ir de catene.
Marcajul select ne permite s redm o list de cmpuri accesibile pentru un meniu
derulant sau mai multe astfel de meniuri. Ca sintax comanda se scrie astfel:

<SELECT NAME="acest_meniu">
<OPTION>optiunea_1<OPTION>optiunea_2>...</SELECT>

Meniul denumit acest_meniu are acces la cmpurile ale cror denumiri interne de mai
sus apar n atributele OPTION din descrierea sintactic. Alte atribute ce pot aprea n
cadrul marcajului select sunt:
NAME, stabilete denumirea intern a meniului, adic a elementului grafic din formularul
respectiv;
MULTIPLE SIZE, precizeaz numrul opiunilor afiate din totalul celor prezente. Dac sunt mai
multe, apare evident bareta de defilare (scroll) i, prin explorarea ei facem vizibile opiunile
respective;
SELECTED, specific faptul c acea opiune pe lng care apare, va fi automat selectat.
Marcajul textarea are sintaxa urmtoare (vezi i mai jos alt exemplu):
<TEXTAREA NAME="nume_intern" ROWS=valoare COLS=valoare> valoarea
asumat </TEXTAREA>
Denumirea intern a obiectului figureaz n atributul NAME i, este denumirea dat de
dvs. Prin atributele ROWS i COLS stabilii numrul de linii i coloane ale cmpului de
captare.
Este echivalentul obiectului de tipul "input textarea" din Windows, unde se permite
nscrierea unui text captat de ctre aplicaie.
n cazul acestui al treilea exemplu pe ecran vom gsi urmtoarele elemente:
LISTA A-10. Un alt formular
<HTML>
<HEAD><TITLE>...</TITLE></HEAD>
<BODY>
<P><FORM METHOD="POST" ACTION="http://hoohoo.ncsa.uiuc.edu/htbin-
post/post-query">
<FIELDSET>
<B><FONT SIZE=+1>Login:<INPUT NAME="numeSesiune"
VALUE="anonymous">
<BR></FONT>
<TT>Your password please:<INPUT TYPE="password" NAME="parola"
VALUE="guest"></TT></B>
</FIELDSET>
<FIELDSET>
<HR WIDTH="100%"></P><P><B><I>Please specify the preferred
platform:</I></B>
<SELECT NAME="platforma">
<OPTION SELECTED><FONT SIZE=+1>PC-Windows NT
<OPTION>PC-Windows95<OPTION>PC-Windows3.x<OPTION>Unix-AIX
3.2.5.<OPTION>Macintosh-MacOS 7.x
</SELECT>
<HR WIDTH="100%"></FONT><I>And class of software product:</I>
<SELECT NAME="soft" MULTIPLE SIZE=3>
<OPTION>Database<OPTION>Spreadsheet<OPTION>Text
Processor<OPTION>Graphics Editor
<OPTION>Desktop accessories<OPTION>Utilities<OPTION>Integrated
Development Environment
<OPTION>Multimedia<OPTION>Contacting via Internet<OPTION>Games
</SELECT></P>
</FIELDSET>
<FIELDSET>
<TEXTAREA NAME="impresii" ROWS="5" COLS="55" WRAP="OFF">Impresiile
dumneavoastra:</TEXTAREA>
<P><INPUT TYPE="submit" VALUE="OK"><INPUT TYPE="submit"
VALUE="Cancel"></FORM></P>
</FIELDSET>
</BODY></HTML>
Se urmrete structura standard a unui document de tip html, compus dup cum
cunoatei, din antet <HEAD>...</HEAD> i din corpul propriu-zis
<BODY>...</BODY>. Nefigurnd nimic n cadrul balizei <TITLE>, nseamn c nu
am optat pentru o anume denumire de fereastr.
Corpul documentului se refer la un formular, care dup cum se cunoate din celelalte
exemple, conine o linie care ncepe cu baliza <FORM>. n cadrul ei se specific
metoda de tratare a informaiilor de intrare preluate de la vizitator. Tot ce apare n ea a
fost introdus ntr-o fereastr special, dup cum se va vedea. Deocamdat suntem la faza
de recunoatere a prilor secvenei.
Formularul este divizat n parcele ncadrate de chenare, fiecare chenar corespunde unui
marcaj fieldset, deci unei perechi de balize <FIELDSET> </FIELDSET>.
Urmeaz cmpurile denumite intern prin numeSesiune i parola, care fac parte din
prima parcel. n numeSesiune cel precedat de Login: vom nscrie numele sesiunii
noastre care poate oricare. Am presupus c cel mai des va fi "anonymous", de aceea am
nscris de la nceput acest cuvnt n cuprinsul cmpului
Parola se cere prin cmpul urmtor. Cnd tastai ceva, apar attea stelue cte litere
introducei. i aici am presupus o parol format din cinci litere, guest. De aceea se
afieaz cinci stelue. Ca s nu schimbm coninutul unui cmp cu valoare asumat,
vom folosi tasta TAB i trecem la urmtorul cmp al formularului.

FIGURA A-7 Aspectul acestui formular

n parcela a doua sunt dou cmpuri de tip select. Remarcai baliza <SELECT> care se
refer la cmpul platforma; este de fapt o caset de tip list (list box), unde apare doar
prima opiune din cele cinci, aceea care are OPTION SELECTED. Acest cmp permite
vizitatorului, selectarea platformei.
Mai departe, se remarc nc un cmp similar, ce specific clase de produse soft, care
trebuie selectate de ctre vizitator; denumirea intern a resursei (cmpului) este soft.
Cmpul este de fapt o list derulant (drop down list box n sens Windows), din care se
afieaz ntr-o mic fereastr doar primele trei opiuni dintr-un total de zece.
n sfrit, ne ntlnim i cu marcajul textarea. Acesta este inclus alturi de cele dou
butoane n a treia parcel. Resursa textarea are numele intern impresii. n aceast caset
cel ce viziteaz situl poate introduce un text. Caseta are fizicete 5 linii a cte 55 litere cu
talie normal. Faptul c am plasat la atributul HARD opiunea WRAP, aceasta va
nsemna alunecarea cuvntului pe rndul urmtor (word wrapping, vezi referina /1/).
Cnd ai ajuns la limita fizic de 55 litere, respectiv 5 linii, bareta respectiv devine
activ; va apare un vernier (buton) care se deplaseaz de-a-lungul baretei de alunecare,
scroll bar. n felul acesta textul este permanent afiat. Facilitatea de alunecare a
cuvntului pe rndul urmtor, wordwrap, este activ pentru oricare din opiunile
PHYSICAL, VIRTUAL sau SOFT, (vezi i anexa B, marcajul textarea)
Evident, cele dou butoane OK i Cancel, pe care le-ai ntlnit i mai sus, sunt elemente
de tip submit.
Ce este HTML dinamic, DHTML?

Sunt extensii la limbajul pentru marcaje, menite s dea posibilitatea pregtirii unei
pagini de cas cu faciliti mai elevate. Folosind numai balizele limbajului standard
HTML, aceast posibilitate este limitat. Una dintre extensiile DHTML este i aceea a
definirii unor stiluri, style sheets. Ele conin tot felul de elemente tipografice precum:
culoarea textului, marginile paginii logice, elemente de aliniere, familia de caractere,
mrimea corpului de liter etc.
Dar HTML dinamic mai nseamn i poziionarea precis n cadrul paginii. n
paragraful de fa ne vom referi doar la descrierile de stiluri n cascad. Nu dezvoltm.
Orice browser suport desigur ambele descrieri de stiluri, i anume: cel care nu
comport cunoaterea limbajului JavaScript i cel specific acestui limbaj. Evident, ne
referim doar la a prima modalitate.
Sintaxa este n schimb foarte rigid. n cazul c greii, nu are loc blocarea browserului,
ci, pur i simplu ntreaga construcie de stil va fi ignorat.
CSS a ajuns ntre timp la versiunea a doua. Cu ce difer prima de a doua versiune nu
trebuie s v intereseze. Se definesc n faa documentului sau n fiiere separate aa-
zisele abloane de stiluri pentru aezarea n format a textului. Proiectantul sitului Web
definete aceste abloane la nceput i apoi le aplic fragmentelor din text. Fragmentul
poate fi o zon ntins din text, un alineat, un paragraf, un titlu, un cuvnt, chiar i numai
o liter.
Aezarea n format n corpul definiiei se face prin mai multe modaliti. Ne vom limita
doar la dou din ele i anume:
Atribuirea unui stil fix unei balize (cazul primelor dou exemple de mai jos).
Atribuirea unei clase (vezi exemplul al treilea).
Stilurile au tot felul de atribute, proprieti. Atributele au valori. De pild, se poate
preciza denumirea familiei de caractere, font, alinierea textului, culoarea cu care va fi
scris acesta, ce culoare s aib fondul din preajma literelor. Valorile pot fi menionate
unde este cazul n procente. Se pot meniona o serie de atribute pentru imagini inserate
n document, chiar i culorile punctelor unei enumerri. Cnd definim un stil, vom
declara tipul su ca tip text/css, fie ca text/JavaScript. n ultimul caz, trebuie s
cunoatei limbajul JavaScript. De aceea, vom intra puin n detalii doar pentru
alternativa tipului text/css. Ambele tipuri aparin de standardul MIME.
ncepem direct pe un exemplu mai simplu. Privii lista de mai jos.
LISTA A-11. Primul exemplu CSS
<html>
<style type="text/css">
<!--
P {font-size:10pt; font-family: "arial"; font-style: italic;}
H1 {color:green; font-size:24pt; font-family: "helvetica"; font-style: "bold";}
-->
</style>
<body>
<H1>Titlul scris cu litere verzi</H1>
<P>Primul paragraf</P><P>Al doilea paragraf</P>
</body>
</html>

FIGURA A-8. Cele dou definiii de stil

Aici sunt dou definiii de stil, una pentru paragrafe, v amintii baliza <P>, i alta
pentru antetul de nivelul nti <H1>. Prima definiie asociaz tuturor paragrafelor unei
pagini de cas un corp de liter cu talia de zece puncte, familia de caractere Arial, cu
litere nclinate.
A doua definiie cuprinde aceleai proprieti, atribute. n plus, se definete i culoarea
corpului de liter ca fiind verde. De remarcat cele dou definiii ncadrate de balizele:
<!-- respectiv --> .
Mai remarcai c fiecare proprietate este urmat de separatorul dou puncte (:), apoi
de valoarea proprietii. Sunt mai multe perechi de proprieti-valoare. Ele sunt
delimitate prin punct i virgul (;).
Iat un al doilea exemplu puin mai complex. Redm mai nti coninutul documentului.
LISTA A-12. Al doilea exemplu de stylesheet
<HTML>
<HEAD><TITLE><STYLE TYPE="text/css"></TITLE></HEAD>
<STYLE TYPE="text/css">
P {textAlign:center; margin-left:20%; margin-right:20%;}
H4 {text-decoration:underline; color: green;}
H5 {text-transform:uppercase; color: red; border-width:4pt;
border-style:outset; background-color:yellow; padding: 4pt;
border-color:red;}
BLOCKQUOTE {color:blue; font-style:italic; line-height:1.5; text-indent:10%;}
</STYLE>
<BODY>
<H4>Antet de nivelul patru</H4>
Scris cu culoare verde si subliniat.
<H5>Antet de nivelul cinci</H5>
<Blockquote>
Antetul de nivel cinci a fost scris doar cu litere mari, uitati ce chenar are scos in
relief,desi broserul avea alte resurse tipografice definite pentru H5. Noi prin definitia
de stil nu am facut altceva decat le-am modiciat.
Acest text este cu marcajul <BLOCKQUOTE> E scris cu albastru si observati-i
alinierea pe verticala si intervalul dintre randuri
</blockquote>
</BODY>
</HTML>

FIGURA A-9. Aspectul documentului

Faptul c am scris toate balizele cu majuscule nu trebuie s v deranjeze. Este indiferent


ce litere folosii.
Pentru baliza <P> se specific acum i marginile stng i dreapt. Ele sunt date n
procente ceea ce este foarte bine, deoarece lsm browserul s i calculeze ci pixeli va
aloca, n funcie de mrimea n pixeli a ferestrei i rezoluia ecranului. Mai remarcai
faptul c textul va apare centrat. Toate elementele antetului de nivel cinci vor fi scrise cu
litere mari.
Antetele vor fi ncadrate de un chenar rou cu grosimea de patru pixeli. Chenarul va fi
unul tridimensional. Intervalul dintre text i chenar va avea tot patru pixeli. Literele vor
fi scrise cu rou, fondul va fi galben.
Toate elementele tip <BLOCKQUOTE> vor fi redate cu culoarea albastr nclinate. Se
va lsa un interval care va fi de odat i jumtate ori mai mare dect talia corpului de
liter. n sfrit, prima linie va fi mpins spre dreapta n interior cu 10%. Cum arat
pagina de cas cu MSIE putei vedea n figur.
Observaii:
Am lsat n mod intenionat dou cuvinte greit transcrise: ,,broser i ,,modiciat.
Din text lipsesc caracterele diacritice. Aceasta deoarece, programul de vizitare nu
era condiionat pe pagina de cod corespunztoare ci pe codul ISO-8859-1.
Urmeaz al treilea exemplu n care apar procedeul definirii de clase.
LISTA A-13. Ultimul exemplu de definiri de stiluri
<html><head><title>Stiluri definite prin clase</title>
<style type="text/css">
body {background: yellow;}
p {font-family: "Times Roman"; font-height: 20pt;}
.cursiv {font-style: italic}
.ingrosat {font-weight: bold}
</style>
</head>
<body>
<P>Primul paragraf, cu cuvinte cu litere normale.</P>
<P>Al doilea paragraf in care cuvantul MAMA e scris cu litere inclinate <span
class=cursiv>MAMA</span>.</P>
<P>Al treilea paragraf, unde cuvantul TATA e scris cu litere ingrosate: <span
class=ingrosat>TATA</span>.</P>
</body></html>
S privim aspectul n figur.

FIGURA A-10. Apectul documentului

Secvenele multimedia

Vom exemplifica o modalitate (nu unica) de redare a secvenelor video. Deoarece am


posedat un program freeware n persoana programului de redare al secvenelor video cu
extensia MPEG, denumit mpegply2.exe, am anunat n prealabil browserul c vom
folosi ca program ter (aa-zisul helper application, n jargon Netscape), evident i
directorul unde slluiete el. Facei asta deschiznd meniul Options, General
Preferences, fila Helpers. i, n caseta de dialog respectiv dup ce v-ai poziionat pe
extensia .mpeg, folosii butonul browse cu care ajungei n directorul gazd al
programului mpegply2.exe. Fiierul video s-a numit film.mpg, iar fiierul document se
numete film.htm.
LISTA A-14. Inseria unui film n pagina de cas
<HTML>
<HEAD>
<TITLE>Exemplu adhoc de redare a unui fisier cu extensia mpeg</TITLE>
</HEAD>
<BODY>
<H2>Movie Pictures Expert Group; format de secvente video</H2>
<A HREF="../../adhoc/film.mpg">Sa vedem filmul film.MPG</A> (Lungimea
secventei in KB)<BR>
</BODY>
</HTML>

n lista de mai sus cititorul sesizeaz o notaie aparent special n baliza HREF. De fapt,
fiierul film.mpg nu se afl n acelai director cu fiierul film.htm (coincidena numelor
este pur ntmptoare) ci, ntr-un alt director denumit adhoc, fiu al directorului rdcin
c:\. Fa de acesta din urm, film.htm se afla n directorul c:\mydata\ JavaScript. De aici
cele dou grupe de puncte din baliza HREF.
Nu sunt unicele programe pentru interpretarea secvenelor video. Sunt o puzderie!
Alegei la nceput un produs freeware, nu shareware. De exemplu, un format video
popular este cel girat de aplicaia ter Quicktime. Extensia fiierelor este .qt.
Ce este XHTML?

Am adus vorba n introducere de XML, acest limbaj al unei descrieri enervant de


canonice a coninutului unui document.
XHTML este o reformulare a HTML ca aplicaie a XML. Este o ncercare de
canonizare a HTML.
Iat un fragment de cod scris lejer n HTML:
LISTA A-15. Cod scris n HTML

<TITLE>Scriere lejera in HTML si canonica in XML</TITLE>


<H1>My Example</H1>
<P>Bla blas
<p>Aici includ o poza.
<div align=center><img src=poza.jpg width=300 height=200 alt=[aici vine o poza]>
</div>
<br>
<table>
<tr><td>Celula R1 C1<td>Celula R1 C2
<tr><TD>Celula R2 C1<td>Celula R2 C2
</TABLE>

Dup ce vei vedea transcrierea n XHTML v vei da seama i singuri, dac avei spirit
de observaie, de lejeritile HTML. Iat echivalentul XHTML al cayului de mai sus:
LISTA A-16. Cod scris canonic n XHTML

<?xml version=1.0>
<!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Strict/EN
http://www.w3.org/TR/xhtml1/DTD/strict.dtd>
<html xmlns=http://www.w3.org/1999/sxhtml>
<head>
<title>Scriere lejera in HTML si canonica in XML</title>
</head>
<body>
<h1>My Example</h1>
<p>
Bla blass
</p>
<p>
Aici includ o poza.
</p>
<div align=center>
<img src=poza.jpg witdh=300 height=200
alt=[aici vine o poza] />
</div>
<br />
<table>
<tr>
<td>Celula R1 C1</td>
<td>Celual R1 C2</td>
</tr>
<tr>
<td>Celula R2 C1</td>
<td>Celual R2 C2</td>
</tr>
</table>
</body>
</table>

Deci observai pe lng o aliniere strict, cum cerea specificaia XML 0.91 sau 0.92 i
nu mai se cere n versiunea XML 1.0, o serie de linii insipide.
XHTML face distinie ntre literele mici i cele mari. Tr nu este tot una cu tr, td nu este
tot una cu TD, table nu este tot una cu TABLE.
XHTML nu las o baliz fr baliza terminal. Observai cum apar terminalele.
Balize izolate ca hr, img sau br au un fel anume de scriere. Remarcai acel spaiu urmat
de o bar nclinat.
Atributele nu merg dect cu litere mici, deci dac scriem aa: <table WIDTH="100%">
este greit. Dar aa <table width="100%"> este corect.
Nu se admite aa ceva:
<BODY>
<P>Iata un paragraf. P este scris cu litera mare </P>
</BODY>

ci aa ceva:
<BODY>
<p>Iata un paragraf. P este scris cu litera mica</p>
</BODY>

n loc de atributul name ca aici:


<img src="picture.gif" name="picture1" />
trebuie folosit atributul id:
<img src="picture.gif" id="picture1" />
Ca s mearg i la vechile browsere trebuie scris aa:
<img src="picture.gif" id="picture1" name="picture1" />
n XHTML nu se admit ncruciri de tipul <tr><td>text</tr></td>.
Aa ar trebui s arate un ablon minim de document XHTML :
<!DOCTYPE Doctype goes here>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Aici vine titlul</title>
</head>
<body>
Iar aici este corpul documentului
</body>
</html>
Aceast scriere XHTML, fiind o aplicaie a XML, este supus unui document aa-zis
DTD, Document Type Definition, care face verificarea sintactic a scrierii. Fiierul cu
regulile sintactice de descriere a XHTML se afl la adresa indicat de acea resurs Web
din declaraia DOCTYPE.
Vizitai situl /16/ pentru XHTML i XML.
Pentru ca aceast scriere canonic s-au conceput i scris aa-zisele translatoare HTML-
XHTML.
Dave Radgett de la W3C are un sit de care se ocup i unde apar fel de fel de astfel de
translatoare, cum sunt programul Tidy (www.w3.org/People/Radgett/tidy).
James Clark a scris n Java un translator XML-HTML, (www.jclark.com/xml/xt.html).
Ambele au regim freeware! Se numete XT (vezi i /14/) merge doar dac ai instalat
JDK2 i JRE. Trebuie ca dup instalarea sam s mutai biblioteca xt.jar n directorul
special al JRE, adic n: C:\Program Files\JavaSoft\JRE\nr_versiune\lib.
Anexa B. Sintaxa JSP1
Reguli de inut minte

Pagina JSP este coninut de un fiier cu extensia .jsp. I se spune fiier JSP.
Paginile JSP ajung n final servleturi.
Limbajul JSP este alctuit din: directive, scriptleturi i etichete.
n denumirile referitoare la variabile, clase, obiecte se face diferena ntre literele mici i
cele mari.
Directivele JSP se introduc ntre delimitatorii <%@ i %>. Delimitatorii pentru
scriptleturi sunt <% i %>. Delimitatorii pentru comentarii sunt: cei pentru comentariul
de tip text plus evaluarea expresiilor JSP <!-- text , expresii JSP -- > i comentariul
ascunde cod cu forma: <%-- text -->.
n prima form de cometariu se admite i orice instruciune scris n limbajul Java.
Orice instruciune Java din scriptlet (i din afara sa, cu acest caz nu ne-am ntlnit
ntruct am evitat s scriem fiiere cu cod pur Java) este un text terminat cu separatorul
punct i virgula, de exemplu:
StringBuffer = new StringBuffer();
// aici se definete un obiect de tip StringBuffer al clasei cu aceli nume

Directivele JSP au destule atribute. Toate sunt flancate de ghilimele sau apostrofi. De
exemplu:
<%@ page contentType=plain/text %>

Toate etichetele JSP ncep cu prefixul jsp:. n cazul directivei taglib, prefixul este cel
fixat de noi.
Nu sunt admise spaii (caractere blanc) naintea i dup semnul egal.
Dac n HTML spaiile albe sunt nesemnificative (oricte spaii albe ai tasta, tot un
singur spaiu se va genera. Ca s se tie de ctre HTML c vrei spaii albe, vei recurge
la caracterul &nbsp; adic nonblanking space.
n JSP, toate spaiile albe sunt luate n consideraie, aa cum le-ai introdus.
Secvena escape pentru caracterul x se scrie astfel: \x . De exemplu \ servete la
ignorarea apostrofului, sau, \ , la ignorarea ghilimelei de ctre analizorul sintactic al
JSP.
Alt exemplu: ca s ... orbim analizorul sintactic al JSP deci s sar peste caracterul >
vom scrie aa: \>.

1
Doar o parte din JSP, exemplificat n aceast carte.
Specificatorii de adrese URL: Presupunem c pagina noastr se afl ntr-un director
curent. Ea se numete x.jsp. Cnd ne referim din pagina x.jsp la paginaMea.jsp, motorul
servlet se caut paginaMea.jsp n directorul curent. Notaia ../paginaMea.jsp, produce
cutarea n directorul printe al directorului curent. Cnd scriem dir1/paginaMea.jsp, se
va cuta n directorul dir1, fiu al directorului curent. n sfrit, o specificaie de forma
/dir2/paginaMea.jsp, nseamn c dir2 este frate cu directorul curent.
Directiva page

Are urmtoarea form sintactic:


<%@ page atribut=valoare [ atribut=valoare ] %>

Pot fi mai multe atribute care sunt distanate la un spaiu unul de altul.
Cu excepia atributelor extends, isThreadsafe i info, iat celelalte atribute:
import este o list pentru importarea pachetelor n acea pagin. De exemplu import
java.text.dateFormat, java.io.*
contentType definete tipul MIME i pagina de cod (vezi referina /1/). Exemplu:
contentType=text/html; charset=unicode, adic pagina va conine text de tip document HTML scris n
codul care are16 bii per caracter.
language anun limbajul folosit pentru scrierea acelei pagini. Poate fi doar java sau javascript. Se
presupune java. Exemplu language=javascript.
session specific faptul c pagina JSP este accesat ca parte a unei sesiuni. De exemplu
session=false. O valoare false semnific faptul c pagina din care facem astfel referirea nu are
acces la obiectul implicit session. Orice referire la un astfel de obiect se va solda cu o eroare fatal de
ctre parserul JSP. O valoare true va duce la iniializarea obiectului sesiune pentru aceast pagin..
Se asum true.
buffer de exemplu <%@ page buffer=none %> va conduce la dirijarea output-ului acelei pagini direct
spre ecranul clientului Web, fr stocarea sa prealabil ntr-o zon tampon la serverul Web care
gszduiete servletul. Iat cum declarm o zon tampon de 16 kilooctei: <%@ page buffer=16kb %>
autoFlush specific felul cum se anun umplerea zonei tampon cu output-ul generat de pagina, ce
conine acest atribut n directiva page. Dac true, tamponul se va goli n mod automat la umplerea sa.
Dac false, umplerea va conduce la setarea condiiei de depire overflow. Se asum true.
isErrorPage dac este true aceasta nseamn c pagina curent va conine obiectul exception. O
valoare false (adic cea asumat) specific faptul c obiectul exception nu este accesibil. Orice
referire la acest obiect exception se va solda cu o eroare fatal anunat de ctre parserul JSP.
errorPage specific o adres n sens URL spre pagina care se ocup de tratarea erorilor servletului. n
acea pagin trebuie s existe neaprat atributul isErrorPage setat pe true.
Directiva include

Are forma sintactic:


<%@ include=specificator_fiier %>

De exemplu scriem <%@ include=/inc1/header.inc %> i n acest caz se caut n


directorul inc1 frate al directorului curent fiierul de tip text header.inc. Neaprat ca
fiierul inclus s nu fie o clas ci un fiier de tip text. Specificatorul de fiier este n sens
URL i n mod relativ, aa cum am explicat mai sus prin acele exemple cu directorii.
Directiva taglib

Are forma sintactic:


<%@ taglib=prefix care precede numele etichetei personalizate url=adresa relativ
sau absolut n sensul URL %>

i definete o bibliotec de etichete personalizate. Nu am tratat aceast facilitate n


cartea de fa. Totui taglib este definit nc de la versiunea JSP 1.1.
Cteva etichete JSP (direct exemple)

TABELUL B.1
Denumirea Explicarea exemplului din Exemplul
etichetei coloana alturat
<jsp:forward page=page2.jsp /> sau
forward Trimitem mai departe cererea din
<jsp:forward page=page2.jsp> . . . </jsp:forward>
pagina page1.jsp la page2.jsp spre
a fi prelucrat.
<jsp:getProperty name=it property=temp />
getProperty Servletul are o clas de tip Bean
sau
denumit TBean.class Una dintre
<jsp:getProperty name=it property=temp>
metodele acestei clase este
. . . </jsp:getProperty>
denumit getTemp. O solicitm ca
n interiorul clasei metoda este definit astfel:
s ne trimit valoarea temperaturii;
...
o apelm din pagina curent. Vezi
private String teta;
i useBean

public String getTemp() { return teta; }
<jsp:setProperty name=it property=temp
setProperty Servletul are o clas de tip Bean,
value=38 />
TBean.class. Una dintre metodele
sau
acestei clase este denumit
<jsp:setProperty name=it property=temp>
setTemp. O solicitm ca s fixm
. . . </jsp:setProperty>
valoarea temperaturii n variabila
n interiorul clasei metoda este definit astfel:
privat a clasei bean, denumit teta.
...
Cum? Vezi coloana alturat i
private String teta;
useBean.

public void setTemp(tVal) { teta=tVal; }
<jsp:include page=dir1/mypag.jsp />
include Include resursa mypag.jsp aflat n
sau
directorul dir1, fiu al directorului
<jsp:include page=dir1/mypag.jsp>
unde se afl pagina din care se
. . . </jsp:include>
face referirea.
<jsp:useBean name=it class=TBean />
useBean Localizeaz i instaniaz clasa
sau
TBean.class pentru a putea fi
<jsp:useBean name=it class=TBean > . . .
utilizat cu aciunile setProperty i
</jsp:useBean>
getProperty
Bibliografie
1. D., Somnea, M., Calciu, Noile tehnologii informatice i de comunicaie, ed.
Lucman, 2002, Bucureti.

2. L., A., Philips, XML, trad. ed. Teora, 2001 dup Special Edition Using
XML, ed. Que, 2000.

3. D., Somnea, Iniiere n JavaScript i tehnologiile Netscape, ed. Tehnic,


1998, Bucureti.

4. Ben, Scott, .a., Dezvoltarea aplicaiilor JSP, traducere dup JavaServer Pages
Application Development, ed. SAMS, 2001, ed. Teora, 2001, Bucureti.
nsoit de CD cu pachete freeware i shareware din anii 1999-2000, referitoare
la motoare.

5. O., Sulescu, Creai uor un Website dinamic cu PHP i mySQL, Revista:


Chip, numr dedicat proiectrii unui sit, nr.2, 2003.

6. St., Walter, J., Levine, Programarea n ASP pentru comerul electronic, trad.
Ed. Teora dup Teach Yourself E-Commerce Programming with ASP in 21
Days, ed. SAMS Publishing, 2001.

7. * * * Le Livre Blanc de Serveurs dApplications, OCTO Technology, Raport


datat martie 1999.

8. * * * Ghidul Microsoft pentru produsele de tip server, ediia a doua,2000 sau


www.microsoft.com/romania/servere, 2001.

9. Benoit, Marchal, XML by Example, ed. QUE, 2000.

Adrese Web utile


10. http://java.sun.com/j2se/download.html, pentru preluarea kitului standard
SDK2 Standard Edition, toate versiunile.

11. http://java.sun.com/j2se/download.html, pentru preluarea kitului standard


SDK2, Entreprise Edition, toate versiunile.

12. http://www.xml.com/axml/testaxml.htm, Tim Brays Adnotated XML 1.0


Recomandation, un ghid XML mai puin hain, deci explicat mai clar !
13. http://www.chami.com/, program freeware care cur un fiier HTML
de ... scame i l transform n document XML.

14. http://www.jclark.com/, un motor freeware denumit XT, scris n limbaj


Java, folosit pentru publicarea HTML a unui document tip XML,
pornind de la un fiier cu instruciuni XSL.

15. http://www.alphaworks.ibm.com/, cte un procesor freeware pentru


XSL i XST.

16. http://www.w3schools.org/, un portal pentru colarizarea ntr-unul din


limbajele XML, XSL, ASP, HTML, XHTML, JavaScript etc., mai puin
Java. Excelent!

17. http://www.lycos.com/main/?query=w3Schools, pointer spre referina


16 de la motorul de cutare lycos.

18. http://search.yahoo.com/search?p=w3schools, pointer spre referina 16


de la motorul de cutare yahoo.

19. http://search.excite.com/search.gw?search=W3Schools, pointer spre


referina 16 de la motorul de cutare excite.

20. http://www.altavista.com/cgi-bin/query?q=W3Schools, pointer spre


referina 16 de la motorul de cutare Altavista.

21. http://search.msn.com/results.asp?q=W3Schools, pointer spre referina


16 de la motorul de cutare Microsoft.

22. http://www.google.com/search?q=W3Schools, pointer spre referina 16


de la motorul de cutare adulat google i,

23. http://www.amazon.com/exec/obidos/ASIN/059600026X/W3schools03
pointer spre referina 16 chiar i de la portalul Amazon!

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