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
@Named
nám jednoduše pojmenuje naši třídu. - Druhá anotace
@ReqeustScoped
označ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 423x (19.52 kB)