Implementarea Serviciilor Web Folosind Enterprise Javabeans 3

UNIVERSITATEA “TITU MAIORESCU” DÎN BUCUREȘTI

FACULTATEA DE INFORMATICĂ

LUCRARE DE LICENȚĂ

Implementarea serviciilor web

folosind Enterprise JavaBeans 3.

Studiu de caz.

COORDONATOR ȘTIINȚIFIC:

Conf.univ.dr.ing. Mironela Pîrnău

ABSOLVENT:

Dobre Marian Răzvan

SESIUNEA IUNIE – IULIE

2016

Cuprins

1 Introducere 4

2 Noțiuni de bază 5

2.1 Scurt istoric al serviciilor web 5

2.2 Tipuri de servicii web si elementele lor 5

2.3 Caracteristici REST 7

3 Tehnologii server 10

3.1 Limbajul de programare Java 10

3.2 Componente Java utilizate 11

3.3 Server de aplicații Java EE 17

3.4 Baza de date 17

4 Tehnologii client 18

5 Analiza, implementarea și exploatarea aplicației 20

5.1 Analiză 20

5.2 Implementare 23

5.2.1 Baza de date 23

5.2.2 Programul server 25

5.3 Utilizare 30

6 Concluzii și directii de dezvoltare 31

6.1 Server 31

6.2 Client 31

6.3 Statistici 31

7 Read Me 32

8 Bibliografie 33

Introducere

Noțiuni de bază

Scurt istoric al serviciilor web

Prima încercare de standardizare a comunicației între doua computere a fost lansarea, în 1975, a standardului EDI (Electronic Data Interchange) introdus cu scopul de a facilita schimbul automatizat de date în format electronic între companii și eliminarea hârtiei. Standardul EDI nu era ușor de implementat datorita complexității și a costului.

Ulterior, au apărut tehnologii și standarde precum Common Object Request Broker Architecture (CORBA), Distributed Component Object Model (DCOM), Unix Remote Procedure Call (RPC), și Java Remote Method Invocation (RMI). CORBA și DCOM s-au completat una pe cealaltă de-a lungul timpului, prima fiind folosita în general de producătorii de sisteme Unix, pe când cealaltă, fiind o tehnologie Microsoft, era utilizata de aplicațiile care rulează pe servere Windows.

Atât CORBA cat și DCOM erau relativ dificile din perspectiva programării astfel încât niciuna din ele nu s-a impus ca lider în industria IT.

Unix RPC, tip de tehnologie disponibila numai pe sistemele de operare Unix, nu s-a răspândit mai departe de producătorii de sisteme Unix. Tehnologia Java RMI este mai recenta decât celelalte.

Punctele slabe care nu au făcut populare aceste tehnologii sunt complexitatea, flexibilitatea, suportul pe diverse platforme. Se pare ca producătorii au învățat din aceste greșeli astfel încât serviciile web au astăzi un mare succes.

Tipuri de servicii web si elementele lor

Un serviciu web este un sistem software proiectat cu scopul de a asigura interoperabilitatea și interacțiunea dintre doua aplicații folosind protocoale standardizate. Un astfel de serviciu este accesibil într-o rețea locala sau în Internet.

Cele doua aplicații sunt serverul, numit și furnizor de servicii web, și clientul sau consumatorul serviciilor. Ele pot rula pe platforme diferite și chiar mai mult, fiecare dintre ele poate fi scris într-un alt limbaj de programare. Totuși, ele pot comunica datorita protocoalelor standard utilizate: HTML, XML, SOAP, JSON.

Din punct de vedere al tehnologiei folosite, serviciile web se împart în doua categorii principale: REST și SOAP.

XML (Extensible Markup Language) este un limbaj de marcare auto-descriptiv, similar cu HTML, proiectat cu scopul de a stoca și transmite date într-un mod structurat.

JAXB (Java Architecture for XML Binding) oferă o modalitate de conversie între aplicații dezvoltate în limbajul de programare Java și scheme XML.

JSON (JavaScript Object Notation) este o modalitate, alternativa a formatului XML, de stocare și schimb de informații. Daca în XML, datele sunt structurate în cadrul marcajelor de tip eticheta (tag), în JSON, ele sunt grupate în perechi de atribute-valori.

SOAP (Simple Object Access Protocol) este un protocol, folosit pentru schimbul de date în cadrul serviciilor web. Protocolul este bazat pe schimb de mesaje SOAP – mesaje XML cu un format standard.

Consumatorul trimite o cerere către furnizorul serviciului web și, ca răspuns, primește un document WSDL (Web Service Description Lanuage) din care află metodele disponibile în cadrul acelui serviciu web.

REST (Representational State Transfer) este un stil arhitectural bazat pe un set de principii ce descriu modalitatea prin care resursele sunt definite și adresate (principii care stau la baza standardelor Web și HTTP). REST este folosit în serviciile web, consumatorul folosind comenzi simple preluate din HTML iar furnizorul răspunzând cu mesaje formatate XML sau JSON.

API (Application Programming Interface) reprezintă o serie de rutine, protocoale și instrumente pentru dezvoltarea de programe și aplicații.

EJB, tehnologia Enterprise JavaBeans este o arhitectura de tip server pentru platforma Java Enterprise Edition. Prin natura ei, tehnologia EJB permite dezvoltarea rapida și simplificată de aplicații distribuite, tranzacționale, securizate și portabile, bazate pe tehnologia Java.

POJO (Plain Old Java Object) este o clasa Java simplă.

Caracteristici REST

Principiile REST au fost descrise de către Roy Thomas Fielding în anul 2000, în lucrarea sa de doctorat „Architectural Styles and the Design of Network-based Software Architectures”.

Fielding a dezvoltat acest stil de arhitectura în paralel cu HTTP 1.1.

REST nu este un standard, nici un protocol ci un stil de arhitectura software. De fapt, este stilul de arhitectura a spațiului World Wide Web. Obiectivul arhitecturii REST este asigurarea următoarelor proprietăți: performanță, scalabilitate, simplitate, modificabilitate (mentenabilitate), vizibilitate, portabilitate și fiabilitate.

Sistemele care se aliniază cu principiile REST mai sunt găsite și sub denumirea de RESTful.

În cele mai multe cazuri, sistemele RESTful comunica prin protocoalele HTTP/HTTPS și folosesc aceleași metode utilizate de browsere pentru a schimba date cu serverele web (GET, POST, PUT, DELETE, etc).

Conform filosofiei REST, rezultatul unei procesări conduce la returnarea unei reprezentări a unei resurse Web. Orice accesare a unei reprezentări plasează aplicația-client într-o stare care va fi schimbată în urma unui transfer de date (accesarea altei reprezentări, pe baza traversării unei legături hipertext – desemnată de un URI – inclusă în reprezentarea resursei inițiale). Starea comunicării între mesajele vehiculate între server și client nu trebuie reținută (stateless).

Transferul de date se realizează prin HTTP, reprezentarea este marcată în XML (ori alt format), iar adresabilitatea se rezolvă via URI, spahiul Web putând fi considerat drept un sistem REST.

Serviciile Web actuale se pot dezvolta în concordantă cu arhitectura REST. Componentele care invocă funcționalități vor consuma reprezentări de resurse (în stilul pull) conform clasicei arhitecturi client/server. Fiecare cerere este considerată independentă, fără a se lua în considerație contextul – conexiuni statele. Resursele Web pot fi accesate printr-o interfață generică pusă la dispoziție de metodele protocolului HTTP: GET, POST, PUT și DELETE. Actualmente sunt utilizate preponderent GET și POST.

O aplicație Web dezvoltată conform principiilor REST are o arhitectură diferită de una în stilul RPC (acesta din urmă fiind adoptat și de protocolul SOAP). În cazul RPC, punctul focal e reprezentat de mulțimea de operații ce pot fi executate (numite și verbe), pe când în viziunea REST totul se axează pe diversitatea resurselor disponibile (denumite și substantive).

Prin REST, se definesc tipuri de resurse, fiecare identificată unic de un URI (de exemplu, http://www.portocale.info/sortimente/japoneze). O resursă poate avea asociate reprezentări XML, JSON sau de alt tip, ce pot fi accesate ori alterate. Prin intermediul unor operații HTTP standard, putem manipula ușor resursele. În acest mod, via GET putem obține o copie a reprezentării unei resurse, cu PUT actualizăm o resursă, iar prin DELETE o ștergem de pe server. Metoda POST se folosește pentru acțiuni care ar putea avea posibile efecte colaterale (side effects) – de exemplu, realizarea unei comenzi de plată a sortimentelor de portocale dorite.

După cum se observă, interfaza oferită de HTTP este una generică, oferind suport pentru operațiile de bază, de tip CRUD (Create, Retrieve, Update, Delete) – creare, accesare, actualizare și ștergere.

Actualmente, există numeroase organizării care își pun la dispoziție serviciile via o interfață REST. Ca exemple notabile, menționăm Amazon, Bloglines, del.icio.us, eBay, Google și Yahoo!. De asemenea, pot fi folosite diverse cadre de lucru pentru dezvoltarea de aplicaþii Web în stilul REST: JAX-RS, Tonic (pentru PHP), Ruby on Rails, Zope (pentru Python) etc.

Tehnologii server

Limbajul de programare Java

Java este un set de mai multe produse software realizat de firma Sun Microsystems (care a fuzionat în anul 2010 cu Oracle Corporation), ce împreună oferă un sistem pentru dezvoltarea de aplicații software și implementarea acestora într-un mediu de calcul multi-platformă. Java este folosit pentru o varietate de platforme de calcul și dispozitive integrate pentru telefoane mobile low-end, la servere enterprise si supercalculatoare high-end. De asemenea, aplicațiile de tip applet Java sunt mai rar folosite și se întâlnesc pentru a oferi funcții îmbunătățite și sigure pentru navigarea pe World Wide Web.

Scrierea programelor în limbajul Java reprezintă principalul mod de a produce cod care va fi implementat ca Java bytecode. Sintaxa limbajului Java a fost împrumută foarte mult de la C și C++, dar caracteristicile orientate obiect sunt modelate după Smalltalk și Objective-C. Java elimină anumite concepte de nivel scăzut, cum ar fi pointerii și are un model de memorie foarte simplu, în care fiecare obiect este alocat în aceasta și, toate variabilele de tip obiect sunt referințe.

Java este fundamentul pentru aproape orice tip de aplicație de rețea și este standardul global pentru dezvoltarea și livrarea de aplicații mobile, jocuri, conținut web, și software pentru mediul enterprise. Cu mai mult de 9 milioane de dezvoltatori din întreaga lume, Java permite să dezvoltăm eficient și să implementăm aplicații și servicii stabile, care pot fi apoi portabile în scopul de a rula pe o varietate largă de sisteme hardware.

Java Platform este numele pachetului de programe oferite de Oracle, care permit dezvoltarea și rularea de programe scrise în limbajul de programare Java. Platforma nu este specifică pentru un procesor sau un sistem de operare si este formată dintr-un motor de execuție (numit mașină virtuală) și un compilator cu un set de biblioteci care sunt puse în aplicare pentru diverse sisteme de operare și hardware, astfel încât programele Java să poată rula identic pe toate dintre acestea.

Platforma Java constă din mai multe programe, fiecare dintre ele oferind o porțiune din capacitățile sale generale. De exemplu, compilatorul Java, care convertește codul sursă Java în Java bytecode (un limbaj intermediar pentru JVM), este furnizat ca parte a Java Development Kit (JDK).

Componentele esențiale ale platformei sunt compilatorul limbajului Java, bibliotecile și mediul de execuție (mașina virtuală).

Spre deosebire de alte limbaje de calculator a căror influenta s-a diminuat cu trecerea timpului, influenta limbajului Java a devenit mai puternica. Java a ajuns în prim planul programării pe Internet încă de la lansare. Si-a consolidat aceasta poziție cu fiecare versiune ulterioara. Astăzi, este prima si cea mai buna alegere pentru a dezvolta aplicații web. De asemenea, Java face parte din revoluția telefoanelor inteligente deoarece este folosit la programarea pe Android. Simplu spus: marea parte a lumii moderne funcționează cu coduri Java. Atât de important este limbajul Java.

Un motiv cheie al succesului pe care îl are limbajul Java este agilitatea sa. De la lansarea sa în versiunea 1.0, Java s-a adaptat continuu la schimbările din mediul de programare si la schimbările în felul cum programează programatorii. Cel mai important, nu a urmat doar tendințele, ci a ajutat la crearea lor. Abilitatea limbajului Java de a se adapta la schimbările rapide din lumea calculatoarelor e o parte cruciala a motivului pentru care continua sa aibă succes.

Componente Java utilizate

Java Platform, Enterprise Edition (Java EE) este platforma de calcul de tip enterprise de la Oracle. Platforma oferă un API și mediu de rulare pentru dezvoltarea și rularea de software enterprise, inclusiv servicii de rețea și de Internet, precum și alte aplicații de rețea la scară largă, fiabile și sigure. Java EE extinde Java Platform, Standard Edition (Java SE) și oferă un API pentru Object-relational mapping (ORM) – software ce convertește datele intre tipuri de sisteme), arhitecturi multi-tier și servicii web. Platforma include un design bazat în mare măsură pe componente modulare care rulează pe un server de aplicații. Software-ul pentru Java EE este dezvoltat în primul rând în limbajul de programare Java.

Versiunea curenta este Java EE 7.

Java Development Kit (JDK) este distribuția Oracle destinată pentru dezvoltatorii de software și include instrumente de dezvoltare, cum ar fi compilatorul Java, Javadoc, Jar și un debugger. OpenJDK este o altă implementare notabilă a Java SE, care este licențiată sub GPL. Implementarea a început atunci când Sun a început eliberarea codului sursă Java sub GPL. Începând cu Java SE 7, OpenJDK este implementarea de referință oficială Java.

Versiunea curenta este JDK 1.8

Enterprise JavaBeans (EJB) este o parte a arhitecturii Java EE pentru dezvoltarea de aplicații distribuite. EJB este bazat pe tehnologia JavaBeans ce permite distribuirea către clienți de componente ale programului.

EJB este o platforma pentru dezvoltarea, folosind limbajul de programare Java, de aplicatii profesionale portabile, reutilizabile si scalabile. De la prima vesiune, EJB s-a vrut un model sau un framework care permite dezvoltarea de aplicatii Java de nivel „enterprise” fara ca programatorul sa fie nevoit sa reinventeze concepte ca tranzactiile, securitatea, persistenta automata, etc, necesare În procesul de construire a aplicatiei. În acest fel, EJB permite programatorului sa se concentreze pe logica proceselor business si sa reduca la minim timpul necesar pentru scrierea codului necesar infrastructurii.

Din perspectiva programatorului, un EJB este un program Java care este executat În interiorul unui mediu specific numit container EJB care furnizeaza o serie de servicii componente.

Tehnologia Enterprise JavaBeans este o componenta vitala/principala/ a specificatiilor Java EE. EJB este un framework util În dezvoltarea de aplicatii profesionale de nivel „enterprise”, orientate obiect, bazate pe componente. Aplicațiile profesionale EJB sunt scrie În lidepr Java, sunt scalabile si pot fi implementate pe orice platforma compatibila cu specificatiile EJB.

Aplicatiile EJB sunt instalate si executate sub controlul unui container EJB. Acest container furnizeaza servicii necesare, În general, aplicatiilor de tip enterprise ca securitate, gestiunea tranzactiilor, gestiunea resurselor si managementul sistemelor.

Specificatiile Enterprise JavaBeans 3 au fost publicate În 2006 fiind o schimbare majora de la versiunea precedenta. Programarea de aplicatii business este considerablil mai usoara cu EJB 3. Gestiunea persistentei a, În particular, a fost radical schimbata În sensul ca persistenta nu mai este un serviciu pus la dispozitie de un container EJB ci de catre un furnizor de persistenta compatibil cu specificațiile JPA. Aplicațiile Java care necesita sa fie persistate dar care nu necesita serviciile furnizate de un container EJB pot fi persistate În afara containerului EJB de csatre un provider JPA.

Arhitectura EJB 3 oferă un standard pentru dezvoltarea de aplicații business distribuite, orientate obiect, bazate pe componente. Componentele dezvoltate În framework-ul EJB sunt bean-uri orientate mesaj sau sesiune. Împreuna ele sunt cunoscute sub denumirea de EJB-uri. Sunt de obicei obiecte relativ brute ce incapsuleaza un proces business. Mai mult, daca EJB-urile sunt proiectate corect, ele pot fi refolosite de catre alte aplicatii. EJB-urile sunt distribuite În sensul În care ele pot sta pe servere diferite si pot fi invocate de catre un client de pe un sistem diferit din retea.

În EJB de tip sesiune trebuie sa aiba o interfata business care poate fi locala sau la distanta.

EJB-urile sunt implementate si rulate intr-un container care este proiectat sa faca aplicatiile scalabile, multi-utilizator si sigure. Un container EJB furnizeaza si o serie de servicii necesare aplicatiilor de nivel enterprise.

În contrast cu bean-urile orientate mesaj si cele orientate sesiune, entitatile sunt obiecte finisate cu o durata de viata relativ lunga si care au nevoie sa fie persistate. Inainte de EJB 3, bean-urile entitate jucau rolul de entitati si erau definite ca si componente accesibile de la distanta, precum bean-urile orientate mesaj sau sesiune. În EJB 3, entitatile sunt obiecte Java si deci ele pot folosi functionalitati orientate obiect precum mostenirea si polimorfismul, În comparatie cu bean-urile entitate care nu pot. În EJB 3, entitatile sunt persisistate de catre un furnizor de persistenta sau un motor de persistenta care implementeaza specificatiile JPA. Acest motor de persistenta poate rula În cadrul unui container EJB sau În afara unui container, unde aplicatia nu are nevoie de alte servicii EJB.

Fiind bazate pe Java, EJB-urile pot fi scrie o data si apoi implementate În orice server de aplicatie care suporta standardul EJB.

EJB este o arhitectura pentru setarea de componente ale programeleor, scrise În limbaj Java, care ruleaza pe servere din retea si care folosesc modelul client-server. EJB este construita pe tehnologia JavaBeans pentru distribuirea de componente de programe, numite metaforic beans – aluzie la boabele de cafea, clientilor din retea. EJB ofera companiilor avantajul de a putea controla modificarile la nivelul serverului În comparatie cu modificarile pe fiecare computer pe care ruleaza un client, de fiecare data cand o noua componenta a programului se schimba sau o noua componenta e adaugata. Componentele EJB au avantajul de a putea fi reutilizate În aplicatii multiple. Pentru a rula un bean sau o componenta tip EJB, trebuie sa faca parte dintr-o aplicatie numita container.

Inventata de Sun Microsystems, tehnologia EJB este oarecum echivalenta arhitecturii Component Object Model/Distributed Component Object Model dezvoltata de Microsoft dar, ca toate arhitecturile bazate pe Java, programele pot fi implementate pe majoritatea sistemelor de operare, nu numai Windows. Componentele de program ale EJB sunt cunoscute sub denumirea generica de servlets (programele de tip server). Containerul care ruleaza aceste servlet-uri este denumit server de aplicatie. Un caz tipic de utilizare a servlet-urilor este inlocuirea programelor web care folosesc CGI (common gateway interface) si scripturi PERL (Practical Extraction and Reporting Language). O alta utilizare este furnizarea unei intefete intre utilizatori si o aplicatie veche de tip mainfraim si baza ei de date.

În EJB, existe doua tipuri de bean-uri: cele de sesiune si cele de entitate. Un bean de tip entitate este definit ca unul cu persistenta, spre deosebire de fratele sau de tip sesiune, si care poate retine comportamentul sau starea inițiale.

Versiunea curenta este EJB 3.2.

Arhitectura EJB3.1

JAX-RS (Java API for RESTful Web Services) este un API Java care furnizează bazele dezvoltării de servicii web după modelul REST. Prima versiune JAX-RS este definită în Java Specification Request (JSR) 311 iar versiunea 2.0 în JSR 339. Programatorul are la dispoziție adnotări specifice acestui tip de servicii web cu ajutorul cărora poate expune ușor o clasa Java simpla – PlaÎn Old Java Object (POJO) într-o resursa web. Adnotările sunt de genul:

@Path pentru definirea căii resursei web

@GET, @PUT, @POST, @DELETE, @HEAD, @OPTIONS – metoda http folosită în accesarea resursei web

@Produces – pentru specificarea tipului MIME al răspunsului pe care serverul îl va trimite clientului (text/plain, application/json, application/xml)

Ultima versiune, 2.0, este inclusa În Java EE 7.

Jersey este platforma open-source pentru dezvoltarea serviciilor web REST În Java și servește ca implementare de referință a JAX-RS.

Cu alte cuvinte, JAX-RS definește cum ar trebui implementate serviciile web, iar Jersey conține aceste implementări bazate pe specificațiile JAX-RS. Un proiect web care conține servicii web are nevoie să depindă atât de bibliotecile JAX-RS cât și de bibliotecile Jersey. Acest lucru este necesar deoarece JAX-RS pune la dispoziție un set de interfețe care sunt implementate în Jersey.

Ultima versiune Jersey este 2.22.2 și implementează JAX-RS 2.0.

JDBC (Java DataBase Conectivity) se constituie într-un API pentru limbajul de programare Java care defineste accesul clientului la baze de date relaționale, pentru o mare varietate de furnizori. Oferă suport și pentru prelucrarea surselor de date tabulare, ca de exemplu foi de calcul, și fișierelor text. Accesul la bazele de date se realizează prÎn drivere specifice fiecărui furnizor. Astfel, o aplicatie poate accesa mai multe baze de date de la furnizori diferiti si aflate În locatii diferite insa, va avea nevoie de driverele specifice fiecarui sistem de gestiune a bazei de date.

API-ul JDBC asigura trei lucruri;

Stablirea conexiuni la baza de date sau accesul la sursa de date

Trimiterea de interogari

Procesarea rezultatelor interogarilor

JPA (Java Persistence API ) este soluția Java pentru asigurarea persistenței. Folosește o corespondență obiectual-relațională pentru a realiza legătura între modelul obiectual și BD relaționale. Are trei componente:

Entitățile – În versiunea curenta de JPA, ele sunt simple clase Java (POJO)

limbajul de interogare – Java Persistence Query Language (JPQL) – care se folosește În locul limbajului SQL, indiferent de dialectul bazei de date

metadatele pentru corespondență – prÎn adnotări

Ideea de bază este că orice tabelă corespunde unei clase. Mai exact, o înregistrare dintr-o tabelă reprezintă o instanțiere a unei clase, numită entitate JPA, marcată cu adnotarea @Entity. O tabelă este deci o colecție de clase.

Maparea dintre entități și tabele se face folosind adnotări în clasa Java care reprezintă entitățile JPA. De exemplu, cu adnotarea @Table se marchează numele tabelei ce care este mapată entitatea, cu @Column notăm numele coloanei cu care este asociat câmpul marcat al entității, @Id marchează un câmp al entității care corespunde unei chei primare a tabelei.

Intre entitățile JPA există relații de tip @OneToOne, @OneToMany, @ManyToOne și @ManyToMany

Versiunea curenta este JPA 2.1, inclusa În Java EE 7.

Mediul de dezvoltare integrat

NetBeans IDE este un mediu de dezvoltare integrat open-source, scris În limbaj de programare Java. Este mediul de dezvoltare oficial pentru Java însă suporta si alte limbaje de programare ca, de exemplu, PHP, C/C++, HTML5, etc.

NetBeans este dezvoltat În prezent de Oracle iar versiunea curenta este 8.1.

Server de aplicații Java EE

GlassFish Server este un server de aplicație open-source. Este implementarea oficială de Java EE cu suport pentru tehnologii ca EJB, JPA, JSF, RMI, JSP, servlet, etc.

Versiunea curenta de GlashFish este 4.1.

Baza de date

MySQL este un sistem open-source de gestiune a bazelor de date relaționale. În prezent este deținut de Oracle. În 2013 a fost pe locul 2 În topul celor mai folosite SGBD-uri pe plan global.

Versiunea curenta est 5.7

MySQL Workbench este mediul integrat oficial pentru administrarea, proiectarea si modelarea bazelor de date MySQL.

Versiunea curenta este 6.3

Tehnologii client

HTML (HyperText Markup Language) este văzut ca un limbaj de realizare a hypertextului.

Cu ani în urmă, oamenii de știință s-au gândit, că ar fi bine, ca cele mai importante rețele de calculatoare să fie conectate între ele. Rezultatul a fost apariția ‘‘mamei tuturor rețelelor”, numită acum Internet. Până în anul 1990, accesarea informațiilor de pe Internet era foarte dificilă și rețeaua nu era folosită decât de un grup restrâns de oameni de știință. Fizicianul Tim Berners-Lee a devenit celebru, datorită faptului că a ‘‘inventat” link-urile (legături, referințe) hypertext. Deși această idee nu era nouă, ea a condus la dezvoltarea unui limbaj simplu, care s-a impus, până la urmă, ca și un standard. Tim Berners-Lee a numit acest limbaj Hypertext Markup Language, cunoscut sub denumirea prescurtată de HTML. Noțiunea de hypertext înseamnă text păstrat în format electronic cu link-uri între pagini. În anul 1993, în jur de 100 de calculatoare din lumea întreagă erau echipate pentru a găzdui pagini HTML. Aceste pagini interconectate au fost ‘‘nimite” World Wide Web. După un timp, au început să fie scrise primele browsere Web cu ajutorul cărora se puteau vizualiza pagini Web care conțin atât text, cât și imagini.

Unul din primele elemente fundamentale ale WWW (World Wide Web) este HTML (Hypertext Markup Language), care descrie formatul primar în care documentele sunt distribuite și văzute pe Web. Multe din trăsăturile lui, cum ar fi independența față de platformă, structurarea formatării și legaturile hypertext, fac din el un foarte bun format pentru documentele Internet și Web.

Documentele HTML sunt documente în format ASCII și prin urmare, pot fi create cu orice editor de texte. Au fost însă dezvoltate editoare specializate care permit editarea într-un fel de WYSIWYG, deși nu se poate vorbi de WYSIWYG, atâta vreme cât navigatoarele afișează același document oarecum diferit, în funcție de platforma pe care rulează.

CSS (Cascading Style Sheets) este un limbaj de stiluri folosit pentru a descrie prezentarea unui document scris intr-un limbaj de marcare, cum ar fi HTML care, este dealtfel, cel mai utilizat in conjunctura cu CSS. Obiectivul principal al CSS este separarea continutului documentului de modalitatea de prezentare a sa prin diferite culori, fonturi, aliniere, formatare, etc.

Impreuna cu HTML si JavaScript, CSS este o tehnologie cheie folosita de majoritatea site-urilor web, interfete utilizator pentru aplicatii web si pentru aplicatii mobile.

JavaScript este un limbaj de programare de nivel înalt, dinamic, interpretat și bazat pe obiecte. El este suportat de majoritatea browserelor web fara a fi necesar nici un plugin. JavaScript are un API care permite folosirea de text, vectori, data calendaristica, expresii regulate.

Cum spuneam, JavaScript este un limbaj interpretat, aceasta insemnand ca el nu este compilat, iar, folosit in paginile web, codul sau este rulat de catre client – browserul web – si nu de catre server precum alte limbaje ca PHP, Java, etc. El nu este utilizabil numai in spațiul World Wide Web ci si in documente PFD, in aplicatii de tip desktop, scripturi pentru automatizari, etc.

jQuery este o biblioteca JavaScript open-source, multi-platforma, creata pentru simplificarea si imbunatatirea actiunilor clientului in timpul navigarii cum ar fi traversarea unui document HTML, gestiunea evenimentelor, animatie, manipularea datelor, etc.

Analiza, implementarea și exploatarea aplicației

Analiză

Partea aplicativa a acestei lucrări are ca scop implementarea unor servicii web care să permită accesul unui client oarecare la o bază de date ce conține inventarul computerelor din rețeaua unei organizații ipotetice. Clientul va putea face cele patru operațiuni uzuale cunoscute sub acronimul CRUD (Create, Read, Update, Delete).

Entitatile bazei de date vor fi:

COMPUTER – entitatea principal care are urmatoarele attribute:

COMPUTER_ID – cheia primara care identifica computerul

IPADDR – adresa IP

HOSTNAME – numele de gazda

DNSDOMAIN – domeniul DNS

CPUCOUNT – numarul de procesoare

CPU_ID – cheie straina reprezentand identificatorul procesorului

MEMORYMB – cantitatea de memorie RAM instalata

MODEL_ID – cheie straina reprezentand identificatorul modelului

SN – numărul serial al computerului

OS_ID – cheie straina reprezentand identificatorul sistemului de operare

USER_ID – cheie straina reprezentand identificatorul utilizatorului

OFFICE_ID – cheie straina reprezentand identificatorul sediului

CREATETIME – data creării inregistrarii

UPDATETIME – data actualizarii inregistrarii

CPU – entitatea ce defineste procesoarele

CPU_ID – cheia primara care identifica tipul procesorului

CPUNAME – numele

OS – entitatea ce defineste sistemele de operare

OS_ID – cheia primara care identifica sistemul de operare

OSNAME – numele

MODEL – entitatea ce defineste modelul computerului

MODEL_ID – cheia primara care identifica modelul

NAME – numele modelului

OFFICE – entitatea ce defineste sediile companiei

OFFICE_ID – cheia primara care identifica sediul

OFFICENAME – numele sediului

ADDRESS – adresa postala

PHONE – telefonul

USER – entitatea ce defineste utilizatorii

USER_ID – cheia primara care identifica utilizatorul

USERNAME – numele de utilizator

FIRSTNAME – prenumele persoanei

LASTNAME – numele persoanei

EMAIL – adresa de email a persoanei

Fig. 5.1 Diagrama entităților

Implementare

Baza de date

Managerul de baze de date este MySQL versiunea 5.7. Numele bazei de date folosite in proiect este hwinv.

Tabelele au fost create create folosind MySQL Workbench iar rezultatul poate fi vazut in figura 5.2.

Fig 5.2 Diagrama tabelelor din baza de date

Comenzile pentru inițializarea bazei de date:

–crearea bazei de date hwinv

CREATE DATABASE `hwinv`; –crearea bazei de date pentru proiect

–setarea bazei de date hwinv ca implicita pentru comenzile urmatoare

use `hwinv`;

–crearea tabelelor; valorile coloanelor identificator sunt incrementate automat

CREATE TABLE `cpu` (

`CPU_ID` int(11) NOT NULL AUTO_INCREMENT,

`CPUNAME` varchar(255) NOT NULL,

PRIMARY KEY (`CPU_ID`));

CREATE TABLE `model` (

`MODEL_ID` int(11) NOT NULL AUTO_INCREMENT,

`NAME` varchar(60) DEFAULT NULL,

PRIMARY KEY (`MODEL_ID`));

CREATE TABLE `office` (

`OFFICE_ID` int(11) NOT NULL AUTO_INCREMENT,

`OFICENAME` varchar(30) NOT NULL,

`ADDRESS` varchar(50) DEFAULT NULL,

`PHONE` varchar(20) DEFAULT NULL,

PRIMARY KEY (`OFFICE_ID`));

CREATE TABLE `os` (

`OS_ID` int(11) NOT NULL AUTO_INCREMENT,

`OSNAME` varchar(255) NOT NULL,

PRIMARY KEY (`OS_ID`));

CREATE TABLE `user` (

`USER_ID` int(11) NOT NULL AUTO_INCREMENT,

`USERNAME` varchar(30) NOT NULL,

`FIRSTNAME` varchar(50) DEFAULT NULL,

`LASTTNAME` varchar(50) DEFAULT NULL,

`EMAIL` varchar(50) DEFAULT NULL,

PRIMARY KEY (`USER_ID`));

CREATE TABLE `computer` (

`COMPUTER_ID` int(11) NOT NULL AUTO_INCREMENT,

`HOSTNAME` varchar(255) NOT NULL,

`DNSDOMAIN` varchar(255) DEFAULT NULL,

`OS_ID` int(11) NOT NULL,

`CPUMHZ` int(11) NOT NULL DEFAULT '0',

`CPUCOUNT` smallint(6) NOT NULL DEFAULT '1',

`MEMORYMB` int(11) NOT NULL DEFAULT '0',

`IPADDR` char(15) DEFAULT NULL,

`CREATETIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, –se initializeaza cu data si ora de la momentul crearii

`USER_ID` int(11) NOT NULL,

`OFFICE_ID` int(11) NOT NULL,

`CPU_ID` int(11) NOT NULL,

`UPDATETIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, –se initializeaza cu data si ora de la momentul modificarii oricarei coloane

`MODEL_ID` int(11) NOT NULL,

`SN` varchar(45) DEFAULT NULL,

PRIMARY KEY (`COMPUTER_ID`),

KEY `FK_COMP_USER_idx` (`USER_ID`),

KEY `FK_COMP_OFFICE_idx` (`OFFICE_ID`),

KEY `FK_COMP_OS_idx` (`OS_ID`),

KEY `FK_COMP_CPU_idx` (`CPU_ID`),

KEY `FK_COMP_MODEL_idx` (`MODEL_ID`),

CONSTRAINT `FK_COMP_CPU` FOREIGN KEY (`CPU_ID`) REFERENCES `cpu` (`CPU_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT `FK_COMP_MODEL` FOREIGN KEY (`MODEL_ID`) REFERENCES `model` (`MODEL_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT `FK_COMP_OFFICE` FOREIGN KEY (`OFFICE_ID`) REFERENCES `office` (`OFFICE_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT `FK_COMP_OS` FOREIGN KEY (`OS_ID`) REFERENCES `os` (`OS_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION,

CONSTRAINT `FK_COMP_USER` FOREIGN KEY (`USER_ID`) REFERENCES `user` (`USER_ID`) ON DELETE NO ACTION ON UPDATE NO ACTION);

Datele au fost populate din mai multe surse.

Tabelele COMPUTER, CPU, OS si MODEL conțin date reale exportate dintr-o baza de date cu computere care, ulterior, au fost modificate astfel încât sa se păstreze confidențialitatea atat a datelor si a sursei. Tabela OFFICE a fost populata cu date fictive pentru exemplificare. Tabela USER a fost populata cu date fictive folosind motorul de generare de date de pe site-ul http://www.generatedata.com care apoi au fost inserate in tabela respectiva.

Programul server

Proiectul a fost creat in mediul integrat de dezvoltare NetBeans IDE versiunea 8.1.

Am creat un proiect de tip Web Application pe care l-am numit LicUtmWs. Apoi, am creat clasele entitate Java direct din definiția tabelelor din baza de date hwinv. Pentru fiecare tabela, s-a creat o clasa Java cu numele tabelei. Clasele entitate folosesc adnotări specifice JPA dupa cum se poate observa in exemplul entitatii Cpu:

@Entity

@Table(name = "cpu", catalog = "hwinv", schema = "")

@XmlRootElement

@NamedQueries({

@NamedQuery(name = "Cpu.findAll", query = "SELECT c FROM Cpu c"),

@NamedQuery(name = "Cpu.findByCpuId", query = "SELECT c FROM Cpu c WHERE c.cpuId = :cpuId"),

@NamedQuery(name = "Cpu.findByCpuname", query = "SELECT c FROM Cpu c WHERE c.cpuname = :cpuname")})

public class Cpu implements Serializable {

private static final long serialVersionUID = 1L;

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Basic(optional = false)

@Column(name = "CPU_ID")

private Integer cpuId;

@Basic(optional = false)

@NotNull

@Size(min = 1, max = 255)

@Column(name = "CPUNAME")

private String cpuname;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "cpuId")

private Collection<Computer> computerCollection;

public Cpu() {}

public Cpu(Integer cpuId) { this.cpuId = cpuId; }

public Cpu(Integer cpuId, String cpuname) {

this.cpuId = cpuId;

this.cpuname = cpuname;

}

public Integer getCpuId() { return cpuId; }

public void setCpuId(Integer cpuId) { this.cpuId = cpuId; }

public String getCpuname() { return cpuname; }

public void setCpuname(String cpuname) { this.cpuname = cpuname; }

@XmlTransient

public Collection<Computer> getComputerCollection() { return computerCollection; }

public void setComputerCollection(Collection<Computer> computerCollection) {

this.computerCollection = computerCollection;

}

@Override

public int hashCode() {

int hash = 0;

hash += (cpuId != null ? cpuId.hashCode() : 0);

return hash;

}

@Override

public boolean equals(Object object) {

if (!(object instanceof Cpu)) { return false; }

Cpu other = (Cpu) object;

if ((this.cpuId == null && other.cpuId != null) || (this.cpuId != null && !this.cpuId.equals(other.cpuId))) {

return false;

}

return true;

}

@Override

public String toString() {

return "entities.Cpu[ cpuId=" + cpuId + " ]";

}

}

Adnotarea @Entity este cea care marcheaza o clasa ca fiind de tip entitate JPA.

@Table – precizeaza tabela din sursa de date cu care este asociata clasa entitate.

@NamedQuery – NetBeans creaza automat o colectie de interogari JPA, in limbajul JPQL, pentru fiecare clasa entitate:

una care intoarce toate instantele clasei: "SELECT c FROM Cpu c", echivalenta cu interogarea SQL "SELECT * FROM CPU" care intoarce toate inregistrarile din tabela CPU

cate una pentru filtrare valori pe cate o coloana, de exemplu "SELECT c FROM Cpu c WHERE c.cpuId = :cpuId", echivalenta cu SQL "SELECT * FROM CPU WHERE CPU_ID = ?"

@Column – numele coloanei din tabela cu care este asociat campul marcat din entitatea JPA.

@Id – specifica un camp al entitatii care corespunde unei coloane din tabela asociata care este cheie primara. Daca tabela are o coloana setata drept cheie primara, in procesul de generare clase entitate, aceasta adnotare este deja insa, daca avem tabele fara cheie primara, programatorul trebuie sa marcheze manual un camp ales.

@GeneratedValue – specifica faptul ca este vorba de un camp a carui valoare este autogenerata – in tabela asociata campul este autoincrementat

@Basic(optional = false) – inseamna ca acel camp nu este optional

@NotNull – marcheaza un camp care nu poate fi nul

@Size – dimensiunea campului de tip String

Tipurile de relatii intre clasele entitate JPA se marcheaza cu adnotari specifice ca de exemplu @OneToMany, @ManyToOne, @OneToOne, @ManyToMany, iar legaturile se fac cu adnotarea @JoinColumn.

Aceste clase entitatii trebuie sa fie accesibile prin servicii web, drept pentru care am creat, cu ajutorul altui wizard din NetBeans, aceste servicii de tip RESTful pe baza claselor entitate create anterior.

A fost creata o clasa abstracta si, pentru fiecare entitate JPA, cate o clasa care extinde clasa abstracta. Implicit denumirile claselor sunt <Entitate>FacadeREST.java, asta pentru ca este folosit șablonul de proiectare fațadă (façade design pattern). Acest sablon asigura mascarea detaliilor complexe si a interfetelor multiple din spate cu o singura interfata unificata simpla.

De exemplu, clasa ComputerFacadeREST:

/*

* To change this license header, choose License Headers in Project Properties.

* To change this template file, choose Tools | Templates

* and open the template in the editor.

*/

package service;

import entities.Computer;

import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;

import javax.persistence.PersistenceContext;

import javax.ws.rs.Consumes;

import javax.ws.rs.DELETE;

import javax.ws.rs.GET;

import javax.ws.rs.POST;

import javax.ws.rs.PUT;

import javax.ws.rs.Path;

import javax.ws.rs.PathParam;

import javax.ws.rs.Produces;

import javax.ws.rs.core.MediaType;

/**

*

* @author rdobre

*/

@Stateless

@Path("entities.computer")

public class ComputerFacadeREST extends AbstractFacade<Computer> {

@PersistenceContext(unitName = "LicUtmWsPU")

private EntityManager em;

public ComputerFacadeREST() {

super(Computer.class);

}

@POST

@Override

@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public void create(Computer entity) {

super.create(entity);

}

@PUT

@Path("{id}")

@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public void edit(@PathParam("id") Integer id, Computer entity) {

super.edit(entity);

}

@DELETE

@Path("{id}")

public void remove(@PathParam("id") Integer id) {

super.remove(super.find(id));

}

@GET

@Path("{id}")

@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public Computer find(@PathParam("id") Integer id) {

return super.find(id);

}

@GET

@Override

@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public List<Computer> findAll() {

return super.findAll();

}

@GET

@Path("{from}/{to}")

@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})

public List<Computer> findRange(@PathParam("from") Integer from, @PathParam("to") Integer to) {

return super.findRange(new int[]{from, to});

}

@GET

@Path("count")

@Produces(MediaType.TEXT_PLAIN)

public String countREST() {

return String.valueOf(super.count());

}

@Override

protected EntityManager getEntityManager() {

return em;

}

}

Aici observam utilizarea adnotarii @Stateless. Aceasta denota faptul ca este vorba despre un EJB de tip sesiune fara stare.

Adnotarea @Path este una specifica JAX-RS, in implementarea serviciilor web de tip RESTful. Prin folosirea ei se defineste din URI care va fi folosita pentru a primi cererile HTTP de la consumatori, cereri la care va raspunde serviciul web. In contextul acestui proiect, adnotarea @Path("entities.computer") genereaza un URI de forma “/webresources/entities.computer”. Prefixul webresources este configurat in clasa autogenerata ApplicationConfig prin adnotarea @javax.ws.rs.ApplicationPath("webresources").

Adnotarea @PersistenceContext defineste numele unitatii de persistenta (Persistance Unit Name) care este regasit in proiect, in fisierul de configurare persistance.xml.

Tot specifice JAX-RS sunt si adnotarile @POST, @PUT, @DELETE si @GET. Ele definesc metode HTTP ce vor putea fi folosite in apelurile catre serviciul web. Cu ajutorul acestor metode, consumatorul va putea face operatiunile CRUD, POST corespunde cu Create, GET cu Read, PUT cu Update iar DELETE cu Delete.

In aceeasi fatada se pot defini mai multe metode de acelasi tip, ele fiind diferentiate de structura URI-ului si de alti parametri. Implicit, NetBeans a creat patru metode GET:

cel implicit – /webresources/entities.computer – pentru obtinerea tuturor instantelor clasei – inregistrarilor din tabela

@Path("{id}") – /webresources/entities.computer/id pentru cautarea dupa un identificator specificat

@Path("{from}/{to}") – /webresources/entities.computer/id1/id2 – pentru obtinerea acelor intrgistrari avand identificatorul cuprins intre doua valori

@Path("count") – /webresources/entities.computer/count – pentru obtinerea numarului total de inregistrari din tabela

Metoda GET este adnotata cu @Produces care defineste tipul de continut returnat de serviciul web la apelarea metodei. In cazul nostru este vorba de doua tipuri – XML si JSON: @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}).

Metodele PUT si POST sunt adnotate cu @Consumes deoarece, la apelarea lor, clientul vine cu date de intrare iar serviciul web le "consuma".

Utilizare

Concluzii și directii de dezvoltare

Server

Client

Statistici

Read Me

(daca nu e la utilizare)

InformationWeek – From EDI To XML And UDDI: A Brief History Of Web Services (http://www.informationweek.com/from-edi-to-xml-and-uddi-a-brief-history-of-web-services/d/d-id/1012008)

W3C – Web Services Architecture (https://www.w3.org/TR/ws-arch/)

Oracle – Enterprise JavaBeans Technology (http://www.oracle.com/technetwork/java/javaee/ejb/index.html)

Roy Thomas Fielding – Architectural Styles and

the Design of Network-based Software Architectures, Chapter 5 – Representational State Transfer (REST) (http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm)

Wikipedia – REST (https://en.wikipedia.org/wiki/REST)

Service Architecture – Representational State Transfer (REST) (http://www.service-architecture.com/articles/web-services/representational_state_transfer_rest.html)

REST API Tutorial, Using Methods for RESTful Services (http://www.restapitutorial.com/lessons/httpmethods.html)

Pîrnau, M – Proiectarea Interfețelor Grafice – suport curs 2015-2016

Michael Sikora, Ejb 3 Developer Guide, ISBN: 978-1-847195-60-9

SearchSOA – Enterprise JavaBeans (EJB) (http://searchsoa.techtarget.com/definition/Enterprise-JavaBeans)

Tribul IT – Jersey – Implementare Pentru JAX-RS (https://tribulit.ro/2016/01/19/jersey-implementare-pentru-jax-rs/)

Similar Posts