5. diel - Úvod do Context Dependency Injection (CDI)
Aplikácie v JEE skladáme z tzv. Beana, ktoré budeme chápať ako komponenty.
Managed bean
Vytvoríme si tzv. Managed bean. To je trieda, ktorej inštancie spravuje JSF, vytvára ich podľa potreby a hlavne ich vlastnosti a metódy prepája s komponentmi na webovej stránke. Z tohto dôvodu označenia managed. JSF riadi životný cyklus týchto Bean a rovnako tak na nich volá metódy.
Predtým, než vytvoríme novú triedu do nášho projektu, musíme vytvoriť
priečinok java/
v zložkách webapp/main/
:
Všimnite si, že sme v pohľade Files (horná záložka).
Konečne si v projekte vytvoríme nový package
s názvom
beans
a doň pridáme novú Java Class s názvom
GeneratorBean
.
Pridanie anotácií
Vytvorené triede pridáme dve anotácie: @Named()
a
@RequestScoped()
, vzápätí si vysvetlíme prečo:
import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named() @RequestScoped() public class GeneratorBean { }
NetBeans na nás zakričí, že takúto anotáciu nepozná a nech pridáme do
Maven tzv. "Závislosť" (odkaz na knižnicu). Klikneme na podtrhnutú anotáciu
a na žiarovku vľavo, ako sme zvyknutí z automatických importov, a vyberme na
"Search Dependency at Maven repositories for Named". Vyberme
javaee-api
. Tento krok nám pridal do pom.xml
odkaz na
Java EE knižnice.
Pre záujemcov, ktorí nepoužívajú NetBeans, vyzerá závislosť v súbore
pom.xml
takto:
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <type>jar</type> </dependency>
Už nám len zostáva pridať potrebný import, zas cez žiarovku a NetBeans s nami už nebude mať problém.
Vidíme, že managed bean je bežná trieda s bezparametrickým konštruktor (aby ju mohlo JSF vytvoriť) as dvoma anotáciami.
CDi bean
Používame mechanizmus CDI bean, CDI označuje Contexts and Dependency Injection (kontexty a injekcie závislostí), ďalej v kurze si ukážeme, aké ďalšie výhody táto technológia prináša.
Poďme si pridané anotácie vysvetliť:
- Prvá anotácia
@Named
nám jednoducho nazve našu triedu. - Druhá anotácie
@ReqeustScoped
označuje, ako dlho má inštancie Beana existovať. V našom prípade to znamená, že sa inštancia vytvoria po zaslaní požiadavke na stránku a po vygenerovaní stránky zanikne. Ďalej môžeme použiť napr.@SessionScoped
, kde inštancie prežíva medzi požiadavkami pre jedného klienta, alebo@ApplicationScoped
, kde inštancie prežíva po celú dobu, čo je aplikačný server zapnutý (funguje ako návrhový vzor jedináčik).
Anotácia sú z menných priestorov
javax.inject.Named
a
javax.enterprise.context.RequestScoped
. Je dôležité, aby ste
používali práve anotácie z týchto priestorov, overte si to.
Triede pridáme jediný privátny atribút generator
typu
Random
. Buď v konstruktoru alebo priamo v definícii premennej
založíme novú inštanciu. Ďalej pridáme getter, ktorý vráti vždy
ďalšie náhodné číslo z generátora. Trieda vyzerá asi takto:
import java.util.Random; import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named() @RequestScoped() public class GeneratorBean { private Random generator = new Random(); public int getCislo() { return generator.nextInt(100); } }
Možno si hovoríte, prečo metóda getCislo()
vracia String
? Je to z toho dôvodu, že JSF EL, ktoré budeme
používať za chvíľku, pracuje trochu zvláštne s typmi int
(resp. Museli by sme sa hrať s konfiguračným súborom, a tomu sa zatiaľ
chceme vyhnúť).
EL výrazy
Náhodné číslo vložíme z inštancie Bean do JSF šablóny pomocou tzv. EL výrazu (Expression Language). Predtým, než začneme pracovať s EL výrazmi, musíme dať vedieť nášmu aplikačnému serveru, že má EL výrazy spracovávať.
Nastavenie vo web.xml
Do web.xml
pridáme konfiguračný XML kód, aby
web.xml
vyzeral takto:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>Faces Servlet</servlet-name> <!-- This is important --> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <!-- This is important --> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> </web-app>
Súbor web.xml
je tiež známy ako tzv.
Deskriptor.
Presunieme sa do index.xhtml
. Do tejto šablóny teraz
vypíšeme výsledok metódy getCislo()
na
GeneratorBean
. Za týmto účelom použijeme teda EL
výraz. Pomocou nich môžeme zo šablón pristupovať k dátam z Java
beans.
index.xhtml
upravíme do nasledujúcej podoby:
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>Náhodné číslo</title> </h:head> <h:body> <h1>Náhodné číslo</h1> <p style="font-size: 2em;"> #{generatorBean.cislo} </p> </h:body> </html>
V odseku používame EL výraz, ktorý zapíšeme pomocou
hash-kríža a zložených zátvoriek #{}
. Vypisujeme vlastnosť
cislo
na inštanciu generatorBean
(s malým
začiatočným písmenom).
JSF výraz preloží tak, že vytvorí inštanciu triedy
GeneratorBean
a na ňu zavolá getter getCislo()
,
ktorého výstup vloží do kódu výslednej HTML stránky. Vidíme, že nám
JSF značne zjednodušuje život. Ak poznáte MVC architektúru, tak v
podstate zautomatizovalo kontrolér, ktorý prepája šablóny s logickými
triedami. Staráme sa teda už len o tieto 2 vrstvy a zvyšok sa deje
automaticky.
Keď aplikáciu spustíme, uvidíme nasledujúce HTML stránku:
Po obnovení dostaneme vždy ďalšie náhodné číslo, pretože je bean
nastavený ako RequestScoped
(žije len v čase vykonávania
požiadavke).
Projekt je nižšie k stiahnutiu pre prípad, že ste mali s akýmkoľvek krokom problém.
V budúcej lekcii, Blog v JEE - Založenie projektu a JSF Layout , začneme pracovať na blogu v JSF.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 430x (19.52 kB)