. Comertul Electronic – Magazinul Virtual

CUPRINS

CUPRINS 3

1.Introducere 5

1.1. Contextul 5

Oportunitatea creării unui site web al organizației 6

Alegerea (obținerea) unui nume de domeniu 9

Promovarea site-ului web

Tehnologia Flash pentru realizarea site-urilor web

2. Fundamentare teoretică 12

2.1. Modele de aplicații 12

2.1.1. Aplicații pe un singur nivel (single-tier) sau monolitice 12

2.1.2. Aplicații pe două niveluri (two-tier) sau Client/Server 12

2.1.3. Aplicații pe trei niveluri (three-tier) 13

2.1.4. Aplicații bazate pe web 13

2.1.5. Beneficiile sistemelor pe n nivele 14

2.2 Tehnologia Java pentru construirea aplicațiilor pe nivele 14

2.2.1 Scenariul aplicației pe mai multe niveluri 15

2.2.2 Tehnologii middle-tier pentru construirea aplicațiilor pe nivele 16

2.2.2.1 Vechea tehnologie CGI 16

2.2.2.2 Tehnologia ASP 16

2.2.2.3. Tehnologia PHP 16

2.3. Obiectele de acces la date 17

2.3.1 Modelarea datelor 17

2.3.1.1. Obiectele business, relații între entități 17

2.3.1.2 Nivelul Interfață Obiect Business 18

2.3.1.3 Modele Business. Modelul bazei de date raționale 18

2.4.1Servlets

2.3.4.2. Tehnologia JSP 19

2.4.2.1. Primirea cererii 23

2.4.2.2. Translatarea paginii 23

2.4.3. Suport pentru dezvoltarea data tier-ului 24

2.5. Principii generale in proiectarea bazelor de date 26

2.5.1. Modelul relațional 27

2.5.2. Normalizarea 28

2.5.3.1. Prima forma normala (FN1) 29

2.5.3.2. A doua forma normala (FN2) 29

2.5.3.3. A treia forma normala (FN3) 30

2.5.3.4. A patra forma normala (FN4) 30

2.5.3.5. A cincea forma normala (FN5) 31

2.6 SQL SERVER 2.6.1.Un nivel ridicat de disponibilitate 33

2.6.2.Securitate ridicată a datelor 35

3.PROIECTAREA SI ARHITECTURA SISTEMULUI

3.1 Specificatiile sistemului

3.2 Arhitectura sistemului

4. PROIECTAREA ÎN DETALIU A SISTEMULUI 38

4.1. Proiectarea bazei de date 38

Tabela 39

4.2.Vederi si alte comenzi SQL utilizate: 39

CREATE VIEW totaluri 39

Select * from users where username=username and parola=password 40

4.3. Design 41

4.3.1. Aplicația web 41

index.html 42

4.4. Implementarea 50

5. PUNEREA ÎN FUNCȚIUNE ȘI UTILIZAREA SISTEMULUI 55

5. 1.Cerintele hard și soft ale aplicației 55

5.2 Punerea în funcțiune și operarea 55

6. Concluzii 56

7. BIBLIOGRAFIE 58

8. ANEXE 59

showLogin.jsp 59

newUser.jsp 60

browse.jsp 62

checkLogin.jsp 64

checkNewUser.jsp 65

error.jsp 65

logOut.jsp 66

processOrder.jsp 66

showDetails.jsp 68

showTotal.jsp 69

Catalog.java 72

connection.java 74

Item.java 76

Login.java 77

newUser.java 77

Order.java 80

showOrder.java 82

TotalOrder.java 84

Introducere

1.1. Contextul

Într-o eră în care informația devine din ce în ce mai abundentă și din ce în ce mai necesară apare nevoia ca această informație să fie clasificată, ordonată, aranjată. Clasificarea și ordonarea informațiilor este vitală pentru evitarea acumulărilor inutile și nefolositore de informații. Aceste acumulări de informații trebuie să fie strict la obiect, adică să avem doar informația care ne este utilă.

Domeniul gestiunii informațiilor abordează problema organizării, stocării și regăsirii în timp util a datelor de care dispunem despre un anumit subiect. Neîndoielnic că fiecare dintre noi ne confruntăm continuu cu această problemă. Agenda personală, cartea de telefon, sunt mijloace simple de organizare, păstrare și regăsire a datelor de care avem nevoie la un moment dat. Această problemă legată de stocarea informațiilor, organizarea și regăsirea lor a fost rezolvată cu ajutorul bazelor de date.

O bază de date este o colecție de informații corelate, referitoare la un anumit subiect sau colectate, organizate și memorate într-un anumit scop. Sistemul care permite colectarea, organizarea, memorarea și regăsirea informațiilor dintr-o bază de date se numește sistem de gestiune a bazelor de date. Acest sistem poate să fie unul convențional în care informațiile sunt stocate pe hârtie, depuse în dosare, registre, rafturi, încăperi, etc., sau poate să fie computerizat, caz în care informațiile sunt păstrate pe suport magnetic în volume, repertorii, fișiere pe suport magnetic. În cazul stocării informațiilor pe suport magnetic, operarea în baza de date se face prin intermediul unor programe.

S-a ajuns astfel la o situație în care fiecare firmă sau instituție trebuie să își dezvolte propriul sistem informatic de gestionare a bazei de date, dat fiind faptul că încă nu există un sistem informatic atât de general și de flexibil încât să se adapteze cerințelor oricărei organizații. Cu atit mai mult, pentru o societate comerciala, posibilitatea de a lucra nemijocit cu clientul (local dar si la distanta) este o oportunitate deosebita. Prin realizarea iesirii pe Internet si dand clientului posibilitatea sa gaseasca singur, de acasa, toate informatiile, ba mai mult, dand posibilitatea sa vizualizeze catalaoge de produse, deviz si lucrari de referinta reprezinta un pas important in realizarea integrarii propriilor date si sisteme de afaceri cu alti oameni si alte firme din tara si din strainatate

1.2. Specificarea temei

Având în vedere cerințele actuale și viitoare ale economiei de piata, în lucrarea de față, am realizat proiectarea unui site pentru firma BizZu Shop & Service S.R.L. care are ca obiect principal de activitate Vanzarea si Service-ul Calculatoarelor si Telefoanelor mobile.

Pornind de la faptul ca lansarea pe Internet a unei firme este ceva la moda in zilele noastre, si un fapt care face o firma sa fie cunoscuta pe plan international, am realizat un website care sa reflecte cat mai fidel realitatea. De aceea, site-ul cuprinde urmatoarele sectiuni:

Sectiunea About- care descrie pe scurt istoricul firmei;

Sectiunea Products- care descrie pe scurt produsele puse spre vanzare;

Sectiunea Service- care descrie serviciile oferite de catre BizZu Shop & Service;

Sectiunea Contact- care permite sa luam contact cu reprezentantii legali ai firmei;

Sectiunea Comenzi-prin care se poate realiza comandarea unor lucrari si realizarea unui deviz pentru clientul potential.

În partea teoretică sunt prezentate pe scurt modelele de aplicații pentru lucrul cu baza de date, tehnologia Java pentru construirea aplicațiilor pe nivele, obiectele de acces la date, si tehnologia JSP.

Partea practică conține descrierea proiectării și implementării aplicațiilor. Aplicația este destinată unei firme de constructii și implementează posibilitatea de a prelua comenzi on-line prin intermediul internetului.

1.3 Oportunitatea creării unui site web al organizației

La prima vedere, crearea și dezvoltarea unui site web al organizației reprezintă o problemă deja rezolvată. Într-adevăr, din punct de vedere strict tehnic, crearea acestuia nu mai constituie un obstacol în fața organizațiilor care doresc acest lucru. Microsoft FrontPage Express (un program specializat în crearea de pagini web integrat în cadrul Internet Explorer) sau Macromedia Flash au rezolvat problema.

Site-ul de web va ajuta sa micsorati costurile legate de distribuirea informatiilor, avand in vedere ca plasarea informatiilor pe web si trimiterea lor catre clienti este cu mult mai putin costisitoare decat tiparirea si trimiterea lor prin posta.

Informatia poate fi actualizata imediat, instant pe site-ul de web, ceea ce este mult mai rapid si mai putin costisitor decat retiparirea unor materiale promotionale,servirea mai buna a clientilor

Un site web bine realizat inseamna pentru clienti acces la informatii 24 de ore pe zi si 7 zile pe saptamana. Puteti facilita de asemenea plasarea de comenzi online si verificarea stadiului in care se afla comenzile, puteti plasa online un catalog de produse si puteti oferi un formular pentru contactarea personalului firmei prin e-mail. Pentru clienti, toate acestea inseamna comoditate si o servire mai buna,mai multe vanzari si un profit mai mare!

Poate cel mai important scop al prezentei online este reprezentat de marirea vanzarilor. Prin intermediul unui site de web va puteti prezenta produsele si serviciile oamenilor din intreaga lume, avand astfel acces la noi piete, la care nu ati putea ajunge in alte moduri.

Prin site-ul de web va puteti prezenta firma si oferta clientilor din intreaga lume. Prezenta pe Internet poate genera nenumarate oportunitati de afaceri internationale pentru compania dumneavoastra.

Cel mai sigur mod de a impune pe piata un produs este un design impecabil.

Armonizarea functionalului cu esteticul are ca efect o satisfactie deosebita. Simpla referire la o renumita companie este legata instantaneu de imaginea prin care aceasta este reprezentata.

În primul caz este vorba despre furnizarea unui volum de informații atractive și suficiente pentru a determina o reacție favorabilă a clienților: cumpărarea sau comandarea produselor (serviciilor) promovate sau cel puțin solicitarea de informații suplimentare despre acestea.

În al doilea caz este vorba despre diferențierea organizației în raport cu competitorii săi, în general .

Site-ul web al organizației trebuie să fie perceput astfel ca un instrument de marketing on-line, cu caracter strategic, al acesteia. Acesta nu poate fi creat pentru a răspunde unor necesități de moment, pentru a limita sau elimina anumite situații tactice nefavorabile, sau pentru că, în ultimă instanță, este de bon-ton pentru "o firmă care se respectă". Crearea sa implică, din partea organizației, angajamentul clar pentru integrarea și utilizarea acestuia în cadrul organizației;alocarea unor resurse specifice (tehnologie, bani, oameni și timp) pentru actualizarea și extinderea conținutului său.

Iată câteva întrebări ale căror răspunsuri pot orienta organizația în încercarea sa de a crea un site web:

Este piața suficient de largă din punct de vedere al ariei pentru a presupune acoperirea acesteia și prin intermediul Internetului?

În ce măsură utilizatorul potențial are acces la Internet și, respectiv, îl utilizează pentru a obține informații sau a cumpăra diferite produse sau servicii?

Este piața suficient de mare din punct de vedere al capacității sale pentru a asigura rentabilitatea promovării și, eventual, vânzării prin intermediul Internetului a produselor și serviciilor organizației?

În ce măsură produsele (serviciile) pentru care urmează să fie creat site-ul pot fi promovate adecvat utilizând Internetul și, ca instrument specific, site-ul web?

Dispune organizația de capacitatea logistică necesară pentru a expedia (presta) efectiv produsele (serviciile) promovate prin intermediul site-ului web?

Care va fi efectul generat asupra vânzărilor produselor si serviciilor prin crearea site-ului web?

Care va fi efectul generat asupra imaginii organizației prin crearea site-ului web?

1.3.1Ce este un site web?

Un site este o colecție de pagini web construite în raport cu o anumită structură predefinită și având ca obiective principale crearea suportului pentru realizarea comunicației de marketing a organizației în spațiul virtual și/sau crearea platformei pentru desfășurarea comerțului electronic cu produsele și/sau serviciile organizației

Din punct de vedere tehnic, paginile web sunt create preponderent cu ajutorul limbajului HTML (Hypertext Markup Language) reprezentând în esență un ansamblu de instrucțiuni folosite pentru a cou de instrucțiuni folosite pentru a construi și reprezenta texte, imagini, link-uri sau orice alte componente ale unei pagini web

structura unei pagini web cuprinde elementele care se regăsesc cel mai frecvent în conținutul unei pagini web. Acestea sunt:

titlul paginii: apare în bara de titlu a programului de navigare pe Internet utilizat și servește atât la identificarea paginii și a conținutului acesteia cât și pentru facilitarea căutării acesteia în spațiul virtual;

subtitlurile (titlurile interne): servesc la structurarea logică a conținutului paginii în secțiuni distincte facilitând parcurgerea acesteia în raport cu interesul celui care o vizualizează;

conținutul paginii: cuprinde informațiile pe care organizația intenționează să le transmită publicului vizat.

Pentru prezentarea acestora pot fi utilizate diferite texte, imagini, elemente grafice, sunete sau alte elemente de conținut, de obicei în combinație astfel încât efectul asupra publicului să fie maxim;

lista: reprezintă nu atât un element de conținut cât mai ales un mod de prezentare (formatare) care poate fi utilizat pentru structurarea și prezentarea informațiilor incluse în paginile web. Utilizarea acesteia conferă mai multă claritate și concizie în prezentarea și urmărirea informațiilor incluse în paginile web;

hyperlink-urile: oferă posibilitatea urmăririi doar a acelor secțiuni de care este interesat "navigatorul" (în cadrul aceleiași pagini), alte pagini (având un conținut similar sau asociat paginii văzute inițial) sau chiar alte site-uri având legătură directă cu conținutul informațiilor prezentate în pagina accesată (vizualizată) inițial;

informațiile de contact: numele, prenumele și elementele de localizare (adresă poștală, număr de telefon sau fax, adresă de e-mail, etc.) ale persoanei (persoanelor) care au creat, administrează sau dețin pagina accesată.

Structura unui site web include:

Pagina de introducere

Paginile de produs (serviciu)

Formularul de comandă

Chestionarul

1.3.2Alegerea (obținerea) unui nume de domeniu

Este un pas foarte important.Găsirea unui server-gazdă pentru site-ul organizației are in vedere urmatoarele criterii de selectie:

1.stocarea de date: cu cât spațiul oferit de furnizorul de Internet este mai mare cu atât probabilitatea de selecție a acestuia crește); nu este suficientă cunoașterea volumului spațiului disponibil ci și "chiria" plătită pentru acesta (exprimată uzual în dolari/MB); de asemenea, interesează și condițiile în care poate fi obținut un spațiu suplimentar pentru stocarea de fișiere ale organizației (texte, imagini, sunete, etc.)

2.transmiterea de date: elementele de referință sunt reprezentate de viteza de transfer de date și de cantitatea de date apte a fi transmise către cel care accesează site-ul organizației; există limite tehnice sau contractuale referitoare la aceste aspecte? Cu cât cantitatea de informații care se dorește a fi disponibilizată pentru publicul vizat este mai mare, cu atât este necesară o viteză de transfer mai mare și absența oricăror limitări în transferul acestora

3.Urmărirea traficului este un element-cheie în evaluarea eficienței utilizării site-ului web ca instrument on-line; ceea ce interesează este existența unor facilități cum ar fi contorizarea numărului de accesări, repartiția acestora pe intervale temporale (ore, zile, etc.) și identificarea acestora (de exemplu identificarea motoarelor de căutare de pe care a fost accesat site-ul)

Reexpedierea poștei electronice permite retransmiterea tuturor mesajelor de poștă electronică de către administratorul (deținătorul) server-ului gazdă către organizația care a închiriat spațiu pe acesta într-un cont de poștă electronică specificat de aceasta

Natura conexiunii la Internet a serverului-gazdă: tipul conexiunii și viteza de transfer sunt esențiale pentru "vizibilitatea" site-ului web al organizației în spațiul virtual. Cu cât site-ul este mai accesibil, cu atât eficiența și utilitatea sa vor fi mai mari pentru organizație.

Alegerea serverului-gazdă este rezultatul unei analize comparative a facilităților oferite de către diferiții furnizori avuți în vedere și a facilităților vizate ce către organizație.

respectarea acestor cerințe presupune desfășurarea unor acțiuni (campanii) de marketing distincte, atât on-line cât și off-line, urmărind ca obiectiv principal (sau, în anumite cazuri, secundar) informarea publicului despre existența site-ului, crearea de trafic către site sau ambele concomitent

Iata cateva exemple de acțiuni care pot fi avute în vedere pentru promovarea site-ului web:

inserarea unor informații minimale privind site-ul și link-ul de acces la acesta pe principalele motoare de căutare pe Internet,inserarea unor bannere publicitare pe motoarele de căutare pe Internet cele mai utilizate sau pe site-urile unor organizații cu ale căror produse sau servicii există un anumit grad de asociere în cumpărare, consum sau utilizare,inserarea unor link-uri de acces la site-ul web al organizației incluse în cele mai importante site-uri de resurse existente în spațiul virtual,includerea unor informații minimale privind existența site-ului web în mesajele publicitare specifice comunicației tradiționale (de exemplu, menționarea adresei Internet a organizației, www.organizația.ro, într-un anunț publicitar tipărit),organizarea unor acțiuni de relații publice ocazionate de lansarea și dezvoltarea site-ului web al organizației (de exemplu, o conferință de presă desfășurată cu ocazia lansării site-ului sau publicarea unor articole referitoare la conținutul site-ului în publicațiile de specialitate sau în rubricile specializate existente în diferitele publicații cotidiene sau periodice),organizarea și desfășurarea unor concursuri cu premii care răsplătesc cunoașterea și accesarea site-ului web al organizației sauparticiparea la un târg specializat pe tehnologia informației sau chiar Internet cu un stand cuprinzând mai multe posturi de lucru de la care poate fi accesat site-ul

1.3.3 Realizarea site-urilor in Flash

Site-uri tot mai viu colorate, animatii spectaculoase, efecte tridimensionale – acestea ar fi doar cateva din elementele care definesc Web-ul actual. Elementele grafice sunt in mod neindoielnic ''sarea si piperul'' site-urilor Web. Fara imagini, fotografii, animatii si alte elemente grafice, Web-ul ar fi fost mai putin atragator, mai tern si, in consecinta, ar fi avut un succes mult mai redus.

Ce este animatia flash? Flash este un program de animatie grafica vectoriala de la Macromedia care permite animatiilor Flash sa arate la fel pe orice browser atat timp cat este instalat plug-in-ul. Unul dintre avantajele animatiei Flash este combinarea calitatii animatiei cu timpul relativ scurt de incarcare.

De la aparitia sa in 1996, Flash a devenit in scurt timp principala tehnologie de animatie si design bazata pe grafica vectoriala, fiind folosita de mai mult de 100 de milioane de utilizatori ce au deja instalat programul. Lansand Flash ca standard web, Macromedia, a permis utilizarea gratuita si fara licenta a programului, permitand si redistribuirea acestuia. Mai raspandit decat Java sau orice alt program bazat pe grafica vectoriala, Flash s-a impus ca o solutie pentru grafica vectoriala de mare impact pentru designul web.

Beneficiile folosirii Flash-ului

Flexibil – Flash este unealta folosita pentru a crea orice, de la animatii full screen pana la bare de navigare, butoane animate, ilustratii, harti, bannere de reclama, etc.

Rapid – Sparge bariera latimii de banda cu fisierele Flash care ruleaza chiar si in timp ce sunt descarcate. Nu exista timp de asteptare nici chiar in cazul conexiunilor lente.

Compact – Fisierele Flash sunt foarte mici chiar si atunci cand animatia ruleaza in full screen. Player-ul Shock Wave Flash este de asemenea mic, in jur de 200 kb.

Atractiv – Avantajul antialiasing-ului inseamna ca toate literele si imaginile au marginile finisate chiar si cand sunt animate.

Interactiv – Orice animatie grafica poate fi un buton. Flash este tehnologia revolutionara pentru crearea interfetelor multimedia pe web.

Universal – Continutul Flash ruleaza oriunde prin suportul pentru ActiveX, Flash Player Java Edition, GIF, GIF animat, RealPlayer, Shock Wave Flash plug-in, WebTV, pe conexiuni lente.

Foarte multe site-uri au inceput sa opteze pentru aceasta tehnologie, "intrucat noi suntem singurii care putem furniza, prin intermediul Flash-ului, interfete atragatoare, dinamice, ce pot retine internautul pe un site", sustine Jose Vasco, director general al Macromedia. Caci, intr-adevar, o data cu aparitia acestei tehnologii, paginilor terne, in alb – negru, le vor lua locul culoarea, animatia sau desenul animat. "Flash-ul, pur si simplu, a facut Web-ul sa se miste. Si cand te gandesti ca, Flash-ul a pornit de la niste banale linii de comanda, de la experimentele si algoritmii inventati de pionierii programarii. O data cu aparitia acestui program, Net-ul s-a animat, s-a colorat si a devenit cu adevarat interactiv", explica Damien Giard, developer in cadrul societatii cHaNm, renumita pentru creatiile sale in Flash.

Nici Melvin Knight, sef editorial in cadrul site-ului satiric WebMatin.com nu ezita sa laude performantele acestei aplicatii: "Flash-ul ne permite sa oferim, in fiecare dimineata, vizitatorilor nostri animatii atragatoare, interactive, evolutive si usor de citit." Si, in ciuda aparentelor, Flash-ul nu diminueaza viteza de navigare, intrucat player-ul descarca sfarsitul animatiei, in timp ce internautul vizualizeaza inceputul acesteia. Si, chiar daca se adreseaza mai mult specialistilor, popularitatea sa a crsecut atat de mult incat azi, peste 90% dintre internauti detin player-ul indispensabil lecturii paginilor Flash.

2. Fundamentare teoretică

2.1. Modele de aplicații

Vom prezenta în cele ce urmează diferite modele de arhitecturi software. În aplicațiile cu baze de date, apare evidentă o separare logică pe cel puțin trei niveluri:

Nivelul prezentare (Presentation tier) – care reprezintă interfața cu utilizatorul și se află deasupra celorlalte niveluri

Nivelul de logică a aplicației (Business tier) – este nivelul în care se modelează procesul și restricțiile fluxului de date

Nivelul de acces la date (Data services tier) – este nivelul care asigură accesul la date.

Această delimitare se poate face la nivel fizic, logic sau ambele.

2.1.1. Aplicații pe un singur nivel (single-tier) sau monolitice

Este cel mai simplu model de aplicație. În acest model, programul rulează pe aceeași mașină pe care se găsesc și datele și include și facilități specifice unui motor de baze de date. Acest tip de aplicație nu este scalabil, nu permite distribuție și se pretează doar la aplicații de dimensiuni reduse. Acest model nu ne interesează deoarece aplicația noastră va fi una bazată pe Internet, deci distribuită prin excelență.

2.1.2. Aplicații pe două niveluri (two-tier) sau Client/Server

Este cel mai simplu model de aplicație în care există o separare clară între aplicație și nivelul de date. În acest model, procesarea datelor e mutată de pe mașina utilizatorului pe un motor de baze de date dedicat.

2.1.3. Aplicații pe trei niveluri (three-tier)

Aplicațiile pe două niveluri Client/Server s-au dovedit în timp insuficient de performante pentru aplicații mai mari pentru că fiecare stație client menține un dialog cu serverul central, astfel generându-se trafic intens prin rețea. Prin introducerea unui nivel intermediar între aplicația client și baza de date se poate spori performanța, îmbunătăți disponibilitatea aplicației și, totodată, aplicația devine mai robustă și mai eficient de întreținut. Acest nivel intermediar conține elementele de logică ale aplicației. Acest nivel intermediar se poate constitui într-un server de aplicație (application server) care poate genera un nivel fizic separat sau poate rula pe aceeași mașină cu alte niveluri ale aplicației. În principiu, pentru mărirea performanțelor, este mult mai ușor de a adăuga servere de aplicație decât a adăuga servere de baze de date, care ar implica probleme complexe de distribuire a datelor.

2.1.4. Aplicații bazate pe web

Aplicațiile bazate pe World Wide Web au o abordare diferită, punând cât mai puțină încărcătură pe client și menținând procesarea centralizată pe unul sau mai multe servere. Diferența e că în loc să avem interfața utilizator peste nivelul obiectelor, acum avem un nivel de interfață web care interacționează cu web server-ul și comunică cu obiectele (business objects) pentru a crea paginile HTML trimise clientului.

Soluția pentru problema noastră este această din urmă arhitectură, cu mențiunea că ea poate fi folosită și pentru clienți desktop care vor comunica cu Serverul de aplicații.

2.1.5. Beneficiile sistemelor pe n nivele

Problema care apare aici este “de ce așa mult deranj și se dezvoltă așa de multe straturi?” Ar părea a fi multă muncă suplimentară și în același timp o afectare a performanțelor sistemului. [1] Împărțirea sistemului în nivele încapsulează straturile unul în altul având ca rezultat faptul că schimbările pot fi făcute în cadrul sistemului și nu vor afecta întregul cod sursă[1].

Cu un sistem pe nivele poate fi îndeplinită în special o mai bună distribuire a muncii privind nivelul de acces la date. Datorită faptului că modelul bazei de date raționale este prins în propriul cod, o echipă specială poate fi însărcinată doar cu menținerea modelului bazei de date, astfel încât echipa dezvoltării Java să nu fie implicată în această parte a proiectului.

Viteza de execuție nu este totul în special într-un sistem care vrea să fie dezvoltat în cadrul unei întreprinderi. Scalabilitatea, reutilizabilitatea, și timpul de dezvoltare va fi adesea mult mai cerut decât viteza executării aplicației. [1].

2.2 Tehnologia Java pentru construirea aplicațiilor pe nivele

Această parte se va focaliza pe tehnologiile Java care pot fi folosite pentru dezvoltarea unei astfel de aplicații pe nivele.

De la introducerea sa Platforma Java 2 Enterprise Edition (J2EE), s-a stabilit rapid un nou model pentru dezvoltarea aplicațiilor pe nivele distribuite. Acest model se bazează pe componente bine definite care pot să profite de serviciile platformă sofisticate. Aceste componente pot fi dezvoltate prin metode standard, combinate în aplicații, desfășurate pe o varietate de produse server compatibile și refolosite pentru o maximă productivitate a programului. Acest model intenționează să standardizeze și să simplifice modelul aplicațiilor cerute în economia actuală a informațiilor din rețea. Succesul platformei J2EE este datorat în mare parte succesului acestui model.

În prezent principalele aplicații server și vânzătorii rețelelor de sisteme informatice pentru firme, au adoptat standardul J2EE, ca ajutor în rezolvarea diferitelor provocări de design cu care se confruntă zilnic.

Secțiunile următoare prezintă câteva scenarii de aplicații. Specificațiile J2EE încurajează diversitatea arhitecturii. Aceste specificații și tehnici fac puține afirmații referitoare la detaliile implementărilor API. Deciziile și alegerile la aplicație sunt în ultimul rând un schimb între bogăția funcțională și complexitate.

Modelul de programare J2EE este destul de flexibil pentru aplicațiile care suportă o varietate de tipuri de clienți cu recipiente Web și EJB ca opțiuni. În cele ce urmează vom prezenta dimensiunea configurațiilor posibile ale aplicațiilor, incluzând cazurile în care clienții interacționează singuri cu recipientul Web, când clienții interacționează direct cu recipientul EJB, și aplicații pe mai multe nivele cu clienți de sine stătători, componente de nivel Web, componente EJB de nivel intermediar și accesul la resurse și date.

2.2.1 Scenariul aplicației pe mai multe niveluri

Acesta este un scenariu de aplicație în care recipientul Web găzduiește componente Web care sunt aproape exclusiv dedicate manipulării logicii prezentării unei aplicații date. Paginile JSP, suportate de servlet, generează un conținut Web dinamic pentru livrarea către client. Containerul EJB găzduiește componente de aplicații care folosesc resursele pentru cereri de servicii de la componentele nivelului Web. Această arhitectură decuplează accesul la date de la interfața utilizatorului. Arhitectura este dealtfel scalabilă inplicit. Funcționalitatea aplicației back-office este relativ izolată de privirea și simțurile utilizatorului final.

2.2.2 Tehnologii middle-tier pentru construirea aplicațiilor pe nivele

2.2.2.1 Vechea tehnologie CGI

Tehnologia CGI (Common Gateway Interface) este cel mai vechi si simplu mod de a utiliza o cerere HTTP pentru a controla iesirea HTTP a aplicatiei pe partea de server. Cand o cerere a fost trimisa de catre browser catre o pagina web, se lanseaza un script extern ( scris in C++, PERL, sau Pyton) pe server astfel incat pagina va fii creata. Exista insa niste probleme: CGI cere doar serverului sa-i paseze informatiile cerute se pregateste sa eturneze rezultatul clientului. Nu exista suport de gestionare a sesiunii de lucru intre cereri, decat daca utilizatorul nu si le creaza singur. De asemenea, limbajele de programare ca C sau C++ nu verifica daca un sir isi depaseste limitele, putandu-se astfel exploata o tara de securitate importanta ca buffer overflow.

2.2.2.2 Tehnologia ASP

Tehnologia ASP, sau ASP .net estecompetitoarea cea mai puternica a tehnologiei Java. Dar are mai multe dezavantaje:

functioneaza doar pe platforma Microsoft;

limbaje de baza sunt JScript sau VBScript care nu au componente reutilizabile;

tagurile nu pot fi extinse

nu are suport nativ decat pentru Microsoft IIS

2.2.2.3. Tehnologia PHP

Este o tehnologie foarte buna, dar avantajele limbajului Java in ceea ce priveste securitatea si scalabilitatea sunt net superioare. Nu are suport pentru baza de date SQL Server. In plus, este un limbaj complet separat, iar daca stii Java, ce rost mai are sa inveti si un alt limbaj?

2.3. Obiectele de acces la date

În cele ce urmează ne vom concentra pe scenariul centrat Web prezentat în secțiunea 2.3.3, și la sfârșit va conține descrierea unei aplicații dezvoltată în conformitate cu acest scenariu.

2.3.1 Modelarea datelor

Modelarea datelor se referă la datele propriu-zise, care nu sunt efemere, stări sau asocieri de sisteme în natură, date reale.

2.3.1.1. Obiectele business, relații între entități

O diagramă a relației dintre entități descrie entitățile din modelul afacerii și relațiile dintre ele. Aceste diagrame pot fi folosite pentru a construi o schemă de bază de date și în același timp pentru a identifica obiectele afacerii din stratul afacerii dintr-un sistem pe n nivele.

Pentru o aplicație pe n nivele (n-tier) unde modelul obiectului business imită îndeaproape relația-entitate a diagramelor bazei de date, modelul obiectului fizic poate diferi semnificativ de schema bazei de date[1]. Ar fi câteva motive pentru aceasta, dar principalul este că codul Java este un limbaj de programare, iar schema bazei de date este o descriere a modului în care datele trebuie stocate. În modelul obiect Java are sens să avem două entități corelate, moștenite de la o clasă de bază comună, chiar dacă schema bazei de date nu arată o asemenea relație[1].

Ideea cheie în lucrul cu obiectele afacere este că fiecare entitate a modelului obiectului afacere trebuie să aibă o entitate corespondentă modelată în cadrul bazei de date.

2.3.1.2 Nivelul Interfață Obiect Business

În modelul obiectului business sunt un număr de obiecte cu care sistemul lucrează și încearcă să le urmărească. Din cauză că stratul business pentru o anumită aplicație poate fi mai târziu mărit sau refolosit într-un alt sistem, trebuie construit un strat ce constă într-o serie de interfețe Java. Toate aceste interfețe oferă un tablou cu interacțiunile cu obiectele business și nu oferă nici o informație asupra actului implementării obiectelor.

Aceste interfețe nu conțin definițiile modelelor cum ar fi crearea de obiecte, ștergerea obiectelor sau modificarea lor. Toate aceste metode sunt definite în nucleul interfeței din modelul interfață, care este o interfață specială care funcționează cu toate tipurile de obiecte definite deja. Această clasă este punctul de pornire al stratului-afacere și doar prin această clasă are acces utilizatorul la obiectele nivelului business.

Prin încapsularea complexității implementării actuale, ascunsă de utilizator, cei care implementează sistemul câștigă un plus de flexibilitate în adaptarea implementării către nevoile specifice, cum ar fi răspunsul la cererea utilizatorului sau a schimbărilor tehnologiei, fără să spargă codul clientului[1].

Unul din scopurile principale ale oricărui grup de dezvoltare business este să producă sisteme care să poată fi întreținute, scalabile și reutilizabile. Un nivel de încapsulare între mecanismul de stocare actual și codul care prezintă sau manipulează va ajuta la reutilizabilitatea sistemului ca întreg. Acest strat cunoscut ca stratul Business, servește la protejarea sistemului de incapacitatea de a evolua deoarece dacă schimbăm aceasta, tot codul se va sparge[1].

Datorită faptului că încapsularea e oferită de stratul Business, se poate adăuga o capacitate de distribuție a sistemului, fără să fim nevoiți să modificăm porțiuni semnificative din cod. Astfel datorită stratului Business, sistemul poate fi ușor modificat sau dezvoltat în viitor în conformitate cu nevoile utilizatorului. Stratul Business mai furnizează și o metodă de protecție a sistemului împotriva cererilor nerezonabile din partea utilizatorului.

2.3.1.3 Modele Business. Modelul bazei de date raționale

După cum spune și numele, acest model este folosit pentru manipularea datelor într-o bază de date rațională, toate comunicațiile cu baza de date fiind dată printr-un JDBC driver. Sunt câteva motive pentru utilizarea unei astfel de abordări:

Această abordare este folosită chiar dacă există o bază de date relațională cu schema ei proprie, și nimeni nu este interesat sa-și mute datele pe un alt sistem de stocare.

Chiar dacă nu există o bază de date rațională, compania probabil că și-a standardizat sistemul de stocare a datelor.

Din cauză că majoritatea depozitelor de date sunt construite peste modelul rațional și din cauză că toate proiectele și aplicațiile lucrează cu aceste depozite de date ale companiei.

Acest model amestecă o viziune ordonată asupra lumii cu o viziune orientată obiect a aceleași lumi. Astfel, într-un astfel de mod vom aranja clasele în tabele, obiectele în celule și membri obiectelor în coloane.

Această contopire a celor două, numită modelul obiect-relațional sau modelul ori stratul asocierii obiect-relațional, pune probleme design-ului și implementării. Din cauză că modelul nu este în totalitate bazat pe obiect (obiectual), nici în totalitate rațional dezvoltările din fiecare parte trebuie făcute luând în considerare și celălalt. Aceste compromisuri pot să conducă la scăderea performanței sau la o manipulare mai ciudată decât a oricărui model pur de orice fel.

Există numeroase instrumente comerciale sau gratuite care așteptă să aibă în grijă asocierea obiect-relație. Din păcate, instrumentele automate nu pot să-și adapteze toate forțele necesare de design în crearea stratului asocierii obiect-relațional. De exemplu, cele mai multe instrumente automate presupun că schema bazei de date poate fi modificată pentru a se potrivi cu modelul obiect, ceea ce nu este adevărat cel mai adesea. Mia rău, multe baze de date sunt denormalizate intenționat pentru o mai bună performanță, și cerând unui instrument automat să recunoască relația între două tabele care nu au o relație specială între ele, ar însemna să cerem imposibilul. Astfel multe dintre aceste straturi obiect-relații trebuie să fie create și codate manual de către design-eri și arhitecții de sistem[1].

2.4.1 Servlets

Se poate spune ca un servlet este rezultatul combinarii unui applet cu un script CGI. Din punct de vedere al programarii , un servlet seamana cu un applet: este un executabil scris in limbajul de programare Java si de obicei este executat ca si raspuns la o cerere provenita de la o pagina HTML.

Din punct de vedere al tipului de activitate pe care o executa, un servlet seamana mai mult cu un Script CGI(Common Gateway Interface). Ca si un script CGI, un servlet poate raspunde la intrari utilizator- cum ar fi apasarea unui buton dintr-un form. Un servlet poate sau sa colecteze infomatie de la utilizator sau sa trimita informatie inapoi spre utilizator (sau ambele), depinde de tipul de actiuni care sunt initiate de form-ul pe care-l completeaza utillizatorul. Daca un servlet este construit sa trimita informatie spre utilizator, informatia poate fi retinuta in diferite feluri: de exemplu intr-o baza de date. Apoi servlet-ul poate construi in mod dinamic o pagina HTML care sa contina informatia retinuta. Aceasta pagina poate fi afisata desigur in browser-ul utilizatorului.

Servlet-ul nu este singurul mecanism care poate interactiona in acest fel cu utilizatorul. Script-ul CGI poate efectua operatii similare- pana la aparitia servlet-ului, script-ul CGI era mecanismul standard pentru crearea si afisarea in mod dinamic a paginilor HTML. Dar servlet-ul are multe avantaje fata de script-ul CGI si inlocuieste rapid script-ul CGI in lumea evaluarii prompte.

Un script CGI este inferior unui servlet prin crearea unui nou proces de fiecare data cand este executat, consumand din ce in ce mai mult timp de procesare si resurse server. De asemenea, script-ul CGI este dependent de platforma si nu pot beneficia de multe capacitati ale serverelor deoarece ruleaza in procese separate de procesul server-ului. De exemplu un program CGI nu poate scrie intr-un log file al server-ului.

Servlet-ul insa nu are nici una dintre aceste nejunsuri. Este eficient deoarece nu creaza proces nou de fiecare data cand este executat; in schimb, servlet-ul este tratat de fire de executie diferite in procesul serverului Web. Poate scrie pe server log file (fisiere jurnal) si poate beneficia de avantajele capacitatilor server deoarece ruleaza in procesul corespunzator server-ului.

\'Deoarece este proiectat conform promisiunii inerente a limbajului de programare JAVA 'Scrie o data, ruleaza oriunde', servlet-ul poate fi executat fara modificari pe orice platforma

2.4.2. Tehnologia JSP

La început a fost Web-ul. Și Web-ul era static și întunecat. Apoi a apărut CGI-ul și ISAPI-ul. Și Microsoft a zis: "Să fie IDC!"; și așa a fost! Și alții au adăugat: "Să fie API-uri, SSI-uri și plug-in-uri!"; și așa a fost! Apoi Microsoft a zis: "Să fie ASP!"; și așa fost! Și aplicațiile au prins viață. Apoi Duke a zis: "Să fie Servlet-uri!"; și așa a fost! Și a luat Duke Servlet API a vorbit cu IBM, Oracle, Netscape, Weblogic și alții și a făcut JSP. Și s-a făcut lumină!…?…"

Separarea continutului dinamic de cel static

La servleturi logica de generare a continutului dinamic este destul de legata de nivelul prezentare ce se ocupa de interfata cu utilizatorul. Astfel unele modificari minore facute in interfata necesita recompilarea servletului. In cazul JSP aceasta logica este separata de continutul static, logica fiind incapsulata in componentele externe JavaBeans. Cand se face o modificare la nivelul prezenatare pagina JSP e automat recompilata si reincarcata in web server de catre engin-ul JSP. Scopul tehnologiei JSP este sa ofere o metoda declarativa pentru a dezvolta servlet-uri.

Tehnologia JSP poate deservi o varietate de 'clienti' pornind de la browsere folosind Html/DHtml pana la deviceuri mobile cum ar fi PDA-urile ce folosesc WML.

Conceptul de JSP a fost introdus în dezvoltarea inițială a Java Web Server. Ideea era de a inversa procesul, în loc să se insiste pe codul Java în care va fi integrat cod HTML, se va insista asupra schimbării HTML prin introducerea codului Java. Apoi paginile HTML vor putea fi dezvoltate în continuare de către designeri, iar programatorii Java vor putea face paginile HTML sa funcționeze conform cerințelor.

JavaServer Pages este tehnologia platformei Java pentru construirea de aplicații ce cuprind pagini de Web cu conținut dinamic precum HTML, DHTML, XHTML și XML. Sun a încercat să depășească limitările soluțiilor actuale pentru generarea de pagini cu conținut dinamic prin dezvoltarea unei tehnologii care:

să funcționeze pe orice server Web sau de aplicații;

să separe logica ce stă în spatele aplicației de aspectul paginii;

să permită dezvoltare și testare rapidă;

să simplifice procesul de dezvoltare de aplicații interactive Web.

Tehnologia JSP a fost creată să satisfacă aceste cerințe, fiind rezultatul unei cooperări la nivelul industriei software dintre producătorii de servere Web, servere de aplicații, sisteme tranzacționale și unelte de dezvoltare. Astfel, procesul dezvoltării de pagini de Web dinamice este accelerat de către JSP din următoarele considerente:

Separarea generării conținutului de prezentare

Prin tehnologia JavaServer Pages, proiectanții de pagini folosesc tag-uri obișnuite HTML sau XML pentru formatarea rezultatului și tag-uri JSP sau scriplet-uri pentru generarea conținutului dinamic al paginii. Logica ce stă în spatele generării conținutului este cuprinsă în tag-uri și componente JavaBean, legătura dintre acestea făcându-se în scriplet-uri și totul fiind executat pe server. Astfel, proiectanții de pagini sau Web master-ii pot edita și lucra cu pagini JSP fără a afecta generarea conținutului dinamic.

Pe partea de server, un engine (motor) JSP interpretează scriplet-urile și tag-urile JSP, generează conținutul cerut (accesând componente JavaBean, baze de date folosind JDBC sau prin includerea de fișiere) și trimite rezultatele înapoi sub forma unei pagini HTML (sau XML) către browser.

Reutilizarea componentelor și a tag-urilor

Tehnologia JSP permite reutilizarea componentelor precum JavaBeans, Enterprise JavaBeans sau a tag-urilor atât independent, cât și în cadrul unor unelte interactive de dezvoltare a componentelor și paginilor de Web. Creatorii de pagini Web nu sunt întotdeauna programatori familiarizați cu limbaje de scripting. JSP încapsulează funcționalitățile necesare pentru crearea de conținut dinamic în tag-uri de tip XML specifice JSP. Tag-urile JSP standard pot accesa și instanția componente JavaBean, pot seta sau obține atribute ale bean-urilor, pot face download la applet-uri și pot executa funcții ce ar fi dificil de implementat. Tehnologia JSP este extensibilă prin dezvoltarea de biblioteci de tag-uri definite de utilizator (vezi [3]). Cu timpul vor fi create biblioteci proprii de tag-uri pentru funcțiile folosite cel mai frecvent.

"Write once, run anywhere"

Tehnologia JSP este complet independentă de platformă atât în ceea ce privește paginile de Web dinamice, cât și serverele de Web și componentele acestora. Aceasta este explicabil deoarece limbajul de scripting pentru paginile JSP se bazează pe Java și în special pe modul de manipulare a obiectelor în acest limbaj (vezi paragraful 1.4.4 din [2]).

Pagini JSP

O pagină JSP (*.jsp) este o pagină HTML sau XML ce cuprinde elemente adiționale (tag-uri, declarații, scriplet-uri) pe care motorul JSP le procesează și le elimină returnând o pagină standard HTML/XML. Ea corespunde unui document ce descrie procesarea unei cereri pentru a crea un răspuns.

O pagină JSP cuprinde în structura sa:

cod HTML/XML standard – cod ce rămâne neinterpretat de motorul JSP;

directive JSP – directive ce furnizează informații globale independente conceptual de o anumită cerere adresată paginii JSP;

tag-uri JSP – spre deosebire de directive, tag-urile depind de fiecare cerere în parte adresată paginii JSP;

elemente de scripting – acestea putând fi: declarații, scriplet-uri și expresii.

cod HTML standard;

o directivă JSP ce transmite informații motorului JSP. În cazul de față este inclus fișierul copyright.html în etapa de traducere în servlet-ul ce va genera pagina de răspuns;

tag-uri JSP: implementate ca tag-uri standard sau definite de utilizator(în versiunea viitoare 1.1) având sintaxa XML a unui tag. În exemplu se folosesc jsp:useBean și jsp:include pentru a instanția JavaBean-ul oData pe server, respectiv pentru a include fișiere în etapa de runtime (de procesare a cererilor);

elemente de scripting:

declarația variabilei useragent folosind sintaxa limbajului de scripting (Java). Declarațiile sunt cuprinse între tag-urile <%! și %>;

scriplet-uri. Acestea sunt porțiuni de cod în limbajul de scripting (în cazul de față același Java) ce sunt compilate și rulează ca parte din servlet-ul generat. Ele sunt delimitate de tag-urile <% respectiv %>. Cel din exemplul ales verifică tipul browser-ului client și în funcție de acesta este afișat un text corespunzător;

expresiile exprimate în limbajul de scripting pentru a afișa denumirea zilei din săptămână, ziua și respectiv anul.

Directive, tag-uri, obiecte și domenii de vizibilitate

Paginile JSP folosesc directive JSP pentru a transmite instrucțiuni motorului JSP. În specificația 1.0 aceste directive sunt:

<%@ include …%> folosită pentru a insera în pagină un document extern ce poate fi și un alt document JSP;

<%@ page …%> folosită pentru a transmite informații referitoare la pagină precum limbajul de scripting, buffer-ul, informații despre thread-uri, "pachete importate", modul de tratare al excepțiilor etc;

<%@ taglib …%> indică o bibliotecă de tag-uri pe care pagina respectivă le poate invoca. Nu este disponibilă în implementările actuale.

JSP include o serie de tag-uri standard. Sintaxa lor este cea a tag-urilor XML (< tag attr1="valoare atribut" …> corp </tag> sau < tag attr1="valoare atribut" …/>). Acestea sunt:

<jsp:forward> înaintează cererea către un alt fișier HTML, fișier JSP sau servlet;

<jsp:include> include în etapa de procesare a cererii fișierul specificat în tag;

<jsp:plugin> face download către browser-ul clientului la un plugin Java pentru executarea unui applet sau a unui Bean. Nu este disponibil în implementările actuale.

<jsp:useBean> declară folosirea unei instanțe, a unei componente JavaBean. Dacă aceasta nu există atunci componenta JavaBean instanțiază și înregistrează tag-ul;

<jsp:setProperty> setează valoarea unei anumite proprietăți a unui Bean;

<jsp:getProperty> obține valoarea unei instanțe a unui Bean, o convertește la String și o depune în obiectul implicit de ieșire out.

O pagină JSP poate crea și/sau accesa, la procesarea unei cereri, anumite obiecte Java. Obiectele astfel create pot deveni vizibile elementelor de scripting prin variabile în limbajul de scripting. Acestea vor conține, în timpul etapei de procesare a cererilor (vezi "Server Web cu funcționalitate JSP"), referințe către obiectul respectiv. Obiectele create au un atribut numit scope ce definește domeniul de vizibilitate al acestora: când există o referință la acest obiect și când aceasta va fi înlăturată. Valorile pe care le poate avea atributul scope sunt:

page – accesibil doar în cadrul paginii în care a fost creat obiectul;

request – accesibil din paginile ce procesează aceeași cerere în care a fost creat obiectul;

session – accesibil din paginile ce se sunt în aceeași sesiune în care a fost creat obiectul;

application – accesibil din paginile de procesează aceeași aplicație în care a fost creat obiectul. Toate referințele la acesta sunt eliberate când mediul runtime solicită ServletContext-ul (pentru detalii vezi [2] respectiv [9]).

Numele atașat unui obiect este unic pe tot timpul execuției, toate domeniile de vizibilitate comportându-se ca unul singur în cadrul unei secvențe cerere/ răspuns. Lipsa transmiterii variabilelor de stare prin HTTP este suplinită în mod automat de către motorul JSP prin cele două modalități cunoscute: cookie-uri, respectiv rescrierea URL-urilor. Cât timp sunt făcute cereri procesate de către motorul JSP, rescrierea URL-urilor este făcută în mod automat.

Orice pagină JSP conține o serie de obiecte create implicit (detalii în [2]):

request – cererea ce a solicitat pagina respectivă;

response – răspunsul la cerere;

pageContext – contextul paginii curente;

session – obiect de tip sesiune pentru clientul solicitat (valabil doar pentru HTTP);

application – contextul servlet-ului generat (getServletConfig().get Context();

config – obiect de tip ServletConfig pentru această pagină;

page – instanță a clasei create pentru această pagină (pentru Java: this);

exception – excepția declanșată anterior putând fi folosită doar în pagina de eroare invocată;

config – obiect de tip JspWriter ce scrie în stream-ul de ieșire.

2.4.2.1. Primirea cererii

Atunci când un client cere pentru prima dată o pagină JSP nouă sau actualizată, containerul JSP trebuie să localizeze fișierul sursă al paginii JSP și să transmita serverului Web (sau unei extensii Java a serverului de Web, în funcție de modul de implementare a containerului JSP) că acest fișier trebuie manipulat de către containerul JSP atunci când este cerut, similar modului în care atașarea extensiei .cfm sau .asp precizează faptul că acel fișier necesită prelucrări speciale efectuate de către o extensie a serverului.

Containerele JSP care rulează în afara procesului serverului Web și sunt legate la serverul Web prin intermediul unui soclu (socket) posedă de obicei un conector nativ (adică non-Java) care se execută în cadrul procesului serverului Web. Acest conector care rulează în cadrul procesului este scris în conformitate cu interfața API a serverului Web, ca de exemplu NSAPI pentru Netscape Entreprise Server sau modulul API pentru serverul Apache. Acești conectori operează de regulă scanând toate cererile care ajung la server sub formă de identificatori URL și filtrând cererile care au prefixe și sufixe specifice JSP sau containerului servlet. JRun, Resin sau Tomcat (care vor fi prezentate detaliat în continuare) pot lucra în acest mod.

O altă metodă de lucru este să facem serverul Web parte a containerului JSP, implementând un server HTML bazat pe Java. Multe aplicații server Web, între care JRun, Tomcat, Resin și Orion Application Server, permit lucrul în acest mod. În acest caz nu este folosit nici un soclu și nu este necesară filtrarea cererilor. În schimb, cererile de pagini JSP vin direct de la clienți la containerul JSP.[2]

2.4.2.2. Translatarea paginii

De obicei, fișierele sursă JSP sunt stocate fie în directorul de documente al serverului Web, fie într-un subdirector din directorul de documente, fie în oricare alt director în care configurați containerul JSP să efectueze căutarea. Containerul JSP execută mai întâi căutarea, apoi, după ce îl găsește, citește fișierul sursă JSP. După aceea, motorul JSP analizează sursa JSP și o translatează într-un fișier Java (în această fază este posibil să se creeze sau nu un fișier temporar sau permanent, ca de exemplu un fișier XML). Acest proces depinde de implementarea aleasă, dar una dintre metodele prin care se poate realiza este să se transforme în timp real codul sursă JSP într-un fișier XML și apoi să se folosească pagina XSL (eXtensible Stylesheet Language) pentru a transforma fișierul XML intermediar în cod sursă Java. Motorul JSP apelează apoi un compilator pentru a translata fișierul sursă Java într-un fișier de clasă servlet Java. Clasa Java rezultată este apoi încărcată ca servlet în motorul de servlet-uri al containerului JSP și servlet-ul produce răspunsul cerut de client. După cererea inițială, pagina JSP nu mai este retranslatată, recompilată sau reîncărcată în memorie, în afară de cazul în care fișierul sursă JSP se modifică sau containerul servlet este oprit și repornit.[2]

Concluzii:

Explozia Internet-ului face ca cerințele pentru aplicații Web să crească vertiginos. În aceste condiții o tehnologie precum JavaServer Pages este mai mult decât binevenită. Sprijinul de care se bucură din partea industriei software precum și faptul că se bazează pe platforma Java pot face din JSP soluția de facto pentru aplicații Web. În sprijinul acestei afirmații nu vin doar declarațiile din partea unor nume celebre precum Oracle, Netscape, Weblogic, IBM, Fujitsu ș.a., ci și integrarea în platforma Java 2 Enterprise Edition și tehnologii precum JavaBeans sau Enterprise JavaBeans.

2.3.3. Suport pentru dezvoltarea data tier-ului

Pentru nivelul de date, avem nevoie de metode de interogare și modificare a datelor într-un regim tranzacțional care să ofere protecție la erori și verificarea permanentă a integrității datelor.

În general, accesul la datele dintr-o bază de date se face prin limbajul de manipulare a datelor (LMD). În cadrul SQL Server se folosește limbajul SQL.

Vom studia în continuare principalele elemente ale limbajului SQL, folosite în procesul de dezvoltare:

Comanda SELECT

SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expression ]
[ HAVING search_condition ]
[ ORDER BY order_expression [ ASC | DESC ] ]

Este cea mai utilizată comandă a limbajului SQL. Permite interogarea structurilor de date și returnarea unui set de date care îndeplinesc anumite condiții. Se folosește pentru returnarea unui grup de înregistrări din nomenclatoare, liste, tabele, etc. sau a detaliilor unei singure înregistrări identificate prin cheie. Va apare în toate procedurile stocate care întorc detaliile unui element sau cele care întorc liste de elemente (localități, comisii, secțiuni, limbi, opțiuni, etc.).

Comanda INSERT

INSERT [ INTO]
    { table_name WITH ( < table_hint_limited > [ …n ] )
        | view_name
        | rowset_function_limited
    }

    {    [ ( column_list ) ]
        { VALUES
            ( { DEFAULT | NULL | expression } [ ,…n] )
            | derived_table
            | execute_statement
        }
    }
    | DEFAULT VALUES

Se folosește pentru adăugarea de noi înregistrări în tabele. Va apare în toate procedurile stocate de adăugare de noi elemente în baza de date.

Comanda UPDATE

UPDATE
        {
         table_name WITH ( < table_hint_limited > [ …n ] )
         | view_name
         | rowset_function_limited
        }
        SET
        { column_name = { expression | DEFAULT | NULL }
        | @variable = expression
        | @variable = column = expression } [ ,…n ]

    { { [ FROM { < table_source > } [ ,…n ] ]

        [ WHERE
            < search_condition > ] }
        |
        [ WHERE CURRENT OF
        { { [ GLOBAL ] cursor_name } | cursor_variable_name }
        ] }
        [ OPTION ( < query_hint > [ ,…n ] ) ]

Se folosește pentru modificarea unei tuple identificate de condiția de căutare. O astfel de comanda este periculoasă, pentru ca nespecificarea unei condiții de filtrare duce la modificarea tuturor înregistrărilor dintr-o tabelă. Se va utiliza în toate procedurile stocate care permit modificarea atributelor unui element.

Tranzacțiile asigură menținerea într-o stare consistentă a unei baze de date accesate în regim concurent și cu posibilități de apariție a erorilor.

Blocul de operații SQL de scriere și citire se va executa ca o singură comandă, apariția unei erori pe parcursul execuției uneia dintre ele ducând la anularea efectelor comenzilor deja executate și anularea tranzacției. Îndeplinirea cu succes a tuturor sarcinilor din blocul de comenzi permite încheierea tranzacției cu succes și scrierea pe suport permanent a modificărilor efectuate asupra bazei de date.

În regim concurențial, s-ar putea ca între momentul de timp în care un utilizator lansează o cerere și momentul în care aceasta se execută efectiv, baza de date să se fi modificat și sa nu mai existe condițiile logice de a duce la bun sfârșit cererea, chiar dacă în momentul lansării cererii, aceasta era perfect legitima.

2.5. Principii in proiectarea bazelor de date

O Bază de Date este o Colecție Memorată de Date, variabilă în timp, având următoarele caracteristici:

Asigură Independența Datelor prin:

Prezența Schemei de Date (cel mai adesea și a Subschemelor de Date) precum și a Limbajului de Definire a Datelor (LDD), asociat Schemelor de Date

Asigură Accesul (cel mai adesea Multiaccesul) la Colecții Mari de Date prin:

Prezența Nivelul Fizic de Acces la Date precum și a Limbajului de Manipulare a Datelor (LMD)

Asigurarea funcțiilor de Securitate a Datelor prin:

Controlul Accesului la Date

Restaurarea Colecțiilor de Date în caz de incident. [4]

2.5.1. Modelul relațional

Proiectarea unei baze de date este primul pas în procesul de creare a unei baze de date fizice. În ultima vreme SQL a evoluat către un model care respectă conceptele modelului relațional. Dr. Codd a definit 13 reguli numite „cele 12 reguli ale lui Codd privind modelul relațional”:

1). Un DBMS (Database Managemant System) trebuie sa fie capabilă să gestioneze bazele de date numai prin capacitățile sale relaționale.

2). Regula informației – toate informațiile dintr-o bază de date relaționala (incluzând tabele si numele coloanelor) se reprezintă explicit prin valori in tabele.

3). Accesul garantat – fiecare valoare din baza de date relaționala este garantat ca accesibil utilizând o combinație de nume al tabelei, valoarea cheii primare si numele coloanei.

4). Suport sistematic pentru valorile nule – DBMS oferă suport pentru tratarea valorilor nule (necunoscute sau date inaplicabile) separat de valorile implicite si independent de orice domeniu.

5). Catalog relațional on-line activ – descrierea bazei de date si a conținutului este reprezentat la nivel logic ca tabele, si de aceea poate fi interogat utilizând limbajul bazei de date.

6). Sublimbaj comprehensibil al datelor – măcar un limbaj suportat trebuie sa aibă definită o sintaxa si sa fie inteligibil. Limbajul trebuie sa suporte definirea si manipularea datelor, reguli de integritate, autorizare si tranzacții.

7). Reguli de actualizare a vederilor – toate vederile care sunt teoretic actualizabile pot fi actualizate in sistem.

8). Inserarea, actualizare si ștergere – DBMS trebuie sa suporte nu numai un nivel de obținere a datelor ci si un nivel de ștergere, inserare si actualizare.

9). Independența fizica a datelor – programele de aplicații si programele ad-hoc nu sunt afectate din punct de vedere logic atunci când metodele de acces la date sau structura de stocare a datelor se schimbă.

10). Independența logica a datelor – programele de aplicații si programele ad-hoc nu sunt afectate din punct de vedere logic în măsura in care acest lucru este posibil atunci când metodele structura tabelelor se schimba.

11). Independența de integritate – limbajul bazei de date trebuie sa fie capabil sa definească reguli de integritate. Aceste reguli se vor stoca intr-un catalog on-line si nu vor putea fi încălcate.

12). Independența de distribuire – programele de aplicații si cererile ad-hoc nu sunt afectate din punct de vedere logic atunci când datele sunt distribuite pentru prima data sau redistribuite.

13). Nonsubversia – nu este posibil să se încalce regulile de integritate referențiale folosind un limbaj de nivel jos.

Respectarea condițiilor enumerate mai sus impune adoptarea unei arhitecturi organizate pe cel puțin 3 nivele [5]:

Nivelul intern – sau baza de date fizica. Baza de date fizica este o colecție de fișiere și alte structuri auxiliare care conțin datele fizice rezidenta pe diverse unități de stocare: discuri optice, hard-disk-uri.

Nivelul conceptual – sau modelul conceptual. Conține abstractizările lumii reale si descrie structura logica a datelor cu toate unitățile logice si legăturile dintre ele.

Nivelul extern – modelul extern sau vederea asupra bazei de date. Conține viziunea unui grup de utilizatori asupra bazei de date. Poate conține atât unități logice existente in modelul conceptual, cat si unități logice care nu există in modulul conceptual, deci care nu au corespondent in baza de date fizica.

2.5.3. Normalizarea

Când începem să lucrăm cu baze de date relaționale, normalizarea este inevitabila deoarece ea face parte dintr-o problematica mai larga a proiectării bazelor de date relaționale [5]. Ea se refera la modul cum implementam relațiile si modul de stocare al datelor in tabele. Atunci când încercăm să normalizam un tabel, încercăm sa limitam redundanta datelor in acel tabel, sa îmbunătățim integritatea datelor.

Ideea centrala care sta la baza criteriilor de proiectare a unei baze de date relaționale este aceea de dependență a datelor. Aceasta se referea la faptul ca intre atributele unei relații sau inter atribute din relații diferite pot exista anumite legături logice (dependențe), legături care influențează proprietăților schemelor de relație in raport cu operațiile curente: adăugare, ștergere, actualizare. Cel mai intens studiate si cu implicații majore asupra criteriilor de proiectare a schemelor relaționale sunt dependențele funcționale și dependențe multivalorice. [5]

Formele normale reprezintă criterii de ghidare a proiectantului bazei de date în ceea ce privește alegerea schemelor de relație, si se aplica in scopul evitării anomaliilor de ștergere, adăugare, actualizare dar si de inconsistenta a datelor atunci când aceste operații se realizează frecvent..

Din punct de vedere al influentei asupra performantelor in exploatarea bazei de date, normalizarea are un efect negativ asupra eficientei cu care sunt rezolvate interogările, deoarece intr-o baza de date nenormalizata informațiile pot fi regăsite intr-o singura relație, iar intr-una normalizata găsirea informațiilor necesita de cele mai multe ori cuplarea a doua sau mai multe relații. Insa păstrarea integrității datelor si reducerea redondantei si a inconsistentei sunt mai prioritare fata de creșterea eficientei unor operații de regăsire a datelor. Procesul de normalizare se realizează sub forma celor cinci forme normale: FN1, FN2, FN3, FN4 si FN5.

2.5.3.1. Prima forma normala (FN1)

O relație R este în prima forma normală (FN1) dacă și numai dacă toate atributele sale iau numai valori atomice. Condiția ca o relație sa fie in FN1 introduce restricția ca domeniile pe care se definesc atributele relației R sa conțină doar elemente atomice, ceea ce înseamnă că toate tuplele unei relații au același număr de câmpuri și aceeași dimensiune. [5]

2.5.3.2. A doua forma normala (FN2)

A doua si a treia formă normală rezolva problemele legate de existența dependențelor funcționale dintre atributele prime (care fac parte dintr-o cheie a relației) si cele neprime (care nu aparțin nici unei chei).

O relație R este în a doua forma normala (FN2) daca este in FN1 si orice atribut neprim este total dependent fata de orice cheie a relației. Pentru orice relație in FN1 se poate găsi o descompunere în relații aflate in FN2 care este echivalenta cu relația inițială. [5]

2.5.3.3. A treia forma normala (FN3)

Trecerea unei relații in FN3 are ca scop eliminarea dependențelor funcționale ale atributelor neprime față de orice atribut neprim al relației.

O relație R este în a treia forma normala (FN3) daca este in FN2 si nici un atribut neprim nu este funcțional dependent față de un alt atribut neprim al relației. Într-o relație care sete in FN3 un atribut neprim poate depinde funcțional doar de cheile din relație respectiva, deoarece nici un atribut neprim nu poate fi dependent funcțional fata de un atribut prim (simplu sau compus) daca acesta nu este cheie sau nu conține o cheie (condiția FN2) si nici fata de un alt atribut neprim. Ca si in cazul trecerii la FN2 se poate demonstra faptul ca pentru orice relație FN2 exista o descompunere echivalenta in componente aflate in FN3, deci procesul de trecere in FN3 este reversibil.

Dependențe multivalorice

Dependențele funcționale nu sunt singurele tipuri de dependențe care apar în cadrul relațiilor. Atât în lumea reală cât și în relațiile prin care modelăm realitatea pot fi identificate alte tipuri de dependență mai puțin restrictive decât cele funcționale. Un asemenea tip de dependente cu implicații în normalizarea relațiilor se numesc dependențe multivalorice.

2.5.3.4. A patra forma normala (FN4)

Această formă se referă le problemele legate de existenta dependentelor multivalorice. Dependentele multivalorice din cadrul unei relații pot cauza anomalii, iar trecerea unei relații în această formă urmărește eliminarea dependențelor multivalorice și a anomaliilor cauzate de acestea.

O relație R este în a patra formă normală (FN4) daca este in FN3 și nu conține două sau mai multe dependente valorice. Datorită faptului că orice dependență funcționala este un caz particular de dependență multivalorică, din definiție rezultă că FN4 impune condiții mai puțin restrictive.[5]

Dependente de cuplare

O relație aflata in FN4 nu mai poate fi descompusă în continuare pe baza acestei strategii. Cu toate acestea sunt situații când relațiile aflate în FN4 conțin redondante și prezintă anomalii la operațiile de ștergere, actualizare și adăugare. Aceste probleme sunt cauzate de existenta dependențelor de cuplare și pot fi eliminate prin descompunerea relației în trei sau mai multe relații a căror cuplare are ce rezultat relația inițiala. Prin eliminarea dependentelor de cuplare se obțin relații aflate in forma normala cinci (FN5).

2.5.3.5. A cincea forma normala (FN5)

A cincea formă normală este o generalizare a FN4 pornind de la conceptul de dependență de cuplare. Procesul de trecere a unei relații în FN5 presupune eliminarea dependențelor de cuplare existente în cadrul relației, împreună cu anomaliile pe care le generează. Totuși, nu toate dependențele de cuplare reprezintă interes din punct de vedere al procesului de normalizare. În cadrul unei relații pot exista dependențe de cuplare care nu conduc la redondanța în memorarea datelor și nu sunt cauzatoare de anomalii. Acestea sunt dependențele de cuplare implicate de o cheie a relației.

O relație R este în forma normală cinci (FN5) dacă și numai dacă toate dependențele de cuplare existente în relație sunt implicate de o cheie a acesteia. Într-o relație aflată în FN5 singurele dependențe de cuplare permise sunt cele implicate de o cheie a relației. O relație care este în FN5 , va fi implicit în FN4, deci în FN3 etc.

2.6 SQL SERVER

INTRODUCERE

Bazele de date constituie unul din elementele fundamentale ale infrastructurii IT a companiilor. Având în vedere importanța informațiilor stocate în bazele de date pentru desfășurarea proceselor de afaceri, soluțiile de acest tip trebuie să asigure un nivel ridicat de scalabilitate, performanță și siguranță în exploatare. SQL Server 2000 răspunde în totalitate acestor nevoi, fiind o soluție flexibilă și adaptabilă la nevoile diverselor categorii de clienți. Nivelul ridicat de adaptare la cerințele utilizatorilor este demonstrat de existența celor șapte ediții ale acestei soluții, acestea permițând integrarea SQL Server pe o gamă variată de echipamente.

Ultima versiune SQL Server integrează instrumente eficiente din categoria business intelligence, permițând în acest mod un control optim al proceselor de afaceri . De asemenea, integrarea cu aplicațiile din familia Microsoft Office contribuie la simplificarea modalităților de analiză a datelor și la obținerea unor rapoarte de sinteză.

Implementarea SQL Server 2000 determină reducerea substanțială a resurselor care vor fi alocate pentru administrarea bazelor de date. În acest sens, nivelul ridicat de autoconfigurare, instrumentele grafice de administrare și numărul mare de experți tip wizard simplifică substanțial modul în care se realizează configurarea și administrarea acestui server. De asemenea, SQL Server 2000 oferă suport complet pentru XML (eXtensible Markup Language). Astfel, este oferită o posibilitate eficientă de transfer a datelor, fiind asigurat un nivel ridicat de integrare în medii eterogene.

Reducerea timpului necesar pentru dezvoltarea aplicațiilor având la bază SQL Server 2000 constituie un avantaj fundamental al acestei soluții. Prin tehnologiile integrate pot fi realizate mai simplu aplicații Web tradiționale care să exploateze bazele de date. Având în vedere nivelul ridicat de performanță, SQL Server 2000 poate constitui fundamentul aplicațiilor mission critical din categoria e-commerce sau a sistemelor complexe dedicate automatizării fluxurilor de business din cadrul companiei (soluții de tipul ERP, CRM, SCM etc).

Integrarea SQL Server 2000 va determina reducerea substanțială a costurilor de implementare a sistemelor informatice care necesită suportul bazelor de date. Suplimentar, simplificarea proceselor de administrare și configurare a acestei soluții va conduce la diminuarea costurilor operaționale.

Scalabilitate și performanță

SQL Server 2000 oferă un nivel deosebit de scalabilitate, răspunzând în acest mod la cerințele diverselor categorii de utilizatori. Cele șapte ediții ale SQL Server oferă suportul bazelor de date pentru o gamă variată de aplicații, începând cu soluțiile dedicate dispozitivelor mobile și încheind cu sistemele informatice mission critical. În acest sens, se distinge ediția SQL Server Enterprise (64 bit) Edition care poate fi integrată în arhitecturi de până la 64 de procesoare și poate adresa un maxim de 512 GB RAM

UN NIVEL RIDICAT DE DISPONIBILITATE

În SQL Server 2000 este posibilă realizarea backup-ului diferențial, această modalitate determinând reducerea spațiului alocat pentru fișierele salvate. Backup-ul diferențial are un impact redus asupra serverului, oferind posibilitatea de realizare mai frecventă a acestei operațiuni și conducând în acest mod la reducerea riscurilor de pierdere a datelor.

Noua facilitate log shipping permite sicronizarea eficientă a două baze de date separate fizic pe două mașini. Astfel, este posibil transferul log-urilor cu trazacții între două servere și este asigurată propagarea actualizărilor realizate.

Suplimentar, SQL Server 2000 oferă avantaje importante în arhitecturite bazate pe clustere de servere, asigurând un nivel deosebit de disponibilitate și siguranță în exploatarea datelor. Tehnologia Virtual Interface System Area Network (VI SAN) permite integrarea directă a SQL 2000 în cadrul arhitecturilor SAN, fiind asigurat un nivel ridicat de performanță.

Securitate ridicată a datelor

Având în vedere posibilitățile de accesare a aplicațiilor cu suport pentru bazele de date prin intermediul Web-ului, SQL Server 2000 introduce importante îmbunătățiri la capitolul securitate.

În acest sens, au fost integrate instrumente pentru monitorizarea și auditul de securitate al serverelor, o gestiune eficientă a rolurilor și profilelor, precum și posibilități de tratare a principalelor evenimente de securitate care pot apărea în exploatarea acestei soluții.

De asemenea, versiunea 2000 extinde conceptul “out of the box” în ceea ce privește securitatea. SQL Server 2000 este preconfigurat pentru a oferi nivelul maxim de securitate după instalare, permițând astfel implementarea simplă și rapidă a serverulu

3. PROIECTAREA ȘI ARHITECTURA SISTEMULUI

3.1. Specificațiile sistemului

Pentru proiectarea site-ului S.C. BizZu Shop & Service S.R.L. s-a încercat respectarea cerintelor beneficiarului, precum si luarea in calcul a bazei tehnologice existente deja.

In faza de analiza, am considerat necesara realizarea unei baze de date utilizand tehnologia Microsoft SQL Server.

Avand in vedere ca datele culese prin interfata web (respectivele comenzi on-line) trebuiau stocate in baza de date deja existenta, aveam de ales intre tehnologia ASP sau tehnologia JSP. Din motivele enumerate in capitolul de fundamentare teoretica, am ales tehnologia JSP.

Conditiile cerute de firma beneficiara sunt urmatoarele:

site-ul sa contina urmatoarele sectiuni:

Sectiunea About- care descrie pe scurt istoricul firmei;

Sectiunea Products- care descrie pe scurt produsele puse spre vanzare ;

Sectiunea Service- care descrie serviciile oferite de catre BizZu Shop & Service;

Sectiunea Contact- care permite sa luam contact cu reprezentantii legali ai firmei;

Sectiunea Comenzi-prin care se poate realiza comandarea unor lucrari si realizarea unui deviz pentru clientul potential.

Comenzile care vor fii completate de catre client pe web sa fie memorate in baza de date existenta deja.

Sa existe o sectiune pentru administratorul firmei prin care acesta si numai acesta sa poata vizualiza comenzile existente la un moment dat in baza de date.

Am pornit de la structura bazei de date existente, care cuprindea 3 tabele:

tabela pentru clienti (users);

tabela pentru catalogul de produse (catalog);

tabela pentru comenzi (comanda)

am facut o modificare in ceea ce priveste structura tabelei users careia i-am adaugat 2 coloane si anume username si parola, pentru asigurarea sporirii securitatii. Acest lucru duce automat la crearea unei proceduri de autentificare a utilizatorului si urmarirea lui pe intreaga sesiune de lucru.

De asemenea, am considerat ca numarul comenzii sa fie unic si egal cu id-ul sesiunii de lucru al clientului.

3.2.Arhitectura sistemului

Arhitectura sistemului este pe trei nivele după cum se vede în figura următoare:

Nivelul 1 (prezentare)

reprezintă nivelul interfețelor utilizator.

permite utilizatorului să specifice cererile.

Nivelul 2 (intermediar)

reprezintă nivelul serverelor de aplicații. Aplicațiile realizate în medii diferite utilizând tehnologii diferite vor fi executate de către servere diferite.

face legătura între interfața utilizator și baza de date. Cererile clientului sânt interpretate și trimise către server-ul de baze de date de la care preia apoi răspunsurile.

Nivelul 3 (date)

reprezintă baza de date.

4. PROIECTAREA ÎN DETALIU A SISTEMULUI

4.1. Proiectarea bazei de date

Pentru implementarea proiectului prima dată s-a realizat proiectarea bazei de date astfel încât aceasta să răspundă cerințelor aplicației.

S-a hotărât folosirea a trei tabele pentru baza de date a societatii, in plus, dupa cum s-a mentionat anterior s-a completat structura tabelei users cu campurile username si parola.

Relatiile dintre tabele se reflecta in diagrama urmatoare realizata sub Microsoft SQL Server 2000:

În cele ce urmează sunt prezentate tabelele care fac parte din baza de date.

Pentru implementarea datelor despre client s-a folosit tabela users;

Pentru implementarea datelor despre catalogul de produse s-a folosit tabela catalog;

Pentru implementarea datelor despre comenzi s-a folosit tabela comanda;

4.2.Vederi si alte comenzi SQL utilizate:

totaluri – vedere

Vederea este foarte simpla si s-a folosit pentru generarea totalurilor pe comanda. Am folosit aceasta vedere deoarece Microsoft SQL Server nu accepta alte campuri in fraza SQL decat cele enumerate fie intr-o functie totalizatoare, fie in clauza GROUP BY.

Vederea este:

CREATE VIEW totaluri

AS select nrcomanda, userid, sum(pret*cantitate) as total from users,comanda, catalog

where userid=client and rind=cid

group by userid,nrcomanda

Această vedere operează asupra tabelelor users, comanda si catalog. Ea face o grupare a comenzilor in functie de utilizator si numarul comenzii. Va rezulta valoarea pentru fiecare produs din comanda precum si totalul pe comanda cum se poate observa in figura:

b) Inserare utilizator nou

INSERT INTO users (username,parola,prenume,nume,oras,adresa,nr_telefon,mobil,email) VALUES(username,password,prenume,nume,oras,adresa,nr_telefon,mobil,email)

Această fraza SQL operează asupra tabelei users. Prin ea se inscrie in baza de date un client nou, preluindu-se prin intermediul interfetei web datele clientului.

c)Inserare comada noua

INSERT INTO comanda (client,rind,cantitate,nrcomanda,data) VALUES (userid,catalog_ii,cant_ii,orderId,data)

Această fraza SQL operează asupra tabelei comanda. Prin ea se inscrie in baza de date o noua comanda, preluata prin intermediul interfetei web prin selectarea produselor din catalog si specificarea cantitatii pentru fiecare produs.

Afisare comenzi pe utilizator

select nume, prenume, oras, adresa, comanda.nrcomanda, data, denumire, pret, cantitate,pret*cantitate as valoare,total from totaluri,users,comanda,catalog where totaluri.userid=users.userid and comanda.nrcomanda=totaluri.nrcomanda and comanda.rind=catalog.cid

Această fraza SQL este utilizata in momentul in care administratorul bazei de date doreste sa vizualizeze comenzile din baza de date. In actuala implementare, se vor vizualiza toate comenzile existente in baza de date, pe utilizator si pe comanda, efectuindu-se si totalul pe fiecare comanda in parte.

Selectarea utilizatorului curent

Select * from users where username=username and parola=password

Această fraza SQL creează intrarea in aplicatie a utilizatorului curent si o nouă sesiune de lucru. În cazul nostru, numai asa putem avea drepturi pentru a lucra în baza de date.

4.3. Design

Pentru descrierea interfeței utilizator prima diagramă prezentată va fi diagrama use case:

Diagrama USE CASE pentru aplicația web

4.3.1. Aplicația web

Următoarea figură prezintă aplicația web, împreună cu legăturile dintre paginile jsp:

Prima pagină a aplicației Web este pagina index, unde clientul are posibilitatea de a alege din meniu una dintre paginile pe care doreste sa le vizualizeze.

index.html

De aici, utilizatorul poate opta pentru una din paginile: about, products, comenzi, service sau contact.

In cele ce urmeaza, vom prezenta fiecare din aceste pagini.

Pagina about prin care se vizualizeaza un scurt istoric a firmei BizZu Shop & Service.

about.html

Pagina products prin care se face o scurta trecere in revista a obiectelor de activitate a firmei BizZu Shop & Service:

products.html

Pagina service unde sunt prezentate serviciile pe care le executa firma BizZu Shop & Service.

service.html

Partea dinamica a site-ului este prezentata de intrarea comenzi. Prima pagina afisata este cea de logare prin care clientul trebuie să-și introducă user-ul și parola. În cazul în care clientul nu are un user și o parolă poate alege pagina Client nou unde și le poate crea.

showLogin.jsp

Pagina de client nou cere introducerea numelui, prenumelui, un nume de user și o parolă pentru ca clientul să-și poată crea un user și să poată accesa aplicația, precum si adresa, numar de telefon, mobil si adresa de e-mail.

newUser.jsp

Dupa logare, clientului i se va oferi posibilitatea de a alege unul sau mai multe produse din catalog, precum si posibilitatea de a completa si campul de cantitate.

browse.jsp

După ce clientul a ales produsele din catalog, îi va apare o pagină cu comanda pe care a efectuat-o si i se da posibilitatea dea modifica randuri ale comenzii. De asemenea se va afisa tot timpul si suma la care s-a ajuns prin comanda respectiva.

showDetails.jsp

Ultima pagină este cea cu finalizarea comenzii. Comanda se va memora in baza de date si va putea fii stearsa doar de catre administratorul bazei de date.

Administratorul mai are posibilitatea de a vizualiza toate comenzile din baza de date pe utilizatori si pe comenzi cu afisarea totalului.

Toate paginile JSP cât și logica business din spatele lor au fost create în Java folosind cadrul de lucru Macromedia Studio MX si un IDE pentru java numit KAWA Pro.

Schema bloc a aplicației este prezentată în figura următoare:

Proiectul incearca sa respecte modelul MVC a arhitecturii Java (Model-vedere-Controller). Partea Controler a aplicației se focalizează pe primirea de cereri de la client (de obicei un utilizator care rulează un web browser), decide ce funcție a logicii business trebuie executată și apoi delegarea responsabilității pentru realizarea următoarei faze a interfeței utilizator unui component vedere potrivit.

Partea de vizualizare a aplicației este compusă din fișierele showLogin.jsp, logOut.jsp, showNewUser.jsp, etc. Pentru fiecare din aceste pagini sunt create form beans pentru formularele de intrare. Toate aceste clase Java formează modelul aplicației.

4.4. Implementarea

Când este inițializat, controlerul își încarcă un fișier de configurație (web.xml) și îl folosește pentru a încărca alte obiecte ale nivelului control. Împreună aceste obiecte formează configurarea. Cererile sunt redirecționate la paginile JavaServer Pages.

Toate clasele java sunt implementate în pachetul com. Toate clasele bean folosesc o instanță a clasei User sau Order și care e singurul mod în care aplicația poate lua date din baza de date.

showLogin.jsp

Această pagină conține câmpuri text pentru introducerea user-ului și parolei dacă utilizatorul are deja un user, și un link spre pagina showNewUser.jsp pentru cazul în care utilizatorul nu are un user și o parolă

Clasa java bean este Login.java

Proprietăți:

username:- șir de caractere care conține user-ul introdus de către student;

password:- șir de caractere conținând parola introdusă de student;

user:- instanță a clasei User pentru lucrul cu baze de date;

metode:

authenticate: valideaza daca userul cu parola respectiva au dreptul de a accesa baza de date cu comenzi. Returneaza o instanta a clasei User daca utilizatorul a fost autentificat, daca nu returneaza null;

Fișierul mai conține și definiții pentru etichetele fiecărei cîmp text din paginile . jsp. O asemenea definiție arată în felul următor:

setUsername: setează valoarea proprietății username al clasei

parametri:

new username: user nou pentru a putea seta valoarea parametrului

setPassword: returnează valoarea proprietății password al clasei

parametri:

newpassword: un șir de caractere reprezentând password pentru setarea valorii proprietății

Dacă userul și parola sunt valide atunci este creată o nouă sesiune prin utilizarea obiectului user. Apoi userul este setat ca atribut de sesiune și controlul este cedat paginii browse.jsp daca utilizatorul nu este administrator sau showTotal.jsp daca utilizatorul este administrator.

În pagina showLogin.jsp mai există și un link pentru pagina NewUser care poate fi folosit atunci cînd nu există un user și o parolă în baza de date pentru un anumit client.

showNewUser.jsp

Aceasta pagina este utilizata in cazul in care clientul nu exista in baza de date si doreste sa se inscrie in ea.

NewUser.java este clasa bean showNewUser.jsp.

proprietăți:

nume: numele introdus de utilizator

prenume: prenumele introdus de utilizator

newuser: șir de caractere reprezentând userul ales de client

newpassword: șir de caractere reprezentând parola aleasă de client

oras: localitatea de domiciliu

adresa: adresa introdusa de utilizator

nr_telefon: șir de caractere reprezentând numarul de telefon

mobil: șir de caractere reprezentând numarul de telefon mobil

email: reprezentand adresa de e-mail a clientului

user: instanță a clasei User pentru lucrul cu baze de date

con: instanta a clasei connection pentru conectarea la baza de date

metode:

validate: validează toate proprietățile clasei

scrie: returnează valoarea userid daca s-a facut inserarea in baza de date, altfel returneaza 0:

alte metode sunt metodele setter si getter obisnuite intr-o clasa bean:

getNume: returnează valoarea proprietății nume

returnează: șir de caractere reprezentând numele clientului

setNume: setează valoarea proprietății nume:

parametrii:

newNume: șir de caractere pentru setarea proprietății nume

getPrenume: returnează valoarea proprietății prenume

returnează: șir de caractere reprezentând prenumele studentului

setPrenume: setează valoarea proprietății prenume:

parametrii:

newPrenume: șir de caractere pentru setarea proprietății prenume

getUsername: returnează valoarea proprietăți newuser

returnează: șir de caractere reprezentând newuser

setUsername: setează valoarea proprietății newuser:

parametrii:

Newuser: șir de caractere pentru setarea proprietății Newuser

getPassword: returnează valoarea proprietății password

returnează: șir de caractere reprezentând password

setPassword: setează valoarea proprietății password:

parametrii:

Newpassword: șir de caractere pentru setarea proprietății Newpassword

Similar pentru proprietatile adresa, oras, nr_telefon, mobil si email.

Controlul este cedat paginii login.jsp.

Următoarele pagini sunt prezentate pe scurt.

browse.jsp

Toate paginile care urmează vor începe cu o verificare specială, aceea a atributului de sesiune pentru utilizator. Dacă atributul este nul nu mai suntem în aceeași sesiune și controlul este cedat paginii login.jsp.

catalog.java este clasa bean utilizata de browse.jsp. Ea are ca domeniu de valabilitate intreaga aplicatie, putand fii accesata concomitent de mai multi utilizatori. Descrierea acestei clase se va vedea in listingul respectiv, dar facem mentiunea ca are ca proprietati instante ale claselor Item si connection. Fiecare instanta a clasei Item reprezinta un rand din catalogul de produse al firmei.

Prin browse.jsp se da posibilitatea clientului sa-si aleaga un set de produse si sa specifice cantitatea la produsele selectate. De aici se va da controlul spre processOrder.jsp.

showOrder.jsp

Aici se ajunge daca utilizatorul este administartorului site-ului. El poate sa vizualizeze toate comenzile existente in baza de date.

showOrder.java este clasa bean pentru showTotal.jsp. Are ca proprietati o instanta a aclasei connection.java pentru accesul la baza de date si un vector de obiecte ale clasei TotalOrder care va retine proprietatile comenzilor obtinute din baza de date.

lucrează cu toți parametrii. Reprezintă clasa bean pentru JSP-ul pachete.jsp.

metode:

– showTotal:- este o metoda care asigura accesul la baza de date si incarcarea vectorului cu date despre comenzile din baza de date. Returneaza 0 daca nu s-a efectuat tranzactia, altfel returneaza 1.

processOrder.jsp

Este locul unde se prelucreaza comanda introdusa de client. Este utilizata o instanta a clasei User si o instanta a aclasei Order, pentru prelucrarea comenzii

Order.java – modeleaza la nivel de business-logic o comanda a utilizatorului.

Constructorul clasei defineste un obiect al clasei Order cu codul (orderId) unic, ca valoarea timpului de la procesor.

Metode:

setItemIds:- care seteaza un rand din comanda;

setCantitati:- care seteaza cantitatea corespunzatoare item-ului din catalog;

setOrder:- care inscrie comanda propriu-zisa in baza de date

De aici se da controlul la showDetails.jsp.

logOut.jsp

Termină sesiunea de lucru. Șterge din sesiunea de lucru parametrii user și invalidează sesiunea.

showDetails.jsp

Este pagina unde se poate vizualiza comanda de catre client. Tot aici se da posibilitatea clientului sa modifice sau sa finalizaze comanda. De aici controlul pleca din nou la pagina processOrder.jsp sau la receipt.jsp.

receipt.jsp

Este o simpla pagina de multumire. De aici clientul poate sa iasa din paginile dinamice si sa vizualizeze pagini statice, sau sa lanseze o noua comanda.

Alte clase java utilizate:

Pentru manipularea datelor într-o bază de date relațională, a fost implementat Modelul Bazei de Date Relaționale. Acest model folosește JDBC pentru a realiza comunicarea cu driver-ul bazei de date.

Clasele care lucrează cu bazele de date, sunt implementate toate în pachetul com. Tot aici întâlnim o altă clasă de mare importanță, care este clasa connection.

În această clasă connection toate atributele și metodele sunt declarate protejate, astfel încât ele pot fi accesate numai din cadrul aceluiași pachet.

Connection.java

proprietăți:

dbDriver: șir de caractere, stochează tipul de driver care este „sun.jdbc.odbc.JdbcOdbcDriver”

dbURL: variabilă șir care stochează adresa de conectare la baza de date: „jdbc:odbc:manuel”, conexiunea trebuie să fie stabilită prin DataSources (ODBC)

dbConnection: un obiect Connection utilizat la stabilirea conexiunii pe driverul specificat la un URL specificat

metode:

setConnection(): stabilește conexiunea la baza de date prin instanțierea obiectului dbConnection

closeConnection(): închide conexiunea la baza de date

setStatement(): setează obiectul pentru a interoga baza de date

execUpdate:

parameters:

sql: șir care conține interogarea sql

returnează: int, care este 1 dacă s-a făcut update-ul cu succes, 0 altfel

execQuery:

parameters:

sql: șir care conține cererea sql

returnează: ResultSet obținut din baza de date

5. PUNEREA ÎN FUNCȚIUNE ȘI UTILIZAREA SISTEMULUI

5. 1.Cerintele hard și soft ale aplicației

Pentru a putea fi instalata aplicația, avem nevoie de un calculator cu următoarea configurație minimală:

cel puțin 3GB spațiu liber pe hard disk;

minim 128 MB memorie RAM;

placă grafică cu memorie de minim 32MB;

procesor minim 500MHz.

Sistemul de operare necesar pentru rularea următoarelor produse software este Microsoft Windows NT. Produsele software necesare sunt:

serverul de baze de date Microsoft SQL Server 2000;

Programul Jakarta Tomcat versiunea 4.1.31 ;

Un pachet JDK începând cu versiunea 1.3.1. Ghidul de instalare pentru JDK și Tomcat se găsește pe pagina web de la Jakarta: jakarta.apache.org .

5.2 Punerea în funcțiune și operarea

Pentru punerea în funcțiune a sistemului trebuie urmați pașii de mai jos:

1. Se deschide aplicația Microsoft SQL Server → Enterprise Manager. Se crează o nouă bază de date cu numele manuel. Cu click dreapta pe această bază de date se alege All tasks → Restore Database. Va apare o casetă de dialog unde pe tabul General se alege butonul radio From Device și se specifică locația în care se găsește salvarea (backup) bazei de date BizZu. Pe tabul Option se selectează Force over existing database, iar la Restore As trebuie specificată calea corectă spre directorul unde este instalat Microsoft SQL Server;

2. În directorul jakarta-tomcat-4.1/webapps trebuie copiat directorul cu numele web

3. Realizarea conexiunii la baza de date manuel Din Control Pannel → Administrative Tools → Data Sources ODBC → User DNS se creează o legătură la baza de date manuel cu numele manu utilizând un driver SQL Server;

Pentru rularea aplicației web se deschide un browser și se scrie adresa http://localhost:8080/web/index.html.

7. Concluzii

Am realizat proiectarea unui site pentru firma BizZu Shop & Service. Site-ul cuprinde două parti: o parte statica si o parte dinamica prin care clientul poate sa faca comenzi on-line.

Interfață utilizator a fost realizată ca pagini html, partea statica sau ca pagini JSP in partea dinamica și este o interfață grafică pentru Web creată astfel clientii să își poată completa on-line comenzile.

Utilizatorul poate să vizualizeze pagini statice care descriu pe scurt istoricul firmei, gama de produse (servicii) pe care o are ca obiect de activitate, un album foto cu principalele lucrari de referinta, precum si modalitati de a contacta firma.

Paginile dinamice sunt concentrate in partea de completare a comenzilor on-line. Clientul se pote inregistra in baza de date a firmei, fie ca un client nou, fie ca un client deja existent. El poate vizualiza catalogul de produse(servicii) puse la dispozitie de firma si poate chiar sa competeze o comanda on-line. Comanda poate fii modificata pe parcurs sau poate fii finalizata si inscrisa in baza de date. In orice moment, utilizatorul poate abandona orice pagina, fie ea dinamica sau statica si poate trece la alta pagina.

Acest site duce la deschiderea spre web si cresterea fluxului de clienti catre firma, ei nemaifiind obligati la un contact direct cu reprezentantii firmei. De aceea sustinem ca s-a realizat un pas important in eficientizare a muncii de atragere de noi clienti catre firma, din punct de vedere economic si publicitar.

Având în vedere dezvoltarea rapidă a internetului și creșterea numărului de utilizatori, acest site poate fii utilizat ca template pentru alte site-uri de acelasi profil. El a fost implementat folosind o interfață grafică prietenoasă si placuta pentru potentialul client. Este si un ajutor pentru administratorul societatii care oricand poate afla toate comenzile lansate de catre utilizatori si inscrise in baza de date, fie ca acestea au fost completate on-line fie ca au fost completate off-line, de actre personalul angajat al societatii.

Faptul ca cineva de oriunde din lume poate sa afle date despre produsele si/sau serviciile pe care le presteaza societatea BizZu Shop & Service este un castig imens atat pentru client, cat si pentru firma.

Ca dezvoltări ulterioare ar fi:

Dezvoltarea site-ului pe partea dinamica, astfel incat un client care nu a finalizat o comanda sa o poata finaliza in alta sesiune de lucru;

Dezvoltarea structurii bazei de date cu noi entitati care sa permita efectuarea de statistici pe baza de date sau de alte operatiuni administrative si reflectarea lor in site;

Adaugarea de contoare care sa arate cati utilizatori completeaza o comanda la un moment dat si a unui contor general cu numarul de utilizatori pe site;

Introducerea posibilitatii de a sterge o comanda finalizata doar de utilizatorul care a lansat comanda;

Adaugarea unui filtru prin care administratorul sa poata vedea doar anumite comenzi in functie de data si produsele comandate.

8. BIBLIOGRAFIE

[1] T. Neward – Server Based Java Programming, Ed. Manning, 2000

[2] B. Forta, E. Smith, S. Stirling – Dezvoltarea aplicațiilor Java Server Pages – Ed. Teora, 2001

[3] http://jakarta.apache.org/tomcat/ -Tomcat – documentation

[4] M. Damian – Proiectarea si exploatarea bazelor de date relationale –(note de curs)

9. ANEXE

showLogin.jsp

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %>

<jsp:include page="banner.jsp" />

<html>

<head>

<title>Shop Login</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script language="JavaScript">

<!–

function MM_reloadPage(init) { //reloads the window if Nav4 resized

if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {

document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}

else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();

}

MM_reloadPage(true);

// –>

</script>

</head>

<body bgcolor="#CC0000" >

<h2 align="center"><font face="Verdana, Arial, Helvetica, sans-serif" ><b>Comenzi on-line</b></font></h2>

<center>

<table width="41%" border="1" align="center" bordercolor="#000000">

<form action="checkLogin.jsp" method="GET">

<tr>

<td height="35" bgcolor="#CC0000" colspan="2" align="center"><object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=5,0,0,0" width="107" height="18">

<param name="movie" value="button12.swf">

<param name="quality" value="high">

<param name="base" value=".">

<param name="bgcolor" value="#CC0000">

<embed src="button12.swf" base="." quality="high" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="107" height="18" bgcolor="#CC0000"></embed>

</object></td>

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Utilizator</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%">

<input type="text" name="username">

</td>

</tr>

<tr>

<td bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Parola</font></td>

<td bgcolor="#CCCCFF" width="82%">

<input type="password" name="password">

</td>

</tr>

<tr>

<td colspan="2" height="35">

<div align="center">

<font face="Verdana, Arial, Helvetica, sans-serif">

<input type="submit" name="Submit" value="Login">

</font></div>

</td>

</tr>

</form>

</table>

<hr align="center">

<center><font face="Verdana, Arial, Helvetica, sans-serif"><i><b><font color="#0099CC">&copy BizZu Shop & Service, 2oo5</font></b></i></font></center>

</body>

</html>

</table>

</center>

</body>

</html>

newUser.jsp

<%@ page language="java"

import="com.*, java.util.*"

errorPage="error.jsp" %>

<jsp:include page="banner.jsp" />

<html>

<head>

<title>New User</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script language="JavaScript">

<!–

function MM_reloadPage(init) { //reloads the window if Nav4 resized

if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {

document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}

else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();

}

MM_reloadPage(true);

// –>

</script>

</head>

<body bgcolor="#CC0000" leftmargin="0" topmargin="0">

<center>

<p><font face="Verdana, Arial, Helvetica, sans-serif"><b>Utilizator nou</b></font></p>

<table width="41%" border="1" align="center" bordercolor="#000000">

<form action="checkNewUser.jsp" method="GET">

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Nume</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="nume" maxlength="25" size="25">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Prenume</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="prenume" maxlength="25" size="25">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Utilizator</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="username">

</td>

</tr>

<tr>

<td bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Parola</font></td>

<td bgcolor="#CCCCFF" width="82%"> <input type="password" name="password">

</td>

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Localitate</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="oras" maxlength="25" size="25">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Adresa</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="adresa" maxlength="50" size="50">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Telefon</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="nr_telefon" maxlength="16" size="16">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">Mobil</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="mobil" maxlength="16" size="16">

</tr>

<tr>

<td height="35" bgcolor="#9999FF" width="18%"><font face="Verdana, Arial, Helvetica, sans-serif">E-mail</font></td>

<td height="35" bgcolor="#CCCCFF" width="82%"> <input type="text" name="email" maxlength="40" size="40">

</tr>

<tr>

<td colspan="2" height="35"> <div align="center"> <font face="Verdana, Arial, Helvetica, sans-serif">

<input type="submit" name="Submit" value="Accepta">

</font></div></td>

</tr>

</form>

</table>

<hr>

<font face="Verdana, Arial, Helvetica, sans-serif"><i><b><font color="#0099CC">&copy BizZu Shop & Service, 2oo5</font></b></i></font>

</center>

</body>

</html>

browse.jsp

<%@ page import="com.*, java.util.*" session="true" errorPage="error.jsp" %>

<html>

<center>

<jsp:include page="banner.jsp" />

<title>Browse the Catalog</title>

<body>

<%

if(session.getAttribute("user") == null)

response.sendRedirect("showLogin.html");

%>

<jsp:useBean id="catalog" scope="application" class="com.Catalog"/>

<body bgcolor="#CC0000">

<table width="100%" border="1" bordercolor="#000000">

<form action="processOrder.jsp" method=GET>

<input type=hidden name=action value=0>

<tr bgcolor="#9999FF">

<td><b></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Descriere</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Pret unitar</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">U.M.</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Cantitate</font></b></td>

</tr>

<%

// Get the catalog entries

Vector items = new Vector();

items=catalog.getItemuri();

for (int i = 0; i < items.size(); i++) {

Item myitem = (Item)items.elementAt(i);

String cantitate="0";

%>

<tr>

<td><input type=checkbox

name=itemId

value=<%=myitem.getItemId()%> ></td>

<td><%=myitem.getDescription()%></td>

<td><%=myitem.getPrice()%></td>

<td><%=myitem.getUm()%></td>

<td><input type="text" name="<%=myitem.getItemId()%>" value="<%=cantitate%>" maxlength="7" ></td>

</tr>

<%

}

%>

<tr colspan=5>

<td><input type=submit value="Adaugati"></td>

</tr>

</form>

</table>

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

</center>

</body>

</html>

checkLogin.jsp

<%@ page language="java"

import="com.*, java.util.*"

errorPage="error.jsp" %>

<jsp:useBean id="loginBean" scope="page" class="com.Login">

<jsp:setProperty name="loginBean" property="*"/>

</jsp:useBean>

<jsp:useBean id="monitor" scope="application" class="java.util.HashMap"/>

<%

String display = "showLogin.jsp";

// boolean recoverOrder = false;

User user = loginBean.authenticate();

if (user != null) {

user.setIpAddr(request.getRemoteHost());

// Got user. Now do they already have a session?

if (monitor.containsKey(user)) {

HttpSession oldSession = (HttpSession)monitor.get(user);

// If we want to complete an old order, uncomment these lines, recoverOrder

// and push the page to processOrder.jsp?action=1

// Order oldOrder = (Order)oldSession.getAttribute("anOrder");

// if (oldOrder != null && oldOrder.isProcessed() == false) {

// session.setAttribute("anOrder", oldOrder);

// recoverOrder = true;

// }

// oldSession.invalidate();

}

session.setAttribute("user", user);

monitor.put(user, session);

System.out.println("Assigned new session for: " + user);

session.setMaxInactiveInterval(6000);

// display = recoverOrder ? "processOrder.jsp?action=1" : "browse.jsp";

if(user.getUsername().equals("admin"))

display="showTotal.jsp";

else display = "browse.jsp";

}

%>

<jsp:forward page="<%= display %>"/>

checkNewUser.jsp

<%@ page language="java"

import="com.*, java.util.*"

errorPage="error.jsp" %>

<jsp:useBean id="newBean" scope="page" class="com.NewUser">

<jsp:setProperty name="newBean" property="*"/>

</jsp:useBean>

<%

String display = "";

if(newBean.validate())

{

int rez= newBean.scrie();

if(rez==1)

display = "showLogin.jsp";

else

{

out.print("Nu s-a putut scrie in baza de date!");

display= "newUser.jsp";

}

}

else

display= "newUser.jsp";

%>

<jsp:forward page="<%= display %>"/>

error.jsp

<%@ page isErrorPage="true"%>

S-a intamplat ceva grav. And a gasit: <br>

<%= "Exception "+ exception %>

<br><br>

<%= "Message " + exception.getMessage() %>

<% exception.printStackTrace(); %>

<br>

logOut.jsp

<%@ page import="com.*,java.util.HashMap" errorPage="error.jsp" %>

<%

if (session != null) {

User user = (User)session.getValue("user");

if (user != null) {

HashMap hash =(HashMap)application.getAttribute("monitor");

hash.remove(user);

session.invalidate();

}

}

response.sendRedirect("showLogin.jsp");

%>

processOrder.jsp

<%@ page import="com.*" errorPage="error.jsp" %>

<jsp:include page="banner.jsp" />

<html>

<title>Process the Order</title>

<body>

<%

if(session.getValue("user") == null)

{

response.sendRedirect("showLogin.jsp");

}

User user = (User)session.getValue("user");

String display = "showDetails.jsp";

int mode = (new Integer(request.getParameter("action"))).intValue();

System.out.println("Action " + mode);

Order order = null;

int cantit[]=new int[20];

String cantitate=null;

String itemIds[] = request.getParameterValues("itemId");

if (itemIds != null && itemIds.length != 0)

{

for(int i=0; i<itemIds.length; i++)

{

cantitate="";

cantitate=request.getParameter(itemIds[i]);

if(cantitate!=null && cantitate!="")

{

System.out.println("Este ne-null"+cantitate);

Integer tamp=new Integer(cantitate.trim());

int cant=tamp.intValue();

System.out.println("cantitate= "+cant);

cantit[i]=cant;

}

}

switch(mode)

{

/* 0 = add / modify

1 = complete

2 = clear

3 = display

*/

case(0):

case(2):

// This is either a new order, a modified order or needs clearing…

// String itemIds[] = request.getParameterValues("itemId");

order = new Order(user);

session.setAttribute("anOrder", order);

break;

case(1):

// Complete the order here

order = (Order)session.getAttribute("anOrder");

System.out.println("Order: " + order);

order.complete((Catalog)pageContext.getAttribute("catalog", pageContext.APPLICATION_SCOPE));

System.out.println("Comanda inregistrata");

display = "receipt.jsp";

break;

}

order.setItemIds(itemIds);

order.setCantitati(cantit);

order.setOrder();

}

else

{

if(mode!=1)

{

System.out.println("Am ajuns la invalidarea sesiunii!!!");

session.removeAttribute("anOrder");

}

else display = "receipt.jsp";

}

response.sendRedirect(display);

%>

showDetails.jsp

<%@ page import="com.*" errorPage="error.jsp" %>

<jsp:include page="banner.jsp" />

<html>

<title>Order Details</title>

<body bgcolor="#CC0000">

<center>

<%

if(session.getValue("user") == null)

response.sendRedirect("showLogin.jsp");

Order order = (Order)session.getAttribute("anOrder");

if (order == null) {

out.println("<br><br><b>Nu ati selectat nimic</b><br>");

out.println("<a href=browse.jsp>Catalog</a>");

return;

}

%>

<table width="100%" border="1" bordercolor="#000000">

<form action="processOrder.jsp" method=GET>

<input type=hidden name=action value=0>

<tr bgcolor="#9999FF">

<td><b></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Descriere</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Pret unitar</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">U.M.</font></b></td>

<td><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Cantitate</font></b></td>

</tr>

<%

Catalog catalog = (Catalog)application.getAttribute("catalog");

String ids[] = order.getItemIds();

int total=0;

String total_s="";

for (int i = 0; i < ids.length; i++) {

%>

<tr>

<td>

<input type=checkbox checked name=itemId value=<%=catalog.getItem(ids[i]).getItemId()%> checked >

</td>

<td><%=catalog.getItem(ids[i]).getDescription()%></td>

<td><%=catalog.getItem(ids[i]).getPrice()%></td>

<td><%=catalog.getItem(ids[i]).getUm()%></td>

<td><input type="text" name="<%=catalog.getItem(ids[i]).getItemId()%>" value="<%=order.getCantitate(i)%>" maxlength="7"></td>

</tr>

<%

total=total+(catalog.getItem(ids[i]).getPrice()*order.getCantitate(i));

}

Integer tot=new Integer(total);

total_s=tot.toString();

%>

<tr bgcolor="#CC0000">

<td colspan="5" align="right"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Total: <%=total_s%></font></b></td>

</tr>

<tr>

<td colspan=5>

<input type=submit value="Modify Order"> |

<a href="processOrder.jsp?action=1">Finalizati comanda</a>

</td>

</tr>

</form>

</table>

<p>

<font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Puteti sterge randuri prin de-selectarea lor.</b></font>

<p>

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

</center>

</body>

</html>

showTotal.jsp

<%@ page language="java"

import="com.*, java.util.*"

errorPage="error.jsp" %>

<jsp:include page="banner.jsp" />

<html>

<head>

<title>Administrator</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

<script language="JavaScript">

<!–

function MM_reloadPage(init) { //reloads the window if Nav4 resized

if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {

document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}

else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();

}

MM_reloadPage(true);

// –>

</script>

</head>

<jsp:useBean id="showBean" scope="page" class="com.ShowOrder">

<jsp:setProperty name="showBean" property="*"/>

</jsp:useBean>

<body bgcolor="#CC0000" leftmargin="0" topmargin="0">

<center>

<p><font face="Verdana, Arial, Helvetica, sans-serif"><b>Totalul comenzilor</b></font></p>

<table width="80%" border="1" align="center" bordercolor="#000000">

<% long nrcom=0;

int j=0;

long total=0;

long totalvechi=0;

int rez=showBean.showTotal();

for(int i=0; i<showBean.getTotVector().size(); i++)

{

String nume = ((TotalOrder)showBean.getTotal(i)).getNume();

String prenume = ((TotalOrder)showBean.getTotal(i)).getPrenume();

String numeprenume=nume+" "+prenume;

String oras = ((TotalOrder)showBean.getTotal(i)).getOras();

String adresa = ((TotalOrder)showBean.getTotal(i)).getAdresa();

String denumire = ((TotalOrder)showBean.getTotal(i)).getDenumire();

String data = ((TotalOrder)showBean.getTotal(i)).getData();

int pret = ((TotalOrder)showBean.getTotal(i)).getPret();

String um = ((TotalOrder)showBean.getTotal(i)).getUm();

int valoare = ((TotalOrder)showBean.getTotal(i)).getValoare();

total = ((TotalOrder)showBean.getTotal(i)).getTotal();

long nrcomanda =((TotalOrder)showBean.getTotal(i)).getNrcomanda();

int cantitate =((TotalOrder)showBean.getTotal(i)).getCantitate();

if(nrcom!=nrcomanda)

{

nrcom=nrcomanda;

j=1;

if(i!=0)

{

%>

<tr>

<td bgcolor="#CC0000" align="right" colspan="5"><font face="Verdana, Arial, Helvetica, sans-serif">Total:</font></td>

<td bgcolor="#9999FF" align="right"><font face="Verdana, Arial, Helvetica, sans-serif"><%=totalvechi%></font></td>

</tr>

<tr>

<td height="35" bgcolor="#CC0000" colspan="6" ><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></td>

</tr>

<tr>

<td height="35" bgcolor="#CC0000" colspan="6" ><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></td>

</tr>

<% }

%>

<tr>

<td height="35" bgcolor="#9999FF" colspan="3" width="45%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=numeprenume%></font></td>

<td height="35" bgcolor="#9999FF" colspan="2" width="35%"><font face="Verdana, Arial, Helvetica, sans-serif"><p>&nbsp;</p></font></td>

<td height="35" bgcolor="#9999FF" width="20%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=data%></font></td>

</tr>

<tr>

<td height="35" bgcolor="#9999FF" colspan="6" width="45%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=oras%></font></td>

</tr>

<tr>

<td height="35" bgcolor="#9999FF" colspan="6" width="45%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=adresa%></font></td>

</tr>

<tr>

<td height="35" bgcolor="#CC0000" colspan="6" ><font face="Verdana, Arial, Helvetica, sans-serif">&nbsp;</font></td>

</tr>

<tr>

<td height="35" bgcolor="#CC0000" colspan="6" align="center"><font face="Verdana, Arial, Helvetica, sans-serif"><p>Comanda nr.: <%=nrcomanda%></p></font></td>

</tr>

<tr></tr>

<tr>

<td height="35" bgcolor="#9999FF" width="5%"><font face="Verdana, Arial, Helvetica, sans-serif">Nr.crt.</font></td>

<td height="35" bgcolor="#9999FF" width="40%"><font face="Verdana, Arial, Helvetica, sans-serif">Denumire</font></td>

<td height="35" bgcolor="#9999FF" width="5%"><font face="Verdana, Arial, Helvetica, sans-serif">U.M.</font></td>

<td height="35" bgcolor="#9999FF" width="15%"><font face="Verdana, Arial, Helvetica, sans-serif">Pret unitar</font></td>

<td height="35" bgcolor="#9999FF" width="15%"><font face="Verdana, Arial, Helvetica, sans-serif">Cantitate</font></td>

<td height="35" bgcolor="#9999FF" width="20%"><font face="Verdana, Arial, Helvetica, sans-serif">Valoare</font></td>

</tr>

<%

}

%>

<tr>

<td height="35" bgcolor="#9999FF" width="5%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=j%></font></td>

<td height="35" bgcolor="#9999FF" width="40%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=denumire%></font></td>

<td height="35" bgcolor="#9999FF" width="5%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=um%></font></td>

<td height="35" bgcolor="#9999FF" width="15%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=pret%></font></td>

<td height="35" bgcolor="#9999FF" width="15%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=cantitate%></font></td>

<td height="35" bgcolor="#9999FF" width="20%"><font face="Verdana, Arial, Helvetica, sans-serif"><%=valoare%></font></td>

</tr>

<%

j=j+1;

totalvechi=total;

}%>

<tr>

<td bgcolor="#CC0000" align="right" colspan="5"><font face="Verdana, Arial, Helvetica, sans-serif">Total:</font></td>

<td bgcolor="#9999FF" align="right"><font face="Verdana, Arial, Helvetica, sans-serif"><%=total%></font></td>

</tr>

</table>

<hr>

<font face="Verdana, Arial, Helvetica, sans-serif"><i><b><font color="#0099CC">&copy BizZu Shop & Service, 2oo5</font></b></i></font>

</center>

</body>

</html>

Catalog.java

package com;

import java.util.Vector;

import java.sql.*;

public class Catalog {

private Vector items = new Vector();

protected connection con=new connection();

// returneaza un vector cu itemuri(catalogul)

synchronized public Vector getItemuri() {

return items;

}

// returneaza un singur item al catalogului

synchronized public Item getItem(String itemId)

{

System.out.println("item="+itemId);

int index = Integer.parseInt(itemId);

return (Item)items.elementAt(index-1);

}

// se seteaza un anumit item al catalogului

synchronized public void setItem(Item item, String itemId) {

int index = Integer.parseInt(itemId);

items.set(index-1, item);

}

public Catalog() {

/**

* Conexiunea cu baza de date. Citeste de acolo catalogul de produse

*

*/

Connection dbConnection=con.getDbConnection();

String sql="Select * from catalog";

try

{

ResultSet rs=con.execQuery(sql);

while(rs.next())

{

int cid=rs.getInt(1);

Integer cid_i=new Integer(cid);

String cid_s=cid_i.toString();

String denumire=rs.getString(2);

int pret=rs.getInt(3);

String um=rs.getString(4);

items.addElement(new Item(cid_s,denumire,pret,um));

}

}

catch(SQLException e)

{

System.out.println("Caught SQL exception");

e.printStackTrace();

}

}

}

connection.java

package com;

import java.sql.*;

import java.io.*;

public class connection

{

protected String dbDriver="sun.jdbc.odbc.JdbcOdbcDriver";

protected String dbURL="jdbc:odbc:BizZu";

protected Connection dbConnection;

protected int r;

//constructor

public connection(){}

protected void setConnection()

{

try

{

//stabileste driverul de utilizat

Class.forName(dbDriver);

//stabileste conexiunea

dbConnection=DriverManager.getConnection(dbURL,"","");

}

catch( ClassNotFoundException e)

{

System.out.println("no driver found");

}

catch (SQLException e)

{

System.out.println("cannot establish connection");

}

}

protected Connection getDbConnection()

{

try

{

//stabileste driverul in uz

Class.forName(dbDriver);

//stabileste conexiunea

dbConnection=DriverManager.getConnection(dbURL,"","");

}

catch( ClassNotFoundException e)

{

System.out.println("no driver found");

}

catch (SQLException e)

{

System.out.println("cannot establish connection");

}

return dbConnection;

}

// inchide conexiunea la baza de date

protected void closeConnection()

{

try

{

dbConnection.close();

}

catch(SQLException e){}

}

// returneaza o fraza SQL Statement

protected Statement setStatement() throws SQLException

{

this.setConnection();

return dbConnection.createStatement();

}

//executa update pentru feaza SQL data

protected int execUpdate(String sql)

{

int msg=0;

try

{

r= this.setStatement().executeUpdate(sql);

msg=1;

}

catch(SQLException e)

{

System.out.println("Caught SQL exception");

e.printStackTrace();

msg=0;

}

//this.closeConnection();

return msg;

}

//executa fraza SQL data si returneaza un ResultSet

protected ResultSet execQuery(String sql)

{

ResultSet rez=null;

try

{

rez=this.setStatement().executeQuery(sql);

}

catch(SQLException e)

{

System.out.println("Caught SQL exception");

e.printStackTrace();

}

//this.closeConnection();

return rez;

}

}

Item.java

package com;

public class Item {

private String itemId;

private int price;

private String description;

private String um;

// descrie un rand din catalog

public Item(String itemId, String description,

int price, String um) {

this.itemId = itemId;

this.description = description;

this.um = um;

this.price = price;

}

public String getItemId() {

return itemId;

}

public void setItemId(String aItemId) {

itemId = aItemId;

}

public int getPrice() {

return price;

}

public String getDescription() {

return description;

}

public String getUm() {

return um;

}

public void setUm(String aUm) {

um = aUm;

}

}

Login.java

package com;

public class Login {

private String username = "";

private String password = "";

private User user=null;

// clasa bean a lui swowLogin.jsp

public Login() {

}

public void setUsername(String username) {

this.username = username;

}

public void setPassword(String password) {

this.password = password;

}

// autentifica utilizatorul, returneaza un user valid daca l-a gasit in baza de date

//si nullin caz contrar

public User authenticate()

{

User user=new User();

if(user.existUserPass(username,password)!=0)

{

user=new User(username);

return user;

}

else

return null;

}

}

newUser.java

package com;

public class NewUser {

// clasa bean a lui showNewUser

private String nume = "";

private String prenume = "";

private String oras = "";

private String adresa = "";

private String username = "";

private String password = "";

private String nr_telefon = "";

private String mobil = "";

private String email = "";

private User user=null;

protected connection con=new connection();

public NewUser() {

}

public void setUsername(String username)

{

this.username = username;

}

public String getUsername()

{

return username;

}

public void setPassword(String password)

{

this.password = password;

}

public String getPassword()

{

return password;

}

public void setNume(String nume)

{

this.nume = nume;

}

public String getNume()

{

return nume;

}

public void setPrenume(String prenume)

{

this.prenume = prenume;

}

public String getPrenume()

{

return prenume;

}

public void setOras(String oras)

{

this.oras = oras;

}

public String getOras()

{

return oras;

}

public void setAdresa(String adresa)

{

this.adresa = adresa;

}

public String getAdresa()

{

return adresa;

}

public void setNr_telefon(String nr_telefon)

{

this.nr_telefon = nr_telefon;

}

public String getNr_telefon()

{

return nr_telefon;

}

public void setMobil(String mobil)

{

this.mobil = mobil;

}

public String getMobil()

{

return mobil;

}

public void setEmail(String email)

{

this.email = email;

}

public String getEmail()

{

return email;

}

public boolean validate()

{

boolean bun=false;

User user=new User();

if(username!=null || username!="")

if(password!=null || password!="")

if(nume!=null || nume!="")

if(prenume!=null || prenume !="")

if(oras!=null || oras !="")

if(adresa!=null || oras !="")

if(user.existUserPass(username,password)==0)

{

bun=true;

}

return bun;

}

public int scrie()

{

int rez=0;

System.out.println("VALUES"+username+","+password+","+nume);

String sql="INSERT INTO users (username,parola,prenume,nume,oras,adresa,nr_telefon,mobil,email) VALUES ('";

sql=sql+username+"','"+password+"','"+prenume+"','"+nume+"','"+oras+"','"+adresa+"','"+nr_telefon+"','"+mobil+"','"+email+"')";

rez=con.execUpdate(sql);

return rez;

}

}

Order.java

package com;

import java.util.Date;

import java.text.DateFormat;

import javax.servlet.http.*;

import javax.servlet.http.HttpServletRequest;

import java.sql.*;

import java.io.*;

public class Order implements HttpSessionBindingListener

{

private String itemIds[];

private int cantitati[]=new int[20];

private long orderId;

private User user;

private Catalog catalog;

private boolean processed = false;

protected connection con=new connection();

public Order(User user)

{

orderId = System.currentTimeMillis();

this.user = user;

}

public void setItemIds(String itemIds[])

{

this.itemIds = itemIds;

}

public void setCantitati(int cantitati[])

{

this.cantitati=cantitati;

}

// scrie in baza de date un articol de tip comanda

public void setOrder() throws SQLException, Exception

{

int userid=user.getUserid();

System.out.println("Userid "+userid);

System.out.println("User "+userid+" lungime "+itemIds.length);

catalog=new Catalog();

String data = DateFormat.getInstance().format(new Date());

for(int i=0; i<itemIds.length; i++)

{

String cat=catalog.getItem(itemIds[i]).getItemId();

Integer catalog_i=new Integer(cat);

int catalog_ii=catalog_i.intValue();

Integer cant_i=new Integer(cantitati[i]);

int cant_ii=cant_i.intValue();

System.out.println("VALUES"+userid+","+catalog_ii+","+cant_ii);

String sql="INSERT INTO comanda (client,rind,cantitate,nrcomanda,data) VALUES ("+userid+","+catalog_ii+","+cant_ii+","+orderId+",'"+data+"')";

int rez=con.execUpdate(sql);

}

}

public String[] getItemIds() {

return itemIds;

}

public long getOrderId() {

return orderId;

}

public int[] getCantitati() {

return cantitati;

}

public int getCantitate(int index) {

return cantitati[index];

}

public boolean isProcessed() {

return processed;

}

public void complete(Catalog catalog) {

processed = true;

}

public User getUser() {

return user;

}

public void valueBound(HttpSessionBindingEvent event) {}

public void valueUnbound(HttpSessionBindingEvent event) {

if (!processed) {

doLog();

}

}

private void doLog() {

try {

PrintWriter log = new PrintWriter(new FileWriter("../logs/shopping.txt"), true);

log.println("Incomplete order number " + orderId +

" for user " + user.getUsername());

log.close();

} catch(IOException e) {}

}

public String toString() {

String temp = "";

for (int i = 0; i < itemIds.length; i++) {

temp += " , " + itemIds[i];

}

return "order id :" + orderId + "<br>Items ids : " + temp;

}

}

showOrder.java

package com;

import java.text.DateFormat;

import java.sql.*;

import java.util.*;

public class ShowOrder {

// clasa bean pentru showTotal.jsp

protected connection con=new connection();

protected Vector totVector=new Vector();

public ShowOrder()

{

}

public Vector getTotVector()

{

return totVector;

}

public void setTotVector(Vector newtotvector)

{

totVector=newtotvector;

}

public Object getTotal(int index)

{

return totVector.get(index);

}

public void setTotal(Object obj, int index)

{

totVector.insertElementAt(obj,index);

}

// selecteaza din baza de date toate comenzile in ordinea userilor si a comenzilor, pentru administrator

public int showTotal()

{

int rez=0;

String sql="select nume, prenume, oras, adresa, comanda.nrcomanda, data, denumire, pret, cantitate,pret*cantitate as valoare,total";

sql=sql+" from totaluri,users,comanda,catalog where totaluri.userid=users.userid and comanda.nrcomanda=totaluri.nrcomanda and comanda.rind=catalog.cid";

sql=sql+" order by totaluri.userid";

try

{

ResultSet rs=con.execQuery(sql);

while(rs.next())

{

TotalOrder tot=new TotalOrder();

tot.setNume(rs.getString(1));

tot.setPrenume(rs.getString(2));

tot.setOras(rs.getString(3));

tot.setAdresa(rs.getString(4));

tot.setNrcomanda(rs.getLong(5));

tot.setData(DateFormat.getInstance().format(rs.getDate(6)));

tot.setDenumire(rs.getString(7));

tot.setPret(rs.getInt(8));

tot.setCantitate(rs.getInt(9));

tot.setValoare(rs.getInt(10));

tot.setTotal(rs.getInt(11));

totVector.add(tot);

rez=1;

}

}

catch(SQLException e)

{

System.out.println("Caught exception");

e.printStackTrace();

}

return rez;

}

}

TotalOrder.java

package com;

import java.util.*;

public class TotalOrder {

// clasa bean care descrie atributele frazei select din metoda showTotal()

// a clasei ShowOrder

private String nume = "";

private String prenume = "";

private String oras = "";

private String adresa = "";

private String denumire = "";

private String data = "";

private int pret = 0;

private String um = "";

private int valoare = 0;

private long total = 0;

private long nrcomanda =0;

private int cantitate =0;

public TotalOrder()

{

}

public void setDenumire(String denumire)

{

this.denumire = denumire;

}

public String getDenumire()

{

return denumire;

}

public void setPret(int pret)

{

this.pret = pret;

}

public int getPret()

{

return pret;

}

public void setNume(String nume)

{

this.nume = nume;

}

public String getNume()

{

return nume;

}

public void setPrenume(String prenume)

{

this.prenume = prenume;

}

public String getPrenume()

{

return prenume;

}

public void setOras(String oras)

{

this.oras = oras;

}

public String getOras()

{

return oras;

}

public void setAdresa(String adresa)

{

this.adresa = adresa;

}

public String getAdresa()

{

return adresa;

}

public void setData(String data)

{

this.data = data;

}

public String getData()

{

return data;

}

public void setUm(String um)

{

this.um = um;

}

public String getUm()

{

return um;

}

public void setValoare(int valoare)

{

this.valoare = valoare;

}

public int getValoare()

{

return valoare;

}

public void setCantitate(int cantitate)

{

this.cantitate = cantitate;

}

public int getCantitate()

{

return cantitate;

}

public void setTotal(long total)

{

this.total = total;

}

public long getTotal()

{

return total;

}

public void setNrcomanda(long nrcomanda)

{

this.nrcomanda = nrcomanda;

}

public long getNrcomanda()

{

return nrcomanda;

}

}

Similar Posts

  • Platforma Web Pentru Studenti

    Cuprins: NOTIUNI iNTRODUCTIVE ……………………………………………………1 Prezentarea Lucrării …………………………………………………..0 Analiza de proiectare ……………………………………………………D Scopul Aplicației…………………………………………………………D Publicul țintă………………………………………..…………………D Analiza business…………………………………………………….D Tema aplicatiei…………………………………………………..D Probleme rezolvate…………………………………………………………D Analiza SWOT……………………………………………………D Project Management în ONG-uri……………………………………….D Etapele unui proiect…………………………………………………D Feedback……………………………………………………..……D Branding……………………………………………………………… INTRODUCERE ÎN APLICAȚII WEB MODERNE……………………………20 Tehnologii ………………………………………………………….D HTML5 …………………………………………………………………..D CSS3……………………………………………………………………D PHP………….…………………………………………………………..D MySQL……………………………………………………………… WAMP …………………………………………………………. Open Source…………………………………………………………….D Evoluția limbajului php …………………………………………..D Fire de execuție…

  • Biblioteci Digitale In Romania

    Nu se poate vorbi despre existența bibliotecilor digitale fără a porni de la origini, de la biblioteca tradițională, care a fost supusă proceselor de automatizare a activităților specifice. Apariția termenului de bibliotecă digitală s-a realizat la începutul anilor 1990, iar consemnarea lui se regăsește într-un raport din 1993: ”Source Book on Digital Libraries”. 2.1. Criterii…

  • Instrumente DE Comunicare Online

    INSTRUMENTE DE COMUNICARE ONLINE Cuprins Introducere CAPITOLUL I. CONCEPTE DE COMUNICARE ONLINE 1.1. Istoria comunicării și apariția comunicării online 1.2. Impactul tehnologiei asupra comunicării 1.3. Apariția comunicării online CAPITOLUL II. NOILE TEHNOLOGII DE COMUNICAREA ONLINE 2.1. Importanța comunicării online 2.2. Mediul de comunicare online 2.3. Influența mijloacelor de comunicare online CAPITOLUL III. COMUNICAREA ONLINE ÎN…

  • Site Dinamic Pentru O Agentie Imobiliara

    SITE DINAMIC PENTRU O AGENȚIE IMOBILIARĂ CUPRINS INTRODUCERE I. ACTIVITATEA DE INTERMEDIERE IMOBILIARĂ I.1. EVOLUTIA PIETEI DE INTERMEDIERE IMOBILIARA IN ROMANIA I.2. PIATA LOCALA A TRANZACTIILOR IMOBILIARE I.3. ASOCIATIA ROMANA A AGENTIILOR IMOBILIARE (A.R.A.I.) I.4. PREZENTARE AGENTIEI IMOBILIARE “CASA TA” II. INTERNET-UL II.1. INTRODUCERE II.1.1 Internet-ul II.1.2. Aplicații pentru Internet II.2. WEB SERVERS ȘI WEB…

  • Aplicatie Web Pentru Activitatea de Emitere Avize Tehnice de Racordare la Reteaua Electrica de Distributie

    LUCRARE DE DIPLOMĂ Aplicație web pentru activitatea de emitere avize tehnice de racordare la rețeaua electrică de distribuție CUPRINS 1. INTRODUCERE În istoria omenirii, progresul societății a fost generat de cunoștințe, deoarece informația, datele erau restrânse cantitativ: lipseau mijloacele de măsură, culegere și transport de date puse la dispoziție de electronică și informatică. În prezent,…

  • . Sistem Informatic Privind Lansarea Si Urmarirea Productiei

    CAPITOLUL I ROLUL ȘI IMPORTANȚA LANSĂRII ȘI URMĂRIRII PRODUCȚIEI 1.1 Conducerea operativă a producției. Conceptele de lansare și urmărire a producției Sistemul de conducere a activității oricărei întreprinderi poate fi definit ca fiind totalitatea elementelor componente și a relațiilor dintre acestea, structurate într-un anumit cadru organizatoric în care se realizează procesele de conducere, desfășurate în…