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
@Namednám jednoducho nazve našu triedu. - Druhá anotácie
@ReqeustScopedoznač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é 542x (19.52 kB)
