Lect. Univ. Dr. GABROVEANU Mihai [610892]

UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE ȘTIINȚE
SPECIALIZAREA INFORMATICĂ

LUCRARE DE LICEN ȚĂ

Îndrumător științific :
Lect. Univ. Dr. GABROVEANU Mihai
Absolvent: [anonimizat]
2019

UNIVERSITATEA DIN CRAIOVA
FACULTATEA DE ȘTIINȚE
SPECIALIZAREA INFORMATICĂ

DEZVOLTAREA APLICA ȚIILOR WEB FOLOSIND
SPRING 5

Îndrumător științific :
Lect. Univ. Dr. GABROVEANU Mihai
Absolvent: [anonimizat]
2019

Cuprins
1. INTRODUCERE ………………………….. ………………………….. ………………………….. ….. 4
2. SPRING FRAMEWORK ………………………….. ………………………….. ………………….. 6
2.1 Container -ul IoC ………………………….. ………………………….. ………………………….. . 6
2.2 Validarea și legarea datelor ………………………….. ………………………….. ……………. 9
2.3 Spring Expression Language (SpEL) ………………………….. …………………………. 10
2.4 Programarea Orientată pe Aspecte în Spring ………………………….. ……………… 11
2.5 Arhitectura Spring Framework ………………………….. ………………………….. …….. 11
3. SPRING MVC ………………………….. ………………………….. ………………………….. ……. 13
3.1 Șablonul de proiectare MVC ………………………….. ………………………….. ………… 13
3.2 Fluxul datelor în Spring MVC ………………………….. ………………………….. ………. 15
3.3 DispatcherServlet ………………………….. ………………………….. ………………………… 16
3.3.1 Ierarhia Contextelor ………………………….. ………………………….. ………………. 18
3.3.2 Tipuri speciale de bean -uri ………………………….. ………………………….. ……… 19
3.4 Annotated Controllers ………………………….. ………………………….. ………………….. 20
3.4.1 Declararea ………………………….. ………………………….. ………………………….. … 21
3.4.2 Request Mapping ………………………….. ………………………….. …………………… 22
3.5 Handler Methods ………………………….. ………………………….. …………………………. 23
3.5.1 @PathVariable ………………………….. ………………………….. ……………………… 24
3.5.2 @RequestParam ………………………….. ………………………….. ……………………. 25
3.5.3 @ModelAttribute ………………………….. ………………………….. …………………… 25
3.5.4 Atribute de redirec ționare ………………………….. ………………………….. ………. 26
3.5.5 Binding Result ………………………….. ………………………….. ………………………. 26
3.6 Tehnologiile View ………………………….. ………………………….. ………………………… 26
3.6.1 JSP și JSTL ………………………….. ………………………….. ………………………….. . 27
4. SPRING JPA ………………………….. ………………………….. ………………………….. ……… 30
4.1 Spring Data ………………………….. ………………………….. ………………………….. …….. 30
4.2 ORM Data Acces s ………………………….. ………………………….. ………………………… 31

4.3 Spring Data JPA ………………………….. ………………………….. ………………………….. 32
4.4 Metode de interogare ………………………….. ………………………….. …………………… 33
4.4.1 Definirea interfe țelor de tip Repository ………………………….. ………………… 34
4.4.2 Definirea metodelor care efectuează interogările ………………………….. …… 35
4.4.3 Crearea instan țelor de tip repository ………………………….. ……………………. 38
5. APLICA ȚIE. Martial Arts Manager ………………………….. ………………………….. …. 40
5.1 Modulele aplica ției ………………………….. ………………………….. ………………………. 40
5.2 Func ționalitățile aplicației ………………………….. ………………………….. …………….. 41
5.3 Structura aplica ției ………………………….. ………………………….. ………………………. 44
5.3.1 Proiectarea bazei de date ………………………….. ………………………….. ………… 47
5.3.2 Procesul de autentificare ………………………….. ………………………….. ………… 49
5.4 Modul de func ționare al aplicației ………………………….. ………………………….. …. 51
6. CONCLUZII ………………………….. ………………………….. ………………………….. ……… 62
Bibliografie ………………………….. ………………………….. ………………………….. ……………… 64

Cîrciumaru Alex Ionu ț INTRODUCERE
4

1. INTRODUCERE

Spring Framework este descris ca fiind un framework folosit la dezvoltarea aplica țiilor
Java, el furnizând un model programabil și configurabil pentru crearea aplicațiilor enterprise. La
baza lui, Spring oferă un container,care este deseori referit ca și Spring Appl ication Context,
acesta gestionând crearea și administrarea componentelor aplica ției. Aceste componente, numite
și beans, sunt legate împreună în interiorul Application Context -ului ca să realizeze o aplica ție
completă.
O primă formă a acestui framework a fost introdusă de către Rod Johnson în cartea acestuia
[7], urmând ca pe parcursul anilor acesta să aibă o cre ștere exponențială în funcționalități, proiecte
asociate și suport al comunității. Cartea oferea o funda ție a configurației bean -urilor, suport pentru
AOP, o abstractizare a JDBC ș.a.m.d.
Prima versiune cu documenta ție oficială a fost realizată în anul 2004, Spring Framework
1.0, framework -ul fiind com pus din 7 module : Spring Core (Bean Container) , Spring Context
(Application Context, UI, Validation), Spring DAO (infrastructura de tranzac ții, Java Database
Connectivity – JDBC), Spring ORM (Hibernate, iBatis), Spring AOP (o implementare a
aspect -oriented programming – AOP), Spring Web (integrare de bază a caracteristicilor precum
multifunc ționalitatea, inițializarea contextului prin servlet listeners și un context al aplicației ori-
entat web) și Spring Web MVC (Model -View -Controller – MVC framework ).
Versiunea cu numărul doi a adus o configurare XML mai u șoară a aplicațiilor bazată pe
XML Schema , îmbunătă țiri pe partea de AOP, introducerea Java Persistence API (JPA) și suport
pentru adnot ările din Java 5, specific pentru @Transactional , @Required și @AspectJ . În
versiunea 2.5 a fost adăugată o nouă adnotare pentru configurare numită @Autowired, precum
și alte adnotări stereotip (@Component , @Repository , @Service , @Controller ).
Spring 3 a fost prima versiune bazată pe Java 5 și construită c a să se poată folosi de toate
avantajele pe care le oferea Java 5, cum ar fi generics , varargs și alte îmbunătățiri ale limbajului.
Au fost introduse Spring Expression Language (SpEL) și suport pentru JSR -303 (Bean

Cîrciumaru Alex Ionu ț INTRODUCERE
5
Validation ). Următoarele subversiuni au a dus adnotări echivalente elementelor namespace -urilor
Spring XML precum @ComponentScan , @EnableWebMvc , etc. , suport pentru Hibernate 4, un
nou test framework Spring MVC, Jackson JSON 2 suport și multe altele.
A patra versiune a fost un release major și a fost prim a versiune care oferea suport pentru
Java 8. Clasele și metodele deprecated au fost înlăturate, modulele rămânând organizate în mare
parte la fel. Subversiunile următoare au adus suport total pentru Hibernate ORM 5.0, îmbunătă țiri
pentru JMS, WebSocket și Testing, modelul de programare a fost rafinat și a fost introdus suport
pentru librării noi.
Spring 5 a fost de asemenea un release major, întregul cod de bază al framework -ului ba-
zându -se pe Java 8. Suportul a fost oprit pentru librării precum Portlet, Velocity, Tiles2 și Hiber-
nate3. Au fost aduse î mbunătă țiri exploatând toată puterea caracteristicilor Java 8. A fost introdus
suport pentru Protobuf 3.0, JMS 2.0+ și JPA 2.1+ și au fost aduse îmbunătățiri modulului de test,
JUnit 5 fiind sprijinit și fiind adăugate noi adnotări. Modulele web și core au fost adaptate pentru
model ul de programare reactive.
Această lucrare este structurată în cinci capitole, după cum urmează :
1. Capitolul Introducere reprezintă partea introductivă a lucrării și prezentarea pe
capitole a structurii acesteia .
2. Capitolul Spring F ramework conține detalii despre modulele și arhitectura pe care
este bazat Spring 5 și sunt descrise componentele care au stat la dezvoltarea frame-
work -ului, și anume : Dependency Injection și Aspect Oriented Programming
(AOP).
3. Capitolul Spring MVC este de dicat modulului Spring MVC fiind unul dintre cele
mai importante module apar ținând Spring Framework. Este bazat pe container -ul
Spring IoC și profită la maxim de caracteristicile container -ului, permi țându -i să-și
simplifice configura ția.
4. Capitolul Spring JPA descrie un alt modul important al Spring -ului, Spring Data
JPA, care face parte din familia Spring Da ta și are rolul de a ușura implementarea
repository -urilor bazate pe JPA.
5. Capitolul Aplica ție conține prezentarea aplicației și descrie modul în care au fost
implementate conceptele prezentate în capitolele anterioare.
6. Capitolul Concluzii cuprinde sinteza informa țiilor prezentate în cadrul acestei lu-
crări și opinia personală privind utilizarea acestui framework în cadrul aplicațiilor.

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
6

2. SPRING FRAMEWORK

Spring oferă dezvoltatorului un suport consistent în cadrul procesului de creare a unei apli-
cații Java Enterprise, acesta oferind suport pentru Groovy și Kotlin ca limbaje alternative pe Java
Virtual Machine (JVM). De la apari ția framework -ului Spring 5, Spring necesită Java Develop-
ment Kit 8+ (JDK 8+) și dispune de asemenea și de suport pentru JDK 9.
Spring este împăr țit în module, aplicațiile deținând libertatea de a alege ce module doresc
să folosească. Modulele de bază sunt reprezentate de către core container , inclu zând un model
configurabil și un mecanism de dependency injection. De asemenea, Spring oferă suport pentru
multiple tipuri de arhitectur i ale aplica țiilor.
Principiile îndrumătoare ale framework -ului Spring sunt :
 Permiterea realizării de schimbări ale design -ului aplica ției la orice nivel. Spre
exemplu, se poate schimba persistence provider -ul prin intermediul configura ției
fără a fi nevo ie de a efectua modificări în cod.
 Spring sus ține flexibilitatea și nu este unidirecționat , fiindu -i ușor să se adapteze
la perspective multiple.
 Menținerea unei compatibilități solide. Spring a evoluat uniform, astfel încât să nu
fie nevoie de schimbări drastice între versiuni.
 Realizarea de API -uri intuitive care să persiste pe parcursul anilor.
 Setarea unor standarde înalte legate de calitatea codului, Spring accentuând impor-
tanța unui Javadoc elaborat corect.

2.1 Container -ul IoC

Inversion of Control (IoC) container este o componentă de bază ce apar ține framework –
ului Spring. IoC mai este cunoscut și ca dependency injection (DI). DI este caracterizat ca fiind

Cîrciumaru Alex Ionu ț SPRING FR AMEWORK
7
procesul prin care obiectele î și definesc propriile dependențe doar prin intermediul argumentelor
unui constructor, argumentelor unei metode de tip factory sau prin intermediul metodelor de tip
set ale clasei respective. Atunci când se dezvoltă aplica ții Java complexe se dorește pe cât posibil
ca obiectele și clasele să fie cât mai independente unele de altele, astfel crescând posibilitatea
reutilizării acestora și testarea independentă a acestora. Astfel, acest concept presupune conectarea
claselor, dar în acela și timp, clasele să fie independente una față de cealaltă. Acest co ncept poate
fi privit ca o asociere între două clase.
Următorul exemplu [8] prezintă conceptul de injectare a dependen țelor.
public class SimpleMovieLister {

// the SimpleMovieLister has a dependency on a MovieFinder
private MovieFinder movieFinder;

// a constructor so that the Spring container can inject a
MovieFinder
public SimpleMovieLister (MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}

// business logic that actually uses the injected MovieFind er
is omitted…
}

public class SimpleMovieLister {

// the SimpleMovieLister has a dependency on the MovieFinder
private MovieFinder movieFinder;

// a setter method so that the Spring container can inject a Mov-
ieFinder
public void setMovieFinder( MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
8

// business logic that actually uses the injected MovieFinde r}

După definirea dependen țelor, container -ul injectează aceste dependen țe în momentul în
care creează bean -ul.
Pachetele org.springframework.beans și org.springframework.context re-
prezintă funda ția container -ului IoC. Interfa ța BeanFactory oferă un mecanism cu o configura ție
avansată capabil să administreze orice tip de obiect. ApplicationContext este o sub -interfa ță
a lui BeanFactory , aceasta adăugând :
 O integrare mai u șoară cu proprietățile lui Spring AOP.
 O manipulare a mesajelor (folosită pentru interna ționalizare).
 Publicarea evenimentelor.
 Contexte speciale precum WebApplicationContext care e ste folosit în aplica-
țiile web.
Pe scurt, BeanFactory oferă configura ția și funcționalitatea de bază a unei aplicații, iar
ApplicationContext adaugă mai multe func ționalități orientate enterprise.
În Spring, obiectele care formează scheletul aplica ției și care sunt administrate de către
container -ul IoC se mai numesc și beans. Un bean1 este un obiect care este instan țiat, asam blat și
administrat de către IoC. Altfel spus, un bean nu este nimic altceva decât unul dintre obiectele car e
se află î n aplica ția ta.
În figura 2. 1 este prezentată schema container -ului IoC.

1 Un bean poate fi referit și ca un POJO (Plain Old Java Object)

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
9

Figură 1 – Schema container -ului IoC [8]

Există implementări variate ale interfe ței ApplicationContext care sunt furnizate de
către Spring. Într-o aplica ție de sine stătătoare, este obișnuit să se creeze o instanță a
ClassPathXmlApplicationContext sau a FileSystemXmlApplicationContext . Deși
XML a reprezentat metoda tradi țională pentru definirea configurației, se poate instrui de asemenea
container -ul ca să utilizeze adnotările Java sau cod ca să definească configura ția.

2.2 Validarea și legarea datelor

Anumi ți autori consideră că validarea face parte din logica de business , alții nu, dar Spring
oferă o arhitectură pentru valida re care nu exclude nicio variantă. Validarea nu ar trebui să fie
legată de nivelul web și ar trebui să fie relativ ușor de localizat. Datorită acestor considerații,
Spring a produs o interfa ță numită Validator care poate fi utilizată în orice nivel al apli cației.
Data Binding permite input -ului introdus de către user să fie legat dinamic de modelul
domeniului care apar ține unei aplicații. Spring furnizează DataBinder ca să realizeze acest lucru.
Pachetul Validation, din care fac parte Validator și DataBinde r, este folosit în principal de
către MVC framework.

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
10
În exemplul următor [8] se poate vedea o implementare a interfe ței Validator . Mai pre-
cis, o clasă este responsabilă cu validarea datelor unei persoane.
public class PersonValidator implements Validator {

/**
* This Validator validates *only* Person instances
*/
public boolean supports( Class clazz) {
return Person.class.equals(clazz);
}

public void validate( Object obj, Errors e) {
ValidationUtils .rejectIfEmpty (e, "name", "name.empty ");
Person p = (Person) obj;
if (p.getAge() < 0) {
e.rejectValue ("age", "negativevalue ");
} else if (p.getAge() > 110) {
e.rejectValue ("age", "too.darn.old ");
}
}
}

2.3 Spring Expression Language (SpEL)

SpEL este un limbaj puternic bazat pe expresii care asigură interogarea și manipularea
grafului de obiecte în timpul rulării. Sintaxa limbajului este similară cu Unified EL dar are ni ște
caracteristici suplimentare, remarcându -se invocarea metodelor și funcționalități le pe șiruri de ca-
ractere. SpEL furnizează func ționalități prec um expresii literare, expresii regulate și expresii de
clasă.
Acest limbaj poate fi utilizat și prin configurare cu fișiere XML, și prin configurare bazată
pe adnotări și clase Java.

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
11
2.4 Programarea Orientată pe Aspecte în Spring

Programarea Orientată pe Aspecte (Aspect Oriented Programming – AOP) vine în comple-
tarea programării orientate pe obiecte prin furnizarea unei alte perspective de a construi structura
unui program. Principalul rol este acela de a oferi modularitate aplica țiilor dezvol tate în Spring.
Una dintre componentele de bază ale Spring -ului este framework -ul AOP. În timp ce
Spring IoC nu este dependent de AOP (adică utilizatorul nu trebuie să folosească AOP dacă nu
vrea), AOP vine în completarea Spring IoC.
AOP este folosit în Sp ring pentru a :
 Furniza servicii enterprise declarative, în special pentru a înlocui serviciile decla-
rative EJB. Cel mai important serviciu ar fi gestionarea tranzac țiilor declarative.
 Permite utilizatorilor să implementeze aspecte personalizate.

2.5 Arhitectura Spring Framework

Spring este alcătuit din mai multe caracteristici care sunt grupate în aproximativ 20 de
module. Aceste module sunt organizate astfel :
 Core Container
o Beans .
o Core – furnizează partea fundamentală a acestui framework. Acesta con ține
și caracteristicile descri se anterior, AOP (Aspect of Programming) și DI
(Dependency Injection).
o SpEL .
o Context – se bazează pe modulele oferite de Core și Beans. Acesta se ocupă
de accesarea obiectelor.
 Web
o WebSocket – reprezintă modulul responsabil de comunicarea între client și
server utilizând comunicarea în ambele direc ții, de la server către client și
de la client către server.
o Servlet .

Cîrciumaru Alex Ionu ț SPRING FRAMEWORK
12
o Web – pune la dispozi ție anumite caracteristici precum încărcarea fișierelor
și inițializa rea container -ului IoC folosind obiecte de tip Servlet și un con-
text al aplica ției orientat web.
o Portlet .
 Data Access / Integration
o JDBC – este un modul care abstractizează accesarea datelor dintr -o bază de
date, înlăturând anteriorul și incomodul cod JDBC.
o ORM – furnizează suport pentru integrarea renumitelor Object Relational
Mapping (ORM) API -uri precum JPA și Hibernate.
o OXM – pune la dispozi ție suport pentru implementări ale Object/XML
mapping, cum ar fi JAXB și Castor.
o JMS – conține caracteristici care se ocupă de producerea și procesarea me-
sajelor .
o Transactions – oferă suport pentru gestionarea tranzac țiilor .
 AOP .
 Instrumentation .
 Aspects – acest modul facilitează integrarea cu AspectJ.
 Messaging – conține adnotări pentru maparea mesajelor către metode .
 Test – oferă suport pentru unit testing și integration testing a componentelor Spring
folosind Junit sau TestNG.
Modulele care alcătuiesc framework -ul Spring sunt expuse în Figura 2 .

Figură 2 – Modulele Framework -ului Spring [9]

Cîrciumaru Alex Ionu ț SPRING MVC
13

3. SPRING MVC

Spring MVC este un framework Java utilizat în dezvoltarea aplica țiilor web și implementează
concepte precum Inversion of Control și Dependency Injection.
Spring web mvc este construit pe API -ul Servlet și a reprezentat încă de la început un modul
de bază al framework -ului Spring. Numele este dat de către modelul sursă, spring-webmvc , dar
este mai cunoscut ca și Spring MVC.
Unele metode din clasele nucleu ale Spring Web MVC sunt declarate ca fiind final. Un dez-
voltator nu poate suprascrie aceste metode pentru a le furniza un comportament propriu .
Acest modul pune la dispozi ție un suport consistent șablonului de proiectare Model View
Controller (MVC), oferind caracteristici precum interna ționalizarea și validarea care ușurează im-
plementarea nivelului de prezentare.

3.1 Șablonul de proiectare MVC

Model View Controller (MVC) este un șablon de proiectare folosit pentru a separa aplica ția
în trei păr ți interconectate între ele, scopul fiind de a separa partea logică și reprezentarea infor-
mației de modul în care aceasta este prezentată utilizatorului. Acest șablon de proiectare decu-
plează aceste componente majore fa cilitând reutilizarea eficientă a codului și dezvoltarea în para-
lel.
Această arhitectură a devenit populară în realizarea aplica țiilor web, majoritatea limbajelor
populare din ziua de astăzi precum Java, C# și Python deținând framework -uri MVC care sunt
folosite încă de la începutul dezvoltării unei aplica ții web.

Cîrciumaru Alex Ionu ț SPRING MVC
14
Componentele acestui șablon de proiectare sunt :
 Model – Reprezintă componenta centrală a acestui șablon, fiind o structură de date
dinamică și independentă de interfața cu utilizatorul, care gestionează aceste date
și starea aplicației. Administrează direct datele, logica și structura aplicației.
 View – Constă în orice reprezentare a informa ției, precum diagrame, tabele sau
grafice, făcând posibilă reprezentarea vizuală în moduri multiple a a celea și infor-
mații.
 Controller – Acesta gestionează cererile făcute de către utilizator în interfa ța gra-
fică, interac ționează cu nivelul de servicii, actualizează modelul și direcționează
utilizatorul către view -ul care con ține rezultatul execuției cereril or.
Pe lângă împăr țirea aplicației în aceste componente, arhitectura MVC definește și interac-
țiunea dintre aceste modele. Model -ul se ocupă de gestionarea datelor aplica ției, el recepționând
comenzi trimise de către controller. View -ul se ocupă de prezenta rea informa ției modelului într –
un format particular. Controller -ul recep ționează input -ul utilizatorului, op țional îl validează , și
apoi efectuează opera țiile pe obiectele model.
În Figura 3 este prezentată schema șablonului de proiectare Model View Cont roller.

Figură 3 – Schema șablonului de proiectare MVC [1]

Cîrciumaru Alex Ionu ț SPRING MVC
15
Scopurile șablonului de proiectare MVC sunt :
 Dezvoltarea simultană – fiind realizată decuplarea componentelor aplica ției, se
poate lucra simultan la module diferite ale aplica ției fără a exista riscul de a bloca
pe altcineva în timpul dezvoltării. Spre exemplu, o echipă se poate împăr ți în oa-
meni care se ocupă de partea de front end și în oameni care se ocupă de partea de
back end. Oamenii de pe partea de back end pot structura aplica ția fără a avea ne-
voie de o interfa ță cu utilizatorul.
 Reutilizarea codului – Prin crearea unor componente care sunt independente una
față de cealaltă, programatorii sunt capabili să reutilizeze componente rapid și ușor
în alte aplica ții.
Avantajele acestui șablon de proiectare sunt : dezvoltarea simultană, coeziunea ridicată
(MVC permite gruparea logică a ac țiunilor corelate într -un singur co ntroller), cuplarea redusă și
ușurința prin care se pot realiza modificări.
Dezavantajele acestuia sunt parcurgerea codului, men ținerea consistenței și nevoia de a
cunoa ște mai multe tehnologii.

3.2 Fluxul datelor în Spring MVC

Spring MVC implementează un șablon front controller. Punctul de intrare al aplicației este
DispatcherServlet . DispatcherServlet se bazează pe o implemen tare HandlerMap-
ping . Utilizând diferite strategii și specificații, HandlerMapping -ul atribuie o metodă de tip
handler din Controller care să gestioneze cererea.
Odată ce DispatcherServlet -ul gestionează o metodă de tip handler a Controller -ului, acesta
trimite cererea către aceasta. Metoda returnează un nume de View (sau direct View -ul) și de ase-
menea obiectul modelului pop ulat către DispatcherServlet .
Cu numele View -ului, DispatcherServlet -ul cere unei implementări ViewResolver
și să selecteze un View.
Având cererea, un View și un Model, DispatcherServlet -ul de ține tot ceea ce are nevoie
pentru a construi un răspuns pen tru client. View -ul este procesat alături de toate elementele și
răspunsul este în cele din urmă returnat către servlet -container.

Cîrciumaru Alex Ionu ț SPRING MVC
16
Fluxul datelor în Spring MVC poate fi reprezentat ca în figura următoare :

Figură 4 – Fluxul datelor în Spring MVC [1]

3.3 DispatcherServlet

Spring MVC, asemenea multor framework -uri web, este construit în jurul unui controller
principal care este reprezentat de un Servlet , DispatcherServlet -ul, care furnizează un

Cîrciumaru Alex Ionu ț SPRING MVC
17
algoritm pentru procesarea cererilor, în timp ce acestea sunt executate de către componentele con-
figurabile.
DispatcherServlet -ul, ca și orice alt Servlet , trebuie să fie declarat și conectat cores-
punzător specifica țiilor unui Servlet utilizând configurare Java sau configurarea în fi șierul
web.xml. În schimb, DispatcherServlet -ul util izează configura ția Spring pentru a localiza
componentele necesare pentru gestionarea cererilor, afi șarea view -ului corespunzător, tratarea ex-
cepțiilor ș.a.m.d.
Mai jos este prezentat un exemplu de configurare xml.
<web-app>

<listener>
<listener-class>org.springframework.web.context.ContextLoader-
Listener </listener -class>
</listener>

</context -param>
<param-name>contextConfigLocation </param-name>
<param-value>/WEB-INF/app-context.xml </param-value>
</context -param>

<servlet>
<servlet -name>app</servlet -name>
<servlet -class>org.springframework.web.servlet.Dispatcher-
Servlet</servlet -class>
<init-param>
<param-name>contextConfigLocation </param-name>
<param-value></param -value>
</init-param>
<load-on-startup> 1</load-on-startup>
</servlet>

<servlet -mapping>
<servlet -name>app</servlet -name>
<url-pattern> /app/*</url-pattern>
</servlet -mapping>

Cîrciumaru Alex Ionu ț SPRING MVC
18

</web-app>

3.3.1 Ierarhia Contextelor

DispatcherServlet -ul necesită un WebApplicationContext , care este o extensie a
ApplicationContext -ului, pentru configura ția proprie.
În majoritatea aplica țiilor web este suficient să existe un singur WebApplicationCon-
text . Este posibil de asemenea ca o aplica ție să conțină o ierarhie a contextelor cu un We-
bApplicationContext ca și rădăcină, care să fie distribuit în restul instanțelor unui Dispatcher-
Servlet , care la rândul lor să aibă o configura ție WebApplicationContext .
WebApplicationContext -ul rădăcină con ține infrastructura bean -urilor, precum servici-
ile business și gestiunea datelor, care trebuie să fie distribuite prin instanțele multiple ale unui
Servlet .
Ierarhia contextelor WebApplicationContext poate fi văzută în Figura 5.

Cîrciumaru Alex Ionu ț SPRING MVC
19

Figură 5 – Ierarhia WebApplicationContext -urilor [2]

3.3.2 Tipuri speciale de bean -uri

DispatcherServlet -ul delegă procesarea cererilor către anumite bean -uri speciale și in-
terpretează răspunsurile corespunzătoare. D enumirea de “bean special” este utilizată pentru a des-
crie instan țelor obiectelor administrate de către Spring, care implementează un contract WebFlux .
Tipuri de bean -uri speciale :

Cîrciumaru Alex Ionu ț SPRING MVC
20
 HandlerMapping – Direc ționează o cere re și o listă de interceptori de pro cesare
către un manipulator. Direc ționarea se bazează pe un criteriu, detaliile fiind diferite
de la o implementare la alta. Cele 2 implementări de bază sunt RequestMap-
pingHandlerMapping (care con ține adnotarea @ RequestMapping ) și Sim-
pleHandlerMapping .
 HandleAdapter – Vine în ajutorul DispatcherServlet -uluim el fiind respon-
sabil spre exemplu de detaliile invocării unui manipulator, protejând Dispat-
cherServlet -ul de astfel de detalii.
 HandleExceptionResolver – Strategie pentru manipularea și tratarea excepți-
ilor.
 LocaleResolver – Ajută la implementări precum interna ționalizarea.
 ThemeResolver – Gestionează tematicile pe care le poate folosi o aplica ție.
 MultipartResolver – Abstractizează procesarea unei cereri formate din mai
multe păr ți.
 FlashMapManager – Administrează fluxul input -urilor și output -urilor dintre ce-
reri
Aplica țiile pot declara infrastructura listei de bean -uri speciale care sunt necesare pentru
procesarea cererilor. DispatcherServlet -ul caută în mod WebApplicatio nContext bean-
uri speciale. Dacă nu găse ște, se întoarce la valorile standard înlănțuite în DispatcherServlet.pro-
perties.
În cele mai multe cazuri, MVC Config -ul este cel mai bun punct de start. Acesta declară
bean -urile necesare, în format Java sau XML, și furnizează un callback API personalizabil.

3.4 Annotated Controllers

Spring MVC furnizează un model programabil bazat pe adnotări unde componentele @Con-
troller și @RestController utilizează adnotări pentru a gestiona cererile. Un Controller care este
adnotat are semnături flexibile ale metodelor și nu este nevoie de implementarea unor interfețe
speciale sau de mo ștenirea de la niște clase de bază.
Mai jos este prezentat un exempl u de Controller definit de adnotări [8].

Cîrciumaru Alex Ionu ț SPRING MVC
21
@Controller
public class HelloController {

@GetMapping ("/hello" )
public String handle(Model model) {
model.addAttribute ("message" , "Hello World!" );
return "index";
}
}

În exemplul anterior, metoda prime ște un Model ca și parametru și returnează numele unui
view care este format dintr -un șir de caractere.

3.4.1 Declararea

Se pot defini mai multe bean -uri de tip controller utilizând o defini ție standard în
WebApplicationContext . Adnotarea @Controller permite detectarea automată, împreună
cu suportul general Spring pentru detectarea claselor adnotate c u @Component și le înregistrează
automat defini țiile. De asemenea, se comportă ca un stereotip pentru clasa adnotată, indicând rolul
acesteia ca și componentă web.
Pentru a activa detectarea automată a bean -urilor precum @Controller , se poate adaugă
scana rea componentelor în configura ția Java, așa cum este arătat în următorul exemplu [8]:
@Configuration
@ComponentScan ("org.example.web" )
public class WebConfig {

// …
}

Cîrciumaru Alex Ionu ț SPRING MVC
22
Echivalentul exemplului precedent în format XML este următorul [8]:
<?xml version= "1.0" encoding= "UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi= "http://www.w3.org/2001/XMLSchema -instance"
xmlns:p= "http://www.springframework.org/schema/p"
xmlns:context= "http://www.springframework.org/schema/context"
xsi:schemaLocation= "
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring –
beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring -con-
text.xsd" >

<context:component -scan base-package= "org.example.web" />
</beans>

3.4.2 Request Mapping

Adnotarea @RequestMapping este utilizată pentru a distribui cererile către metodele aflate
în controller. De ține atribute variate pentru a se potrivi prin URL, metoda HTTP, parametrii cererii
și tipuri media. Se poate folosi la nivel de clasă pentru a exprima distri buirile, sau la nivel de
metodă pentru a restrânge la o gestionare particulară.
Există de asemenea variante ale adnotării @RequestMapping care sunt specifice pentru un
scop mai exact al metodelor HTTP :
 @GetMapping.
 @PostMapping.
 @PutMapping.
 @DeleteMappin g.
 @PatchMapping.

Cîrciumaru Alex Ionu ț SPRING MVC
23
Aceste prescurtări sunt adnotări personalizate care sunt furnizate deoarece majoritatea me-
todelor unui controller ar trebui conectate corespunzător unei metode specifice HTTP, în timp ce
adnotarea @RequestMapping , în mod implicit, se potr ivește cu toate metodele HTTP. În același
timp, @RequestMapping este necesară la nivel de clasă pentru a exprima conectările.
Următorul exemplu con ține distribuiri la nivel de clasă și de metode [8]:
@RestController
@RequestMapping ("/persons" )
class PersonController {

@GetMapping ("/{id}")
public Person getPerson( @PathVariable Long id) {
// …
}

@PostMapping
@ResponseStatus (HttpStatus .CREATED)
public void add(@RequestBody Person person) {
// …
}
}

3.5 Handler Methods

Metodele de tip handler adnotate cu @RequestMapping au o semnătură a func ției flexibilă
și pot selecta dintr -o gamă variată de argumente și de valori ce pot fi returnate. Metodele pot con-
ține argumente precum : @RequestParam , @PathVariable , RedirectAttributes ,
@ModelAttribute sau BindingResult .
Exemple de valori ce pot fi returnate de către o metodă de tip handler :

Cîrciumaru Alex Ionu ț SPRING MVC
24
 String – Numele unui view care urmează să fie gestionat cu implementările din
ViewResolver și folosit împreună c u modelul implicit, determinat prin metode ce
conțin @ModelAttribute .
 View – O instan ță de tip View care este interpretată împreună cu modelul implicit,
determinat cu ajutorul obiectelor de tip comandă.
 @ModelAttribute – Atributul care este ad ăugat în mod implicit modelului.
 ModelAndView – Atributele model și view necesare, și, eventual, o stare a răspun-
sului.
 void – O metodă care returnează tipul void (sau null) este considerată ca fiind o
metodă care a gestionat total răspunsul.

3.5.1 @PathVariable

@PathVariable este o adnotare care se folose ște pentru a accesa valorile variabilelor URI
(Uniform Resource Identifier). Variabilele URI pot fi declarate și la nivel de clasă, și la nivel de
metodă, precum este exemplificat în următoarea sec vență de cod [8]:

@Controller
@RequestMapping ("/owners/{ownerId}" )
public class OwnerController {

@GetMapping ("/pets/{petId}" )
public Pet findPet( @PathVariable Long ownerId, @PathVariable
Long petId) {
// …
}
}

Cîrciumaru Alex Ionu ț SPRING MVC
25
3.5.2 @RequestParam

@RequestParam este utilizată pentru a lega parametrii unei cereri (parametrii interogării sau
date formale) către argumentele unei metode din controller. Exemplul următor [8] arată cum se
poate folosi .
@Controller
@RequestMapping ("/pets")
public class EditPetForm {

// …

@GetMapping
public String setupForm( @RequestParam ("petId") int petId, Mo-
del model) {
Pet pet = this.clinic. loadPet(petId);
model.addAttribute ("pet", pet);
return "petForm" ;
}
}

3.5.3 @ModelAttribute

Accesarea unui atribut al unui model sau instan țierea acestuia, dacă nu a avut loc deja, se
pot realiza cu ajutorul adnotării @ModelAttribute . Atributul model este în acela și timp suprapus
cu valori ale parametrilor ale unei cereri HTTP Servlet, ai căror nume se potrivesc cu numele
câmpurilo r. Acest procedeu se referă la Data Binding, și face posibilă evitarea procesării și con-
vertirii fiecărui parametru al interogării. Această adnotare se folose ște în modul următor [8]:
@PostMapping ("/owners/{ownerId}/pets/{petId}/edit" )
public String processSubmit( @ModelAttribute Pet pet) { }

Cîrciumaru Alex Ionu ț SPRING MVC
26
Instan ța clasei de tip Pet este creată precum urmează :
– Prin model dacă a fost deja adăugat folosind Model.
– Prin sesiunea HTTP utilizând adnotarea @SessionAttributes .
– Prin variabila URI transmisă printr -un Converter.
– Prin invocarea constructorului implicit.
– Prin invocarea constructorului cu argumente.

3.5.4 Atribute de redirec ționare

Pentru a evita trimiterea de parametrii nedori ți, o metodă de tip @RequestMapping se poate
declara un atribut de tip RedirectAttributes care să specifice în mod explicit ce atribute să
fie disponibile pentru RedirectView. Dacă metoda efectuează o redirec ționare, conținutul deținut
de RedirectAttributes este folosit. În caz contrar, este folosit con ținutul modelul ui.

3.5.5 Binding Result

Se folose ște pentru a accesa erorile provenite din validarea și legarea unui obiect comandă
(un argument @ModelAttribute ), sau erori rezultate în urma validării argumentelor metodelor
@RequestBody sau @RequestPart . Un argument de tip BindingResult trebuie declarat ime-
diat după validarea argumentului unei metode.

3.6 Tehnologiile View

Utilizarea tehnologiilor de view în Spring MVC este flexibilă, programatorul având liber-
tatea de a schimba tehnologia pe care o folose ște în orice moment al dezvoltării aplicației, fiind
nevoie doar de o modificare a configura ției.

Cîrciumaru Alex Ionu ț SPRING MVC
27
3.6.1 JSP și JSTL

Spring Framework con ține o integrare inc orporată pentru utilizarea Spring MVC cu JSP
(Java Server Page) și JSTL (Java Standard Tag Library).
Pentru dezvoltarea cu JSP -uri, se poate declara un InternalResourceViewResolver
sau un ResourceBundleViewResolver .
ResourceBundleViewResolver se bazează pe fișierul de proprietăți ca să definească nu-
mele view -urilor transmise către o clasă sau un URL. Cu ResourceBundleViewResolver se
pot combina diferite tipuri de view -uri folosind un singur manipulator, precum este exemplificat
în exemplul următor :
<!– the ResourceBundleViewResolver –>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.ResourceBundleVi-
ewResolver" >
<property name="basename" value="views"/>
</bean>

InternalResourceViewResolver este folosit de obicei pentru fi șiere de tip JSP. Ca o
practică bună, se recomandă plasarea fi șierelor JSP într -un director care se află în ‘WEB -INF’, ca
să fie restric ționat accesul clienților.
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceVi-
ewResolver" >
<property name="viewClass" value="org.springframe-
work.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp"/>
</bean>

Cîrciumaru Alex Ionu ț SPRING MVC
28
Atunci când se utilizează Java Standard Tag Library trebuie folosită o clasă specială,
JstlView , JSTL necesitând pregătire precedentă implementărilor caracteristicilor precum inter-
naționalizarea.
Pentru a facilita dezvoltarea utilizând paginile JSP în combina ție cu caracteristicile Data
Binding, Spring furnizează câteva tag -uri care u șurează lucrurile. Librăria spring.tld (TLD –
Tag Library Descriptor) este inclusă în pachetul spring -webmvc.jar.
Cu versiunea 2.0, Spring a creat un set de tag -uri pentru gestionarea elementelor formelor în
timpul utilizării JSP și Spring Web MVC, numit Spring Form Tag Library. Fiecare tag furnizează
suport pentru un set de atribute corespondente tag -urilor din HTML, făcând tag -urile familiare și
intuitive la implem entare.
Spre deosebire de alte librării, librăria Spring Form este integrată cu Spring Web MVC,
oferind acces tag -urilor la obiectul comandă și la date. Pentru a utiliza Spring Tag Form Library,
trebuie adăugată la începutul paginii JSP următoarea secven ță:
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form "
%>

După cum se poate vedea în exemplul anterior, “form” reprezintă prefixul numelui tag -ului
care se dore ște a fi utilizat. Acest tag interpretează tag -ul ‘form’ din HTML. Acesta pune obiectul
comandă în PageContext pentru a permite obiectului comandă să fie accesat de tag -urile interioare.
Toate celelalt e tag -uri din această librărie sunt tag -uri care extind tag -ul form.
Exemplul următor se adresează unui obiect numit Utilizator . Este un bean Java care este
caracterizat prin proprietă ți precum firstName și lastName. Acest bean poate fi utilizat ca fiind un
model, care ar fi gestionat de către un controller, care ar returna un fi șier form.jsp. Fișierul
form.jsp ar putea arăta în felul următor:
<form:form>
<table>
<tr>
<td>First Name: </td>
<td><form:input path="firstName" /></td>
</tr>

Cîrciumaru Alex Ionu ț SPRING MVC
29
<tr>
<td>Last Name: </td>
<td><form:input path="lastName" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form:form>

Valorile câmpurilor firstName și lastName sunt preluate de la obiectul de comandă care este
plasat în PageContext de către Page Controller. Echivalentul exemplului precedent scris folosind
doar HTML ar fi :
<form method="POST">
<table>
<tr>
<td>First Name: </td>
<td><input
name="firstName" type="text" value="Harry"/></td>
</tr>
<tr>
<td>Last Name: </td>
<td><input
name="lastName" type="text" value="Potter" /></td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="Save Changes" />
</td>
</tr>
</table>
</form>

Cîrciumaru Alex Ionu ț SPRING JPA
30

4. SPRING JPA

4.1 Spring Data

Spring JPA (Java Persistence API) face parte din Spring Data. Spring Data reprezintă unul
din modulele de bază din Spring, sarcina acestuia fiind aceea de a furniza un mod familiar și con-
sistent de a accesa datele stocate.
Spring Data oferă o modalitate simplă de a utiliza tehnologiile de accesare a datelor dintr -o
bază de date, rela țională sau nu, sau a serviciilor cloud. Spring Data conține mai multe tehnologii
folosite pentru diverse tipuri de baze de date, precum : JPA, JDBC și REST.
Caracteristici ale Spring Data :
 Abstractizări personalizate ale distribuirii obiectelor.
 Crearea de interogări dinamice pe numele metodelor aflate în repository.
 Proprie tățile de bază furnizate de către implementările claselor de bază .
 Suport pentru controlul transparent.
 Posibilitatea integrării unui cod al repository -ului personalizat.
 Integrarea simplă utilizând JavaConfig și namespace -urile XML.
 Integrare avansată cu Spring MVC.
Câteva module principale care apar țin Spring Data sunt :
 Spring Data JDBC – oferă un repository suport pentru JDBC.
 Spring JPA – oferă un repository suport pentru integrarea cu JPA.
 Spring Data MongoDB – oferă suport și documentație Spring pentru baza de date
MongoDB.
 Spring Data REST – implementează serviciile REST.

Cîrciumaru Alex Ionu ț SPRING JPA
31
4.2 ORM Data Access

Framework -ul Spring oferă integrare cu Java Persistence API și Hibernate, acestea fiind
utilizate la gestionarea resurselor, la implementările Data Access O bject (DAO) și la strategiile
tranzac țiilor. Spre exemplu, Hibernate conține o clasă suport cu caracteristici similare ale IoC. Se
pot configura toate caracteristicile necesare pentru distribuirea instrumentelor OR (object relatio-
nal) utilizând Dependency Injection. Ele pot participa în administrarea datelor și tranzacțiilor ges-
tionate de către Spring, venind în completarea tranzac țiilor generice ale lui Spring și a ierarhiilor
DAO. DAO este stilul de integrare recomandat în aceste tipuri de aplica ții.
Spring adaugă îmbunătă țiri considerabile ORM -ului în dezvoltarea aplica țiilor care acce-
sează date. Se poate utiliza suportul ORM asemenea unei librării, deoarece totul este structurat ca
fiind un set de bean -uri Java reutilizabile. ORM în container -ul Spring IoC facilitează configurarea
și dezvoltarea.
Beneficiile aduse de utilizarea Spring Framework în crearea obiectelor de tip DAO sunt :
 Testarea mai u șoară – Abordarea Spring IoC u șurează schimbarea implementări-
lor și a locațiilor configurațiilor instanțelor de tip SessionFactory , DataSource
și a administratorilor de tranzac ții.
 Excep ții generale la accesarea datelor – Spring poate împacheta excep țiile venite
de la ORM și să le convertească din excepții neprevăzute într -o excep ție de tip
DataAccessException.
 Un mod general de a administra resursele – Contextele unei aplica ții Spring pot
manipula loca ția și configurația instanțelor de tip SessionFactory, EntityManager-
Factory și DataSource. Acest lucru ușurează gestionarea și modif icarea acestor va-
lori.
 Integrarea administrării tranzac țiilor – Codul ORM poate fi împachetat cu stilul
Aspect Oriented Programming (AOP) utilizând adnotarea @Transactional sau
configurând în mod explicit AOP în fi șierul de configurare XML.

Cîrciumaru Alex Ionu ț SPRING JPA
32
4.3 Spring Data JPA

Interfa ța centrală din JPA este Repository , aceasta preluând clasa de bază pentru a o ad-
ministra. Interfa ța Repository vine în ajutorul dezvoltatorului pentru a descoperi interfe țe care
o pot extinde pe aceasta. Interfa ța CrudRepository furnizează func ționalități CRUD (Create
Read Update Delete) a vansate entită ții care este administrate.
Interfa ța CrudRepository [5]:
public interface CrudRepository <T, ID extends Serializable >
extends Repository <T, ID> {

<S extends T> S save(S entity );

Optional <T> findById (ID primaryKey );

Iterable <T> findAll();

long count();

void delete(T entity );

boolean existsById (ID primaryKey );
}

Save – salvează entitatea primită ca și parametru. FindById – returnează entitatea identi-
ficată prin id -ul primit. findAll – returnează toate entită țile. Count – returnează numărul entită-
ților. Delete – elimină entitatea primită. ExistsById – verifică dacă există o entitate cu identi-
ficatorul respectiv.
PagingAndS ortingRepository reprezintă o abstractizare care adaugă metode adi ționale
celor din CrudRepository pentru a u șura accesul paginat al acestor entită ți.
Interfa ța PagingAndSortingRepository [5]:

Cîrciumaru Alex Ionu ț SPRING JPA
33
public interface PagingAndSortingRepository <T, ID extends Seriali-
zable> extends CrudRepository <T, ID> {

Iterable <T> findAll(Sort sort);

Page<T> findAll(Pageable pageable );
}

Spre exemplu, accesarea celei de a doua pagini, care con ține 20 de elemente, se poate efectua
în mod următor :
PagingAndSortingRepository <User, Long> repository = // … get access
to a bean
Page<User> users = repository .findAll(PageRequest .of(1, 20));

4.4 Metode de interogare

Func ționalitățile standard CRUD din Repository de obicei con țin interogări care stau la
baza administrării unei baze de date. Cu Spring Data JPA, declararea acestor interogări se reali-
zează în 4 pa și:
1. Declararea unei interfe țe care extinde Repository , sau una din interfe țele derivate
din aceasta, tipul clasei de bază și tipul identificatorului. (query methods)
interface PersonRepository extends Repository <Person, Long> {}
2. Declararea unor metode care să efectueze interogări în interfa ța creată.
interface PersonRepository extends Repository <Person, Long> {
List<Person> findByLastname (String lastname );
}

Cîrciumaru Alex Ionu ț SPRING JPA
34
3. Crearea instan țelor de tip Repository , fie cu JavaConfig sau XML.
a. Pentru configurarea Java, se poate crea o clasă asemănătoare următoarei :
import org.springframework .data.jpa.repository .config.EnableJpa-
Repositories ;

@EnableJpaRepositories
class Config {}

b. Prin configurare XML, care va fi exemplificată mai târziu în acest capitol.

4. Injectarea instan ței repository -ului și utilizarea acesteia.
class SomeClient {

private final PersonRepository repository ;

SomeClient (PersonRepository repository ) {
this.repository = repository ;
}

void doSomething () {
List<Person> persons = repository .findByLastname ("Matthews" );
}
}

4.4.1 Definirea interfe țelor de tip Repository

Primul pas în definirea interfe țelor de tip Repository îl reprezintă declara rea unei interfa țe
care trebuie să extindă interfa ța Repository și să fie legată de clasa de bază. Pentru accesarea
metodelor CRUD trebuie extinsă interfa ța CrudRepository .

Cîrciumaru Alex Ionu ț SPRING JPA
35
De obicei, interfa ța creată va extinde Repository , CrudRepository sau Pa-
gingAndSortingRepository . Spring Data JPA permite de asemenea dezvoltatoru lui, în cazul
în care nu dore ște să implementeze una din interfețele enumerate anterior, să -și definească propria
interfa ță repository, adnotând -o cu @RepositoryDefinition . CrudRepository furnizează
un set complet de metode care pot fi utilizate la manipul area entită ților.
Utilizarea unui modul unic din Spring Data simplifică lucrurile, deoarece toate interfe țele
repository sunt trimise către modulul respectiv.

4.4.2 Definirea metodelor care efectuează interogările

Proxy -ul are 2 op țiuni pentru definire a unei interogări din numele unei metode :
 Prin derivarea interogării direct din numele metodei.
 Prin definirea manuală a interogării.
Mecanismul de creare al interogărilor din Spring Data este util la scrierea interogărilor
bazate pe constrângeri. Mecanismul separă prefixele find…By , read…By , query…By ,
count…By și get…By de metodă și începe să proceseze ce a rămas. Partea de început poate
să con țină alte constrângeri, precum Distinct . Mai jos se pot observa câteva exemple de intero-
gări [5]:
interface PersonRepository extends Repository <User, Long> {

List<Person> findByEmailAddressAndLastname (EmailAddress emai-
lAddress , String lastname );

// Enables the distinct flag for the query
List<Person>
findDistinctPeopleByLastnameOrFirstname (String lastname , String
firstname );
List<Person>
findPeopleDistinctByLastnameOrFirstname (String lastname , String
firstname );

Cîrciumaru Alex Ionu ț SPRING JPA
36
// Enabling ignoring case for an individual property
List<Person> findByLastnameIgnoreCase (String lastname );
// Enabling ignoring case for all suitable properties
List<Person>
findByLastnameAndFirstnameAllIgnoreCase (String lastname , String
firstname );

// Enabling static ORDER BY for a query
List<Person>
findByLastnameOrderByFirstnameAsc (String lastname );
List<Person>
findByLastnameOrderByFirstnameDesc (String lastname );
}

Rezultatul procesării metodei depinde de gestionarul de persisten ță căruia i -a fost adresată
interogarea. Totu și, există câteva caracteristici comune :
 Expresiile con țin de obicei o traversare a propri etăților combinate cu operatori care
pot fi concatenate. Expresiile pot fi combinate folosind operatori precum AND și
OR. De asemenea, se pot utiliza operatori precum Between , LessThan , GreaterThan
și Like.
 Procesatorul metodei permite utilizarea unui IgnoreCase pentru proprietă țile indi-
viduale (spre exemplu, findByLastNameIgnoreCase(…) ) sau pentru toate
proprietă țile ale căror tip suportă IgnoreCase (de obicei instan țele de tip șir de ca-
ractere – exemplu : findByLastNameAndFirstNameAllIgnoreCase(…) ).
 Se poate aplica o ordonare statică prin ata șarea secvenței OrderBy care furnizează
o directivă de sortare (ASC sau DESC) a unei proprietă ți specificate.
Expresiile care con țin proprietăți pot face referire la o singură proprietate. În momentul
creării interogării, trebuie verificat dacă proprietatea transmisă face parte din proprietă țile clasei
de bază.
List<Person> findByAddressZipCode (ZipCode zipCode);

Cîrciumaru Alex Ionu ț SPRING JPA
37
Exemplul precedent exemplifică accesarea proprietă ții ZipCode, proprietate care face parte
din Address, care la rândul ei este o proprietate a entită ții Person (echivalent cu x.address.zip-
Code). Ca să nu existe ambiguită ți, spre exemplu entitatea Person ar putea avea și o proprietate
ZipCode, se poate folosi simbolul _ în interiorul numelui metodei pentru a defini manual traver-
sarea.
List<Person> findByAddress_ZipCode (ZipCode zipCode);

Pe lângă gestionarea parametrilor unei interogări cum a fost exemplificat anterior, infras-
tructura permite și utilizarea unor tipuri speciale, precum Pageable and Sort , pentru a aplica
paginări și sortări interogărilor în mod dinamic.
Page<User> findByLas tname(String lastname , Pageable pageable );

Slice<User> findByLastname (String lastname , Pageable pageable );

List<User> findByLastname (String lastname , Sort sort);

List<User> findByLastname (String lastname , Pageable pageable );

Prima metodă efectuează trimiterea unei instan țe de tip Pageable către interogare și rea-
lizează paginarea în mod dinamic a rezultatelor interogării. O instan ță de tip Page știe de numărul
total de elemente și de numărul disponibil de pagini.
Rezultatele acestor interogări pot fi limitate folosind cuvinte cheie precum fi rst sau top. Pe
lângă aceste cuvinte cheie, se poate adăuga o valoare numerică care să seteze numărul maxim de
elemente care poate fi returnat.
User findFirstByOrderByLastnameAsc ();

User findTopByOrderByAgeDesc ();

Page<User> queryFirst10ByLastname (String lastname , Pageable pagea-
ble);

Cîrciumaru Alex Ionu ț SPRING JPA
38

Slice<User> findTop3ByLastname (String lastname , Pageable pagea-
ble);

List<User> findFirst10ByLastname (String lastname , Sort sort);

List<User> findTop10ByLastname (String lastname , Pageable pagea-
ble);

4.4.3 Crearea instan țelor de tip repository

Configurare XML

Fiecare modul din Spring Data con ține un element numit repositories care permite de-
finirea unui pachet de bază pe care Spring să -l scaneze în căutarea interfe țelor de tip Repository .
<?xml version= "1.0" encoding= "UTF-8"?>
<beans:beans
xmlns:beans= "http://www.springframework.org/schema/beans "
xmlns:xsi= "http://www.w3.org/2001/XMLSchema -instance "
xmlns="http://www.springframework.org/schema/data/jpa "
xsi:schemaLocation= "http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa.xsd ">

<repositories base-package= "com.acme.repositories "/>

</beans:beans>

Cîrciumaru Alex Ionu ț SPRING JPA
39
Java Config

Infrastructura unui repository poate de asemenea să fie declan șată utilizând adnotarea @Ena-
ble${Store}Repositories pe o clasă Java.
@Configuration
@EnableJpaRepositories ("com.acme.repositories" )
class ApplicationConfiguration {

@Bean
EntityManagerFactory entityManagerFactory () {
// …
}
}

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manage r
40

5. APLICA ȚIE. Martial Arts Manager

Martial Arts Manager este o aplica ție web care permite gestionarea cluburilor afiliate unei
federa ții de arte marțiale. Această aplicație a fost creată cu scopul de a ușura administrarea struc-
turii interioare a unei federa ții de arte marțiale .
O federa ție de arte mar țiale este formată din mai multe cluburi, iar aceste cluburi la rândul
lor p ot avea mai mul ți sportivi afiliați. Există de asemenea în aplica ție și o sec țiune dedicată di-
verselor tipuri de evenimente , aceste evenimente fiind gestionate de către un administrator , iar un
sportiv afiliat unui club poate participa la unul din aceste evenimente.
Aplica ția a fost dezvoltată în mediul de dezvoltare Spring Tool Suite (STS), acesta fiind un
mediu de dezvoltare bazat pe structura mediului Eclipse și oferă un suport personalizat pentru
dezvoltarea aplica țiilor scrise în Spring.

5.1 Modulele aplica ției

În procesul de dezvoltare al acestei aplica ții au fost utilizate ur mătoarele module :
1. Modulul Spring MVC este folosit pentru separarea logicii aplica ției de ceea ce apar-
ține de interfața cu utilizatorul și pentru a oferi caracteristici de integrare orientate
web.
2. Modulul JPA sau Java Persistence API este folosit pentru acc esarea și modificarea
informa țiilor din baza de date, legate de cluburi, sportivi, etc.
3. Modulul Spring Security este folosit pentru aplicarea constrângerilor de securitate
și pentru implementarea procesului de autentificare.
4. Tehnologia JSP este folosită pe ntru crearea paginilor corespunzătoare fiecărei sec-
țiuni a aplica ției. Personalizarea și stilizarea paginilor a fost realizată utilizând teh-
nologia Bootstrap 4.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
41
5. MySQL este baza de date utilizată pentru stocarea tuturor informa țiilor din cadrul
aplica ției.
6. Apache Tomcat reprezintă server -ul web utilizat. Tomcat implementează specifi-
cațiile Java Servlet și Java Server Pages(JSP) și furnizează un mediu HTTP pur
Java.
7. Maven este tehnologia utilizată pentru descrierea structurii aplica ției și pentru ges-
tionarea dependen țelor acesteia.

Aplica ția este asemenea bazată pe mai multe șabloane de proiectare, două dintre ele fiind
Model View Controller (MVC), care a fost descris într -un capitol anterior, și Data Transfer Object
(DTO).
Data Transfer Object (DTO) este un container de date folosit la transferarea informa țiilor
între diferitele nivele ale aplica ției. Aceste are ca unic scop doar să transfere date și nu conține
logică de tip business.

5.2 Func ționalitățile aplicației

Aplica ția poate fi folosită de un vizitator, de un sportiv care apar ține unui club sau de un
administrator.
Un vizitator, adică o persoană care nu este administrator și nu reprezintă nici un sportiv
afiliat unui club, îi sunt permise următoarele drepturi :
 Poate să vadă detal ii despre cluburile afiliate federa ției.
 Poate să vadă membrii care apar țin unui anumit club.
 Poate să vadă performan țele unui sportiv dorit.
 Poate să vadă o listă cu diversele evenimente care urmează să se desfă șoare și să
vadă detalii despre acestea.
 Poate să vadă tipurile de grade existente în federa ție.
 Poate să caute prin listele de cluburi, sportivi sau evenimente și poate să -și sorteze
rezultatele căutării.
Drepturile unui vizitator sunt reprezentate în următoarea diagramă Use Case.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
42

Figură 6 – Drepturile unui vizitator

Un sportiv care apar ține unui club, pe lângă ceea ce poate face un vizitator oarecare, poate
de asemenea :
 Să se autentifice cu datele personale salvate în baza de date.
 Să-și editeze detaliile personale precu m nume, vârstă, email, etc.
 Să se înscrie la unul din evenimentele disponibile.

Diagrama Use Case corespunzătoare unui sportiv este :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
43

Figură 7 – Drepturile unui sportiv

Administratorul reprezintă punctul principal al aplica ției, acesta având acces la toate resur-
sele aplica ției și drepturi depline asupra tuturor funcționalităților puse la dispoziție de către apli-
cație:
 Adăugare, modificare și ștergere a cluburilor afiliate federației.
 Gestionarea evenimentelor.
 Administ rarea sportivilor afilia ți unui club.
 Gestionarea performan țelor unui sportiv.
 Administrarea tipurilor de grade existente în federa ție. (Un sportiv poate deține spre
exemplu gradul “Centur ă maro 1 Kyu”, dar tipurile gradelor și culorile centurilor
pot vari a de la un club la altul)

Drepturile administratorului sunt reprezentate în diagrama următoare :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
44

Figură 8 – Drepturile unui administrator

Administratorul poate realiza toate aceste opera ții doar în urma autentificării. Acesta ac ce-
sează pagina de autentificare, iar dacă datele sunt valide, acesta va fi autentificat cu succes și va fi
redirec ționat către pagina principală.
Acela și lucru este valabil și pentru un sportiv. Acțiunile de editare a detaliilor personale și
de participare la un eveniment nu pot fi realizate dacă sportivul nu este autentificat.

5.3 Structura aplica ției

Aplica ția este structurată și abstractizată pe mai multe nivele, abstractizarea pe mai multe
nivele oferind un control mai amplu al fluxului datelor în aplica ție și posibilitatea de a modifica
un nivel al aplica ției fără să fie nevoie ca să fie modificate și restul nivelelor.
Clasele scrise în limbajul Java sunt grupate în pachete, acestea fiind :
 Controller – Acest pachet con ține toate clasele de tip Controller care se ocupă de
gestionarea cererilor primite de la server.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
45
 Controller.Utils – Este un pachet dedicat claselor ajutătoare celor din pachetul
Controller.
 DTO – Reprezintă pachetul care este alcătuit d in clasele care sunt destinate tran-
sferului de date (Data Transfer Object) dintre baza de date și aplicație.
 Exception – Acest pachet con ține excepțiile care pot fi “aruncate” pe parcursul
execu ției programului. ( DuplicateRecordException , RecordNotFoundEx-
ception )
 Model – Este un pachet dedicat claselor de tip Business ale aplica ției, acesta con-
ținând entitățile care urmează să fie salvate în baza de date.
 Model.Utils – Este un pachet dedicat claselor ajutătoare celor din pachetul Model,
conținând enumerații precum DegreeType .
 Repository – Acest pachet con ține interfețele care se ocupă de operațiile aplicate
bazei de date.
 Service – Reprezintă pachetul care con ține clasele ce implementează metodele din
interfe țele din pachetul Repository și care sunt utilizat e în pachetul Controller .

Dacă, la un moment dat, se dore ște schimbarea bazei de date utilizată pentru această apli-
cație, acest lucru se poate realiza foarte ușor prin simpla modificare a interfețelor din pachetul
Repository, nefiind nevoie de schimbări l a celelalte nivele ale aplica ției. De asemenea, dacă se
dorește modificarea tehnologiei utilizate pentru crearea interfeței cu utilizatorul, acest lucru se
poate efectua fără a fi nevoie de a modifica logica aplica ției.
În pachetul src/main/resources se af lă fișierele de proprietăți și cele de configurare ale
aplica ției, precum jpaContext.xml , care con ține detaliile legate de motorul bazei de date , de admi-
nistratorul tranzac țiilor și de clasele ce trebuie să fie explorate.
Directorul WEB -INF con ține:
 Fișierul web.xml , fișier în care este implementată configurarea entităților de tip
Servlet.
 Fișierul dispatcher -servlet.xml , fișier în care este configurată modalitatea de explo-
rarea a fi șierelor necesară detectării resurselor precum fișiere CSS sau JavaSc ript.
 Directorul JSP. În acest director se află toate fi șierele cu extensia .jsp, acestea re-
prezentând paginile care pot fi accesate în această aplica ție.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
46

Structura fi șierelor poate fi vizualizată în figura următoare :

Figură 9 – Structura aplica ției

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
47
5.3.1 Proiectarea bazei de date

Baza de date care a fost folosită în dezvoltarea acestei aplica ții conține următoarele tabele :
 Karateka
 Club
 Degree
 Event
 Karateka_Degree
 Karateka_Event
Tabela Karateka are rolul de a stoca datele unui sportiv. Aceste date sunt nume le sporti-
vului , prenume le acestuia , vârst a, anul în care sportivul s -a apucat de practicat, email -ul, pa-
rola, un câmp în care este specificat id -ul clubului căruia îi aparține sportivul și un câmp care
să specifice dacă sportivul respectiv este, sau nu, antrenor .
Tabela Club este formată din trei coloane : numele clubului, adresa acestuia și data în care
a fost înfiin țat.
Tabela Degree conține trei coloane, și anume culoarea centurii, tipul gradului și rangul
acestuia.
Tabela Event are rolul de a stoca datele unui eveniment. Aceste date sunt numele eveni-
mentului, tipul acestuia, loca ția, capacitatea și data în care va fi desfășurat evenimentul respec-
tiv.
Tabela Karateka_Degree are rolul de a stoca datele legate de gradul ob ținut de un anumit
sportiv. Datele acestea sunt id -ul sportivului care a ob ținut gradul, id -ul gradului pe care l -a
obținut, id -ul clubului la care este înregistrat respectivul sportiv, id -ul antrenorului care i -a
acordat acel grad și data obț inerii acestuia.
Tabela Karateka_Event reține id -ul sportivului și id-ul evenimentului la care acesta par-
ticipă.
Diagrama bazei de date și relațiile dintre tabele este reprezentată în imaginea următoare.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
48

Figură 10 – Schema bazei de date

După cum se poate observa în imagine, rela țiile dintre tabele sunt următoarele :
 Relația dintre Club și Karateka este de tipul one to manny și reprezintă faptul
că un club are asociat mai mul ți sportivi, iar un sportiv poate aparține doar unui
singur club.
 Relația dintre Event și Karateka este de tipul manny to manny și reprezintă faptul
că un eveniment poate con ține mai mulți sportivi, dar și faptul că un sportiv poate
participa la mai multe evenimente. Pentru o administrare mai u șoară a fost f olosită
o tabelă de legătură, numită Karateka_Event.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
49
 Relația dintre Degree și Karateka este tot de tipul manny to manny și reprezintă
faptul că un grad poate să fie de ținut de mai mulți sportivi, dar și faptul că un sportiv
poate să de țină mai multe grade. În acest caz a fost utilizată tabela Karateka_Degree
ca și tabelă de legătură.

5.3.2 Procesul de autentificare

Pentru ca cineva să se poate autentifica cu succes în cadrul aplica ției, utilizatorul trebuie
să introducă datele de autentificare corespunzăt oare acestuia, adică email -ul și parola care îi sunt
asociate. În figura următoare se poate observa pagina de autentificare unde utilizatorul î și introduce
detaliile de acces.

Figură 11 – Pagina de login

În cazul în care datele introduse de către utilizator nu sunt corecte, i se afi șează un mesaj
de eroare.
Pentru dezvoltarea acestei pagini de autentificare s -au folosit tehnologiile JSP, HTML și
Bootstrap, iar codul aferent paginii de autentificare prezentată anterior este :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
50
<form class="form-horizontal" role="form" method="POST" action="/lo-
gin">
<div class="row">
<div class="col-md-6">
<h2>Please Login </h2>
<hr>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="form-group has -danger">
<label class="sr-only" for="email">E-Mail Ad-
dress</label>
<div class="input-group mb -2 mr-sm-2 mb-sm-0">
<div class="input-group-addon">
<i class="fa fa-at"></i>
</div>
<input type="text" name="email" class="form-con-
trol" id="email" placeholder= "Email" required autofocus />
</div>
</div>
</div>
<div class="row">
<div class="col-md-3"></div>
<div class="col-md-6">
<div class="from-group">
<label class="sr-only" for="password" >Password
</label>
<div class="input-group mb -2 mr-sm-2 mb-sm-0">
<div class="input-group-addon">
<i class="fa fa-key"></i>
</div>
<input type="password" id="password" class="form-
control" placeholder= "Password" required />
</div>
</div>
</div>

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
51
</div>
<div class="row" style="padding -top: 1rem" >
<div class="col-md-3"></div>
<div class="col-md-6">
<button type="submit" class="btn btn -success" >
<i class="fa fa-sign-in"></i> Login
</button>
</div>
</div>
</form>

5.4 Modul de func ționare al aplicației

Un vizitator obi șnuit poate vedea detalii despre cluburi, sportivi, grade și evenimente. O
astfel de pagină care afi șează astfel de detalii arată în modul următor.

Figură 12 – Pagina de vizualizare a cluburilor

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
52
Vizitatorul poate vedea detaliile despre cluburi și poate vedea membrii care aparțin doar
unui anumit club, prin apăsarea pe link -ul View aflat pe coloana Members. În urma accesării acelui
link, vizitatorul va fi red irecționat pe o pagină care arată în felul următor.

Figură 13 – Pagina de vizualizare a sportivilor

Pentru o vizualizare mai eficientă, acesta poate efectua o căutare prin rezultate afi șate, pu-
tând să -și selecteze criteriile du pă care să fie efectuată această căutare. În josul paginii este afi șat
numărul de rezultate care au fost găsite, numărul total de pagini și numărul paginii curente. De
asemenea, există două link -uri, Older și Newer , care redirec ționează utilizatorul pe pag ina ante-
rioară, respectiv pe cea următoare. În cazul în care nu există o pagină precedentă, sau o pagină
nouă, cele două link -uri sunt dezactivate.
Un exemplu de sortare a rezultatelor poate fi acela în care vizitatorul dore ște să vadă toți
sportivii de la clubul C.S. Dinamo Zen Do Caracal, în ordine descrescătoare vârstei, și afișând doar
câte cinci rezultate pe pagină.
Rezultatul ar arăta în felul următor :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
53

Figură 14 – Pagina cu sportivii de la un club specificat

Fiind afi șate doar câte cinci rezultate pe pagină, fiind șase în total, în urma apăsării pe link –
ul de Newer, a doua și ultima pagină va conține un singur rezultat, și anume :

Figură 15 – Pagina cu sportivii răma și în urma paginării rezultatelor

Pentru a se putea realiza această filtrare a rezultatelor pe fiecare pagină a fost utilizată clasa
SearchDTO. Un astfel de obiect con ține următoarele detalii : un șir de caractere care reține datele
introduse de către utilizator în căsu ța de căutare , numărul de elemente care să fie afi șate pe pagină
(valoarea implicită este aceea de zece elemente pe pagină), numărul paginii curente, direc ția de
sortare (valoarea implicită a acesteia este “ASC”, adică ascendentă) și atributul pe baza căruia se
va realiza sortarea (valoarea implicită este aceea de “id”).
Metoda getPageRequest , care prime ște ca și parametru un obiect de tipul SearchDTO,
metodă care apar ține clasei PaginationUtils , procesează informa țiile conținute de către obi-
ectul de tip SearchDTO și returnează un obiect de tipul PageRequest care permite paginarea
rezultatelor.

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
54
Metoda getPageRequest arată în modul următor :
public static PageRequest getPageRequest( SearchDTO searchDTO) {
PageRequest pageRequest = null;
if (searchDTO != null) {
int pageNumber = searchDTO. getPageNumber ();
int perPage = searchDTO. getPerPage ();
String sortBy = searchDTO. getSortBy ();
String sortDirection = searchDTO. getSortDirec-
tion();
Sort sort = null;

if (pageNumber <= 0) {
pageNumber = 0;
} else {
pageNumber = pageNumber – 1;
}

if (perPage < 1) {
perPage = DEFAULT_PER_PAGE ;
}
if (!StringUtils .hasText(sortBy)) {
sortBy = "id";
}
if ("ASC".equalsIgnoreCase (sortDirection)) {
sort = new Sort(Direction .ASC, sortBy);
} else if ("DESC". equalsIgnoreCase (sortDirection))
{
sort = new Sort(Direction .DESC, sortBy);
} else {
sort = new Sort(Direction .DESC, sortBy);
}

pageRequest = PageRequest .of(pageNumber, perPage,
sort);
} else {
pageRequest = PageRequest .of(0, DEFAULT_PER_PAGE );

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
55
}

return pageRequest;
}
}
Căutarea unui anume sportiv în baza de date se realizează cu ajutorul acestei metode ce se
află în interfa ța KaratekaRepository :
Page<Karateka > findByFirstNameIgnoreCaseContainingOrLastNameIgno-
reCaseContainingOrEmailContaining(
Pageable pageRequest, String query, String query2, String query3);

Interfa ța KaratekaRepository extinde interfața JpaRepository, cea din urmă oferind suport
pentru opera țiile ce se pot efectua pe baza de date , acest lucru fiind explicat mai detaliat în capitolul
dedicat Spring JPA . Pentru opera țiile comune, precum cele CRUD, nu este nevoie de o implemen-
tare concretă . Spre exemplu, pentru opera ția de adăugare în baze de date, este suficient să avem o
metodă în clasa KaratekaService care să arate în felul următor :
@Override
public Karateka addKarateka( Karateka karateka) {
return karatekaRepository.save(karateka);
}
}
Pentru o opera ție mai complicată, precum cea descrisă anterior, referitoare la căutarea unui
sportiv în baza de date, JPA oferă o modalitate mult mai u șoară de a satisface această dorință. Nu
este nevoie de o interogare clasică tip Standard Query Language (SQL), JPA realizând o interpre-
tare a numelui metodei declarate în interfa ță și transformând -o într -o interogare SQL, astfel că
metoda findByFirstNameIgnoreCaseContainingOrLastName … o să returneze un obiect de tip
Page care o să con țină toate entitățile din baza de date care con țin șirul de caractere introdus de
către utilizator.
Un vizitator poate de asemenea să vadă performan țele unui sportiv, accesând link -ul View
aflat în coloana Historic . Pagina care con ține performanțele unui sportiv arată în modul următor :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
56

Figură 16 – Pagina de administrare a istoricului unui sportiv

Această pagina con ține detaliile legate de gradul obținut de către sportivul respectiv, cu-
loarea centurii ob ținute, data la care a obținut gradul, club ul la care a fost afiliat în timpul acordării
gradului și antrenorul care a acordat gradul.
Un sportiv înregistrat la un club, în urma autentificării cu succes, poate accesa o pagina
pentru a -și edita detaliile personale. Pagina arată astfel :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
57

Figură 17 – Pagina de editare a detaliilor sportivului

Administrat orul este persoana care are drepturi totale asupra aplica ției. Acesta poate gestiona
sportivii, cluburile și evenimentele din cadrul federației , el având dreptul d e a adăuga, modifica
sau șterge entitățile respective.
Spre exemplu, administratorul poate adăuga un eveniment nou. Când acesta apăsă pe butonul
de “Add Event” este redirec ționat către o pagină unde poate specifica toate detaliile evenimentului
pe care do rește să -l adauge. Administratorul trebuie să specifice numele evenimentului, tipul aces-
tuia( un eveniment poate să fie de mai multe tipuri ; Seminar – este un eveniment unde sportivii se
adună pentru a acumula cuno ștințe și unde aceștia pot obține grade no i în urma sus ținerii unor
examene și probe , Competition – este un eveniment unde sportivii concurează unul împotriva al-
tuia în dorin ța de a se perfecționa și de a obține diverse premii, Demonstration – în cadrul unui
astfel de eveniment sportivii se organizează și execută în fața unui public diverse combinații de

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
58
tehnici), capaci tatea evenimentului( numărul de sportivi care poate participa la evenimentul res-
pectiv), loca ția unde se va desfășura evenimentul și data desfășurării acestuia.
Pagina de adăugare a unui eveniment nou este prezentată în figura următoare :

Figură 18 – Pagina de adăugare a unui eveniment

Un administrator poate să adauge de asemenea și noi sportivi și să specifice clubul de care
aparține sportivul respectiv. Această operație de adăugare trece totuși prin diverse verificări. Spre
exemplu, nu poate fi adăugat un sportiv cu un email deja existent în baza de date. Codul aferent
acestei verificări este prezentat în cele ce urmează.
try {
Karateka karateka = new Karateka ();
karateka. setLastName (karatekaDTO. getLastName ());
karateka. setFirstName (karatekaDTO. getFirstName ());
karateka. setAge(karatekaDTO. getAge());
karateka. setBeginningYear (karatekaDTO. getBeginnin-
gYear());
if (karateka. checkDifferenceBetweenAgeAndBeginningYear ())
{

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
59
result.rejectValue ("age", "input-error", "Years of
practice are bigger than karateka's age");
logger.error("Add karateka error : " + result. ge-
tAllErrors ());
return "add-karateka";
}
karateka. setEmail (karatekaDTO. getEmail ());
// Before save encode password.
karateka. setPassword (passwordEncoder. encode(kara-
tekaDTO. getPassword ()));
karateka. setTrainer (karatekaDTO. isTrainer ());
karateka. setClub(new Club(karatekaDTO. getClubId ()));
karatekaService. addKarateka (karateka);
catch (DuplicateRecordException e) {
result.rejectValue ("email", "duplicate", "Email
already used");
logger.error("Add karateka error : " + result. ge-
tAllErrors ());
return "add-karateka";
}

Parola introdusă și aferentă contului sportivului respectiv este criptată, aceasta nefiind vizi-
bilă în clar în baza de date. Pentru criptarea parolei s -a utilizat algoritmul de criptare Blowfish
(BCrypt Password Encoder).
De asemenea, o altă verificare care este efectuată în momentul opera ției de adăugar e a unui
sportiv nou este aceea de verificare a vârstei sportivului și a anului în care acesta s -a apucat de
practicat. Administratorului nu i se permite să adauge un sportiv cu vârsta de doisprezece ani, dar
în urma introducerii anului în care s -a apucat de practicat să rezulte că sportivul practică acest
sport de optsprezece ani.
Pentru ca acest lucru să fie evitat, clasa Karateka con ține o metodă care să realizeze această
verificare, numită checkDifferenceBetweenAgeAndBeginningYear , metodă care arată as tfel:
//Checks if the years of practice corresponds with karateka's age.
public boolean checkDifferenceBetweenAgeAndBeginningYear() {

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
60

if (Calendar .getInstance ().get(Calendar .YEAR) – getBeginnin-
gYear() < age – 5) {
return false;
}
return true;
}

Metoda returnează “false” dacă, în urma introducerii anului în care sportivul s -a apucat de
practicat, rezultă că sportivul s -a apucat de practicat de la o vârstă mai mică de cinci ani, asumând
că aceasta ar fi vârstă minimă pentru a începe practicarea a cestui sport. Metoda returnează “true”
în cazul în care datele sunt validate și sportivul este adăugat cu succes în baza de date.
Gradele ce pot fi ob ținute de sportivi sunt formate dintr -un rang, un tip al gradului (Kyu
sau Dan) și din culoarea centurii c orespunzătoare gradului. În general există un standard al acestor
grade. Spre exemplu, gradul “1 Kyu ” reprezintă în cele mai multe cazuri centura de culoare maro.
Totu și, în anumite locuri aceste standarde pot fi modificate, gradul “1 Kyu ” putând să reprez inte
centura de culoare albastră spre exemplu.
Cu to ți acești factori luați în considerare, aplicația a fost dezvoltată în așa fel încât admi-
nistratorul să poată adăuga grade asemănătoare, fără a exista restric ții sau grade prestabilite, lucru
care ar fi l imitat posibilită țile acordării gradelor. Atunci când administratorul adaugă un grad nou,
acestuia i se oferă libertatea de a p utea alege ce rang dore ște și ce culoare dorește pentru centura
asociată gradului respectiv.
Să presupunem următorul caz drept e xemplu : un sportiv ob ține la clubul C.S. Dinamo Zen
Do Caracal gradul “1 Kyu Centură Maro ”, dar dup ă este nevoit să plece la clubul Farul, club unde
gradul 1 Kyu are asociată ca și centură pe cea de culoare neagră, nu pe cea de culoare maro. Dacă
sportivul obține la noul club gradul respectiv, administratorul poate adăuga noul grad în istoricul
sportivului respectiv, istoric care, în urma modificărilor, ar arăta astfel :

Cîrciumaru Alex Ionu ț APLICA ȚIE. Martial Arts Manager
61

Figură 19 – Administrarea realizărilor unui sportiv

Cîrciumaru Alex Ionu ț CONCLUZII
62

6. CONCLUZII

Spring este un framework în continuă dezvoltare, în prezent ajungând la versiunea cu nu-
mărul 5, și care pune la dispozi ție dezvoltatoril or o gamă variată de instrumente și module ce pot
fi utilizate în dezvoltarea aplica țiilor Java enterprise.
Prin intermediul acestei lucrări de licen ță am scos în evidență modul de dezvoltare al unei
aplica ții web scrisă în limbajul Java și avantajele pe c are le aduce utilizarea framework -ului Spring ,
configurând aplica ția cu fișiere XML. Rolul acestui framework este acela de a oferi suport dezvol-
tatorului și de a ușura pe cât de mult posibil efortul depus de acesta în procesul de dezvoltare al
aplica ției. Utilizând acest framework, dezvoltatorul nu este nevoit să -și facă griji legate de crearea
obiectelor sau de instan țierea acestora spre exemplu , lucrurile acestea fiind făcute de către contai-
ner-ul IoC.
Câteva a vantaje ale utilizării acestui framework sunt următoarele :
 Flexibilitatea. Dezvoltatorul poate să modifice păr ți ale aplicației fără ca celelalte
nivele să fie afectate.
 Integrare a ușoară cu alte tehnologii.
 Suportă configurare atât XML, cât și configurare scrisă în cod Java.
 Facilitează bunele practici de programare, precum utilizarea interfe țelor în detri-
mentul claselor.
 Suport consistent pentru framework -ul JDBC, îmbunătă țind productivitatea și re-
ducând din numărul de erori.
 Furnizează un framework puternic și flexibil prin intermediul căruia se pot dezvolta
aplica ții web complexe.
Dat fiind faptul că acest framework se află într -o ascensiune continuă, au fost implementate
și îmbunătățite module precum Spring JPA, dezvoltatorul nefiind nevoit să scrie o interogare tip
Standard Query Language (S QL) pentru a realiza o opera ție pe baza de date, acea interogare fiind

Cîrciumaru Alex Ionu ț CONCLUZII
63
procesată automat de către Spring care transform ă numele metodei într -o interogare SQL și pro-
cesează rezultatul acestei interogări .
În concluzie, u tilizarea acestui framework în cadrul aplica țiilor Java aduce niște avantaje
considerabile și o varietate de mecanisme create pentru a oferi suport dezvoltatorilor .

Cîrciumaru Alex Ionuț Bibliografie
64

Bibliografie
1. Bretet. (2016). Spring MVC Cookbook. Birmingham B3 2PB, UK: Packt Publishing Ltd.
2. Cosmina, H. S. (2017). Pro Spring 5 (ed. 5). Apress.
3. Deinum, R. L. (2017). Spring 5 Recipes (ed. 4). Apress.
4. Fisher, M. (2016). Spring Persistence with Hibernate (ed. 2). Apress.
5. Gierke. Darimont, S. P . (2019). Spring Data JPA . Preluat pe 06 17, 2019, de pe
https://docs.spring.io/spring -data/jpa/docs/current/reference/html/#specifications
6. Hibernate. ( 2019 ). Hibernate . Preluat pe 06 17, 2019, de pe
https://hibernate.org/orm/what -is-an-orm/
7. Johnson. (2002). Expert One -on-One J2EE Design and Development. Wrox.
8. Spring Company. ( 2019 ). Spring 5 Documentation. Preluat pe 06 16, 2019, de pe
https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring -framework -reference/
9. Spring Company. ( 2019 ). Spring Doc . Preluat pe 06 17, 2019, de pe
https://docs.spring.io/spring/docs/5.0.0.RC2/spring -framework -reference/overview.html
10. Walls. (2018). Spring in Action (ed. 5). Manning.
11. Wikipedia. ( 2019 ). MVC Design Pattern . Prel uat pe 06 17, 2019, de pe
https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller

Similar Posts