CATEGORII DOCUMENTE |
Aplicatie de licitatie in JAVA
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.
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.
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.
Se pot distinge mai multe criterii de clasificare:
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.
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. 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.
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++.
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.
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;).
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.
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 functia de mai sus va avea forma:
void mediaStudent (int note[], definesteStudent 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.
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().
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 sunt obligatorii
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 in linia de comanda
cu ajutorul parametrilor argc si argv, unde argc reprezinta numarul de
parametri transmisi, iar argv este un sir cu parametrii respectivi. Intotdeauna
va fi cel putin un parametru transmis, deoarece primul parametru este 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.
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.
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 tip String pentru obiectul care o apeleaza. Implicit returneaza un Sring sub forma:
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.
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.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, care se 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
cu utilizatorul (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 este de 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 container pe 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 impreuna pe 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.
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. sql care 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:
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:
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 interfata Driver.
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 din ResultSet.
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
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 exemplu https://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:
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.
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.
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 de admin)se afla:
-adaugare categori,adaugare criteriu(tip),administare licitatii si useri
Ajutor:
-Utilizare aplicatie
-Versiune
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;
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
Baza de date se numeste licitatii.mdb si vom avea 4 tabele:
Tabela Categorie
Tabela Criteriu
Tabela Licitatie
Tabela Utilizatori
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
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.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.
|
Links:
7.https://java.sun.com/javase/downloads/index.jsp
8.https://java.sun.com/docs/books/tutorial/uiswing/
9.https://java.sun.com/j2se/1.4.2/docs/api/java/awt/package-summary.html
10.https://java.sun.com/docs/books/tutorial/
11.https://www.apl.jhu.edu/~hall/java/
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 4642
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved