Sunteți pe pagina 1din 31

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

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

Licitatii ocazionale (se organizeaza ad-hoc)

dupa pozitia sau calitatea organizatorilor licitatiile prezinta mai multe forme
o

Licitatii pentru vanzare de marfuri

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<3;i++)

}
synchronized
Fiind un sistem multithreading, Java trebuie sa previna ca mai multe fire de executie sa
modifice simultan acelasi obiect. Sectiunile de cod care nu trebuie executate simultan sunt
denumite 'sectiuni critice'. Java furnizeaza cuvantul cheie synchronized pentru a proteja aceste
sectiuni critice.
package si import
Java furnizeaza de asemenea cuvantul cheie package pentru a specifica pachetul din care
clasa respectiva face parte. Clauza import are acelasi rol cu #include din C.
Elemente care lipsesc in Java
Sunt o suma de alte elemente care exista in C++ si nu exista in Java. Printre acestea
enumar: templates, functii friend, parametri impliciti,struct, union. In cele mai multe cazuri
insa, nici nu este nevoie de ele, sau ele pot fi inlocuite prin altceva. Eliminarea lor este
justificata de faptul ca simplifica mult crearea programelor Java.

2.2. Implementarea bibliotecilor in JAVA

2.2.1 Introducere
Construirea de biblioteci abstracte (clase si pachete de clase) este o parte importanta in
dezvoltarea aplicatiilor Java si nu numai. Voi incerca prin articolele acestei rubrici sa va trezesc
curiozitatea privind modalitatile de abstractizarea a datelor si construirea de noi biblioteci de date
abstracte. Toate aplicatiile existente in numerele anterioare ale revistei (nr. 1 - 21) folosesc
caracteristici si clase existente in Java care sunt puse la dispozitie de bibliotecile standard
(java.util, java.awt, etc.). Pentru inceput voi prezenta cateva lucruri de baza in realizarea unor
biblioteci abstracte de date, urmand ca in articolole viitoare sa trecem la implementarea unei
clase abstracte.
2.2.2 Metode mostenite din Clasa Object
Clasa Object declara un numar de metode care pot fi suprascrise de subclase ale
ei (acesta inseamna ca in orice aplicatie putem suprascrie aceste metode). Cand implementam o
clasa trebuie sa tinem cont de unele aspecte legate de obiectele instanta (cum trebuie copiate
comparate, sterse, afisate sub forma unui String). Putem suprascrie aceste metode atunci cand
comportamentul lor implicit nu satisface cerintele programului. Urmatoarele metode pot fi
supraincarcate: public boolean equals(Object obj); public String toString(); public final native int
hashCode(); protected native Object clone(); protected void finalize();
Obs: obiectele de tip
array permit de asemenea suprascrierea acestor metode.

Trei dintre aceste metode sunt publice si pot fi suprascrise de orice instante obiect, in timp ce
doua metode sunt protejate si din acest motiv trebuie declarate publice in momentul in care sunt
suprascrise. Vom analiza pe rand aceste metode:
boolean equals(Object obj)
Metoda folosita pentru a compara doua obiecte (obiectul pentru care se apeleaza metoda si
obiectul transmis ca parametru). Metoda implicita oferita de clasa Object returneaza true daca
cele doua obiecte reprezinta de fapt acelasi obiect, folosindu-se operatorul == . Ramane in
sarcina programatorului sa decida cum se compara doua obiecte ale aceleeasi clase.
Documentatia JDK defineste un set riguros de reguli ce trebuie avute in vedere atunci cand se
doreste stabilirea egalitatii intre boua obiecte. Metoda equals implementeaza o relatie de
echivalenta:

Este reflexiva ;

Este simetrica;

Este tranzitiva;

String toString()
Metoda returneaza o reprezentare de
apeleaza. Implicit returneaza un Sring sub forma:

tip

String

pentru

obiectul

care

ClassName @ 1cc7a0, adica numele clasei urmat de caracterul @ si apoi o valoare in hexa a
codului hash. Pentru a genera o reprezentare mult mai utila putem supraincarca acesta metoda si
returna orice String care sa ne ofere informatii despre obiect.
int hashCode()
Un hash cod este o valoare intreaga ce reprezinta intreaga valoare a unui obiect. Codurile hash
sunt folosite drept chei in tabelele de dispersie asa cum este implementata clasa HashTable
din pachetul java.util. Versiunea implicita a metodei va incerca sa genereze un cod pentru fiecare
obiect dar se poate ca la un moment dat sa genereze valori diferite pentru un acelasi obiect. Daca
se intampla acest lucru atunci trebuie sa suprascriem metoda pentru a implementa o noua functie
de dispersie (hash function) care va genera codurile hash corecte.
De fiecare data cand este invocata metoda hashCode asupra aceluiasi obiect ea trebuie sa
returneze in mod constant aceeasi valoare intreaga. Daca doua obiecte sunt egale
conform metodei equals, atunci apeland metoda hashCode pentru fiecare din cele doua obiecte
trebuie sa obtinem acceasi valoare intreaga.
Programatorii se bazeaza de obicei pe implementarea implicita a metodei hashCode decat
sa implementeze o noua versiune (ceea ce poate duce la o munca destul de dificila).
object clone()
Metoda va crea o copie a obiectului. Implicit doar obiectul curent este copiat si nu si celelalte
obiecte spre care acesta poate avea referinte. Valorile primitive in Java sunt intotdeauna copiate.
Metoda suprascrisa trebuie declarata public. Daca un obiect nu poate fi clonat va fi aruncata
exceptia : CloneNotSupportedException.
void finalize()
Acesta metoda este apelata automat de colectorul de gunoaie (garbage collector) cand un
obiect nu mai este referentiat si poate fi sters din memorie. Varianta implicita nu contine nici o
instructiune in corpul metodei. Colectorul de gunoaie poate rula oricand, astfel incat nu se
poate determina cu exactitate cand va fi apelata metoda finalize. Putem supraincarca acesta

metoda in cazul in care de exemplu anumite date trebuie salvate intr-un fisier inainte de a fi
pierdute sau o conexiune pe retea trebuie inchisa.
Daca apare o eroare metoda poate folosi in declaratie si clauza throw, aruncand o exceptie
de tipul Throwable. Daca acesta exceptie este aruncata atunci ea va fi prinsa de colectorul de
gunoaie si ignorata, lasand programul sa-si desfasoare executia pana la final.

2.2.3 Pachetul JDK


JDK contents

The JDK has as its primary components a selection of programming tools,


including:

java The loader for Java applications. This tool is an interpreter and can interpret the class
files generated by the javac compiler. Now a single launcher is used for both development
and deployment. The old deployment launcher, jre, no longer comes with Sun JDK.

javac The compiler, which converts source code into Java bytecode

jar The archiver, which packages related class libraries into a single JAR file. This tool also
helps manage JAR files.

javadoc The documentation generator, which automatically generates documentation


from source code comments

jdb The debugger

javap The class file disassembler

appletviewer This tool can be used to run and debug Java applets without a web browser.

javah The C header and stub generator, used to write native methods

javaws The Java Web Start launcher for JNLP applications

extcheck This utility can detect JAR-file conflicts.

apt The annotation-processing tool

jhat (Experimental) Java heap analysis tool

jstack (Experimental) This utility prints Java stack traces of Java threads.

jstat (Experimental) Java Virtual Machine statistics monitoring tool

jstatd (Experimental) jstat daemon

jinfo (Experimental) This utility gets configuration information from a running Java process
or crash dump.

jmap (Experimental) This utility outputs the memory map for Java and can print shared
object memory maps or heap memory details of a given process or core dump.

idlj The IDL-to-Java compiler. This utility generates Java bindings from a given IDL file.

policytool The policy creation and management tool, which can determine policy for a Java
runtime, specifying which permissions are available for code from various sources

VisualVM visual tool integrating several commandline JDK tools and lightweight
performance and memory profiling capabilities

wsimport Generates portable JAX-WS artifacts for invoking a web service.

The JDK also comes with a complete Java Runtime Environment, usually called a private runtime. It
consists of a Java Virtual Machine and all of the class libraries present in the production
environment, as well as additional libraries only useful to developers, such as the
internationalization libraries and the IDL libraries.
Also included are a wide selection of example programs demonstrating the use of almost all
portions of the Java API.

2.3 Interfete grafice JAVA


2.3.1.Introducere
De la aparitia limbajului Java, bibliotecile de clase care ofera servicii grafice au suferit
probabil cele mai mari schimbari in trecerea de la o versiune la alta. Acest lucru se datoreaza, pe de
o parte dificultatii legate de implementarea notiunii de portabilitate, pe de alta parte nevoii de a
integra mecanismele GUI cu tehnologii aparute si dezvoltate ulterior, cum ar fi Java Beans. In
momentul actual, exista doua modalitati de a crea o aplicatie cu interfata grafica si anume:
AWT (Abstract Windowing Toolkit) - este API-ul initial pus la dispozitie incepand cu primele versiuni
de Java;
Swing este parte dintr-un proiect mai amplu numit JFC (Java Foundation Classes) creat in urma
colaborarii dintre Sun, Netscape si IBM, carese bazeaza pe modelul AWT, extinzand functionalitatea
acestuia si adaugand sau inlocuind unele componente pentru dezvoltarea aplicatiilor GUI.
Este preferabil ca aplicatiile Java sa fie create folosind tehnologia Swing, deoarece aceasta pune la
dispozitie o paleta mult mai larga de facilitati, insa nu se va renunta complet la AWT deoarece aici
exista
clase
esentiale,
reutilizate
in Swing[4].
Dezavantajul AWT-ului este ca arhitectii lui au fost nevoiti sa ia in considerare numai acele clase de
obiecte grafice, care exista intr-o forma sau alta pe toate platformele. Aceasta a facut ca numarul
de clase de obiecte grafice din pachetul java.awt sa fie destul de restrans, renuntandu-se la
functionalitatile
specifice
numai
anumitor
platforme.
In
principiu,
crearea
unei
aplicatii
grafice
presupune
urmatoarele
lucruri:

Design
Crearea unei suprafete de afisare (cum ar fi o fereastra) pe care vor fi asezate obiectele grafice
(componente) care servesc la comunicarea cuutilizatorul (butoane, controale pentru editarea
textelor,
liste,
etc);
Crearea si asezarea componentelor pe suprafata de afisare la pozitiile corespunzatoare;

Functionalitate

Definirea
unor
actiuni care trebuie
sa se execute
in
momentul
cand
utilizatorul
interactioneaza cu obiectele
grafice
ale
aplicatiei;
Ascultarea evenimentelor generate de obiecte in momentul interactiunii cu utilizatorul si
executarea
actiunilor
corespunzatoare,
asa
cum
au
fost
ele
definite.

2.3.2.Pachetul javax. swing


Componentele Swing, spre deosebire de predecesoarele din versiunile Java anterioare, sunt
implementate in intregime in Java. Aceasta are ca rezultat o mai buna compatibilitate cu platforme
diferite
decat
in
cazul
folosirii
componentelor
AWT.
Unul din principalele deziderate ale tehnologiei Swing a fost sa puna la dispozitie un set
de componente GUI extensibile care sa permita dezvoltarea rapida de aplicatii Java cu interfata
grafica competitiva din punct de vedere comercial. Cel mai important pachet, care contine

componentele
de
baza este javax. swing.
Orice
interfata
utilizator Java este compusa din urmatoarele
elemente:
Componente orice poate fi plasat pe o interfata utilizator, cum ar fi butoane, liste de derulare,
meniuri
pop-up,
casete
de
validare
sau
campuri
de
text.
Containere acestea reprezinta componente care pot contine alte componente (de exemplu
panouri,
casete
de
dialog
sau
ferestre
independente)
Administratori de dispunere reprezinta obiecte care definesc modul in care sunt aranjate
(dispuse) componentele intr-un container. Administratorul de dispunere nu este vizibil intr-o
interfata,
insa
sunt
vizibile
rezultatele
muncii
sale.
Dispunerea
componentelor
interfetei estede mai multe feluri: dispunere secventiala, dispunere tabelara, dispunere marginala
sau
dispunere
tabelara
neproportionala.
1. Componente si
containere
Componentele Swing sunt
derivate
dintr-o
singura
clasa
de
baza,
numita
JComponent, care mosteneste la randul ei clasa Container din AWT. Componentele folosite pentru
crearea
interfetelor
grafice Swing pot fi grupate
astfel[4]:
Componente atomice:
- JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar, JSlider, JProgressBar, JSeparator
Componente complexe:
- JTable, JTree, JComboBox, JSpinner, JList, JFileChooser, JColorChooser, JOptionPane
Componente pentru
editare
de
text:
JTextField,
JFormattedTextField,
JPasswordField,
JTextArea,
JEditorPane,
JTextPane

Meniuri:
- JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem

Containere
intermediare:
JPanel,
JScrollPane,
JSplitPane,
JTabbedPane,
JDesktopPane,
JToolBar

Containere
de
nivel
inalt
JFrame,
JDialog,
JWindow,
JInternalFrame,
JApplet
Containerele reprezinta suprafete de afisare pe care pot fi plasate alte componente, eventual chiar
alte containere. Superclasa componentelor de acest tip este Container, din modelul AWT.
Containerele
de
nivel
inalt
Pentru a fi afisate pe ecran componentele grafice ale unei aplicatii trebuie plasate pe o suprafata de
afisare (container). Fiecare componenta poate fi continuta doar intr-un singur container, adaugarea
ei pe o suprafata noua de afisare determinand eliminarea ei de pe vechiul containerpe care fusese
plasata. Deoarece containerele pot fi incapsulate in alte containere, o componenta va face parte la
un moment dat dintr-o ierarhie. Radacina acestei ierarhii trebuie sa fie un asa numit container de
nivel
inalt, care este reprezentat
de
una din clasele
JFrame,
JDialog
sau
JApplet.
In general orice aplicatie Java independenta bazata pe Swing contine cel putin un container de nivel
inalt reprezentat de fereastra principala a programului, instanta a clasei JFrame.
Containerele
intermediare
(JPanel,
JScrollPane,
JTabbedPane,
JSplitPane,
JLayeredPane,
JDesktopPane,
JRootPane.)
reprezinta
suprafete
de
afisare cu ajutorul
carora
pot fi organizate mai eficient
componentele
aplicatiei,
putand fi imbricate.
JPanel are aceeasi functionalitate ca si clasa Panel din AWT, fiind folosit pentru
gruparea mai multor componente Swing si plasarea lor impreunape o alta suprafata de afisare.
Gestionarul de pozitionare implicit este FlowLayout, acesta putand fi schimbat insa, chiar in
momentul construirii obiectului JPanel, sau ulterior cu metoda setLayout. Adaugarea
de componente se realizeaza
ca
pentru
orice
container,
folosind
metoda
add(
).
JScrollPane este o clasa foarte importanta in arhitectura modelului Swing, deoarece ofera suport
pentru derularea pe orizontala si verticala a componentelor a caror reprezentare completa nu
incape in suprafata asociata, nici o componenta Swing neoferind suport intrinsec pentru aceasta
operatie.
Clasa JComponent este superclasa tuturor componentelor Swing, mai putin a celor care descriu
containere de nivel inalt JFrame, JDialog, JApplet. Deoarece JComponent extinde clasa Container,
deci si Component, ea mosteneste functionalitatea generala a containerelor si componentelor AWT,
furnizand
bineinteles
si
o
serie
intreaga
de
noi
facilitati[4].
Componente pentru
editare
de
text
Componentele Swing pentru afisarea si editarea textelor sunt grupate intr-o ierarhie ce are ca
radacina clasa JTextComponent din pachetul javax. swing.text. Clasele pot impartite in trei categorii,
corespunzatoare
tipului
textului
editat:
1.
Text
simplu pe o
singura
linie

JTextField
Permite
editarea
unui
text
simplu, pe o
singura
linie.
JPasswordField - Permite editarea de parole. Textul acestora va fi ascuns, in locul caracterelor
introduse
fiind
afisat
un
caracter
simbolic,
cum
ar fi *.
2.
Text
simplu pe mai multe
linii

JTextArea - Permite editarea unui text simplu, pe mai multe linii.Orice atribut legat de stil, cum
ar fi culoarea sau fontul, se aplica intregului text si nu poate fi specificat doar unei anumite portiuni.
Uzual, o componenta de acest tip va fi inclusa intr-un container JScrollPane, pentru a permite
navigarea pe verticala si orizontala daca textul introdus nu incape in suprafata alocata obiectului.
Acest lucru este valabil pentru toate componentele Swing pentru care are sens notiunea de
navigare pe orizontala sau verticala, nici una neoferind suport intrinsec pentru aceasta operatiune.
3.
Text
cu
stil
imbogatit
pe
mai
multe
linii
JEditorPane - Permite afisarea si editarea de texte scrise cu stiluri multiple si care pot include
imagini
sau
chiar
diverse
alte
componente.
JTextPane - Aceasta clasa extinde JEditorPane, oferind facilitati suplimentare pentru lucrul cu stiluri
si
paragrafe.
Componente
atomice
In categoria componentelor atomice sunt incluse componentele Swing cu functionalitate simpla, a
caror utilizare este facila si in general asemanatoare cu a echivalentelor din AWT:

Etichete:
JLabel
Butoane simple sau cu doua stari:JButton, JCheckBox, JRadioButton; mai multe butoane radio pot
fi grupate folosind clasa ButtonGroup, pentru a permite selectarea doar a unuia dintre ele.

Componente
pentru
progres
si
derulare:
JSlider,
JProgressBar,
JScrollBar

Separatori:
JSeparator
Componente
complexe
Clasa
JList
Clasa JList descrie o lista de elemente dispuse pe una sau mai multe coloane, din care utilizatorul
poate selecta unul sau mai multe. Uzual un obiect de acest tip va fi inclus intr-un container de tip
JScrollPane. Clasa ofera metode pentru selectarea unor elemente din cadrul programului
setSelectedIndex, setSelectedIndices, etc. si pentru obtinerea celor selectate la un moment dat
getSelectedIndex,
getSelectedIndices,
etc..
Clasa
JComboBox
Clasa JComboBox este similara cu JList, cu deosebirea ca permite doar selectarea unui singur
articol, acesta fiind si singurul permanent vizibil. Lista celorlalte elemente este afisata doar la
apasarea unui buton marcat cu o sageata, ce face parte integranta din componenta. JComboBox
functioneaza
dupa
aceleasi
principii
ca
si
clasa
JList.
Clasa
JTable
Clasa JTable permite crearea de componente care sa afiseze o serie de elemente intr-un format
tabelar, articolele fiind dispuse pe linii si coloane. Un tabel poate fi folosit doar pentru afisarea
formatata a unor date, dar este posibila si editarea informatiei din celulele sale. De asemenea,
liniile tabelului pot fi marcate ca selectate, tipul selectiei fiind simplu sau compus, tabelele
extinzand astfel functionalitatea listelor. O serie de clase si interfete necesare lucrului cu tabele se
gasesc in pachetul javax.swing.table, acesta fiind asadar cel ce trebuie importat.

2).
Tratarea
evenimentelor
Interfata grafica serveste interactiunii cu utilizatorul. De cele mai multe ori programul trebuie sa
faca o anumita prelucrare in momentul in care utilizatorul a efectuat o actiune si, prin urmare,
componentele trebuie sa genereze evenimente in functie de actiunea pe care au suferit-o (actiune
transmisa de la tastatura, mouse, etc.). In limbajului Java, evenimentele sunt instante ale claselor
derivate
din
AWTEvent[4].
Asadar, un eveniment este produs de o actiune a utilizatorului asupra unui obiect grafic, deci
evenimentele nu trebuie generate de programator. In schimb, intr-un program trebuie specificat
codul care se executa la aparitia unui eveniment. Tratarea evenimentelor se realizeaza prin
intermediul unor clase de tip listener (ascultator, consumator de evenimente), clase care sunt
definite in pachetul java.awt.event. In Java, orice componenta poate consuma evenimentele
generate
de
o
alta
componenta.
Daca o clasa doreste sa raspunda unui eveniment utilizator, ea trebuie sa implementeze o interfata
care sa prelucreze evenimentele. Aceste interfete se numesc interceptoare de evenimente (events
listeners). Fiecare interceptor trateaza un anumit tip de eveniment, iar o clasa poate implementa
oricate evenimente are nevoie[9]. Cele mai importante interceptoare de evenimente sunt:
ActionListener trateaza evenimente de actiune, care sunt generate de actiunea unui utilizator
asupra
unei
componente,
cum
ar
fi
executia
unui
clic
pe
un
buton.
WindowListener trateaza evenimente de ferestre, care sunt generate de maximizarea,
minimizarea,
mutarea
sau
inchiderea
ferestrelor.
MouseListener trateaza evenimente de mouse, care sunt generate de clicuri cu mouse-ul, de
patrunderea indicatorului mouse-ului pe suprafata unei componente sau de parasirea acesteia.
FocusListener trateaza evenimente de selectionare, care sunt generate, atunci cand o

componenta
devine
selectata
sau
cand
pierde
acest
atribut.

AdjustmentListener

trateaza
evenimente
de
modificare
a
componentelor.
ItemListener trateaza evenimente generate de modificarea starii unei componente).
KeyListener trateaza evenimente care apar cand utilizatorul apasa o anumita tasta.

2.4 Java DataBase Connectivity


2.4.1.Introducere
Odata cu evolutia tehnologiilor imformatice s-a ajuns la standardizarea unui limbaj SQL
(Structured Query Language) cu ajutorul caruia se pot prelucra datele stocate in bazele de date. Ca
urmare a standardizarii in 1992 a limbajului SQL, un program poate comunica cu o baza de date
fara a avea nevoie de schimbarea comenzilor SQL. Cu toate acestea, din pacate fiecare producator
de SGBD a dezvoltat propriile extensii ale SQL si ofera o interfata diferita pentru manipularea
datelor.
ODBC(Open Data Base Connectivity) reprezinta o interfata consistenta pentru prelucrarea
detelor, indiferent de formatul in care acestea sunt stocate. ODBC reprezinta o colectie de functii
apelabile din limbajul C, fiecare functie avand un nume bine determinat si o colectie de parametrii
clar stabiliti. Spre exemplu functia createTable()permite crearea unei tabele in orice format. La fel si
functia getMetaData() stie sa citeasca metadatele (informatii despre structura unei baze de date)
indiferent de faptul ca respectiva baza de date a fost creata cu Oracle, Access, Informix sau FoxPro.
Ca urmare a acestor avantaje majore, desi ODBC a fost initial conceput ca un standard pentru PC,
astazi el a devenit un standard adoptat de toate platformele.
Desi o buna parte din problemele initiale au fost rezolvate, a aparut o noua problema aceasta
fiind portabilitatea. Limbajul C++ permite scrierea unei aplicatii performante pentru manipularea
datelor, gratie si ODBC-ului, numai ca aplicatia respectiva trebuie rescrisa integral pentru a lucra pe
o alta platforma. Acest impas apare datorita faptului ca limbajul C++ nu este unul complet (in cazul
limbajului Java se stie foarte clar faptul ca o variabila de tip int va ocupa intodeauna 32 de biti,
indiferent de platforma).
Unul dintre avantajele pe care le ofera Java este portabilitatea. Aceasta inseamna ca putem rula
un program scris in Java pe orice platforma fara sa fie nevoie ca programul sa fie recompilat. Printre
bibliotecile implementate pe platformele care ruleaza Java se afla si cea care permite accesul la
bazele de date din Java: JDBC (Java DataBase Connectivity). Aceasta biblioteca
reprezinta echivalentul lui ODBC din C.

2.4.2 JDBC
Pana acum producatorii erau preocupati de dezvoltarea si livrarea driverelor ODBC pentru
sistemele lor de gestiune. Astazi ei se orienteaza spre producerea de drivere JDBC. Pentru a permite
utilizarea vechilor baze de date firma Sun pune la dispozitia utilizatorilor pachetul java. sqlcare
reprezinta un translator intre apelurile JDBC si apelurile ODBC. Folosirea limbajului Java in conjunctie
cu JDBC ofera o solutie cu adevarat portabila pentru scrierea aplicatiilor care lucreaza cu baze de
date.
In JDBC 1.0 API exista patru categorii de drivere:
1.

JDBC ODBC bridge este o interfata intre JDBC driver manager si ODBC, care a devenit un
standard. Acest tip de driver este deschis spre mai multe SGBD-uri. In acest caz, codul binar
al ODBC trebuie incarcat pe fiecare calculator client.

2.

Native API este o interfata intre JDBC driver manager si interfata client a SGBD-ului. Spre
deosebire de primul tip care este deschis, acesta este dedicat unui SGBD. In schimb este
mai performant, deoarece numarul de interfete pentru a accesa baza de date se reduce. Un
program Java care realizeaza un driver de tip 2 trebuie sa incarce in memorie codul nativ al
interfetei client a SGBD-ului in cauza.

3.

JDBC Net este o interfata intre JDBC driver manager si un serviciu specializat de acces la
date (middleware) care se executa pe un alt server. Protocolul de comunicare intre JDBC

driver manager si middleware este transparent din punct de vedere al programatorului de


aplicatii.
4.

Native protocol este o interfata intre JDBC driver manager si interfata server SGBD,
incorporand complet interfata SGBD . Astfel un program Java care este utilizat ca driver de
tip 4 trebuie sa deschida o conexiune in retea cu un calculator pe care se executa o
interfata server a SGBD-ului care ruleaza pe calculatorul client.

2.4.3. Utilizarea JDBC 1.0 API

Pentru orice aplicatie care lucreaza cu baze de date, exista cateva etape specifice care trebuie
urmate. Dintre acestea enumeram:
Crearea unei baze de date.
Inainte de prelucrarea datelor stocate trebuie sa avem la dispozitie containerul care va
contine toate aceste date. Adica este nevoie ca baza de date sa fie creata. Crearea unei baze de
date se poate realiza fie din afara unei aplicatii Java, fie in interiorul aplicatiei Java prin transmiterea
comenzilor SQL. Avantajul Java consta in faptul ca nu este nevoie sa modificam codul in functie de
formatul de stocare.
Conectarea la o baza de date.
Pentru a putea accesa o baza de date este nevoie ca aplicatia Java sa se conecteze la sursa.
In spatele acestei sintagme se ascunde urmatorul aspect: o baza de date este stocata intr-un
anumit format. Datele stocate intr-un anumit format sunt accesate cu ajutorul unui anumit format,
fie el ODBC sau JDBC. In momentul in care aplicatia noastra doreste sa se conecteze la baza de
date este nevoie de alegerea driverului potrivit si incarcarea lui in memorie.
Scrierea in baza de date.
Operatiile de introducere a datelor in baza de date pot avea loc atat din afara unei aplicatii Java
cat si prin intermediul unor comenzi SQL specifice transmise din cadrul unei aplicatii Java. Oricare
ar fi calea aleasa, una dintre comenzile utilizate este INSERT INTO NumeTabela DATA.
Citirea selectiva a datelor.
De asemenea, operatiile de citire selectiva dintr-o baza de date, pot avea loc atat din afara unei
aplicatii Java, cat si din interiorul acesteia, transmitand comanda SQL ca si parametru unei metode
care caracterizeaza comportamentul unei clase din pachetul java. sql. Comanda SQL ar putea avea
forma SELECT DATA FROM NumeTabela.
Putem spune ca unele dintre obiectivele stocarii datelor este ca prin prelucrarea lor sa obtinem
informatii, sau altfel spus sa obtinem sistematizarea lor. Acesta este de fapt obiectul final.
JDBC permite dezvoltarea unor programe client Java (aplicatii stand-alone sau applet-uri) care
acceseaza baze de date prin SGBD-ul acestora. In acest sens, un program Java, care utilizeaza JDBC
este structurat pe doua straturi:

primul este orientat spre aplicatia Java, se numeste JDBC driver manager si este in ultima
instanta un obiect Java la care se adreseaza mai multe obiecte ale aplicatiei.

al doilea este orientat spre SGBD si necesita drivere JDBC specifice bazelor de date la care
aplicatia client trebuie sa aiba acces. JDBC permite accesul simultan al unei aplicatii Java la
mai multe baze de date.

2.4.4.Structura JDBC

java. sql.CallableStatement trebuie sa permita executarea procedurilor stocate in baza de


date.
java. sql.Connection in contextul unei conexiuni cu baza de date se executa comenzile SQL si
sunt returnate rezultatele.
java. sql.DatabaseMetaData permite returnarea informatiilor referitoare la baza de date,
numarul de tabele ce fac parte din baza de date, structura tabelelor din baza de date, cate campuri
cuprinde o anumita tabela, etc.
java. sql.Driver cadrul oferit de JDBC permite utilizarea a multiple drivere. Orice astfel de
driver trebuie sa ofere o clasa care sa implementeze aceasta interfata. La cererea unei aplicatii de
conectare la o baza de date, clasa DriverManager va interoga fiecare driver daca poate realiza
conexiunea cu sursa de date. Aceasta interogare se poate realiza numai daca aceasta poate
implementa metode din interfataDriver.
java.sql.PreparedStatement un enunt SQL este precompilat si stocat intr-un obiect de
tip PreparedStatement. Acest obiect poate fi utilizat mai apoi pentru executarea de mai multe ori a
respectivului enunt cu o mult mai mare eficienta.
java.sql.ResultSet metodele acestei interfete permit accesarea tabelei generate in urma
executarii unei interogari SQL.
java.sql.ResultSetMetaData un astfel de obiect poate fi utilizat pentru a afla informatii despre
tipurile sau proprietatile unei coloane dinResultSet.
java.sql.Statement un obiect de tip Statement este utilizat pentru realizarea unei interogari
SQL statice si obtinerea rezultatelor produse ca urmare a executiei sale

2.4.5. Conectarea la baza de date

Atunci cand dorim sa scriem sau sa citim date dintr-un fisier, prima operatiune care se
realizeaza este deschiderea fisierului. Accesul la fisier este direct. In cazul fisierului care reprezinta
baza de date avem nevoie de un strat intermediar care stie sa citeasca corect datele, dat fiind
faptul ca ele sunt pastrate intr-un anumit format. Deci pentru citirea datelor din baza de date se
utilizeaza un anumit protocol. Stratul intermediar care cunoaste acest protocol este reprezentat de
driver. In concluzie contactul intre doua componente, aplicatia Java si baza de date, este realizat
prin intermediul driver-ului.
Conectarea aplicatiei la baza de date se executa prin intermediul unui obiect de
tip Connection. Pentru a obtine conexiunea trebuie sa furnizam adresa, sau altfel spus URL-ul
respectivei baze de date. Acest URL reprezinta un mod de identificare a bazei da date in asa fel
incat driverul corespunzator recunoaste denumirea si poate stabili o conexiune.
Conectarea aplicatiei la baza de date este o sarcina care revine in special clasei DriverManager.
Aceasta este una dintre principalele clase ale pachetului java.sql. In momentul in care se apeleaza
metoda getConnection(). Clasa DriverManager incearca sa gaseasca un driver care poate sa
realizeze conexiunea cu respectiva baza de date. Aceasta clasa mentine o lista a tuturor driverelor
inregistrate pe sistem si la cererea de conectare din partea unei aplicatii verifica raspunsul fiecarui
driver din lista la url-ul transmis ca parametru. Schimbul de informatie dintre
clasa DriverManager si celelalte drivere, are loc prin intermediul interfetei Driver, interfata pe care
trebuie
sa
o
implementeze
fiecare
driver
prin
metoda: getConnection(),
clasa DriverManager apeleaza metoda connect() din cadrul interfetei Driver, metoda care realizeaza
conexiunea reala cu baza de date.
URL-ul transmis ca si parametru la apelul metodei getConnection() contine un sir de caractere
cu o semnificatie bine determinata:jdbc.odbc.WebData. Inainte de a studia semnificatia exacta a
componentelor acestui URL sa vedem exact care este definitia URL-urilor.

Un URL Uniform Resource Locator reprezinta o modalitate de identificare a resurselor pe


Internet. In general, atunci cand navigam pe Internet furnizam navigatorului o cale care specifica
localizarea unui fisier sau a unui sistem legat la Internet, de exempluhttp://java.sun.com/index.html.
In alcatuirea unui URL se pot identifica doua parti importante: in primul rand este specificat
protocolul utilizat pentru accesarea resursei iar mai apoi este furnizata adresa exacta a resursei.
Adresa exacta a resursei poate cuprinde inclusiv numele site-ului (sistemului) pe care este localizat
fisierul. Protocolul in cazul exemplului dat este http Hyper Text Transfer Protocol iar adresa
exacta a resursei este data de java.sun.com/index.html.
In cazul URL-urilor JDBC, este vorba despre o cale de identificare a bazelor de date intr-un mod
specific unui anumit driver. Astfel, la furnizarea URL-ului numai un anumit driver stie sa recunoasca
URL-ul si sa decodifice informatiile furnizate in cadrul acestuia. Practic, cei care scriu driverele sunt
cei care stabilesc modul in care va arata URL-ul JDBC care identifica driverul lor. Utilizatorii
driverului nu trebuie sa-si faca probleme in acest sens: se va utiliza URL-ul furnizat odata cu
driverul. Rolul JDBC este doar de a recomanda anumite conventii privind modul de alcatuire a unui
URL. Ca urmare a faptului ca URL-urile JDBC pot fi utilizate cu un numar mare de drivere este
normal ca structura lor sa fie foarte flexibila. In primul rand, URL-urile JDBC permit diferite scheme
pentru denumirea bazelor de date. Apoi, URL-urile JDBC permit producatorilor de drivere sa
inglobeze toate informatiile de care au nevoie. Aceasta permite aplicatiilor sa acceseze bazele de
date fara ca utilizatorul sa fie nevoit sa recurga la actiuni de administrare a bazei de date. In al
treilea rand, URL-urile JDBC permit specificarea unei denumiri logice pentru baza de date si pentru
sistemul pe care este localizata baza de date. Maparea denumirii logice in denumirea fizica este
realizata de un anumit serviciu de naming disponibil in cadrul retelei sau pe sistemul local.
Sintaxa standard pentru un URL JDBC este urmatoarea:

jdbc: < subprotocol > : < 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 aplicaiei
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 aplicaiei

3.2.1 Proiectarea in ansamblu


Structurarea bazei de date
Definirea claselor
Definirea relaiilor dintre clase
Stabilirea designului
Stabilirea aplicaiilor software necesare pentru dezvoltarea aplicaiei
Publicarea
Proiectarea aplicatiei trebuie sa raspunda de urmatoarele cerinte:
o

Flexibilitate;

Fiabilitate;

admin)se

afla:

Usurinta in folosire;

Uurina in modificarea datelor

Implementarea cat mai rapida;

Eficienta maxima;

Proiectarea bazei de date trebuie sa aiba aibe in vedere cateva cerinte tehnice i anume:
o

Unicitate a cheii;

Integritate a domeniului;

Integritate a relatiei;

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 relaiilor 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. Aplicaiile 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