Proiectarea Unui Magazin It Virtual
PROIECTAREA UNUI MAGAZIN IT VIRTUAL
Introducere
Trăim în epoca vitezei, atunci cînd orice informație poate ajunge la destinatar doar în cîteva momente, fapt ce înlesnește rapiditatea lucrului efectuat. Acest lucru i se datorează, în exclusivitate, progresului științific, care în perioada contemporană s-a dezvoltat foarte intens, fapt ce a permis trecerea unor acțiuni clasice în spațiul virtual, prin intermediul noilor tehnologii informaționale.
Prin intermediul tehnologiilor moderne nu doar că poți fi informat cu ultimele noutăți de pe piața mondială, dar, mai nou, poți să procuri orice produs ai dori, din orice colț al lumii, doar accesînd site-ul companiei, și transferînd pe contul ei suma necesară cumpărării, produsul urmînd să fie expediat poștal sau virtual imediat. Deasemenea, Internetul permite compararea a mai multor produse care fac parte din aceeași ramură, lucru imposibil în multe din localitățile țării noastre. Deoarece specialiștii în domeniul IT consideră că viitorul relațiilor de piață este legat de domeniul noilor tehnologii informaționale, consider că este o tematică actuală, ba mai mult decît atît – de viitor.
Membrii unei comunități de afaceri pot descrie Internetul ca pe un instrument modern, rapid și eficient, esențial pentru contactele cu partenerii aflați în toate colțurile planetei, pentru a încheia tranzacții comerciale și a efectua plăți. Unii utilizatori de Internet l-ar putea defini ca pe un mijloc de a face schimb de resurse (fișiere) cu alți utilizatori. Navigarea pe Internet permite vizitarea unei varietăți imense de site-uri, mult diferite din punctul de vedere al conținutului, dar și din punctul de vedere al aspectului grafic.
Din acest motiv am considerat ca foarte utilă alegerea unei asemenea teme, studiul unui sector în continuă expansiune.
Lucrarea "Magazinul Virtual IT" se dorește a fi o pledoarie pentru dezvoltarea comerțului electronic, un studiu al afacerilor on-line, o analiză a avantajelor și dezavantajelor pe care le poate avea deținerea unui afaceri electronice.
Studiul este organizat în trei capitole care tratează această temă atât din punctul de vedere al întreprinzătorlui cât și din perspectiva cumpărătorului de bunuri și servicii.
Primul capitol "Programare Web" oferă informații despre ceea ce înseamnă Programare web în linii generale, modul în care acesta funcționează. Este realizată o explicare a limbajelor de programare și sisteme de management populare. Avantajele unei prezențe active în acest mediu aflat în continuă expansiune încheie acest capitol.
"Tehnologii implementate într-un site web" este tematica tratată de al doilea capitol, accentul fiind pus atât pe tipurile principale de formatare a paginii web cât și exemple necesare de a înțelege realizarea o astfel de activitate în mod profitabil. Două subiecte dezvoltate în aceasta secțiune a lucrării este interfața cu utilizatorul și partea logică alcătuită de programator.
În a treia parte a lucrării numită "Elaborarea magazinului virtual IT" sunt analizate și descrise etapele necesare de parcurs pentru a crea un site de acest tip. Este descrisă ca mod de functionare și structură.
Scopul și obiectivele lucrării. Scopul acestei cercetari este evaluarea impactului publicității on-line asupra comportamentului consumatorului. Definirea problemei decizionale are în vedere o serie de simptome, cum ar fi: în fața producției de informații în continuă creștere, ceea ce are drept consecință apariția de fenomene precum „suprasaturarea” informațională și adoptarea unor tehnologii din ce în ce mai sofisticate utilizatorul se simte dezorientat, creșterea exponențială a competiției în mediul online, rolul internetului în globalizarea informațională. Astfel, se are în vedere necesitatea companiilor de a-și adapta strategiile de promovare la mediul online în contextul actual al progresului tehnologic și al globalizării informaționale. Pentru aceasta este necesară studierea cu atenție a comportamentului consumatorului cu privire la publicitatea pe internet .
În realizarea scopului am propus următoarele obiective:
promovarea implementării tehnologiilor moderne în domeniu IT;
evidențierea importanței modului de organizare a informației într-o pagină web;
specificarea elementelor esențiale în elaborarea unei aplicații web;
analiza motivațiilor utilizării internetului ca mijloc de transacții;
identificarea motivelor vizînd decizia de cumpărare a produselor prin intermediul online;
Programare WEB
Web-ul a fost inventat în 1989 la Centrul European de Cercetări Nucleare (CERN) din Geneva, Elveția. Propunerea inițială de creare a unei colecții de documente având legături între ele [1] a fost făcută de Tim Berners-Lee în martie 1989. Propunerea a apărut în urma problemelor de comunicare pe care le întâmpinau echipele de cercetători ce foloseau centrul, chiar și folosind poșta electronică.[3]
Primul prototip al acestei colecții (mai întâi în format de text simplu) a apărut nu mult înainte de decembrie 1991, când s-a făcut prima lui demonstrație publică. Studiul a fost continuat prin apariția primei aplicații grafice Mosaic, în februarie 1993, realizată de cercetătorul Marc Andreessen de la centrul universitar National Center for Supercomputing Applications (NCSA) din orașul Urbana-Champaign din statul federal Illinois, SUA.[3]
În 1994 CERN și M.I.T. au format Consortiul World Wide Web, care are drept obiectiv dezvoltarea web-ului, standardizarea protocoalelor și încurajarea legăturilor dintre site-uri. Berners-Lee a devenit directorul acestui consorțiu. M.I.T. coordonează partea americană a consorțiului, iar partea europeană este coordonată de INRIA, centrul de cercetări francez.[3]
În 1995 Andreessen părăsește NCSA și înființează o nouă companie, Netscape Communications Corp., care se ocupă cu dezvoltarea de software pentru web.[3]
Apoi web-ul a evoluat până la ceea ce este astăzi, un serviciu multimedia integrativ, având ca suport fizic Internetul.[3]
Limbaje de programare
Limbajul de programare PHP
PHP este un limbaj de programare puternic și simplu pentru elaborarea programelor pe Internet. Este cel mai popular limbaj de programare pentru site-urile Web. Astăzi, peste 20 de milioane de site-uri funcționează pe servere cu PHP instalat. Programatorilor din toată lumea le convine flexibilitatea lui, viteza și ușurința cu care se utilizează. În plus, instrumentele de lucru în PHP sunt gratuite.
PHP este util pentru elaborarea a tot felul de funcționalități pentru Internet, de la aplicații mici și simple până la magazine virtuale, portaluri și sisteme de content management. Înainte, pe Internet dominau paginile HTML simple, cu interactivitate limitată. Astăzi, Internetul a devenit mult mai complex. Companiile au mai multe așteptări de la prezentările lor online, iar acest lucru necesită aplicații mai dinamice și mai interactive.
Limbajul PHP este ideal pentru scrierea acestui tip de programe și în acest scop este și dezvoltat. Posibilitățile vaste pe care le oferă, sintaxa ușor de înțeles și compatibilitatea cu diferite sisteme de operare și servere Web, l-au făcut să fie un limbaj ideal pentru dezvoltarea rapidă a aplicațiilor Web și pentru crearea sistemelor de Internet complexe. Se poate găsi tot timpul de lucru în PHP. Limbajul de programare PHP se învață relativ repede, așa că în scurt timp puteți ajunge la nivelul așteptat de profesionalism și de lucru.
Există încă un avantaj important privind asimilarea PHP-lui: chiar și pentru cei fără nicio experiență, deschiderea platformei Web și accesarea lucrărilor permit începătorilor să lucreze la dezvoltarea unui număr mare de site-uri și astfel să câștige în scurt timp referințe și experiența care se caută la angajarea programatorilor de calitate.
Limbajul de programare C#
C# este cel mai popular limbaj de programare pentru scrierea celui mai larg spectru de programe, drivere, soft-uri de sistem, jocuri, aplicații utilizate în cadrul bazelor de date etc.
Programele scrise în C# sunt formate din mai multe părți de bază (componente) care se pot combina în diferite forme, precum cuburile lego. Acest limbaj oferă posibilitatea dezvoltării sistemelor de programe mari, astfel că programatorul poate face față fără greutăți programelor cu cantități enorme de coduri.
Mediul de programare C# este puternic, flexibil și lejer. Milioanele de profesioniști din toată lumea utilizează acest limbaj de programare. Este un instrument extraordinar prin care o idee se poate pune ușor în practică. Cunoașterea acestui limbaj de programare vă va asigura condiții excelente de lucru.
Limbajul de programare Java
Java este un limbaj de programare dezvoltat de compania Sun Microsystems în anul 1991, ca parte din proiectul de dezvoltare a soft-urilor pentru televizoare, aparate video și alte aparate electronice asemănătoare. Din această cauză, Java a trebuit să fie simplu, rapid, eficient, fiabil și ușor transportabil de pe un dispozitiv pe altul. Aceste caracteristici l-au făcut să devină ideal și popular pentru crearea programelor, serviciilor, jocurilor pentru telefoanele mobile și pentru crearea funcționalităților serviciilor Web.
Java este foarte popular, chiar dacă este un limbaj nou. Unul dintre motivele principale pentru această popularitate este faptul că programele Java pot rula pe aproape orice tip de calculator. Din acest motiv, Java este orientat pe obiect la fel ca C#. Pentru un programator, acest lucru înseamnă că poate să facă sau să schimbe programe mari fără prea multe complicații. Limbajul în sine este simplu, în comparație cu majoritatea limbajelor de programare, motiv pentru care se învață relativ ușor. Cu toate acestea, limbajul este robust și puternic.[2]
Pagini Web și Servere Web
Construcția World Wide Web este bazat pe un protocol numit Hypertext Transfer Protocol (HTTP). HTTP este un protocol mic și rapid care se potrivește foarte bine sistemelor informatice multimedia și distribuite în salturile între site-uri.
Web-ul constă în pagini cu informații de pe gazde care rulează software de tip server Web.Gazda este de multe ori identificată cu serverul Web, lucru care nu este corect. Serverul Web este un software, nu calculatorul în sine.
Un Web server este un program care furnizează pagini Web la cerere. Când un utilizator de la o adresă IP specifică solicită un anumit fișier, serverul Web încearcă să obțină acel fișier și să-l trimită înapoi utilizatorului. Fișierul solicitat poate fi codul sursă HTML al unei pagini Web, o imagine GIF, un fișier Flash, un document XML, sau un fișier AVI. Browser-ul Web este cel care determină ceea ce trebuie cerut, nu serverul Web.
Conexiunile la serverul Web stabilesc pe măsură ce sunt accesate, se solicită o cere a unei pagini de la un server Web, o conexiune IP este stabilită prin Internet între gazda solicitantă și gazda pe care rulează serverul Web. Pagina Web cerută este transmisă prin acea conexiune, iar aceasta este întreruptă de îndată ce pagina este primită (de exemplu, imagini GIF sau JPG).
Pe un același host(gazdă) pot rula mai multe aplicații de Internet, de exemplu un server Web, un server FTP, un server DNS și un server de mail SMTP POP3 pot rula în același timp. Fiecărui server îi este atribuit un port pentru a asigura că fiecare server va răspunde numai cererilor din partea clienților corespunzători. Majoritatea serverelor folosesc un set de porturi predefinite. Serverele Web folosesc de obicei portul 80, dar acesta poate fi schimbat. Pot fi instalate pe porturi nestandard pentru a fi ascunse, și de asemenea, pot fi instalate mai multe servere Web pe un singur calculator asociindu-le porturi diferite.
Internetul reprezintă o mulțime globală de calculatoare interconectate, similar unei rețele locale, dar la o scară mult mai largă. Elementul primar al Internet-ului este World Wide Web (cunoscut sub denumirea de Web sau WWW ). WWW este un suport pentru text, grafică, animație și sunet.
Documentele destinate Web-ului sunt cunoscute sub numele de pagini Web. Pentru a înțelege mai bine World Wide Web se pornește de la modul în care este organizată informația în mediile tipărite. Aceste medii reprezintă un model adecvat pentru web și modul său de organizare.
Paginile Web oferă posibilități multiple și interesante: paginile de informații se pot regăsi pe calculatoare răspândite în lumea întreagă. Paginile în sine pot fi documente foarte complexe, interesante și atractive.
Paginile Web sunt memorate pe HDD unui server specializat și gestionate printr-un software special și sunt regăsite și afișate prin intermediul navigatoarelor Web (browser-e).
Navigatorul Web afișează paginile de Web prin interpretarea unor marcatori definiți cu ajutorul unui limbaj special denumit HTML (HyperText Markup Language) utilizat pentru a codifica pagina de Web cu informația de afișat. Marcatorii au diferite semnificații. De exemplu aceștia semnifică modul în care vor fi așezate diversele părți ale paginii sau stabilesc legături între documente/fișiere. Tipic, o pagină de Web este legată de o diversitate de fișiere cum ar fi fișiere text, grafice sau multimedia. Mecanismul prin care sunt create căile de acces între documente este denumit hypertext, prezentat anterior. Atunci când utilizatorul acționează prin clic de mouse asupra unei legături, cum ar fi o porțiune de text, un element grafic, etc, navigatorul încarcă fișierul la care punctează această legătură și îl afișează. Legăturile din cadrul textului sunt ușor de identificat deoarece majoritatea navigatoarelor, implicit, colorează diferit de restul textului aceste legături și le subliniază.
Un site Web este definit ca o colecție coerenta de informații prezentată sub forma unor pagini Web, fișiere multimedia, documente și de alte tipuri, între care există legături. Într-un site bine proiectat toate celelalte pagini punctează către pagina principală, chiar dacă navigatoarele moderne au butoane pentru acest lucru. Atunci când se realizează un site Web aceste fișiere sunt păstrate, în mod uzual, într-un director sau o colecție de directoare în HDD local și este ferit cu numele de site local .
Serverul Web este dedicat memorării, transmiterii și regăsirii paginilor de Web și a fișierelor legate de acestea. Prin publicarea unui site local (upload), directorul, împreună cu conținutul său, este transferat la server Web care conține Software prin care site-ul este transmis navigatoarelor Web ale calculatoarelor conectate la Internet. Odată publicat, site-ul se transformă din site local în site Web, iar interacțiunea utilizatorului cu el are loc similar modului descris în figura 1.1.
Figura 1.1 Interacțiunea cu utilizatorul
Deși cea mai mare parte a informațiilor din World Wide Web este stocată în pagini Web scrise folosind limbajul HTML, există un număr destul de mare de documente provenite din alte tipuri de servicii de publicare a informațiilor din Internet.
HyperText și HyperMedia
Termenul de hypertext desemnează un material sub forma de text și imagine, interconectat într-o manieră complexă, nesecvențială, în care utilizatorul poate naviga, căuta informații referitoare la un obiect. Hypertext-ul trebuie interpretat ca un text care semnalează o legătură la o altă informație web, de obicei un alt document web, și este identificat prin subliniere sau culoare, pentru a-l deosebi de textul simplu.
Hypermedia este un termen aproape sinonim celui de hypertext, singura deosebire fiind faptul că subliniază prezența și a unor elemente care nu sunt de tip text, cum ar fi animații, secvențe sonore sau secvențe video. HTML se utilizează din 1990, cunoscând câteva versiuni de dezvoltare, fiecare dintre acestea îmbunătățind performantele limbajului. Ultima variantă este HTML 5. ce include facilitățile versiunilor anterioare (tag-uri de marcare, tag-uri pentru hyper-legături, antete, paragrafe, liste, elemente de meniu, formatare caractere, imagini in-line și tag-uri pentru schimbul de date dinamic între utilizatori), adăugând facilitați și extensii pentru numere, tabele și elemente de control.
Java Script
Pentru a se construi interfețe intuitive și sofisticate este necesar și un limbaj de scripting la nivel de client.
Scripting permite scrierea de cod (mici programe) care rulează în cadrul browser-ului. Cel mai cunoscut limbaj de scripting pe parte de client este Java Script, care este suportat (mai mult sau mai puțin) de aproape orice browser existent. Folosind Java Script se poate realiza: validarea formularelor, animarea textului și a imaginilor, crearea de meniuri drop down și a controalelor de navigare, se pot efectua procesări de bază numerice sau asupra textelor și multe altele.
Scripting permite programatorilor să detecteze și să proceseze evenimentele. De exemplu, o pagină care se încarcă, un formular trimis, mișcarea pointer-ului mouse-ului asupra unei imagini sunt toate evenimente, iar script-urile pot fi executate automat de browser atunci când aceste evenimente au loc.
Script-urile pot fi incluse în codul HTML sau pot fi stocate în fișiere externe și legate în interiorul codului HTML.
Tehnologii Client
Majoritatea browser-elor noi permit folosirea și a altor tehnologii, dintre care cele mai importante sunt:
CSS (Cascading Style Sheets) – oferă o modalitate de a separa prezentarea de conținut astfel încât ambele să poată fi refolosite și modificate cu ușurință.
DHTML (Dynamic HTML) – o combinație de HTML, script-uri și CSS care folosite împreună, pot realiza interfețe pentru utilizator foarte atractive și interactive.
Applet-uri Java – mici programe care rulează în browser.
Macromedia Flash – o tehnologie inclusă în 98% din browser-ele existente, care oferă un mecanism pentru crearea unor interfețe atractive și portabile.
URL-uri
Formatul unei locații din Internet este numit URL ( Uniform Resource Locator – Descriptor Uniform de Resurse). Structura completă a unui URL este următoarea:
protocol://nume-calculator-gazda:port/cale-director/resursa.
Protocolul sau serviciul este reprezentat de regulile care guvernează transferul datelor în rețea. În practică se utilizează următoarele protocoale:
file – specifică un URL local;
http – indică adresa Internet a unei pagini Web sau altă resursă ;
ftp – utilizat pentru adresarea în Internet a fișierelor prin intermediul protocolului de transfer de fișiere FTP;
gopher – indică adresa URL a unui director Gopher; reprezintă un sistem utilizat pentru localizarea și transferul informațiilor de indexare a numelor fișierelor în Internet;
telnet – permite conectarea în timp real la un alt calculator în Internet și utilizarea acestuia ca și cum ar fi un calculator local.
In sistemele Windows, în anumite situații protocolul poate lipsi pentru anumite adrese, tipul acestuia fiind determinat din numele gazdei. Numele calculatorului gazdă identifică în mod unic un calculator în cadrul rețelei. Numele poate fi reprezentat atât printr-o adresa IP, cât și prin denumirea unui calculator local sau a unui calculator din Internet folosind specificațiile DNS.
Portul este reprezentat printr-un număr și este specific fiecărei aplicații. Majoritatea aplicațiilor de rețea utilizează porturi pentru comunicare. Pe un calculator pot exista mai multe aplicații de rețea, fiecare aplicație utilizând un port distinct.
Numele resursei este reprezentat de numele fișierului referit. Acesta poate fi o pagina Web, un fișier multimedia, un document, un fișier executabil. O limitare o constituie faptul că un URL nu poate conține spații și alte caractere speciale, astfel că orice spațiu sau caracter special se va converti printr-un cod asociat acestora precedat de simbolul „%”.
Alte URL-uri folosite alături de cele prezentate sunt cele de:
e-mail, prin intermediul cărora se pot doar transmite mesaje de poștă electronică;
știri Usenet – în care trebuie să se identifice un server de știri care să ofere acces.
CMS-uri
Un sistem de administrare a conținutului sau CMS (în engleză Content Management System) este un sistem software creat pentru automatizarea cât mai facilă și completă a gestiunii conținutului, în special a site-urilor web. Scopul este de a reduce sau elimina intervenția programatorilor la editarea și administrarea site-urilor lor.
CMS-ul facilitează organizarea, controlul și publicarea de documente sau alt tip de conținut, cum ar fi imagini și resurse multimedia. Un CMS web este un CMS cu facilitați adiționale pentru ușurarea publicării de conținut pe diversele site-uri web.
Sistem de management Joomla
Joomla este un sistem de management al conținutului Open Source, scris în PHP, destinat publicării de conținut pe inter și intra net prin intermediul bazelor de date SQL. Joomla include funcționalități precum cache-ingul paginilor pentru îmbunătățirea performanțelor, RSS, opțiune de printare a paginilor web, știri de ultimă oră, bloguri, sondaje, căutare web, și localizare internațională.
Joomla a fost adoptat de o gamă largă de entități: indivizi, corporații, organizații nonprofit, afaceri mici și organizații publice. Pe lângă ușurința în utilizare și caracteristicile sale incluse, pentru Joomla există disponibile sute de extensii gratuite sau comerciale. Această gamă vastă de extensii fac posibilă realizarea unor site-uri Joomla care pot face aproape orice este nevoie, de la camere de discuții la licitații online, la anunțuri și la magazine online.
Dincolo de capacitățile sale excelente, principalul motiv pentru care Joomla este atât de popular este estetica interfeței publice pe care o oferă. Temele vizuale profesionale pentru interfața publică, atât cele gratuite cât și cele comerciale, pot face ca aproape orice site web să devină atrăgător.
Joomla permite unor site-uri neînsemnate să stea alături de site-uri de milioane de dolari fără nicio problemă. Aceasta înseamnă ca o prezență web profesională este disponibila creatorilor de site-uri care nu au nicio experiență în design.
Sistem de gestionare Drupal
Drupal este un sistem de gestionare a conținutului scris în PHP, îmbinat cu JavaScript ,cea mai folosită librărie fiind jQuery, pe partea de front-end, iar ca bază de date se poate utiliza MySQL, MariaDB sau PostgreSQL pentru stocarea conținutului unui site, dar și a configurărilor. Drupal permite utilizarea oricărei baze de date care acceptă PHP, deoarece interfața bazei de date este bazată pe PDO (PHP data object), care oferă un strat de abstractizare pentru accesarea datelor. Acest lucru înseamnă că indiferent de baza de date utilizată, instrucțiunile de preluare, modificare, adăugare a datelor sunt la fel. Drupal este mai mult decât un CMS, este o platformă puternică și flexibilă utilizată pentru a crea aplicații web, bloguri, forumuri, magazine online etc, iar fiecare versiune majoră conține un API (Application Programming Interface) îmbunătățit.
Drupal este construit din module – plugin-uri care adaugă funcționalități la un site. Drupalul de bază (Drupal core) instalat cu setările prestabilite (cu modulele de bază) are toate funcționalitățile importante pe care orice CMS ar trebui să le conțină: autentificare, înregistrare, definirea tipurilor de utilizatori (user roles) și de conținut (content types), definirea permisiunilor pe care le au utilizatorii în funcție de roluri, crearea de pagini de un anumit tip definit, editarea și gestionarea acestora etc.
Drupal a fost proiectat ca să fie personalizat, dar acest lucru se face adăugând module, nu prin modificarea codului de bază. Modulele trebuie activate pentru a adăuga funcționalitatea oferită. Pentru adăugarea unei funcționalități specifice unui site, orice utilizator poate crea un modul nou, iar funcțiile din acest modul sunt apelate de Drupal pe rând.
Utilizatorii, rolurile și permisiunile reprezintă o parte foarte utilă dezvoltată în Drupal. Utilizatorii sunt conturile înregistrate pe un site, iar rolurile ajută la securitatea și administrarea site-ului respectiv.
Drupal permite crearea de roluri pentru orice grup de utilizatori care au anumite privilegii. Implicit, Drupal are 2 roluri de utilizatori:
anonim (utilizatori care nu au cont sau care nu s-au înregistrat)
autentificat (utilizatori înregistrați care își pot edita profilul personal).
Ulterior se pot crea roluri pentru orice tip de utilizatori care urmează să acceseze un site. De exemplu pentru un magazin online se pot crea rolurile client și vânzător, clientul având permisiuni precum vizualizare și cumpărare produse, iar vânzătorii având în plus permisiuni de editare, adăugare și ștergere produse.
Platforma WordPress
WordPress este o platformă de tip sursă deschisă pentru publicarea blogurilor. Platforma WordPress este scrisă în limbajul PHP, folosind pentru gestionarea bazelor de date sistemul MySQL. Dispune un sistem de șabloane scrise în limbajele HTML și CSS. Avantajele majore prezentate de WordPress sunt simplitatea și numeroasele plugin-uri create de către comunitate care pot modifica funcționalitatea WordPress-ului transformându-l în aproape orice tip de site web. De asemenea interfața poate fi schimbată foarte ușor cu ajutorul multitudinii de teme gratuite sau premium cu doar un clic.
WordPress reprezintă cea mai performantă și actuală platformă dedicată publicării personale. Orientarea sa pe estetică, standarde web și ușurință de folosire o fac alegerea numărul 1 printre jurnaliști, scriitori sau bloggeri obișnuiți, iar faptul că e disponibilă gratuit fiind software liber, permite distribuirea și personalizarea sa pe placul tuturor.
WordPress este pachetul software ce merită ales dacă dorești să creezi un blog sau o simplă pagină personală și nu vrei să ai bătăi de cap la configurarea sau personalizarea acestora. De la începuturi și până acum, WordPress a fost etichetat în nenumărate rânduri ca fiind vulnerabil la atacuri ce vizau adăugare de conținut malițios pe blogurile sau site-urile ce foloseau această platformă. Au fost create numeroase programe automate ce căutau pe internet site-uri care foloseau această platformă și, folosindu-se de vulnerabilitățile acesteia, reușeau să introducă în conținut, fără acordul proprietarului, link-uri către site-urile celor ce foloseau aceste programe. În ultimul timp însă, dezvoltatorii platformei au reușit să aducă WordPress într-o stare în care atacurile de acest tip sunt aproape imposibil de realizat. În momentul de față WordPress este printre cele mai sigure și mai puternice CMS-uri la ora actuală.
Platforma de învățare Moodle
Moodle este abrevierea de la limba engleză Modular Object-Oriented Dynamic Learning Environment este un software liber și Open source de învățare, cunoscut de asemenea și ca un Sistem de Management al Cursului, Sistem de Management al Învățării sau ca un Spațiu de Învățare Virtual.
Moodle este o platformă de învățare (e-learning) dezvoltată inițial de Martin Dougiamas pentru a ajuta profesorii să creeze cursuri online care să fie focusate pe interacțiune și construirea colaborativă a conținutului educațional, care este în continuă dezvoltare.
Moodle Pty Ltd (cunoscută de asemenea și ca Sediul Moodle sau Trustul Moodle, cu sediul în Perth, Australia de Vest), o companie Australiană care efectuează majoritatea dezvoltării nucleului platformei Moodle.
Comunitatea Moodle, o rețea liberă cu peste un milion de utilizatori înregistrați care interacționează prin intermediul comunității site-ului Moodle pentru a împărtăși idei, coduri, informații și suport gratuit. Această comunitate include de asemenea un număr mare de dezvoltatori, care datorită licenței de tip open source (sursă deschisă) și designului modular, pot să creeze module suplimentare și funcționalități. Asta a permis ca Moodle să devină un adevărat proiect global de colaborare în domeniul de aplicare.
Moodle are mai multe caracteristici considerate tipice pentru o platformă educațională plus ceva inovații originale (cum ar fi sistemul său de filtrare). Moodle este foarte asemănător cu un sistem de management al învățării. Moodle poate fi utilizat în multe tipuri de medii ca de exemplu: în mediul educațional, pentru formare și dezvoltare, în mediul afacerilor.Dezvoltatorii pot extinde construcția modulară al platformei Moodle prin crearea de noi plugin-uri care au funcții specifice. Infrastructura Moodle suportă multe tipuri de plugin-uri:
activități (inclusiv jocuri de cuvinte și de numere);
tipuri de resurse;
tipuri de întrebări (cu răspunsuri multiple, adevărat sau fals, „completați spațiul liber”)
teme grafice
metode de autentificare (poate solicita nume de utilizator și parolă de acces)
metode de înscriere
filtre de conținut
Moodle rulează fără modificări în Unix, Linux, FreeBSD, Windows, Mac OS X, NetWare și orice alt sistem care suportă PHP și o bază de date. De asemenea are funcționalități de importare din alte sisteme specifice, cum ar fi importarea chestionarelor sau a întregilor cursuri din sistemele Blackboard sau WebCT. Cu toate acestea, aceste funcționalități nu sunt perfecte.
Tehnologii implementate într-un site web
Interfața cu utilizatorul
Limbajul de marcare HTML
Prin convenție, toate informațiile HTML încep cu o paranteză unghiulară deschisă ”<” și se termină cu o paranteză unghiulară închisă ”>”. Acest control sau marcaj HTML, comunică unui interpretor HTML (program de navigare) că documentul este scris și format în limbajul HTML standard. Deși multe controale HTML sunt unități de sine stătătoare, unele dintre ele sunt perechi, având controale de început și sfârșit. Controlul de început se numește control de deschidere, iar cel de sfârșit se numește de închidere.
Cel mai important dintre controalele de bază este <html>, care specifică faptul că informația care urmează este scrisă în limbajul HTML. Marcajul <html> este de tip pereche, deci trebuie să adăugați un marcaj de închidere la sfârșitul documentului, care este la fel ca marcajul de deschidere dar are adăugată o bară înclinată: </html>. Orice element situat între marcajul de deschidere și cel de închidere capătă atributul acelui marcaj. Cele mai importante marcaje nepereche, și cele folosite cel mai des, specifică trecerea la paragraf nou sau la linie nouă. Ele sunt <p> și <br>.
Fișierele HTML sunt de obicei împărțite, din motive de organizare, în două secțiuni: antetul (sau headerul) care conține informația introductivă de formatare a paginii și corpul. Se utilizează marcajele pereche <head></head> și <body></body> pentru a delimita fiecare secțiune. Altă chestie folositoare și simplă este de a da un titlu cu ajutorul controlului pereche <title></title> care trebuie să fie pus în blocul de informații <head></head> (bara de sus a ferestrei). Un control util pentru organizare vizuală a documentului este rigla orizontală care este introdusă de comanda <hr>.
Referințele către alte pagini exterioare se fac cu ajutorul marcajului <a href=adresa paginii respective></a>. Referințele către locul din cadrul aceluiași document se fac cu ajutorul unui <a name=ancoră internă></a>.
Tabelele reprezintă o extensie importantă a limbajului HTML, avându-și originea în laboratoarele de dezvoltare ale corporației Netscape Communication. Pentru a construi un tabel trebuie să specificați parametrii tabelului, apoi parametrii fiecărei linii prin comanda <tr></tr> iar, în final, fiecare celulă trebuie înconjurată de marcajele <td></td> date de tabel. Fundalul (indiferent dacă e o poză sau doar o culoare) se aplică cu ajutorul comenzii <bgcolor=culoarea sau fișierul>. Pentru a introduce o imagine se folosește comanda <img src=sursa fișierului grafic alt=alternativă text pentru afișare, dacă este cazul>.
Standartul CSS
CSS specifică o schemă a priorităților pentru a determina care regulă de stil are prioritate atunci când există mai multe reguli aplicate aceluiași element. Este vorba de așa-numita prioritate în cascadă, prioritatea fiind calculată conform anumitor reguli, astfel încât rezultat să fie predictibil.
Informațiile de stil pot fi prezentate sub diferite forme, astfel putem deosebi:
stiluri inline, definite în interiorul unui element HTML
foi de stil interne, definite în interiorul elementului <HEAD>
foi de stil externe, definite într-un fișier cu extensia .css
Prioritatea cea mai mare o are stilul inline, după care, din punctul de vedere al priorității, urmează stilul definit în interiorul elementului <HEAD> și, în cele din urmă, stilul din foia externă. Prin urmare, o definire a stilului inline va prevala în fața stilului intern care, la rândul său, va prevala în fața stilului extern.
Sintaxa CSS este alcătuită din trei părți: un selector, o proprietate și o valoare, în următorul format:
selector { proprietate: valoare}
Selectorul este reprezentat de elementul (tag-ul) cărui se dorește de aplicat un anumit stil, proprietatea este atributul pe care se dorește de schimbat și fiecare proprietate poate lua o anumită valoare. Proprietatea și valoarea sunt separate de două puncte ”:” și sunt încadrate de acolade {}. De exemplu:
body {color: blue}
Pentru a modifica mai multe proprietăți aceluiași element, trebuie de separat fiecare proprietate cu punct și virgulă ”;”. Exemplul de mai jos arată se definește un paragraf aliniat pe centrul paginii iar textului i se aplică culoarea roșie:
p {text-align: center; color: red}
Pentru a evidenția mai bine proprietățile definite de stil, se poate scrie fiecare proprietate pe câte un rând, ca în exemplul următor:
p {
text-align: center;
color: red
}
De asemenea, ca și în HTML, pentru a putea introduce și explicații ce pot fi utile ulterior, în CSS pot fi inserate comentarii ce vor fi ignorate de către browser. Comentariile încep cu ”/*” și se încheie cu ”*/”, ca în exemplul următor:
/* Acesta este un comentariu */
Când un browser citește o foaie de stil, va aplica documentului formatările specificate în foia respectivă. În funcție de forma în care sunt prezentate informațiile de stil, inserarea acestora într-un document web se poate efectua în trei moduri:
1) foaie de stil externă, ideală când stilul se va aplica mai multor pagini, trebuie folosit tag-ul <LINK> în fiecare pagină ce urmează să folosească stilul respectiv. Atributele obligatorii pentru tag-ul <LINK> sunt REL cu valoarea “stylesheet”, TYPE cu valoarea “text/css” și HREF care are ca valoare adresa URL a fișierului care conține foaia de stil.
Acest tag se amplasează în secțiunea HEAD a paginii web cu următoarea sintaxă:
<HEAD>
<LINK REL="stylesheet" TYPE="text/css" HREF="http://www.exemplu.com/nume_fișier.css">
</HEAD>
În aceste condiții, browser-ul va citi foia de stil din fișierul nume_fișier.css și va formata documentul în mod corespunzător.
O foaie de stil poate fi scrisă în orice editor de text. Fișierul nu trebuie sa conțină vreun tag HTML și trebuie salvat cu extensia .css.
2) o foaie de stil internă, folosită atunci când există un singur document cu un stil propriu. Foaia de stil internă se definește în secțiunea HEAD folosind tagul <STYLE> astfel:
<HEAD>
<STYLE TYPE="text/css">
h1 {color: blue}
p {margin-left: 20px}
body {background-image: url("fundal.gif")}
</STYLE>
</HEAD>
Browser-ul va citi acum stilurile, așa cum au fost definite, și va formata documentul în conformitate cu acestea.
Un browser ignoră tag-urile necunoscute. Acest lucru înseamnă că browser-ele mai vechi, care nu suportă stiluri, vor ignora tag-ul <STYLE>, dar vor afișa conținutul acestuia, cuprins între tag-ul de început și cel de încheiere, sub formă de text. Pentru a preîntâmpina acest neajuns, este recomandabil să includeți conținutul în interiorul unui comentariu, ca în exemplul de mai jos:
<HEAD>
<STYLE TYPE="text/css">
<!–
h1 {color: blue}
p {margin-left: 20px}
body {background-image: url("fundal.gif")}
–>
</STYLE>
</HEAD>
c) stil inline, se folosește atributul style în interiorul tag-ului respectiv. Este o metodă folosită mai ales atunci când un stil urmează să fie aplicat unei singure apariții a unui element. Atributul style poate conține orice caracteristică CSS. Exemplul următor arată cum se poate schimba culoarea și stilul fontului folosit într-un paragraf, fără a mai apela la tag-urile <FONT> cu atributul color și <B>:
<p style="color:red; font-weight:bold">
Acesta este un paragraf în care textul va fi de culoare roșie și scris cu caractere îngroșate</p>
Framework Twitter Bootstrap
Twitter Bootstrap este un framework pentru design HTML/CSS și Javascript prin încapsularea unor funcționalități din jQuery. De asemenea, este un framework care are ca principală sarcină oferirea elementelor necesare pentru realizarea unui produs finisat într-un timp scurt. Ca proiect open-source, inițiat de echipa de dezvoltare de la Twitter, a prins foarte repede în comunitatea online, având un trend exponențial pe mai multe direcții. Astfel, nu doar că a ajuns la versiunea 3.3.x și că este printre cele mai populare proiecte open-source pe GitHub, dar în același timp librăria a declanșat dezvoltarea unor terțe librării și extensii care au ca scop completarea și rafinarea unui pachet întreg de resurse necesare în jurul acestui framework. Printre aceste resurse pot fi menționate:
Template-uri de Twitter Bootstrap (licențe libere sau comerciale)
Fonturi noi
Elemente și componente UI
Alte elemente estetice utile (săgeți, librării pentru grafice, generatoare template-uri, etc)
Twitter Bootstrap mai oferă încă o facilitate, care nu este deloc ușor de trecut cu vederea: plaja de compatibilitate cu marile web browser-e este foarte bună, incluzând și Internet Explorer 7. Iar la nivelul dispozitivelor mobile, acestea sunt suportate prin implementarea unui CSS responsive.
În privința suportului pentru device-uri mobile, Twitter Bootstrap nu poate înlocui un framework destinat exclusiv acestora, cum ar fi jQuery Mobile, care e construit și definit ca un framework web optimizat pentru smartphones și tablete, pe când Twitter Bootstrap oferă doar suport pentru acestea prin crearea de layout-uri responsive în funcție de device-ul care îl accesează.
La baza dezvoltării continue a framework-ului Twitter Bootstrap este pre-procesorul LESS, ales datorită vitezei de compilare a codului și a eleganței și utilizării JavaScript-ului. Ca rezultat, oferă unui dezvoltator posibilitatea ajustării design-ului prin definirea/setarea unui set de variabile/parametri și recompilarea surselor LESS rezultând un nou set de fișiere de stil (CSS).
LESS, nu este singur pre-procesor de CSS disponibil, existând în momentul de față mai multe pre-procesoare printre care s-au remarcat printre dezvoltatorii de front-end: LESS, SASS și SCSS. Folosirea acestora aduce o valoare adăugată oricărui framework de front-end. Însă modul lor de funcționare este asemănător, fiecare încercând să ofere dezvoltatorului ușurință în a scrie un cod de calitate, și dezvolta un produs finit.
Browser-ul web fiind capabil să interpreteze doar fișiere de stiluri CSS, codul scris pentru aceste pre-procesoare este compilat generând un set de stiluri CSS interpretabile de browser-e. Aceste pre-procesoare au apărut ca o necesitate în urma limitărilor pe care le implică folosirea stilurilor CSS (lipsa variabilelor, și a facilității de refolosire a stilurilor în mai multe selecții CSS). Deși la prima vedere, folosirea acestor pre-procesoare ar putea fi considerată ca o muncă adițională în realizarea unei aplicații sau pagini web, una dintre avantajele majore este câștigarea de timp în dezvoltare, alături de un cod mai curat (DRY = Don"t Repeat Yourself), un fișier de CSS mai curat și ușor de întreținut.
Platforma jQuery
jQuery este o platformă de dezvoltare JavaScript care oferă webmasterilor oportunitatea de a ușura anumite procese ce pot implica managementul inter-browser al evenimentelor, traversarea arborelui DOM în HTML, animații de tip AJAX, și altele. Datorită faptului că folosește o sintaxă simplă, această platformă permite selectarea elementelor DOM din pagina pe care se plănuiește modificarea într-o manieră ușoară, astfel încât rezultatul să ducă la coduri foarte eficiente. Înlocuirea unor mulțimi de coduri JavaScript cu un singur cod jQuery este, de altfel, foarte eficient, îndeosebi datorită faptului că această platformă utilizează versiunea 3 a CSS (Cascading Style Sheet) pentru selectarea elementelor DOM. Cu alte cuvinte, nu sunt necesare alte cunoștințe pentru utilizarea acestei platforme, ceea ce o face mult mai accesibilă celor ce doresc mai multe funcții adăugate website-ului lor.
$(document).ready(function(){
$(‘body’).html(‘Hello world!’);
});
Așa-numita “biblioteca” jQ este păstrată cât mai vast la momentul acesta, astfel încât elementele care nu sunt esențiale sa fie ținute la distanță. De altfel, această platforma de dezvoltare are o arhitectură de tip plugin (din englezescul, “plugin framework”) ce poate permite extinderea într-o manieră foarte simplă și lipsită de probleme. Datorită faptului că există atât plugin-uri oficiale, cât și plugin-uri create de alte companii sau dezvoltatori (developers), paginile ce integrează coduri bazate pe această platformă sunt capabile să descarce doar setul specific de funcții care este absolut necesar rulării corecte a codurilor.
Un avantaj cheie al acestei platforme este vizibilitatea sa în cadrul motoarelor de căutare. În comparație cu Adobe Flash, această platformă implică utilizarea unor coduri sub formă de text, ceea ce o face foarte ușor de indexat, evidențiind cuvintele cheie (keywords-urile) care sunt esențiale pentru un page rank mai bun. Ca urmare, nu doar ca JQ ajută sa obții rezultate mult mai bune, dar permite creșterea rank-ului website-ului de asemenea.
Întrucât JQ este extrem de folosit în toata lumea, există o multitudine de plugin-uri și alte resurse disponibile celor ce doresc să implementeze soluții eficiente pentru rularea codurilor și transformarea lor în rezultate precise. Există multe website-uri și cărți care oferă informații privind această platformă de dezvoltare JavaScript, astfel se poate alege documentarea în această privință, pentru a face întregul proces mai simplu și direct, de asemenea. În plus, răspândirea jQuery în toata lumea a dus la dezvoltarea unor noi plugin-uri care pot efectua un număr impresionant de sarcini.
Astfel, folosirea JavaScript nu va mai fi totdeauna de o necesitate absolută, iar webmasterii care nu posedă cunoștințe sau abilități de programare web vor izbuti să ajungă la rezultatele dorite mult mai ușor.
Partea logică
Limbajul de programare Java
Java este un limbaj foarte viabil. Limbajele de programare de până acum aveau nevoie de noi biblioteci complicate pentru a realiza ceea ce Java are încorporat:
facilități Internet
multitasking
securitate
altele
Java a învățat din experiențele nefericite demonstrând de exemplu că se poate programa foarte bine și fără pointeri (deși nici utilitatea acestora nu poate fi contestată). A introdus noi standarde în programare și se menține tot timpul în pas cu ultimele noutăți. Cu Java s-a reușit o integrare coerentă a celor mai diverse domenii (lista de mai sus), o metodă simplă de adăugare a noilor standarde și o mare ușurință a programării, lăsând informaticienii să se concentreze mai mult asupra structurii aplicației. Toate acestea conduc la afirmația fostului vicepreședinte de la Sun, Larry Weber: "Java este un limbaj de generația a V-a".
Deși Java mai are unele puncte slabe (unul ar fi viteza mică de execuție, codul Java fiind interpretat în codul mașinii pe care se rulează, multitudinea de instrucțiuni care se execută pentru menținerea componentelor programului – colectorul de resturi, suportul pentru firele de execuție s.a. – care micșorează și mai mult viteza) rezolvarea lor este numai o chestiune de timp. De exemplu, în privința vitezei de execuție, Sun a propus o soluție care se numește just-in-time compiler, acesta fiind responsabil de compilarea codului Java ajuns pe calculatorul utilizatorului în codul mașinii sale, diferența de viteză dintre compilare și interpretare fiind foarte mare.
Platforma J2EE
J2EE (Java 2 Enterprise Edition) este o platformă Java proiectată pentru a prelucra date pentru organizații mari, care folosesc mainfraime – uri. Sun Microsystems (împreună cu partenerii săi ca IBM) au proiectat J2EE pentru a simplifica dezvoltarea aplicațiilor client/server cu client, fără capacitate mare de procesare (ca de exemplu un browser). J2EE simplifică dezvoltarea aplicațiilor prin crearea de componente care pot beneficia de multe servicii din partea platformei în mod automat.
Platforma J2EE pune la dispoziție un model multi tier distribuit de realizare a aplicațiilor. Aceasta înseamnă că părți diferite ale aplicației pot sa ruleze pe calculatoare diferite. Arhitectura J2EE definește un Client Tier , un Middle Tier (care poate fi compus din mai multe subtiers, de obicei denumite Web Tier și EJB Tier) și un Enterprise Information Tier care furnizează servicii utilizând sistemele de informații deja existente (de obicei bazele de date).
Client tier suportă o mare varietate de tipuri de clienți care se pot afla sau nu după firewall, cum e cazul, în general, al firmelor care se protejează folosind firewalls.
Middle tier furnizează servicii pe de o parte pentru clienți folosind containere Web și pe de altă parte pentru componentele de business folosind containere Enterprise JavaBeans.
Enterprise Information System furnizează accesul la sistemele informaționale deja existente, folosind APIs(Application Programming Interfaces) standardizate.
În Figura 2.3., se prezintă arhitectura generică a unei aplicații Enterprise folosind J2EE, cu ilustrarea împărțirii în tiers (straturi).
Figura 2.1 Arhitectura J2EE
Componenta Java Servlet
Pe măsură ce Web s-a dezvoltat și a început să fi utilizat pentru oferirea de servicii, a apărut necesitatea de a construi pagini cu conținut dinamic. Applet-urile reprezintă un exemplu de tehnologie, ce utilizează platforma clientului pentru a oferi un conținut dinamic.
La nivelul serverelor de web, printre primele tehnologii folosite pentru creare de conținut dinamic a fost Common Gateway Interface (CGI). Ulterior au apărut și s-au dezvoltat tehnologii similare (PHP, ASP) care oferă metode pentru construirea de pagini ce permit interacțiunea cu utilizatorul. Tehnologia propusă de firma SUN pentru construirea de pagini cu conținut dinamic este tehnologia Servlet. Această tehnologie este bazată pe limbajul Java, componentele de tip servlet fiind implementate în acest limbaj. Bazat pe tehnologia Servlet s-au dezvoltat ulterior tehnologii ca Java Server Pages(JSP) și Java Server Faces (JSF) -ambele destinate construirii de pagini cu conținut dinamic.
Un servlet reprezintă o componentă web, gestionată de un container, care generează conținut dinamic. Servlet-urile sunt clase Java, ce oferă independență de platformă și sunt încărcate și executate dinamic de către server. Servlet-urile comunică cu clienții pe baza paradigmei cerere – răspuns. Acest model cerere – răspuns se bazează de obicei pe protocolul Hypertext Transport Protocol (HTTP).
Containerul de servlet-uri este o componentă ce oferă servicii de rețea prin intermediul cărora servlet-urile primesc și transmit cereri și răspunsuri de la și către clienți. Containerul de servleturi înmagazinează servlet-urile și este responsabil pentru gestionarea acestora. Un container poate exista în cadrul unui server web sau poate fi adăugat ulterior utilizând mecanismul de extensie al serverului.
Pentru a construi un servlet care lucrează prin protocolul HTTP trebuie extinsă clasa HttpServlet. În continuare este suprascrisă metoda doGet(…) pentru a prelucra cereri GET. De asemenea poate fi rescrisă și metoda doPost pentru a prelucra cereri POST.
Metodele doGet() și doPost() primesc ca argumente doua obiecte: HttpServletRequest și HttpServletResponse. Obiectul HttpServletRequest este utilizat pentru a determina cererea pe care a făcut-o clientul (datele din FORM , header HTTP etc.). Pentru această clasă pune la dispoziție metode cum ar fi: getHeaders(), getMethod(), getPathInfo(), getParameter(), getInputStream(), getReader().
Obiectul HttpServletResponse este utilizat pentru a transmite răspunsul către client. Acesta conține metodele necesare pentru a stabili headerul, tipul de răspuns și pentru a obține fluxul de ieșire prin intermediul căruia răspunsul este transmis către client. Clasa pune la dispoziție metode cum ar fi: setHeader(), setStatus(), getWriter, getOutputStream() etc.
Pagina 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.
Lista de mai sus reprezintă un exemplu concludent ce cuprinde toate aceste elemente:
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 având sintaxa XML a unui tag. Se folosesc jsp:useBean și jsp:include pentru a instanția JavaBean-ul Data 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 %>
expresiile exprimate în limbajul de scripting pentru a afișa denumirea zilei din săptămână, ziua și respectiv anul.
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 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 ce 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.
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:
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.
Elaborarea magazinului virtual IT
Obiectivele magazinului virtual IT
Pentru elaborarea magazinului virtual se creează obiective după care se va crea site-ul. Aceste cerințe sunt:
serviciu web;
interfață plăcută,
ușor în utilizare
portabilitate
securitate
Serviciu web – utilizatorul va accesa site-ul prin diferite protocoale de rețea standardizate pentru a face schimb de date folosind Web Browser-ul dorit.
Interfață plăcută – pentru ca utilizatorul să poată accesa site-ul, interfața trebuie proiectată în mod plăcut pentru utilizator, fără reclame multe și link-uri de acces nedorite.
Ușor în utilizare – utilizatorul trebuie cu ușurință să acceseze produsele, categoriile dorite, profilul său și coșul de cumpărături, pentru ca el să nu fie preocupat de găsirea lor și astfel să piardă timp.
Portabilitate – aplicația trebuie să fie portabilă în cazul unor defecțiuni hardware a server-ului și să poată rula în continuare.
Securitate – pentru păstrarea informației private a utilizatorului aplicația trebuie securizată prin logare, pentru ca fiecare utilizator să-și acceseze doar profilul său. Ce ție de securitatea aplicației împotriva atacurilor Dos(denial of service) serverul GlassFish oferă această securitate.
Partea Vizuală
Partea vizuală are rol foarte important la interacțiunea cu utilizatorul, deoarece de ea depinde vizitele în viitor ale clienților. Pentru a face o imagine a site-ului plăcută se folosește HTML cu stiluri CSS, JavaScript-ul jQuery, jQuery UI pentru a face efecte plăcute de animație.
De la început se creează logo-ul site-ului care este creat în Adobe Photoshop adăugând proprietăți de culoare și umbră.
Figura 3. 1 Logo site-ului
După crearea logo-ului se trece crearea barei meniu de navigare care se va afla în partea dreaptă a logo-ului și față de contentul site-ului în partea de sus. După crearea lui cu ajutorul HTML și CSS, arată în felul următor:
Figura 3. 2 Meniul principal de navigare
Pentru ca să fie subliniată pagina unde se află utilizatorul sa formatat bara de meniu cu ajutorul jQuery incluzând acest cod în scriptul personal al site-ului:
$(".sub-menu a").each(function () {
if(this.href.trim() == window.location){
$(this).parent().css({"text-decoration" : "underline","font-size" : "17px"});
$(this).parent().parent().slideDown();
}
});
În continuare se creează lista de coloane și subcoloanele sale care arată în figura 3.3:
Figura 3. 3 Tabelul cu categorii și subcategorii
Pentru a reda efectul de cădere a subcoloanelor din coloană de asemenea s-a folosit jQuery implementând următorul cod:
$(".block h5").click(function () {
$('.block ul ul').slideUp();
if(!$(this).next().is(":visible")){
$(this).next().slideDown();
}
});
Se creează un banner la pagina principală care este o fotografie de tip .jpg în mediul de formatare a fotografiilor Adobe Photoshop figura 3.4:
Figura 3. 4 Banner
Se va crea modelul unui produs care va fi extras din baza de date. Formatând html și css se va obține model ca în figura 3.5:
Figura 3. 5 Produs
Butonul ”+ZOOM” va mări imaginea aproximativ pe toată rezoluția utilizatorului. Butonul ”Adaugă” afișează o casetă cu text dinamic în dependență dacă utilizatorul nu este logat(figura.3.6) sau este logat(figura 3.7).
Figura 3. 6 Utilizator nelogat
Figura 3. 7 Utilizator logat
Pentru crearea acestor casete s-a folosit JavaScript jQuery și jQuery UI cu urmatorul cod:
var to_dialog;
var id_prod;
if (user == null || user == "") {
to_dialog = {
title: "Atenție",
show: "shake",
hide: "scale",
buttons:{
'Ok': function() {
$(this).dialog('close');
$("#username").focus();
}
}
}
var text = "Pentru a cumpăra acest produs este necesar să vă logați";
}else{
to_dialog = {
title: "În coș",
show: "bounce",
hide: "fade",
buttons:{
'Ok': function() {
if($("#get_count").val()==''){
$( "#validate" ).text( "Nu s-a introdus…" ).show().fadeOut(2000);
$("#get_count").focus();
return false;
}; $.get('add_cart?action=add&id_product='+id_prod+'&count_product=' + $("#get_count").val(),
function(result){
$('#count').html(result).show();
});
$(this).dialog("option", "hide", "clip").dialog("close");
$(this).dialog("option", "hide", "fade");
},
'Înapoi': function() {
$(this).dialog("option", "hide", "shake").dialog("close");
$(this).dialog("option", "hide", "fade");
}
}
}
var text = "Indică cantitatea <br><input type=\"text\" id=\"get_count\"/>"+
"<br><span id=\"validate\" style=\"color:red;\"></span>";
};
$("#dialog_box").dialog(to_dialog,{
autoOpen:false,
resizable: false,
draggable: false,
modal: true,
height: 200,
width: 300,
open: function() {
$("#get_count").val('');
$("#dialog_box").keyup(function(e) {
if (e.keyCode == $.ui.keyCode.ENTER){
$(this).parent().find("button:eq(1)").trigger("click");
}
});
}
});
Se creează o formă de logare prin care utilizatorul se va loga în profilul său deja înregistrat.
Figura 3. 8 Formă de logare
Pentru ca utilizatorul să se poată loga este necesar ca el să se înregistreze, pentru aceasta se creează forma de înregistrare cu ajutorul HTML și BootStrap care are clase CSS deja gata, forma va arăta în felul următor:
Figura 3. 9 Forma de înregistrare
Pentru a arăta numărul de produse în coș în timp ce utilizatorul logat navighează pe paginile site-ului după bara de meniu este plasată blocul unde se va arăta numarul de produse în coș care este reprezentat în figura 3.10:
Figura 3. 10 Coș de cumpăraturi
După coșul de cumpărături, tot în aceeași linie se plaseaza mesaj de salut pentru utilizator cu numele și prenumele lui avînd posibilitatea de a ieși din sistem(figura 3.11):
Figura 3. 11 Numele prenumele utilizatorului logat
Partea dreaptă a paginii va fi un bloc informațional care va conține ultimele știri în domeniul It și oferte oferite de site(figura 3.12):
Figura 3. 12 Bloc informațional
În partea de jos a site-ului va fi tot același meniu care este prezent sus pentru ca utilizatorul să nu revină la începutul paginii și numele persoanei care a elaborat site-ul(figura 3.13):
Figura 3. 13 Partea de jos a site-ului
După ce s-au făcut părțile de navigare și informare ale site-ului, se trece la elaborarea blocului cu detalii ale produsului ales pentru informarea utilizatorului. În figura 3.14 este arătat cum va fi afișat produsul în detailat:
Figura 3. Detaliile produsului
Pentru afișarea produselor selectate de utilizator după categorie se va face o pagină unde vor fi afișate câte 14 produse pe pagină pentru a economisi locul în pagină și traficul de internet al utilizatorului. Afișarea produselor va fi simplă similar ca în figura 3.14, doar fără detalii, iar după afișarea acelor produse se va afișa câte pagini cu categoria selectată de produse mai sunt rămase, care tastând se poate naviga(figura 3.15):
Figura 3. Navigarea paginilor
În continuare va fi creată pagina de profil al utilizatorului, unde doar utilizatorul logat va putea avea acces la ea. Vizitatorul va putea vizualiza mesajul ”Dumneavoastră nu sunteți logat.”. În figura 3.16 este arătat blocul:
Figura 3. Profilul utilizatorului
Mai jos de informația utilizatorului sunt oferite 2 butoane: editare și schimbă parola. După denumirea lor se înțelege ce funcții au. Butonul de editare a profilului va redacta profilul utilizatorului schimbându-l la pagina de editare unde forma de editare este reprezentată în figura 3.17:
Figura 3. 17 Forma de editare a profilului
Al 2-lea buton este de editare a parolei utilizatorului, la tastarea lui va schimba utilizatorul la pagina de schimbare a parolei unde este forma de schimbare a parolei afișată în figura 3.18:
Figura 3. 18 Forma de schimbare a parolei
Dacă parola nouă nu coincide cu confirmarea parolei și/sau este prea scurtă butonul de schimbare va rămânea inactiv, pentru aceasta s-a folosit JavaScript-ul jQuery cu următoarea secvență de cod:
$('#btn_pass').prop('disabled',true);
$('#parola').keyup(function () {
var length_conf = $(this).val().length;
if(length_conf<=6){
$('#pass_feedback').html('<div style="color: red;">Parola prea scurtă…</div>');
$('#btn_pass').prop('disabled',true);
}else{
$('#pass_feedback').html('');
}
});
$('#parola').focusout(function () {
if ($(this).val().length < 1) {
$('#pass_feedback').html('');
}
});
$('#conf_password').focusout(function () {
if($('#parola').val() != $('#conf_password').val()){
$('#conf_pass_feedback').html('<div style="color: red;">Parolele nu coincid…</div>');
$('#btn_pass').prop('disabled',true);
}else{
$('#conf_pass_feedback').html('');
$('#btn_pass').prop('disabled',false);
}
if ($(this).val().length < 1) {
$('#conf_pass_feedback').html('');
}
});
Următorul pas este crearea paginii unde vor fi afișate produsele adăugate în coș, totalul, butonul de a cumpăra și opțiunea de livrare la domiciliu în caz dacă va fi bifată, într-un bloc care va fi împărțit în produse active(adăugate ulterior) și inative(procurate) (figura 3.19):
Figura 3. 19 Blocul de produse active
Dacă în coș nu sunt produse adăugate ulterior se va afișa mesajul ”Dvs. nu aveți produse în coș” de altfel se vor afișa produsele. În cazul produselor deja procurate se va folosi tot aceeași metodă.
Produsul adăugat va fi afișat împreună cu cantitatea lui și funcția de a șterge produsul și de a modifica cantitatea lui arătat în figura 3.20:
Figura 3. 20 Produsul adăugat în coș
Pentru a schimba cantitatea produsului adăugat s-a implementat tehnologia jQueryUI Editable arătând componenta care v-a edita care este arătată în următoarea secvență de cod:
var id_product;
$('.to_add').click(function(){
id_product = $(this).closest('.item_added').find('.id_product').val();
});
$('.to_add').editable({
type : 'number',
placement: 'right',
title: 'Indică cantitatea:',
success: function(k,val){
var add_cart = $.get('add_cart?action=add&id_product='+id_product+'&count_product=' + val,
function(){});
$.when(add_cart).done(function(result){
$.get('total’, function(result1){
$('#total_count').html(result1).show();
});
});
}
});
$('.to_add').editable('option', 'validate', function(v) {
if (!v) return 'Introdu cantitatea!';
});
Vizualizarea acestui efect este arătată în figura 3.21:
Figura 3. 21 Editarea cantității produsului
La ștergerea produsului din coș el va fi șters din pagină cu efect de ștergere folosind următoarea secvență de cod:
$('.remove').click(function(){
var id_cart = ($(this).attr('href'));
var add_cart = $.get('add_cart?action=remove&id_cart='+id_cart,function(result){});
$.when(add_cart).done(function(result){
$('#count').html(result).show();
$.get('total',function(result1){
$('#total_count').html(result1).show();
});
});
$($(this).closest('.item_added')).fadeOut(900, function() {
$(this).remove();
});
return false;
});
Ce ține de produsele deja cumpărate ele vor arăta tot așa doar va fi scos butonul de ștergere și va fi dezactivat butonul de editare. Butonul de cumpărare va schimba utilizatorul la pagina produselor deja procurate.
Următorul punct în meniul principal este sub numele ”Contacte”. La crearea acestei pagini s-a apelat la ajutorul Companiei Google, care prestează serviciul Google Maps. Acest serviciu permite vizualizarea hărților. Principalul obiectiv este de a arăta utilizatorului locul și adresa filialei magazinului în mod vizual. Pentru a implementa această tehnologie s-a folosit următoarea secvență de cod:
function initialize() {
var mapOptions = {
zoom: 15,
center: new google.maps.LatLng(45.904817, 28.195664),
};
var map = new google.maps.Map(document.getElementById('map-canvas'),
mapOptions);
var marker = new google.maps.Marker({
position: map.getCenter(),
map: map
});
var contentString = '<div><img>'
+'<b>EShop </b><br>'
+'Piața Independenței, 1 <br>'
+'<i>Click pentru a mări</i>'
+'</div>';
var contentString1 = '<div><img src="/html/images/usch.jpg" width="125px"/><br>'
+'<b>EShop </b><br>'
+'Piața Independenței, 1 <br>'
+'</div>';
var infowindow = new google.maps.InfoWindow({
content: contentString
});
var infowindow1 = new google.maps.InfoWindow({
content: contentString1
});
google.maps.event.addListener(map, "zoom_changed", function() {
if (map.getZoom() < 17) {
infowindow1.close();
infowindow.open(map, marker);
}else if (map.getZoom() > 16) {
infowindow.close();
infowindow1.open(map, marker);
}
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.close();
infowindow1.open(map, marker);
map.setZoom(17);
map.setCenter(marker.getPosition());
});
infowindow.open(map, marker);}
google.maps.event.addDomListener(window, 'load', initialize);
După rularea acestui cod se va putea vizualiza o interfață plăcută a hărții orașului mărită spre locul unde se află magazinul care este reprezentată în figura 3.22:
Figura 3. 22 Harta Google Maps
Următorul punct și ultimul în meniul principal este butonul ” despre”, care va schimba utilizatorul la pagina de informare despre magazin și regulamentul de cumpărare. Blocul este destul de compact pentru a economisi locul în pagină a utilizatorului. Figura 3.23 arată blocul de informații despre companie:
Figura 3. 23 Informații și regulament
Această interfață plăcută a blocului se datorează JavaScript-ului jQueryUI. Implementând această tehnologie, doar s-a indicat blocul de informații și opțiuni de afișare mai avansate care este arătat în următoarea secvență de cod:
$( "#accordion" ).accordion({
collapsible: false,
heightStyle: "fill"
});
$( "#accordion-resizer" ).resizable({
minHeight: 170,
minWidth: 515,
resize: function() {
$( "#accordion" ).accordion( "refresh" );
}
});
Formatarea paginilor e gata și conținutul dinamic este elaborat, rămâne implementarea operațiunilor de transmitere și afișare a datelor din baza de date.
Motorul Aplicației
Motorul aplicației este cea mai importantă parte a site-ului, deoarece el efectuează toate operațiile de intrare/ieșire, primește date, le prelucrează și le transmite. Aproximativ toate funcțiile propuse vor accesa baza de date, pentru a micșora cantitatea codului scris în continuare s-a elaborat o funcție de conectare la baza de date care v-a întoarce conexiunea la baza de date:
Connection conn=null;
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/eshop","root","");
} catch (Exception e) {
}
return conn;
Această funcție indică numele fișierului adăugat de conectare la baza de date, adresa la baza de date și face conexiune.
După ce funcția de acces la baza de date este gata se începe de la afișarea categoriilor și subcategoriilor. Pentru început toate extragerile din baza de date salvate într-o listă cu mai multe rânduri se vor efectua cu ajutorul clasei POJO(Plain Old Java Object), java obiect care se folosește pentru modele business. POJO al categoriei (vezi Anexa 1).
De fapt sunt variabile asemănătoare acelor coloane care sunt în baza de date și funcții care setează variabilele în memoria serverului și extragerea lor. În continuare se elaborează funcțiile de extragere a coloanelor și subcoloanelor care vor returna o listă:
public List<category> category (){
List<category> categ = new ArrayList<category>();
category cat = null;
try {ResultSet rs = null;
PreparedStatement pst = null;
Connection conn = Connect_database.Connect_database();
String sql = "select id_category,name_category from category";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){cat = new category();
cat.setId_category(rs.getInt("id_category"));
cat.setName_category(rs.getString("name_category"));
categ.add(cat); }
pst.close();
conn.close();
} catch (Exception e) {
System.out.println("Eroare la coloane");}
return categ; }
Această funcție va returna lista de categorii care va fi afișată în blocul stâng al site-ului. Pentru a primi lista de subcategorii se efectuează această funcție de returnare a subcategoriilor:
public List<category> subcategory(){
List<category> subcateg = new ArrayList<category>();
category cat = null;
try {
ResultSet rs = null;
PreparedStatement pst = null;
Connection conn = Connect_database.Connect_database();
String sql = "select id_subcategory,name,id_category from subcategory";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()) {
cat = new category();
cat.setId_subcategory(rs.getInt("id_subcategory"));
cat.setName_subcategory(rs.getString("name"));
cat.setSub_id_category(rs.getInt("id_category"));
subcateg.add(cat);
}
pst.close();
conn.close();
} catch (Exception e) {
System.out.println("Eroare la subcoloane");
}
return subcateg;
}
Această funcție se va apela din partea stângă a paginii prin solicitare:
get_category get_cat = new get_category();
List<category> categ = get_cat.category();
List<category> sub_category = get_cat.subcategory();
request.setAttribute("cat", categ);
request.setAttribute("subcat", sub_category);
Pagina principală care va apărea la accesarea site-ului va afișa produse pentru a arăta produse din mai multe categorii care va apela funcția pentru a extragere în mod aleatoriu (vezi Anexa 2).
Pentru a solicita această funcție în pagină se va scrie această secțiune de cod:
ProductDAO_index dao =new ProductDAO_index();
List<product> list = dao.randomProducts();
request.setAttribute("productlist", list);
După afișarea produselor și categoriilor se trece la logarea utilizatorilor efectuând securizarea. Solicitările de logare se vor efectua prin metoda POST, deci pentru e evita o simplă accesare a site-ului la adresa de logare utilizatorul va fi redirectat la pagina principală. Pentru a efectua această operație s-a scris următoarea secțiune de cod:
HttpSession session = request.getSession();
if (request.getParameter("logout") != null) {
session.invalidate();
response.sendRedirect("Login");
return;
}
String action = request.getParameter("action");
if (action == null) {
action = "login";
}
switch(action){
case "login":
default:
this.loginDefault(request, response);
break;
}
Această funcție este apelarea Servlet-ului GET care va redirecta la funcția loginDefault:
String referer = request.getHeader("referer");
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
Ea va prelua adresa precedentă de la care s-a efectuat solicitarea și va redirecta la ea, în caz că nu este adresa precedentă se va trece la pagina principală.
În caz că utilizatorul se loghează, această operație se va efectua prin metoda POST și operațiunea va fi preluată de Servlet-ul POST:
HttpSession session = request.getSession();
String referer = request.getHeader("referer");
if (request.getParameter("logout") != null) {
session.invalidate();
response.sendRedirect(referer);
return; }
String action = request.getParameter("action");
if (action == null) {
action = "login_default";}
switch(action){
case "login":
this.login(request, response);
break;
case "login_default":
default:
this.loginDefault(request, response);
break;}
El va controla dacă s-a adresat către logare sau nu, în caz că da, va afectua funcția login (vezi Anexa 3).
Înainte de a efectua operațiunile ce țin de utilizatorul logat se va efectua afișarea produselor după categorii, afișarea detaliată a produsului și înregistrarea utilizatorului. Acestea vor solicita funcțiile show_contents(vezi Anexa 4) și details. La apelarea lor va controla servlet-ul get la accesarea adresei ”/content”:
String action = request.getParameter("action");
if (action == null) {
action = "default";
}
switch (action) {
case "show":
this.show_contents(request, response);
break;
case "details":
this.details(request, response);
break;
default:
this.default_page(request, response);
break;
}
Funcția show_contents va primi id-ul categoriei și subcategoriei, apoi apelând funcția ProductDAO_subcategory le va transmite împreună cu numerotarea paginii alese.
Funcția details va primi id-ul produsului, apelează funcția Details_DAO (vezi Anexa 5) și redirectează spre pagina web:
int id_prod = Integer.parseInt(request.getParameter("id_product"));
Details_DAO dao = new Details_DAO(id_prod);
product prod = dao.details_product();
request.setAttribute("prod", prod);
request.getRequestDispatcher("/html/content/details/page_details.jsp").forward
(request, response);
Înainte ca utilizatorul să fie logat, el trebuie să fie înregistrat. Funcția de înregistrare va funcționa pe tot același principiu ca și funcția de logare. Dar accesând metoda GET el va folosi funcția de activare a profilului(vezi Anexa 6) pe lângă redirectarea spre pagina de înregistrare:
if (request.getSession().getAttribute("username") != null) {
response.sendRedirect("index");
return; }
String action = request.getParameter("action");
if (action == null) {
action = "register_page";}
switch (action) {
case "activate":
this.activate_profile(request, response);
break;
case "register_page":
default:
this.registration_page(request, response);
break;
}
Metoda POST va folosi funcțiile de înregistrare(vezi Anexa 7), modificare a profilului(vezi Anexa 8) și a parolei(vezi Anexa 9):
String action = request.getParameter("action");
if (action == null) {
action = "register_page";}
switch (action) {
case "update_profile":
this.update_profile(request, response);
break;
case "update_pass":
this.update_pass(request, response);
break;
case "register_page":
default:
this.registration_page(request, response);
break;
case "register":
this.registration(request, response);
break;
}
Funcția de înregistrare va primi datele din forma web și le va introduce în baza de date, apoi după inserare reușită în baza de date se va trimite mesaj la adresa poștei electronice indicată de utilizator(vezi Anexa 10), un link la funcția de activare a profilului care va avea un token care este creat după funcția:
private SecureRandom random = new SecureRandom();
public String get_token() {
String token = new BigInteger(512, random).toString(32);
try {
Connection conn = database.Connect_database.Connect_database();
String sql = "Select code from users where code='" + token + "';";
PreparedStatement pst = conn.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
if (rs.next()) {
pst.close();
new create_token().get_token();
}else {
pst.close();
conn.close();
return token;
}
} catch (Exception e) {
System.out.println(e);
}
return null;
}
El va fi egalat printr-o operație logică cu acel din baza de date. Dacă rezultatul operațiunii a fost cu succes, în baza de date se schimbă valoarea profilului la 1(activat).
Modificarea profilului tot se va efectua prin primirea datelor din forma web, introducerea lor în baza de date și va face logare repetată automat pentru a schimba datele din sesiune.
Funcția de modificare a parolei va primi datele din formă și înainte de a le introduce în baza de date va efectua o operație logică de egalare a parolei vechi din baza de date cu cea din formă.
Fiecare funcție ce va ține de crearea sau modificarea parolei va chema o funcție cărei i se va transmite parola în format text și se va primi înapoi parola criptată în SHA-256:
public String encrypt(String pass) {
String fina="";
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(pass.getBytes());
byte data[]=md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < data.length; i++) {
sb.append(Integer.toString((data[i] & 0xff)+0x100,16).substring(1));
}
fina = sb.toString();
} catch (Exception e) {
// TODO: handle exception
}
return fina;
}
Pentru adăugarea unui produs în coș s-a creat un servlet care va avea funcțiile de adăugare a produsului(vezi Anexa 12), de afișarea numărului de produse adăugate în coș(vezi Anexa 11) și ștergerea lor(vezi Anexa 13):
String action = request.getParameter("action");
switch (action) {
case "add":
this.add(request, response);
break;
case "refresh":
this.refresh(request, response);
break;
case "remove":
this.remove(request, response);
break;
}
În cazul când utilizatorul deja a adăugat produse în coș și vrea să procure, în pagină va avea un checkbox care poate fi bifat dacă utilizatorul vrea ca produsele să fie livrate acasă sau la adresa care a indicat-o în ancheta sa. Pe lângă aceasta s-a adăugat în funcție(vezi Anexa 14) și trimiterea la adresa de email un tabel unde utilizatorul poate vedea produsele procurate, prețul, cantitatea și totalul. Aplicația e gata și poate fi împachetată într-un fișier de format .war și despachetată pe server.
Concluzie
Lucrarea "Elaborarea magazinului virtual IT" se dorește a fi o pledoarie pentru crearea, dezvoltarea si creșterea numărului de site-uri de comerț electronic.
Beneficiile prezentei pe Internet sunt evidente pentru activitatea a diferite societăți comerciale a căror extindere si dezvoltare o favorizează. Nici cumpărătorii nu au sunt mai prejos, ei au posibilitatea de a face cumpărături la orice ora din zi indiferent de locație, pot beneficia de preturi mai mici fără a mai pierde timp prețios în magazinele de tip tradițional. Exista pe lângă aceste beneficii si câteva avantaje sociale: mărfurile pot fi vândute la preturi mai mici favorizând pe cei cu venituri mai mici si contribuind astfel la protecția sociala.
Au fost studiate, analizate si urmărite tipurile de tehnologii care pot fi folosite și implementate pentru a crea un astfel de sistem informatic.
Concluziile sunt ușor de sesizat. Reușita în afaceri necesita, în prezent utilizarea tuturor resurselor si mijloacelor informaționale de care dispune întreprinzătorul precum si extinderea relațiilor de afaceri în afara limitelor convenționale.
Internetul poate fi considerat un mediu, o infrastructura ce oferă agenților economici, spre exemplu, abilitatea de a se face cunoscuți atât clienților cât si posibililor parteneri de afaceri, de a accesa informația ușor si rapid.
În aceste condiții lipsa de pe aceasta piața în continua creștere s-ar putea dovedi un adevărat insucces, se poate transforma într-o nereușită.
După studiul acestei lucrări pot afirma ca ar fi o greșeală ca oportunitățile oferite de Internet sa nu fie valorificate.
BIBLIOGRAFIE
http://www.w3.org/History/1989/proposal.html
http://www.link-academy.com/academy-3-limbaje-de-programare-pe-care-e-bine-s%C4%83-le-%C3%AEnv%C4%83%C5%A3a%C5%A3i_824
http://ro.wikipedia.org/wiki/World_Wide_Web
qa
Anexe
Anexa 1
int id_category;
int id_subcategory;
int sub_id_category;
String name_category;
String name_subcategory;
public int getId_category() {
return id_category;
}
public void setId_category(int id_category) {
this.id_category = id_category;
}
public int getId_subcategory() {
return id_subcategory;
}
public void setId_subcategory(int id_subcategory) {
this.id_subcategory = id_subcategory;
}
public int getSub_id_category() {
return sub_id_category;
}
public void setSub_id_category(int sub_id_category) {
this.sub_id_category = sub_id_category;
}
public String getName_category() {
return name_category;
}
public void setName_category(String name_category) {
this.name_category = name_category;
}
public String getName_subcategory() {
return name_subcategory;
}
public void setName_subcategory(String name_subcategory) {
this.name_subcategory = name_subcategory;
}
Anexa 2
public List<product> randomProducts() {
ResultSet rs = null;
PreparedStatement pst = null;
List<product> list = new ArrayList<product>();
product prod = null;
try{
Connection conn = Connect_database.Connect_database();
String sql = "select * from product order by rand() limit 10";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){
prod = new product();
prod.setId_product(rs.getInt("id_product"));
prod.setFoto(rs.getString("foto"));
prod.setFoto_preview(rs.getString("foto_preview"));
prod.setDescription(rs.getString("description"));
prod.setName(rs.getString("name"));
prod.setPrice(rs.getInt("price"));
list.add(prod);
}
pst.close();
conn.close();
}catch(Exception e) {
}
return list;
}
Anexa 3
String referer = request.getHeader("referer");
HttpSession session = request.getSession();
String user = request.getParameter("username");
String pass = encrypt_password.encrypt(request.getParameter("password"));
ResultSet rs = null;
String lastname = null;
String firstname = null;
String status = null;
String date = null;
String location = null;
String mail = null;
String phone = null;
Date datas = null;
int id_user = 0;
boolean trues = false;
new Connect_database();
try {
Connection conn = Connect_database.Connect_database();
String sql = "Select u.id_user, u.status, p.firstname,
p.lastname,p.dates, p.location,"
+ " p.mail, p.phone from users u, profile p "
+ "where (u.username=? and u.password=?) and u.id_user=p.id_user and
u.activate=1";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, user);
pst.setString(2, pass);
rs=pst.executeQuery();
while (rs.next()) {
trues = true;
status = rs.getString("STATUS");
firstname = rs.getString("FIRSTNAME");
lastname = rs.getString("LASTNAME");
datas = rs.getDate("DATES");
location = rs.getString("LOCATION");
mail = rs.getString("MAIL");
phone = rs.getString("phone");
id_user = rs.getInt("id_user");
}
pst.close();
conn.close();
Calendar cal = Calendar.getInstance();
cal.setTime(datas);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int year = cal.get(Calendar.YEAR);
date = new SimpleDateFormat("dd-MM-yyyy").format(datas);
if (trues) {
session.setAttribute("username", user);
session.setAttribute("firstname", firstname);
session.setAttribute("lastname", lastname);
session.setAttribute("status", status);
session.setAttribute("date", date);
session.setAttribute("month", month);
session.setAttribute("day", day);
session.setAttribute("year", year);
session.setAttribute("location", location);
session.setAttribute("mail", mail);
session.setAttribute("phone", phone);
session.setAttribute("id_user", id_user);
request.changeSessionId();
session.setAttribute("loginSucces", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}else {
session.setAttribute("loginFailed", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}
} catch (Exception e) {
session.setAttribute("loginFailed", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
System.out.println("catch–––––––––" + referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}
Anexa 4
int subcategory = 0;
if (request.getParameter("id_subcategory") != null) {
subcategory = Integer.parseInt(request.getParameter("id_subcategory"));
request.setAttribute("subcategory", subcategory);
}
int page = 1;
int recordsPerPage = 14;
if(request.getParameter("page") != null)
page = Integer.parseInt(request.getParameter("page"));
ProductDAO_subcategory dao = new ProductDAO_subcategory(subcategory);
List<product> list = dao.viewAllProducts((page-1)*recordsPerPage,
recordsPerPage);
int noOfRecords = dao.getNoOfRecords();
int noOfPages = (int) Math.ceil(noOfRecords * 1.0 / recordsPerPage);
request.setAttribute("productList", list);
request.setAttribute("noOfPages", noOfPages);
request.setAttribute("currentPage", page);
request.getRequestDispatcher("/html/content/page_product.jsp").forward(request, response);
Anexa 5
int id_product=0;
public Details_DAO(int id_prod) {
id_product = id_prod;
}
public product details_product() {
ResultSet rs = null;
PreparedStatement pst = null;
product prod= new product();
try{
Connection conn = Connect_database.Connect_database();
String sql = "select * from product where id_product='"+id_product+"'";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){
prod.setFoto(rs.getString("foto"));
prod.setFoto_preview(rs.getString("foto_preview"));
prod.setDescription(rs.getString("description"));
prod.setName(rs.getString("name"));
prod.setPrice(rs.getInt("price"));
}
pst.close();
conn.close();
}catch(Exception e) {
}
return prod;
Anexa 6
String activate_code = request.getParameter("hashCode");
Connection conn = Connect_database.Connect_database();
PreparedStatement pst = null;
ResultSet rs = null;
try {
String sql = "Select id_user,code from users where code='" + activate_code + "';";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
if (rs.next()) {
sql = "Update users set activate=1 where id_user=" + rs.getInt("id_user") + ";";
pst = conn.prepareStatement(sql);
int trues = pst.executeUpdate();
if(trues == 1){
pst.close();
conn.close();
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}else{
pst.close();
conn.close();
response.sendRedirect("index");}
}
} catch (Exception e) {
System.out.println(e);
}
}
Anexa 7
String nume = request.getParameter("nume");
String prenume= request.getParameter("prenume");
String username = request.getParameter("username");
String password = encrypt_password.encrypt(request.getParameter("parola"));
String day = request.getParameter("day");
String month = request.getParameter("month");
String year = request.getParameter("year");
String location = request.getParameter("location");
String email= request.getParameter("email");
String phone= request.getParameter("phone");
String token = new create_token().get_token();
String date = year+"-"+month+"-"+day;
int max_id=0;
int num =0;
ResultSet rs = null;
PreparedStatement pst = null;
try {
Connection conn = Connect_database.Connect_database();
String sql = "select count(id_user) as num from users where username=?";
pst = conn.prepareStatement(sql);
pst.setString(1, username);
rs = pst.executeQuery();
while (rs.next()) {
num = rs.getInt("num");
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
if (num!=1) {
try {
Connection conn = Connect_database.Connect_database();
String sql="Insert into users(username, password,code) values(?,?,?)";
pst = conn.prepareStatement(sql);
pst.setString(1, username);
pst.setString(2, password);
pst.setString(3, token);
pst.execute();
pst.close();
String sql1 = "select max(id_user) as id_user from USERS";
pst = conn.prepareStatement(sql1);
rs=pst.executeQuery();
while (rs.next()) {
max_id = rs.getInt("id_user");
}
pst.close();
String sql2 = "INSERT INTO profile (firstname, lastname, dates, location, mail, phone, id_user) values(?, ?, ?, ?, ?, ?, ?);";
pst = conn.prepareStatement(sql2);
pst.setString(1, nume);
pst.setString(2, prenume);
pst.setString(3, date);
pst.setString(4, location);
pst.setString(5, email);
pst.setString(6, phone);
pst.setInt(7, max_id);
pst.execute();
pst.close();
conn.close();
//send email to activate
String subject = "Bun venit la EShop!!!";
String text = "<div>Bună " + nume + " " + prenume + "!!<br>"
+ "Pentru a activa contul apăsați <a href=\"http://" + request.getServerName() + ":5656/" + "Registration?action=activate&hashCode=" + token + "\">aici</a></div>";
new send_gmail(email, subject, text);
//–––––––
request.setAttribute("register_succes", 1);
request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
} catch (Exception e) {
// TODO: handle exception
}
} else {
request.setAttribute("nume", nume);
request.setAttribute("prenume", prenume);
request.setAttribute("day", day);
request.setAttribute("month", month);
request.setAttribute("year", year);
request.setAttribute("location", location);
request.setAttribute("email", email);
request.setAttribute("phone", phone);
request.setAttribute("register_succes", 2); request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
}
Anexa 8
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
String nume = request.getParameter("nume");
String prenume= request.getParameter("prenume");
String day = request.getParameter("day");
String month = request.getParameter("month");
String year = request.getParameter("year");
String phone = request.getParameter("phone");
int id_user=0;
if (day == null||month==null||year==null) {
day = (String)session.getAttribute("day");
month = (String)session.getAttribute("month");
year = (String)session.getAttribute("year");
}else {
day = request.getParameter("day");
month = request.getParameter("month");
year = request.getParameter("year");
}
String location = request.getParameter("location");
String user = session.getAttribute("username").toString();
String user_id = session.getAttribute("id_user").toString();
id_user = Integer.parseInt(user_id);
ResultSet rs = null;
String lastname = null;
String firstname = null;
String status = null;
String date = null;
String location1 = null;
String mail = null;
Date datas = null;
int id_user_d = 0;
String dates = year+"-"+month+"-"+day;
PreparedStatement pst = null;
boolean trues = false;
try {
Connection conn = Connect_database.Connect_database();
String sql="update profile set firstname=?,lastname=?,dates=?,location=?,phone=? where id_user=?";
pst=conn.prepareStatement(sql);
pst.setString(1, nume);
pst.setString(2, prenume);
pst.setString(3, dates);
pst.setString(4, location);
pst.setString(5, phone);
pst.setInt(6, id_user);
pst.execute();
pst.close();
trues = true;
} catch (Exception e) {
// TODO: handle exception
}
if (trues) {
try {//–––––––-Relogare––––––––––––––
Connection conn = Connect_database.Connect_database();
String sql = "Select users.id_user, users.status, profile.firstname, profile.lastname,"
+ " profile.dates, profile.location, profile.mail, profile.phone from users, "
+ "profile where users.username=? "+ "and users.id_user=profile.id_user and users.activate=1";
pst = conn.prepareStatement(sql);
pst.setString(1, user);
rs=pst.executeQuery();
while (rs.next()) {
trues = true;
status = rs.getString("STATUS");
firstname = rs.getString("FIRSTNAME");
lastname = rs.getString("LASTNAME");
datas = rs.getDate("DATES");
location1 = rs.getString("LOCATION");
mail = rs.getString("MAIL");
phone = rs.getString("phone");
id_user_d = rs.getInt("id_user");
}
pst.close();
conn.close();
}catch(Exception e) {
Calendar cal = Calendar.getInstance();
cal.setTime(datas);
int month1 = cal.get(Calendar.MONTH);
int day1 = cal.get(Calendar.DAY_OF_MONTH);
int year1 = cal.get(Calendar.YEAR);
date = new SimpleDateFormat("dd-MM-yyyy").format(datas);
session.setAttribute("firstname", firstname);
session.setAttribute("lastname", lastname);
session.setAttribute("status", status);
session.setAttribute("date", date);
session.setAttribute("month", month1);
session.setAttribute("day", day1);
session.setAttribute("year", year1);
session.setAttribute("location", location1);
session.setAttribute("mail", mail);
session.setAttribute("phone", phone);
session.setAttribute("id_user", id_user_d);
request.setAttribute("register_succes", 1);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
} else {
request.setAttribute("register_succes", 2);
request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
}
Anexa 9
HttpSession session = request.getSession();
String old_pass = encrypt_password.encrypt(request.getParameter("old_password"));
String new_pass = encrypt_password.encrypt(request.getParameter("parola"));
String user_id = session.getAttribute("id_user").toString();
int id_user = Integer.parseInt(user_id);
String pass_db="";
Connection conn = Connect_database.Connect_database();
try {
String sql="Select * from users where id_user=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, id_user);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
pass_db=rs.getString("password");
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
if (pass_db.equals(old_pass)) {
try {
String sql = "update users set password=? where id_user=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, new_pass);
pst.setInt(2, id_user);
pst.executeUpdate();
pst.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
request.setAttribute("register_succes", 3);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
}else {
request.setAttribute("register_succes", 2);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
}
Anexa 10
public send_gmail(String sender, String subject, String text){
final String username = "[anonimizat]";
final String password = "Shopp1ng";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(username));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(sender));
message.setSubject(subject);
message.setContent(text, "text/html; charset=utf-8");
Transport.send(message);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
Anexa 11
HttpSession session = request.getSession();
if(session.getAttribute("username") == null || session.getAttribute("username") == ""){
}else{
int id_user = (Integer)session.getAttribute("id_user");
Connection conn;
PreparedStatement stmt;
ResultSet rs;
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0;";
int num_prod = 1;
try {
conn = Connect_database.Connect_database();
stmt = conn.prepareStatement(count_product_query);
rs = stmt.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
stmt.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
// TODO: handle exception
}
Anexa 12
HttpSession session = request.getSession();
if (session.getAttribute("id_user") == null) {
response.sendRedirect("index");
}
Connection conn;
PreparedStatement stmt;
ResultSet rs;
int id_user = (Integer)session.getAttribute("id_user");
int count_product = Integer.parseInt(request.getParameter("count_product"));
int product_id = Integer.parseInt(request.getParameter("id_product"));
response.setContentType("text/html");
String select_query = "select count(id_product) as count from cart where id_product="+product_id+" and id_user="+id_user+" and bought=0";
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0";
try {
conn = Connect_database.Connect_database();
stmt = conn.prepareStatement(select_query);
rs = stmt.executeQuery();
int count_prod_db = 0;
while(rs.next()) {
count_prod_db = rs.getInt("count");
}
stmt.close();
if (count_prod_db == 0) {
String insert_query = "insert into cart(id_user,id_product,count) values(?,?,?);";
stmt = conn.prepareStatement(insert_query);
stmt.setInt(1, id_user);
stmt.setInt(2, product_id);
stmt.setInt(3, count_product);
stmt.executeUpdate();
stmt.close();
} else if(count_prod_db >= 1){
String update_query = "update cart set count="+count_product+" where id_product="+product_id + " and bought=0;";
stmt = conn.prepareStatement(update_query);
stmt.execute();
stmt.close();
}
int num_prod = 1;
stmt = conn.prepareStatement(count_product_query);
rs = stmt.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
stmt.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
// TODO: handle exception
}
Anexa 13
HttpSession session = request.getSession();
if (session.getAttribute("id_user") == null) {
response.sendRedirect("index");
}
int id_cart = Integer.parseInt(request.getParameter("id_cart"));
int num_prod = 0;
Connection conn;
PreparedStatement pst;
ResultSet rs;
try {
String sql = "delete from cart where id_cart=" + id_cart;
conn = Connect_database.Connect_database();
pst = conn.prepareStatement(sql);
pst.executeUpdate();
pst.close();
int id_user = (Integer)session.getAttribute("id_user");
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0;";
pst = conn.prepareStatement(count_product_query);
rs = pst.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
pst.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
e.printStackTrace();
}
}
Anexa 14
HttpSession session = request.getSession();
if (session.getAttribute("username") == null || session.getAttribute("username") == "") { request.getRequestDispatcher("/html/cart/cart.jsp").forward(request, response);
}else{
int id_user = (Integer)session.getAttribute("id_user");
///////////////get product from database wth parameter bought=0////////////
int total = 0;
cart_product cart = null;
List<cart_product> cart_list = new ArrayList<cart_product>();
Connection conn = Connect_database.Connect_database();;
PreparedStatement pst;
ResultSet rs;
try {
String sql = "select p.name,p.price,c.count" +" from product p,cart c "
+"where c.id_user="+id_user+" and c.id_product=p.id_product and c.bought=0";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()) {
cart = new cart_product();
cart.setName(rs.getString("name"));
cart.setPrice(rs.getInt("price"));
cart.setCount(rs.getInt("count"));
cart_list.add(cart);
total = total + (rs.getInt("price")*rs.getInt("count"));
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
/////////////////////////////////////////////////////
//send email to activate
String nume = (String)session.getAttribute("firstname");
String prenume = (String)session.getAttribute("lastname");
String adresa = (String)session.getAttribute("location");
String email= (String)session.getAttribute("mail");
String phone= (String)session.getAttribute("phone");
String subject = "Comanda";
StringBuffer text_message = new StringBuffer("");
String text_client;
int check_box = Integer.parseInt(request.getParameter("checkbox_to_home"));
System.out.println(check_box);
if (check_box == 1) {
text_client = "În decurs de 2 zile lucrătoare veți primi produsele.";
System.out.println(text_client);
}else{
text_client = "Pentru a primi produsele vă rugăm să vă deplasați la magazinul nostru.";
System.out.println(text_client);
}
text_message.append("<div>"
+ "<span>" + nume + " " + prenume + "</span><br>"
+ "<span>" + adresa + "</span><br>"
+ "<span>" + email + "</span><br>"
+ "<span>" + phone + "</span><br>"
+ "<table border=\"1\" style=\"border-collapse: collapse;\">"
+"<tr>"
+"<td>Produs</td>"
+"<td>Preț</td>"
+"<td>Cantitate</td>"
+"</tr>");
for (cart_product product : cart_list) {
text_message.append(
"<tr>" +"<td>"+product.getName()+"</td>"
+"<td>"+product.getPrice()+" lei</td>"
+"<td>"+product.getCount()+" buc.</td>"
+"</tr>");
}
text_message.append(
"<tr><td colspan=\"2\">Total</td><td>"+total+" lei</td></tr>"
+ "</table>"
+ "<span>"+text_client+"</span>"
+ "</div>");
String text = text_message.toString();
new send_gmail(email, subject, text);
new send_gmail("[anonimizat]", subject, text);
//–––––––
try {
String sql = "update cart set bought='1' where id_user =" + id_user + " and bought=0;";
pst = conn.prepareStatement(sql);
pst.executeUpdate();
pst.close();
conn.close();
response.sendRedirect("cart?action=show&bought=1");
} catch (Exception e) {
// TODO: handle exception
}
}
}
BIBLIOGRAFIE
http://www.w3.org/History/1989/proposal.html
http://www.link-academy.com/academy-3-limbaje-de-programare-pe-care-e-bine-s%C4%83-le-%C3%AEnv%C4%83%C5%A3a%C5%A3i_824
http://ro.wikipedia.org/wiki/World_Wide_Web
qa
Anexe
Anexa 1
int id_category;
int id_subcategory;
int sub_id_category;
String name_category;
String name_subcategory;
public int getId_category() {
return id_category;
}
public void setId_category(int id_category) {
this.id_category = id_category;
}
public int getId_subcategory() {
return id_subcategory;
}
public void setId_subcategory(int id_subcategory) {
this.id_subcategory = id_subcategory;
}
public int getSub_id_category() {
return sub_id_category;
}
public void setSub_id_category(int sub_id_category) {
this.sub_id_category = sub_id_category;
}
public String getName_category() {
return name_category;
}
public void setName_category(String name_category) {
this.name_category = name_category;
}
public String getName_subcategory() {
return name_subcategory;
}
public void setName_subcategory(String name_subcategory) {
this.name_subcategory = name_subcategory;
}
Anexa 2
public List<product> randomProducts() {
ResultSet rs = null;
PreparedStatement pst = null;
List<product> list = new ArrayList<product>();
product prod = null;
try{
Connection conn = Connect_database.Connect_database();
String sql = "select * from product order by rand() limit 10";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){
prod = new product();
prod.setId_product(rs.getInt("id_product"));
prod.setFoto(rs.getString("foto"));
prod.setFoto_preview(rs.getString("foto_preview"));
prod.setDescription(rs.getString("description"));
prod.setName(rs.getString("name"));
prod.setPrice(rs.getInt("price"));
list.add(prod);
}
pst.close();
conn.close();
}catch(Exception e) {
}
return list;
}
Anexa 3
String referer = request.getHeader("referer");
HttpSession session = request.getSession();
String user = request.getParameter("username");
String pass = encrypt_password.encrypt(request.getParameter("password"));
ResultSet rs = null;
String lastname = null;
String firstname = null;
String status = null;
String date = null;
String location = null;
String mail = null;
String phone = null;
Date datas = null;
int id_user = 0;
boolean trues = false;
new Connect_database();
try {
Connection conn = Connect_database.Connect_database();
String sql = "Select u.id_user, u.status, p.firstname,
p.lastname,p.dates, p.location,"
+ " p.mail, p.phone from users u, profile p "
+ "where (u.username=? and u.password=?) and u.id_user=p.id_user and
u.activate=1";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, user);
pst.setString(2, pass);
rs=pst.executeQuery();
while (rs.next()) {
trues = true;
status = rs.getString("STATUS");
firstname = rs.getString("FIRSTNAME");
lastname = rs.getString("LASTNAME");
datas = rs.getDate("DATES");
location = rs.getString("LOCATION");
mail = rs.getString("MAIL");
phone = rs.getString("phone");
id_user = rs.getInt("id_user");
}
pst.close();
conn.close();
Calendar cal = Calendar.getInstance();
cal.setTime(datas);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
int year = cal.get(Calendar.YEAR);
date = new SimpleDateFormat("dd-MM-yyyy").format(datas);
if (trues) {
session.setAttribute("username", user);
session.setAttribute("firstname", firstname);
session.setAttribute("lastname", lastname);
session.setAttribute("status", status);
session.setAttribute("date", date);
session.setAttribute("month", month);
session.setAttribute("day", day);
session.setAttribute("year", year);
session.setAttribute("location", location);
session.setAttribute("mail", mail);
session.setAttribute("phone", phone);
session.setAttribute("id_user", id_user);
request.changeSessionId();
session.setAttribute("loginSucces", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}else {
session.setAttribute("loginFailed", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}
} catch (Exception e) {
session.setAttribute("loginFailed", true);
request.setAttribute("redirect", true);
request.setAttribute("referer", referer);
System.out.println("catch–––––––––" + referer);
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}
Anexa 4
int subcategory = 0;
if (request.getParameter("id_subcategory") != null) {
subcategory = Integer.parseInt(request.getParameter("id_subcategory"));
request.setAttribute("subcategory", subcategory);
}
int page = 1;
int recordsPerPage = 14;
if(request.getParameter("page") != null)
page = Integer.parseInt(request.getParameter("page"));
ProductDAO_subcategory dao = new ProductDAO_subcategory(subcategory);
List<product> list = dao.viewAllProducts((page-1)*recordsPerPage,
recordsPerPage);
int noOfRecords = dao.getNoOfRecords();
int noOfPages = (int) Math.ceil(noOfRecords * 1.0 / recordsPerPage);
request.setAttribute("productList", list);
request.setAttribute("noOfPages", noOfPages);
request.setAttribute("currentPage", page);
request.getRequestDispatcher("/html/content/page_product.jsp").forward(request, response);
Anexa 5
int id_product=0;
public Details_DAO(int id_prod) {
id_product = id_prod;
}
public product details_product() {
ResultSet rs = null;
PreparedStatement pst = null;
product prod= new product();
try{
Connection conn = Connect_database.Connect_database();
String sql = "select * from product where id_product='"+id_product+"'";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while(rs.next()){
prod.setFoto(rs.getString("foto"));
prod.setFoto_preview(rs.getString("foto_preview"));
prod.setDescription(rs.getString("description"));
prod.setName(rs.getString("name"));
prod.setPrice(rs.getInt("price"));
}
pst.close();
conn.close();
}catch(Exception e) {
}
return prod;
Anexa 6
String activate_code = request.getParameter("hashCode");
Connection conn = Connect_database.Connect_database();
PreparedStatement pst = null;
ResultSet rs = null;
try {
String sql = "Select id_user,code from users where code='" + activate_code + "';";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
if (rs.next()) {
sql = "Update users set activate=1 where id_user=" + rs.getInt("id_user") + ";";
pst = conn.prepareStatement(sql);
int trues = pst.executeUpdate();
if(trues == 1){
pst.close();
conn.close();
request.getRequestDispatcher("/html/index.jsp").forward(request, response);
}else{
pst.close();
conn.close();
response.sendRedirect("index");}
}
} catch (Exception e) {
System.out.println(e);
}
}
Anexa 7
String nume = request.getParameter("nume");
String prenume= request.getParameter("prenume");
String username = request.getParameter("username");
String password = encrypt_password.encrypt(request.getParameter("parola"));
String day = request.getParameter("day");
String month = request.getParameter("month");
String year = request.getParameter("year");
String location = request.getParameter("location");
String email= request.getParameter("email");
String phone= request.getParameter("phone");
String token = new create_token().get_token();
String date = year+"-"+month+"-"+day;
int max_id=0;
int num =0;
ResultSet rs = null;
PreparedStatement pst = null;
try {
Connection conn = Connect_database.Connect_database();
String sql = "select count(id_user) as num from users where username=?";
pst = conn.prepareStatement(sql);
pst.setString(1, username);
rs = pst.executeQuery();
while (rs.next()) {
num = rs.getInt("num");
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
if (num!=1) {
try {
Connection conn = Connect_database.Connect_database();
String sql="Insert into users(username, password,code) values(?,?,?)";
pst = conn.prepareStatement(sql);
pst.setString(1, username);
pst.setString(2, password);
pst.setString(3, token);
pst.execute();
pst.close();
String sql1 = "select max(id_user) as id_user from USERS";
pst = conn.prepareStatement(sql1);
rs=pst.executeQuery();
while (rs.next()) {
max_id = rs.getInt("id_user");
}
pst.close();
String sql2 = "INSERT INTO profile (firstname, lastname, dates, location, mail, phone, id_user) values(?, ?, ?, ?, ?, ?, ?);";
pst = conn.prepareStatement(sql2);
pst.setString(1, nume);
pst.setString(2, prenume);
pst.setString(3, date);
pst.setString(4, location);
pst.setString(5, email);
pst.setString(6, phone);
pst.setInt(7, max_id);
pst.execute();
pst.close();
conn.close();
//send email to activate
String subject = "Bun venit la EShop!!!";
String text = "<div>Bună " + nume + " " + prenume + "!!<br>"
+ "Pentru a activa contul apăsați <a href=\"http://" + request.getServerName() + ":5656/" + "Registration?action=activate&hashCode=" + token + "\">aici</a></div>";
new send_gmail(email, subject, text);
//–––––––
request.setAttribute("register_succes", 1);
request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
} catch (Exception e) {
// TODO: handle exception
}
} else {
request.setAttribute("nume", nume);
request.setAttribute("prenume", prenume);
request.setAttribute("day", day);
request.setAttribute("month", month);
request.setAttribute("year", year);
request.setAttribute("location", location);
request.setAttribute("email", email);
request.setAttribute("phone", phone);
request.setAttribute("register_succes", 2); request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
}
Anexa 8
request.setCharacterEncoding("UTF-8");
HttpSession session = request.getSession();
String nume = request.getParameter("nume");
String prenume= request.getParameter("prenume");
String day = request.getParameter("day");
String month = request.getParameter("month");
String year = request.getParameter("year");
String phone = request.getParameter("phone");
int id_user=0;
if (day == null||month==null||year==null) {
day = (String)session.getAttribute("day");
month = (String)session.getAttribute("month");
year = (String)session.getAttribute("year");
}else {
day = request.getParameter("day");
month = request.getParameter("month");
year = request.getParameter("year");
}
String location = request.getParameter("location");
String user = session.getAttribute("username").toString();
String user_id = session.getAttribute("id_user").toString();
id_user = Integer.parseInt(user_id);
ResultSet rs = null;
String lastname = null;
String firstname = null;
String status = null;
String date = null;
String location1 = null;
String mail = null;
Date datas = null;
int id_user_d = 0;
String dates = year+"-"+month+"-"+day;
PreparedStatement pst = null;
boolean trues = false;
try {
Connection conn = Connect_database.Connect_database();
String sql="update profile set firstname=?,lastname=?,dates=?,location=?,phone=? where id_user=?";
pst=conn.prepareStatement(sql);
pst.setString(1, nume);
pst.setString(2, prenume);
pst.setString(3, dates);
pst.setString(4, location);
pst.setString(5, phone);
pst.setInt(6, id_user);
pst.execute();
pst.close();
trues = true;
} catch (Exception e) {
// TODO: handle exception
}
if (trues) {
try {//–––––––-Relogare––––––––––––––
Connection conn = Connect_database.Connect_database();
String sql = "Select users.id_user, users.status, profile.firstname, profile.lastname,"
+ " profile.dates, profile.location, profile.mail, profile.phone from users, "
+ "profile where users.username=? "+ "and users.id_user=profile.id_user and users.activate=1";
pst = conn.prepareStatement(sql);
pst.setString(1, user);
rs=pst.executeQuery();
while (rs.next()) {
trues = true;
status = rs.getString("STATUS");
firstname = rs.getString("FIRSTNAME");
lastname = rs.getString("LASTNAME");
datas = rs.getDate("DATES");
location1 = rs.getString("LOCATION");
mail = rs.getString("MAIL");
phone = rs.getString("phone");
id_user_d = rs.getInt("id_user");
}
pst.close();
conn.close();
}catch(Exception e) {
Calendar cal = Calendar.getInstance();
cal.setTime(datas);
int month1 = cal.get(Calendar.MONTH);
int day1 = cal.get(Calendar.DAY_OF_MONTH);
int year1 = cal.get(Calendar.YEAR);
date = new SimpleDateFormat("dd-MM-yyyy").format(datas);
session.setAttribute("firstname", firstname);
session.setAttribute("lastname", lastname);
session.setAttribute("status", status);
session.setAttribute("date", date);
session.setAttribute("month", month1);
session.setAttribute("day", day1);
session.setAttribute("year", year1);
session.setAttribute("location", location1);
session.setAttribute("mail", mail);
session.setAttribute("phone", phone);
session.setAttribute("id_user", id_user_d);
request.setAttribute("register_succes", 1);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
} else {
request.setAttribute("register_succes", 2);
request.getRequestDispatcher("html/registration/registration.jsp").forward(request, response);
}
Anexa 9
HttpSession session = request.getSession();
String old_pass = encrypt_password.encrypt(request.getParameter("old_password"));
String new_pass = encrypt_password.encrypt(request.getParameter("parola"));
String user_id = session.getAttribute("id_user").toString();
int id_user = Integer.parseInt(user_id);
String pass_db="";
Connection conn = Connect_database.Connect_database();
try {
String sql="Select * from users where id_user=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setInt(1, id_user);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
pass_db=rs.getString("password");
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
if (pass_db.equals(old_pass)) {
try {
String sql = "update users set password=? where id_user=?";
PreparedStatement pst = conn.prepareStatement(sql);
pst.setString(1, new_pass);
pst.setInt(2, id_user);
pst.executeUpdate();
pst.close();
conn.close();
} catch (Exception e) {
// TODO: handle exception
}
request.setAttribute("register_succes", 3);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
}else {
request.setAttribute("register_succes", 2);
request.getRequestDispatcher("html/my_profile/my_profile.jsp").forward(request, response);
}
Anexa 10
public send_gmail(String sender, String subject, String text){
final String username = "[anonimizat]";
final String password = "Shopp1ng";
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress(username));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(sender));
message.setSubject(subject);
message.setContent(text, "text/html; charset=utf-8");
Transport.send(message);
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
Anexa 11
HttpSession session = request.getSession();
if(session.getAttribute("username") == null || session.getAttribute("username") == ""){
}else{
int id_user = (Integer)session.getAttribute("id_user");
Connection conn;
PreparedStatement stmt;
ResultSet rs;
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0;";
int num_prod = 1;
try {
conn = Connect_database.Connect_database();
stmt = conn.prepareStatement(count_product_query);
rs = stmt.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
stmt.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
// TODO: handle exception
}
Anexa 12
HttpSession session = request.getSession();
if (session.getAttribute("id_user") == null) {
response.sendRedirect("index");
}
Connection conn;
PreparedStatement stmt;
ResultSet rs;
int id_user = (Integer)session.getAttribute("id_user");
int count_product = Integer.parseInt(request.getParameter("count_product"));
int product_id = Integer.parseInt(request.getParameter("id_product"));
response.setContentType("text/html");
String select_query = "select count(id_product) as count from cart where id_product="+product_id+" and id_user="+id_user+" and bought=0";
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0";
try {
conn = Connect_database.Connect_database();
stmt = conn.prepareStatement(select_query);
rs = stmt.executeQuery();
int count_prod_db = 0;
while(rs.next()) {
count_prod_db = rs.getInt("count");
}
stmt.close();
if (count_prod_db == 0) {
String insert_query = "insert into cart(id_user,id_product,count) values(?,?,?);";
stmt = conn.prepareStatement(insert_query);
stmt.setInt(1, id_user);
stmt.setInt(2, product_id);
stmt.setInt(3, count_product);
stmt.executeUpdate();
stmt.close();
} else if(count_prod_db >= 1){
String update_query = "update cart set count="+count_product+" where id_product="+product_id + " and bought=0;";
stmt = conn.prepareStatement(update_query);
stmt.execute();
stmt.close();
}
int num_prod = 1;
stmt = conn.prepareStatement(count_product_query);
rs = stmt.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
stmt.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
// TODO: handle exception
}
Anexa 13
HttpSession session = request.getSession();
if (session.getAttribute("id_user") == null) {
response.sendRedirect("index");
}
int id_cart = Integer.parseInt(request.getParameter("id_cart"));
int num_prod = 0;
Connection conn;
PreparedStatement pst;
ResultSet rs;
try {
String sql = "delete from cart where id_cart=" + id_cart;
conn = Connect_database.Connect_database();
pst = conn.prepareStatement(sql);
pst.executeUpdate();
pst.close();
int id_user = (Integer)session.getAttribute("id_user");
String count_product_query = "select count(id_product) as product_count from cart where id_user="+id_user+" and bought=0;";
pst = conn.prepareStatement(count_product_query);
rs = pst.executeQuery(count_product_query);
while (rs.next()) {
num_prod = rs.getInt("product_count");
}
pst.close();
conn.close();
PrintWriter out = response.getWriter();
out.append(String.valueOf(num_prod));
} catch (Exception e) {
e.printStackTrace();
}
}
Anexa 14
HttpSession session = request.getSession();
if (session.getAttribute("username") == null || session.getAttribute("username") == "") { request.getRequestDispatcher("/html/cart/cart.jsp").forward(request, response);
}else{
int id_user = (Integer)session.getAttribute("id_user");
///////////////get product from database wth parameter bought=0////////////
int total = 0;
cart_product cart = null;
List<cart_product> cart_list = new ArrayList<cart_product>();
Connection conn = Connect_database.Connect_database();;
PreparedStatement pst;
ResultSet rs;
try {
String sql = "select p.name,p.price,c.count" +" from product p,cart c "
+"where c.id_user="+id_user+" and c.id_product=p.id_product and c.bought=0";
pst = conn.prepareStatement(sql);
rs = pst.executeQuery();
while (rs.next()) {
cart = new cart_product();
cart.setName(rs.getString("name"));
cart.setPrice(rs.getInt("price"));
cart.setCount(rs.getInt("count"));
cart_list.add(cart);
total = total + (rs.getInt("price")*rs.getInt("count"));
}
pst.close();
} catch (Exception e) {
// TODO: handle exception
}
/////////////////////////////////////////////////////
//send email to activate
String nume = (String)session.getAttribute("firstname");
String prenume = (String)session.getAttribute("lastname");
String adresa = (String)session.getAttribute("location");
String email= (String)session.getAttribute("mail");
String phone= (String)session.getAttribute("phone");
String subject = "Comanda";
StringBuffer text_message = new StringBuffer("");
String text_client;
int check_box = Integer.parseInt(request.getParameter("checkbox_to_home"));
System.out.println(check_box);
if (check_box == 1) {
text_client = "În decurs de 2 zile lucrătoare veți primi produsele.";
System.out.println(text_client);
}else{
text_client = "Pentru a primi produsele vă rugăm să vă deplasați la magazinul nostru.";
System.out.println(text_client);
}
text_message.append("<div>"
+ "<span>" + nume + " " + prenume + "</span><br>"
+ "<span>" + adresa + "</span><br>"
+ "<span>" + email + "</span><br>"
+ "<span>" + phone + "</span><br>"
+ "<table border=\"1\" style=\"border-collapse: collapse;\">"
+"<tr>"
+"<td>Produs</td>"
+"<td>Preț</td>"
+"<td>Cantitate</td>"
+"</tr>");
for (cart_product product : cart_list) {
text_message.append(
"<tr>" +"<td>"+product.getName()+"</td>"
+"<td>"+product.getPrice()+" lei</td>"
+"<td>"+product.getCount()+" buc.</td>"
+"</tr>");
}
text_message.append(
"<tr><td colspan=\"2\">Total</td><td>"+total+" lei</td></tr>"
+ "</table>"
+ "<span>"+text_client+"</span>"
+ "</div>");
String text = text_message.toString();
new send_gmail(email, subject, text);
new send_gmail("[anonimizat]", subject, text);
//–––––––
try {
String sql = "update cart set bought='1' where id_user =" + id_user + " and bought=0;";
pst = conn.prepareStatement(sql);
pst.executeUpdate();
pst.close();
conn.close();
response.sendRedirect("cart?action=show&bought=1");
} catch (Exception e) {
// TODO: handle exception
}
}
}
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Proiectarea Unui Magazin It Virtual (ID: 150275)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
