Documente Academic
Documente Profesional
Documente Cultură
Ghidul Managerului Pentru Noile Tehnologii Informatice Si de Comunicatie
Ghidul Managerului Pentru Noile Tehnologii Informatice Si de Comunicatie
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>
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)
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)
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)
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!
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.
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.
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)
<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
<<BEST>> products!</FONT>
</CENTER>
</body>
</html>
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 <<BEST>> 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
<<BEST>> 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: < , > ).
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 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);
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 <<BEST>> 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
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
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
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
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().
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>
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.
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.
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
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.
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.
<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.
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 />
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
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.
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
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 -->
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
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
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
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
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.
<HTML>
<HEAD>
<TITLE>mypisi.com - Versiunea cu cadre</TITLE>
</HEAD>
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'>
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
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()) ) {
// 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()) ) {
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).
<%!
// 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, "" );
}
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" );
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
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.
FIGURA 5.1 Modelul de acces la baze de date tip JDBC:ODBC (dup referina /4/)
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
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
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.
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
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
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
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
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
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
package jsp;
public class AusterBean {
// variabilele clasei sunt totdeauna intangibile din exterior
private String meckerel;
// 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;
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.
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.
<!--
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.
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>
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
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);
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>
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>
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())) %>
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>
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" );
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
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!
<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):
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:
<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>
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 "
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
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 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.
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).
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)
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
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.
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
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"
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
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
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!
<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
31. <html>
32. <head><title>Administrare Produse</title></head>
33. <body bgcolor="gray">
34. <%
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
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 )
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
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")
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. %>
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).
01. <%
02. ' In variabila prodRS formez tabelul cu produse pentru acea categorie, cat
03. Set prodRS = Server.CreateObject("ADODB.Recordset")
04. prodRS.ActiveConnection = Con
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"> </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
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!
01. <%
02. ' Resetez generatorul aleator
03. Randomize
04. ' Declar o constanta
05. CONST numVitrina= 3
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.!
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)
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
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.
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") )
12. <html>
13. <head><title>Inregistrare</title></head>
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!
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
03. <%
04. numeclient = TRIM( Request( "numeclient" ) )
05. parola = TRIM( Request( "parola" ) )
06. inreg = TRIM( Request( "inreg" ) )
07. ' response.write "verficclient.asp: inreg = " & inreg & "<BR>"
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)
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.
01. <%
02. FUNCTION apostrof12(Sirul)
03. apostrof12 = REPLACE(Sirul, "'", "''")
04. END FUNCTION
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
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
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
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
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. <%
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.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
06. ' response.write "completarecomanda.asp: nume client = " & numeclient &
"<BR>"
07. ' response.write "completarecomanda.asp: parola sa = " & parola & "<BR>"
08. ' response.end
03. <%
04. ' Regasesc informatiile de inregistrare
05. sqlString = "SELECT * FROM clienti " &_
06. "WHERE id_client=" & idClient
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
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>
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
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
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.
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?
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è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
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.
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.
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
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>
PHP PHP
Source : les systme daide de Dreamweaver
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
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
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
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îne</TITLE></HEAD>
03. <BODY>
04. <%
05. Response.Write Server.HTMLEncode(">>N'hésitez pas à 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
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é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élimiteurs de sortie</TITLE></HEAD>
03. <BODY>
04. <br>Nous sommes le <%=DATE()%>
05. <br>et il est <%=TIME()%> heures.
06. </BODY>
07. </HTML>
01. <HTML>
02. <HEAD><TITLE>Arrêt de 1'exé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.
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
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
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
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
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
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
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.
01. <HTML>
02. <HEAD><TITLE>Saisie du
prénom<ITITLE></HEAD>
03. <BODY>
04. Veuillez entrer votre pré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
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éter les
champs ci-dessous :</b>
05. <FORM METHOD="POST"
ACTION="page2f.xxx">
06. <p>Nom
07. <br><INPUT name="client"
SIZE="30">
08. <p>Numé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éter les champs ci-dessous :</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é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>
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.
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>
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
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).
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.
(avec phpMyAdmin )
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.
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.
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
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
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
4
adapt du systme daide de Dreamweaver.
Pour crer un tableau dynamique :
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.
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
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
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)
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-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:
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: ! este semnul exclamrii (!), este avansul la linie nou, line
feed, 	 este tabulatorul orizontal, tab etc.
i caracterele speciale care au definite secvene de tip caracter au secvene echivalente
de tip numeric. De pild, " 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, A .
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.
Definirea formularelor
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.
nume1=Ionescu&nume2=Gheorghe&nume3=... .
<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.
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>
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>
Secvenele multimedia
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?
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>
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 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
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
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.
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.
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.
23. http://www.amazon.com/exec/obidos/ASIN/059600026X/W3schools03
pointer spre referina 16 chiar i de la portalul Amazon!