IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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/:

štruktúra projektu - Java Enterprise Edition (JEE)

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:

Webová aplikácia náhodné číslo v Java Enterprise JSF - Java Enterprise Edition (JEE)

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 podmienkami

Stiahnuté 372x (19.52 kB)

 

Predchádzajúci článok
Spracovanie formulárov v JSF
Všetky články v sekcii
Java Enterprise Edition (JEE)
Preskočiť článok
(neodporúčame)
Blog v JEE - Založenie projektu a JSF Layout
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity