Professional Documents
Culture Documents
Deo Odgovora Za Usmeni
Deo Odgovora Za Usmeni
Spring Data
U JPA sa Spring Data: sa obzirom da su CRUD operacije iste nad svim
entitetima i da se samo razlikuju u imenu entiteta Spring Data modul
nudi mogućnost da se ovo pojednostavi. Ideja da Spring na osnovu
imena operacije prepozna šta treba da se uradi. Potrebno je da naš
interfejs nasledi klasu JpaRepository<T, I> da bi smo radili sa JPA. T
označava tip entiteta, a I je tip ključa u entitetu. Odgovarajuću
konfiguracionu klasu je potrebno anotirati sa @EnableJpaRepositories.
Time što nasleđuje JpaRepository kreirani interfejs automatski ima na
korišćenje metode: findAll() koji vraća List<T>, findOne(), count(),
delete(T), deleteAll(), save(T) i exists(I).
Spring Data dozvoljava da se definišu specifični metodi čija imena
zadovoljavaju određenu konvenciju i tad nema potrebe da ih
implementiramo. Primer: public Student findByBrojIndeksa(String
brojIndeksa) pa iako nema implementaciju ovaj metod, vraća studenta
sa zadatim brojem indeksa. Spring Data prepoznaje imena metode koje
imaju imena u skladu sa definisanim paternima i izvršava ih.
Imena metode se sastoje od glagola, subjekta, ključne reči BY i
predikata. Dozvoljeni glagoli su read, find, get i count. Subjekat je
opcionalan deo i ne utiče na parsiranje imena. Predikat je najzanimljiviji
deo i on definiše ograničenja nad upitom. Ograničenja su definisana
posebnim ključnim rečima: And, Or, Like, OrderBy, IgnoringCase,
Between, Null, Not, LessThanEqual, GreaterThanEqual. Jedan od
primera je public List<Student> findByImeOrPrezime(String i, String p)
znači ova metoda treba da vrati sve studente koji imaju ili takvo ime ili
takvo prezime, mogu i oba da važe.
Ispred definicije metoda može se definisati i specifičan upit koji ne
možemo da dobijemo kreiranjem odgovarajućeg imena. Potrebno je
samo iznad metoda definisati anotaciju @Query i u njoj odgovarajuću
select (select s from Student s where ..) naredbu kao string, bez ;.
Ukoliko neki upit ne može da se definiše kroz konvenciju imena ili kroz
query anotaciju, može se koristiti standardni način za izvršavanje upita
preko EntityManagera. Potrebno je kreirati klasu koja će imati sufiks
Impl, a početak imena je isti kao i interfejs koji nasleđuje JpaRepository
(sufiks Impl je default, ali se može kastomizovati). U kreiranoj klasi
implementiramo određeni metod koji smo definisali u interfejsu i na
ovaj način smo zadržali i mogućnosti JpaRepository klase plus dodali
nove metode. Definišemo interfejs u kome definišemo specifičan
metod, dodamo da Spring Data repozitorijum – novi interfejs sa
JpaRepository nasleđuje prethodno napravljeni interfejs i sad klasa
treba da se zove kao Spring Data repozitorijum sa sufiksom Impl i da
implementira prvi interfejs. Ta klasa treba da ima anotaciju repository, i
anotaciju gde koristimo objekat EntityManagera pa iznad da bude
PersistenceContext.
7. Filteri
Filteri su softverske komponente koje presreću zahteve klijenta ili
odgovore servera i vrše neke aktivnosti. Filteri mogu da odbiju neke
zahteve ili da napr. izvrše redirekciju zahteva. Za rad sa filterima je
potrebno implementirati javax.servlet.Filter interfejs. Filteri se mogu
definisati u deployment deskriptoru, programski ili pomoću anotacija.
Upotreba filera su razne: logovanje aktivnosti u aplikaciji (sačuvati
informaciju o svakom HTTP zahtevu i svakom odgovoru), autentifikacija
(provera da li je neki korisnik ulogovan se može vršiti samo na jednom
mestu – u filteru), kriptovanje poruka koje se razmenjuju između
servera i neke aplikacije i upravljanje greškama.
Metodi ovog interfejsa Filter su: init(FilterConfig f), destroy() i
doFilter(ServletRequest r, ServletResponse rs, FilterChain fc). Potrebno
je definisati filter u deployment deskriptoru tj. web.xml sa tagom filter i
unutra tagovi filter name i filter class. Tu se mogu postavljati vrednosti
URL paterna ili naziva servleta na koje će se primenljivati filteri i radi se
u okviru taga filter mapping gde kažemo tag filter name i tagovi url
patern ili servlet name. Iznad klase je potrebno postaviti anotaciju
@WebFilter i možemo tu navesti filterName, urlPatterns ili
servletName.
HTTP zahtev ili odgovor može biti presretnut od strane više filtera koji
su stavljenu u lanac – filter chain. Svaki filter mora pozvati metodu
doFilter kako pri HTTP zahtevu ili odgovoru prosledio sledećem filter.
Da bi smo definisali redosled izvršavanja filtera koristimo deployment
deskriptor, ali moguće je to uraditi i kroz odgovarajuće metode. Prvo se
izvršavaju filteri koju su definisani preko URL paterna, pa onda oni koji
su definisani preko imena servleta. Ako ima više filtera, prvo se
izvršavaju oni koji imaju opštiji URL patern.
8. JSP akcije
JSP specifikacija obezbeđuje nekoliko tagova koji se mogu koristiti u
okviru JSP stranica za izvršavanje određenih akcija – zamena za
skriptlet. Pišu se sa prefiksom jsp:. Neke od najčešće korišćenih akcija
su: forward (prosleđuje zahtev drugoj stranici), include (uključuje
odgovor neke druge stranice), plugin (umetanje Java apleta), useBean
(instancira JavaBean klasu), setProperty (postavlja vrednost atributa
JavaBean klase) i getProperty (preuzima vrednost atributa JavaBean
klase).
U JSP stranicama kažemo da koristimo JavaBean klase korišćenjem 3
akcije: useBean – instancira JavaBean klasu, setProperty – postavlja
vrednost atributa JavaBean klase i getProperty – preuzima vrednost
atributa JavaBean klase. Ove akcije rade isključivo sa JavaBean klasama.
To su klase koje imaju konstruktor bez argumenata, set i get metode za
sva privatna polja i implementiraju interfejs java.io.Serializable.
Sintaksa <jsp:useBean id=”myBean” class=”PersonBean”
scope=”page|request|session|application” izaberemo request> gde je
id – naziv objekta JavaBean klase, class – JavaBean klasa čiji objekat se
instancira i navodi se puno ime klase sa paketima i scope je opseg
vidljivosti beana. Data deklaracija je ekvivalentna sledećem Java kodu:
PersonBean myBean = (PersonBean) request.getAttribute(’’myBean’’) i
ako sad myBean je jednak null onda je myBean = new PersonBean() pa
sa request.setAttribute(’’myBean’’, myBean). useBean akcija proverava
da li u navedenom opsegu vidljivosti postoji bean sa datim imenom, ako
postoji preuzima ga ili ako ne postoji, kreira novi bean i smešta ga u
navedeni opseg. Akcija <jsp:getProperty name=”beanName”
property=”propertyName”/> naprimer kad smo postavili myBean u
useBeanu ovde ga napišemo, a kao property stavimo šta ima od polja
napr. name.
Jsp:setProperty postavlja vrednost atributa beana i postoje 4 načina:
<jsp:setProperty name=”beanName” property=”*”> postavlja vrednosti
svih atributa bean na osnovu vrednosti istoimenih request parametara,
<jsp:setProperty name=”beanName” property=”propertyName”>
postavlja vrednost jednog atributa na osnovu vrednosti istoimenog
request parametra, <jsp:setProperty name=”beanName”
property=”propertyName” param=”parameterName”> postavlja
vrednost jednog atributa na osnovu vrednosti request parametra sa
zadatim imenom i poslednji način je <jsp:setProperty
name=”beanName” property=”propertyName”
param=”parameterName value=”propertyValue”> postavlja vrednost
atributa beana na zadatu vrednost.
Data akcija <jsp:setProperty name=”person” property=”name”> je
ekvivalentna sledećem Java kodu,
person.setName(request.getParameter(’’name’’);.
Akcija setProperty se može postaviti posle definicije bean – akcije sa
useBean i to će značiti da će se vrednost atributa promeniti bez obzira
da li se bean kreira prvi put ili ne. Akcija može biti definisana u okviru
useBean akcije i to će značiti da vrednost atributa se postavlja samo kad
se bean prvi put kreira.
Tipičan patern za komunikaciju servleta i JSP je da servlet bude zdužen
za primanje HTTP zahteva i implementaciju poslovne logike i da zatim
odgovarajući model prosledi JSP stranici koja će znati da prikaže taj
model. Potrebna klasa je RequestDispetcher i metoda forward,
setujemo atribut u request i onda sa
request.getRequestDispetcher(kažemo putanju do
stranice).forward(request, response). A onda u stranici kao skriptlet
napravimo objekat tog što smo setovali i sa request getujemo atribut
od toga.
9. Implicitni objekti
To su predefinisane promenljive koje se odnose na neke najčešće
korišćene koncepte u web tehnologijama. Napr. pristup određenom
opsegu vidljivosti i često se koriste u skriptletima.
Implicitni objekti sa njihovim opisima: request (objekat tipa
HTTPServletRequest i odnosi se na trenutni HTTP zahtev), response
(objekat tipa HTTPServletResponse i odnosi se na tekući HTTP odgovor
koji se prosleđuje brauzeru), out (JspWriter objekat se odnosi na output
stream HTTP odgovora), session (objekat klase HTTPSession i odnosi se
na tekuću sesiju), application (objekat klase ServletContext i odnosi se
na celu web aplikaciju) i page (objekat ekvivalentan promenljivoj this u
Javi).
Generalna preporuka je ne koristiti skriptlete, izraze i deklaracije tj. ne
ugrađivati Java kod u JSP stranicu. Zato što je teško za održavanje,
nečitko je, HTML dizajn je pomešan sa Java kodom i narušava MVC
patern – u skriptletima se može greškom naći nešto što pripada
kontroleru. Alternativa jesu JSP akcije, JSTL i EL.
Ako u JSP stranicu hoćemo da ubacimo nešto što ne može da se uradi
preko JSP akcije, JSTL i EL onda to verovatno ne pripada JSP stranici i
treba ga staviti na drugo mesto napr. Java Servlet.