Aplicatie Web De Licitatii On-Line
Cuvant Inainte
Aplicatiile distribuite sînt de o buna perioada de timp o prezenta uzuala în peisajul IT chiar si din tara noastra. Ultimii ani au însemnat, de asemenea, si pasi semnificativi si concreti în impunerea Internetului Internetului în întreaga economie si societate. Odata cu acesta, aplicatiile distribuite distribuite – care au ca suport Internetul si tehnologiile tehnologiile dezvoltate pentru acesta si împreuna cu el, au trecut de la stadiul de noutati noutati tehnologice la cel de prezenta reala în comunitatea IT. Comertul electronic a devenit foarte cunoscut in societatea informationala care se dezvolta continuu din 1990. Internetul a facut comertul electronic sa fie disponibil unui larg grup de utilizatori, in principal mici intreprinderi si utilizatori caznici. In cadrul comunitatii de afaceri, indreptarea catre eficienta si productivitate crescuta este de asteptat sa duca catre o mai mare acceptare a comertului electronic catre intreprinderi intreprinderi ca fiind o cale de a face afaceri in viitor. Dezvoltarea tehnologica a infrastructurii si a mecanismelor de acces si costurile in scadere vor ajuta dezvoltarea acestuia. Totusi temerile de securitate si lipsa de instruire pot fi un obstacol in dezvoltarea comertului electronic. Comertul electronic ofera o serie de avantaje majore. Principale avantaje sunt si cele mai cunoscute atuuri din lume: timpul si banii. In ceea ce priveste timpul, se face o foarte mare economie. Utilizatorul poate sa vada o lista de produse si preturi in cateva minute din confortul propriului propriului fotoliu. Nu mai sunt necasare deplasari sau alte actiuni care consuma timp inutil. Aceasta economie de timp rezulta astfel intr-o crestere a rentabilitatii, rentabilitatii, de unde reiese si o economie de bani.
Tehnologia JSP (Java Server Pages)
Tehn Tehnol olog ogia ia JSP JSP perm permit itee crea creare reaa rapi rapida da si usoa usoara ra de cont contin inut ut Web Web ce are are componente atat statice cat si dinamice. La baza aceasta tehnologie proiecteaza toate capacitatile dinamice a tehnologiei Java Servlet dar ofera un unghi mai natural in ceea ce priveste creare de continut continut static. Principalele Principalele trasaturi ale tehnologiei tehnologiei JSP sunt: •
Este un limbaj pentru dezvoltarea de pagini JSP, care sunt documete text ce descriu modul de procesare a unei cereri ce reri si de construire a unui raspuns
•
Posibilitatea de a accesa obiecte ce ruleaza pe server
•
Existenta de mecanisme ce permit definirea de extensii pentru limbajul JSP
Ce este o pagina JSP ?
O pagina JSP este un document text ce contine 2 tipuri de text: static, ce poate fi exprimat in orice tip de format bazat pe text (HTML,SVG,WML, si XML), si continutul JSP propriu-zis altfel spus dinamic.
Ciclul de viata al unei pagini JSP
O pagina JSP deserveste cererile asemenea unui servlet. Din acest motiv ciclul de viata al unei pagini JSP si multe din capacitatile sale (in special cele dinamice) sunt determinate de Tehnologia Tehnologia JavaServlet. Cand o cerere este mapata pe o pagina JSP, de managementul ei se ocupa un servlet special care verifica mai intai daca servletul paginii JSP este mai vechi decat pagina JSP. Daca da, “traduce” pagina JSP intr-o clasa servlet si compileaza clasa. In timpul operatiei de dezvoltare unul dintre principalele avantaje ale paginii JSP este ca procesul de constructie constructie (build process) process) este facut automat.
Traducere si Compilare
In timpul fazei de “traducere” fiecare tip de date dintr-o pagina JSP este tratata in mod diferit. Elementele JSP sunt tratate dupa cum urmeaza: Directivele sunt utilizate pentru a controla cum va fi translatata si executata pagina JSP de catre containerul Web Elemetele de scripting sunt inserate in clasa servlet a pagini JSP Elemente de forma
sunt convertite in apeluri catre metode ale componentelor JavaBeans Atat faza de “traducere” cat si cea de compilare pot genera erori care nu se observa decat in momentul in care pagina este apelata pentru prima oara. Daca apare o eroare in timp ce o pagina JSP este “tradusa”, spre exemplu translatorul intalneste un element JSP eronat, serverul va returna o exceptie de tip ParseException si clasa servlet a paginii va fi goala sau incompleta. Ultima linie incompleta va returna un pointer catre linia ce contine eroarea. Daca apaere o eroare in timp ce pagina este compilata, spre exemplu exista o eroare de sintaxa intr-un scriplet, serverul va returna o eroare de tip JasperException si un mesaj catre numele servletului pentru pagina respectiva si linia la care a aparut eroarea. Odata ce pagina a fost tradusa si compilata servletul paginii JSP urmeaza in linii mari acelasi ciclu de viata ca un servlet, si anume: •
Daca nu exista o instanta a servletului paginii JSP atunci containerul: 1. Incarca clasa servlet a paginii JSP 2. Instantiaza o instanta a clasei servlet 3. Initializeaza instanta servlet apeland metoda jspInit
•
Invoca metoda _jspService pasand o cerere si un obiect de raspuns
•
In momentul in care containerul trebuie sa elimine servletul unei pagini JSP va apela metoda jspDestroy
Executie
Diversi parametri de executie ai unei pagini JSP pot fi controlati prin intermediul directivelor de pagina. In continuare se vor prezenta directivele ce tin de output buffering si managementul erorilor.
Buffering . Cand o pagina JSP este executata iesirea catre obiectul de raspuns
este automat buffrat. Dimensiunea bufferului utilizat se poate fixa utilizand urmatoarea directiva de pagina; <%@ page buffer=”none|xxxxxKb”%> Un buffer mai mare permite ca un continut mai mare de informatie sa fie scris inainte de a se trimite ceva catre client acordand mai mult timp JSP-ului de a realiza anumite operatii specifice. Pe de alta parte un buffer mai mic scade gradul de incarcare a memoriei serverului si permite clientului sa primeasca date mai rapid. Managementul Erorilor. In timpul executiei unei pagini JSP poate aparea o gama variata de erori. Pentru a specifica containerului Web sa redirecteze controlul catre o pagina de eroare se include urmatoarea directiva la inceputul paginii JSP: <%@ page errorPage=" file_name" %> De asemenea trebuie specificat la inceputul paginii de eroarea ca aceasta serveste ca pagina de erori si acest lucru se realizeaza prin intermediul directivei <%@ page isErrorPage="true|false" %> Aceasta directiva face accesibil in pagina obiectul exceptie de tip javax.servlet.jsp.JspException
astfel incat acesta sa poate fi interpretat si chiar sa se
afiseze informatii despre cauza exceptiei in interiorul paginii de eroare.
Crearea de continut static si dinamic
In cadrul JSP crearea continutului static se realizeaza ca si cum intreaga pagina ar fi constituita numai din astfel de continut. Continutul static poate fi exprimat in orice limbaj de acest gen cum ar fi HTML, WML si XML. Formatul implicit este HTML. Pentru a putea folosi un alt format decat HTML trebuie inclusa la inceputul paginii o directiva de pagina cu atributul contentType setat la valaorea formatului respectiv. Spre exemplu daca se doreste utilizarea formatului WML (Wireless Markup Language) este obligatorie includerea unei directive de genul: <%@ page contentType="text/vnd.wap.wml"%>
Crearea de continut dinamic
Acest tip de format este creat prin accesarea limbajului de programare JAVA prin elemetele de scripting. Utilizarea de obiecte in paginile JSP
Obiecte Implicite. Anumite obiecte sunt create implicit de catre containerul
Web impreuna cu informatii ce se refera la o anumita cerere, pagina sau aplicatie. Marea majoritate a acestor elemente sunt definite de catre tehnologia JavaServlet care sta la baza tehnologiei JSP. In tabelul de mai jos sunt prezentate pe scurt obiectele implicite Variabla
Clasa
Descriere
application
javax.servlet. ServletContext
Contextul pentru servletul paginii JSP si pentru orice componenta Web continuta in aceeasi aplicatie
config
javax.servlet. ServletConfig
Informatii de initializare pentru servletul paginii JSP.
exception
java.lang. Throwable
Accesibila numai intr-o pagina de eroare
out
javax.servlet. jsp.JspWriter
Streamul de iesire
page
java.lang. Object
Instanta serveltului paginii JSP ce proceseaza cererea curenta
pageContext
javax.servlet.jsp.PageContext
Contextul paginii JSP
request
Subtip al javax.servlet.
response
subtype of javax.servlet.
ServletRequest
ServletResponse
Cererea ce porneste executia unei pagini JSP Raspunsul ce trebuie returnat clientului
javax.servlet. http.HttpSession
session
Obiectul sesiune pentru client
Obiecte specifice aplicatiei. De cate ori este posibil trebuie ca partile ce tin
de comportametul aplicatiei sa fie incapsulate in obiecte, usurand astfel munca designerilor. Astfel de obiecte pot fi create de catre developeri ce au mai multa experienta si sunt versati in utilizarea limbajului de programare JAVA sau in accesarea de baze de date si alte servicii. Exista 4 metode in care se pot creea si utiliza obiecte in interiorul paginilor JSP: •
Instante si variabile ale clasei servlet corespunzatoare paginii JSP sunt create in declaratii si apoi accesate in scripleti si expresii
•
Variabile locale ale clasei servlet sunt create si utilizate in scripleti si expresii
•
Atribute ale obiectelor sunt create si utilizate in scripleti si expresii
•
Componente JavaBeans pot si create si accesate utilizand elemente JSP.
Nota: Notiunile de “declaratie”, “scriplet” si “expresie” vor fi prezentate in cele ce urmeaza. Obiecte Partajate. Modul in care un container Web trateaza cereri multiple din
partea clientilor poate fi indicat perin intermediul directivei <%@ page isThreadSafe="true|false" %>
Cand isThreadSafe este setat pe TRUE containerul Web poate opta pentru transmiterea de cereri multiple concurente catre pagina JSP, aceasta fiind si setarea implicita. Daca se foloseste setarea TRUE developerul trebuie sa realizele sincronizarea corecta in ceea ce priveste accesul la elemetele partajate ce exista la nivel de pagina. Daca isThreadSafe este setat la valoarea FALSE cererile sunt livrate una cate una in
ordinea sosirii lor, si accesul la obiectele partajate ce exista la nivelul paginii nu trebuie controlat de catre developer.
Elemente de Scripting JSP
Acest tip de elemente sunt utilizate pentru a accesa obiecte, a definii metode si pentru mamagementul fluxului de control. Avand in vedere faptul ca unul dintre scopurile principale ale JSP este acela de a separa datele statice de cele dinamice, se recomanda utlizare destul de restransa a scriptingului JSP . Tehnologia JSP permite unui container sa utilizeze orice limbaj de scription care poate apela obiecte JAVA. Daca se doreste utilizarea altui limbaj de scripting decat cel implicit trebuie inclusa la incepului paginii JSP directiva de pagina <%@ page language="scripting language" %>
Avand in vedere ca elementele de scrption sunt convertite in expresii ale limbajului de programare JAVA, trebuie importate toate clasele si pachete utilizate de catre pagina JSP. Daca limbajul este JAVA un pachet sau o clasa poate fi importat/ importata prin intermediul urmatoarei directive de pagina <%@ page import=" packagename .*, fully_qualified_classname" %>
Declaratii. O declaratie JSP este utilzata pentru declararea de variabile si
metode in limbajul de scripting utilizat de pagina respectiva. Sintaxa unei declaratii este urmatoarea: <%! scripting language declaration %>
Cand limbajul de scripting este limbajul de programare JAVA declaratiile de variabile si metode din pagina JSP devin declaratii in clasa servlet a paginii . Scripleti. Un scriplet este utilizat pentru a incapsula orice fragment de cod
valabil pentru limbajul de scription utilizat in pagina respectiva. Sintaxa unui scriplet este urmataorea: <% scripting language statements %>
Cand limbajul de scripting al paginii JSP este JAVA un scriptiong este transformat intr-o bucata de cod JAVA si este inserat in metodele din servletul paginii JSP. O variabila creata cu un scriplet este accesibila de oriunde din interiorul paginii. Expresii. O expresie JSP este utilizata pentru a insera valoarea unei expresii din
limbajul de scriptiong al paginii respective, convertita la String, in streamul intors clientului. Cand limbajul de scription este JAVA o expresie este transformata intr-un statement ce converteste valoarea expresiei la un obiect String si o insereaza in obiectul out implicit. Sintaxa pentru o expresie este urmatoarea : <%= scripting language expression %>
Includerea de continut intr-o pagina JSP
Exista 2 mecanisme pentru includerea unei alte resurse Web in interiorul unei paginii JSP si anume directiva include si elementul jsp:include. Directiva include este procesata pagina JSP este “tradusa” intr-o clasa servlet. Efectul este acela de includere a continutului unei pagini statice, de exempul un fisier HTML sau a unei alte pagini JSP in pagina ce utilizeaza directiva include. Aceasta directiva este utila in situatiile in care exista o bucata de cod sau informatii ce trebuie
reutilizata in mai multe pagini si care se schimba destul de des. Astfel este necesara modificarea respectivului cod numai o singura data. Sintaxa directivei de include este urmataorea: <%@ include file="filename" %>
Elementul jsp:include este procesat cand pagina JSP este executata. Actiunea include permite includerea fie a unui continut static fie a unui continut dinamic in pagina apelanta. Trebuie insa avut in vedere ca rezultatele includerii de continut dinamic difera destul de mult fata de cele ale includerii de continut static. Daca resursa este statica continutul sau este inserat in fisierul JSP ce contine elementul jsp:include. Daca resursa inclusa este de tip dinamic, cererea este trimisa catre resursa inclusa, pagina inclusa este executata si rezultatul este inclus in raspunsul de la pagina JSP apelanta. Sintaxa pentru elemetul jsp:include este urmataorea:
Transferarea controlului catre o alta componenta Web
Mencanismul pentru transferarea controlului catre o alta componenta web foloseste mecanismul pus la dispozitie de catre API-ul JAVA Servlet. Sintaxa pentru acest mecanism este : < jsp:forward page="/main.jsp" /> Trebuie luat in considerare faptul ca, executia directivei forward se face in momentul returnarii de date catre client, atunci directiva va genera o eroare de tipul IllegalStateException.
Elementul jsp:param . Cand un element include sau forward este invocat,
obiectul de tip cerere original este furnizat paginii tinta. Daca se doreste, se pot furniza si
alte date aditionale paginii tinta prin atasare de parametrii la obiectul de tip cerere prin intermediul elementului jsp:param. Sintaxa pentru acest element este urmatoarea:
Includerea unui Applet
Includerea unui aplet sau a unei componente JavaBean in interiorul unei pagini se poate realiza prin intermediul elementului jsp:plugin. Acest element genereaza codul HTML ce contine constructorii specifici dependenti de browser (
sau ) care vor rezulta in downloadul plugin-ului JAVA (daca este necesar acest lucru) si a componentelor client si apoi executia acestor componente. Sintaxa pentru elementul jsp:plugin este urmatoarea: { { }+ } { arbitrary_text } Acest tag jsp:param este inlocuit fie de un tag fie dupa cum este cazul. Atributele tagului ofera date de configurare in ceea ce priveste configurarea
elementului precum si versiunea de plug-in necesara. Dintre acestea atributele nspluginurl si iepluginurl specifica
URL-ul de unde se poate downlada
plug-in-ul in cauza. Elementele componentele
jsp:param
JavaBeans.
specifica
Elemetul
parametrii
jsp:fallback
pentru
indica
applet
sau
continutul
ce
trebuie folosit de catre clinet in cazul in care plug-in-ul nu poate fi pornit. Daca plug-in-ul porneste dar appletul sau componenta JavaBean nu este
gasita
sau
pornita
utilizatorului
i
se
va
returna
un
mesaj ce
indica o exceptie de tipul ClassNotFoundException.
Structura programelor Pachete de clase
Clasele Java sunt organizate pe pachete. Aceste pachete pot avea nume ierarhice. Numele de pachete au forma urmatoare: [NumePachet.]* NumeComponentaPachet Numele de pachete si de componente ale acestora sunt identificatori Java. De obicei, aceste nume urmeaza structura de directoare în care sunt memorate clasele compilate. Radacina arborelui de directoare în care sunt memorate clasele este indicata de o variabila sistem CLASSPATH. În DOS aceasta se seteaza în felul urmator: set CLASSPATH=.;c:\java\lib În Unix se poate seta cu comanda: CLASSPATH=.:/usr/local/lib/java ; export CLASSPATH daca lucrati cu bash . Din aceasta radacina, fiecare pachet are propriul director. În director exista codul binar pentru componentele pachetului respectiv. Daca pachetul contine subpachete, atunci acestea sunt memorate într-un subdirector în interiorul directorului pachetului. Creatorii Java recomanda folosirea unei reguli unice de numire a pachetelor, astfel încât sa nu apara conflicte. Conventia recomandata de ei este aceea de a folosi numele domeniului Internet apartinând producatorului claselor. Astfel, numele de pachete ar putea arata ca în: COM.Microsoft.OLE COM.Apple.quicktime.v2
si asa mai departe. Importul claselor
Desigur, este nevoie ca o clasa sa poata folosi obiecte apartinând unei alte clase. Pentru aceasta, definitia clasei respective trebuie sa importe codul binar al celeilalte clase pentru a sti care sunt variabilele si metodele clasei respective. Importul se face cu o instructiune speciala: import numeClasa ; unde numele clasei include si pachetul din care aceasta face parte. De exemplu: import java.awt.Graphics; import java.applet.Applet; Se poate importa si un pachet întreg, adica toate clasele apartinând acelui pachet, printr-o instructiune de forma: import numePachet.*; De exemplu: import java.awt.*; Fisiere sursa
Codul sursa Java trebuie introdus cu un editor într-un fisier text pe care îl vom numi în continuare fisier sursa. Un fisier sursa poate sa contina declaratia mai multor clase si interfete, dar doar una dintre acestea poate fi declarata publica. Utilizarea celorlalte clase este limitata la fisierul respectiv. Mai mult, nu putem avea în acelasi timp o interfata publica si o clasa publica declarate în acelasi fisier sursa. Daca dorim sa înregistram codul clasei într-un anumit pachet, putem sa includem la începutul fisierului sursa o declaratie de forma: package numePachet; daca aceasta declaratie lipseste, clasa va fi plasata în pachetul implicit, care nu are nume. Structura generala a unui fisier sursa este urmatoarea: [ DeclaratiePachet ][ InstructiuneImport ]*[ DeclaratieDeTip ]* unde declaratia de tip poate fi o declaratie de clasa sau de interfata. Compilare si executie
Fisierele sursa Java au obligatoriu extensia .java . Numele lor este identic cu numele clasei sau interfetei publice declarate în interior. În urma compilarii rezulta fisiere cu nume identice cu numele claselor dar cu extensia .class indiferent daca este vorba de o clasa sau o interfata. Fisierul .class este generat în directorul local si nu direct la locatia pachetului. Compilarea se face cu o comanda de forma: javac FisierSursa .java Comanda aceasta, ca si celelalte descrise în acest paragraf este specifica mediului de dezvoltare Java pus la dispozitie de Sun, numit JDK (Java Development Kit). În viitor
este probabil sa apara multe alte medii de dezvoltare care vor avea propriile lor compilatoare si interpretoare si, posibil, propriile linii de comanda. La compilare, variabila sistem CLASSPATH trebuie sa fie deja setata pentru ca însusi compilatorul Java actual este scris în Java. Pentru lansarea în executie a unei aplicatii Java, trebuie sa introduceti comanda: java NumeClasa unde numele clasei este numele aplicatiei care contine metoda main . Interpretorul va cauta un fisier cu numele NumeClasa.class si va încerca sa instantieze clasa respectiva. Pentru lansarea unui aplet veti avea nevoie de un document HTML care contine tagul APPLET si ca parametru al acesteia name=NumeClasa.class La lansarea unui aplet, clasele care sunt apelate de clasa principala sunt mai întâi cautate pe sistemul pe care ruleaza navigatorul. Daca nu sunt acolo, ele vor fi transferate în retea. Asta înseamna ca transferul de cod este relativ mic, trebuie transferat doar codul specific aplicatiei. Servleti
Servleturile permit interactiunea in ambele sensuri intre client si server. O parte dintre posibilitatile furnizate de servleturi sunt: - construiesc dinamic si returneaza un document HTML pe baza cererii clientului; - proceseaza datele completate de utilizatori printr-un formular HTML si returneaza un raspuns; - furnizeaza suport pentru autentificarea utilizatorului si alte mecanisme de securitate; - interactioneaza cu resursele serverului, cum ar fi baze de date, fisiere cu informatii utile pentru clienti; - proceseaza intrarile de la mai multi clienti pentru aplicatii, cum ar fi jocuri in retea; - permite serverului sa comunice cu un applet client printr-un protocol specific si pastreaza conexiunea in timpul conversatiei; - ataseaza automat elemente de design pentru pagini Web, cum ar fi antete sau note de subsol, pentru toate paginile returnate de server ; - redirecteaza cereri de la un server la altul in scop de echilibrare a incarcarii (eng. load-balancing); - partitioneaza un serviciu logic intre servere sau intre servleturi pentru a procesa eficient o problema. Poate cea mai importantă componentă a unui servlet, fără de care funcţionalitatea acestuia s-ar pierde, este reprezentată de interacţiunea cu clientul. La primirea unei cereri de la un client, programul primeşte două obiecte: ServletRequest si Servlet Response. Primul obiect este cel care realizează "încapsularea" comunicaţiei dinspre client către server, iar al doilea este responsabil de comunicaţia în sens invers de la server, înapoi
către client. Cele două interfeţe (ServletRequest, ServletResponse) sunt incluse în pachetul javax.servlet.
Structura de baza a unui servlet
Cel mai usor mod de definire a servleturilor este prin extinderea uneia dintre cele doua clase de baza referitoare la servleturi: GenericServlet si HttpServlet. De fapt, nu este obligatorie mostenirea acestor clase, ci este suficienta implementarea interfetei Servlet. Toate servleturile suprascriu cel putin o metoda necesara functionalitatii lor. Metoda care este automat apelata ca raspuns la cererea fiecarui client se numeste service(). Aceasta metoda poate fi suprascrisa pentru a furniza o functionalitate implicita. Cu toate acestea, servleturile care extind HttpServlet pot sa nu suprascrie metoda service(). In acest caz, implementarea implicita a acestei metode va apela automat alta metoda pentru a raspunde cererii clientului. Mai exista inca doua metode implementate de majoritatea servleturilor: init() si destroy(). Metoda init() se afla acolo unde incepe un servletul. Ea este apelata de catre server cand este incarcat servletul (similar cu un constructor). Se apeleaza o singura data. In metoda init(), servletul creeaza si initializa orice resursa, inclusiv datele membre. Prototipul metodei init() este : public void init(ServletConfig config) throws ServletException; Metoda init() ia ca paramentru un obiect din ServletConfig. Acest obiect trebuie salvat astfel incat sa se poate face referire la el mai tarziu. Cel mai utilizat mod de a face acest lucru este de a avea apelata metoda super.ini() trecuta in obiectul ServletConfig. Metoda ini() arunca o exceptie ServletException. Daca, din vreun motiv, servetul nu poate initia resursele necesare, metoda ini() va arunca o exceptie. Metoda destroy() este apelata cand servletul este descarcat, eliberand resursele servletului. Metoda destroy() semnifica sfarsitul vietii unui servlet. Cand un serviciu urmeaza sa fie inchis, este apelata metoda destroy(). Aici orice resursa care a fost creata in metoda init() este curatata. Daca exista o conexiune la baza de date, ea se poate inchide aici. Tot aici poate fi salvata orice informatie persistenta care va fi folosita data viitoare cand un servlet va fi incarcat. Prototipul metodei este foarte simplu : public void destroy(); Un schelet pentru servleturi poate fi (fara a preciza parametrii si exceptiile): public class ScheletServlet extends HttpServlet { public void init() { // codul de initializare }
public void service() { // partea efectiva de lucru a servletului } public void destroy() { // eliberarea resurselor } // sfarsitul clasei ScheletServlet Daca servletul extinde HttpServlet, dezvoltatorul servletului poate sa nu suprascrie metoda service(), ci sa implementeze alta metoda care va fi automat apelata de metoda mostenita service(). Metoda automat apelata de service() depinde de tipul cererii HTTP (de exemplu, doGet () este apelata pentru cererile GET si doPost () este apelata pentru cererile POST). Un servlet HTTP gestionează cererile clienţilor cu ajutorul metodei service. In funcţie de metoda (GET sau POST) cu care a fost formulată cererea clientului, metoda service transmite cererea spre procesare, unor metode precum doGet sau doPost. Metodele din clasa HttpServlet, care procesează cererile clienţilor, au două argumente: a) Un obiect HttpServletRequest care încapsulează datele transmise de la client b) Un obiect HttpServletResponse care încapsulează răspunsul serverului spre clienţi a) Pentru accesarea datelor transmise de la client se apelează metodele getParameter (getParameterValues) care au ca argumente numele unui (unor) parametri şi returnează valoarea (valorile) acestora. pentru cereri de tipul HTTP GET, metoda getQueryString returnează un obiect String care conţine datele transmise de la client sub forma: URL?num_param1=val1+ num_param2=val2+... pentru cereri de tipul HTTP POST, PUT sau DELETE: o dacă se aşteaptă date de tip text, se foloseşte metoda getReader, care returnează un obiect BufferedReader din care se vor citi datele transmise o dacă se aşteaptă date binare, se apelează metoda getInputStream care returnează un obiect de tipul ServletInputStream •
•
•
b) Un obiect HttpServletResponse oferă două moduri de a transmite date utilizatorului: cu ajutorul metodei getWriter, care returnează un obiect Writer, în care se scriu date de tip text cu ajutorul metodei getOutputStream, care returnează un obiect ServletOutputStream, în care se scriu date binare •
•
Înainte de accesarea obiectelor Writer şi ServletOutputStream, servlet-ul are sarcina de a seta header-ul HTTP al mesajului de răspuns. De exemplu, metoda setContentType setează tipul conţinutului. Metodele, cărora metoda service le transmite sarcina de a procesa cererile HTTP, sunt următoarele: doGet pentru cereri GET, GET condiţional, HEAD. doPut pentru cereri POST sau PUT. doDelete pentru cereri DELETE. • • •
Servlet-urile sunt capabile să deservească simultan mai mulţi clienţi. Dacă în metoda de procesare a cererii se accesează o resursă partajată, atunci se vor include mecanisme de sincronizare. O alternativă ar fi să se proceseze o singură cerere la un moment dat. Pentru aceasta, servlet-ul trebuie să implementeze interfaţa SingleThreadModel, care nu presupune scrierea unor metode suplimentare. La terminarea ciclului de viaţă a unui servlet, de exemplu la cererea administratorului serverului, se apelează metoda destroy. Această funcţie este oferită de clasa HttpServlet şi este suprascrisă în servlet-ul curent, pentru a distruge resurse specifice servlet-ului şi pentru a realiza alte operaţii de clean-up. Inainte de terminarea servlet-ului, se impune restricţia ca toate instanţele acestuia, care deservesc cereri ale clienţilor, să se încheie. Serverul asigură această condiţie apelând metoda destroy numai după ce toate metodele service, de procesare ale cererilor, s-au încheiat sau după ce o anumită perioadă de timp a expirat. In cazul unor cereri care necesită un timp mai mare de procesare, se pot folosi următoarele tehnici: serverul menţine un contor care indică câte thread-uri rulează metoda service în mod curent. Metoda destroy este apelată când acest contor ajunge la valoarea 0. metoda destroy anunţă thread-urile, care procesează aceste cereri, că trebuie să-şi încheie activitatea, după care aşteaptă terminarea lor. thread-urile de procesare de lungă durată verifică periodic dacă serverul a primit o cerere de shut-down, iar în caz afirmativ îşi încheie activitatea şi returnează. Când un server încarcă un servlet, serverul apelează metoda init, pentru a realiza diferite operaţii de iniţializare specifice acestuia. Această metodă este oferită de clasa HttpServlet şi suprascrisă în servlet-ul curent. Dacă apare o eroare de iniţializare, de exemplu dacă nu se poate stabili conexiunea de reţea cerută, metoda init generează eroarea UnavailableException. Iniţializarea se termină înainte ca servlet-ul să răspundă la cererile clienţilor şi înainte ca servlet-ul să fie distrus. Dacă pentru servlet au fost specificaţi parametri de iniţializare, numele acestora poate fi obţinut apelând în funcţia init metoda getParameterNames(). Pentru a obţine valoarea unui anumit parametru se apelează metoda getInitParameter, cu argument numele parametrului. Un servlet poate fi reîncărcat numai după ce a fost distrus cu ajutorul funcţiei destroy. •
•
•
HTTPServlet
Servleturile HTTP (cele care extind clasa HttpServlet) sunt utilizate pentru construirea de aplicatii Web care de obicei intorc documente Web (HTML, XHTML, WML, XML etc.) ca raspuns la cererile navigatorului. Clasa HttpServlet extinde clasa GenericServlet, deci mosteneste toate functionalitatile acesteia. In plus, HttpServlet adauga functionalitatea specifica protocolului HTTP si furnizeaza un cadru in care putem construi aplicatii HTTP. HttpServlet este o clasa abstracta prezenta in pachetul javax.servlet.http. Pentru ca este abstracta, ea nu poate fi instantiata. Cand se construieste un servlet HTTP, trebuie extinsa clasa HttpServlet. Un servlet HTTP functional trebuie sa implementeze una din metodele:
service(), doGet(), doHead(), doPost(), doPut(), doDelete() corespunzatoare metodelor protocolului HTTP. Metodele init(), destroy() si getServletlnfo() apartin clasei Generic Servlet, din care se deriveaza clasa HttpServlet. Metoda service() are prototipul: Public void service(HttpServletRequest cerere, HttpServle Response raspuns)throws ServletException, Java.io.lOException; Primul argument al metodei service () este un obiect care implementeaza interfata HttpServletRequest si este reprezentarea cererii clientului. Toate datele relevante din cerere (cum ar fi antetele HTTP) sunt incapsulate intr-un obiect Http Servlet Request. Al doilea parametru este un obiect care implementeaza interfata HttpServletResponse si este reprezentarea raspunsului serverului catre client. Cand se utilizeaza servleturi HTTP, este recomandata utilizarea metodelor de cerere specifice HTTP, cum ar fi doGet()sau doPost(), in locul suprascrierii metodei service(). In general, metoda service() nu se suprascrie. Asta, deoarece clasa HttpServlet defineste metode care se apeleaza pentru a raspunde diferitelor tipuri specifice de cereri HTTP. Daca metoda service() nu este suprascrisa, atunci implementarea implicita este sa se apeleze o metoda doXxx() care corespunde tipului cererii realizate. Daca metoda service() este suprascrisa si sunt implementate anumite metode doXxx(), este sarcina dezvoltatorului de servlet sa evalueze cererea HTTP si sa apeleze metoda doXxx() corespunzatoare. Un container de servleturi nu apeleaza direct metodele doXxx(), ci metoda service(), care poate la randul ei sa apeleze o metoda doXxx(). Daca se incearca apelarea unei metode doXxx(), care insa nu este suprascrisa, atunci se primeste la client un mesaj de eroare: HTTP 400 "Bad Request". Metoda doGet() are prototipul: Protected void doGet(HttpServletRequest cerere, HttpServletResponse raspuns)throws ServletException, Java.io.lOException; Metoda doGet() este apelata de implementarea implicita a metodei service() ca raspuns la o cerere HTTP de tip GET. Ca si alte metode de tip doXxx(), metoda doGet() are ca parametri o reprezentare a cererii clientului si un raspuns al serverului. Citirea obiectului cerere si formarea (trimiterea) obiectului raspuns este functia principala a unui servlet. Metoda GET este folosita in principal pentru a primi informatii, iar cererea este transmisa serverului sub forma unui URL. Procesarea unei cereri prin metoda GET: import javax.servlet.http.*; import javax.servlet.ServletException; import java.io.*; public class GetUnu extends HttpServlet {
/** Returnam un mesaj scurt catre client */ protected void doGet(HttpServletRequest cerere, HttpServletResponse raspuns) throws ServletException, lOException { // setam tipul MIME pentru antetul HTTP raspuns.setContentType("text/html"); // obtinem o referinta la fluxul de iesire PrintWriter iesire = raspuns.getWriter(); // determinam tipul cererii iesire.printIn("0 cerere GET rezolvata prin metoda doGet()"); iesire.close (); // inchidem fluxul de iesire }} Metoda doHead() a fost eliminata din Servlet API 2.2 si reintrodusa in Servlet API 2.3 pentru a rezolva cererile HTTP de tip HEAD. Daca metoda doHead() nu este suprascrisa de servlet, implementarea implicita va apela metoda doGet() pentru a genera campuri antet corespunzatoare. Apoi, se va returna catre client un raspuns ce contine doar antetul HTTP (nu si continutul documentului generat). Prezentarea metodei doPost() are prototipul: protected void doPost(HttpServletRequest cerere, HttpServletResponse raspuns) throwsServletException,Java.io.lOException; Metoda doPost() este apelata de fiecare data cand apare o cerere HTTP de tip POST primita de servlet. Aceasta metoda este de obicei utilizata pentru procesarea informatiilor colectate dintr-un formular Web. Informatia introdusa de utilizator intr-un formular HTML este incapsulata intr-un obiect HttpServletRequest si trimisa metodei doPost(). Daca nu este gasita implementarea metodei doPost(), atunci se trimite catre client un mesaj de eroare: HTTP 400 "Bad Request". Metoda POST este folosita pentru a trimite date catre server ; datele sunt incapsulate intr-un pachet si trimise catre server. In cazul metodei GET, valorile parametrilor sunt atasate la sfarsitul URL-ului dupa semnul intrebarii, iar in cazul metodei POST valorile parametrilor sunt trimise pe o linie separata. Pentru preluarea unor date de pe formular trebuie invocata metoda getParameter, avand numele parametrului ca argument. Numele parametrilor sunt senzitive. Acelasi lucru se face indiferent daca transmiterea se face prin metoda GET sau POST. Deci, pentru a fi un servlet o clasa trebuie sa extinda HttpServlet si sa suprascrie metodele doGet() sau doPost(), sau amandoua, depinzand daca datele sunt trimise folosind metoda GET sau POST. Aceste metode preiau doua argumente : HttpServletRequest si HttpServletResponse. are metode care iti permit sa obtii datele dintr-un formular HTML. Acest argument permite accesul servletului la informaţii cum ar fi numele parametrilor trimişi de client, numele host-ului care face cererea către servlet, etc dar şi la fluxul de intrare (stream) de la client, prin care sunt transmise variabile prin metodele POST şi GET. Interfeţele care extind ServletRequest permit structurarea datelor de intrare în funcţie de protocolul folosit. Un exemplu de interfaţă de acest gen: HttpServletRequest
HttpServletRequest conţine metode care prelucrează date ce vin prin intermediul protocolului HTTP. are metode care iti permit sa specifici linia de raspuns HTTP, headerele raspuns (Content-Type, Set-Cookie, etc.) si, cel mai important, te lasa sa obtii un obiect PrintWriter folosit pentru a trimite inapoi documente clientului (in fomatul MIME specificat). Metodele doGet() si doPost() arunca 2 exceptii, asa ca este necesar sa fie incluse in declaratia clasei. De retinut este ca trebuie sa se importe java.io (pentru PrintWriter), javax.servlet (pentru HttpSevlet) si javax.servlet.http (pentru HttpServleRequest si HttpServletResponse). Metodele doPost() si doGet() sunt chemate de metoda service(), si uneori trebuie suprascrisa direct metoda service(), de exemplu, pentru servleturile care intercepteaza in acelasi timp cereri GET si POST. HttpServletResponse
Sesiuni
Obiectele HTTPSession au fost introduse pentru a permite, prin intermediul servleturilor, să se asigure comunicare „statefull” între clienţi şi serverul Web. Formal, un obiect de tip HTTPSession poate reţine informaţii între două invocări succesive ale servletui din cadrul aceleiaşi lansări a browserului. Informaţiile sunt păstrate la server sub forma unor perechi (nume , obiect). Un obiect HTTPSession poate desfăşura, printre altele, acţiunile: răspunde dacă este un obiect nou sau nu (metoda isNew), se pot depune obiecte cărora li se asociază nume (metoda setAttribute), se opt extrage obiecte din el invocându-se numele asociat (metoda getAttribute) etc. • • • •
Pentru detalii se poate consulta API HTTPSession. Modalităţile prin care se obişnuieşte asigurarea comunicării Web „statefull”: Intreţinerea unui mecanism cookies cu fiecare navigator. Simularea unei sesiuni prin intermediul construcţiilor „ascunse” la client, sub forma: Aceste informaţii ajung la server care le poate interpreta ca şi obiecte de tip session. Adăugarea la URL de către client a unor câmpuri cu rol de informaţii de tip session. Obiecte HTTPSession Este evident că ultima soluţie este cea veritabilă, toate celelalte fiind, într-un fel sau altul dependente de client. • •
•
•
Ciclul de viata al unei sesiuni:
Client
Sesiune
Server Prima cerere la o pagina care foloseste sesiune
Id-ul Sesiunii returnat ca parte de Url sau cookie
getSession(true)apelata
Id-ul Sesiunii e returnat Clientul are seiune
Returneaza id-ul sesiunii in urmatoarea cerere ,ca parte de Url sau cookie
Apel metode din obiectul din sesiune setAttribute() getAttribute() Apel metoda invalidate()
Ciclul de viata al unei sesiuni este foarte simplu.Sesiunea este creata pe server ca raspuns al unei crereri a cientului si i se asigneaza un sessionId iar acest Id este trimis clinetului. Sesiunea insasi, este cumva considerata ca “noua” pana cand clientul returneaza sessionId-ul la server indicand ca sesiunea a fost stabilita. Aceasta asociaza clientul cu un anumit obiect sesiune. O sesiune exista pe server pana cand este ori oprita ori invalidata. Fire de execu t ie si sincronizare
O aplicatie Java ruleaza în interiorul unui proces al sistemului de operare. Acest proces consta din segmente de cod si segmente de date mapate într-un spatiu virtual de adresare. Fiecare proces detine un numar de resurse alocate de catre sistemul de operare, cum ar fi fisiere deschise, regiuni de memorie alocate dinamic, sau fire de executie. Toate aceste resurse detinute de catre un proces sunt eliberate la terminarea procesului de catre sistemul de operare. Un fir de executie este unitatea de executie a unui proces. Fiecare fir de executie are asociate o secventa de instructiuni, un set de regisitri CPU si o stiva. Un proces nu
executa nici un fel de instructiuni. El este de fapt un spatiu de adresare comun pentru unul sau mai multe fire de executie. Executia instructiunilor cade în responsabilitatea firelor de executie. În cazul aplicatiilor Java interpretate, procesul detine în principal codul interpretorului iar codul binar Java este tratat ca o zona de date de catre interpretor. Dar, chiar si în aceasta situatie, o aplicatie Java poate avea mai multe fire de executie, create de catre interpretor si care executa, seturi distincte de instructiuni binare Java. Fiecare dintre aceste fire de executie poate rula în paralel pe un procesor separat daca masina pe care ruleaza aplicatia este o masina cu mai multe procesoare. Pe masinile monoprocesor, senzatia de executie în paralel a firelor de executie este creata prin rotirea acestora pe rând la controlul unitatii centrale, câte o cuanta de timp fiecare. Algoritmul de rotire al firelor de executie este de tip round-robin. Mediul de executie Java executa propriul sau control asupra firelor de executie. Algoritmul pentru planificarea firelor de executie, prioritatile si starile în care se pot afla acestea sunt specifice aplicatiilor Java si implementate identic pe toate platformele pe care a fost portat mediul de executie Java. Totusi, acest mediu stie sa profite de resursele sistemului pe care lucreaza. Daca sistemul gazda lucreaza cu mai multe procesoare, Java va folosi toate aceste procesoare pentru a-si planifica firele de executie. Daca sistemul ofera multitasking preemptiv, multitaskingul Java va fi de asemenea preemptiv, etc.
În cazul masinilor multiprocesor, mediul de executie Java si sistemul de operare sunt responsabile cu repartizarea firelor de executie pe un procesor sau altul. Pentru programator, acest mecanism este complet transparent, neexistând nici o diferenta între scrierea unei aplicatii cu mai multe fire pentru o masina cu un singur procesor sau cu mai multe. Desigur, exista însa diferente în cazul scrierii aplicatiilor pe mai multe fire de executie fata de acelea cu un singur fir de executie, diferente care provin în principal din cauza necesitatii de sincronizare între firele de executie apartinând aceluiasi proces. Sincronizarea firelor de executie înseamna ca acestea se asteapta unul pe celalalt pentru completarea anumitor operatii care nu se pot executa în paralel sau care trebuie executate într-o anumita ordine. Java ofera si în acest caz mecanismele sale proprii de sincronizare, extrem de usor de utilizat si înglobate în chiar sintaxa de baza a limbajului. La lansarea în executie a unei aplicatii Java este creat automat si un prim fir de executie, numit firul principal. Acesta poate ulterior sa creeze alte fire de executie care la rândul lor pot crea alte fire, si asa mai departe. Firele de executie dintr-o aplicatie Java pot fi grupate în grupuri pentru a fi manipulate în comun. În afara de firele normale de executie, Java ofera si fire de executie cu prioritate mica care lucreaza în fundalul aplicatiei atunci când nici un alt fir de executie nu poate fi rulat. Aceste fire de fundal se numesc demoni si executa operatii costisitoare în timp si independente de celelalte fire de executie. De exemplu, în Java colectorul de gunoaie lucreaza pe un fir de executie separat, cu proprietati de demon. În acelasi fel poate fi gândit un fir de executie care executa operatii de încarcare a unor imagini din retea. O aplicatie Java se termina atunci când se termina toate firele de executie din interiorul ei sau când nu mai exista decât fire demon. Terminarea firului principal de executie nu duce la terminarea automata a aplicatiei. Crearea firelor de executie
Exista doua cai de definire de noi fire de executie: derivarea din clasa Thread a noi clase si implementarea într-o clasa a interfetei Runnable . În primul caz, noua clasa mosteneste toate metodele si variabilele clasei Thread care implementeaza în mod standard, în Java, functionalitatea de lucru cu fire de executie. Singurul lucru pe care trebuie sa-l faca noua clasa este sa reimplementeze metoda run care este apelata automat de catre mediul de executie la lansarea unui nou fir. În plus, noua clasa ar putea avea nevoie sa implementeze un constructor care sa permita atribuirea unei denumiri firului de executie. Daca firul are un nume, acesta poate fi obtinut cu metoda getName care returneaza un obiect de tip String .
Iata un exemplu de definire a unui nou tip de fir de executie: class FirNou extends Thread { public FirNou( String nume ) { // apeleaza constructorul din Thread super( nume ); public void run() { while( true ) { // fara sfârsit System.out.println( getName() + " Tastati ^C" ); } } } Daca vom crea un nou obiect de tip FirNou si îl lansam în executie acesta va afisa la infinit mesajul "Tastati ^C". Întreruperea executiei se poate face într-adevar prin tastarea caracterului ^C, caz în care întreaga aplicatie este terminata. Atâta timp însa cât noul obiect nu va fi întrerupt din exterior, aplicatia va continua sa se execute pentru ca mai exista înca fire de executie active si indiferent de faptul ca firul de executie principal s-a terminat sau nu. Iata si un exemplu de aplicatie care foloseste aceasta clasa: public TestFirNou { public static void main( String[] ) { new FirNou( "Primul" ).start(); } } Metoda start , predefinita în obiectul Thread lanseaza executia propriu-zisa a firului. Desigur exista si cai de a opri executia la nesfârsit a firului creat fie prin apelul metodei stop, prezentata mai jos, fie prin rescrierea functiei run în asa fel încât executia sa sa se termine dupa un interval finit de timp. A doua cale de definitie a unui fir de executie este implementarea interfetei Runnable într-o anumita clasa de obiecte. Aceasta cale este cea care trebuie aleasa atunci când clasa pe care o cream nu se poate deriva din clasa Thread pentru ca este important sa fie derivata din alta clasa. Desigur, mostenirea multipla ar rezolva aceasta problema, dar Java nu are mostenire multipla. Aceasta noua cale se poate folosi în modul urmator: class Oclasa { ? } class FirNou extends Oclasa implements Runnable { public void run() { for( int i = 0; i < 100; i++ ) { System.out.println( "pasul " + i ); } } ? } public class TestFirNou { public static void main( String argumente[] ) { new Thread( new FirNou() ).start(); // Obiectele sunt create si folosite imediat 24
// La terminarea instructiunii, ele sunt automat // eliberate nefiind referite de nimic } } Dupa cum observati, clasa Thread are si un constructor care primeste ca argument o instanta a unei clase care implementeaza interfata Runnable . În acest caz, la lansarea în executie a noului fir, cu metoda start , se apeleaza metoda run din acest obiect si nu din instanta a clasei Thread . Atunci când dorim sa cream un aplet care sa ruleze pe un fir de executie separat fata de pagina de navigator în care ruleaza pentru a putea executa operatii în fereastra apletului si în acelasi timp sa putem folosi în continuare navigatorul, suntem obligati sa alegem cea de-a doua cale de implementare. Aceasta pentru ca apletul nostru trebuie sa fie derivat din clasa standard Applet . Singura alternativa care ne ramâne este aceea de a implementa în aplet interfata Runnable .
25
Securitatea in Web Protejara resurselor Web. O resursa web poate fi protejata prin specificarea unei
constrangeri de securitate. O astfel de constrangere determina cine este autorizat sa acceseze o anumita Colectie de Resurse Web , care este de fapt o lista de patternuri URL si metode HTTP ce descriu un set de resurse ce trebuie protejate. Autentificarea Utilizatorilor unei Resurse Web. In momentul in care se incearca
accesarea unei resurse Web protejata containerul va activa macanismul de autentificare ce a fost configurat pentru resursa respectiva. Exista 3 tipuri posibile de autentificare si anume: •
autentificare HTTP standard
•
autentificare pe baza de formular
•
autentificare pe baza certificatului clientului
Autentificarea de Baza(HTTP). Daca este specificat acest tip de autentificare containerul va
autentifica utilizatorul pe baza username-ului si a parolei primnite de la clientul Web Autentificarea pe baza de formular . Prin acest tip de autentificare se pot customiza ecranul de
login si paginile de eroare ce sunt prezentate userului de catre browserul HTTP. Nici una din aceste tipuri de autentificare nu este sigura. In autentificarea pe baza de formular continutul cutiei de dialog este trimis ca text obisnuit iar serverul tinta nu este unul autentificat. Autentificarea obijnuita HTTP trimite username-ul si parola ca text ce este codat dar nu criptat. Acest tip de autentificare ce utilizeaza codarea Base64 poate expune username-ul si parola daca conexiunile nu sunt realizate peste SSL. Daca cineva poate intercepta transmisiunea usernameul si parola pot fi usor decodificate. Autentificare pe baza certificatului clientului. Acest tip de autentificare este mult mai sigur
decat celelalte 2 metode prezentate mai sus. Foloseste HTTP peste SSL (HTTPS) in care serverul si obtional clientul se identifica unul pe celalalt prin intermediul Certificatelor cu Cheie Publica ( Public Key Certificates ). SSL (Secure Sokets Layer) furnizeaza criptarea datelor , autentificare 26
server, integritatea mesajelor si optional autentificarea clientuluui pentru conexiuniu TCP/IP. Un certificat cu cheie publica poate fi privit ca si un pasaport digital, acesta este emis de catre o organizatie de incredere Certificate Authority (CA) si il identifica pe purtator. Daca se specifica acest tip de autentificare serverul Web va autentifica clientul folosind un certificat X.509.
27
Ce este JDBC API? JDBC API este un API Java pentru a accesa virtual orice tip de date sub forma de tabel.(ca un punct de interes JDBC este un nume comercial si nu un acronim ;totusi JDBC este adesea considerat ca venind de la “Java Databrowse Connectivity”) .JDBC API consista intr-un set de clase scrise in limbajul de programare Java ce furnizeaza un standard API pentru utilizatorii bazelor de date si face posibila scrierea de aplicatii pe baze de date , folosind un intreg API Java. JDBC API usureaza trimiterea de mesaje SQL catre sisteme de baze de date relationale si sprijina toate dialectele SQL . Dar JDBC 3.0 API merge inca si mai departe , facand posibila interactiunea cu alte tipuri de surse de date , cum ar fi de exemplu fisierele , care nu tin d baze de date. Valoarea JDBC API este aceea ca o aplicatie poate accesa virtual orice fel de surse de date si sa foloseasca orice platforma cu o masina virtuala Java.Cu alte cuvinte , cu JDBC API , nu mai este necesar sa scrii un program pentru a accesa o baza de date Sybase , un alt program pentru a accesa o baza de date Oracle , un altul pentru a accesa o baza de date IBMDB2 si asa mai departe.Poti scrie un singur progrm folosind JDBC API , si acesta va fi capabil sa trimita SQL sau alte informatii sursei de date potrivite. Si mai mult cu o aplicatie scrisa in limbajul de programare Java , nu mai trebuie sa-ti faci griji ca trebuie sa scrii mai multe aplicatii pentru a putea folosi diferite platforme. Combinatia dintre platforma Java si JDBC API permite unui programator “sa scrie o data si sa poata accesa orice doreste”. Limbajul de programare Java , fiind sigur , usor de folosit , usor de inteles si in mod automat usor de introdus intr-o retea , este o excelenta baza lingvistica pentru aplicatii de baze de date.Ceea ce este necesar este o cale ca aplicatiile Java sa “vorbeasca” unei varietati de surse de date. JDBC este mecanismul necesar pentru aceasta. JDBC API extinde ceea ce poate fi facut cu platforma Java.De exemplu face posibila publicarea unei pagini in web continand o aplicatie care foloseste informatii obtinute de la o sursa de date indepartata. Sau o intreprindere poate folosi JDBC API pentru a-si conecta toti angajatii (chiar daca acestia folosesc o conglomeratie de masini windows , Macintash si UNIX) la una sau mai multe baze de date interne prin intermediul unei retele interne . Cu programatorii care folosesc din ce in ce mai mult limbajul de programare Java nevoia de acces facil si universal la baze de date oferita de JDBC API continua sa creasca.
Ce face JDBC API?
In termenii cei mai simpli din driver bazat pe tehnologia JDBC (JDBC driver) face posibile 3 lucruri , si anume: 1.Stabilirea unei legaturi cu o sursa de date. 2.Trimiterea de informatii actualizate catre sursa de date. 3.Procesarea rezultatelor. Urmatorul fragment de cod este un exemplu simplu al acestor 3 pasi: Context ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("jdbc/AcmeDB"); 28
Connection con = ds.getConnection("myLogin", "myPassword"); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1"); while (rs.next()) { int x = rs.getInt("a"); String s = rs.getString("b"); float f = rs.getFloat("c"); } SQL este limbajul standard pentru a accesa baze de date relationale. Din nefericire , SQL nu este atat de standardizat pe cat s-ar dori. O zona de dificultate o constituie aceea ca tipurile de date folosite de diferite DBMS (Data Base Manageme System) variaza uneori si variatiile pot fi semnificative. JDBC se ocupa de acest lucru prin definirea unui set de identificatori generici de tip SQL in clasa java.sql.Types .Notati ca folositi in acest context termenii “JDBC SQL type ” “JDBC type” si “SQL type” pot fi schimbati intre ei si se ppot referi la identificatorii generici de tip SQL definiti in java.sql.Types . O alta zona de dificultate a conformantei SQL este aceea ca desi majoritatea DBMS-urilor folosesc o forma standard de SQL pentru functionalitatea de baza ele nu se conformeaza celor mai recent definite standarde de sintaxa sau semantica SQL pentru o functionalitate mai avansata. De exemplu , nu toate bzele de date sprijina procedurile de stocare sau legaturile exterioare , precum si pe cele care nu sunt intotdeauna consecvente unele fata de celelalte . De asemenea suportu pentru tipurile SQL 99 si tipurile de date variaza simtitor. .Se spera ca portiunea SQL care este un adevarat standard sa se extinda in favoarea unei functionalitati din ce in ce mai mari .Dar in acelasi timp , JDBC API trebuie sa sprijine SQL asa cum este. Un mod in care JDBC API se ocupa de aceasta problema este ca permite trecerea printr-un driver DBMS inferior. Aceasta inseamna ca o aplicatie este libera sa foloseasca oricata functionalitate SQL doreste , dar o pandeste riscul de a capata o eroare pe anumite sisteme DBMS .De fapt o cerere de aplicatie poate fi altceva decat SQL sau poate fi o derivata specializata a SQL desemnata pentru sisteme DBMS specifice(pentru documente sau imagini ). O a doua modalitate in care JDBC se ocupa de problemele de conformanta SQL este aceea de a furniza propozitii de tip ODBC. Acest tip de sintaxa furnizeaza o sintaxa JDBC standard pentru cateva din cele mai comune arii de divergenta SQL. Pentru aplicatii complexe , JDBC se ocupa de conformanta SQL intr-un al treilea mod. El furnizeaza informatii descriptive despre DBMS prin intermediul formulei DatabaseMetaData astfel incat aplicatiile se pot adapta cerintelor si capacitatilor fiecarui sistem DBMS . Si totusi utilizatorii beneficiari nu trebuie sa-si faca griji in legatura cu metadatele. Pentru ca JDBC API este folosita ca o baza API pentru a dezvolta unelte de acces la bazele de date , ea trebuie in acelasi timp sa se ocupe de problema de conformanta. Un driver JDBC trebuie sa sustina cel putin un Nivel Initial ANSISQL-92(ANSI-SQL-92 se refera la standardele adoptate de Institutul American al Standardelor in 1992. Nivelul initial se refera la o lista specifica de abilitat SQL ) Desi JDBC 3.0 API include suport pentru SQL99 , driver-I JDBC nu trebuie sa faca acelasi lucru. Data fiind acceptarea sistemului JDBC API de catre vanzatorii de baze de date , de conectivitate , de servicii de internet , acesta a devenit standardul pentru accesul la date din limbajul de programare Java.
29
Driver manager Clasa Driver Manager este nivelul de conducere traditional al JDBC , facand legatura intre utilizatori si drivere. El inregistreaza programele disponibile si stabileste o legatura intre o baza de date si driver-ul potrivit. javax.sql furnizeaza interfata DataSource ca un mijloc preferential de conectare la o sursa de date.Totusi facilitatea Driver Manager poate fi inca folosita de driver-ele care sprijina implementarile DataSource . Pentru aplicatii simple singura metoda din clasa Driver Manager pe care un programator trebuie sa o foloseasca in mod direct este Driver Manager. .Dupa cum ii spune si numele aceasta metoda stabileste o legatura cu o baza de date.O aplicatie poate necesita metoda Driver Manager ,get Driver si register Driver ca si metoda Driver connect, dar in cele mai multe cazuri este mai bine sa lasati clasa Driver Manager sa stabileasca o legatura. Cum sa urmariti programele disponibile
Clasa Driver Manager mentine o lista de clase Driver care s-au inregistrat sub numele de Driver Manager.register Driver .In continuare este prezentata o modaliatte de a incarca un Driver :numind metoda Class.forName.Acesta incarca in mod explicit clasa driver.Din moment ce nu depinde de nici o stare externa aceasta cale este recomandata pentru a folosi fereastra Driver Manager.Urmatorul cod incarca clasa acme.db.Driver: Class.forName("acme.db.Driver"); Este responsabilitatea Driver-ului nou incarcat sa se auto-inregistreze ca Driver Manager.regster Driver. Cum am mentionat deja aceasta se intampla automat cand clasa este incarcata. Din motive de securitate , JDBC va urmari ce driver a fost si de catre care incarcator. Apoi , cand Driver Manager incepe o legatura va folosi doar drivere care provin din fisiere locale sau din aceeasi clasa ca si codul necesar pentru conexiune. Stabilirea unei legaturi
Odata ce clasele Driver au fost incarcate si inregistrate cu clasa Driver Manager , sunt dispuse sa stabileasca o legatura cu baza de date. Cand se cere o legatura prin intermediul metodei Driver Manager.get Connection , Driver Manager testeaza fiecare driver pe rand pentru a vedea daca poate stabili o legatura. Uneori se poate intampla ca mai mult de un driver sa fie capabil de o legatura URL. De exemplu cand se conecteaza la o baza de date indepartata , s-ar putea , sa foloseasca un driver JDBC-ODBC sau un driver JDBC –to generic –network-protocol sau altul furnizat de baze de date.In asemenea cazuri ordinea in care se face testarea este semnificativa pentru ca Driver Manager va folosi primul driver pe care-l gaseste si care se poate conecta cu succes la URL-ul respectiv. Mai intai Driver Manager incearca sa foloseasca fiecare driver in ordinea in care a fost inregistrat (driver-ele din jdbc.drivers sunt intotdeauna inregistrate primele).Driverele sunt testae prin metoda Driver.connect. Primul driver care recunoaste URL-ul face legatura.
30
La prima vedere , metoda poate parea ineficienta dar necesita doar cateva proceduri si comparatii per legatura , din moment ce e neplacut ca zeci de drivere sa fie incarcate concomitent. Urmatorul cod este un exemplu pentru ceea ce necesita o legatura cu un driver precum JDBC-ODBC: Class.forName("jdbc.odbc.JdbcOdbcDriver"); //loads the driver String url = "jdbc:odbc:fred"; Connection con = DriverManager.getConnection( url, "userID", "passwd");
Variabilele con reprezinta o legatura cu sursa de date fred , care poate fi folosita pentru a crea si executa declaratii SQL. Prin adaugarea pachetului javax.sql , un obiect DataSource poate fi folosit pentru a stabili o legatura cu o sursa de date. Si Driver Manager poate fi folosit , dar un obiect DataSource ofera mai multe avantale si este alternativa preferata. Cei care scriu componente Enterprise JavaBeans , ar trebui sa foloseasca un obiect DataSource in locul unui Driver Manager . Folosind un obiect DataSource implementat in mod adecvat , se produc legaturi care pot fi folosite la tranzactii raspandite.
DataSouce
Un obiect DataSource este reprezentarea unei surse date in limbajul de programare Java.In termeni comuni , o sursa de date este o facilitate pentru a stoca date.Poate fi la fele de sofisticata ca o baza de date completa pentru o mare corporatie sau la fel de simpla ca un fisier cu randuri si coloane. O sursa de date se poate gasi intr-un server izolat sau intr-un desktop local. Aplicatiile acceseaza o sursa de date folosind o legatura si un obiect DataSource poate fi considerat ca un factor pentru legaturi cu anumite surse de date.Interfata DataSource furnizeaza 2 metode pentru stabilirea unei legaturi cu o sursa de date. Folosirea unui obiect DataSource este alternativa preferata in detrimentul utilizarii unui Driver Manager pentru a stabili o legatura cu o sursa de date. Ele sunt similare ca si extensie pentru ca ambele detin metode de creare a unei conexiuni , metode de stabilire a unei limite pentru a face o legatura. Totusi diferentele sunt mai semnificative decat asemanarile. Spre deosebire de un Driver Manager o DataSource are proprietatile care identifica si descriu sursa de datepe care o reprezinta . De asemenea , un obiect DataSource lucreaza cu un serviciu JDNI si este creat si dezvoltat separat fata de aplicatiile care-l utilizeaza. Faptul ca este inregistrat cu un serviciu JNDI , ii confera 2 avantaje majore , si anume: -o aplicatie nu necesita codarea informatiei ca in cazul unui Driver Manager. Un programator poate alege un nume logic pentru sursa de date pe care sa-l inregistreze cu ajutorul serviciului JNDI .Aplicatia foloseste acest nume si serviciul JNDI va furniza obiectul DataSOurce asociat cu numele logic. Obiectul DataSource poate fi folosit apoi pentru a crea o conexiune cu sursa de date pe care o reprezinta. -al doilea avantaj major este acela ca facilitatea DataSource permite implementarea unei clase DataSource . Legatura poate creste performanta in mod dramatic .Capacitatea de a folosi tranzactii variate da unei aplicatii posibilitatea de a in meritele intreprinderii.
31
Desi o aplicatie poate folosi fie un Driver Manager fie un obiect DataSource , pentru a obtine o legatura , folosirea unui obiect DataSource ofera avantaje semnificative si este recomandabila in stabilirea unei conexiuni. Statement
Un obiect statement este folosit pentru a trimite declaratii SQL catre o baza de date . Exista trei tipuri de obiecte Statement si toate actioneaza ca si recipienti pentru a executa declaratii SQL pentru o anumita legatura: Statement , Prepared Statement care vine de la Statement si Callable Statement care se mosteneste de la Prepared Statement . Ele sunt specializate in trimiterea unor tipuri speciale de declaratii SQL ; un obiect Statement este folosit pentru a executa o afirmatie simpla SQL fara parametri ; un obiect Prepared Statement –pentru a executa o afirmatie SQL cu sau fara parametri IN si un obiect Callable Statement –pentru a efectua un apel catre o baza de date. Interfata Statement furnizeaza metode de baza pentru a face declaratii si a prezenta rezulatte . Interfata Prepared Statement adauga metode pentru a se ocupa de parametrii IN ;interfata Callable Statement adauga metode pentru a se ocupa de parametrii OUT
Crearea obiectelor Statement
Odata ce se stabileste legatura cu o anumita baza de date , aceasta poate fi folosita pentru a trimite declaratii SQL . Un obiect Statement este creat cu metoda createStatement , ca in urmatorul cod: Connection con = DriverManager.getConnection(url, "sunny", ""); Statement stmt = con.createStatement();
Declaratia SQL ce vafi trimisa bazei de date este furnizata ca un argument pentru una din metodele execute . Acest lucru este demonstrat in urmatorul exemplu care utilizeaza metoda executeQuery : ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); Variabila rs se refera la un set de rezultate care nu pot fi actualizate si unde cursorul se poate deplasa doar inainte. Exista de asemenea versiuni ale metodei Connection.createStatement care creaza obiecte de tip Statement ce produc obiecte ResultSet , ce pot fi actualizate si care raman deschise dupa ce s-a efectuat o tranzactie . Executarea declaratiilor folosind obiecte Statement
Interfata Statemant furnizeaza trei metode diferite pentru a executa declaratii SQL: executeQuery , executeUpdate si execute . Metoda corecta este determinata de ceea ce produce declaratia SQL . Metoda executeQuery este folosita pentru declaratiile care produc un singur set de rezultate , ca declaratiile Select. Metoda executeUpdate este folosita oentru a executa declaratii insert , update , delete sau create table, drop table , alter table. Efectul unei taste insert update sau delete il constituie modificarea uneia sau a mai multor coloane in zero dintr-un tabel.
32
Trebuie notat ca interfata Prepared Statement care mosteneste toate metodele din interfata Statement are propriile versiuni ale metodelor executeQuery , executeUpdate si execute. Obiectele Prepared Statement nu furnizeaza declaratii SQL ca parametri pentru aceste metode pentru ca ele contin deja o declaratie SQL. Obiectele Callable Statement mostenesc formele Prepared Statement ale acestor metode. Furnizand o declaratie SQL pentru versiunile Prepared Statement sau Callable Statement ale metodelor executeQuery , executeUpdate sau execute se va produce o SQL Exception.
33
JavaMail Obiective si principii de design
APIul JavaMail este gandit pentru a face adaugarea de capabilitati de posta electronica un pas usor de facut. Suporta in acelasi timp crearea de interfete utilizator sofisticate. Include clase care incapsuleaza functiile si protocoalele obisnuite de mail. Se incadreaza ca mod de folosire in restul packetelor Java pentru a usura folosirea in comun cu alte APIuri Java si foloseste modele de programare comune. APIul JavaMail este gandit astfel incat sa satisfaca urmatoarele cerinte de dezvoltare si rulare: clase simple si la obiect pentru a facilita dezvoltatorile invatarea si folosirea lor folosirea de modele si concepte de programare familiare suporta foarte bine dezvoltarea de cod care se interfateaza cu alte APIuri Java foloseste tratarea exceptiilor in mod familiar si tratarea evenimentelor conform cu JDK 1.1 foloseste unelte din JavaBeans Activation Framework pentru a folosi tipuri de date si pentru a adauga alte tipuri de date si comenzi acelor structuri clasele si interfetele usoare fac banala adaugarea de functii de folosire a mailurilor aplicatiilor suporta dezvoltarea de aplicatii robuste care pot folosi o varietate de formate de mesaje complexe, cat si tipuri de date si protocoale de acces si transport APIul JavaMail se aseamana foarte mult cu IMAP, MAPI, CMC, client-c si alte sisteme de mesagerie. Multe concepte prezente in aceste sisteme sunt de aseamea folosite in APIul JavaMail. Este mult mai simplu de folosit pentru ca foloseste elemente din limbajul obiectual de programare Java pentru a ascunde complexitatea de implementare aplicatiilor. APIul JavaMail suporta o diversitate de implementari de sisteme de mesagerie – diferite containere de mesaje, diferite formate de mesaje di diverse metode de transport al mesajelor. JavaMail API are un set de clase de baza si interfete care definesc APIul pentru aplicatiile client. Multe aplicatii simple vor trebui sa interactioneze cu sistemul de mesagerie doar prin aceste clase si interfete de baza. Subclasele JavaMail pot sa dezvaluie elemente aditionale ale sistemului de mesagerie. De exemplu, subclasa MimeMessage dezvaluie si implementeaza caracteristici comune ale mesajelor electronice rulate prin internet asa cum sunt ele definite de standardele RFC822 si MIME. Dezvoltatorii pot sa subclaseze clasele JavaMail pentru a obtine implementari particulare de sisteme de mesagerie cum ar fi IMAP4, POP3 sau SMTP. Clasele de baza din JavaMail includ multe APIuri care simplifica folosirea API, dar nu adauga multa funcionalitate. Implementarile de subclase nu trebuie neaparat sa implementeze acele metode. Implementarile subclaselor trebuie sa implementeze doar clasele centrale si metodele care adauga functionaliteaza necesara pentru implementare.
34
Un sistem de mesajerie poate alege sa implementeze tot APIul JavaMail direct, permitind astgel sa faca un avantaj al optimizarilor de performanta, poate prin folosirea de cereri cu protocol in loturi. Implementarea IMAP4 foloseste aceasta alegere care ii ofera un avantaj.
Descriere Arhitecturala Arhitectura stratificata JavaMail
Componentele arhitecurale ale JavaMail sunt stratificate dupa cum urmeaza: stratul abstract declara clase, interfete si metode abstracte pentru a oferi functii de prelucrare a mailurilor suportate de toate sistemele de mesagerie electronica. Elementele API care construiesc stratul abstract sunt gandite pentru a fi subclasate si extinse ca o necesitate pentru a putea suporta tipuri de date standard si pentru a interfata cu accesul la mesaje si protocolul de transport al acestora dupa necesitate. Stratul de implementare internet – implementeaza partile layerului abstract folosind standardele internet: RFC822 si MIME JavaMail foloseste JavaBeans Activation Framework pentru a incapsula date in mesaj si pentru a stoca comenzi care interactioneaza cu acele date Clientii JavaMail folosesc APIul JavaMail iar furnizorii de servicii implementeaza APIul JavaMail. Arhitectura stratificata permite clientilor sa foloseasca acelasi apeluri JavaMail API pentru a trimite, primi si stoca o varietate de mesaje folosind diferite tipuri de date din diverse stocuri de mesaje si folosind o multitudine de protocoale de transport.
35
Arhitectura de clase JavaMail
Figura de mai jos prezinta clasele principale care construiesc APIul JavaMail.
36
Cadrul de lucru JavaMail
APIul JavaMail este intentionat sa implementeze urmatoarele functii, care compun procesul standard de prelucrare al mesajelor pentru o aplicatie client tipica: crearea unui email ce consta dintr-un set de elemente header si un block de date de un anumit tip specificat in headerul Content-Type JavaMail foloseste interfata Part si clasa mesaj pentru a defini un mesaj. Foloseste obiectul DataHandler definit de JAF care contine datele din mesaj Crearea unui obiect sesiune, care autentifica utilizatorul si controleaza accesul la stocul de mesaje si la trasnport Trimiterea mesajului catre lista de receptori Receptionare mesajului dintr-un stoc de mesaje Executarea unei comenzi de nivel inalt asupra unui mesaj receptionat. Comenzi de nivel inalt precum view si print sunt menite pentru a fi implementate via JavaBeanuri JAF. Figura urmatoare ilustreaza procesul de prelucrare al mesajelor oferit de JavaMail
Componente JavaMail API importante Clasa Message
Clasa Message este o clasa abstracta care defineste un set atribute si continut pentru un mesaj email. Atributele clasei Message specifica informatii de adresare si definesc structura continutului, inclusiv tipul continutului. Continutul este reprezentat ca un obiect DataHandler care ambaleaza datele reale. 37
Clasa Message implementeaza interfata Part care defineste atributele necesare pentru a defini si formate datele continute in obiectul Message si pentru interfatarea cu succes cu un sistem de mailing. Clasa Message adauga atributele From, To, Subject, Reply-To si altele necesare pentru trimiterea unui mesaj prin intermediul unui sistem de transport. Atunci cand este continut intr-un folder, un obiect Message are un set de steaguri asociate. JavaMail pune la dispozitie subclase care suporta diverse implementari de mesaje. Continutul unui mesaj este o colectie de bytes sau o referinta la o colectie de bytes, incapsulate intrun obiect Message. JavaMail lucreaza fara a tine cont sau a avea cunostinte despre tipurile de date sau continutul unui mesaj. Un obiect Message interactioneaza cu continutul lui printr-un start intermediarL JavaBeans Activation Framework ( JAF ). Aceasta separare permite obiectului Message sa prelucreze continut arbitrar si sa il transmita folosind oricare dintre protocoalele de transmisie folosind apeluri catre aceleasi metode API. Receptorul mesajului stie de obicei tipul de date al continutului si cum sa prelucreze acel continut. JavaMail suporta obiecte Message multipart, unde fiecare obiect Bodypart defineste propril set de atribute si continut. Stocare si receptionare mesaj
Mesajele sunt stocate in obiecte Folder. Un obiect Folder poate contine subfoldere ca si mesaje, fiind astfel o ierarhie arbore de foldere. Clasa Folder declara metode care aduc, alipesc, copiaza si sterg mesaje. Un obiect Folder poate de asemenea sa trimita evenimente componentelor inregistrate ca ascultatori de evenimente. Clasa Store defineste o baza de date care detine o ierarhie folder impreuna cu mesajele. Clasa Store specifica si protocolul de acces care acceaseaza folderele si receptioneaza mesajele continute in foldere. Clasa Store pune la dispozitie de asemenea si o conexiune la baza de date pentru a receptiona foldere si a inchide conexiunea. Furnizorii de servicii care implementeaza protocoale de acces la mesaje ( IMAP4, POP3, etc) incep prin a subclasa clasa Store. Un utilizator porneste de obicei o sesiune cu sistemul e posta electronica prin conectarea la o implementare particulara a clasei Store. Compunerea mesajului si transportul
Un client creeaza un nou mesaj prin instantierea unei subclase potrivite a clase Message. Va seta de asemenea atribute cum ar fi adresa destinatarului, subiectul si introduce continut in obiectul Message. Finalul este reprezentat de trimiterea mesajului prin invocarea metodei Transport.Send. Clasa transport modeleaza agentul de transport care ruteaza mesajul spre adresa de destinatie. Aceasta clasa pune la dispozitie metode pentu a trimite mesajul la o lista de adresanti. Invocarea metodei Transport.send cu un obiect Message identifica transportul de rigoare pe baza adreselor destinatarilor.
38
Clasa Session
Clasa Session defineste proprietati globale si per email utilizator care alcatuiesc interfata dintre un client care poate accesa emailul si retea. Componentele sistemului JavaMail folosesc obiectul Session pentru a seta si receptiona anumine proprietati. Clasa Session pune de asemenea la dispozitie o un obiect sesiune de baza autentificat pe care aplicatiile desktop pot sa-l partajeze. Clasa Session este o clasa finala. Nu poate fi subclasata. Clasa Session are rolul unei fabrici pentru obiectele Store si Transport care implementeaza protocoale de acces si transport specifice. Prin apelarea metodelor fabrica de rigoare ale unui obiect Session, clientul poate obtine obiecte Store si Transport care suporta anumite protocoale. Modelul de evenimente JavaMail
Modelul de evenimente JavaMail se conformeaza specifiactiilor de model de evenimente ale JDK 1.1, asa cum este descris in specificatiile JavaBeans. APIul JavaMail urmareste tiparele de design definite in specificatiile JavaBeans pentru denumirea evenimentelor, metodelor evenimentelor si inregistrarea ascultatorilor de evenimente. Toate evenimentele sunt subclasate din clasa MailEvent. Clientii asculta dupa evenimente specifice inregistrandu-se ca ascultatori pentru acele evenimente. Evenimentele notifica ascultatorii de schimbarile de stare cat timp o sesiune progreseaza. In timpul unei sesiuni, componenta JavaMail genereaza evenimente de tipuri specifice pentru o notifica obiectele inregistrate ca ascultatori pentru acel tip de evenimente. Clasele JavaMail Store, Folder si Transport sunt surse de evenimente. Folosirea APIului JavaMail
Aceasta sectiune defineste sintaxa si listeaza ordinea in care o aplicatie client apeleaza anumite metode JavaMail pentru a accesa si a deschide mesaje localizate intr-un folder: 1 – un client JavaMail incepe de obicei o sarcina de prelucrare emailuri prin obtinerea unui obiect Session de baza Session session = Session.getDefaultInstance( props, authenticator); 2 – clientul foloseste metoda getStore a obiectului Session pentru a se conecta la continutul principal. Metoda getStore returneaza o subclasa care suporta protocolul de acces definit de obiectul de propietati utilizator, care de obicei contine preferinte utilizator Store store = session.getStore(); store.connect(); 3 – daca conexiunea este realizata cu succes, clientul poate lista folderele disponibile in obiectul Store si apoi receptiona si vedea mesaje specifice. // receptioneaza folderul INBOX 39
Folder inbox = store.getFolder("INBOX"); // deschide folderul INBOX inbox.open(Folder.READ_WRITE); Message m = inbox.getMessage(1); // get Message # 1 String subject = m.getSubject(); // get Subject Object content = m.getContent(); // get content ... ... La final, utilizatorul inchide toate folderele deschise si apoi inchide obiectul Store: inbox.close(); // Close the INBOX store.close(); // Close the Store
40
Componenetele JavaBeans in paginile JSP Componentele JavaBeans sunt clase Java care pot fi usor refolosite si transformate in aplicatii.Orice clasa Java care se ia dupa anumite conventii de design poate fi o componenta JavaBeans. Tehnologia JSP sprijina in mod nemijlocit folosirea componentelor JavaBeans cu elemente de limbaj JSP .Poti crea si initia cu usurinta programe si poti obtine si stabiliza valorile proprietatilor acestora. Conventiile Conventiile de design ale componentelor componentelor Java Beans guverneaza proprietatile proprietatile clasei si metodele care confera accesul la proprietati. proprietati. Oproprietate Oproprietate a unei componente JavaBeans poate fi: -Citit/scris , numai date sau numai scris; -Simpla, ceea ce inseamna ca ea contine o singura valoare valoare ,sau indexata, ceea ce inseamna ca reprezinta o multitudine de valori. Nu exista nici o cerinta ca o proprietate sa fie implementata de o variabila instanta ;proprietatea trebuie sa fie accesibila pur si simplu doar prin folosirea metodelor publice care se conformeaza anumitor conventii. -Pentruu fiecar fiecaree propr propriet ietate ate read readabl ablee bean-u bean-ull trebu trebuie ie sa con contin tinaa o metod metodaa a formei formei o -Pentr PropertyClass getProperty() { ... }
o
-Pen -Pentr truu fiec fiecar aree prop propri riet etat atee scri scrisa sa bean bean-u -ull treb trebui uiee sa cont contin inaa o me meto toda da a form formei ei
setProperty(PropertyClass pc) { ... } Ca o adaugare la aceste metode o componenta JavaBean trebuie sa defineasca o constructie care nu contine parametri
Example: public class Currency { private Locale locale; private double amount; public Currency() { locale = null; amount = 0.0; } public void setLocale(Locale l) { locale = l; } public void setAmount(double a) { amount = a; } public String getFormat() { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(amount); } }
De ce sa folosesti o componenta JavaBeans
41
O pagina JSP poate crea si folosi orice tip de limbaj Java in cadrul in cadrul unei declaratii sau al unui scriptlet.Urmatorul scriptlet.Urmatorul scriptlet creeaza caruciorul de cumparaturi dintr-un magazin si il stocheaza ca pe un atribut important: <% ShoppingCart ShoppingCart cart = (ShoppingCart)session. (ShoppingCart)session. getAttribute("cart"); // If the user has no cart, create a new one if (cart == null) { cart = new ShoppingCart(); session.setAttribute("cart", session.setAttribute("cart", cart); } %> Daca acest element creat este conform cu regulile regulile JavaBeans paginile JSP pot folosi elemente pentru a crea si a accesa obiectul obiectul
Cum sa creezi si sa folosesti o componenta JavaBeans
Declari ca pagina ta JSP va folosi o componenta JavaBeans utilizand una dintre urmatoarele urmatoarele formate: or Al doilea format este folosit cand vrei sa incluzi declaratii jsp:setProperty jsp:setProperty descrise in sectiunea urmatoare , pentru a initia proprietatile proprietatile bean-ului. Elementul jsp:useBean inseamna inseamna ca pagina va folosi o informatie care este stocata in interior si accesibila din domeniul specfic ce poate fi “aplication , session , request” sau “page”. “ page”. Daca nu exista o asemenea informatie , ea este creata si sticata ca un atribut al domeniului domeniului respectiv. Valoarea atributului id determina numele (name) campului din domeniul respectiv si identificatorul identificatorul folosit pentru a face referire la acest camp in alte declaratii si scriptleti JSP.
Stabilirea proprietatilor componentelor JavaBeans
42
Exista doua moduri pentru a stabili proprietatile componentelor JavaBeans intr-o pagina JSP: cu elementul jsp:setProperty sau cu un scriptlet <% beanName.setPropName(value); %>
Sintaxa elementului jsp:setProperty depinde de sursa valorii .Tabelul urmator cuprinde modurile variate pentru a stabili o proprietate a unei componente JavaBeans folosind elementul jsp:setProperty.
Table Setting JavaBeans Component Properties Value Source
Element Syntax
String constant
Request parameter
Request parameter name matches bean property
Expression
1. beanName trebuie sa fie la fel ca cel specificat pentru atributul id intr-un element useBean. 2. Trebuie sa existe o metoda setPropName in componenta JavaBeans . paramName trebuie sa fie numele unui parametru necesar. 3. paramName
Recuperarea proprietatilor componentelor JavaBeans
Exista cateva moduri de a recupera proprietatile componentelor JavaBeans.Doua dintre acestea (elementul jsp:getProperty si o expresie )transforma )transforma valoarea proprietatii intr-un string string si introduc valoarea in obiectul curent implicit: <%=
beanName. getPropName()
%>
Pentru ambele metode beanName trebuie sa fie acelasi cu cel specificat pentru atributul id intr-un element useBean si de asemenea este necesar sa existe o metoda getPropName in componenta JavaBeans. Daca este necesar sa recuperezi valoarea unei proprietati fara sa o transformi si sa o introduci in obiectul out trebuie sa folosesti un scriptlet. <% Object o = beanName.getPropName(); %>
43
Accesarea obiectelor dintr-o pagina JSP
44
JavaScript
Conceptul de limbaj de scripting inseamna un limbaj de programare interpretat. Interpretarea permite transmiterea programelor in cod sursa cu conditia existentei la destinatie a unui interpretor pentru exectuita acestora. Exemple de limbaje de scripting: dBase, Visual Basic, Perl, Unix shell etc. Un program de scris in limbaj de scripting se numeste script. In WWW, scripting-ul se foloseste atat la client cat si la server. Executia unui script la server poate produce continut ce este transmis clientului prin HTTP. Executia unui script la client produce continut dinamic. Scripting-ul la client este parte a tehnologiei HTML-DHTML. Deosebirea esentiala dintre un limbaj de programare compilat si un limbaj de scripting interpretat este momentul legarii( engl. binding) – momentul in care devin cunoscute atributele unei variabile. La limbajele compilate momentul legarii este cel al traducerii, iar la cele interpretate este cel al executiei. Amanarea legarii atributelor conduce la flexibilitate a executiei in dauna eficientei. Cel mai raspandit limabj de scripting este JavaScript ,inventat de Netscape si standardizat apoi de Asociatia Europeana a producatorilor de calculatoare.Microsoft a incercat sa popularizeze Visual Basic Scripting Editon-VBScript.Datorita standardizarii JavaScript,Microsoft a decis ulterior sa suporte acest standard prin versiunea proprie Jscript si astfel ca interesul pentru VBScript a scazut. Ce este JavaSript?
JavaScript este un limbaj de scripting orientat pe obiecte inventat de Netscape. Spre deosebire de limabjele orientate pe obiect bazate pe clase cum sunt C si Java,JavaScript este un limbaj orientat pe obiect bazat pe prototipuri. JavaScript este un limbaj extensibil. Exista o compnenta de baza, numita CoreScript, care contine elementele de baza ale limabjului (cuvinte cheie, operatori, enunturi, structuri de control, modelul obiectual) si o multime de obiecte de baza, cum ar fi: Array, Date, Math etc. La ea se pot adauga in plus obiecte pentru controlul programului navigator si DOM si Server Side JavaScript care contine obiecte suport pentru partea de server, deci pentru comunicarea cu o baza de date relationala. In continuare prin JavaScript vom intelege partea de client a JavaScript. Navigatoarele www interpreteaza scripturile JavaScript din paginile HTML. Ele citesc pagina, interpreteaza marcajele si o afiseaza, executand in acelasi timp scripturile JavaScript pe masura intalnirii lor in cadrul paginii. Rezultatul acestui proces de interpretare/executie este vizualizat de utilizator in fereastra navigatorului. Intre JavaScript si Java exista unele asemanari, dar si cateva deosebiri fundamentale. Asemanarile se refera la unele aspecte de sintaxa a enunturilor si structurior de control. Deosebirile sunt: Java are legare la compilare, este puternic tipizat si foloseste un model obiectual bazat pe clase. JavaScript are legare la executie,este mult mai permisiv in ceea ce priveste declaratiile si foloseste un model obiectual bazat pe prototipuri. Concluzii
45
Descarcarea unor programe in cod obiect si rularea acestora in programul navigator poate duce la incetinirea incarcarii paginii respective. Deci nu trebuie abuzat de folosirea scripting-ului, aceasta facnadu-se numai in situatiile necesare. Includerea de script-uri face sa creasca dependenta paginilor pe care le scriem de programul navigator.
46
Situl de licitatii MuzzyMoo
Descriere Functionala
Obiectivul acestui site este acela de a implementa un mecanism de licitatii online pentru produse electronice. Situl isi propune sa fie usor de folosit si sa ofere o interfata prietenoasa utilizatorului. Acesta poate folosi situl pentru a-si vinde propriile produse electronice la licitatie deschisa sau poate 47
vedea produsele altor utilizatori care si-au propus produsele pentru a fi licitate. Modelul de licitatie electronica este foarte atractiv. El ofera cateva avantaje majore fata de celelalte moduri vanzare o produselor: -
utilizatorul este scutit de timpul pierdut pe care l-ar pierde daca s-ar duce in magazin pentru a-si vinde produsul intr-o consignatie sau alt tip de magazin utilizatorul este scutit de eventuale taxe percepute de catre vanzatorul produsului vanzarea se executa intr-un mod profesional utilizatorul poate obtine un pret maxim pentru produsul sau, obtinand astfel beneficii materiale substantiale vanzarea se executa intr-un mod foarte confortabil utilizatorului – poate fi chiar propria resedint, singura cerinta fiind posibilitatea accesarii sitului
Principalele module functionale oferite de site utilizatorului sunt prezentate in cele ce urmeaza.
Listarea produselor oferite spre licitatie
Toate produsele oferite spre licitatii de utilizatori sunt catalogate dupa categoria carora apartin. Situl ofera un nivel ierarhic de categorii pe 3 niveluri. Nivelul principal este vizibil tot timpul pe site, el oferind un punct de plecare in cautarea unui anumit produs cautat. Nivelul secundar este afisat in stanga paginii si ofera o orientare foarte buna a utilizatorului. Se poate alege mai departe nivelul 3 de categorie din lista afisata:
Utilizatorului ii sunt afisate tot timpul toate nivelurile de categorii selectate pana in momentul respectiv. Aceste lucru confera utilizatorului o orientare foarte buna in site. Orientarea in site este unul din lucrurile importante in orice aplicatie web. Vizitatorul trebuie sa stie totdeauna ce face, unde a ajuns si cum sa se intoarca inapoi.
Prin apasarea pe unul din linkurile de mai sus utilizatorul este dus la pagina categoriei respective. Astfel intoarcerea catre pagini anterioare este facuta intr-un mod natural si usor de folosit.
48
Pentru ca vizitatorii sitului sa nu foloseasca derularea paginii, ceea ce este un lucru incomod, si pentru o mai rapida incarcare a paginilor sitului, afisarea produselor este facuta intr-un mod paginat. Se afiseaza 6 produse pe fiecare pagina si utilizatorul poate naviga prin paginile dintr-o anumita categorie prin simpla apasare a paginii dorite.
Dupa cum se vede in figura de mai sus, sunt afisate numarul total de produse, precum si numarul de ordine ar produselor afisate. 49
Afisare produs
Fiecare produs este afisat in doua moduri: - modul listare - modul vizualizare detalii In modul listare sunt afisate urmatoarele: - culoarea - pretul de vanzare recomandat in magazine - pretul curent - utilizatorul care a postat cea mai mare licitatie - primele 3 caracteristici ale produsului
Daca se apasa pe linkul „More” , utilizatorul va fi dus in pagina in care i se vor afisa detaliile produsului.
50
In aceasta pagina se afiseaza toate informatiile despre un produs. Se pot vizualiza toate informatiile disponibile despre un anumit produs. Este vizibila aici data de inchidere a licitatii si se poate pune o noua oferta ( cu conditia ca utilizatorul sa fie autentificat ). Linkul „Back to products listings” il va duce pe utilizator inapoi la pagina de unde a venit. Aceasta este pagina care afiseaza varianta de listare a produsului vizualizat.
Cautare produse
Situl MuzzyMoo dispune si de un motor de cautare in propria baza de date de produse. Aceasta cautare se face pe baza urmatoarelor campuri -
marca model descriere culoare
Cautarea va incepe dupa completarea campului de text dupa care se face cautarea si apasarea butonului „Find it”.
Vor fi apoi listate toate produsele care contin unul sau mai multe dintre cuvintele dupa care s-a efectuat cautarea. Toate produsele gasite vor fi afisate utilizatorului folosind metoda de paginare descrisa anterior.
51
Banda rulanta
In cadrul acestei benzi rulante sunt prezentate pe scurt produsele uneia dintre categoriile de produse selectate de administratorul sitului. Sunt prezentate marca, modelul si pretul de start al licitatiei pentru respectivele produse. Fiecare produs este un link care prin apasare va conduce vizitatorul in pagina in care i se va prezenta detaliat produsul respectiv. 52
Informatiile prezente in aceasta banda sunt generate dinamic de fiecare data cand o pagina este incarcata, afisind astfel ultimele produse oferite spre licitatie din categoria respectiva. Inregistrare utilizator nou
Accesul spre pagina de utilizator nou se face prin apasarea linkului „My Account”. Deoarece utilizatorul nu a fost logat anterior, i se va prezenta pagina de login. In aceasta pagina este vizibil linkul „New User” care il va duce in pagina de creare utilizator nou.
Dupa apasarea linkului „New user” este afisata pagina in care utilizatorul va introduce datele personale si datele de identificare pe acest site.
53
Dupa completarea corecta a tuturor campurilor si apasarea butonului „Register”, utilizatorului ii va fi creat un nou cont. Folosindu-se de acesc cont, va putea adauga propriile produse spre licitatie si va putea sa faca oferte pentru alte licitatii. Din pagina „My Account” utilizatorul sitului poate sa isi modifice detaliile contului sau sa isi schimbe parola.
54
Auntentificarea
Autentificarea utilizatorilor se face din pagina „Login”. Aceasta va aparea la cererea vizitatorului prin apasarea butonului „Login” sau va fi afisata automat de sit atunci cand se va incerca accesul la o pagina care necesita autentificare. Din aceasta pagina, utilizatorul poate sa se autentifice. O data autentificat, el va fi tinut minte de sit pana in momentul parasirii lui. In cazul in care utilizatorul nu isi mai aduce aminte parola, are posibilitatea de a-i fi returnata aceasta parola de catre site.
55
Adaugarea unei licitatii
Pentru a accesa pagina de adaugare a unei licitatii utilizatorul autentificat va trebui sa isi aleaga o categorie in care doreste sa-si inscrie produsul. Va face acest lucru navigind arborele de categorii al sitului pana va ajunge la cetogoria dorita. Odata gasita aceasta categorie, utilizatorul va putea apasa linkul „Place a New Auction” si va fi dus in pagina de adaugare produs nou. Campurile necesare pentru a plasa o noua licitatie sunt: - marca - model - descriere - culoare - cost de trimitere colet prin posta - pret recomandat de vanzare in magazin - pret de pornire - pret de rezerva - durata licitatiei - fotografia produsului
56
Descrierea produsului va fi scrisa in mod normal: cate un rand pentru fiecare caracateristica a produsului. In momentul listarii produsului, vor fi afisate primele 3 caracteristici. Restul caracteristicilor vor fi afisate atunci cand vizitatorii vor vedea pagina de detalii produs. Pretul de pornire este pretul minim care poate fi oferit de un alt utilizator al sitului. Pretul de rezerva reprezinta acea suma minima peste care cel care isi ofera produsul la licitatie va considera licitatia valida. Prin aceasta metoda detinatorul produsului se asigura ca licitatia nu se va incheia cu un pret foarte mic, pret care l-ar dezavantaja. Daca timpul de licitatie se scurge fara ca alti utilizatori sa faca oferte peste acest pret atunci licitatia se va incheia fara succes. Licitatia va fi incheiata de catre sit in momentul expirarii timpului setat de catre ofertant. Rezultatul acestei operatiuni poate fi: - licitatie incheiata cu succes: exista oferte de pret mai mari decat pretul rezervat - licitatie incheiata fara succes: nu exista oferte mai mari decat pretul rezervat
57
Fotografia pe care utilizatorul sitului o foloseste se va incarca pe site si din aceasta se va obitne o fotografie mai mica care va fi prezentata in lista de produse. Licitarea
Licitarea se poate face din pagina de detalii produs. Pentru a pune propria oferta de pret este necesar ca utilizatorul sa se fi autentificat in prealabil. Daca nu a facut deja acest lucru, va fi redirectionat catre pagina de login a sitului. Daca utilizatorul va introduce un pret valid mai mare decat cea mai mare oferta pana in prezent, atunci el va aparea ca fiind cel mai mare ofertant. Daca licitatia s-ar incheia dupa ce el a postat oferta si oferta este mai mare decat pretul rezervat, atunci va fi declarat castigatorul licitatiei. Ofertele mele
Utilizatorul autentificat poate vedea oricand toate produsele la care el a depus o oferta de pret. Prin aceasta metoda se simplifica foarte mult managementul produselor care doresc a fi 58
cumparate. Accesul catre aceasta pagina se face prin apasarea linkului „My Bids” din partea superioara a ecranului.
Licitatiile mele
Utilizatorul autentificat poate urmari licitatiile pe care le-a inscris in site prin simpla apasare a linkului „My Auctions”. Va fi redirectat catre o pagina in care i se vor enumera toate produsele pe care le-a oferit catre licitatie. Astfel utilizatorii nu vor trebui sa tina minte toate produsele pe care le-au oferit pentru licitatie si acestea vor fi afisate la cerere.
59
Administrarea categoriilor
Pagina de administrare a categoriile permite responsabilului sitului sa faca exact ceea ce numele implica: adaugare, modificare si stergere de categorii. Stergerea trebuie sa se faca cu foarte mare atentie, pentru ca produsele din respectiva categorie nu vor mai aparea in site.
60
61
Descriere Tehnica Tabelele din baza de date
# phpMyAdmin SQL Dump # version 2.5.2-rc2 # http://www.phpmyadmin.net # # Host: localhost # Server version: 3.23.53 # PHP Version: 4.3.1 # # Database : `madalina` # # -------------------------------------------------------# # Table structure for table `bids` # CREATE TABLE `bids` ( `id` int(11) NOT NULL auto_increment, `id_user` int(11) NOT NULL default '0', `id_product` int(11) NOT NULL default '0', `amount` float NOT NULL default '0', `date_added` bigint(11) NOT NULL default '0', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=78 ; # -------------------------------------------------------# # Table structure for table `categs` # CREATE TABLE `categs` ( `id` int(11) NOT NULL auto_increment, `name` varchar(50) NOT NULL default '', `parent` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=84 ; # -------------------------------------------------------62
# # Table structure for table `products` # CREATE TABLE `products` ( `id` int(11) NOT NULL auto_increment, `id_categ` int(11) NOT NULL default '0', `id_user` int(11) NOT NULL default '0', `brand` varchar(50) NOT NULL default '', `model` varchar(50) NOT NULL default '', `description` mediumtext NOT NULL, `color` varchar(25) NOT NULL default '', `postage` float NOT NULL default '0', `rrp` float NOT NULL default '0', `price` float NOT NULL default '0', `reserved_price` float NOT NULL default '0', `status` int(11) NOT NULL default '0', `picture` varchar(50) NOT NULL default '', `addedon` bigint(11) NOT NULL default '0', `endsin` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=71 ; # -------------------------------------------------------# # Table structure for table `user` # CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(50) NOT NULL default '', `password` varchar(50) NOT NULL default '', `name` varchar(50) NOT NULL default '', `surname` varchar(100) NOT NULL default '', `birth_day` int(11) NOT NULL default '0', `birth_month` int(11) NOT NULL default '0', `birth_year` int(11) NOT NULL default '0', `email` varchar(100) NOT NULL default '', `phone` varchar(50) NOT NULL default '', `country` int(11) NOT NULL default '0', `state` varchar(50) NOT NULL default '', `city` varchar(50) NOT NULL default '', `zip` varchar(20) NOT NULL default '', `address` varchar(100) NOT NULL default '', `status` varchar(10) NOT NULL default '', PRIMARY KEY (`id`,`username`), UNIQUE KEY `username` (`username`) 63
) TYPE=MyISAM AUTO_INCREMENT=11 ;
JavaBeans folosite
Situl MuzzyMoo foloseste urmatoarele JavaBeans - Category - Product - User Beanul Category este foarte util in manuirea informatiilor despre o categorie. Pe langa metodele obisnuite ale unui JavaBean, acesta mai implementeaza si si contructorul care ia ca parametru un obiect ResultSet ce reprezinta un rand din baza de date. Acest constructor face foarte usoara construirea beanului fiind dat randul din baza de date ce reprezinta o categorie. Beanul User este folosit pentru a usura lucrul cu entitati care reprezinta utilizatorii unui site. Acest bean implementeaza o serie de metode in afara de metodele set si get obisnuite: - constructor cu paramentru ResultSet pentru a trece usor de la un rand de tabel ce reprezinta un utilizator la un obiect java - SaveToDB insereaza beanul in baza de date - UpdateToDB reactualizeaza beanul in baza de date - UpdateToDBPasswd modifica parola unui utilizator - RemoveAccount sterge randul ce reprezinta beanul din baza de date - LoadFromDB incarca beanul din baza de date Beanul Product reprezinta entitatea produs. Implementeaza urmatoarele metode: - construcorul cu paramentru HttpServletRequest pentru a construi obiectul ce reprezinta utilizator din datele oferite de acesta - FromRS este o metoda constructor ce creeaza obiectul conform unui rand din baza de date - UpdateFromDB selecteaza obiectul din baza de date - UpdateToDB salveaza starea beanului in baza de date. Daca id bean este mai mare decat zero, inseamn ca beanul exista in baza de date si in acest caz se va executa un update. In caz contra, este vorba de un bean care nu a fost inca inserat in baza de date, fapt ceea ce va genera un insert. - Metodele IsOK – pentru a face validarea pe membrii beanului - isOK_all – valideaza intregul bean Reformatarea imaginilor
Reformatarea este realizata de catre clasa Images. Aceasta porneste de la o imagine incarcata de catre utilizator si careia ii determina dimensiunile. Conform cu aceste dimensiuni se va face o reformatare la marimea maxima de 90x90 pixeli. Reformatarea se va face pastrind proportiile pentru 64
a nu deforma imaginea. De aceasta reformatare se ocupa biblioteca Jimi, care este o biblioteca ce poate fi descarcata de pe internet. Trimiterea emailurilor
De trimiterea mailurilor se ocupa clasele MailSender si Mailer. Clasa MailSender este cea care trimite efectiv mesajul. Aceasta foloseste JavaMail pentru a prelucra mesajul si pentru a-l trimite. Protocolul de mail folosit este SMTP, protocol oferit de foarte multe servere de mail. Aceasta ii confera sitului o foarte mare flexibilitate in privinta acestui serviciu. Clasa Mailer creaza un fir de executie Java care la randul lui creaza un instanta a clasei MailSender pentru a trimite mesajul propriuzis. Trimiterea de mesaje folosind fire de executie este necesara pentru a imbunatati timpul de raspuns al sitului la cerintele vizitatorilor. Ar fi impractic ca utilizatorii sa astepte trimiterea mesajelor pentru a li se permite sa continue navigarea pe site. Inchiderea licitatiilor
Clasa AuctionEnder este responsabila cu inchiderea licitatiilor. Functia CheckAuctions a acestei clase este apelata de fiecare data cand pagina de produse este afisata. Se asigura asfel o veridicitate absoluta a datelor prezentate pe site privitor starea licitatiilor. Clasa verifica toate licitatiile carora le-a expirat timpul de prezentare pe site si marcheaza aceste licitatii ca fiind incheiate. Modul de incheiere depinde de conditiile de oferta de pret si de pret rezervat. Formater
Clasa Formater este folosita pentru a formata stringurile care reprezinta sume de bani. TemplateHTML
Aceasta clasa este folosita pentru a implementa mecanismul de templates. Aceasta inseamna folosirea unor pagini tipar in interiorul carora se inlocuieste informatia utila. Aceasta informatie utila este reprezentata prin cuvinte cheie din fisierul de template. Aceste cuvinte cheie incep cu „{„ se termina cu „}”. TemplateHTML parseaza fisierul de tipar si din acest fisier va inlocui cuvintele cheie cu frazele reale care vor fi folosite. Rezulta astfel un flux de date prelucrat conform tiparului. Aceasta clasa este folosita la trimiterea de emailuri pentru notificarea licitatiilor si pentru reamintirea parolelor. Folosirea in mod traditional ar fi fost extrem de greoaie pentru ca orice modificari aduse fisierului tipar ar trebui reflectate in program.
65
Incarcare prin javascript a categoriilor
In cadrul administrarii categoriilor, in pagina se incarca doar categoriile de nivel 1. Celelalte categorii sunt incarcate doar atunci cand este nevoie de ele. Icarcarea se face folosind evenimentele javascript si urmatoarea functie JavaScript: function refreshJS(jsName,src) { var head = document.getElementsByTagName('head').item(0) var scriptTag = document.getElementById(jsName); if(scriptTag) head.removeChild(scriptTag); script = document.createElement('script'); script.src = src; script.type = 'text/javascript'; script.id = 'jsName'; head.appendChild(script); } Aceasta functie va incarca de pe server un JavaScript ce va contine doar categoriile din nivelul dorit care au parintele dorit. Acest continut dinamic va fi oferit de catre pagina getcategs.jsp. Prin aceasta metoda se eficientizeaza timpul de asteptare necesar pentru incarcarea paginii de aministrare a categoriilor.
66
Anexa A – Cod sursa products.jsp <%@ page import="java.io.File" %> <%@ page import="com.madalina.muzzymoo.Utils.Formater" %><%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.util.StringTokenizer" %> <%@ page import="java.util.Enumeration" %> <%@ page import="java.util.Hashtable" %> <%@ page import="java.util.Vector" %> <%@ page import="java.util.Date" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> <%@ page import="com.madalina.muzzymoo.javabeans.*"%> <%@ page import="com.madalina.muzzymoo.Mail.Mailer" %> <%@ page import="com.madalina.muzzymoo.Utils.*" %> <%! private static final String[] fields={"brand", "model", "description", "color" , "postage" , "rrp"}; private static final String[] auctionStates={"Active", "Suspended", "Ended succesfuly" , "Ended unsucessfuly"}; private static final String operand_search="AND"; String FromatDescr(String descr,boolean showDescr) { if(!showDescr) { int no_enter=0; int max_enter=3; int pos_enter=0; while(no_enter=0) { pos_enter=descr.indexOf("\n",pos_enter+1); // System.out.println(pos_enter); no_enter++; } if(pos_enter>0)descr=descr.substring(0,pos_enter-1); } descr=descr.replaceAll("\n",""); descr=descr.replaceAll("\r",""); // System.out.println("|"+descr+"|"); if(!descr.startsWith(" "))descr=" "+descr; return descr; } public String SmallPicPath(String path) { int posExt=path.lastIndexOf('.'); String newPath=path.substring(0,posExt+1)+"jpg"; return newPath; } %> <% Connection db = null; %> <%@ include file="include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); Statement stmt2 = null; stmt2 = db.createStatement(); AuctionEnder.CheckAucions(stmt,stmt2); int pc=0; if(request.getParameter("pc")!=null)pc=Integer.parseInt(request.getParameter("pc")); boolean showDescr=false; boolean addProduct=request.getParameter("newauction")!=null; boolean dobid=request.getParameter("dobid")!=null; boolean viewbids=request.getParameter("viewbids")!=null; boolean viewpersonal=viewbids||request.getParameter("viewauctions")!=null; int userID=-1;
67
if(addProduct||dobid||viewpersonal){%> <%@include file="auth/checkSession.jsp"%><% userID=Integer.parseInt((String)session.getAttribute("userId")); } if(addProduct){%> <% Product prod=new Product(request); if(prod.isOK_all()) { prod.setId_user(Integer.parseInt((String)session.getAttribute("userId"))); prod.setAddedon(System.currentTimeMillis()); prod.UpdateToDB(stmt); response.sendRedirect("products.jsp?showDescr="+prod.getId()+"&pc="+pc); return ; } } int prod_id=-1; ResultSet rs=null; Product product=null; if(request.getParameter("showDescr")!=null) { showDescr=true; try { prod_id=Integer.parseInt(request.getParameter("showDescr")); rs=stmt.executeQuery("SELECT id_categ FROM products WHERE id="+prod_id); rs.next(); pc=rs.getInt(1); product=new Product(); product.UpdateFromDB(prod_id,stmt2); } catch (Exception e) {System.out.println("e="+e);} } if(request.getParameter("chgStatus")!=null) { if(product.getStatus()==1)product.setStatus(0); else if(product.getStatus()==0)product.setStatus(1); product.UpdateToDB(stmt2); } if(dobid) { try { ResultSet rset=stmt.executeQuery("SELECT * FROM products WHERE id="+prod_id); rset.next(); if(rset.getInt("id_user")!=userID) { float bid=Float.parseFloat(request.getParameter("bid")); if(bid<=rset.getFloat("price"))throw new Exception(); stmt.executeUpdate("INSERT INTO bids (id_user,id_product,amount,date_added) VALUES("+ userID+","+prod_id+","+bid+","+System.currentTimeMillis()+")" ); Hashtable keywords=new Hashtable(); String server="http://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath() +""; Product pr=new Product(); pr.UpdateFromDB(prod_id,stmt2); User bider=new User(); bider.LoadFromDB(userID,stmt2); ResultSet rsa=stmt2.executeQuery("SELECT id_user FROM products WHERE id="+prod_id); rsa.next(); User auctioner=new User(); auctioner.LoadFromDB(rsa.getInt(1),stmt2); keywords.put("name",auctioner.getName()); keywords.put("brand",pr.getBrand()); keywords.put("model",pr.getModel()); keywords.put("keyfeatures",FromatDescr(pr.getDescription(),false)); keywords.put("color",pr.getColor()); keywords.put("rrp",""+pr.getRrp()); keywords.put("postage",""+pr.getPostage()); keywords.put("hb",""+bid);
68
keywords.put("hbbidder",""+bider.getName()); keywords.put("picture",pr.getPicture()); keywords.put("server",server); keywords.put("prod_id",""+pr.getId()); keywords.put("pc",""+pr.getId_categ()); String mailTemplate="bid.htm"; TemplateHTML templ=new TemplateHTML(this.getServletContext().getRealPath("") +File.separator+"mails"+File.separator+"templates"+File.separator+mailTemplate,keywords); String mailBody=templ.transform(null); System.out.println(server); Mailer em=new Mailer(); em.SendMessage(auctioner.getEmail(),"MuzzyMoo Bid Notification",mailBody,"MuzzyMoo"); } } catch (Exception ex) {ex.printStackTrace();} } int td=3; int addsPerPage=6; if(showDescr)addsPerPage=1; int addsStartPos=0; try { if(request.getParameter("addsStartPos")!=null)addsStartPos=Integer.parseInt(request.getParameter("addsStartPos")); } catch (NumberFormatException e) {} Vector mybids=new Vector(); if(viewpersonal) { if(viewbids) rs=stmt.executeQuery("SELECT distinct products.id FROM products INNER JOIN bids ON products.ID=bids.id_product WHERE bids.id_user="+userID); else rs=stmt.executeQuery("SELECT products.id FROM products WHERE products.id_user="+userID); while(rs.next())mybids.add(new Integer(rs.getInt("products.id"))); }
// //
Vector breadcrumb=new Vector(); int pc_cur=pc; while(pc_cur>0) { rs=stmt.executeQuery("SELECT * FROM categs WHERE id="+pc_cur); rs.next(); breadcrumb.add(new Category(rs)); pc_cur=rs.getInt("parent"); } breadcrumb.add(new Category(0,0,"Home")); if(breadcrumb.size()==2) { rs=stmt.executeQuery("SELECT * FROM categs WHERE parent="+pc+" LIMIT 0,1"); if(rs.next()) { pc=rs.getInt("id"); Category cat=new Category(rs); breadcrumb.insertElementAt(cat,0); } } String search=request.getParameter("search"); if(pc==0&&!viewpersonal&&search==null) { response.sendRedirect("default.jsp"); return; pc=Const.pc_special_cat; } Vector level2=new Vector(); if(breadcrumb.size()>=2) { rs=stmt.executeQuery("SELECT * FROM categs WHERE parent="+((Category)breadcrumb.get(breadcrumb.size()-2)).getId()); while(rs.next()) level2.add(new Category(rs)); } Vector level3=new Vector(); if(breadcrumb.size()>=3)
69
{ rs=stmt.executeQuery("SELECT * FROM categs WHERE parent="+((Category)breadcrumb.get(breadcrumb.size()-3)).getId()); while(rs.next()) level3.add(new Category(rs)); } int level1_selected=0; int level1_id=-1; if(breadcrumb.size()>=2) level1_id=((Category)breadcrumb.get(breadcrumb.size()-2)).getId(); int level2_id=-1; if(breadcrumb.size()>=3) level2_id=((Category)breadcrumb.get(breadcrumb.size()-3)).getId(); for(int i=0;i MuzzyMoo Auctions <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script language="JavaScript" src="../js/popup.js"> <script language="JavaScript"> function edit(id) { window.location="products.jsp?pc=<%=pc%>&addsStartPos=<%=addsStartPos%>&addsPerPage=<%=addsPerPage%>< %if(request.getParameter("add")!=null)out.print("&add=1");%>&id="+id; } <%@include file="include/header.jsp"%> <% if(viewpersonal){%> <%@include file="include/mainTabs.jsp"%> <% } for(int i=0;i activCorner.jpg"> ">
<% if(i
"); }%> <% if(!viewpersonal) {
70
%> You can begin browsing trough products by selecting a c ategory from the upper menu
<%}%> <% String query="FROM products WHERE status=0 AND id_categ="+pc; if(prod_id>0)query="FROM products WHERE id="+prod_id; if(search!=null) { query="FROM products"; StringTokenizer tk=new StringTokenizer(search," \t,;.%'\"",false); int no=0; while(tk.hasMoreTokens()) { String tok=tk.nextToken(); if(no++>0)query+=" AND"; else query+=" WHERE"; query+="("; for(int i=0;i
0)query+=" OR "; query+=fields[i]+" LIKE '%"+tok+"%'"; } query+=")"; } } int mybidsPos=Integer.MAX_VALUE; int addsTotal=0; if(viewpersonal) { mybidsPos=addsStartPos; addsTotal=mybids.size(); } else { rs=stmt.executeQuery("SELECT COUNT(*) "+query); rs.next(); addsTotal=rs.getInt(1); query="SELECT * "+query; query+=" LIMIT "+addsStartPos+","+addsPerPage; rs=stmt.executeQuery(query); } int no=0; %> <% if(viewpersonal) { %> <%}else if(search==null){%>
71
You are here <%if(breadcrumb.size()>0) for(int i=breadcrumb.size()-1;i>=0;i--) { Category categ=(Cate gory)breadcrumb.get(i); if(i==0){%> <%=categ.getName()%> <%}else{%> "><%=categ.getName()%> <%} }%> ">Place a New Auction
<% } else { %> <% } %> <% if(addProduct) { %> <%@ include file="include/addproduct.jsp"%> <% } else while((mybids!=null&&mybidsPos "); %> width="260"<%}%>> <% ResultSet rsb=stmt2.executeQuery("SELECT * FROM bids INNER JOIN user ON id_user=user.id WHERE id_product="+pr.getId()+" ORDER BY amount desc LIMIT 0,1"); float hb=pr.getPrice(); String user="None"; if(rsb.next()) { hb=rsb.getFloat("amount"); user=""+rsb.getString("name"); }%> <%if(showDescr){%> <%}else{%> &pc=<%=pc>0?pc:-1%>"> <%}%> Colour: <%=pr.getColor()%> RRP: $<%=Formater.Money(pr.getRrp())%> Price: $<%=Formater.Money(hb)%> Bidder: <%=user%> <% if(showDescr){ Date ends=new Date(pr.getAddedon()+pr.getEndsin()*24*3600*1000); %> Highest bid: <%=hb%>$ From: <%=user%> Ends: <%=ends.toLocaleString()%> Status: <%=auctionStates[pr.getStatus()]%> <%}%> <%if(showDescr){%> <%=FromatDescr(" "+pr.getDescription(),showDescr)%> <%}%> <%if(showDescr){ %> <% }else{%> <%=FromatDescr(" "+pr.getDescription(),showDescr)%> &pc=<%=pc>0?pc:-1%>">More ... <%}%>
<% no+=1; } %>
<%if(showDescr||addProduct){%> ">Back to products listing <%}else{%> <%@include file="../include/templateNavigate.jsp"%> <%}%> <%@include file="include/categsMap.jsp"%> <%@include file="include/footer.jsp"%> <% if(!viewpersonal&&(!showDescr))session.setAttribute("lastprodpagequery",request.getQueryString()); %>
default.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> MuzzyMoo <script language="JavaScript" src="js/popup.js"> <%@include file="include/header.jsp"%>
74
<%@include file="include/mainTabs.jsp"%>
<%@include file="include/categsMap.jsp"%> <%@include file="include/footer.jsp"%>
uplimg.jsp <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.Statement" %> <%@ page import="com.madalina.muzzymoo.javabeans.Product" %> <%@ page import="java.io.File" %> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> Upload Product Picture <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> Upload Product Picture <% if(request.getParameter("upl")!=null) { if(request.getParameter("pid")!=null) { int pid=-1; try { pid=Integer.parseInt(request.getParameter("pid")); } catch (NumberFormatException e) {} Statement stmt = null; stmt = db.createStatement(); Product pr=new Product(); pr.UpdateFromDB(pid,stmt); String appRoot=this.getServletContext().getRealPath(""); System.out.println(appRoot); File f=new File(appRoot+File.separator+"img"+File.separator+"product"+File.separator+pr.getPicture()); boolean ok=f.delete(); System.out.println(appRoot+File.separator+"img"+File.separator+"product"+File.separator+pr.getPicture()); System.out.println("delete ok="+ok); f=new File(appRoot+File.separator+"img"+File.separator+"product"+File.separator+"thumbs"+File.separator+pr.getPicture()); f.delete(); } %> <script language="JavaScript">
75
fname='<%=request.getParameter("fname")%>'; window.opener.newproduct.picture.value=fname; window.opener.focus(); window.close(); <% } else { %> <%}%>
footer.jsp <script language="javascript"> var newWin; function openPopupLow(filename,popupname){ mywidth = 700; myheight = 500; myleft = (screen.width - mywidth) / 2; mytop = (screen.height - myheight) / 2; newWin = window.open(filename, popupname, 'width='+mywidth+',height='+myheight+',scrollbars=1,resizable=0,menubar=0,toolbar=0,status=1,location=0,directories=0,left='+myleft+',top='+myto p); newWin.focus(); }
admin\categs.jsp <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %><% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); ResultSet rs=stmt.executeQuery("SELECT * FROM categs WHERE parent=0");
76
%> Categories Administration <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script language="JavaScript" id="js_cat"> <script language="JavaScript" src="categs.js"> Cagetories
admin\categs.js function refreshJS(jsName,src) { var head = document.getElementsByTagName('head').item(0) var scriptTag = document.getElementById(jsName); if(scriptTag) head.removeChild(scriptTag); script = document.createElement('script'); script.src = src; script.type = 'text/javascript'; script.id = 'jsName'; head.appendChild(script); } categs=new Array(); function GetCategs(sel) { level=parseInt(sel.level); if(level
77
categ[i].options.length=0; if(sel.value) { var date=new Date(); refreshJS("js_req","getcategs.jsp?date="+escape(date)+"&level="+sel.level+"&parent="+sel.value); } } id.value=categ[level].value; sel_level.value=level; newname.value=categ[level].options[categ[level].selectedIndex].text; } function SetCategs(level) { categ[level].options.length=0 for(i=0;i0)parent_cat=categ[level-1].value; if(isNaN(parent_cat))return; for(i=level;i0)parent_cat=categ[level-1].value; var date=new Date(); url="getcategs.jsp?date="+escape(date)+"&level="+(level-1)+"&act=del&id="+categ[level].value+"&parent="+parent_cat; for(i=level;i0) { parent_cat=0; if(level>0)parent_cat=categ[level-1].value; var date=new Date(); url="getcategs.jsp?date="+escape(date)+"&level="+(level1)+"&act=ren&id="+id.value+"&parent="+parent_cat+"&name="+escape(newname.value); for(i=level;i
admin\getcategs.jsp <%@ page import="java.util.Vector" %><%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> <%
78
Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); int parent=-1; int level=-1; try { parent=Integer.parseInt(request.getParameter("parent")); } catch (NumberFormatException e) {} level=Integer.parseInt(request.getParameter("level")); if(request.getParameter("act")!=null) { String act=request.getParameter("act"); if(act.equals("add")) { String name=request.getParameter("name"); stmt.executeUpdate("INSERT INTO categs(parent,name) VALUES ("+parent+",'"+name+"')"); } if(act.equals("del")) { int id=Integer.parseInt(request.getParameter("id")); Vector cats=new Vector(); cats.add(new Integer(id)); int pos=0; ResultSet rs; String query="DELETE FROM categs WHERE id="+id; int cid; while(pos SetCategs(<%=level+1%>);
79
src\com\madalina\muzzymoo\constants\CMail.java /** * CMail.java * * @author Created by Omnicore CodeGuide */ package com.madalina.muzzymoo.constants; public class CMail { public static final String send_server="mail.rdslink.ro"; public static final String recv_server="mail.rdslink.ro"; public static final String username=""; public static final String password=""; public static final String send_protocol="SMTP"; }
src\com\madalina\muzzymoo\constants\Const.java /** * Const.java * * @author Created by Omnicore CodeGuide */ package com.madalina.muzzymoo.constants; public class Const { static final public int[] level1_ids={39,60,78,40,66,41}; static final public String db_string="jdbc:mysql://localhost:3306/madalina?user=root&password=ovc"; static final public int pc_special_cat=45; }
src\com\madalina\muzzymoo\image\Images.java package com.madalina.muzzymoo.image; /* * Images.java * * Created on June 14, 2002, 12:26 PM */ import java.awt.*; import java.awt.image.*; import java.io.*; import java.util.*; import com.sun.jimi.core.Jimi; import javax.swing.ImageIcon; /** * * @author nicu * @version */ public class Images { /** Creates new Images */ static double width = 90.0, height = 90.0;
80
public Images() { } static public void createThumb(String path) { writeImage(100,90,path); } static void setDims(int pic_width, int pic_height) { width = pic_width; height= pic_height; } static boolean writeImage(int wmax, int hmah, String name) { File f = new File(name); String nameIm = f.getName(); String nameStr = f.getName().substring(0,nameIm.lastIndexOf(".")); String path = f.getAbsolutePath(); System.out.println("path in Image thumbnailer="+path); path=path.substring(0,path.lastIndexOf(File.separator)); Image im = new ImageIcon(name).getImage(); float dx = im.getWidth(null), dy = im.getHeight(null); if(dx<0||dy<0) return false; float mx = ((float) wmax)/dx; float my = ((float) hmah)/dy; float min = (mx
// // // // // // // // // //
g.drawImage(im,0,0,(int)x, (int)y,null); try { System.out.println(path+File.separator+"thumbs"+File.separator+nameStr+".jpg"); Jimi.putImage("image/jpeg",image,new String(path+File.separator+"thumbs"+File.separator+nameStr+".jpg")); System.out.println("Poza Creata"); } catch(Exception ex){System.out.println("nu poate crea poza");} return true; } }
src\com\madalina\muzzymoo\javabeans\Category.java /** * Category.java * * @author Created by Omnicore CodeGuide */
81
package com.madalina.muzzymoo.javabeans; import java.sql.ResultSet;
public class Category { int id; int parent; String name; public Category(int id,int parent,String name) { this.id=id; this.parent=parent; this.name=name; } public Category(ResultSet rs)throws java.sql.SQLException { setId(rs.getInt("categs.id")); setParent(rs.getInt("categs.parent")); setName(rs.getString("categs.name")); } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setParent(int id_parent) { this.parent = id_parent; } public int getParent() { return parent; } public void setId(int id) { this.id = id; } public int getId() { return id; } }
src\com\madalina\muzzymoo\javabeans\Product.java /** * product.java * * @author Created by Madalina */ package com.madalina.muzzymoo.javabeans; import java.sql.ResultSet; import java.sql.Statement; public class Product { private int id; private int id_categ;
82
private int id_user; private String brand; private String model; private String description; private float price; private String color; private float postage; private float rrp; private float reserved_price; private int stock; private int status; private String picture; private long addedon; private int endsin; public Product() { id=-1; price=-1; id_categ=-1; brand=model=description=null; } public Product(javax.servlet.http.HttpServletRequest request) { try { setId(Integer.parseInt(request.getParameter("id"))); } catch (Exception e) {} try { setId_categ(Integer.parseInt(request.getParameter("id_categ"))); } catch (Exception e) {} setBrand(request.getParameter("brand")); setModel(request.getParameter("model")); setDescription(request.getParameter("description")); setColor(request.getParameter("color")); try { setPostage(Float.parseFloat(request.getParameter("postage"))); } catch (Exception e) {} try { setReserved_price(Float.parseFloat(request.getParameter("reserved_price"))); } catch (Exception e) {} try { setRrp(Float.parseFloat(request.getParameter("rrp"))); } catch (Exception e) {} setPicture(request.getParameter("picture")); try { if(request.getParameter("price")!=null) setPrice(Float.parseFloat(request.getParameter("price"))); } catch (Exception e) {} try { if(request.getParameter("stock")!=null) setStock(Integer.parseInt(request.getParameter("stock"))); } catch (Exception e) {} try { if(request.getParameter("status")!=null) setStatus(Integer.parseInt(request.getParameter("status"))); }
83
catch (Exception e) {} try { if(request.getParameter("endsin")!=null) setEndsin(Integer.parseInt(request.getParameter("endsin"))); } catch (Exception e) {} } public Product(ResultSet rs) throws java.sql.SQLException { FromRS(rs); } public void setEndsin(int endsin) { this.endsin = endsin; } public int getEndsin() { return (int)endsin; } public void setAddedon(long addedon) { this.addedon = addedon; } public long getAddedon() { return addedon; } public void setStatus(int status) { this.status = status; } public int getStatus() { return status; } public void setReserved_price(float reserved_price) { this.reserved_price = reserved_price; } public float getReserved_price() { return reserved_price; } public void setId_user(int id_user) { this.id_user = id_user; } public int getId_user() { return id_user; } public void setPicture(String picture) { this.picture = picture; } public String getPicture() { return picture;
84
} public void setStock(int stock) { this.stock = stock; } public int getStock() { return stock; } public void setRrp(float rrp) { this.rrp = rrp; } public float getRrp() { return rrp; } public void setPostage(float postage) { this.postage = postage; } public float getPostage() { return postage; } public void setColor(String color) { this.color = color; if(this.color!=null)this.color=this.color.replace('\'','`'); } public String getColor() { return color; } private void FromRS( ResultSet rs) throws java.sql.SQLException { setId(rs.getInt("products.id")); setId_categ(rs.getInt("products.id_categ")); setId_user(rs.getInt("products.id_user")); setBrand(rs.getString("products.brand")); setModel(rs.getString("products.model")); setDescription(rs.getString("products.description")); setPrice(rs.getFloat("products.price")); setColor(rs.getString("products.color")); setPostage(rs.getFloat("products.postage")); setRrp(rs.getFloat("products.rrp")); setReserved_price(rs.getFloat("products.reserved_price")); setStock(rs.getInt("products.stock")); setStatus(rs.getInt("products.status")); setPicture(rs.getString("products.picture")); setAddedon(rs.getLong("products.addedon")); setEndsin(rs.getInt("products.endsin")); } public void UpdateFromDB(int pid,Statement stmt) throws java.sql.SQLException { ResultSet rs=stmt.executeQuery("SELECT * FROM products WHERE id="+pid); rs.next(); FromRS(rs); } public void UpdateToDB(Statement stmt) throws java.sql.SQLException { String query=""; if(isOK_id()) {
85
query="UPDATE products SET "; query+="id_categ="+id_categ; query+=",id_user="+id_user; query+=",brand='"+brand+"'"; query+=",model='"+model+"'"; query+=",description='"+description+"'"; query+=",price="+price; query+=",color='"+color+"'"; query+=",postage="+postage; query+=",rrp="+rrp; query+=",reserved_price="+reserved_price; query+=",stock="+stock; query+=",status="+status; query+=",picture='"+picture+"'"; query+=",addedon="+addedon; query+=",endsin="+endsin; query+=" WHERE id="+id; } else { query="INSERT INTO products(id_categ,id_user,brand,model,description,price,color,postage,rrp,reserved_price,stock,status,picture,addedon,endsin)VALUES("+ id_categ+","+id_user+",'"+brand+"','"+model+"','"+description+"',"+price+",'"+color+"',"+postage+","+rrp +","+reserved_price+","+stock+","+status+",'"+picture+"',"+addedon+","+endsin+")"; } stmt.executeUpdate(query); ResultSet rs=stmt.getGeneratedKeys(); rs.next(); id=rs.getInt(1); } public boolean isOK_all() { return //isOK_id()&& isOK_id_categ()&&isOK_brand()&&isOK_model()&&isOK_description()&&isOK_price()&&isOK_color() &&isOK_postage()&&isOK_rrp()&&isOK_ReservedPrice()&&isOK_picture()&&isOK_endsin(); } public boolean isOK_id() { return id>0; } public boolean isOK_id_categ() { return id_categ>0; } public boolean isOK_brand() { if(brand==null)brand=""; return !brand.equals(""); } public boolean isOK_model() { if(model==null)model=""; return !model.equals(""); } public boolean isOK_description() { if(description==null)description=""; return !description.equals(""); } public boolean isOK_price() { return price>0; } public boolean isOK_color() { if(color==null)color=""; return !color.equals(""); } public boolean isOK_postage()
86
{ return postage>0; } public boolean isOK_rrp() { return rrp>0; } public boolean isOK_ReservedPrice() { return reserved_price>0; } public boolean isOK_endsin() { return endsin>0; } public boolean isOK_picture() { if(picture==null)picture=""; return !picture.equals(""); } public void setPrice(float price) { this.price = price; } public float getPrice() { return price; } public void setDescription(String description) { this.description = description; if(this.description!=null)this.description=this.description.replace('\'','`'); } public String getDescription() { return description; } public void setModel(String model) { this.model = model; if(this.model!=null)this.model=this.model.replace('\'','`'); } public String getModel() { return model; } public void setBrand(String brand) { this.brand = brand; if(this.brand!=null)this.brand=this.brand.replace('\'','`'); } public String getBrand() { return brand; } public void setId_categ(int id_categ) { this.id_categ = id_categ; } public int getId_categ() { return id_categ;
87
} public void setId(int id) { this.id = id; } public int getId() { return id; } }
src\com\madalina\muzzymoo\javabeans\User.java /** * user.java * * @author Created by Andrei */ package com.madalina.muzzymoo.javabeans; import java.sql.ResultSet; import java.sql.Statement; public class User { private int id; private String username; private String password; private String name; private String surname; private int birth_day; private int birth_month; private int birth_year; private String email; private String phone; private int country; private String state; private String city; private String zip; private String address; private String status; private String query; private int errMsg; public User(){} public void setId(int id){this.id=id;} public int getId(){return id;} public void setUsername(String username){this.username=username;} public String getUsername(){return username;} public void setPassword(String password){this.password=password;} public String getPassword(){return password;} public void setName(String name){this.name=name;} public String getName(){return name;} public void setSurname(String surname){this.surname=surname;} public String getSurname(){return surname;} public void setBirthDay(int birth_day){this.birth_day=birth_day;} public int getBirthDay(){return birth_day;} public void setBirthMonth(int birth_month){this.birth_month=birth_month;} public int getBirthMonth(){return birth_month;} public void setBirthYear(int birth_year){this.birth_year=birth_year;}
88
public int getBirthYear(){return birth_year;} public void setEmail(String email){this.email=email;} public String getEmail(){return email;} public void setPhone(String phone){this.phone=phone;} public String getPhone(){return phone;} public void setCountry(int country){this.country=country;} public int getCountry(){return country;} public void setZip(String zip){this.zip=zip;} public String getZip(){return zip;} public void setAddress(String address){this.address=address;} public String getAddress(){return address;} public void setState(String state){this.state=state;} public String getState(){return state;} public void setCity(String city){this.city=city;} public String getCity(){return city;} public void setStatus(String status){this.status=status;} public String getStatus(){return status;} public void setErrMsg(int errMsg){this.errMsg=errMsg;} public int getErrMsg(){return errMsg;} public void getFormData(javax.servlet.http.HttpServletRequest request) { try{setId(Integer.parseInt(request.getParameter("id"))); } catch (Exception e) {} try{setBirthDay(Integer.parseInt(request.getParameter("birth_day"))); } catch (Exception e) {} try{setBirthMonth(Integer.parseInt(request.getParameter("birth_month"))); } catch (Exception e) {} try{setBirthYear(Integer.parseInt(request.getParameter("birth_year"))); } catch (Exception e) {} try{setCountry(Integer.parseInt(request.getParameter("country"))); } catch (Exception e) {} setUsername(request.getParameter("username")); setPassword(request.getParameter("password")); setName(request.getParameter("name")); setSurname(request.getParameter("surname")); setEmail(request.getParameter("email")); setPhone(request.getParameter("phone")); setState(request.getParameter("state")); setCity(request.getParameter("city")); setZip(request.getParameter("zip")); setAddress(request.getParameter("address")); setStatus(request.getParameter("status")); } public User(ResultSet rs) throws java.sql.SQLException { setId(rs.getInt("user.id")); setUsername(rs.getString("user.name")); setPassword(rs.getString("user.password")); setName(rs.getString("user.name")); setSurname(rs.getString("user.surname")); setBirthDay(rs.getInt("user.birth_day")); setBirthMonth(rs.getInt("user.birth_day")); setBirthYear(rs.getInt("user.birth_year")); setEmail(rs.getString("user.email")); setPhone(rs.getString("user.phone")); setCountry(rs.getInt("user.country"));
89
setState(rs.getString("user.state")); setCity(rs.getString("user.city")); setZip(rs.getString("user.zip")); setAddress(rs.getString("user.address")); setStatus(rs.getString("user.status")); } public void SaveToDB(Statement stmt) { String query=""; query="INSERT INTO user (username,password,name,surname,birth_day,birth_month,birth_year,email,phone,country,state,city,zip,address,status)VALUES('"; query+=username+"','"; query+=password+"','"; query+=name+"','"; query+=surname+"',"; query+=birth_day+","; query+=birth_month+","; query+=birth_year+",'"; query+=email+"','"; query+=phone+"',"; query+=country+",'"; query+=state+"','"; query+=city+"','"; query+=zip+"','"; query+=address+"','"; query+=status+"')"; try { stmt.executeUpdate(query); } catch(java.sql.SQLException ex) { setErrMsg(1); } } public void UpdateToDB(Statement stmt) throws java.sql.SQLException { String query=""; query="UPDATE user SET "; query+="name='"+name+"',"; query+="surname='"+surname+"',"; query+="birth_day="+birth_day+","; query+="birth_month="+birth_month+","; query+="birth_year="+birth_year+","; query+="email='"+email+"',"; query+="phone='"+phone+"',"; query+="country="+country+","; query+="state='"+state+"',"; query+="city='"+city+"',"; query+="zip='"+zip+"',"; query+="address='"+address+"',"; query+="status='"+status+"'"; query+=" WHERE id="+id; stmt.executeUpdate(query); } public void UpdateToDBPasswd(Statement stmt) throws java.sql.SQLException { String query=""; query="UPDATE user SET "; query+="password='"+password+"'"; query+=" WHERE id="+id; stmt.executeUpdate(query); } public void RemoveAccount(Statement stmt) throws java.sql.SQLException { String query="delete from user where username='"+username+"'";
90
stmt.executeUpdate(query); } public void LoadFromDB(int user_id,Statement stmt) throws java.sql.SQLException { LoadFromDB("SELECT * FROM user WHERE id="+user_id,stmt,0); } public void LoadFromDB(String uname,Statement stmt) throws java.sql.SQLException { LoadFromDB("SELECT * FROM user WHERE username='"+uname+"'",stmt,0); } private void LoadFromDB(String query,Statement stmt,int i) throws java.sql.SQLException { ResultSet rs=stmt.executeQuery(query); rs.first(); setId(rs.getInt("user.id")); setUsername(rs.getString("user.Username")); setPassword(rs.getString("user.password")); setName(rs.getString("user.name")); setSurname(rs.getString("user.surname")); setBirthDay(rs.getInt("user.birth_day")); setBirthMonth(rs.getInt("user.birth_day")); setBirthYear(rs.getInt("user.birth_year")); setEmail(rs.getString("user.email")); setPhone(rs.getString("user.phone")); setCountry(rs.getInt("user.country")); setState(rs.getString("user.state")); setCity(rs.getString("user.city")); setZip(rs.getString("user.zip")); setAddress(rs.getString("user.address")); setStatus(rs.getString("user.status")); } }
src\com\madalina\muzzymoo\Mail\EMailClient.java package com.madalina.muzzymoo.Mail; import java.io.*; import java.util.*; import java.text.*; import java.util.Date; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; /** Collection of e-mail stuff that uses JavaMail. * @author Chris Lack */ public class EMailClient { private String address, sendHost, getHost, mailUser, mailPwd; /** * @param address e-mail address * @param getHost pop3 server * @param sendHost smtp server * @param mailUser username for e-mail servers * @param mailPwd password for e-mail se rvers */ public EMailClient (String address, String getHost, String sendHost, String mailUser, String mailPwd) { this.address = address; this.getHost = getHost; this.sendHost = sendHost; this.mailUser = mailUser;
91
this.mailPwd = mailPwd; } /** Send e-mail * @param recipients comma separated list of recipients * @param copies comma separated list of copy-to recipients * @param subject subject of email * @param bodyText e-mail message * @throws MessagingException * @throws AddressException * @throws NoSuchProviderException * @throws IOException */ public void send(String recipients, String copies, String subject, String bodyText) /*throws MessagingException, AddressException, NoSuchProviderException, IOException */ { try { // create some properties and get the default Session Properties props = System.getProperties(); props.put("mail.smtp.host", sendHost); Session session = Session.getDefaultInstance(props, null); session.setDebug(false); if(!(mailUser.equals("")&&mailPwd.equals(""))) { // Log onto pop server first as security protocol may require this Store store = session.getStore("pop3"); store.connect(getHost, mailUser, mailPwd); store.close(); } // Create a mime message MimeMessage mail = new MimeMessage(session); mail.setFrom(new InternetAddress(address)); StringTokenizer st = new StringTokenizer(recipients,","); InternetAddress[] recList = new InternetAddress[st.countTokens()]; for (int r = 0; st.hasMoreTokens(); r++) recList[r] = new InternetAddress(st.nextToken().trim()); mail.setRecipients(Message.RecipientType.TO, recList); st = new StringTokenizer(copies,","); InternetAddress[] copyList = new InternetAddress[st.countTokens()]; for (int c = 0; st.hasMoreTokens(); c++) copyList[c] = new InternetAddress(st.nextToken().trim()); mail.setRecipients(Message.RecipientType.CC, copyList); mail.setSubject(subject); mail.setText(bodyText,"iso-8859-1"); mail.setSentDate(new Date()); mail.setHeader("Content-Type","text/html"); // Send the message Transport trans = session.getTransport("smtp"); trans.connect(sendHost,"",""); //mailUser, mailPwd); trans.sendMessage(mail, mail.getAllRecipients()); trans.close(); } catch(Exception e) { } } }
92
src\com\madalina\muzzymoo\Mail\Mailer.java package com.madalina.muzzymoo.Mail; import com.madalina.muzzymoo.constants.CMail; import java.io.FileReader; import java.io.BufferedReader; import java.io.IOException;
public class Mailer extends Thread { MailSender email; String recipients; // String copies; String subject; String bodyText; String from; public Mailer() { } public void SendMessage(String recipients, String subject, String bodyText, String from) { this.recipients = recipients; this.subject = subject; this.bodyText = bodyText; this.from = from; this.start(); } public boolean SendFile(String recipients, String subject, S tring filename, String from) { this.recipients = recipients; this.subject = subject; this.from = from; bodyText=null; StringBuffer msg=new StringBuffer(); try { FileReader fr=new FileReader(filename); BufferedReader br=new BufferedReader(fr); String line; while(((line = br.readLine()) != null)) { msg.append(line); } bodyText=msg.toString(); } catch (IOException e) {} if(bodyText==null)return false; this.start(); return true; } public void run() { MailSender sender = new MailSender(recipients,subject,from,bodyText,CMail.send_protocol,CMail.send_server, CMail.username,CMail.password); } }
src\com\madalina\muzzymoo\Mail\MailSender.java /** * MsgSend.java * * @author Created by Omnicore CodeGuide
93
*/ package com.madalina.muzzymoo.Mail; /* * @(#)msgsend.java 1.17 03/04/22 * * Copyright 1997-2003 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the a bove copyright * notice, this list of conditions and the following disclaimer. * * - Redistribution in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND * ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES OR LIABILITIES * SUFFERED BY LICENSEE AS A RESULT OF OR RELATING TO USE, MODIFICATION * OR DISTRIBUTION OF THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR * FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, * ARISING OUT OF THE USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that Software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */ import java.io.*; import java.net.InetAddress; import java.util.Properties; import java.util.Date; import javax.mail.*; import javax.mail.internet.*; /** * Demo app that shows how to construct and send an RFC822 * (singlepart) message. * * XXX - allow more than one recipient on the command line * * @author Max Spivak * @author Bill Shannon */ public class MailSender { public MailSender(String to,String subject,String from,String msgBody, String protocol,String host,String user ,String password) { String url=null; String cc = null, bcc = null; String mailhost = host; String mailer = "msgsend"; String record = null; // name of folder in which to record mail boolean debug = false;
94
try { Properties props = System.getProperties(); // XXX - could use Session.getTransport() and Transport.connect() // XXX - assume we're using SMTP if (mailhost != null) props.put("mail.smtp.host", mailhost); // Get a Session object Session session = Session.getInstance(props, null); if (debug) session.setDebug(true); // construct the message Message msg = new MimeMessage(session); if (from != null) msg.setFrom(new InternetAddress(from)); else msg.setFrom(); // //
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false)); if (cc != null) msg.setRecipients(Message.RecipientType.CC,InternetAddress.parse(cc, false)); if (bcc != null) msg.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(to, false)); msg.setSubject(subject); msg.setText(msgBody); msg.setHeader("Content-Type","text/html"); msg.setHeader("X-Mailer", mailer); msg.setSentDate(new Date()); // send the thing off Transport.send(msg); System.out.println("\nMail was sent successfully."); // Keep a copy, if requested. if (record != null) { // Get a Store object Store store = null; if (url != null) { URLName urln = new URLName(url); store = session.getStore(urln); store.connect(); } else { if (protocol != null) store = session.getStore(protocol); else store = session.getStore(); // Connect if (host != null || user != null || password != null) store.connect(host, user, password); else store.connect(); } // Get record Folder. Create if it does not exist. Folder folder = store.getFolder(record); if (folder == null) { System.err.println("Can't get record folder."); System.exit(1); }
95
if (!folder.exists()) folder.create(Folder.HOLDS_MESSAGES); Message[] msgs = new Message[1]; msgs[0] = msg; folder.appendMessages(msgs); System.out.println("Mail was recorded successfully."); } } catch (Exception e) { e.printStackTrace(); } } }
src\com\madalina\muzzymoo\Utils\AuctionEnder.java /** * AuctionEnder.java * * @author Created by Omnicore CodeGuide */ package com.madalina.muzzymoo.Utils; import java.sql.Statement; import java.sql.ResultSet;
public class AuctionEnder { public static final long oneday=24*3600*1000; public static void CheckAucions(Statement stmt,State ment stmt2) throws java.sql.SQLException { long now=System.currentTimeMillis(); String query="SELECT id,reserved_price FROM products WHERE addedon+endsin*"+oneday+"<"+now; ResultSet rs=stmt.executeQuery(query); float hb=-1; while(rs.next()) { ResultSet rs2=stmt2.executeQuery("SELECT MAX(amount) FROM bids WHERE id_product="+rs.getInt(1)); hb=-1; if(rs2.next())hb=rs2.getFloat(1); if(hb>=rs.getInt(2))stmt2.executeUpdate("UPDATE products SET stat us=2 WHERE id="+rs.getInt(1)); else stmt2.executeUpdate("UPDATE products SET status=3 WHERE id="+rs.getInt(1)); } } }
src\com\madalina\muzzymoo\Utils\Formater.java /** * Formater.java * * @author Created by Omnicore CodeGuide */ package com.madalina.muzzymoo.Utils; public class Formater { public static String Money(float amount) { String money=""+amount; int index=money.indexOf('.'); if(index==-1)money+=".00";
96
else if(index==money.length()-2)money+="0"; return money; } }
src\com\madalina\muzzymoo\Utils\TemplateHTML.java package com.madalina.muzzymoo.Utils; import java.util.*; import java.io.*; import java.beans.*; //import Exception; public class TemplateHTML implements Serializable { private String sir=null; private StringBuffer sb=null; private String stringTemplate=null; private String nameTemplate=null; private Hashtable ht=null ; public String getNameTemplate(){return this.nameTemplate;} public void setNameTemplate(String nameTemplate){this.nameTemplate=nameTemplate;} public Hashtable getHt(){return this.ht;} public void setHt(Hashtable ht){this.ht=ht;} public TemplateHTML() { sb=new StringBuffer(); } public static ArrayList parseFile(String fileName) throws IOException,Exception { BufferedReader dis=null; ArrayList al=new ArrayList(); // String key=null; // String value=null; String pas1=null; String pas2=null; String pas3=null; String sir=null; int i=0; if (fileName==null) throw new Exception("fileName must not be null ! "); if (!(new File(fileName).exists() )) throw new Exception("File "+fileName+" must exist ! "); try { //dis=new DataInputStream(new FileInputStream(fileName)); dis =new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); while((sir=dis.readLine())!=null) { // System.out.println("Parsing line: "+sir); StringTokenizer st=new StringTokenizer(sir,"{}",true); int caut=1; while (st.hasMoreTokens()) { if (caut==1) { pas1=st.nextToken(); if (pas1.equals("{")) caut=2; //am gasit { ==> trec la pasul 2 } if ((caut==2) && (st.hasMoreTokens())) { pas2=(st.nextToken()).trim(); if (pas2.equals("{")) {caut=2;} else if ( pas2.equals("}") ) caut=1; //nu am gasit ce cautam else caut=3; }
97
if ((caut==3)&& (st.hasMoreTokens())) { pas3=st.nextToken(); if (pas3.equals("}")) { i++; if (pas2.indexOf (" ")==-1) al.add(pas2); //nu trebuie sa contina spatiu System.out.println(i+") am gasit pe :--> "+pas2); caut=1; } } } // end while } } catch (FileNotFoundException e) {//nu am gasit fisierul template System.out.println("File name not found"); throw new Exception("not valid "+fileName); } catch(NoSuchElementException e){System.out.println("NoSuchElementException: "+e.getMessage());System.out.println("pas1: "+pas1+" pas2: "+pas2+" pas3: "+pas3); e.printStackTrace(); } catch(Exception e){System.out.println("Eroare: "+e.getMessage()); e.printStackTrace(); } finally { dis.close();} return al; } public TemplateHTML(String nameTemplate,Hashtable ht) throws Exception { if ((nameTemplate==null)||(ht==null)) throw new Exception("nameTemplate/ht must not be null ! "); else { if (!(new File(nameTemplate).exists() )) throw new Exception("nameTemplate must exist ! "); this.nameTemplate=nameTemplate; this.ht=ht; sb=new StringBuffer();} } public TemplateHTML(String stringTemplate,String htString) throws Exception { if ((stringTemplate==null)||(htString==null)) throw new Exception("stringTemplate/HashTable MUST not be null ! "); this.stringTemplate =stringTemplate; this.ht=parseHashtable(htString); } public Hashtable parseHashtable(String htString) throws Exception { StringTokenizer st=new StringTokenizer(htString,"=;",true);//pattern: key=value;key=value,.... Hashtable hashtable=new Hashtable(); String key=null; String value=null; String pas=null; // int caut=1; while (st.hasMoreTokens()) { key=(String)st.nextToken(); if (st.hasMoreTokens()) pas=st.nextToken(); if (pas.equals(";")) value=""; else if (pas.equals("=") && st.hasMoreTokens()) { value=(String)st.nextToken(); if (st.hasMoreTokens()&& !((String)st.nextElement()).equals(";") ) throw new Exception("Invalid hashtable"); } else throw new Exception("Invalid hashtable"); //wrong hashtable.put(key,value); } return hashtable; }
//wrong
public BufferedReader setFileTemplate() throws Exception {
98
//
DataInputStream fileTemplate=null; if(stringTemplate!=null) { try { return new BufferedReader(new StringReader(stringTemplate)); } catch (Exception e) {//nu am gasit stringbuffer-ul System.out.println("stringTemplate couldn't be null"); throw new Exception("not valid stringTemplate"); } } else { if ((nameTemplate==null)||(ht==null)) throw new Exception("nameTemplate/ht must not be null ! "); try { return new BufferedReader(new InputStreamReader(new FileInputStream(nameTemplate))); } catch (FileNotFoundException e) {//nu am gasit fisierul template System.out.println("File Template not found"); throw new Exception("not valid Template"); } } }
public String transform(String nameDest) throws Exception,IOException { BufferedReader fileTemplate=null; DataOutputStream dos=null; StringBuffer sb=new StringBuffer(); String pas1=""; String pas2=""; String pas3=""; int i=0; fileTemplate=setFileTemplate(); Vector mul=new Vector(); Vector mul_k=new Vector(); boolean ismul=false; System.out.println("Template parser running"); // Enumeration elem=ht.elements(); // Enumeration key=ht.keys(); try { StringBuffer filecontent=new StringBuffer(); while((sir=fileTemplate.readLine())!=null) { filecontent.append(sir+"\r\n"); } StringTokenizer st=new StringTokenizer(filecontent.toString(),"{}",true); // int caut=1; if(st.hasMoreTokens())pas1=st.nextToken();else pas1=""; if(st.hasMoreTokens())pas2=st.nextToken();else pas2=""; if(st.hasMoreTokens())pas3=st.nextToken();else pas3=""; boolean hasMoreTokens=true; do { // System.out.println("pas1:"+pas1+"pas2:"+pas2+"pas3:"+pas3); if(pas1.equals("{")&&pas3.equals("}")||ismul) { i++; if(pas2.equals("*")||ismul) { if(ismul&&pas2.equals("*")) { ismul=false; boolean go=true; int keywords=0,matching_keywords=0; int passes=0; while(go) {
99
StringBuffer mul_b=new StringBuffer(); for(int j=0;jmatching_keywords)go=false; else sb.append(mul_b); passes+=1; } mul.clear(); mul_k.clear(); } else if(ismul) { if(pas1.equals("{")&&pas3.equals("}")) { String value=(String)ht.get(pas2); if (value!=null) { mul.add(pas2); mul_k.add(new Integer(1)); } else { System.out.println("Keyword NOT found: "+pas2); mul.add(pas1); mul_k.add(new Integer(0)); mul.add(pas2); mul_k.add(new Integer(0)); mul.add(pas3); mul_k.add(new Integer(0)); } } else { mul.add(pas1); mul_k.add(new Integer(0)); } } else ismul=true;
// //
} else { String value=(String)ht.get(pas2); if (value!=null) sb.append(value); else {sb.append(pas1);sb.append(pas2);sb.append(pas3);} } if(pas1.equals("{")&&pas3.equals("}")) { pas1=""; pas2=""; pas3=""; } System.out.println(mul); System.out.println(mul_k); } else
100
sb.append(pas1); pas1=pas2; pas2=pas3; hasMoreTokens=st.hasMoreTokens(); if(hasMoreTokens)pas3=st.nextToken();else pas3=""; } while (hasMoreTokens); sb.append(pas1); sb.append(pas2); sb.append("\r\n"); //
}
//System.out.println(sb.toString()); } catch(NoSuchElementException e){System.out.println("NoSuchElementException: "+e.getMessage());System.out.println("pas1: "+pas1+" pas2: "+pas2+" pas3: "+pas3); e.printStackTrace(); } catch(Exception e){System.out.println("Eroare: "+e.getMessage()); e.printStackTrace(); } finally { fileTemplate.close(); } if (nameDest!=null){ //daca vreau sa scriu si in fisier try { System.out.println("Write file: "+nameDest); dos=new DataOutputStream (new FileOutputStream(nameDest)); dos.writeBytes(sb.toString()); // dos.writeChars(sb.toString()); // System.out.println(sb); } finally { dos.close();} } return sb.toString(); } public static void main(String []args) { Hashtable keywords=new Hashtable(); String mailTemplate="test.htm"; keywords.put("content","This is the content replaced from the template file"); keywords.put("content0","This is the content replaced from the template file1"); keywords.put("content1","This is the content replaced from the template file2"); try { TemplateHTML templ=new TemplateHTML("c:/Program Files/Apache/Tomcat 5.0/webapps/muzzymoo/mails/templates/test.htm",keywords); String mailBody=templ.transform(null); } catch (Exception e) {} } }
auth\auth.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %> Untitled Document <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null;
101
stmt = db.createStatement(); %> <% System.out.println("Username in auth: "+request.getParameter("uname")); try { userBean.LoadFromDB(request.getParameter("uname"),stmt); if(userBean.getPassword().equals(request.getParameter("passwd"))) { session.setAttribute("uname",request.getParameter("uname")); System.out.println("Username in session"+session.getAttribute("uname")); session.setAttribute("userId",String.valueOf(userBean.getId())); if(session.getAttribute("cerere")!=null) response.sendRedirect((String)session.getAttribute("cerere")); else response.sendRedirect("../default.jsp"); } else response.sendRedirect("login.jsp?err=1"); } catch(Exception ex){response.sendRedirect("login.jsp?err=1");} %>
auth\checkSession.jsp <% String uname =(String)session.getAttribute("uname"); if(uname==null) { String cerere=request.getRequestURI(); if(request.getQueryString()!=null)cerere+="?"+request.getQueryString(); System.out.println("cerere="+cerere); session.setAttribute("cerere",cerere); response.sendRedirect(request.getContextPath()+"/auth/login.jsp"); return; } else { String revertTo=request.getParameter("page"); System.out.println("revert to in check Session "+revertTo); if(revertTo!=null) { response.sendRedirect(request.getContextPath()+revertTo); return; } } %>
auth\forgot.jsp <%@ page import="java.io.File" %> <%@ page import="com.madalina.muzzymoo.Mail.Mailer" %> <%@ page import="com.madalina.muzzymoo.Utils.TemplateHTML" %> <%@ page import="java.util.Hashtable" %> <%@ page import="java.sql.SQLException" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> Forgot password <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <% Connection db = null;
102
%> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% try { userBean.LoadFromDB(request.getParameter("uname"),stmt); Hashtable keywords=new Hashtable(); keywords.put("name",userBean.getName()); keywords.put("username",userBean.getUsername()); keywords.put("password",userBean.getPassword()); String mailTemplate="forgot.htm"; TemplateHTML templ=new TemplateHTML(this.getServletContext().getRealPath("") +File.separator+"mails"+File.separator+"templates"+File.separator+mailTemplate,keywords); String mailBody=templ.transform(null); Mailer em=new Mailer(); em.SendMessage(userBean.getEmail(),"Password reminder for your accout at MuzzyMoo",mailBody,"MuzzyMoo"); } catch (java.sql.SQLException e) {} %> <%@include file="../include/header.jsp"%> <%@include file="../include/mainTabs.jsp"%> An email containing your password has been send to your email address. Thank you for using MuzzyMoo's services. Home
<%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
103
auth\login.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> MuzzyMoo LogIn <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <% int err=0; if(request.getParameter("err")!=null&&!"".equals(request.getParameter("err"))) err=Integer.parseInt(request.getParameter("err")); %> <%@include file="../include/header.jsp"%>
104
You can begin browsing trough products by selecting a c ategory from the upper menu
Welcome to MuzzyMoo Login Area
<%if(err==1){%>Incorrect login! Please try again. <%}%>
<%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
auth\logout.jsp <% session.removeAttribute("uname"); response.sendRedirect(request.getContextPath()+"/default.jsp"); %>
include\addproduct.jsp <%@ page import="com.madalina.muzzymoo.javabeans.Product" %><% Product prod=new Product(request); %> <script language="JavaScript" src="js/popup.js"> <% if(id>0){%> <script language="JavaScript"> newproduct.submit.focus(); <%}%>
include\categsMap.jsp /products.jsp?pc=<%=Const.level1_ids[0]%>"> /products.jsp?pc=<%=Const.level1_ids[1]%>"> /products.jsp?pc=<%=Const.level1_ids[2]%>"> /products.jsp?pc=<%=Const.level1_ids[3]%>"> /products.jsp?pc=<%=Const.level1_ids[4]%>"> /products.jsp?pc=<%=Const.level1_ids[5]%>">
include\comboValues.js // JavaScript Document function AddYear2Select(selectID,min) { var i,l,year,date; date=new Date(); year=date.getYear()+1; if(selectID.options) l=selectID.options.length; else l=0; for (i=0;i+min<=year;i++)selectID.options[i]=new Option(i+min,i+min); selectID.options[i]=new Option("Year",0); selectID.selectedIndex=selectID.options.length-1; } function AddDay2Select(selectID,min){ var i,l,year,day; //date=new Date(); day=31; if(selectID.options) l=selectID.options.length; else l=0; for (i=0;i+min<=day;i++)selectID.options[i]=new Option(i+min,i+min); selectID.options[i]=new Option("Day",0); selectID.selectedIndex=selectID.options.length-1; }
include\db.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <% Class.forName("com.mysql.jdbc.Driver").newInstance(); db = java.sql.DriverManager.getConnection(Const.db_string); %>
108
include\footer.jsp <script language="javascript"> var newWin; function openPopupLow(filename,popupname){ mywidth = 700; myheight = 500; myleft = (screen.width - mywidth) / 2; mytop = (screen.height - myheight) / 2; newWin = window.open(filename, popupname, 'width='+mywidth+',height='+myheight+',scrollbars=1,resizable=0,menubar=0,toolbar=0,status=1,location=0,directories=0,left='+myleft+',top='+myto p); newWin.focus(); }
include\header.jsp
include\mainTabs.jsp <% String spage=request.getRequestURI(); spage=spage.substring(spage.lastIndexOf("/")+1); %> /img/<%if(spage.indexOf("default.jsp")==("default.jsp")==1)out.print("in");%>activCorner.jpg"> Bg">
110
/img/<%if(spage.indexOf("register.jsp")==("register.jsp")==1&&spage.indexOf("makeUser.jsp")==-1)out.print("in");%>activCorner.jpg"> Bg">
/img/<%if(spage.indexOf("login.jsp")==("login.jsp")==1)out.print("in");%>activCorner.jpg"> Bg">
/img/<%if(spage.indexOf("mypage.jsp")==("mypage.jsp")==1&&spage.indexOf("update.jsp")==-1&&spage.indexOf("saveData.jsp") 1&&spage.indexOf("update.jsp")==-1&&spage.indexOf("saveData.jsp")==-1&&spage.indexOf("changePass.jsp ==-1&&spage.indexOf("changePass.jsp")==")==1&&spage.indexOf("deleteAccount.jsp")==-1&&spage.indexOf("doCh 1&&spage.indexOf("deleteAccoun t.jsp")==-1&&spage.indexOf("doChange.jsp")==-1)out.print("in");%>activCorner.jpg ange.jsp")==-1)out.print("in");%>activCorner.jpg"> "> Bg">
You can begin browsing trough products by selecting a c ategory from the upper menu
111
include\months.jsp <%! private static final String [] monthArray = {"","January","February","March","April","May","June","July","August","September","October","November","December"}; {"","January","February","March","April","May","June","July","August","September", "October","November","December"}; %>
include\scroll.jsp <%@ page import="com.madalina.muzzymoo.Utils.Formater" %><%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.Connection" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="com.madalina.muzzymoo.javabeans.* import="com.madalina.muzzymoo.javabeans.*"%> "%> <%! String FormatSpecDescr(String descr) { int no_enter=0; int max_enter=3; int pos_enter=0; while(no_enter=0) { pos_enter=descr.indexOf("\n",pos_enter+1); pos_enter=descr.indexOf("\n",p os_enter+1); // System.out.println(pos_enter); no_enter++; } if(pos_enter>0)descr=descr.substring(0,pos_enter-1); descr=descr.replaceAll("\r",""); descr=descr.replaceAll("\n","\\\\r\\\\n"); // System.out.println("|"+descr+"|"); // if(!descr.startsWith(""))descr=" "+descr; return descr; } %> <% Connection db_scroll = null; Class.forName("com.mysql.jdbc.Driver").newInstance(); db_scroll = java.sql.DriverManager.getConnection(Con java.sql.DriverManager.getConnection(Const.db_string); st.db_string); Statement stmt_scroll = null; stmt_scroll = db_scroll.createStatement(); ResultSet rs_scroll=null; %> <script language="JavaScript"> //Specify the marquee's content (don't delete tag) //Keep all content on ONE line, and backslash any single quotations (ie: that\'s great): <% rs_scroll=stmt_scroll.executeQuery("SELECT * FROM products WHERE id_categ="+Const.pc_special_cat); String scroll_text=""; while(rs_scroll.next()) { Product pr=new Product(rs_scroll); scroll_text+=""+pr.getBrand()+" +"&pc="+pr.getId_categ()+"'>"+pr.getBrand ()+" "+pr.getModel()+": $"+Formater.Money(pr.getPrice())+" "; scroll_text+=" "; } %> var marqueecontent="<%=scroll_text%> ";
include\templateNavigate.jsp <%@ page import="java.util.*"%> <%//long addsTotal=0,addsStartPos=0,addsPer addsTotal=0,addsStartPos=0,addsPerPage=0;%> Page=0;%>
112
<% if(addsTotal<0)addsTotal=0; if(addsStartPos+1>addsTotal)addsStartPos=addsTotal-1; long firstAdShowed=addsStartPos+1; if(firstAdShowed<=0)firstAdShowed=0; if(firstAdShowed>addsStartPos+1)firstAdShowed=addsStartPos+1; %> Showing products <%=firstAdShowed%> - <%=addsStartPos+addsPerPage of <%=addsTotal%> <%! public static final int adsBefore=5; public static final int adsAfter=5; public static final int ff=10; public static final int rev=10; %> <% if(addsTotal!=0) { String query_string=null,pageName=null; if(request.getAttribute("queryString")!=null) query_string=(String)request.getAttribute("queryString"); else query_string=request.getQueryString(); if(request.getAttribute("URI")!=null) pageName=(String)request.getAttribute("URI"); else pageName=request.getRequestURI(); String newQuery=""; if(query_string!=null) { StringTokenizer req=new StringTokenizer(query_string,"&",false); String tok=null; int eqIndex; while(req.hasMoreTokens()) { tok=req.nextToken(); if((!tok.startsWith("addsPerPage"))&&(!tok.startsWith("addsStartPos"))) newQuery+=tok+"&"; } }
if(newQuery.length()>2) query_string=pageName+"?"+newQuery; else query_string=pageName+"?"; long j; long nrOfPages=addsTotal/addsPerPage; if(addsTotal%addsPerPage!=0)nrOfPages++; long curPage=addsStartPos/addsPerPage; long firstPage=curPage-adsBefore; if(firstPage<0)firstPage=0; long lastPage=curPage+adsAfter; if(lastPage>nrOfPages-1)lastPage=nrOfPages-1; long nextPage=curPage+1; if(nextPage>lastPage)nextPage=lastPage; long prevPage=curPage-1; if(prevPage<0)prevPage=0; long ffp=curPage+ff; if(ffp>nrOfPages-1)ffp=nrOfPages-1; long revp=curPage-rev; if(revp<=0)revp=0;
113
out.print("Previous "); for(j=firstPage;j"+(j+1)+" "); out.print(" "+(curPage+1)+" "); for(j=curPage+1;j<=lastPage;j++) out.print(""+(j+1)+" "); // if(lastPage!=curPage) out.print(" Next "); %> <% } %>
js\comboValues.js // JavaScript Document function AddYear2Select(selectID,min) { var i,l,year,date; date=new Date(); year=date.getYear()+1; if(selectID.options) l=selectID.options.length; else l=0; for (i=0;i+min<=year;i++)selectID.options[i]=new Option(i+min,i+min); selectID.options[i]=new Option("Year",0); selectID.selectedIndex=selectID.options.length-1; } function AddDay2Select(selectID,min){ var i,l,year,day; //date=new Date(); day=31; if(selectID.options) l=selectID.options.length; else l=0; for (i=0;i+min<=day;i++)selectID.options[i]=new Option(i+min,i+min); selectID.options[i]=new Option("Day",0); selectID.selectedIndex=selectID.options.length-1; }
js\country.js var co = new Array(); var cco = new Array(); co.def="USA"; co[0]=['AFG','Afghanistan',4];cco[4]=0; co[1]=['ALB','Albania, Socialist Republic of',8];cco[8]=1; co[2]=['DZA','Algeria, Democratic Republic of',12];cco[12]=2; co[3]=['ASM','American Samoa',16];cco[16]=3; co[4]=['AND','Andorra, Principality of',20];cco[20]=4; co[5]=['AGO','Angola, Republic of',24];cco[24]=5; co[6]=['AIA','Anguilla',660];cco[660]=6; co[7]=['ATA','Antarctica',10];cco[10]=7; co[8]=['ATG','Antigua and Barbuda',28];cco[28]=8; co[9]=['ARG','Argentina, Argentine Republic',32];cco[32]=9; co[10]=['ARM','Armenia',51];cco[51]=10; co[11]=['ABW','Aruba',533];cco[533]=11; co[12]=['AUS','Australia, Commonwealth of',36];cco[36]=12; co[13]=['AUT','Austria, Republic of',40];cco[40]=13; co[14]=['AZE','Azerbaijan, Republic of',31];cco[31]=14; co[15]=['BHS','Bahamas, Commonwealth of the',44];cco[44]=15; co[16]=['BHR','Bahrain, Kingdom of',48];cco[48]=16; co[17]=['BGD','Bangladesh, Republic of',50];cco[50]=17;
114
co[18]=['BRB','Barbados',52];cco[52]=18; co[19]=['BLR','Belarus',112];cco[112]=19; co[20]=['BEL','Belgium, Kingdom of',56];cco[56]=20; co[21]=['BLZ','Belize',84];cco[84]=21; co[22]=['BEN','Benin, Republic of',204];cco[204]=22; co[23]=['BMU','Bermuda',60];cco[60]=23; co[24]=['BTN','Bhutan, Kingdom of',64];cco[64]=24; co[25]=['BOL','Bolivia, Republic of',68];cco[68]=25; co[26]=['BIH','Bosnia and Herzegovina',70];cco[70]=26; co[27]=['BWA','Botswana, Republic of',72];cco[72]=27; co[28]=['BVT','Bouvet Island (Bouvetoya)',74];cco[74]=28; co[29]=['BRA','Brazil, Federative Republic of',76];cco[76]=29; co[30]=['IOT','British Indian Ocean Territory',86];cco[86]=30; co[31]=['VGB','British Virgin Islands',92];cco[92]=31; co[32]=['BRN','Brunei Darussalam',96];cco[96]=32; co[33]=['BGR','Bulgaria, Republic of',100];cco[100]=33; co[34]=['BFA','Burkina Faso',854];cco[854]=34; co[35]=['BDI','Burundi, Republic of',108];cco[108]=35; co[36]=['KHM','Cambodia, Kingdom of',116];cco[116]=36; co[37]=['CMR','Cameroon, United Republic of',120];cco[120]=37; co[38]=['CAN','Canada',124];cco[124]=38; co[39]=['CPV','Cape Verde, Republic of',132];cco[132]=39; co[40]=['CYM','Cayman Islands',136];cco[136]=40; co[41]=['CAF','Central African Republic',140];cco[140]=41; co[42]=['TCD','Chad, Republic of',148];cco[148]=42; co[43]=['CHL','Chile, Republic of',152];cco[152]=43; co[44]=['CHN','China, People`s Republic of',156];cco[156]=44; co[45]=['CXR','Christmas Island',162];cco[162]=45; co[46]=['CCK','Cocos (Keeling) Islands',166];cco[166]=46; co[47]=['COL','Colombia, Republic of',170];cco[170]=47; co[48]=['COM','Comoros, Federal and Islamic Republic of',174];cco[174]=48; co[49]=['COD','Congo, Democratic Republic of',180];cco[180]=49; co[50]=['COG','Congo, People`s Republic of',178];cco[178]=50; co[51]=['COK','Cook Islands',184];cco[184]=51; co[52]=['CRI','Costa Rica, Republic of',188];cco[188]=52; co[53]=['CIV','Cote D`Ivoire, Republic of',384];cco[384]=53; co[54]=['CUB','Cuba, Republic of',192];cco[192]=54; co[55]=['CYP','Cyprus, Republic of',196];cco[196]=55; co[56]=['CZE','Czech Republic',203];cco[203]=56; co[57]=['DNK','Denmark, Kingdom of',208];cco[208]=57; co[58]=['DJI','Djibouti, Republic of',262];cco[262]=58; co[59]=['DMA','Dominica, Commonwealth of',212];cco[212]=59; co[60]=['DOM','Dominican Republic',214];cco[214]=60; co[61]=['TLS','East Timor, Democratic Republic of',626];cco[626]=61; co[62]=['ECU','Ecuador, Republic of',218];cco[218]=62; co[63]=['EGY','Egypt, Arab Republic of',818];cco[818]=63; co[64]=['SLV','El Salvador, Republic of',222];cco[222]=64; co[65]=['GNQ','Equatorial Guinea, Republic of',226];cco[226]=65; co[66]=['ERI','Eritrea',232];cco[232]=66; co[67]=['EST','Estonia',233];cco[233]=67; co[68]=['ETH','Ethiopia',231];cco[231]=68; co[69]=['FRO','Faeroe Islands',234];cco[234]=69; co[70]=['FLK','Falkland Islands (Malvinas)',238];cco[238]=70; co[71]=['FJI','Fiji, Republic of ',242];cco[242]=71; co[72]=['FIN','Finland, Republic of',246];cco[246]=72; co[73]=['FRA','France, French Republic',250];cco[250]=73; co[74]=['GUF','French Guiana',254];cco[254]=74; co[75]=['PYF','French Polynesia',258];cco[258]=75; co[76]=['ATF','French Southern Territories',260];cco[260]=76; co[77]=['GAB','Gabon, Gabonese Republic',266];cco[266]=77; co[78]=['GMB','Gambia, Republic of t he',270];cco[270]=78; co[79]=['GEO','Georgia',268];cco[268]=79; co[80]=['DEU','Germany',276];cco[276]=80; co[81]=['GHA','Ghana, Republic of',288];cco[288]=81; co[82]=['GIB','Gibraltar',292];cco[292]=82; co[83]=['GRC','Greece, Hellenic Republic',300];cco[300]=83; co[84]=['GRL','Greenland',304];cco[304]=84; co[85]=['GRD','Grenada',308];cco[308]=85; co[86]=['GLP','Guadaloupe',312];cco[312]=86; co[87]=['GUM','Guam',316];cco[316]=87; co[88]=['GTM','Guatemala, Republic of',320];cco[320]=88; co[89]=['GIN','Guinea, Republic of',324];cco[324]=89;
115
co[90]=['GNB','Guinea-Bissau, Republic of',624];cco[624]=90; co[91]=['GUY','Guyana, Republic of',328];cco[328]=91; co[92]=['HTI','Haiti, Republic of',332];cco[332]=92; co[93]=['HMD','Heard and McDonald Islands',334];cco[334]=93; co[94]=['VAT','Holy See (Vatican City State)',336];cco[336]=94; co[95]=['HND','Honduras, Republic of',340];cco[340]=95; co[96]=['HKG','Hong Kong',344];cco[344]=96; co[97]=['HRV','Hrvatska (Croatia)',191];cco[191]=97; co[98]=['HUN','Hungary, People`s Republic',348];cco[348]=98; co[99]=['ISL','Iceland, Republic of',352];cco[352]=99; co[100]=['IND','India, Republic of',356];cco[356]=100; co[101]=['IDN','Indonesia, Republic of',360];cco[360]=101; co[102]=['IRN','Iran, United Iranian States',364];cco[364]=102; co[103]=['IRQ','Iraq, Republic of',368];cco[368]=103; co[104]=['IRL','Ireland',372];cco[372]=104; co[105]=['ISR','Israel, State of',376];cco[376]=105; co[106]=['ITA','Italy, Italian Republic',380];cco[380]=106; co[107]=['JAM','Jamaica',388];cco[388]=107; co[108]=['JPN','Japan',392];cco[392]=108; co[109]=['JOR','Jordan, Hashemite Kingdom of',400];cco[400]=109; co[110]=['KAZ','Kazakhstan, Republic of',398];cco[398]=110; co[111]=['KEN','Kenya, Republic of',404];cco[404]=111; co[112]=['KIR','Kiribati, Republic of',296];cco[296]=112; co[113]=['PRK','Korea, Democratic People`s Republic of',408];cco[408]=113; co[114]=['KOR','Korea, Republic of',410];cco[410]=114; co[115]=['KWT','Kuwait, State of',414];cco[414]=115; co[116]=['KGZ','Kyrgyz Republic',417];cco[417]=116; co[117]=['LAO','Lao People`s Democratic Republic',418];cco[418]=117; co[118]=['LVA','Latvia',428];cco[428]=118; co[119]=['LBN','Lebanon, Lebanese Republic',422];cco[422]=119; co[120]=['LSO','Lesotho, Kingdom of',426];cco[426]=120; co[121]=['LBR','Liberia, Republic of',430];cco[430]=121; co[122]=['LBY','Libyan Arab Jamahiriya',434];cco[434]=122; co[123]=['LIE','Liechtenstein, Principality of',438];cco[438]=123; co[124]=['LTU','Lithuania',440];cco[440]=124; co[125]=['LUX','Luxembourg, Grand Duchy of',442];cco[442]=125; co[126]=['MAC','Macao',446];cco[446]=126; co[127]=['MKD','Macedonia, Republic of',807];cco[807]=127; co[128]=['MDG','Madagascar, Republic of',450];cco[450]=128; co[129]=['MWI','Malawi, Republic of',454];cco[454]=129; co[130]=['MYS','Malaysia',458];cco[458]=130; co[131]=['MDV','Maldives, Republic of',462];cco[462]=131; co[132]=['MLI','Mali, Republic of',466];cco[466]=132; co[133]=['MLT','Malta, Republic of',470];cco[470]=133; co[134]=['MHL','Marshall Islands',584];cco[584]=134; co[135]=['MTQ','Martinique',474];cco[474]=135; co[136]=['MRT','Mauritania, Islamic Republic of',478];cco[478]=136; co[137]=['MUS','Mauritius',480];cco[480]=137; co[138]=['MYT','Mayotte',175];cco[175]=138; co[139]=['MEX','Mexico, United Mexican States',484];cco[484]=139; co[140]=['FSM','Micronesia, Federated States of',583];cco[583]=140; co[141]=['MDA','Moldova, Republic of',498];cco[498]=141; co[142]=['MCO','Monaco, Principality of',492];cco[492]=142; co[143]=['MNG','Mongolia, People`s Republic',496];cco[496]=143; co[144]=['MSR','Montserrat',500];cco[500]=144; co[145]=['MAR','Morocco, Kingdom of',504];cco[504]=145; co[146]=['MOZ','Mozambique, People`s Republic of',508];cco[508]=146; co[147]=['MMR','Myanmar',104];cco[104]=147; co[148]=['NAM','Namibia',516];cco[516]=148; co[149]=['NRU','Nauru, Republic of',520];cco[520]=149; co[150]=['NPL','Nepal, Kingdom of',524];cco[524]=150; co[151]=['ANT','Netherlands Antilles',530];cco[530]=151; co[152]=['NLD','Netherlands, Kingdom of the',528];cco[528]=152; co[153]=['NCL','New Caledonia',540];cco[540]=153; co[154]=['NZL','New Zealand',554];cco[554]=154; co[155]=['NIC','Nicaragua, Republic of',558];cco[558]=155; co[156]=['NER','Niger, Republic of the',562];cco[562]=156; co[157]=['NGA','Nigeria, Federal Republic of',566];cco[566]=157; co[158]=['NIU','Niue, Republic of',570];cco[570]=158; co[159]=['NFK','Norfolk Island',574];cco[574]=159; co[160]=['MNP','Northern Mariana Islands',580];cco[580]=160; co[161]=['NOR','Norway, Kingdom of',578];cco[578]=161;
116
co[162]=['OMN','Oman, Sultanate of',512];cco[512]=162; co[163]=['PAK','Pakistan, Islamic Republic of',586];cco[586]=163; co[164]=['PLW','Palau',585];cco[585]=164; co[165]=['PSE','Palestinian Territory, Occupied',275];cco[275]=165; co[166]=['PAN','Panama, Republic of',591];cco[591]=166; co[167]=['PNG','Papua New Guinea',598];cco[598]=167; co[168]=['PRY','Paraguay, Republic of',600];cco[600]=168; co[169]=['PER','Peru, Republic of',604];cco[604]=169; co[170]=['PHL','Philippines, Republic of the',608];cco[608]=170; co[171]=['PCN','Pitcairn Island',612];cco[612]=171; co[172]=['POL','Poland, People`s Republic',616];cco[616]=172; co[173]=['PRT','Portugal, Portuguese Republic',620];cco[620]=173; co[174]=['PRI','Puerto Rico',630];cco[630]=174; co[175]=['QAT','Qatar, State of',634];cco[634]=175; co[176]=['REU','Reunion',638];cco[638]=176; co[177]=['ROU','Romania',642];cco[642]=177; co[178]=['RUS','Russian Federation',643];cco[643]=178; co[179]=['RWA','Rwanda, Rwandese Republic',646];cco[646]=179; co[180]=['WSM','Samoa, Independent State of',882];cco[882]=180; co[181]=['SMR','San Marino, Republic of',674];cco[674]=181; co[182]=['STP','Sao Tome and Principe, Democratic Republic of',678];cco[678]=182; co[183]=['SAU','Saudi Arabia, Kingdom of',682];cco[682]=183; co[184]=['SEN','Senegal, Republic of',686];cco[686]=184; co[185]=['SYC','Seychelles, Republic of',690];cco[690]=185; co[186]=['SLE','Sierra Leone, Republic of',694];cco[694]=186; co[187]=['SGP','Singapore, Republic of',702];cco[702]=187; co[188]=['SVK','Slovakia (Slovak Republic)',703];cco[703]=188; co[189]=['SVN','Slovenia',705];cco[705]=189; co[190]=['SLB','Solomon Islands',90];cco[90]=190; co[191]=['SOM','Somalia, Somali Republic',706];cco[706]=191; co[192]=['ZAF','South Africa, Republic of',710];cco[710]=192; co[193]=['SGS','South Georgia and the South Sandwich Islands',239];cco[239]=193; co[194]=['ESP','Spain, Spanish State',724];cco[724]=194; co[195]=['LKA','Sri Lanka, Democratic Socialist Republic of',144];cco[144]=195; co[196]=['SHN','St. Helena',654];cco[654]=196; co[197]=['KNA','St. Kitts and Nevis',659];cco[659]=197; co[198]=['LCA','St. Lucia',662];cco[662]=198; co[199]=['SPM','St. Pierre and Miquelon',666];cco[666]=199; co[200]=['VCT','St. Vincent and the Grenadines',670];cco[670]=200; co[201]=['SDN','Sudan, Democratic Republic of the',736];cco[736]=201; co[202]=['SUR','Suriname, Republic of',740];cco[740]=202; co[203]=['SJM','Svalbard & Jan Mayen Islands',744];cco[744]=203; co[204]=['SWZ','Swaziland, Kingdom of',748];cco[748]=204; co[205]=['SWE','Sweden, Kingdom of',752];cco[752]=205; co[206]=['CHE','Switzerland, Swiss Confederation',756];cco[756]=206; co[207]=['SYR','Syrian Arab Republic',760];cco[760]=207; co[208]=['TWN','Taiwan, Province of China',158];cco[158]=208; co[209]=['TJK','Tajikistan',762];cco[762]=209; co[210]=['TZA','Tanzania, United Republic of',834];cco[834]=210; co[211]=['THA','Thailand, Kingdom of',764];cco[764]=211; co[212]=['TGO','Togo, Togolese Republic',768];cco[768]=212; co[213]=['TKL','Tokelau (Tokelau Islands)',772];cco[772]=213; co[214]=['TON','Tonga, Kingdom of',776];cco[776]=214; co[215]=['TTO','Trinidad and Tobago, Republic of',780];cco[780]=215; co[216]=['TUN','Tunisia, Republic of',788];cco[788]=216; co[217]=['TUR','Turkey, Republic of',792];cco[792]=217; co[218]=['TKM','Turkmenistan',795];cco[795]=218; co[219]=['TCA','Turks and Caicos Islands',796];cco[796]=219; co[220]=['TUV','Tuvalu',798];cco[798]=220; co[221]=['UGA','Uganda, Republic of',800];cco[800]=221; co[222]=['UKR','Ukraine',804];cco[804]=222; co[223]=['ARE','United Arab Emirates',784];cco[784]=223; co[224]=['GBR','United Kingdom of Great Britain & N. Ireland',826];cco[826]=224; co[225]=['UMI','United States Minor Outlying Islands',581];cco[581]=225; co[226]=['USA','United States of America',840];cco[840]=226; co[227]=['URY','Uruguay, Eastern Republic of',858];cco[858]=227; co[228]=['VIR','US Virgin Islands',850];cco[850]=228; co[229]=['UZB','Uzbekistan',860];cco[860]=229; co[230]=['VUT','Vanuatu',548];cco[548]=230; co[231]=['VEN','Venezuela, Bolivarian Republic of',862];cco[862]=231; co[232]=['VNM','Viet Nam, Socialist Republic of',704];cco[704]=232; co[233]=['WLF','Wallis and Futuna Islands',876];cco[876]=233;
117
co[234]=['ESH','Western Sahara',732];cco[732]=234; co[235]=['YEM','Yemen',887];cco[887]=235; co[236]=['YUG','Yugoslavia, Socialist Federal Republic of',891];cco[891]=236; co[237]=['ZMB','Zambia, Republic of',894];cco[894]=237; co[238]=['ZWE','Zimbabwe',716];cco[716]=238;
js\popup.js var newWin; function openPopup(filename,popupname){ mywidth = 700; myheight = 400; myleft = (screen.width - mywidth) / 2; mytop = (screen.height - myheight) / 2; newWin = window.open(filename, popupname, 'width='+mywidth+',height='+myheight+',scrollbars=1,resizable=0,menubar=0,toolbar=0,status=1,location=0,directories=0,left='+myleft+',top='+myto p); newWin.focus(); }
js\scroll.js //Specify the marquee's width (in pixels) var marqueewidth="600px" //Specify the marquee's height var marqueeheight="20px" //Specify the marquee's marquee speed (larger i s faster 1-10) var marqueespeed=2 //configure background color: var marqueebgcolor="#B5CBDB" //Pause marquee onMousever (0=no. 1=yes)? var pauseit=1 ////NO NEED TO EDIT BELOW THIS LINE//////////// marqueespeed=(document.all)? marqueespeed : Math.max(1, marqueespeed-1) //slow speed down by 1 for NS var copyspeed=marqueespeed var pausespeed=(pauseit==0)? copyspeed: 0 var iedom=document.all||document.getElementById if (iedom) document.write(''+marqueecontent+' ') var actualwidth='' var cross_marquee, ns_marquee function populate(){ if (iedom){ cross_marquee=document.getElementById? document.getElementById("iemarquee") : document.all.iemarquee cross_marquee.style.left=parseInt(marqueewidth)+8+"px" cross_marquee.innerHTML=marqueecontent actualwidth=document.all? temp.offsetWidth : document.getElementById("temp").offsetWidth } else if (document.layers){ ns_marquee=document.ns_marquee.document.ns_marquee2 ns_marquee.left=parseInt(marqueewidth)+8 ns_marquee.document.write(marqueecontent) ns_marquee.document.close() actualwidth=ns_marquee.document.width } lefttime=setInterval("scrollmarquee()",20) } window.onload=populate function scrollmarquee(){ if (iedom){ if (parseInt(cross_marquee.style.left)>(actualwidth*(-1)+8)) cross_marquee.style.left=parseInt(cross_marquee.style.left)-copyspeed+"px" else cross_marquee.style.left=parseInt(marqueewidth)+8+"px" }
118
else if (document.layers){ if (ns_marquee.left>(actualwidth*(-1)+8)) ns_marquee.left-=copyspeed else ns_marquee.left=parseInt(marqueewidth)+8 } } if (iedom||document.layers){ with (document){ document.write('') if (iedom){ write('') } else if (document.layers){ write('') write(' ') write(' ') } document.write('
') } }
js\vector2select.js function vect2sel(vect,sel,defVal,nodel) { k=0; if(!nodel)sel.options.length=0;else if(nodel<0)k=sel.options.length; else {k=nodel;sel.options.length=nodel;} if(defVal=="")defVal=vect.def; var opt; index=0; for(i=0;i
mails\templates\bid.htm Bid Notofication <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> MuzzyMoo Bid Notification. Hello {name},
119
I am MuzzyMoo's bid notification module. There has been a bid posted to your auction: Colour: {color} RRP: ${rrp} Price: ${hb} Bidder: {hbbidder} <%if(showDescr){%> <%}%> <%if(showDescr){%> <%}else{%> {keyfeatures} More ... <%}%>
mails\templates\forgot.htm Password Reminder <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> MuzzyMoo Password Re minder. Hello{name}, I am MuzzyMoo's passowrd reminder module. Here is the information you required: Your password for username {username} is {password}.
120
user\changePass.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> MuzzyMoo - Update User Details <script language="JavaScript"> function valid(){ if (document.chPass.npassword.value!=document.chPass.rnpassword.value){ alert("Typed & Retyped Password do not match."); return false; } if( (document.chPass.npassword.value.length<6) || (document.chPass.npassword.value.length>20)){ alert("Password must have between 6 and 20 character") return false } return true; } <% Connection db = null; %> <%@ include file="../auth/checkSession.jsp"%> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% userBean.LoadFromDB(uname,stmt); %> <%@include file="../include/header.jsp"%> <%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
122
user\deleteAccount.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> MuzzyMoo - New Account <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@include file="../include/months.jsp"%> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <%@ include file="../auth/checkSession.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% userBean.LoadFromDB(uname,stmt); %> <%@include file="../include/header.jsp"%> <%@include file="../include/mainTabs.jsp"%> Welcome <%=uname%>.You are about to delete your account
123
Username <%=userBean.getUsername()%>
Name <%=userBean.getName()%> Surname <%=userBean.getSurname()%> Birth Date <%if(userBean.getBirthMonth()==0||userBean.getBirthYear()==0||userBean.getBirthDay()==0) out.print("Not Specified"); else{ out.print(monthArray[userBean.getBirthMonth()]+" • "+userBean.getBirthDay() +" • "+userBean.getBirthYear()); }%>
Country <script language="JavaScript"> var ccoSec = cco[<%=userBean.getCountry()%>]; document.write(co[cco[<%=userBean.getCountry()%>]][1]); Address <%=userBean.getAddress()%> Town <%=userBean.getCity()%> County <%=userBean.getState()%> Postalcode <%=userBean.getZip()%>
124
Email <%=userBean.getEmail()%> Daytime Phone <%=userBean.getPhone()%> Evening Phone <%=userBean.getStatus()%>
Delete Account
<%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
user\doChange.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> MuzzyMoo - Update User Details <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% String uname=(String)session.getAttribute("uname"); String password=request.getParameter("password"); System.out.println("Name_ "+userBean.getName()); int action=0; userBean.LoadFromDB(uname,stmt);
125
if(password.equals(userBean.getPassword())){ action=1; userBean.setPassword(password); userBean.UpdateToDBPasswd(stmt); }else action=2; %> <%@include file="../include/header.jsp"%> <%@include file="../include/mainTabs.jsp"%> Welcome <%=uname%>. Changing your password
<%if(action==1){%> Password Succesefully ChangedBack to My Page <%}else{%>Incorect password. Please try again. <%}%>
126
<%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
user\doDelete.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*" errorPage="" %> Untitled Document <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <%@ include file="../auth/checkSession.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% userBean.setUsername(uname); userBean.RemoveAccount(stmt); response.sendRedirect("../auth/logout.jsp"); %>
user\makeUser.jsp <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> MuzzyMoo - New Account <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@include file="../include/months.jsp"%> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); int update=0; if(request.getParameter("update")!=null) update = Integer.parseInt(request.getParameter("upd Integer.parseInt(request.getParameter("update")); ate")); %> <% if(update==0){ userBean.getFormData(request); userBean.SaveToDB(stmt); }else{
127
userBean.getFormData(request); userBean.UpdateToDB(stmt); } %> <%@include file="../include/header.jsp"%>
<%@include file="../include/mainTabs.jsp"%> <%if(update==0){%> Welcome to MuzzyMoo registration process
<%}else{%> Welcome <%=(String)session.getAttribute("uname")%>. Your details have been changed to
<%}%>
<%if(userBean.getErrMsg()==1){%> Username <%=userBean.getUsername()%> is taken. Plea se choose another. <%}else{%> Username <% if(update==0){ out.print(userBean.getUsername());
128
}else{ out.print((String)session.getAttribute("uname")); } %> <%}%>
Name <%=userBean.getName()%> Surname <%=userBean.getSurname()%> Birth Date <%if(userBean.getBirthMonth()==0||userBean.getBirthYear()==0||userBean.getBirthDay()==0) <%if(userBean.getBirthMonth()==0||userBean.getBirthYear()==0 ||userBean.getBirthDay()==0) out.print("Not Specified"); else{ out.print(monthArray[userBean.getBirthMonth()]+" • "+userBean.getBirthDay() +" • "+userBean.getBirthYear()); }%>
Country <script language="JavaScript"> var ccoSec = cco[<%=userBean.getCountry()%>]; document.write(co[cco[<%=userBean.getCountry()%>]][1]); Address <%=userBean.getAddress()%> Town <%=userBean.getCity()%> County <%=userBean.getState()%> Postcode <%=userBean.getZip()%>
129
Email <%=userBean.getEmail()%> Daytime Phone <%=userBean.getPhone()%> Evening Phone <%=userBean.getStatus()%>
<%if(userBean.getErrMsg()==1){ userBean.setErrMsg(0);%> <%}else{userBean.setErrMsg(0);%> Home <%}%>
<%@include file="../include/footer.jsp"%>
user\mypage.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> <% Connection db = null;%> <%@ include file="../include/db.jsp"%> <%@ include file="../auth/checkSession.jsp"%> MuzzyMoo - New Account <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@include file="../include/months.jsp"%> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript">
130
<% Statement stmt = null; stmt = db.createStatement(); %> <% userBean.LoadFromDB(uname,stmt); %> <%@include file="../include/header.jsp"%> <%@include file="../include/mainTabs.jsp"%> Welcome <%=uname%>. These are your recorded details
Username <%=userBean.getUsername()%>
Name <%=userBean.getName()%>
131
Surname <%=userBean.getSurname()%> Birth Date <%if(userBean.getBirthMonth()==0||userBean.getBirthYear()==0||userBean.getBirthDay()==0) out.print("Not Specified"); else{ out.print(monthArray[userBean.getBirthMonth()]+" • "+userBean.getBirthDay() +" • "+userBean.getBirthYear()); }%>
Country <script language="JavaScript"> var ccoSec = cco[<%=userBean.getCountry()%>]; document.write(co[cco[<%=userBean.getCountry()%>]][1]); Address <%=userBean.getAddress()%> Town <%=userBean.getCity()%> County <%=userBean.getState()%> Postcode <%=userBean.getZip()%>
Email <%=userBean.getEmail()%> Daytime Phone <%=userBean.getPhone()%> Evening Phone <%=userBean.getStatus()%>
132
<%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
user\register.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> MuzzyMoo <SCRIPT language=JavaScript SRC="../js/comboValues.js" TYPE="text/javascript"> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript"> <SCRIPT language=JavaScript SRC="../js/vector2select.js" TYPE="text/javascript"> <script language="JavaScript"> function checkIlegals(field){ if ((field.value.indexOf('<')!=-1)||(field.value.indexOf('>')!=-1) ||(field.value.indexOf('%')!=-1)||(field.value.indexOf('&')!=-1) ||(field.value.indexOf('/')!=-1)||(field.value.indexOf('?')!=-1) ||(field.value.indexOf(':')!=-1)||(field.value.indexOf('!')!=-1)) return false return true } function valid(){ if (document.newUser.username.value.length<1){ alert("Please Choose a valid user name !"); return false; } if(!checkIlegals(document.newUser.username)) { alert("Ilegal characters in field Username \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if (document.newUser.password.value!=document.newUser.repassword.value){ alert("Typed & Retyped Password do not match."); return false; } if( (document.newUser.password.value.length<6) || (document.newUser.password.value.length>20)){ alert("Password must have between 6 and 20 character") return false } if(!checkIlegals(document.newUser.name)) { alert("Ilegal characters in field Surname \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; }
133
if ((document.newUser.name.value.length>50) || (document.newUser.name.value=="")){ alert("Name field is too large (50) or empty") return false } if ((document.newUser.surname.value.length>50) || (document.newUser.surname.value=="")){ alert("Surname field is too large (50) or empty") return false } if ((document.newUser.state.value.length>50) || (document.newUser.state.value=="")){ alert("State field is too large (50) or empty") return false } if(!checkIlegals(document.newUser.surname)) { alert("Ilegal characters in field Surname \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.city.value.length>30) || (document.newUser.city.value=="")){ alert("City field is too large (30) or empty.") return false } if(!checkIlegals(document.newUser.city)) { alert("Ilegal characters in field City \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.zip.value==0) || (document.newUser.zip=="")){ alert("Please enter your ZipCode.") return false } if ((document.newUser.email.value.length>60) || (document.newUser.email.value=="")){ alert("Email field is too large (60) or empty") return false } if ((document.newUser.email.value.indexOf('@')==-1)||(document.newUser.email.value.indexOf('.')==-1)){ alert("Your email address seems to be invalid") return false } if(!checkIlegals(document.newUser.email)) { alert("Ilegal characters in field Email \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.address.value.length>500) || (document.newUser.address.value=="")){ alert("Address field is too large (500) or empty") return false } if(!checkIlegals(document.newUser.address)) { alert("Ilegal characters in field Address \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } return true; } <%@include file="../include/header.jsp"%> <script language="JavaScript"> AddYear2Select(document.all["birth_year"],1900); AddDay2Select(document.all["birth_day"],1); vect2sel(co,newUser.country,"ROU"); <%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
user\saveData.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %> MuzzyMoo - New Account <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <%@include file="../include/months.jsp"%> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); int update=0; if(request.getParameter("update")!=null) update = Integer.parseInt(request.getParameter("update")); %> <% if(update==0){ userBean.getFormData(request); userBean.SaveToDB(stmt); }else{ userBean.getFormData(request); userBean.UpdateToDB(stmt); } %> <%@include file="../include/header.jsp"%>
<%@include file="../include/mainTabs.jsp"%>
137
<%if(update==0){%> Welcome to MuzzyMoo registration process
<%}else{%> Welcome <%=(String)session.getAttribute("uname")%>. Your details have been changed to
<%}%>
<%if(userBean.getErrMsg()==1){%> Username <%=userBean.getUsername()%> is taken. Plea se choose another. <%}else{%> Username <% if(update==0){ out.print(userBean.getUsername()); }else{ out.print((String)session.getAttribute("uname")); } %> <%}%>
138
Name <%=userBean.getName()%> Surname <%=userBean.getSurname()%> Birth Date <%if(userBean.getBirthMonth()==0||userBean.getBirthYear()==0||userBean.getBirthDay()==0) out.print("Not Specified"); else{ out.print(monthArray[userBean.getBirthMonth()]+" • "+userBean.getBirthDay() +" • "+userBean.getBirthYear()); }%>
Country <script language="JavaScript"> var ccoSec = cco[<%=userBean.getCountry()%>]; document.write(co[cco[<%=userBean.getCountry()%>]][1]); Address <%=userBean.getAddress()%> Town <%=userBean.getCity()%> County <%=userBean.getState()%> Postcode <%=userBean.getZip()%>
Email <%=userBean.getEmail()%> Daytime Phone <%=userBean.getPhone()%>
139
Evening Phone <%=userBean.getStatus()%>
<%if(userBean.getErrMsg()==1){ userBean.setErrMsg(0);%> <%}else{userBean.setErrMsg(0);%> Home <%}%>
<%@include file="../include/categsMap.jsp"%>
user\searchRes.jsp <%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*,java.util.*" errorPage="" %> Untitled Document <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <%String uname=request.getParameter("uname"); userBean.LoadFromDB(uname,stmt); %> <%=userBean.getUsername()%> <%=userBean.getName()%> - <%=userBean.getSurname()%>
user\update.jsp <%@ page import="com.madalina.muzzymoo.constants.Const" %> <%@ page import="java.sql.ResultSet" %> <%@ page import="java.sql.Statement" %> <%@ page import="java.sql.Connection" %>
140
MuzzyMoo - Update User Details <SCRIPT language=JavaScript SRC="../js/comboValues.js" TYPE="text/javascript"> <SCRIPT language=JavaScript SRC="../js/country.js" TYPE="text/javascript"> <SCRIPT language=JavaScript SRC="../js/vector2select.js" TYPE="text/javascript"> <script language="JavaScript"> function checkIlegals(field){ if ((field.value.indexOf('<')!=-1)||(field.value.indexOf('>')!=-1) ||(field.value.indexOf('%')!=-1)||(field.value.indexOf('&')!=-1) ||(field.value.indexOf('/')!=-1)||(field.value.indexOf('?')!=-1) ||(field.value.indexOf(':')!=-1)||(field.value.indexOf('!')!=-1)) return false return true } function valid(){ if(!checkIlegals(document.newUser.name)) { alert("Ilegal characters in field Surname \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.name.value.length>50) || (document.newUser.name.value=="")){ alert("Name field is too large (50) or empty") return false } if ((document.newUser.surname.value.length>50) || (document.newUser.surname.value=="")){ alert("Surname field is too large (50) or empty") return false } if ((document.newUser.state.value.length>50) || (document.newUser.state.value=="")){ alert("State field is too large (50) or empty") return false } if(!checkIlegals(document.newUser.surname)) { alert("Ilegal characters in field Surname \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.city.value.length>30) || (document.newUser.city.value=="")){ alert("City field is too large (30) or empty.") return false } if(!checkIlegals(document.newUser.city)) { alert("Ilegal characters in field City \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } if ((document.newUser.zip.value==0) || (document.newUser.zip=="")){ alert("Please enter your ZipCode.") return false } if ((document.newUser.email.value.length>60) || (document.newUser.email.value=="")){ alert("Email field is too large (60) or empty") return false } if ((document.newUser.email.value.indexOf('@')==-1)||(document.newUser.email.value.indexOf('.')==-1)){ alert("Your email address seems to be invalid") return false } if(!checkIlegals(document.newUser.email)) { alert("Ilegal characters in field Email \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; }
141
if ((document.newUser.address.value.length>500) || (document.newUser.address.value=="")){ alert("Address field is too large (500) or empty") return false } if(!checkIlegals(document.newUser.address)) { alert("Ilegal characters in field Address \n Ilegal characters: <,>,%, &,\\,/,?,:,!"); return false; } return true; } <% Connection db = null; %> <%@ include file="../include/db.jsp"%> <% Statement stmt = null; stmt = db.createStatement(); %> <% String uname=(String)session.getAttribute("uname"); userBean.LoadFromDB(uname,stmt); %> <%@include file="../include/header.jsp"%> <script language="JavaScript"> AddYear2Select(document.all["birth_year"],1900); AddDay2Select(document.all["birth_day"],1); vect2sel(co,newUser.country,""); <%@include file="../include/categsMap.jsp"%> <%@include file="../include/footer.jsp"%>
144