Obsah
Nyní si pro lepší pochopení všech probraných oblastí popíšeme, co se děje na pozadí JSF frameworku a jak je postupně uživatelský požadavek zpracováván. Vrátíme se také k událostem, které s životním cyklem dosti souvisí.
JSF pracuje stejně jako např. HTML protokol na principu request-response. Aby však bylo schopno zajistit veškerou svou pokročilejší funkcionalitu, jako např. konverzi, validaci a zpracování událostí, je celý cyklus obsluhy požadavku rozdělen do šesti fází, kterými se mezi vznikem požadavku a zasláním odpovědi prochází. Jejich názvy můžete vidět na obrázku 7.1 a jsou také vysvětleny dále v této kapitole.
Při zpracování cyklu hraje důležitou roli instance třídy
FacesContext
, která je vytvořena na začátku každého životního
cyklu voláním metody getFacesContext()
třídy
FacesContextFactory
(pro více informací o těchto třídách viz
[6]). Tato instance udržuje všechny potřebné informace
vztahující se k aktuálnímu requestu.
V JSF se rozlišují dva druhy požadavků:
Jedná se o prvotní požadavek na stránku, která nebyla předtím načtena. Mohlo na ni být odkázáno z externího zdroje, např. z jiného webu. Při tomto typu požadavku se neprochází všemi šesti fázemi životního cyklu, nýbrž pouze dvěma - z první fáze Restore View se přechází přímo k poslední fázi Render Response.
Obrázek 7.1. Životní cyklus JSF aplikace v případě Initial Requestu (zdroj: vlastní; inspirován [8])
Při Initial Requestu je v Restore View fázi vytvořeno nové prázdné
view. To je následně uloženo v
instanci FacesContext
, jenž zavolá svou metodu
renderResponse()
. Tím se přeskočí všechny ostatní fáze a na
základě komponent, které jsou umístěny na stránce, se postupně renderuje
odpověď a zároveň s tím se komponentami postupně plní nově vytvořené
view, aby bylo připraveno pro další
request.
Na rozdíl od Initial Requestu požaduje stránku, která byla již jednou načtena, např. při potvrzení formuláře na stránce.[33] Při tomto typu požadavku se prochází všemi šesti fázemi životního cyklu, samozřejmě za předpokladu, že v žádné fázi nebude cyklus nějakým způsobem přerušen.
Jak vidíte na obrázku 7.2, životní cyklus nemusí vždy
proběhnout celý. V průběhu každé fáze, mimo první a poslední, mohou
vzniknout události, které jsou po skončení fáze zaslány svým listenerům a zpracovány (modré obdélníky na
obrázku). Při tomto zpracování mohou být volány některé metody třídy
FacesContext
, které způsobí přerušení, či zkrácení cyklu
(šipky s popiskem, které vedou z modrých obdélníků). Konkrétně se jedná o
metody responseComplete()
a renderResponse()
.
Těmito situacemi se budeme zabývat na konci kapitoly v sekci 7.7 – „Události v životním cyklu aplikace“. Nyní si popíšeme průběh všemi fázemi a co se během
nich děje. Během procházení následujících šesti sekcí spolupracujte také s
obrázkem 7.2.
Toto je první fáze životního cyklu, která nastává ihned po vzniku requestu. Během ní se zpracovává view požadované stránky (pro připomenutí jak vypadá
view se můžete podívat na obrázek 3.4). Při postback requestu
již view existuje a informace o něm jsou uloženy
buď na serveru nebo na klientovi.[34] Stačí ho tedy pouze načíst. Následně je toto view uloženo ve FacesContextu
.
Jak již bylo řečeno, pokud se jedná o Initial Request, vytvoří se nové prázdné view a hned nato se skočí na fázi Render Response, během které se view naplní komponentami.
[33] Způsob zpracování formuláře jsem nastínil již v sekci 4.3.2 – „Formuláře“, kde jsem zmínil, že veškeré formuláře v JSF směřují vždy na tu samou stránku, ze které byly vyvolány. O tom, která stránka se má načíst jako následující, se rozhoduje až v pozdější fázi cyklu, konkrétně ve fázi Invoke Application.
[34] O tom, zda jsou informace uloženy na serveru nebo na klientovi rozhoduje konfigurace v souboru deployment descriptoru web.xml. Stačí do něj přidat kontextový parametr s názvem javax.faces.STATE_SAVING_METHOD a jako hodnotu zadat client respektive server. Pro více informací o možnostech deployment descriptoru viz [8].