Aplicatia ,medical Assistance
Cuprins
Introducere 3
1. Limbajul Orientat Obiect Java 5
1.1. Principiile Programării Orientate Obiect în limbajul Java 6
1.2. Tipul de date Collection în limbajul Orientat Obiect Java 9
1.3. Java DataBase Conectivity ca metoda de apelare a bazelor de date 13
2. Framework-ul Hibernate 16
2.1. Mecanismul Object – Relational – Mapping (ORM) 17
2.2. Maparea si stocarea datelor cu ORM 18
2.3. Adnotarile Hibernate-ului 21
3. Tehnologii WEB și Securitate 24
3.1. Tehnologii WEB 24
3.1.1. Cascading Style Sheets (CSS) 24
3.1.2. Java Script (JS) 25
3.1.3. HyperText Markup Language (HTML) 27
3.1.4. JavaServer Pages (JSP) 29
3.2. Securitatea aplicației 33
4. Aplicatia “Medical Asisstance”. 39
4.1. Descrierea interfeței grafice 39
4.2. Descrierea codului 47
4.3. Descrierea bazei de date 53
Concluzii 55
Bibliografie 57
Introducere
Compatibilizarea asistenței medicale din România cu cea din celelalte țări, în special cele din Uniunea Europeană a condus la necesitatea supravegherii centralizate și asistate de calculator a stării de sănătate a populației din țara noastră. Acestor elemente li se adaugă cerințele de monitorizare a stării de sănătate a populației din întreaga lume, impuse de foruri medicale internaționale, cum ar fi OMS – Organizația Mondială a Sănătății (sau WHO, acronimul în limba engleză a denumirii World Health Organization) cu sediul central la Geneva.
Gestiunea acestor date deseori se realizează în format valoric, pe foi, pe instrumente portabile în fisiere, etc. Mai util este salvarea acestora într-o bază de date și gestionarea acestora cu ajutorul unei aplicații (desktop sau cu interfață WEB). Un astfel de tip de aplicație ar servi unui material concret ilustrativ, care permite realizarea unor concluzii referitoare la nivelul cunoașterii materialului promovat de către studenți.
În zilele noastre, tot mai des sunt utilizate interfețele grafice pentru facilitarea lucrului cu Interfețe Grafice pentru Utilizator (GUI). Cele mai des folosite GUI sunt elaborate cu ajutorul limbajelor Borland C++ Builder, C#, Java, etc.
Ca problemă concretă de rezolvare ar fi aplicarea framework-ului Hibernate la crearea unei aplicații cu interfață grafică web pentru realizarea unui management reușit al datelor personalului unei instituții medicale, datele inițiale și intermediare fiind păstrate în baze de date.
Scopul lucrării de licență este de a cerceta posibilitățile de stocare a informației în bazele de date prin intermediul limbajului Orientat Obiect Java în corelație cu framework-ul Hibernate, criteriile de analiză a rezultatelor și de a realiza o aplicație pentru a dirija datele angajaților dintr-o unitate medicală.
Ca obiective de studiu și aplicare în lucrarea de licență se pot evidenția următoarele:
cunoașterea și aplicarea posibilităților limbajului Orientat Obiect Java;
cunoașterea și aplicarea posibilităților framework-ului Hibernate;
realizarea unei baze de date și dirijarea acesteia cu instrucțiuni SQL;
Elaborarea unui program de evidență a reușitei studenților poate fi utilă la analiza atât a nivelului de pregătire a studenților, cât și a calității de promovare a cursurilor respective. Importanța practică a cercetării lucrării de licență este elaborarea unei aplicații, care ar permite prezentarea manipulării datelor angajaților a unei unități medicale utilizând Maparea Obiectual-Relațională (ORM) și limbajul Orientat Obiect Java.
Lucrarea de licență este alcătuită din abstract, introducere, 4 capitole, concluzii și bibliografie. În primul capitol este efectuată o analiză a mediilor în care este elaborată aplicația și descrierea succintă a limbajului Java. În capitolul al doilea sunt descrise caracteristicile ORM-urilor, descrierea succintă a framework-ului Hibernate, corelarea acestuia cu limbajul Java și diferența în utilizare a ORM-ului în comparație cu limbajul pur SQL. În capitolul 3 sunt descrise succint tehnologiile web și securizarea datelor în aplicații. În cel de-al patrulea capitol este descrisă aplicația elaborată și mecanismul acesteia. De asemenea, este descrisă baza de date si structura acesteia.
Aplicația Medical Assistance este elaborată cu ajutorul limbalului Orientat Obiect Java, a framework-ului de ORM Hibernate, Sistemului de Gestiune a Bazelor de Date (SGBD-ului) MySQL 5.1 dezvoltat în mediul de programare Eclipse.
Lucrarea de licență conține XX de pagini, ZZ figuri,YY tabele și o listă din WW surse bibliografice utilizate.
Limbajul Orientat Obiect Java
Java este un limbaj de programare orientat obiect, puternic tipizat, conceput de către James Gosling la Sun Microsystems (acum filială Oracle) la începutul anilor ʼ90, fiind lansat în 1995. Cele mai multe aplicații distribuite sunt scrise în Java, iar noile evoluții tehnologice permit utilizarea sa și pe dispozitive mobile, gen telefon, agendă electronică, palmtop, etc. În felul acesta se creează o platformă unică, la nivelul programatorului, deasupra unui mediu eterogen extrem de diversificat. Acesta este utilizat în prezent cu succes și pentru programarea aplicațiilor destinate intraneturilor.
Limbajul împrumută o mare parte din sintaxă de la C și C++, dar are un model al obiectelor mai simplu și prezintă mai puține facilități de nivel jos. Un program Java compilat, corect scris, poate fi rulat fără modificări pe orice platformă pe care e instalată o mașină virtuală Java (engleză Java Virtual Machine, prescurtat JVM). Acest nivel de portabilitate (inexistent pentru limbaje mai vechi cum ar fi C) este posibil deoarece sursele Java sunt compilate într-un format standard numit cod de octeți (engleză byte-code) care este intermediar între codul mașină (dependent de tipul calculatorului) și codul sursă.
Mașina virtuală Java este mediul în care se execută programele Java. În prezent, există mai mulți furnizori de JVM, printre care Sun, IBM, Bea, Oracle, FSF. În 2006, Sun a anunțat că face disponibilă varianta sa de JVM ca open-source.
Există 3 platforme Java furnizate de Sun Microsystems:
Java Platform, Micro Edition (Java ME) — pentru hardware cu resurse limitate, gen PDA sau telefoane mobile;
Java Platform, Standard Edition (Java SE) — pentru sisteme gen workstation, este ceea ce se gaseste pe calculatoare personale;
Java Platform, Enterprise Edition (Java EE) — pentru sisteme de calcul mari, eventual distribuite;
Există o vastă gamă de medii de dezvoltare pentru limbajul Java, printre care:
JCreator – gratuit JCreator LE;
Eclipse – gratuit;
NetBeans – gratuit;
BEA Workshop;
BlueJ – gratuit;
CodeGuide – comercial;
DrJava – gratuit;
IntelliJ IDEA – gratuit Idea Community Edition;
JBuilder – comercial;
JDeveloper – comercial, platformă multiplă;
KDevelop – gratuit (platformă GNU/Linux, Cygwin).
Principiile Programării Orientate Obiect în limbajul Java
Programarea Orientată pe Obiecte (POO) este o paradigmă de programare care utilizează obiecte și interacțiuni între acestea pentru a modela arhitectura unui program. Obiectele din POO sunt instanțe ale unui tip de date numit clasă. Relația dintre clasă și obiect-instanță a acelei clase este exemplificată de relația între conceptul de masă și masă din sufragerie. Ce este de remarcat că există niște tipare în lumea reală, care grupează în mintea noastră niște atribute ale obiectelor cu acțiunile lor, pentru a forma un tot ce definește obiectul respectiv. Pe acest concept, numit încapsulare, se sprijină programarea orientată obiect.
Încapsularea este conceptul complementar abstractizării. Dacă rezultatul operației de abstractizare pentru un anumit obiect este identificarea protocolului său, atunci încapsularea are de a face cu selectarea unei implementări și tratarea acesteia ca pe un secret al respectivei abstracțiuni. Încapsularea este procesul de compartimentare a elementelor care formează structura și comportamentul unei abstracțiuni; încapsularea servește la separarea interfeței "contractuale" de implementarea acesteia.
Din definiția de mai sus rezultă că un obiect este format din două părți distincte:
interfața (protocolul);
implementarea interfeței.
Beneficiile încapsulării sunt următoarele:
Separarea interfeței unui obiect de reprezentarea lui permite modificarea reprezentării fără a afecta în vreun fel pe nici unul dintre clienți, întrucât aceștia depind de interfață și nu de reprezentarea obiectului-server;
Încapsularea permite modificarea programelor într-o manieră eficientă, cu un efort limitat și bine localizat.
Abstractizarea este una din căile fundamentale prin care noi, oamenii, ajungem să înțelegem și să cuprindem complexitatea. O abstracțiune bună este cea care scoate în evidență toate detaliile semnificative pentru perspectiva din care este analizat un obiect, suprimând sau estompând toate celelalte caracteristici ale obiectului. O abstracțiune exprimă toate caracteristicile esențiale ale unui obiect, care fac ca acesta să se distingă de alte obiecte; abstracțiunea oferă o definire precisă a granițelor conceptuale ale obiectului, din perspectiva unui privitor extern. În procesul de abstractizare atenția este deci îndreptată exclusiv spre aspectul exterior al obiectului, adică spre comportarea lui, ignorând implementarea acestei comportări. Cu alte cuvinte abstractizarea ne ajută să delimităm ferm "CE face obiectul" de "CUM face obiectul ceea ce face".
Comportarea unui obiect se caracterizează printr-o sumă de servicii sau resurse pe care el le pune la dispoziția altor obiecte. Un asemenea comportament, în care un obiect, numit server, oferă servicii altor obiecte, numite clienți, este descris de așa-numitul model client-server.
Totalitatea serviciilor oferite de un obiect server constituie un contract sau o responsabilitate a obiectului față de alte obiecte;
Responsabilitățile sunt îndeplinite prin intermediul unor operații (alte denumiri folosite: metode, funcții membru);
Fiecare operație a unui obiect se caracterizează printr-o semnătură unică, formată din: nume, o listă de parametri formali și un tip returnat;
Mulțimea operațiilor unui obiect, împreuna cu regulile lor de apelare constituie protocolul obiectului.
Moștenirea este un mecanism care permite extinderea funcționalității unei clase. Se pot crea noi tipuri de date care să extindă (sau să restricționeze) proprietățile tipului de date original. Moștenirea este folositoare deoarece reduce rescrierea codului. Adică, o clasă poate fi moștenită de către o altă clasă (toate caracteristicile primei clase se regăsesc și în a doua clasă). Noua clasă își poate modifica o parte din comportament, poate adăuga ceva nou sau poate ignora ceea ce este neinteresant.
În Java pentru a crea o clasă nouă trebuie specificate: clasa moștenită și diferențele față de clasa moștenită. Clasa moștenită se specifică în clauza extends.
modificator NumeClasa extends ClasaDeBază
Clasa moștenește toate metodele accesibile și variabilele superclasei sale. Dacă clauza extends lipsește, implicit clasa moștenește clasa Object.
Observație: În Java moștenirea multiplă nu este permisă. Adică o clasă poate să moștenească o singură clasă nu mai multe.
Prin urmare, orice clasă are o superclasă și poate avea una sau mai multe subclase. Avantajele creării unei ierarhii de clase sunt:
funcționalitatea comună a mai multor clase se pune în superclase. Acest aranjament permite ca funcționalitatea să fie refolosită în mod repetat deoarece fiecare subclasă primește informația comună din superclasă;
schimbarea sau inserarea unei clase în partea de sus a ierarhiei determină automat schimbări în comportamentul claselor de jos.
Polimorfismul permite ca aceeași operație să se realizeze în mod diferit în clase diferite. Să considerăm, de exemplu, ca în clasa Figura_geometrica exista metoda arie(), care calculează aria figurii respective. Clasele Cerc, Triunghi, Patrat sunt subclase ale clasei Figuri_geometrice și vor moșteni, deci, de la aceasta metoda arie(). Este însă evident că aria cercului se calculează în alt mod decât are se pune în superclase. Acest aranjament permite ca funcționalitatea să fie refolosită în mod repetat deoarece fiecare subclasă primește informația comună din superclasă;
schimbarea sau inserarea unei clase în partea de sus a ierarhiei determină automat schimbări în comportamentul claselor de jos.
Polimorfismul permite ca aceeași operație să se realizeze în mod diferit în clase diferite. Să considerăm, de exemplu, ca în clasa Figura_geometrica exista metoda arie(), care calculează aria figurii respective. Clasele Cerc, Triunghi, Patrat sunt subclase ale clasei Figuri_geometrice și vor moșteni, deci, de la aceasta metoda arie(). Este însă evident că aria cercului se calculează în alt mod decât aria pătratului sau cea a triunghiului. Pentru fiecare din instanțele acestor clase, la calcularea ariei se va aplica metoda specifică clasei sale.
Două metode din aceeași clasă se numesc supraîncărcate (overloaded) dacă:
Au același nume;
Diferă prin numarul sau tipul argumentelor;
Nu diferă doar prin tipul returnat.
O metodă dintr-o clasă părinte poate fi suprascrisă (overrided) de o metodă din clasa derivată dacă:
Au același nume;
Au același numar și tipul de argumente;
Au același tipul returnat;
Drepturile de acces nu sunt mai restrânse.
O metodă nu poate fi suprascrisă decat o dată într-o clasă.
Folosirea POO permite realizarea de sisteme informatice de dimensiuni mărite, cu timpi de dezvoltare, testare și mentenanță reduși față de paradigmele anterioare. Totuși, pentru a crea un sistem funcțional este necesară înțelegerea corectă a conceptelor care stau în spatele POO.
Tipul de date Collection în limbajul Orientat Obiect Java
O colecție este un obiect care grupează mai multe elemente într-o singura unitate. Prin colecții vom avea acces la tipuri de date cum ar fi vectori, mulțimi, tabele de dispersie, etc. Colecțiile sunt folosite pentru memorarea și manipularea datelor, precum și pentru transmiterea datelor de la o metodă la alta.
În Java colecțiile sunt tratate într-o manieră unitară, fiind organizate într-o arhitectură ce cuprinde:
Interfețe: tipuri abstracte de date ce descriu colecțiile. Interfețele permit utilizarea colecțiilor independent de detaliile implementărilor;
Implementări: implementări concrete ale interfețelor ce descriu colecții. Aceste clase reprezintă tipuri de date reutilizabile;
Algoritmi: metode care efectuează diverse operații utile cum ar fi căutarea, sortarea definite pentru obiecte ce implementează interfețe ce descriu colecții. Acești algoritmi se numesc și polimorfici deoarece aceeasi metodă poate fi folosită pe implementări diferite ale unei colecții. Aceste tipuri de algoritmi descriu noțiunea de funcționalitate reutilizabilă.
Dintre avantajele oferite de utilizarea colecțiilor amintim:
Reducerea efortului de programare: prin punerea la dispoziția programatorului a unui set de tipuri de date și algoritmi ce modelează structuri și operații des folosite în aplicații.
Creșterea vitezei și calității programului: implementările efective ale colecțiilor sunt de înaltă performanță și folosesc algoritmi cu timp de lucru optim. În scrierea unei aplicații putem să ne concentrăm eforturile asupra problemei în sine și nu asupra modului de reprezentare și manipulare a informațiilor.
Interfețele ce descriu colecții reprezintă nucleul mecanismului de lucru cu colecții. Scopul acestor interfețe este de a permite utilizarea colecțiilor independent de modul lor de implementare.
Collection descrie un grup de obiecte numite si elementele sale. Unele implementari ale acestei interfete permit existența elementelor duplicate, alte implementări nu. Unele au elementele ordonate, altele nu. Modelează o colecție la nivelul cel mai general. In JDK nu există nici o implementare directă a acestei interfețe, ci există doar implementări ale unor subinterfețe mai concrete cum ar fi Set sau List.
Definiția interfeței este:
public interface Collection {
// Operatii de baza la nivel de element
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(Object element); // Optional
boolean remove(Object element); // Optional
Iterator iterator();
// Operatii la nivel de colectie
boolean containsAll(Collection c);
boolean addAll(Collection c); // Optional
boolean removeAll(Collection c); // Optional
boolean retainAll(Collection c); // Optional
void clear(); // Optional
// Operatii de conversie in vector
Object[] toArray();
Object[] toArray(Object a[]);
}
Set modelează noțiunea de mulțime în sens matematic. O mulțime nu poate avea elemente duplicate. List descrie liste (secvențe) de elemente indexate. Listele pot conține duplicate și permit un control precis asupra poziției unui element prin intermediul indexului acelui element. O clasă independentă ce implementează o funcționalitate asemănătoare este clasa Vector.
Definiția interfeței este:
public interface List extends Collection {
// Acces pozitional
Object get(int index);
Object set(int index, Object element); // Optional
void add(int index, Object element); // Optional
Object remove(int index); // Optional
abstract boolean addAll(int index, Collection c); // Optional
// Cautare
int indexOf(Object o);
int lastIndexOf(Object o);
// Iterare
ListIterator listIterator();
ListIterator listIterator(int index);
// Extragere sublista
List subList(int from, int to);
}
Implementările acestei interfețe map sunt obiecte ce asociază fiecărui element o cheie unică. Nu pot conține așadar chei duplicate și fiecare cheie este asociată la un singur element.
O clasă independentă ce implementează o funcționalitate asemănătoare este clasa HashTable.
Definiția interfeței este:
public interface Map {
// Operatii de baza la nivel de element
Object put(Object key, Object value);
Object get(Object key);
Object remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
// Operatii la nivel de colectie
void putAll(Map t);
void clear();
// Vizualizari ale colectiei
public Set keySet();
public Collection values();
public Set entrySet();
// Interfata pentru manipularea unei inregistrari
public interface Entry {
Object getKey();
Object getValue();
Object setValue(Object value);
}
}
SortedSet este asemănătoare cu interfața Set la care se adaugă faptul ca elementele dintr-o astfel de colecție sunt ordonate ascendent. Pune la dispoziție operații care beneficiază de avantajul ordonării elementelor.
Definiția interfeței este:
public interface SortedSet extends Set {
// Subliste
SortedSet subSet(Object fromElement, Object toElement);
SortedSet headSet(Object toElement);
SortedSet tailSet(Object fromElement);
// Capete
Object first();
Object last();
Comparator comparator();
}
SortedMap este asemănătoare cu interfața Map la care se adaugă faptul ca mulțimea cheilor dintr-o astfel de colecție este ordonată ascendent.
Definiția interfeței este :
public interface SortedMap extends Map {
SortedMap subMap(Object fromKey, Object toKey);
SortedMap headMap(Object toKey);
SortedMap tailMap(Object fromKey);
Object first();
Object last();
Comparator comparator();
}
Java DataBase Conectivity ca metoda de apelare a bazelor de date
Odată cu evoluția tehnologiilor informatice s-a ajuns la standardizarea unui limbaj SQL (Structured Query Language) cu ajutorul căruia se pot prelucra datele stocate în bazele de date. Ca urmare a standardizării în 1992 a limbajului SQL, un program poate comunica cu o bază de date fără a avea nevoie de schimbarea comenzilor SQL. Cu toate acestea, din păcate fiecare producător de SGBD a dezvoltat propriile extensii ale SQL și oferă o interfață diferită pentru manipularea datelor.
Unul dintre avantajele pe care le oferă Java este portabilitatea. Aceasta înseamnă că este posibil de a 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 reprezintă echivalentul lui ODBC din C. Folosirea limbajului Java in conjuncție cu JDBC oferă o soluție cu adevărat portabilă pentru scrierea aplicațiilor care lucrează cu baze de date.
În JDBC 1.0 API există patru categorii de drivere:
JDBC –ODBC bridge este o interfață între JDBC driver manager si ODBC, care a devenit un standard. Acest tip de driver este deschis spre mai multe SGBD-uri. În acest caz, codul binar al ODBC trebuie incarcat pe fiecare calculator client.
Native – API este o interfata intre JDBC driver manager și interfața client a SGBD-ului. Spre deosebire de primul tip care este deschis, acesta este dedicat unui SGBD. In schimb este mai performant, deoarece numărul de interfete pentru a accesa baza de date se reduce. Un program Java care realizează un driver de tip 2 trebuie sa încarce în memorie codul nativ al interfeței client a SGBD-ului în cauza.
JDBC – Net este o interfață între JDBC driver manager și un serviciu specializat de acces la date (middleware) care se executa pe un alt server. Protocolul de comunicare între JDBC driver manager și middleware este transparent din punct de vedere al programatorului de aplicații.
Native – protocol este o interfață între JDBC driver manager și interfata server SGBD, incorporand complet interfață SGBD . Astfel un program Java care este utilizat ca driver de tip 4 trebuie să deschidă o conexiune în retea cu un calculator pe care se executa o interfață server a SGBD-ului care rulează pe calculatorul client.
Pentru orice aplicație care lucrează cu baze de date, exista câteva etape specifice care trebuie urmate.
Dintre acestea enumeram:
Crearea unei baze de date – înainte de prelucrarea datelor stocate trebuie să avem la dispozitie “containerul” care va conține toate aceste date. Adică este nevoie ca baza de date să fie creata. Crearea unei baze de date se poate realiza fie din afara unei aplicații Java, fie în interiorul aplicației Java prin transmiterea comenzilor SQL. Avantajul Java constă în faptul că nu este nevoie să modificăm codul în funcție de formatul de stocare.
Conectarea la o baza de date – pentru a putea accesa o baza de date este nevoie ca aplicatia Java a se “conecteze” la sursa. In spatele acestei sintagme se ascunde urmatorul aspect: o baza de date este stocata într-un anumit format. Datele stocate într-un anumit format sunt accesate cu ajutorul unui anumit format, fie el ODBC sau JDBC. În momentul în care aplicația noastră dorește sa se conecteze la baza de date este nevoie de alegerea driverului potrivit si incarcarea lui în memorie.
Scrierea în baza de date – operațiile de introducere a datelor în baza de date pot avea loc atat din afara unei aplicații Java cât și prin intermediul unor comenzi SQL specifice transmise din cadrul unei aplicații Java. Oricare ar fi calea aleasă, una dintre comenzile utilizate este INSERT INTO NumeTabela DATA.
Citirea selectivă a datelor – de asemenea, operațiile de citire selectivă dintr-o baza de date, pot avea loc atat din afara unei aplicații Java, cât și din interiorul acesteia, transmițând comanda SQL ca și parametru unei metode care caracterizează comportamentul unei clase din pachetul java. sql. Comanda SQL ar putea avea forma SELECT DATA FROM NumeTabela.
Putem spune că unele dintre obiectivele stocarii datelor este ca prin prelucrarea lor să obținem informații, sau altfel spus să obținem sistematizarea lor. Acesta este de fapt obiectul final. JDBC permite dezvoltarea unor programe client Java (aplicații stand-alone sau applet-uri) care accesează baze de date prin SGBD-ul acestora. În acest sens, un program Java, care utilizează JDBC este structurat pe două straturi:
primul este orientat spre aplicația Java, se numeste JDBC driver manager și este în ultima instanta un obiect Java la care se adresează mai multe obiecte ale aplicației.
al doilea este orientat spre SGBD și necesită drivere JDBC specifice bazelor de date la care aplicația client trebuie sa aibă acces. JDBC permite accesul simultan al unei aplicații Java la mai multe baze de date.
Framework-ul Hibernate
Hibernate este un framework open source pentru maparea object/relațional. În mod tradițional, lucrul cu baza de date presupunea accesarea datelor cu ajutorul unor array-uri ce reprezintă structura bazei de date. Acest mod de lucru este folosit atunci când datele se accesează direct prin librăria JDBC. Hibernate permite asocierea tabelelor cu clase din limbajul Java, făcând transparent transferul de date dintre aplicație și baza de date. Clasele rezultate în urma asocierii cu tablele din baza se numesc clase persistente. Hibernate are multe funciționalități legate de interacțiunea cu baza de date.
Cele mai importante sunt enumerate mai jos.
Generează clase persistente în urma analizei schemei bazei de date sau a schemei xml ce descrie structura datelor.
Generează schema bazei de date în urma analizei schemei xml ce descrie structura datelor.
Permite evitarea descrierii structurii de date cu ajutorul unei scheme xml prin interpretarea adnotarilor făcute direct în clasele persistente.
Permite generarea de documentație pe baza analizei schemei xml ce descrie structura datelor.
Are un limbaj propriu de interogare a bazei de date (limbajul de interogare lucrează cu clase persistente, nu cu tabele).
Scopul Hibernate este să înlăture dificultățile întâmpinate de developeri în timpul lucrului cu librăria Jdbc. Astfel, Hibernate apropie mai mult interacțiunea cu baza de date de modul de lucru orientat pe obiecte. El oferă posibilitatea unui sistem de development mult mai adecvat pentru aplicații de mari dimensiuni axate pe interactiunea cu baza de date.
În mod normal, o sesiune de lucru cu Hibernate presupune următoarele:
Crearea claselor persistente (acestea sunt obiecte java simple (POJO))
Crearea schemei xml de mapare între clasele persistente și schema bazei de date
Apelul funcțiilor din librăriile Hibernate pentru a interacționa cu baza de date
Mecanismul Object – Relational – Mapping (ORM)
Object / Relational Mapping (ORM) este o tehnică de programare ce face posibilă accesarea și manipularea obiectelor fără ca programatorii să fie interesați de sursa de date de unde provin aceste obiecte. Această tehnică a apărut din nevoia de a depăși diferențele de paradigmă dintre modelul orientat pe obiecte (susținut de limbajele de programare de nivel înalt actuale) și modelul relațional (utilizat de cele mai populare sisteme de gestiune a bazelor de date).
Limbajele de programare orientate pe obiecte reprezintă datele într-un graf interconectat de obiecte, pe când bazele de date relaționale folosesc un mod tabelar de reprezentare. Efortul de a conecta atributele claselor definite prin intermediul unui limbaj orientat pe obiecte cu câmpurile tabelelor din baza de date nu poate fi ignorat iar scopul unui ORM este acela de a crea o relație naturală, transparentă, fiabilă și de durată între cele două modele. Această nepotrivire de paradigmă pare să nu își fi găsit încă o soluționare definitivă care să fie aprobată de toți actorii din industria IT, însă opinia generală este aceea că framework-urile ORM reprezintă un important pas înainte.
Procesul automat de stocare a obiectelor într-o bază de date relațională folosind un framework ORM, constă în maparea obiectelor la tabelele corespunzătoare, asocierea dintre ele fiind descrisă folosind metadata. Un framework ORM complet include următoarele funcționalități:
un API pentru operațiile CRUD (create, read, update, delete) aferente claselor persistente;
un limbaj pentru specificarea interogărilor adresând clasele persistente și atributele acestora;
un mod care sa faciliteze definirea metadata pentru mapările dintre obiect și tabela;
o abordare consistentă a tranzacțiilor, a metodelor de stocare a datelor („caching”) și a asocierilor dintre clase;
tehnici de optimizare în funcție de natura aplicației.
Acest articol propune o discuție de ansamblu asupra deciziei de utilizare a framework-urilor ORM prin descrierea câtorva dintre cele mai importante provocări și prin menționarea argumentelor pro și contra în aceste cazuri. Pentru exemplificări sunt folosite limbajul Java șiframework-ul ORM Hibernate, acesta beneficiind de o popularitate ridicată în rândul programatorilor. Componentele implicate în mecanismul de ORM sunt prezentate în Figura 1.
Figura 1. Componentele implicate în mecanismul ORM. Cele două entități sunt persistate în tabelele corespunzătoare prin intermediul framework-ului ORM.
Maparea si stocarea datelor cu ORM
Performanța unui mecanism ORM și productivitatea programatorului depind mult de o bună mapare a entităților la tabelele bazei de date. Printre riscurile unei mapări greșite se numără:
generarea interogărilor neperformante;
supraîncărcarea memoriei cu obiecte care nu sunt necesare în urma execuției interogărilor;
productivitate sub așteptări a programatorului din pricina scenariilor complexe determinate de mapări.
Folosirea eficientă a unei implementări ORM presupune o cunoaștere minimă a modului în care implementarea respectivă funcționează „în interior” pentru a evita riscurile descrise mai sus. Un scenariu obișnuit cu risc ridicat constă din însumarea următoarelor condiții:
cuplare strânsă între entități și existența atributelor de tip colecție de entități;
relații de 1-n, m-n sau n-1 între entități;
cascadare pe mai mult de un nivel;
lipsa unei optimizări din punct de vedere a obținerii datelor („fetching”).
Odată ajuns într-un astfel de scenariu și în situația de a repara o problemă, șansele de apariție a unor efecte secundare în alte părți ale proiectului cresc. Testele ajută programatorul să observe dacă soluția găsită creează o problemă într-o altă zona a aplicației, însă provocarea consta în a găsi soluția care face față tuturor îngrădirilor datorate mapărilor și nu strică o altă parte din proiect, ceea ce este dificil.
De aceea, în procesul de stabilire a entităților care urmează să fie mapate programatorul trebuie sa fie concentrat pe principiul de a menține maparea simplă. Mapările simple și relațiile cât mai simple între entități duc la o întreținere mai ușoară pe parcurs datorită constrângerilor mai relaxate.
API-ul de JDBC („Java Database Connectivity”) oferă acces universal la date din limbajul Java și este compus din doua pachete: java.sql și javax.sql. Soluțiile existente pentru stocarea datelor folosind JDBC API sunt restrânse, se poate aminti interfața javax.sql.rowset.CachedRowSet reprezentând un container de înregistrări pe care și le stochează în memorie. Se constituie totodată o componentă JavaBeans ce dispune de scrolling și posibilități de actualizare și serializare. Implementarea de bază acceptă preluarea de date dintr-un set de rezulte, dar poate fi extinsă pentru a obține date și din alte surse tabulare. Cu un astfel de obiect se poate lucra în modul deconectat de baza de date, fiind nevoie de o conexiune doar atunci când datele trebuie sincronizate.
Pe baza JDBC API s-au dezvoltat și alte biblioteci care oferă mai multe soluții de stocare a datelor în memorie, astfel de exemple fiind:
Extensia Oracle pentru JDBC – oferă o interfața și implementare pentru statement cache (stocarea statement-urilor care sunt folosite în mod repetat)
Implementarea PostgreSQL pentru JDBC – oferă un wrapper de stocare a statement-urilor peste implementarea de baza a JDBC-ului.
Există și alte soluții de stocare în memorie oferite de părți terțe care pot fi integrate într-o aplicație care folosește direct JDBC API. Astfel de exemple sunt:
Commons JCS
Ehcache
Din punct de vedere al framework-urilor ORM, acestea completează discuția despre “a nu discuta cu baza de date” cu subiectul “a nu discuta cu API-ul JDBC” în cazul Java, în sensul de a face transparentă programatorului relația cu API-ul JDBC, și de a manipula obiectele stocate în memorie doar la nivelul ORM-ului și al implementărilor sale pentru astfel de stocări.
Hibernate oferă un prim nivel de stocare („first-level cache”) care e asociat cu sesiunea și e folosit implicit; mai oferă un al doilea nivel („second-level cache)” care e asociat cu fabrica de sesiuni și este opțional (Figura 2).
Figura 2. Nivelele unu și doi de stocare a datelor oferit de Hibernate.
Primul nivel de stocare e folosit pentru a reduce numărul interogărilor pe baza de date la nivelul unei sesiuni. Datele nu pot fi stocate în memorie și folosite de alte sesiuni în afara aceleia care a adus datele inițial.
Cel de-al doilea nivel de stocare este localizat la nivelul fabricii de sesiuni și este capabil de a depozita date din diferite sesiuni. Acest lucru înseamnă că toate obiectele de sesiune pot accesa aceleași date stocate. Hibernate suportă patru implementări „open source” pentru folosirea nivelului 2 de stocare. Acestea sunt:
Ehcache
OSCache
JBoss TreeCache
Swarm Cache
Prin faptul că primul nivel de cache e folosit în mod implicit, Hibernate aduce deja un plus important în ceea ce privește performanța din punct de vedere al comunicării cu baza de date față de folosirea API-ul de JDBC. De asemenea, cel de-al doilea nivel de stocare, folosit în general pentru optimizarea aplicațiilor relativ bune din punct de vedere al performantei, duce la o creștere importantă a acesteia, iar programatorul are flexibilitatea de a alege implementarea care se potrivește cel mai bine contextului dat.
Adnotarile Hibernate-ului
Hibernate poate prelucra obiectele mapate cu ajutorul adnotărilor pentru entitațile EJB3.0. Entitățile EJB3 reprezintă același concept precum cele specifice persistenței hibernate. Maparea acestora este definită in cadrul adnotărilor JDK5.0.
Adnotările pot fi împărțite în două categorii:
Logice – descriu modelul obiectual, asocierile claselor
Fizice – descriu schemele fizice, tabelele, coloanele, indecșii.
Adnotările EJB3 sunt în pachetul javax.persistence.*, iar majoritatea IDE-urilor (Eclipse, IntelliJIDEA, Netbeans, etc) oferă autocomplete pentru interfețe și atribute. În continuare vor fi un set de adnotări (cele mai des utilizate) cu descrierea succintă:
@Entity – fiecare clasă POJO persistentă este o entitate și se declară folosind această adnotare, la nivel de clasă. Prin adnotarea @Id se specifică a fi cheie primară câmpul (coloana) Id. Foarte important de menționat este ca dacă într-o clasă adnotată cu @Entity nu este prezent și atributul @Id, compilatorul va semnala eroare.
Adnotările pot fi scrise atât la nivel de câmp cât și proprietate, dar nu este recomandată mixarea tipurilor de utilizare a acestora.
@Entity
public class Flight implements Serializable {
@Id
Long id;
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
}
@Table – Poate fi folosit la nivel de clasă și specifică numele sub ca va fi mapată clasa. Default, în lipsa acestei adnotări se folosește numele clasei ca nume pentru tabelă.
@Entity
@Table(name="tbl_sky")
public class Sky implements Serializable
@Column – Poate fi folosită pentru a suprascrie valorile default de configurare ale unei coloane. În acest exemplu, proprietatea Name este salvată în tabelă sub numele de "flight-name", nu poate fi updatată sau nulă, iar fiecare informație poate avea maxim 50 de caractere.
@Column(updatable = false, name = "flight_name", nullable = false, length=50)
public String getName() { … }
@Id, @GeneratedValue – poate fi definită proprietatea entității ce are rol de identificator. Această proprietate poate fi setată de către aplicație sau generată de către Hibernate (preferabil). Strategia de generare este definită de către adnotarea @GeneratedValue.
Sunt patru tipuri de generări:
AUTO – oricare dintre următoarele trei (alegerea este făcută în funcție de BD)
TABLE – o tabelă va ține id-ul
IDENTITY – coloana identitate
SEQUENCE – secvență
Hibernate oferă metode de generare adiționale(a se vedea Hibernate Extensions). Primul exemplu arată modul de folosire a strategiei Sequence, iar cel de-al doilea, strategia Identity. Strategia de generare preferată este AUTO (pentru aplicații portabile). Pentru a defini o cheie primară compusă, sunt următoarele soluții:
adnotarea proprietății cu @Id si cu @Embeddable clasa componentă
adnotarea proprietății cu @EmbeddedId
adnotarea clasei cu @IdClass și a fiecărei proprietăți ce compune cheia cu @Id
@Entity
@IdClass(FootballerPk.class)
public class Footballer {
@Id
private String firstName;
@Id
private String lastName;
….
}
Tehnologii WEB și Securitate
Tehnologii WEB
Tehnologiile utilizate în aplicațiile Web reprezintă în general acele limbaje de programare utilizate la crearea de site-uri web complexe, interactive, al căror concept presupune stăpânirea cât mai detaliată a unor limbaje de scripting sau de programare și baze de date.
Câteva aplicații Web întalnite mai des sunt:
portal-uri;
forum-uri;
magazine virtuale;
formulare de înscriere;
licitații on-line, etc.
Acum câțiva ani, tehnologiile Web erau folosite doar de marile companii datorită, în principal, costurilor ridicate ale licențelor programelor de dezvoltare. În prezent, datorită dezvoltării tot mai accentuate a soluțiilor Open Source, oricine își poate permite realizarea de aplicații web.
Cascading Style Sheets (CSS)
CSS este un standard pentru formatarea elementelor unui document HTML. Stilurile se pot atașa elementelor HTML prin intermediul unor fișiere externe sau în cadrul documentului, prin elementul<style> și/sau atributul style. CSS se poate utiliza și pentru formatarea elementelor XHTML, XML și SVGL. CSS3 reprezintă un upgrade ce aduce câteva atribute noi și ajută la dezvoltarea noilor concepte în webdesign.
Unele dintre cele mai importante segmente (module) noi adăugate acestui standard pentru formatarea elementelor HTML aduc un plus considerabil în dezvoltarea activități webdesign.
Mai jos sunt prezente in listă cele mai importante modulele adăugate în CSS3:
Selectors
Box Model
Backgrounds and Borders
Image Values and Replaced Content
Text Effects
2D/3D Transformations
Animations
Multiple Column Layout
User Interface
Deși au apărut unele deficiente de compatibilitate între browsere, majoritatea proprietăților CSS3 au fost implementate cu succes in variantele browserelor noi.
Java Script (JS)
JS este un limbaj de programare orientat obiect bazat pe conceptul prototipurilor.[5] Este folosit mai ales pentru introducerea unor funcționalități în paginile web, codul Javascript din aceste pagini fiind rulat de către browser. Limbajul este binecunoscut pentru folosirea sa în construirea siturilor web, dar este folosit și pentru acesul la obiecte încastrate (embedded objects) în alte aplicații. A fost dezvoltat inițial de către Brendan Eich de la Netscape Communications Corporation sub numele de Mocha, apoi LiveScript, și denumit în final JavaScript.
În ciuda numelui și a unor similarități în sintaxă, între JavaScript și limbajul Java nu există nicio legătură. Ca și Java, JavaScript are o sintaxă apropiată de cea a limbajului C, dar are mai multe în comun cu limbajul Self decât cu Java. Cea mai des întâlnită utilizare a JavaScript este în scriptarea paginilor web. Programatorii web pot îngloba în paginile HTML script-uri pentru diverse activități cum ar fi verificarea datelor introduse de utilizatori sau crearea de meniuri și alte efecte animate.
Browserele rețin în memorie o reprezentare a unei pagini web sub forma unui arbore de obiecte și pun la dispoziție aceste obiecte script-urilor JavaScript, care le pot citi și manipula. Arborele de obiecte poartă numele de Document Object Model sau DOM. Există un standard W3C pentru DOM-ul pe care trebuie să îl pună la dispoziție un browser, ceea ce oferă premiza scrierii de script-uri portabile, care să funcționeze pe toate browserele. În practică, însă, standardul W3C pentru DOM este incomplet implementat. Deși tendința browserelor este de a se alinia standardului W3C, unele din acestea încă prezintă incompatibilități majore, cum este cazul Internet Explorer.
O tehnică de construire a paginilor web tot mai întâlnită în ultimul timp este AJAX, abreviere de la „Asynchronous JavaScript and XML”. Această tehnică constă în executarea de cereri HTTP în fundal, fără a reîncărca toată pagina web și actualizarea numai anumitor porțiuni ale paginii prin manipularea DOM-ului paginii. Tehnica AJAX permite construirea unor interfețe web cu timp de răspuns mic, întrucît operația (costisitoare ca timp) de încărcare a unei pagini HTML complete este în mare parte eliminată.
Ca exemplu poate fi aplicația pentru determinarea lungimii unui sir de caractere introdus de la tastatura:
<html>
<head>
<title>Determinarea numarului de caractere al unui sir</title>
</head>
<script type="text/javascript">
var myString=window.prompt("Dati sirul de caractere: ","");
var length = myString.length;
document.write("<b><i><u>");
document.write(myString);
document.write("</u></i></b>");
document.write(" are lungimea: </b></i></u>" + length);
document.write("</u></i></b>");
document.write("<br /> are lungimea: " + myString.length);
</script>
<body bgcolor="#CCCCEE">
<font face="Arial" size=5>
</font>
</body>
</html>
HyperText Markup Language (HTML)
HTML este un limbaj de marcare utilizat pentru crearea paginilor web ce pot fi afișate într-un browser (sau navigator). Scopul HTML este mai degrabă prezentarea informațiilor – paragrafe, fonturi, tabele ș.a.m.d. – decât descrierea semanticii documentului.
HTML este o formă de marcare orientată către prezentarea documentelor text pe o singura pagină, utilizând un software de redare specializat, numit agent utilizator HTML, cel mai bun exemplu de astfel de software fiind browserul web. HTML furnizează mijloacele prin care conținutul unui document poate fi adnotat cu diverse tipuri de metadate și indicații de redare. Indicațiile de redare pot varia de la decorațiuni minore ale textului, cum ar fi specificarea faptului că un anumit cuvânt trebuie subliniat sau că o imagine trebuie introdusă, până la scripturi sofisticate, hărți de imagini și formulare. Metadatele pot include informații despre titlul și autorul documentului, informații structurale despre cum este împărțit documentul în diferite segmente, paragrafe, liste, titluri etc. și informații cruciale care permit ca documentul să poată fi legat de alte documente pentru a forma astfel hiperlink-uri (sau web-ul).
HTML este un format text proiectat pentru a putea fi citit și editat de oameni utilizând un editor de text simplu. Totuși, scrierea și modificarea paginilor în acest fel solicită cunoștințe solide de HTML și este consumatoare de timp. Editoarele grafice (de tip WYSIWYG) cum ar fi Macromedia Dreamweaver, Adobe GoLive sau Microsoft FrontPage permit ca paginile web sa fie tratate asemănător cu documetele Word, dar cu observația că aceste programe generează un cod HTML care este de multe ori de proastă calitate.
HTML se poate genera direct utilizând tehnologii de codare din partea serverului cum ar fi PHP, JSP sau ASP. Multe aplicații ca sistemele de gestionare a conținutului, wiki-uri și forumuri web generează pagini HTML. HTML este de asemenea utilizat în e-mail. Majoritatea aplicațiilor de e-mail folosesc un editor HTML încorporat pentru compunerea e-mail-urilor și un motor de prezentare a e-mail-urilor de acest tip. Folosirea e-mail-urilor HTML este un subiect controversat și multe liste de mail le blochează intenționat. HTML este prescurtarea de la Hyper Text Mark-up Language si este codul care sta la baza paginilor web. Paginile HTML sunt formate din etichete sau tag-uri și au extensia .html sau .htm .În marea lor majoritate aceste etichete sunt pereche, una de deschidere <eticheta> și alta de închidere </eticheta>, mai există și cazuri în care nu se închid, atunci se folosește <eticheta /> browserul interpretează aceste etichete afișând rezultatul pe ecran. HTML-ul nu este un limbaj case sensitiv (nu face deosebirea între litere mici și mari). Pagina principală a unui domeniu este fisierul index.html respectiv index.htm. Această pagină este setată a fi afișată automat la vizitarea unui domeniu. De exemplu la vizitarea domeniului www.nume.ro este afișată pagina www.nume.ro/index.html.
Unele etichete permit utilizarea de atribute care pot avea anumite valori: <eticheta atribut="valoare"> … </eticheta>
Orice fișier html are următoarea structură:
<html>
<head>
<title>Titlul</title>
</head>
<body>
…
</body>
</html>
JavaServer Pages (JSP)
Pentru a oferi proiectanților acces la API-ul Servlet fără a trece prin cele trei faze menționate anterior cât și pentru a veni cu o soluție pentru problemele deja existente, Sun a definit specificația JavaServer Pages ce permite ca Java să devină limbaj de scripting pe partea de server și mai mult decât atât.
JavaServer Pages este tehnologia platformei Java pentru construirea de aplicații ce cuprind pagini de Web cu conținut dinamic precum HTML, DHTML, XHTML și XML. Sun a încercat să depășească limitările soluțiilor actuale pentru generarea de pagini cu conținut dinamic prin dezvoltarea unei tehnologii care:
• să funcționeze pe orice server Web sau de aplicații;
• să separe logica ce stă în spatele aplicației de aspectul paginii;
• să permită dezvoltare și testare rapidă;
• să simplifice procesul de dezvoltare de aplicații interactive Web.
Tehnologia JSP a fost creată să satisfacă aceste cerințe, fiind rezultatul unei cooperări la nivelul industriei software dintre producătorii de servere Web, servere de aplicații, sisteme tranzacționale și unelte de dezvoltare. Astfel, procesul dezvoltării de pagini de Web dinamice este accelerat de către JSP din următoarele considerente:
Separarea generării conținutului de prezentare
Prin tehnologia JavaServer Pages, proiectanții de pagini folosesc tag-uri obișnuite HTML sau XML pentru formatarea rezultatului și tag-uri JSP sau scriplet-uri pentru generarea conținutului dinamic al paginii. Logica ce stă în spatele generării conținutului este cuprinsă în tag-uri și componente JavaBean, legătura dintre acestea făcându-se în scriplet-uri și totul fiind executat pe server. Astfel, proiectanții de pagini sau Web master-ii pot edita și lucra cu pagini JSP fără a afecta generarea conținutului dinamic.
Pe partea de server, un engine (motor) JSP interpretează scriplet-urile și tag-urile JSP, generează conținutul cerut (accesând componente JavaBean, baze de date folosind JDBC sau prin includerea de fișiere) și trimite rezultatele înapoi sub forma unei pagini HTML (sau XML) către browser.
Reutilizarea componentelor și a tag-urilor
Tehnologia JSP permite reutilizarea componentelor precum JavaBeans, Enterprise JavaBeans sau a tag-urilor atât independent, cât și în cadrul unor unelte interactive de dezvoltare a componentelor și paginilor de Web. Creatorii de pagini Web nu sunt întotdeauna programatori familiarizați cu limbaje de scripting. JSP încapsulează funcționalitățile necesare pentru crearea de conținut dinamic în tag-uri de tip XML specifice JSP. Tag-urile JSP standard pot accesa și instanția componente JavaBean, pot seta sau obține atribute ale bean-urilor, pot face download la applet-uri și pot executa funcții ce ar fi dificil de implementat. Tehnologia JSP este extensibilă prin dezvoltarea de biblioteci de tag-uri definite de utilizator. Cu timpul vor fi create biblioteci proprii de tag-uri pentru funcțiile folosite cel mai frecvent.
Tehnologia JSP este complet independentă de platformă atât în ceea ce privește paginile de Web dinamice, cât și serverele de Web și componentele acestora. Aceasta este explicabil deoarece limbajul de scripting pentru paginile JSP se bazează pe Java și în special pe modul de manipulare a obiectelor în acest limbaj (vezi paragraful 1.4.4 din [2]).
O pagină JSP (*.jsp) este o pagină HTML sau XML ce cuprinde elemente adiționale (tag-uri, declarații, scriplet-uri) pe care motorul JSP le procesează și le elimină returnând o pagină standard HTML/XML. Ea corespunde unui document ce descrie procesarea unei cereri pentru a crea un răspuns.
O pagină JSP cuprinde în structura sa:
• cod HTML/XML standard – cod ce rămâne neinterpretat de motorul JSP;
• directive JSP – directive ce furnizează informații globale independente conceptual de o anumită cerere adresată paginii JSP;
• tag-uri JSP – spre deosebire de directive, tag-urile depind de fiecare cerere în parte adresată paginii JSP;
• elemente de scripting – acestea putând fi: declarații, scriplet-uri și expresii.
• Paginile JSP folosesc directive JSP pentru a transmite instrucțiuni motorului JSP. În specificația 1.0 aceste directive sunt:
• <%@ include …%> folosită pentru a insera în pagină un document extern ce poate fi și un alt document JSP;
• <%@ page …%> folosită pentru a transmite informații referitoare la pagină precum limbajul de scripting, buffer-ul, informații despre thread-uri, "pachete importate", modul de tratare al excepțiilor etc;
• <%@ taglib …%> indică o bibliotecă de tag-uri pe care pagina respectivă le poate invoca. Nu este disponibilă în implementările actuale.
• JSP include o serie de tag-uri standard. Sintaxa lor este cea a tag-urilor XML (< tag attr1="valoare atribut" …> corp </tag> sau < tag attr1="valoare atribut" …/>). Acestea sunt:
• <jsp:forward> înaintează cererea către un alt fișier HTML, fișier JSP sau servlet;
• <jsp:include> include în etapa de procesare a cererii fișierul specificat în tag;
• <jsp:plugin> face download către browser-ul clientului la un plugin Java pentru executarea unui applet sau a unui Bean. Nu este disponibil în implementările actuale.
• <jsp:useBean> declară folosirea unei instanțe, a unei componente JavaBean. Dacă aceasta nu există atunci componenta JavaBean instanțiază și înregistrează tag-ul;
• <jsp:setProperty> setează valoarea unei anumite proprietăți a unui Bean;
• <jsp:getProperty> obține valoarea unei instanțe a unui Bean, o convertește la String și o depune în obiectul implicit de ieșire out.
O pagină JSP poate crea și/sau accesa, la procesarea unei cereri, anumite obiecte Java. Obiectele astfel create pot deveni vizibile elementelor de scripting prin variabile în limbajul de scripting. Acestea vor conține, în timpul etapei de procesare a cererilor, referințe către obiectul respectiv. Obiectele create au un atribut numit scope ce definește domeniul de vizibilitate al acestora: când există o referință la acest obiect și când aceasta va fi înlăturată. Valorile pe care le poate avea atributul scope sunt:
• page – accesibil doar în cadrul paginii în care a fost creat obiectul;
• request – accesibil din paginile ce procesează aceeași cerere în care a fost creat obiectul;
• session – accesibil din paginile ce se sunt în aceeași sesiune în care a fost creat obiectul;
• application – accesibil din paginile de procesează aceeași aplicație în care a fost creat obiectul.
Toate referințele la acesta sunt eliberate când mediul runtime solicită ServletContext-ul
Numele atașat unui obiect este unic pe tot timpul execuției, toate domeniile de vizibilitate comportându-se ca unul singur în cadrul unei secvențe cerere/ răspuns. Lipsa transmiterii variabilelor de stare prin HTTP este suplinită în mod automat de către motorul JSP prin cele două modalități cunoscute: cookie-uri, respectiv rescrierea URL-urilor. Cât timp sunt făcute cereri procesate de către motorul JSP, rescrierea URL-urilor este făcută în mod automat.
Orice pagină JSP conține o serie de obiecte create implicit :
• request – cererea ce a solicitat pagina respectivă;
• response – răspunsul la cerere;
• pageContext – contextul paginii curente;
• session – obiect de tip sesiune pentru clientul solicitat (valabil doar pentru HTTP);
• application – contextul servlet-ului generat (getServletConfig().get Context();
• config – obiect de tip ServletConfig pentru această pagină;
• page – instanță a clasei create pentru această pagină (pentru Java: this);
• exception – excepția declanșată anterior putând fi folosită doar în pagina de eroare invocată;
• config – obiect de tip JspWriter ce scrie în stream-ul de ieșire.
Explozia Internet-ului face ca cerințele pentru aplicații Web să crească vertiginos. În aceste condiții o tehnologie precum JavaServer Pages este mai mult decât binevenită. Sprijinul de care se bucură din partea industriei software precum și faptul că se bazează pe platforma Java pot face din JSP soluția de facto pentru aplicații Web. În sprijinul acestei afirmații nu vin doar declarațiile din partea unor nume celebre precum Oracle, Netscape, Weblogic, IBM, Fujitsu ș.a., ci și integrarea în viitoarea platformă Java 2 Enterprise Edition și tehnologii precum JavaBeans sau Enterprise JavaBeans.
Securitatea aplicației
Securitatea este un motiv de îngrijorare pentru dezvoltarea oricarui tip de aplicație. Cu toate acestea, aplicațiile web dezvăluie anumite caracteristici care trebuie luate în considerare la proiectarea funcționalităților de securitate și care solicită mai multe tehnici de securitate, comparativ cu alte tipuri de aplicații. De exemplu, spre deosebire de programele care sunt instalate pe o singură mașina gazdă, aplicațiile web sunt accesibile publicului, pe Internet, pentru a ajunge la o număr mare de potențiali utilizatori. De exemplu, autentificarea și autorizarea utilizatorilor trebuie să fie implementate în mod diferit pentru sistemele folosite de un singur utilizator.
Termenul în sine de securitate este destul de abstract, iar furnizorii de servicii și clienții unei aplicații Web pot avea păreri diferite despre acestea. Acest lucru, include aspecte privitoare la intimitate, prevenirea "eavesdropping" atunci când mesajele sunt schimbate pe canalele accesibile publicului, precum și asigurarea serviciilor de încredere.
De multe ori, obiectivul principal al procesului de proiectare al aplicațiilor web este funcționalitatea, asa-numita logică a afacerii (business logic), ușurință în folosire, precum și capacitatea lor de a atrage clienți. Cu toate acestea, tratarea problemelor de securitate are și un impact asupra succesului (comercial) al aplicațiilor web. Clienții se așteaptă ca aplicațiile web să fie securizate și astfel, datele lor private să fie pastrate în siguranță.
Figura xx. ilustreaza diferite aspecte legate de securitate, care de obicei, se aplica în cazul asigurării unei aplicații Web de către un furnizor de servicii si invocarea acesteia, printr-un client.
Figura 3. Aspecte ale securității aplicațiilor web
Securizarea calculatorului utilizatorului și a datelor personale stocate pe acesta. Calculatorul clientului și documentele stocate în sistemul de fisiere trebuie sa fie protejate împotriva accesului neautorizat de către părți terțe, posibil rău intenționate. Pentru client, datele personale, cum ar fi informațiile de contact sau numerele cardurilor de credit sunt deosebit de importante si trebuie să fie pastrate private.
Securizarea informațiilor în tranzit. Trebuie prevenite eavesdropping și modificarea mesajelor. Securizarea mesajelor include și autentificarea și autorizarea părților care comunică și non-repudierea mesajelor.
Securizarea serverului și a datelor stocate pe el. Trebuie să se asigure disponibilitatea serviciului, prin eliminarea atacurilor de tip DoS (denial-of-service). Mai mult decât atât, părțile neautorizate trebuie să fie împiedicate în obtinerea accesului la informațiile personale ale clienților, angajaților si la alte resurse critice ale afacerii (de exemplu, bazele de date locale).
Criptarea este o tehnologie de bază care permite schimbul securizat de mesaje. Criptare (sau cifrarea) implica utilizarea de funcții matematice prin care un simplu text este transformat într-un text cifrat. Decriptarea (sau decifrarea) descrie procesul invers, adică transformarea textului codificat înapoi în textul original simplu. Cei mai multi algoritmi de criptare se bazează pe chei secrete pentru cifrare și decifrare. Fără a cunoaște cheile respective, sistemele de calcul nu pot decripta mesajele, deși cei mai puternici algoritmi de criptare sunt accesibili publicului. Analiza criptării descrie eforturile și tehnologiile implicate pentru a "sparge" o criptare (de exemplu, prin găsirea modalităților de a sparge o criptare pe baza unui text cifrat și a textului simplu corespunzator). Un algoritm este considerat puternic, în cazul în care o cautare "brute force" (adică, procesul de încercare a oricarei chei posibile), este singura posibilitate de atac cunoscuta. În continuare vom discuta algoritmii de criptare simetrici si asimetrici.
Utilizând criptarea simetrică, receptorul unui mesaj folosește aceeași cheie pentru a procesa textul simplu din textul cifrat pe care expeditorul l-a folosit pentru a-l cripta. În exemplul urmator, Marcel criptează un mesaj cu cheia S, care este cunoscută doar de librărie și de el, așa cum se observă în figura XX . Pentru a decripta textul cifrat, Librarie.com utilizează aceeasi cheie S. De aceea, S este de asemenea numit, secret distribuit. Principalii reprezentanți ai algoritmilor de criptare simetrici sunt DES si AES.
Figura 4. Criptarea simetrică
DES (Data Encryption Standard) a reprezentat inițial recomandarea guvernului SUA pentru criptarea simetrică și utilizează chei de 64 biți lungime. Fiecare al optulea bit este un bit pentru verificarea parității, utilizat pentru detectarea erorilor. Astfel, net-cheie este de lungime 56. DES enciphers un bloc de date pe 64 biți la un moment dat.
Funcțiile HASH efectuează transformări asupra unei intrări de o lungime arbitrară generând o ieșire de lungime fixă care este o imagine a întăririi. Valoarea „imaginii” returnate se numește valoare HASH. Aceste funcții se mai numesc și funcții „message digest”, deoarece din valoarea HASH este imposibil de reconstruit intrarea despre care s-a făcut imaginea. Există multe funcții care pot transforma intrarea de lungime arbitrară la o ieșire de lungime fixă, însă funcțiile care prezintă interes din punct de vedere criptografic sunt funcțiile hash de sens unic (one–way hash functions). Ecuația generală care descrie funcțiile hash este dată de ecuația 2.3.1, unde H este funcția, h valoare hash, M intrarea:
h = H(M), unde h are lungimea m.
Caracteristicile speciale ale funcțiilor de sens unic sunt următoarele:
Pentru orice intrare M este ușor de calculat h;
Având h este dificil de calculat M astfel încât se fie satisfăcută relația ;
Pentru un M dat este dificil de găsit M1 astfel încât H(M) = H(M1).
Aceste proprietăți ale funcțiilor hash de sens unic folosite în criptografie sunt extrem de importante deoarece dacă un atacator ar putea găsi cu ușurință o valoare de intrare M1 care produce același rezultat cu M atunci dacă cineva semnează M atacatorul ar putea afirma că M1 a fost semnat. Ca o cerință adițională pentru aceste funcții este ca să fie dificil de găsit două mesaje aleatoare care să aibă același imagine, altfel spus:
Este dificil de găsit mesajele aleatoare M și M1 astfel încât H(M) = H(M1).
Un posibil atac, dacă ultima cerință nu este îndeplinită ar fi atacul numit „atacul zilei de naștere” (birthday atack). Acest tip de atac și-a primit numele de la paradoxul zilelor de naștere. În mod surprinzător, se poate dovedi matematic că probabilitate ca în orice grup de 23 de persoane doi sau mai mulți indivizi să aibă același zi de naștere este mai mare decât ½.
Nu este ușor de găsit o funcție care satisface toate cerințele de mai sus, totuși există destul multe mai mult sau mai puțin sigure funcții HASH folosite în criptografie.
MD5 este o funcție hash de sens unic, proiectat de Ron Rivest. MD provine din Message Digest. Algoritmul produce un hash sau altfel zis, imagine de 128 biți a mesajului de intrare.
Principiile după care s-a realizat algoritmul sunt următoarele:
Securitate. Sunt imposibil de găsite două mesaje care au același imagine, presupunând că nu există altă metodă de criptanaliză decât cea a forței-brute.
Securitate directă. Securitatea nu se bazează pe presupuneri, cum ar fi de exemplu dificultatea de a factoriza numere mari, ca și în cazul RSA.
Viteză. Algoritmul trebuie să fie potrivit pentru implementări de software rapide, bazându-se pe manipulații de bit cu operanzi de 32 bit.
Simplicitate și compactitate. Algoritmul trebuie să fie cât se poate de simplu, fără structuri mari de date, sau un program complicat.
Favorizare de arhitecturi Little-Endian. Algoritmul este optimizat pentru arhitecturi de microprocesoare (mai ales Intel). Calculatoarele mai performante fac transformările necesare.
Prima variantă a algoritmului a fost MD4, dar acesta după ce a fost introdus a fost criptanalizat cu succes în părți, ce l-a îndemnat pe autor să-si îmbunătățească codul. Astfel a fost conceput MD5, ca variantă îmbunătățită MD4.
După niște procesări inițiale MD5 procesează textul de intrare în blocuri de 512 de biți, care sunt mai departe separați în 16 sub-blocuri de 32 biți fiecare. Algoritmul produce un set de 4 blocuri de 32 biți, care concatenate dau ieșirea de 128 bit.
Mesajul este mărit pentru a fi multiplu de 512. Acest procedeu se realizează prin adăugarea unui bit de 1 la sfârșitul mesajului și atâtea zerouri câți sunt necesari ca mesajul original să aibă o lungime cu 64 de biți mai scurtă decât un multiplu de 512. O reprezentare pe 64 de biți este apoi adăugată la sfârșitul mesajului. Acest procedeu asigură ca și complementarea să arate diferit pentru mesajele diferite.
La început sunt inițializate patru variabile, numite variabile de legătură:
A = 0x01234567
B = 0x89abcdef
C = 0xfedcba98
D = 0x76543210
Începe ciclul principal al algoritmului, care este repetat în funcție de numărul de blocuri de 512 din mesajul de intrare. Cele patru variabile sunt copiate în alte variabile, anume: A în a, B în b, C în c iar D în d. Ciclul principal are patru runde asemănătoare. Fiecare rundă folosește o operație diferită de 16 ori. Fiecare operație aplică o funcție ne-liniară pe trei din variabilele a,b,c,d, adăugând rezultatul la al patrulea variabilă, la un sub-bloc a textului de intrare și o constantă. Apoi rotește rezultatul obținut la dreapta cu un număr variabil de biți și adaugă rezultatul la unul dintre variabilele a,b,c, sau d. În final rezultatul este copiat într-unul dintre variabilele de dinainte. Funcționarea buclei principale a algoritmului este prezentată în figura xx.
Sunt patru funcții neliniare folosite în fiecare operație. Se folosește o funcție diferită în fiecare rundă. Funcțiile neliniare sunt:
F(X,Y,Z) = (X & Y) | ((!X) & Z)
G(X,Y,Z) = (X & Z) !(Y (!Z))
H(X,Y,Z) = X xor Y xor Z
I(X,Y,Z) = Y xor (X | (!Z))
Considerând Mj fiind blocul j din sub-blocul de mesaje, și <<<s fiind o rotație circulară de s biți cele patru operații sunt:
FF(a,b,c,d,Mj,s,ti) înseamnă a = b + ((a + F(b,c,d ) + Mj + ti) <<< s)
GG(a,b,c,d,Mj,s,ti) înseamnă a = b + ((a + G(b,c,d ) + Mj + ti) <<< s)
HH(a,b,c,d,Mj,s,ti) înseamnă a = b + ((a + H(b,c,d) + Mj + ti) <<< s)
II(a,b,c,d,Mj,s,ti) înseamnă a = b + ((a + I(b,c,d ) + Mj + ti) <<< s)
Cele patru runde (64 de pași) sunt prezentate în tabelul xx. Constantele ti sunt alese astfel încât în pasul i ti este partea întreagă a valorii 232*abs(sin(i)), unde i este în radiani. După parcurgerea celor 64 de pași valorile a,b,c,d sunt adăugate la A,B,C,D și ciclul se repetă cu următorul bloc de date. Ieșirea finală va fi concatenarea valorilor A,B,C și D.
Aplicatia “Medical Asisstance”.
Aplicația web „Medical Assistance” este gândită pentru a se potrivi tuturor clinicilor medicale. Indiferent de specialitățile medicale și de dimensiune, aplicația reprezintă cheia spre profesionalizarea serviciilor medicale și transformarea într-o activitate profitabilă, dar care poate fi utilizată ca și un model didactic pentru studenți.
Aplicația este realizată cu ajutorul limbajului de programare Orientat Obiect Java, utilizând și un web server – TomCat 7.0, fiind utilizat ca mediu de crearea a ORM-urilor Hibernate 3.0. Pentru interfața grafică utilizator au fost utilizate tehnologiile JavaScript, CSS și JSP cu HTML iar ca soluție pentru programarea web au fost alese J2EE (Beans, Servlets) în combinație cu Spring (MVC și Security), iar ca un repositoriu de biblioteci a fost utilizat Maven 2.0.
Aplicația utilizează și o bază de date ca repositoriu de date, care este adusă la forma normală numărul 3. Baza de date este realizată pe MySQL 5.0.
Descrierea interfeței grafice
În imaginea de mai jos este reprezentată forma de logare, care are ca bază 3 tipuri de conturi:
Administrator
Secretar
Medic
Medic – Director Medical (Manager)
Medic
Figura 6. Pagina de logare a sistemului de gestionare “Medical Assistance”
Fiecare tip de utilizator are funcțiunile sale care depinde de rolul setat. Rolul secretarului este de a seta noi utilizatori și de a gestiona datele acestora. La fel pentru rolul de secretar mai revine si funcțiunea de a crea noi înscrieri la medici.
În figura de mai jos este ilustartă pagina ce gestionează datele pacienților (nume, prenume, idnp, etc.).
Figura 7. Pagina de gestionare pentru utilizatori cu rol de secretar în sistemului de gestionare “Medical Assistance”, partea de gestiune a clienților.
În figura de mai jos este ilustartă pagina ce gestioneaza datele despre istoricul pacienților (data programarii, data tratarii, serviciul prestart, diagnosticul, etc).
Figura 8. Pagina de gestionare pentru utilizatori cu rol de secretar în sistemului de gestionare “Medical Assistance”, partea de gestiune a istoricului clienților.
În figura de mai jos este ilustartă pagina modală ce permite adăugarea datelor despre o noua investigație medicală a pacienților.
Figura 9. Pagina de gestionare pentru utilizatori cu rol de secretar în sistemului de gestionare “Medical Assistance”, partea de adauagare a unui istoric nou
Rolul administratorului este de a seta noi funcții, servicii, roluri, statuturi și utilizatori și de a gestiona datele acestea.
În figura de mai jos este ilustartă pagina administratorului ce permite adăugarea unor noi funcții în bază de date ce ulterior vor fi aplicate pentru noii medici.
Figura 10. Pagina de gestionare pentru utilizatori cu rol de administrator în sistemului de gestionare “Medical Assistance”, partea de adauagare a unei noi funcționalități.
În figura de mai jos este ilustartă pagina administratorului ce permite adăugarea unor noi roluri în baza de date ce ulterior vor fi aplicate pentru noii medici.
Figura 11. Pagina de gestionare pentru utilizatori cu rol de administrator în sistemului de gestionare “Medical Assistance”, partea de adauagare a unei noi funcționalități.
Pagina Admionistrator – adaugare Roluri
În figura de mai jos este ilustartă pagina administratorului ce permite adăugarea unor noi statuturi în baza de date ce ulterior vor fi aplicate pentru noii medici
Figura 12. Pagina de gestionare pentru utilizatori cu rol de administrator în sistemului de gestionare “Medical Assistance”, partea de adauagare a unui nou statut.
În figura de mai jos este ilustartă pagina administratorului ce permite adăugarea unor noi servicii în baza de date ce ulterior vor fi aplicate pentru noii medici.
Figura 13. Pagina de gestionare pentru utilizatori cu rol de administrator în sistemului de gestionare “Medical Assistance”, partea de adauagare a unui nou serviciu.
În figura de mai jos este ilustartă pagina administratorului ce permite adăugarea unor noi utilizatori în baza de date ce ulterior vor fi utilizatori de diferite roluri si cu diferite funcții.
Figura 14. Pagina de gestionare pentru utilizatori cu rol de administrator în sistemului de gestionare “Medical Assistance”, partea de adauagare a unui nou utilizator.
În figura de mai jos este ilustartă pagina medicului șef, ce permite vizualizarea datelor gestionate de secretar și medic la un anumit post (chirurg, neurolog, etc.), este permisă doar vizualizarea datelor și doar pentru medicii din secțiunea unde este acest utilizator ca medic șef.
Figura 15. Pagina de gestionare pentru utilizatori cu rol de medic șef în sistemului de gestionare “Medical Assistance”, partea de viualizare adatelor de către medic.
În figura de mai jos este ilustartă pagina medicului de rând ce permite adăugarea unui nou task, editarea acestuia sau taskului setat de secretar.
Figura 16. Pagina de gestionare pentru utilizatori cu rol de medic de rând în sistemului de gestionare “Medical Assistance”, partea de gestionare adatelor de catre medic de rând.
În figura de mai jos, este ilustartă pagina modală pentru adaugarea unui nou task.
Figura 17. Pagina de gestionare pentru utilizatori cu rol de medic de rând în sistemului de gestionare “Medical Assistance”, adaugarea unui task nou de către medic.
În figura de mai jos, este ilustartă pagina modală pentru trimiterea unui pacient către o altă specializare, respectiv emiterea de catre medic a unui bilet de trimitere către o altă specializare .
Figura 18. Pagina de gestionare pentru utilizatori cu rol de medic în sistemului de gestionare “Medical Assistance”, emiterea unui bilet de trimitere catre o altă specializare.
Descrierea codului
Structura proiectului este demonstrată în figura de mai jos. La acest proiect este asignat și un server web de gestionare a datelor cu baza de date (TomCat versiunea 7.0).
Figura 19. Structura proiectului “Medical Assistance” în mediul de programare eclipse.
Conform MVC-ului proiectul are 3 layer-uri: pachetul controller-urilor, jsp-urile și pachetul entity-lor.
În pachetul dao.impl avem implementarea codului pentru gestiune a datelor din baza de date, metodologia CRUD. Pentru conexiune cu bază de date este utilizat fișierul din framework-ul Hibernate hibernate.cfg.xml care prin intermediu punții jdbc și setarilor anumite se conectează la SGBD.
Pentru a adăuga o nouă entitate de tip utilizator este elaborate urmatoarea metodă:
public void save(UserAccount userAccount) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try{
transaction = session.beginTransaction();
session.save(userAccount);
transaction.commit();
} catch(HibernateException he){
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
}
Pentru a edita o entitate de tip utilizator este elaborate urmatoarea metodă:
public void update(UserAccount userAccount) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try{
transaction = session.beginTransaction();
session.update(userAccount);
transaction.commit();
} catch(HibernateException he){
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
}
Pentru a șterge o entitate existentă din baza de date este elaborat următorul cod:
public void delete(UserAccount userAccount) {
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try{
transaction = session.beginTransaction();
session.delete(userAccount);
transaction.commit();
} catch(HibernateException he){
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
}
La fel au mai fost elaborate metode pentru depistarea utilizatorului după nume și după id pentru a manipula cu datele existente și respective pentru a vizualiza o listă de obiecte, de un anumit tip:
public UserAccount getUserAccountById(int idUserAccount) {
Session session = HibernateUtil.getSessionFactory().openSession();
UserAccount userAccount = null;
Transaction transaction = null;
try{
transaction = session.beginTransaction();
userAccount = (UserAccount) session.get(UserAccount.class, idUserAccount);
transaction.commit();
}
catch(HibernateException he)
{
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
return userAccount;
}
public UserAccount getUserAccountByName(String userAccountName) {
Session session = HibernateUtil.getSessionFactory().openSession();
UserAccount userAccount = null;
Transaction transaction = null;
try
{
transaction = session.beginTransaction();
String sql = "SELECT * FROM USER_ACC WHERE LOGIN = (:UserAccountName)";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(UserAccount.class);
query.setParameter("UserAccountName", userAccountName);
userAccount = (UserAccount) query.uniqueResult();
}
catch(HibernateException he){
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
return userAccount;
}
public List<UserAccount> getAllUserAccounts() {
List<UserAccount> getAllUserAccounts = null;
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = null;
try
{
transaction = session.beginTransaction();
String sql = "SELECT * FROM USER_ACC";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(UserAccount.class);
getAllUserAccounts = query.list();
}
catch(HibernateException he){
if(transaction != null)
transaction.rollback();
System.out.println(he.getMessage());
}
session.close();
return getAllUserAccounts;
}
Pentru realizarea conexiunii, sunt utilizate și o serie de proprietăți în hibernate:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://192.168.12.43:3306/BurlacuDumitru</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root@mysql</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">false</property>
<property name="format_sql">true</property>
<mapping class="com.dumitru.entity.Task" />
<mapping class="com.dumitru.entity.TaskStatus" />
<mapping class="com.dumitru.entity.UserAccount" />
<mapping class="com.dumitru.entity.UserRoles" />
<mapping class="com.dumitru.entity.UserStatus" />
<mapping class="com.dumitru.entity.UserInfo" />
<mapping class="com.dumitru.entity.UserFunctions"/>
<mapping class="com.dumitru.entity.Services" />
<mapping class="com.dumitru.entity.Patient" />
</session-factory>
</hibernate-configuration>
Sunt mapate entitățile și setată calea spre bază de date cu tot cu parola și login.
Descrierea bazei de date
Baza de date este elaborate pe SGBD-ul MySQL și anumit versiunea 5.0. Este adusă la forma a 3-a normală și conține 11 tabele illustrate în figura de mai jos.
Figura 20. Relațiile și tabelele bazei de date pentru aplicația “Medical Assistance”.
Tabelele :
User_Status
User_Function
User_Roles
Task_Status
Services
sunt utilizate ca dicționare completate de administrator. În ele sunt incluse date statice pentru a manipula cu cele din restul tabelelor.
Tabelele:
History_Function
ACC_STATUS
sunt utilizate pentru a menține istoricul tabelelor intermediare ca UserAcc și UserStatus ca și UserAcc și UserFunction.
Pe când restul tabelelor ca :
UserInfo
Task
Services
Patient
UserAcc
sunt destinate pentru gestiunea noilor date în baza de date și manipularea cu acestea în continuare.
Concluzii
În procesul de efectuare a lucrării de licență au fost ceretate sursele bibliografice existente și au fost descrise modalitățile de utilizare a componentelor grafice pentru crearea interfețelor utilizator și interacțiunea acestora cu baza de date, cu ajutorul metodelor predefinite de limbajul Orientat Obiect Java și metodelor elaborate utilizând framework-ul Hibernate.
S-au utilizat metodele standarde pentru a demonstra o interfață ce poate fi efectuată cu resursele standarde, iar metodele elaborate ajută la interacțiunea între baza de date și interfața elaborată. Pentru gestionarea atomară a datelor din baza de date se utilizează ORM-ul Hibernate-ului.
A fost realizată aplicația „Medical Assitance” pentru demonstrarea posibilităților limbajului Java, framework-ului Hibernate, SGBD-ului MySQL și HTML-ului în corelare cu CSS-ul în crearea interfeței grafice pentru utilizator și interacțiune cu aplicații de gestiunea bazelor de date.
Pe parcursul efectuării lucrării de licență Maparea Obiectual-Relațională în Java Hibernate au fost studiate noțiunile de bază ale POO Java, metodele de bază, ce permit efectuarea conexiunii între baza de date și interfața grafică din limbajul Java, posibilitățile de creare a interfețelor grafice cu ajutorul CSS ți HTML, posibilitățile SGBD-ului MySQL în corelare cu Hibernate.
Consider că limbajul Java permite programarea simplă și diversă a interfețelor utilizator prin numărul mare de clase și facilități de care dispune, permite utilizarea interfețelor API de bază, cât și a celor elaborate proprii sau de alte persoane. Elaborarea aplicației a presupus crearea unei suprafețe de afișare pe care au fost așezate obiectele grafice, care servesc la comunicarea cu utilizatorul, crearea și așezarea componentelor pe suprafața de afișare la pozițiile corespunzătoare, definirea unor acțiuni care trebuie să se execute în momentul când utilizatorul interacționează cu obiectele grafice ale aplicației, interceptarea evenimentelor generate de obiecte în momentul interacțiunii cu utilizatorul și executarea acțiunilor corespunzătoare, așa cum au fost ele definite.
Lucrarea de licentă Maparea Obiectual-Relațională în Java Hibernate poate servi în calitate de suport pentru studenții ce studiază cursul de programare Java, poate fi utilzată la o instituție medicală și în calitate de material didactic utilizat de profesori.
Bibliografie
Bibliografie
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatia ,medical Assistance (ID: 156060)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
