38 0 587KB
UNIVERSITATEA DE VEST DIN TIMISOARA FACULTATEA DE MATEMATICA SI INFORMATICA SECTIA INFORMATICA ROMANA
LUCRARE DE DIPLOMA Aplicatie de licitatie in JAVA Introducere Aplicatiile distribuite sunt de o buna perioada de timp o prezenta uzuala in peisajul IT chiar si din tara noastra. Ultimii ani au insemnat, de asemenea, si pasi semnificativi si concreti in impunerea Internetului in intreaga economie si societate. Odata cu acesta, aplicatiile distribuite – care au ca suport Internetul si tehnologiile dezvoltate pentru acesta si impreuna cu el, au trecut de la stadiul de noutati tehnologice la cel de prezenta reala in 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 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 fotoliu. Nu mai sunt necasare deplasari sau alte actiuni care consuma timp inutil. Aceasta economie de timp rezulta astfel intr-o crestere a rentabilitatii, de unde reiese si o economie de bani. Am ales aceeasta tema pentru a prezenta avantajele folosirii unui sistem de licitatii cat si pentru a creea o aplicatie usor de utilizat care sa ofere utilizatorilor toate optiunile de care acesti au nevoie in finalizarea relatiiei de vanzare-cumparare prin intermediul unei licitatii.
1. Licitatia 1.1. Licitatia 1.1.1 Notiunea de licitatie
Licitatia este o vanzare catre cel care ofera pretul cel mai mare, sau o cumparare de la cel care isi ofera marfa la pretul cel mai mic.
Licitatia bazata pe preturi crescatoare are la baza un pret de pornire, care este marit prin oferte succesive de catre participanti. Licitatia se opreste, si marfa este considerata adjudecata ultimului ofertant care a oferit implicit si pretul cel mai mare. In functiile de regulile licitatiei, vanzatorul poate avea si optiunea de a-si retrage marfa de la licitatie daca pretul final este considerat prea mic, urmand ca dupa licitarea celorlalate marfuri, marfa acestuia sa fie supusa din nou licitarii.
Licitatia bazata pe preturi descrescatoare are loc prin comunicarea unui pret maxim de pornire, licitatorul anuntand apoi preturi din ce in ce mai mici pana in momentul cand se face prima oferta care are ca efect adjudecara marfii la acel pret.
Functia licitatiilor in practica comertului international consta in valorificarea marfurilor care nu pot fi incadrate in tipurile uzuale folosite la bursa. Datorita acestui fapt, marfurile supuse licitatiei trebuie sa fie vizionate de catre eventualii cumparatori.
1.1.2 Clasificarea licitatiilor Se pot distinge mai multe criterii de clasificare:
dupa posibilitatile de participare: o
Licitatii deschise sau publice la randul lor pot fi judecatoresti sau benevole, voluntare, la care pot lua parte orice firma, organizatie, comerciant
o
Licitatii inchise, limitate sau restrictive, la care pot participa numai anumite firme fie pe baza fie invitatie fie pe baza indeplinirii unor cerinte stricte de participare
dupa periodicitatea organizarii: o
Licitatii periodice care se organizeaza, se desfasoara la anumite perioade
o
Licitatii ocazionale (se organizeaza ad-hoc)
dupa pozitia sau calitatea organizatorilor licitatiile prezinta mai multe forme o
Licitatii pentru vanzare de marfuri
o
Licitatii pentru cumparare de produse, instalatii si atribuire de lucrari de constructii montaj
Licitatii pentru cumparare de produse, instalatii si atribuire de lucrari de constructii montaj mai sunt denumite si licitatii de import sau tratative de concurenta. Ca forma de comert acestea au avantajul ca asigura obtinerea unui numar mare de oferte, contribuie la cunoasterea pietei externe si faciliteaza luarea unei decizii obiective si rentabile.
Organizarea licitatiei notiuni Pregatirea licitatiei presupune efectuarea unei publicitati prin anunturi in presa, tiparirea de prospecte, cataloage, invitatii. Marfurile ce vor face obiectul licitatiei se expun spre vizionare. Conditiile de livrare redactate de organizatori prevad conditiile de participare, vizionarea loturilor, atribuirea lor, conditiile de plata, modalitati de livrare si transport a marfurilor achizitionate si modalitati de solutionare a litigiilor. In ceea ce priveste modul de organizare a licitatiilor, acesta este determinat de legea tarii unde se tine licitatia, iar in ceea ce priveste legea aplicabila licitatiei, Legea romana de drept international privat prevede in art.90 ca 'vanzarea prin licitatie, prin burse sau targuri este supusa legii statului unde are loc incheierea pe aceasta cale a contractului, afara numai daca legea statului respectiv, admite ca partile sa aleaga prin acord legea aplicabila si ele au procedat explicit la o asemenea alegere'. In comertul international licitatiile sunt organizate fie direct de catre firmele producatoare, ori cele comerciale, fie de catre institutii specializate in acest domeniu. In tarile in curs de dezvoltare, la organizarea licitatiilor participa, in multe cazuri, si bancile comerciale care finanteaza firmele cu activitate de comert exterior. O forma practicata tot mai des de participantii la licitatiile internationale consta in prezentarea ofertelor lor prin intermediul unor firme din tara unde se organizeaza licitatia, mai ales ca, in unele tari aceasta forma de oferta (brokeraj) este obligatorie prin lege. Agentii specializati se numesc auction brokers. In vederea indeplinirii obligatiilor din oferte, ofertantii trebuie sa depuna, de regula, anumite garantii sub forma unei scrisori de garantie bancara, sau participantii sunt obligati sa depuna, inainte de licitatie, o cautiune, care in mod obisnuit este de pana 10% din valoarea ofertei.
1.1.3 Exemple 1. Licitatia englezeasca cunoscuta de asemenea si ca licitatie deschisa cu pret crescator. Acest tip de licitatie este fara indoiala cel mai comuna forma de licitatie, in folosinta astazi. Participantii pot oferta deschis impotriva unui altuia, cu o oferta mai mare decat oferta anterioara. Ofertele pot fi depuse electronic, cu cea mai mare oferta de pret curenta afisata public.O licitatie se termina atunci cand nu este dispus un ofertant sa liciteze in continuare,iar atunci castiga cel care a ofertat cel mai mult. De asemenea, in cazul in care vanzatorul a stabilit un pret minim de vanzare in avans si in final oferta nu ajunge la acest pret elementul ramane nevandut. Uneori, cel ce vinde prin licitatie stabileste o suma minima care trebuie depasita prin oferte pentru ca obiectul sa fie vandut. Acest tip de licitatie este utilizata pentru vanzarea de marfuri, cel mai proeminent opere de arta si antichitati, dar de asemenea, folosit si pentru marfuri si bunuri imobiliare. Cel putin doi ofertanti sunt obligatorii. 2.Licitatie Olandeza, este cunoscuta ca un tip de licitatie deschisa descrescatoare. In acest tip de licitatie vanzatorul stabileste un pret maxim isar pe masu ce ofertantii liciteaza el creste pana se ajunge la o intelegere intre amandoua partile. Acest tip de licitatie este folosit pentru marfuri perisabile, cum ar fi pestele si tutunul. In practica, insa, acest tip de licitaie nu este utilizat pe scara larga.
2. Tehnologi folosite 2.1 JAVA 2.1.1. Introducere in JAVA Platforma Java cuprinde API (Java Application Programming) si Masina Virtuala Java (JVM –Java Virtual Machine) . Java este un limbaj de programare de nivel inalt, dezvoltat de Sun Microsystems. La inceput s-a numit OAK, dar nu a avut success si de aceea Sun i-a schimbat numele in Java si a modificat limbajul pentru a suporta avantajele World Wide Web. Java a castigat popularitate inca de la inceput. Accensiunea sa rapida si acceptarea larga pot fi urmarite in caracteristicile sale de dezvoltare si programare, in particular in faptul ca se poate realiza un program pe masina locala si rulat oriunde. Java a fost aleasa ca si limbaj de programare pentru calculatoarele in retea (Network Computers) si a fost perceputa ca si o interfata cu bazele de date. Sun Microsystems declara: “ Java este simpla, orientata pe obiect, distribuita, robusta, sigura, neutra din punct de vedere architectural, portabila, multithread si dinamica.” Java este un limbaj orientat pe obiecte similar cu C++, dar simplificat pentru a elimina acele trasaturi ale limbajului care cauzeaza erorile banale de programare. Codul sursa Java (fisiere cu extensia .java) este compilat intr-un format numit Bytecode (fisiere cu extensia .class), care poate fi apoi executat de un translator Java (Java Interpreter). Codul compilat Java poate rula pe aproape toate calculatoarele deoarece translatorul Java si mediile de rulare, cunoscute ca si Java Virtual Machines (JVMs) exista pentru majoritatea sistemelor de operare, incluzand UNIX, S.O Macintosh si Windows. Bytecode de asemenea poate fi convertit direct in instructiuni pentru limbaj masina de catre un compilator just-in-time (JIT). Java este un limbaj de programare de scop general, cu o serie de trasaturi care fac limbajul sa suporte WWW. Aplicatiile mici Java sunt numite Applet-uri Java si pot fi descarcate de pe un server Web si rulate pe calculatorul personal de catre un Web browser compatibil cu Java, ca si Netscape Navigator sau Microsoft Internet Explorer. Limbajul suporta mostenirea si polimorfismul dinamic si este programat avand in vedere programarea concurenta. Are multe din expresiile si structurile de control ale limbajului C plus exceptiile. Este mai multa munca de scris, dar rezultatul este aproape intotdeauna mai clar decat codul C++. Codul Java nu este compilat la fel de repede ca si C++. Translatorul protejeaza masina de erori care pot opri sistemele de operare in C++. Un program Java poate fi transmis in retea la o masina de tip diferit, cu un sistem de operare diferit si o alta interfata grafica utilizator. Acolo va rula in siguranta (in teorie) si va arata si se va comporta ca si cum a fost programat pentru sistemul respectiv. Acest lucru este foarte scump in C++.
2.1.2. Tipuri de date Tipurile de date primare Java suporta 8 tipuri de date primare, descrise in tabelul de mai jos:
Tip
Descriere
byte
intreg cu semn pe 8 biti
short
intreg cu semn pe 16 biti
int
intreg cu semn pe 32 de biti
long
intreg cu semn pe 64 de biti
float
numar in virgula mobila pe 32 de biti
double
numar in virgula mobila pe 64 de biti
char
caracter Unicode pe 16 biti
boolean
true sau false
Observati ca Java adauga doua tipuri de date: byte si boolean. (unele compilatoare de C++ mai noi au adaugat si ele tipul boolean). O diferenta importanta privind celelalte tipuri de date, care sunt comune celor doua limbaje, este faptul ca tipurile Java au o dimensiune fixa si cunoscuta. Acest lucru este foarte important pentru Java datorita scopului sau de a fi portabil. De exemplu daca un tip de data int ocupa 16 biti pe o platforma si 32 de biti pe alta platforma, programul va avea probleme daca va trebui sa ruleze pe ambele platforme. C++ garanteaza o anumita relatie intre tipurile primare de date, de exemplu garanteaza ca un tip de data long este cel putin la fel de mare cu un tip de data int. El nu garanteaza insa dimensiunea fiecarui tip. Java realizeaza acest lucru, fiecare tip avand o dimensiune fixa. Deoarece cele mai multe masini ruleaza pe 32 de biti, dimensiunile pentru tipurile primitive de date au fost gandite sa fie optimizate pentru 32 de biti. Astfel, o data Java de tip int ocupa 32 de biti ( fata de16 sau 32 de biti, in C/C++ ), iar o data de tip long va ocupa 64 de biti ( fata de 32 sau 64 de biti, in C/C++ ). O alta diferenta este ca toate tipurile primare Java sunt cu semn. Astfel, declaratiile unsigned din C nu sunt permise in Java.
2.1.3. Conversii
Si in Java si in C++ se poate face conversie intre un tip de data si un altul. Dar in Java nu exista conversii implicite. Sa luam urmatoarea secventa de program scrisa in C: long LongNb = 32768; int IntNb; IntNb = LongNb; Compilatorul C/C++ va face o conversie implicita (cast) din long in int. Pe o platforma de 16 biti ( unde long are o lungime de 32 de biti si int are o lungime de 16 biti ), in urma conversiei, variabila IntNb va avea valoarea 0. Deci va avea loc o pierdere de precizie, fara ca programatorul sa fie avizat. Java inlatura riscul unor potentiale erori in programare relative la conversii prin faptul ca nu realizeaza conversii automate. Astfel programatorul este nevoit sa faca o conversie explicita ( de exemplu IntNb = (int)LongNb;).
2.1.4. Operatori Setul de operatori din Java este aproape identic cu cel din C/C++. Acestia sunt: ! (negatie), && (si conditional), || (sau conditional), ?: (conditie). O diferenta este ca in Java acestia opereaza cu valori booleene. Astfel secventa C: int x = 4; int y = 5; if (x && y) va fi ilegala in Java, pentru ca, asa cum spuneam mai sus, nu se face conversie automata. Conditia va trebui deci scrisa explicit: if (x!=0 && y!=0). O alta diferenta privind operatorii, si care are o importanta deosebita, este ca in Java operatorii nu pot fi supraincarcati, asa cum pot fi in C++. Folosirea acestei trasaturi in C++ a dus la
crearea multor erori. De aceea dezvoltatorii Java au hotarat sa nu pastreze aceasta caracteristica.
2.1.5. Pointeri Pointerii reprezinta in C++ un element care confera programatorului multa flexibilitate. Cu toate acestea, folosirea pointerilor este o importanta sursa de erori. Java nu permite programatorului sa foloseasca pointeri de nici un fel. Cum se face atunci transmiterea variabilelor? In C++ programatorul are libertatea sa transmita variabilele cum considera ca este mai bine folosind operatorii &, * si ->. In Java insa nu exista acesti operatori, dar exista urmatoarea regula: tipurile de date primare sunt transmise prin valoare (prin copierea efectiva), iar obiectele si masivele sunt transmise prin referinta (prin copierea adresei). Sa luam urmatorul exemplu: vrem sa cream o functie care sa returneze media unui student: void mediaStudent (int note[], double media) Nu putem returna rezultatul ca parametru (si anume in variabila media), pentru ca acesta este transmis prin valoare si modificarea sa in interiorul functiei nu are efect asupra variabilei media. In C acest parametru trebuia transmis prin adresa (int *media sau int &media). Prin urmare trebuie cautata o solutie de transmitere a parametrului prin adresa. Acest lucru se poate face prin crearea unei clase care sa contina variabila media. Un obiect al acestei noi clase va fi transmis ca parametru prin adresa: public class definesteStudent iar void
functia de mediaStudent
mai (int
sus note[],
va avea definesteStudent
forma: stud)
Bineinteles ca returnarea mediei se putea face in cazul de mai sus si ca retur al functiei: double mediaStudent (int note[]) dar in cazul in care se doreste returnarea mai multor valori primare, crearea unei clase care sa le contina ramane singura solutie valabila.
2.1.6 Copierea obiectelor Deoarece fiecare obiect este de fapt o referinta, asignarea unui obiect altuia nu copiaza decat adresa catre care acesta refera. Iata un exemplu: Button butonOK = new Button('OK'); Button butonCancel = new Button('Cancel'); butonOK = butonCancel; Obiectul butonOK va fi o referinta catre obiectul referit de butonCancel, iar obiectul initial care era alocat in butonOK se pierde. Pentru a copia efectiv datele dintr-un obiect in altul se foloseste functia clone(), disponibila in clasele care implementeaza interfata Cloneable (cele mai multe dintre clasele standard): butonOK=butonCancel.clone(); Acelasi lucru este valabil si pentru masive. Pentru a copia efectiv valorile unui vector (de exemplu) in alt vector, fie trebuie copiata fiecare valoare in parte, fie trebuie folosita metoda System.arraycopy().
2.1.7. Gestionarea automata a memoriei Aceasta este una dintre trasaturile care face limbajul Java renumit pentru usurinta programarii. Desi operatorul new aloca memorie pentru un obiect, nu exista un operator corespondent care sa dezaloce memoria alocata anterior prin new. Colectorul de gunoaie elibereaza un spatiu de memorie imediat ce nu mai exista o referinta catre acesta. Exemplu: sa presupunem ca am folosit o culoare pentru desenarea unui background: Color background = new Color(250,0,0); In memorie se aloca un spatiu pentru acest obiect, care are adresa background. Mai tarziu vrem sa schimbam culoarea, si procedam astfel: background = new Color(0,250,0); Acum un nou obiect este alocat, iar adresa acestuia este trecuta in variabila background. Prin urmare obiectul alocat anterior nu va mai fi referit, deci memoria va fi dezalocata automat.
Aceasta facilitate scuteste programatorul sa tina cont de toate obiectele alocate, sporindu-i rapiditatea programarii si eliminand din erori.
2.1.8. Clase Modelul orientat pe obiecte din Java a fost inspirat din limbajul C++. Dar desi clasele in C++ sunt importante, in Java suntobligatorii si sunt 'centrul lucrurilor'. In Java nu exista variabile sau functii de sine-statatoare. Totul trebuie incapsulat intr-una sau mai multe clase. In plus, exista o intreaga ierarhie de clase, care are ca 'stramos' comun clasa Object. Regasim in clasele Java modificatorii private, protected, si public. Ei au aceeasi semnificatie ca si in C++. In plus, Java mai are un al patrulea nivel de acces, care este folosit implicit. Daca nu este specificat nici un modificator, atunci membrul respectiv este accesibil in cadrul pachetului in care clasa este definita, dar nu si in alta parte. Codul Java este vizibil la nivelul pachetului, iar un pachet contine definitiile si implementarile de cod a uneia sau mai multor clase. Functiile Membre In Java fiecare metoda are corpul in acelasi loc unde are si definitia. De aceea Java nu are nevoie de cuvintul cheie inline din C++. Toate metodele sunt scrise ca si functiile inline din C+ +. Valori implicite ale variabilelor Un alt element care aduce o imbunatatire in Java fata de C++ este abilitatea de a seta o valoare implicita pentru o variabila membra la momentul declararii ei. De exemplu: class Persoana In C++, aceasta atribuire se putea face numai in constructor. Posibilitatea atribuirii unei valori implicite in Java are avantajul ca daca exista mai multi constructori care trebuie sa aloce aceeasi valoare unei variabile, acestia sunt simplificati pentru ca nu mai este necesara scrierea lor. Constructori si destructori Fiecare clasa Java poate include unul sau mai multi constructori. Ca si in C++, constructorul are acelasi nume ca si clasa. In Java constructorii nu returneaza nici o valoare si sunt declarati in acelasi mod ca si celelalte metode. In C++ era nevoie de destructori pentru a elibera memoria alocata de un obiect. Deoarece Java include 'colectorul de gunoaie' pentru eliberarea automata a memoriei care nu mai este referita, existenta destructorilor nu mai este necesara. De aceea, destructori din C++ nu exista, fiecare clasa Java poate include in schimb metoda finalize, care realizeaza eliberarea obliectului. Functia este definita in clasa Object, deci este mostenita de toate clasele. Mostenire Asa cum stiti, mostenirea in Java este indicata prin folosirea cuvantului cheie extends. Ca si C+ +, Java include cuvantul this care poate fi folosit de un obiect pentru a se referi pe sine insusi. In plus, Java include si cuvantul cheie super pe care un obiect sau o clasa il poate folosi pentru a referi un o metoda din clasa parinte. De exemplu: class Persoana } class
Student
extends
Persoana
} Despre modalitatea de mostenire in Java am mai discutat si in articolele trecute, asa ca nu o sa mai insist acum asupra acestui subiect. Pe scurt: o clasa poate mosteni o singura alta clasa, insa poate implementa mai multe interfete. O interfata este o clasa care are numai metode abstracte, deci corpul lor trebuie definit in clasele care o mostenesc.
2.1.9. Lipsa preprocesorului
C si C++ includ directivele #define, #include, si #ifdef. Java nu include nici un fel de preprocesor. Definirea constantelor Orice variabila declarata final este constanta. Valoarea sa trebuie specificata de la initializare si ea nu poate fi schimbata ulterior. Echivalentul directivei #define din C este o variabila declarata static final. De exemplu variabila PI din clasa java.lang.Math este definita astfel: public static final double PI = 3.14159 Macrouri Java nu are un echivalent pentru macrourile din C, dar tehnologia compilatoarelor a avansat destul de mult incat sa nu mai fie nevoie de ele. Includerea fisierelor Dupa cum stiti, Java are directiva import, care este aproximativ similara cu directiva #include din C. Directiva import spune compilatorului ca fisierul curent foloseste clasele specificate sau clasele din pachetele specificate, si permite programatorului sa foloseasca nume scurte (de exemplu Math.PI in loc de java.lang.Math.PI). Compilarea conditionata Java nu are directivele #ifdef si #if pentru a realiza compilarea conditionata. Teoretic, compilarea conditionata nici nu ar trebui sa fie necesara in Java, pentru ca de obicei aceasta se foloseste la schimbarea platformei. Practic insa, compilarea conditionata este folositoare si in Java, de exemplu pentru a crea interfete putin diferite in functie de platforma, sau pentru a include cod pentru debug. Compilatorul Java realizeaza implicit o compilare conditionata, in sensul ca nu va compila un cod care in mod evident nu va fi executat. (de exemplu if(false)). Compilarea conditionata functioneaza si cu constante (cu variabile declarate static final). Acestea se folosesc in general pentru debug. Daca o clasa defineste o astfel de constanta astfel: private static final boolean DEBUG = false; atunci compilatorul nu va compila cod de genul if(DEBUG). Pentru activarea optiunii de debug, este necesara doar schimbarea valorii constantei si recompilarea codului.
2.1.10. Variabile multidimensionale Ca si C/C++, Java foloseste parantezele patrate pentru a declara un masiv. Sunt insa doua diferente: - in Java parantezele pot fi plasate fie inaintea, fie dupa numele variabilei; - dimensiunea masivului nu trebuie specificata intre paranteze la momentul declararii variabilei. Acest lucru nu este necesar si nici permis pentru ca Java cere ca toate masivele sa fie alocate folosind operatorul new: int vector[]; vector = new int[100]; sau int vector[] = new int[100]; Comentarii In afara de comentariile existente si in C/C++, si anume: // si /**/, Java introduce un nou tip de comentariu: /***/ Un astfel de comentariu poate fi extras din codul sursa si folosit pentru a crea documentatie pentru clasa respectiva cu utilitarul javadoc. Acest mod de comentare a codului este folosit pentru toate clasele standard din Java. Argumente in linia de comanda Unui program C sau C++ i se pot transmite argumente parametrilor argc si argv, unde argc reprezinta numarul de un sir cu parametrii respectivi. Intotdeauna va fi cel putin primul parametru este
in linia de comanda cu ajutorul parametri transmisi, iar argv este un parametru transmis, deoarece numele programului:
main ( int argc, char *argv[] ) Intr-o aplicatie Java ( intr-un applet nu putem vorbi despre functia main), argumentele din linia de comanda sunt trecuti intr-un sir de obiecte de tip String: public static void main(String args[]); Fiecare componenta a sirului args este un parametru transmis. Diferenta fata de C/C++ este ca in Java numele programului nu este transmis ca parametru. goto, break si continue Cuvantul cheie goto nu este folosit in Java. El este pe lista cuvintelor rezervate, asa ca poate la un moment dat o sa se revina asupra lui. Exista insa doi substituenti pentru goto: break si continue pot fi folosite cu etichete. Break si continue au si valoarea cunoscuta din C, dar au in plus si facilitatea de 'goto': eticheta: for(int
i=0;i : < subname >
Se poate observa usor existenta celor trei parti ale unui URL JDBC, parti care au urmatoarea semnificatie:
jdbc reprezinta numele protocolului. In cadrul unui URL JDBC vom folosi intotdeauna protocolul jdbc.
subprotocolul poate reprezenta numele unui driver sau numele unui mecanism de conectare la baza de date. Un exemplu foarte sugestiv pentru denumirea unui subprotocol este odbc. Acest nume este rezervat pentru URL-urile care specifica surse de date de tipul ODBC. Pentru accesarea unei baze de date prin intermediul unui bridge JDBC-ODBC, cazul nostru este demonstrativ –jdbc:odbc:ProDb. In aceasta situatie, subprotocolul este odbc iar numele ProDb este denumirea unei surse de date ODBC locale.
Daca cineva doreste sa utilizeze un serviciu de naming atunci respectivul serviciu trebuie furnizat ca protocol. Utilizarea acestui serviciu este necesara atunci cand numele bazei de date nu reprezinta pe cel real. In acest caz URL-ul va arata astfel: jdbc:dnsnaming:ProDb. Aici numele subprotocolului este serviciul de naming DNS. Acest serviciu trebuie sa rezolve numele logic al bazei de date intr-un nume real care sa fie utilizat pentru conectarea la baza de date.
subname, este cea de-a treia componenta a URL-ului si reprezinta o modalitate de identificare a bazei de date. Sintaxa acestei componente poate varia in functie de driver si ca urmare poate contine toate informatiile necesare pentru localizarea bazei de date. In exemplul nostru ProDb este suficient pentru identificarea sursei de date pe sistemul local. Daca sursa de date se afla pe un alt sistem in reteaua locala sau chiar pe Internet atunci trebuie sa includem in cadrul URL-ului JDBC adresa respectivului sistem. Presupunand ca baza de date se gaseste pe un sistem aflat in Internet avand adresa www.utcluj.ro si
numele subprotocolului utilizat pentru conectare este dbnet atunci URL-ul pentru conectarea la baza de date va avea forma: jdbc:dbnet://www.utcluj.ro:nrPort/WebData. Revenind la exemplul nostru, obtinerea conexiunii are loc prin apelul metodei getConnection() a clasei DriveManager.
Connection con = DriveManager.getConnection(url, “ ”, “ ”);
La apelul metodei se transmit trei parametrii. Despre primul dintre acestia, URL-ul JDBC, am discutat mai sus. Urmatorii doi parametrii reprezinta numele utilizatorului care doreste accesarea bazei de date si respectiv parola asociata respectivului utilizator. In exemplul de mai sus acesti parametrii au valori nule pentru ca nu s-a cofigurat baza de date pentru a fi protejata.
Exemplu 1:
Utilizarea bridge-ului JDBC-ODBC:
private void getDBConnection() catch (Exception e) }
Exemplu 2:
Utilizarea unui ORACLE Thin Driver in cazul unui client avand GUI de tip applet Java:
private void getConnection() catch(Exception s) System.out.println ('Exceptie aparuta in metoda getConnection'); }
}
Exemplu 3
Utilizarea unui MySQL Driver
private void getConnection() catch (Exception e) }
Executarea comenzilor SQL Odata obtinuta conectarea la baza de date avem la dispozitie un obiect de tip Connection. Acest obiect reprezinta conexiunea. O sesiune de conectare cu baza de date cuprinde toate enunturile SQL care sunt executate precum si rezultatele intoarse ca urmare a acestor prelucrari. O aplicatie poate avea una sau mai multe conexiuni cu baza de date. Comanda SQL CREATE TABLE primeste ca parametru numele tabelei si denumirile campurilor care vor face parte din structura tabelei, in acest caz, Administrator(User, MMType). Dupa cum am vazut, un obiect de tip Statement este creat cu ajutorul metodei create Statement() a clasei Connection. Pentru executarea efectiva a comenzii SQL, obiectul de tip Statement ne pune la dispozitie trei metode, fiecare cu o sarcina foarte precisa: execute(),executeQuery(), executeUpdate(). Metoda executeQuery() este utilizata pentru acele enunturi care produc un singur set de articole. Mai bine spus, cu ajutorul acestei metode se executa interogarile de tip SELECT. Metoda executeUpdate() este utilizata pentru executarea enunturilor de tip INSERT, DELETE si UPDATE respectiv pentru enunturi de tip SQL DDL (data definition language) cum ar fi CREATE TABLE respectiv DROP TABLE. Enunturile SQL INSERT, DELETE si UPDATE au ca efect modificarea uneia sau mai multor coloane respectiv randuri. Metoda returneaza o valoare de tip intreg reprezentand numarul randurilor care au fost afectate. Pentru enunturi de tip CREATE TABLE sau DROP TABLE metoda executeUpdate returneaza intotdeauna o valoare nula. Metoda execute() este utilizata atunci cand interogarea returneaza mai mult de un singur set de rezultate. Dupa executarea unui enunt SQL, execute(), executeQuery sau executeUpdate() returneaza un rezultat. Imediat dupa obtinerea rezultatului, obiectul de tip Statement trebuie eliberat. Aceasta actiune este indeplinita de catre garbage colector. Cu toate acestea, este recomandat ca obiectul sa fie eliberat in mod explicit prin apelarea metodei close(). Astfel se elibereaza resursele necesare pentru baza de date si se evita problemele care ar putea aparea din cauza memoriei insuficiente. Driverul JDBC realizeaza o conversie intre tipurile de date SQL si tipurile de date Java.
3. Descrierea si proiectarea aplicatiei 3.1 Descrierea aplicației In aceasta lucrare mi-am propus sa realizez un program in java care sa simuleze o licitatie avand mai multe tipuri si categorii.Utilizatorii vor trebui sa fie logati pentru a putea licita si licitaiile si conturile vor fi gestionate printr-o interfata de administare. Aplcatia va contine urmatoarel sectiuni: 1.Licitati 2.Optiuni 3.Ajutor In cadrul meniului Licitatii se vor regasii: -adaugare licitatii -vizualizare licitatii -liciteaza -iesire In Optiuni(vor putea fi accesate doar -adaugare categori,adaugare criteriu(tip),administare licitatii si useri
de
Ajutor: -Utilizare aplicatie -Versiune
3.2 Proiectarea aplicației
3.2.1 Proiectarea in ansamblu Structurarea bazei de date Definirea claselor Definirea relațiilor dintre clase Stabilirea designului Stabilirea aplicațiilor software necesare pentru dezvoltarea aplicației Publicarea Proiectarea aplicatiei trebuie sa raspunda de urmatoarele cerinte: o
Flexibilitate;
o
Fiabilitate;
admin)se
afla:
o
Usurinta in folosire;
o
Ușurința in modificarea datelor
o
Implementarea cat mai rapida;
o
Eficienta maxima;
Proiectarea bazei de date trebuie sa aiba aibe in vedere cateva cerinte tehnice și anume: o
Unicitate a cheii;
o
Integritate a domeniului;
o
Integritate a relatiei;
o
Integritate de referinta;
Aplicatie are 2 parti: -Interfata -Parte de cod si clase(Backend) Interfata este partea aplicatiei cu care va interactiona utilizatorul, ea va trebui sa fie cat mai simpla de folosit si la obiect. Partea de cod si clase este importanta pentru functionarea intregii aplicatii ea va fi vizualizata , editata,modificata doar de programator
3.2.2 Structura bazei de date Baza de date se numeste licitatii.mdb si vom avea 4 tabele: Tabela Categorie
Tabela Criteriu
Tabela Licitatie
Tabela Utilizatori
3.2.3 Definirea claselor și a relațiilor dintre acestea Actorii: vizitator, admin, utilizator
Pentru interfata avem urmatoarele clase componente: Adaugare Categorie Adugare Criterii Adaugare Licitatie Vizualizare licitatii Register
Pentru Backend avem: Conect Licitatie Main Utilizator
3.2.4. Aplicațiile software folosite
NetBeans este un proiect open-source, cu o baza de utilizatori foarte mare, o comunitate in crestere si peste 100 de parteneri (in crestere!) din toata lumea. Sun Microsystems a fondat proiectul open source NetBeans in iunie 2000 si continua sa fie principalul sponsor al proiectului. Astazi exista doua produse: NetBeans IDE si platforma NetBeans. NetBeans IDEeste un mediu de dezvoltare - un instrument pentru programatori, pentru scrierea, compilarea, testarea, depanarea, proiectarea si instalarea programelor. Este scris in Java - dar poate accepta orice limbaj de programare. De asemenea, exista un numar imens de module pentru extinderea NetBeans IDE. NetBeans IDE este un produs gratuit, fara restrictii legate de modul de utilizare. De asemenea, este disponibila Platforma NetBeans; o baza modulara si extensibila, utilizata drept conector software pentru crearea aplicatiilor desktop puternice. Partenerii ISV ofera Plugin-uri cu valoare adaugata, care se integreaza usor in platforma si care pot fi utilizate, de asemenea, la dezvoltarea propriilor instrumente si solutii.
4. Utilizarea aplicatiei 4.1.Sectiune utilizatori Dupa deschiderea aplicatiei utilizatorul poate acceasa din interfata meniurile care au diferite optiuni:adaugare,vizualizare,liciteaza
La adaugare licitatii utilizatorul va trebui sa completeze campurile :sa ii ofere licitaiiei un cod unic,sa aduge obiectul,sa specifice categori,data inceperii,data finalizarii,tipul(criteriul licitatiei) si pretul de pornire.
In partea de vizualizare se afiseaza toate licitatiile continand toate datele despre ele cum ar fi codul licitatiei ,pretul la care sa ajuns,categorie,tipul.
In optiunea de Liciteaza utilizatorul paote alege o licitatie dupa criteriu,dupa categorie sau dupa cod,sa vada ultimul pret licitat iar apoi daca doreste sa liciteze.
4.2.Sectiune administrator Administratorul poate accesa si meniul de optiuni unde va putea gestiona aplicatia
Prin optiuni ca:adaugare categorie,adugare criteriu sau tip de licitatie,administrare useri si licitatii.
La adaugare categorie administratorul poate vizualiza categoriile existente iar daca doreste sa aduge sau sa stearga categorii.
Adaugare criteriu ofera posibilitatea administratorului sa adauge tipuri de licitatii pe care utilizatorul sa le poate folosii
5.Concluzii Aceasta aplicatie isi are ca scop simularea unei licitatii intr-un mediu informatic in care utilizatorii sa poate interactiona printr-un mediu cat mai primitor usor de utilizat si functional. Pe parcursul lucrarii am incercat sa arat posibilitatiile de programare ,si multele optiuni grafice pe care limbajuil java le are de oferit simplitatea utilizarii cat si eficacitatea. Pe langa interfata placuta si usor de utilizat acest program le ofera utilizatorilor sai metode prin care sa puna in vanzare prin intermediul unor licitatii sau sa cumpere produse .Ca o concluzie, Java a fost conceput sa ajute programatorul cat mai mult prin usurinta programarii, lasand greul in seama Java. Intr-adevar, fata de C++, Java este mult mai usor, mai ales ca au fost dezvoltate clase pentru aproape toate tipurile de aplicatii. Raman insa tipuri de programe care nu pot fi facute in Java, programarea lor in C/C++ fiind mult mai eficienta. Aceasta datorita libertatii accesului la resurse, vitezei de executie mult mai mari (stiti ca Java este jumatate interpretat) etc. Prin urmare avantaje si dezavantaje raman de ambele parti, numai tipul aplicatiei si programatorul poate decide ce limbaj sa aleaga.
6. Bibliografie 1.Java de la 0 la expert (editia a II-a) Autor (i): Stefan Tanasa, Cristian Olaru, Stefan AndreiEditura:Polirom An aparitie:2007 2.Introducere in universul JAVA Autor (i): Horia Georgescu Editura:Tehnica
3.Algoritmi fundamentali in Java. Aplicatii Autor (i): Doina Logofatu 4.Java fara mistere ghid pentru autodidacti Autor Keogh Editura:Rosetti Educational An aparitie:2006
(i): Jim
5.Algoritmi si programare JAVA - teorie si aplicatii Autor (i): C. Luca, E. Ciurea Editura:Albastra 6.Introduction to Programming http://math.hws.edu/javanotes/
Using
Java,
Fifth
Links: 7.http://java.sun.com/javase/downloads/index.jsp 8.http://java.sun.com/docs/books/tutorial/uiswing/ 9.http://java.sun.com/j2se/1.4.2/docs/api/java/awt/package-summary.html 10.http://java.sun.com/docs/books/tutorial/ 11.http://www.apl.jhu.edu/~hall/java/
Edition