Lekce 5 - Úvod do Context Dependency Injection (CDI)
V minulé lekci, Úvod do JavaServer Faces (JSF), jsme si vytvořili náš první JSF projekt
Aplikace v JEE skládáme z tzv. beanů, které budeme chápat jako komponenty.
Managed bean
Vytvoříme si tzv. managed bean. To je třída, jejíž instance spravuje JSF, vytváří je podle potřeby a hlavně jejich vlastnosti a metody propojuje s komponentami na webové stránce. Z tohoto důvodu označení managed. JSF řídí životní cyklus těchto beanů a stejně tak na nich volá metody.
Předtím, než vytvoříme novou třídu do našeho projektu, musíme
vytvořit složku java/ ve složkách main/:

Všimněte si, že jsme v pohledu Files (horní záložka).
Konečně si v projektu vytvoříme nový package s názvem
beans a do něj přidáme novou Java Class s
názvem GeneratorBean.
Přidání anotací
Vytvořené třídě přidáme dvě anotace: @Named() a
@RequestScoped(), vzápětí si vysvětlíme proč:
import javax.enterprise.context.RequestScoped; import javax.inject.Named; @Named() @RequestScoped() public class GeneratorBean { }
NetBeans na nás zakřičí, že takovou anotaci nezná a ať přidáme do
Maven tzv. "závislost" (odkaz na knihovnu). Klikněme na podtrženou anotaci a
na žárovku vlevo, jak jsme zvyklí z automatických importů, a vyberme na
"Search Dependency at Maven Repositories for Named". Vyberme
javaee-api. Tento krok nám přidal do pom.xml odkaz
na Java EE knihovny.
Pro zájemce, kteří nepoužívají NetBeans, vypadá závislost v souboru
pom.xml takto:
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>8.0</version> <type>jar</type> </dependency>
Už nám pouze zbývá přidat potřebný import, zas přes žárovku a NetBeans s námi už nebude mít problém.
Vidíme, že managed bean je běžná třída s bezparametrickým konstruktorem (aby ji mohlo JSF vytvořit) a s dvěma anotacemi.
CDI bean
Používáme mechanismus CDI bean, CDI označuje Contexts and Dependency Injection (kontexty a injekce závislostí), dále v kurzu si ukážeme, jaké další výhody tato technologie přináší.
Pojďme si přidané anotace vysvětlit:
- První anotace @Namednám jednoduše pojmenuje naši třídu.
- Druhá anotace @ReqeustScopedoznačuje, jak dlouho má instance beanu existovat. V našem případě to znamená, že se instance vytvoří po zaslání požadavku na stránku a po vygenerování stránky zanikne. Dále můžeme použít např.@SessionScoped, kde instance přežívá mezi požadavky pro jednoho klienta, nebo@ApplicationScoped, kde instance přežívá po celou dobu, co je aplikační server zapnutý (funguje jako návrhový vzor jedináček).
Anotace jsou z jmenných prostorů
javax.inject.Named a
javax.enterprise.context.RequestScoped. Je důležité, abyste
používali právě anotace z těchto prostorů, ověřte si to.
Třídě přidáme jediný privátní atribut generator typu
Random. Buď v konstruktoru nebo přímo v definici proměnné
založíme novou instanci. Dále přidáme getter, který vrátí vždy další
náhodné číslo z generátoru. Třída vypadá 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žná si říkáte, proč metoda getCislo()
vrací String? Je to z toho důvodu, že JSF EL, které budeme
používat za chvilku, pracuje poněkud zvláštně s typy int
(resp. museli bychom si hrát s konfiguračním souborem, a tomu se prozatím
chceme vyhnout).
EL výrazy
Náhodné číslo vložíme z instance beanu do JSF šablony pomocí tzv. EL výrazu (Expression Language). Předtím, než začneme pracovat s EL výrazy, musíme dát vědět našemu aplikačnímu serveru, že má EL výrazy zpracovávat.
Nastavení ve web.xml
Do web.xml přidáme konfigurační XML kód, aby
web.xml vypadal 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>
Soubor web.xml je také znám jako tzv.
deskriptor.
Přesuneme se do index.xhtml. Do této šablony nyní vypíšeme
výsledek metody getCislo() na GeneratorBean. Za
tímto účelem použijeme tedy EL výraz. Pomocí nich
můžeme ze šablon přistupovat k datům z Java beans.
index.xhtml upravíme do následující 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 odstavci používáme EL výraz, který zapíšeme pomocí
hash-kříže a složených závorek #{}. Vypisujeme vlastnost
cislo na instanci generatorBean (s malým
počátečním písmenem).
JSF výraz přeloží tak, že vytvoří instanci třídy
GeneratorBean a na ni zavolá getter getCislo(),
jehož výstup vloží do kódu výsledné HTML stránky. Vidíme, že nám JSF
značně zjednodušuje život. Pokud znáte MVC architekturu, tak v
podstatě zautomatizovalo kontroler, který propojuje šablony s logickými
třídami. Staráme se tedy již jen o tyto 2 vrstvy a zbytek se děje
automaticky.
Když aplikaci spustíme, uvidíme následující HTML stránku:

Po obnovení dostaneme vždy další náhodné číslo, jelikož je bean
nastavený jako RequestScoped (žije jen v době vykonávání
požadavku).
Projekt je níže ke stažení pro případ, že jste měli s jakýmkoli krokem problém.
Příště, v lekci Zpracování formulářů v JSF, si vytvoříme jednoduchou kalkulačku a naučíme se zpracovávat formuláře.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkamiStaženo 532x (19.52 kB)
 
				
