You are on page 1of 34

Id do

Spis treci
Przykadowy rozdzia
Katalog ksiek
Katalog online
Zamw drukowany
katalog
Twj koszyk
Dodaj do koszyka
Cennik i informacje
Zamw informacje
o nowociach
Zamw cennik
Czytelnia
Fragmenty ksiek
online

Kontakt
Helion SA
ul. Kociuszki 1c
44-100 Gliwice
tel. 32 230 98 63
e-mail: helion@helion.pl
Helion 19912011

JavaServer Faces.
Wydanie III
Autorzy: David Geary, Cay S. Horstmann
Tumaczenie: Mikoaj Szczepaniak
ISBN: 978-83-246-2904-6
Tytu oryginau: Core JavaServer Faces (3rd Edition)
Format: 172245, stron: 584

Ta ksika zawiera wszystko, czego Ci potrzeba do opanowania frameworka JSF 2.0!


Jak korzysta ze znacznikw JSF?
Jak tworzy komponenty zoone?
Jak nawizywa poczenie z bazami danych i usugami zewntrznymi?
JavaServer Faces (JSF) to technologia platformy Java EE, uatwiajca projektowanie i tworzenie
interfejsw uytkownika aplikacji internetowych. Umoliwia sprawn prac nad aplikacjami
dziaajcymi po stronie serwera i wprowadzanie jasnego podziau na wizualn prezentacj oraz
waciw logik aplikacji. Specyfikacja JSF 2.0 (inaczej ni poprzednia) jest pochodn wielu
rzeczywistych projektw open source. Dziki temu sam framework jest duo prostszy i lepiej
zintegrowany ze stosem technologii Java EE ni wersja JSF 1.0. Co wicej, jego specyfikacja
przewiduje teraz obsug technologii takich, jak AJAX czy REST. Framework JSF 2.0 jest obecnie
jednym z najznamienitszych frameworkw aplikacji internetowych tworzonych w Javie. Do jego
mocnych stron nale take: uproszczony model programowania poprzez zastosowanie adnotacji
i wprowadzenie zasady konwencji ponad konfiguracj oraz rozszerzalny model komponentw.
Ksika JavaServer Faces. Wydanie III zawiera wszystko, czego trzeba do opanowania
rozbudowanych elementw frameworka JSF 2.0. Poznaj tajniki znacznikw frameworka JSF oraz
obsugi zdarze. Dowiedz si, jak budowa komponenty zoone, i naucz si implementowa wasne,
niestandardowe. Wykorzystaj w swoich aplikacjach technologi AJAX i opanuj nawizywanie
pocze z bazami danych czy innymi usugami zewntrznymi. W ostatnim rozdziale znajdziesz
pomocne wskazwki na temat diagnozowania i rejestrowania zdarze, a take praktyczne
przykady kodu, rozszerzajce technologi JSF.
Komponenty zarzdzane
Zasig komponentw
Nawigacja statyczna i dynamiczna
Znaczniki standardowe
Facelety
Tabele danych
Konwersja i weryfikacja danych
Obsuga zdarze
Komponenty zoone
Technologia AJAX
Usugi zewntrzne
Praca z bazami danych

Spis treci
Przedmowa .................................................................................................................... 9
Podzikowania ............................................................................................................. 13

Rozdzia 1. Wprowadzenie .......................................................................................................................15


Dlaczego wybieramy technologi JavaServer Faces? ........................................................ 15
Prosty przykad ............................................................................................................. 16
Elementy skadowe ................................................................................................. 18
Struktura katalogw ................................................................................................ 19
Kompilacja przykadowej aplikacji ............................................................................. 21
Wdraanie aplikacji technologii JSF ........................................................................... 22
rodowiska wytwarzania dla JSF .................................................................................... 24
Analiza przykadowej aplikacji ........................................................................................ 26
Komponenty ........................................................................................................... 27
Strony technologii JSF ............................................................................................. 29
Konfiguracja serwletu .............................................................................................. 31
Pierwsze spojrzenie na technologi Ajax
............................................................... 33
Usugi frameworku JSF .................................................................................................. 36
Mechanizmy wewntrzne ............................................................................................... 38
Wizualizacja stron ................................................................................................... 38
Dekodowanie da ................................................................................................ 39
Cykl ycia aplikacji JSF ............................................................................................ 40
Podsumowanie ............................................................................................................ 42

Rozdzia 2. Komponenty zarzdzane ...................................................................................................... 43


Definicja komponentu ................................................................................................... 43
Waciwoci komponentu ........................................................................................ 46
Wyraenia reprezentujce wartoci ........................................................................... 47
Komponenty wspierajce ......................................................................................... 48
Komponenty CDI
.................................................................................................... 49
Pakiety komunikatw .................................................................................................... 50
Komunikaty obejmujce zmienne .............................................................................. 52
Konfigurowanie ustawie regionalnych aplikacji ......................................................... 53
Przykadowa aplikacja ................................................................................................... 54
Zasig komponentw .................................................................................................... 60
Zasig sesji ............................................................................................................ 61

JavaServer Faces
Zasig dania ....................................................................................................... 62
Zasig aplikacji ....................................................................................................... 63
Zasig konwersacji
........................................................................................... 63
Zasig widoku
.............................................................................................. 64
Zasigi niestandardowe
................................................................................. 65
Konfigurowanie komponentw ....................................................................................... 65
Wstrzykiwanie komponentw CDI
....................................................................... 65
..................................................... 66
Wstrzykiwanie komponentw zarzdzanych
Adnotacje cyklu ycia komponentu ............................................................................ 66
Konfigurowanie komponentw zarzdzanych na poziomie XML-a ................................. 67
Skadnia jzyka wyrae ................................................................................................ 72
Tryby l-wartoci i r-wartoci ....................................................................................... 72
Stosowanie nawiasw kwadratowych ........................................................................ 73
Wyraenia odwoujce si do map i list ..................................................................... 73
Wywoywanie metod i funkcji <rysunek JSF 2.0> ........................................................ 74
Przetwarzanie wyrazu pocztkowego ......................................................................... 76
Wyraenia zoone ................................................................................................... 77
Wyraenia odwoujce si do metod ......................................................................... 78
Parametry wyrae odwoujcych si do metod
................................................ 79
Podsumowanie ............................................................................................................ 80

Rozdzia 3. Nawigacja ..............................................................................................................................81


Nawigacja statyczna ..................................................................................................... 81
Nawigacja dynamiczna .................................................................................................. 82
Odwzorowywanie wynikw na identyfikatory widokw .................................................. 83
Aplikacja JavaQuiz ................................................................................................... 85
Przekierowania ............................................................................................................. 93
Przekierowanie i obiekt flash
.......................................................................... 94
Nawigacja zgodna ze stylem REST i adresy URL zapewniajce moliwo
stosowania zakadek
......................................................................................... 95
Parametry widoku ................................................................................................... 96

cza da GET ..................................................................................................... 97


Okrelanie parametrw dania ............................................................................... 98
Dodanie czy umoliwiajcych stosowanie zakadek do aplikacji quizu ........................ 99
Zaawansowane techniki nawigacji ................................................................................ 103
Symbole wieloznaczne ........................................................................................... 104
Stosowanie elementu from-action ........................................................................... 104
Warunkowe przypadki nawigacji
.................................................................... 105
Dynamiczne identyfikatory widokw docelowych
............................................. 105
Podsumowanie .......................................................................................................... 105

Rozdzia 4. Znaczniki standardowe JSF ...............................................................................................107


Przegld podstawowych znacznikw JSF ....................................................................... 108
Atrybuty, parametry i facety .................................................................................... 109
Przegld znacznikw JSF reprezentujcych znaczniki HTML (JSF HTML) ........................... 110
Atrybuty wsplne ................................................................................................... 112
Panele ....................................................................................................................... 120
Znaczniki head, body i form ......................................................................................... 122
Elementy formularzy i skrypty jzyka JavaScript ....................................................... 123
Jedno- i wielowierszowe pola tekstowe ......................................................................... 127
Pola ukryte ........................................................................................................... 130
Stosowanie jedno- i wielowierszowych pl tekstowych .............................................. 130
Wywietlanie tekstu i obrazw ................................................................................ 133

Spis treci

Przyciski i cza .......................................................................................................... 136


Stosowanie przyciskw .......................................................................................... 138
Stosowanie czy polece ...................................................................................... 142
Znaczniki selekcji ....................................................................................................... 145
Pola wyboru i przyciski opcji ................................................................................... 148
Menu i listy .......................................................................................................... 150
Elementy .............................................................................................................. 152
Komunikaty ............................................................................................................... 169
Podsumowanie .......................................................................................................... 174

Rozdzia 5. Facelety

....................................................................................................................175

Znaczniki projektu Facelets ......................................................................................... 175


Stosowanie szablonw technologii Facelets .................................................................. 176
Budowanie stron na podstawie wsplnych szablonw .............................................. 179
Organizacja widokw ............................................................................................. 182
Dekoratory ........................................................................................................... 188
Parametry ............................................................................................................. 189
Znaczniki niestandardowe ........................................................................................... 190
Komponenty i fragmenty ........................................................................................ 192
Zakoczenie .............................................................................................................. 193
Znacznik <ui:debug> ............................................................................................. 193
Znacznik <ui:remove> ........................................................................................... 195
Obsuga znakw biaych ......................................................................................... 196
Podsumowanie .......................................................................................................... 196

Rozdzia 6. Tabele danych ......................................................................................................................197


Znacznik tabeli danych h:dataTable ......................................................................... 197
Prosta tabela ............................................................................................................. 198
Atrybuty znacznika h:dataTable .............................................................................. 201
Atrybuty znacznika h:column .................................................................................. 201
Nagwki, stopki i podpisy ........................................................................................... 201
Style ......................................................................................................................... 205
Style stosowane dla kolumn .................................................................................. 206
Style stosowane dla wierszy .................................................................................. 207
Znacznik ui:repeat
...................................................................................... 207
Komponenty JSF w tabelach ........................................................................................ 208
Edycja tabel ............................................................................................................... 212
Edycja komrek tabeli ........................................................................................... 212
Usuwanie wierszy
........................................................................................ 215
Tabele bazy danych .................................................................................................... 218
Modele tabel ............................................................................................................. 222
Wywietlanie numerw wierszy ............................................................................... 222
Identyfikacja wybranego wiersza ............................................................................. 223
Sortowanie i filtrowanie ......................................................................................... 223
Techniki przewijania ................................................................................................... 230
Przewijanie z uyciem paska przewijania ................................................................. 230
Przewijanie za pomoc widgetw stronicowania ....................................................... 231
Podsumowanie .......................................................................................................... 232

Rozdzia 7. Konwersja i weryfikacja poprawnoci danych ...............................................................233


Przegld procesu konwersji i weryfikacji poprawnoci .................................................... 233
Stosowanie konwerterw standardowych ...................................................................... 235
Konwersja liczb i dat ............................................................................................. 235

JavaServer Faces
Bdy konwersji ..................................................................................................... 239
Kompletny przykad konwertera .............................................................................. 244
Stosowanie standardowych mechanizmw weryfikujcych .............................................. 247
Weryfikacja dugoci acuchw i przedziaw liczbowych .......................................... 247
Weryfikacja wartoci wymaganych .......................................................................... 249
Wywietlanie komunikatw o bdach weryfikacji ..................................................... 250
Pomijanie procesu weryfikacji ................................................................................. 250
Kompletny przykad mechanizmu weryfikacji ............................................................ 252
Weryfikacja na poziomie komponentw Javy
....................................................... 254
Programowanie z wykorzystaniem niestandardowych konwerterw
i mechanizmw weryfikujcych .................................................................................. 259
Implementacja klas konwerterw niestandardowych ................................................. 259
Wskazywanie konwerterw
........................................................................... 262
Raportowanie bdw konwersji .............................................................................. 264
Uzyskiwanie dostpu do komunikatw o bdach
zapisanych w pakiecie komunikatw .................................................................... 265
Przykadowa aplikacja zbudowana na bazie konwertera niestandardowego ................. 269
Przekazywanie konwerterom atrybutw .................................................................... 272
Implementacja klas niestandardowych mechanizmw weryfikacji .............................. 273
Rejestrowanie wasnych mechanizmw weryfikacji ................................................... 274
Weryfikacja danych wejciowych za pomoc metod komponentw Javy ...................... 277
Weryfikacja relacji czcych wiele komponentw ..................................................... 277
Implementacja niestandardowych znacznikw konwerterw i mechanizmw weryfikacji .... 279
Podsumowanie .......................................................................................................... 285

Rozdzia 8. Obsuga zdarze .................................................................................................................287


Zdarzenia i cykl ycia aplikacji JSF ............................................................................... 288
Zdarzenia zmiany wartoci .......................................................................................... 289
Zdarzenia akcji ........................................................................................................... 293
Znaczniki metod nasuchujcych zdarze ...................................................................... 299
Znaczniki f:actionListener i f:valueChangeListener ................................................... 299
Komponenty bezporednie .......................................................................................... 301
Stosowanie bezporednich komponentw wejciowych ............................................ 301
Stosowanie bezporednich komponentw polece ................................................... 304
Przekazywanie danych z interfejsu uytkownika na serwer .............................................. 305
Parametry wyraenia odwoujcego si do metody
......................................... 306
Znacznik f:param .................................................................................................. 306
Znacznik f:attribute ............................................................................................... 307
Znacznik f:setPropertyActionListener ...................................................................... 308
Zdarzenia fazy ............................................................................................................ 309
Zdarzenia systemowe
....................................................................................... 310
Weryfikacja wielu komponentw ............................................................................. 311
Podejmowanie decyzji przed wizualizacj widoku ...................................................... 312
Podsumowanie caego materiau w jednym miejscu ....................................................... 317
Podsumowanie .......................................................................................................... 324

Rozdzia 9. Komponenty zoone

...............................................................................................325

Biblioteka znacznikw komponentw zoonych ............................................................. 326


Stosowanie komponentw zoonych ........................................................................... 327
Implementowanie komponentw zoonych ................................................................... 329
Konfigurowanie komponentw zoonych ...................................................................... 330
Typy atrybutw ........................................................................................................... 331
Atrybuty wymagane i domylne wartoci atrybutw ........................................................ 332

Spis treci

Przetwarzanie danych po stronie serwera ..................................................................... 333


Lokalizacja komponentw zoonych ............................................................................ 336
Udostpnianie komponentw zoonych ....................................................................... 337
Udostpnianie rde akcji ..................................................................................... 339
Facety ....................................................................................................................... 341
Komponenty potomne ................................................................................................. 342
JavaScript .................................................................................................................. 343
Komponenty wspomagajce ........................................................................................ 348
Pakowanie komponentw zoonych w plikach JAR ........................................................ 356
Podsumowanie .......................................................................................................... 357

Rozdzia 10. Ajax

........................................................................................................................359

Ajax i JSF ................................................................................................................... 359


Cykl ycia aplikacji JSF i technologia Ajax ..................................................................... 361
Technologie JSF i Ajax prosty przepis ....................................................................... 362
Znacznik f:ajax ........................................................................................................... 363
Grupy technologii Ajax ................................................................................................. 366
Weryfikacja pl przy uyciu technologii Ajax ................................................................... 368
Monitorowanie da technologii Ajax .......................................................................... 369
Przestrzenie nazw JavaScriptu ..................................................................................... 372
Obsuga bdw technologii Ajax .................................................................................. 373
Odpowiedzi technologii Ajax ........................................................................................ 374
Biblioteka JavaScriptu frameworku JSF 2.0 .................................................................. 375
Przekazywanie dodatkowych parametrw dania Ajax ................................................... 378
Kolejkowanie zdarze ................................................................................................. 379

czenie zdarze ........................................................................................................ 380


Przechwytywanie wywoa funkcji jsf.ajax.request() ........................................................ 381
Stosowanie technologii Ajax w komponentach zoonych ............................................... 382
Podsumowanie .......................................................................................................... 388

Rozdzia 11. Niestandardowe komponenty, konwertery i mechanizmy weryfikujce ......................389


Implementacja klasy komponentu ................................................................................ 390
Kodowanie: generowanie kodu jzyka znacznikw ......................................................... 394
Dekodowanie: przetwarzanie wartoci dania .............................................................. 397
Deskryptor biblioteki znacznikw
....................................................................... 403
Stosowanie zewntrznych mechanizmw wizualizacji ..................................................... 406
Przetwarzanie atrybutw znacznika
.................................................................... 410
Obsuga metod nasuchujcych zmian wartoci ....................................................... 412
Obsuga wyrae odwoujcych si do metod ........................................................... 413
Kolejkowanie zdarze ............................................................................................ 414
Przykadowa aplikacja ............................................................................................ 415
Kodowanie JavaScriptu ............................................................................................... 421
Stosowanie komponentw i facet potomnych ............................................................... 424
Przetwarzanie znacznikw potomnych typu SelectItem .............................................. 427
Przetwarzanie facet ............................................................................................... 428
Stosowanie pl ukrytych ........................................................................................ 429
Zapisywanie i przywracanie stanu ................................................................................ 435
Czciowe zapisywanie stanu
...................................................................... 436
Konstruowanie komponentw technologii Ajax
...................................................... 439
Implementacja autonomicznej funkcji Ajax w ramach komponentu niestandardowego ....... 441
Obsuga znacznika f:ajax w komponentach niestandardowych ................................... 445
Podsumowanie .......................................................................................................... 450

JavaServer Faces
Rozdzia 12. Usugi zewntrzne .............................................................................................................451
Dostp do bazy danych za porednictwem interfejsu JDBC ............................................ 451
Wykonywanie wyrae jzyka SQL ........................................................................... 451
Zarzdzanie poczeniami ...................................................................................... 453
Eliminowanie wyciekw pocze ............................................................................ 453
Stosowanie gotowych wyrae ................................................................................ 455
Transakcje ........................................................................................................... 456
Uywanie bazy danych Derby .................................................................................. 457
Konfigurowanie rda danych ..................................................................................... 459
Uzyskiwanie dostpu do zasobw zarzdzanych przez kontener ................................ 459
Konfigurowanie zasobw baz danych w ramach serwera GlassFish ............................ 460
Konfigurowanie zasobw baz danych w ramach serwera Tomcat ............................... 460
Kompletny przykad uycia bazy danych ................................................................... 462
Stosowanie architektury JPA ........................................................................................ 470
Krtki kurs architektury JPA ................................................................................... 470
Stosowanie architektury JPA w aplikacjach internetowych ......................................... 472
Stosowanie komponentw zarzdzanych i bezstanowych komponentw sesyjnych ...... 476
Stanowe komponenty sesyjne
.......................................................................... 479
Uwierzytelnianie i autoryzacja zarzdzana przez kontener ............................................... 481
Wysyanie poczty elektronicznej ................................................................................... 492
Stosowanie usug sieciowych ...................................................................................... 497
Podsumowanie .......................................................................................................... 503

Rozdzia 13. Jak to zrobi? ...................................................................................................................505


Gdzie naley szuka dodatkowych komponentw? ......................................................... 505
Jak zaimplementowa obsug wysyania plikw na serwer? .......................................... 506
Jak wywietla map obrazw? ................................................................................... 514
Jak generowa dane binarne w ramach stron JSF? ........................................................ 516
Jak prezentowa ogromne zbiory danych podzielone na mniejsze strony? ........................ 524
Jak generowa wyskakujce okna? .............................................................................. 528
Jak selektywnie prezentowa i ukrywa komponenty? .................................................... 535
Jak dostosowywa wygld stron o bdach? .................................................................. 536
Jak utworzy wasny, niestandardowy znacznik weryfikacji po stronie klienta? .................. 541
Jak skonfigurowa aplikacj? ...................................................................................... 548
Jak rozszerzy jzyk wyrae technologii JSF? ............................................................... 549
Jak doda funkcj do jzyka wyrae JSF?
.......................................................... 551
Jak monitorowa ruch pomidzy przegldark a serwerem? ........................................... 553
Jak diagnozowa stron, na ktrej zatrzymaa si nasza aplikacja? ................................ 555
Jak uywa narzdzi testujcych w procesie wytwarzania aplikacji JSF? ........................... 557
Jak uywa jzyka Scala podczas tworzenia aplikacji frameworku JSF? ........................... 559
Jak uywa jzyka Groovy w aplikacjach frameworku JSF? .............................................. 560
Podsumowanie .......................................................................................................... 561

Skorowidz .............................................................................................................................................563

3
Nawigacja
W tym krtkim rozdziale omwimy sposb konfigurowania regu nawigacji w ramach budowanej aplikacji internetowej. W szczeglnoci wyjanimy, jak aplikacja moe przechodzi
od jednej do drugiej strony internetowej w zalenoci od czynnoci wykonywanych przez
uytkownika i decyzji podejmowanych na poziomie logiki biznesowej.

Nawigacja statyczna
Przeanalizujmy teraz sytuacj, w ktrej uytkownik aplikacji internetowej wypenia formularz na stronie internetowej. Uytkownik moe wpisywa dane w polach tekstowych, klika
przyciski opcji i wybiera elementy list.
Wszystkie te dziaania s realizowane na poziomie przegldarki internetowej uytkownika.
Kiedy uytkownik klika przycisk akceptujcy i wysyajcy dane formularza, zmiany s przekazywane na serwer.
Aplikacja internetowa analizuje wwczas dane wpisane przez uytkownika i na ich podstawie decyduje, ktrej strony JSF naley uy do wizualizacji odpowiedzi. Za wybr kolejnej
strony JSF odpowiada mechanizm obsugujcy nawigacj (ang. navigation handle).
W przypadku prostych aplikacji internetowych nawigacja pomidzy stronami ma charakter
statyczny. Oznacza to, e kliknicie okrelonego przycisku zawsze powoduje przejcie do
tej samej strony JSF odpowiedzialnej za wizualizacj odpowiedzi. W podrozdziale Prosty
przykad w rozdziale 1. Czytelnicy mieli okazj zapozna si z najprostszym mechanizmem
zapisywania regu nawigacji statycznej pomidzy stronami JSF.
Dla kadego przycisku definiujemy atrybut action przykad takiego rozwizania przedstawiono poniej:
<h:commandButton label="Zaloguj" action="welcome"/>

82

JavaServer Faces

Podczas lektury rozdziau 4. bdzie si mona przekona , e akcje nawigacji mona
przypisywa take do hiperczy.

Warto atrybutu action okrela si mianem wyniku (ang. outcome). Wrcimy do tematu
wyniku w punkcie Odwzorowywanie wynikw na identyfikatory widokw w nastpnym
podrozdziale okazuje si, e wynik mona opcjonalnie odwzorowywa na identyfikatory
widokw. W specyfikacji JavaServer Faces mianem widoku (ang. view) okrela si stron JSF.
Jeli programista nie zdefiniuje takiego odwzorowania dla okrelonego wyniku, wynik jest
przeksztacany w identyfikator widoku wedug nastpujcych regu:
1. Jeli wynik nie obejmuje rozszerzenia pliku, dopisuje si do niego rozszerzenie

biecego widoku.
2. Jeli wynik nie rozpoczyna si od prawego ukonika (/), poprzedza si go ciek

do biecego widoku.
Na przykad wynik welcome w widoku /index.xhtml zostanie automatycznie przeksztacony
w identyfikator widoku docelowego /welcome.xhtml.
Odwzorowania wynikw na identyfikatory widokw s opcjonalne, poczwszy od wersji JSF 2.0. We wczeniejszych wersjach programista musia wprost
okrela reguy nawigacji dla kadego wyniku.

Nawigacja dynamiczna
W przypadku wikszoci aplikacji internetowych nawigacja nie ma charakteru statycznego.
cieka przechodzenia pomidzy stronami nie zaley tylko od klikanych przyciskw, ale
take od danych wejciowych wpisywanych przez uytkownika. Na przykad wysyajc dane
ze strony logowania (zwykle nazw uytkownika i haso), moemy oczekiwa dwch odpowiedzi ze strony serwera: akceptacji tych danych bd ich odrzucenia. Odpowied serwera
zaley wic od pewnych oblicze (w tym konkretnym przypadku od poprawnoci nazwy
uytkownika i hasa).
Aby zaimplementowa nawigacj dynamiczn, przycisk akceptacji formularza naley zwiza z wyraeniem odwoujcym si do metody:
<h:commandButton label="Zaloguj" action="#{loginController.verifyUser}"/>

W naszym przypadku wyraz loginController odwouje si do komponentu pewnej klasy,


ktra musi definiowa metod nazwan verifyUser.
Wyraenie odwoujce si do metody, ktre przypisujemy atrybutowi action, nie otrzymuje
adnych parametrw, ale moe zwraca warto jakiego typu. Zwracana warto jest konwertowana na acuch za pomoc wywoania metody toString.

Rozdzia 3.

Nawigacja

83

W standardzie JSF 1.1 metody bdce przedmiotem odwoa w tego rodzaju wyraeniach musiay zwraca wartoci typu String. W technologii JSF 1.2 zwracana
warto moe by obiektem dowolnego typu. Taka moliwo jest szczeglnie wana
w przypadku typw wyliczeniowych, poniewa eliminuje ryzyko przeoczenia literwek
w nazwach akcji (wychwytywanych przez kompilator).

Przykad metody akcji przedstawiono poniej:


String verifyUser() {
if (...)
return "success";
else
return "failure";
}

Powysza metoda zwraca jeden z dwch acuchw wynikowych: "success" lub "failure".
Na podstawie tej wartoci identyfikuje si nastpny widok.
Metoda akcji moe zwrci warto null, aby zasygnalizowa konieczno ponownego wywietlenia tej samej strony. W takim przypadku zasig widoku (ktry omwilimy w rozdziale 2.) jest zachowywany. Kady wynik inny ni null powoduje wyczyszczenie tego zasigu, nawet jeli widok wynikowy jest taki sam jak widok biecy.

Krtko mwic, za kadym razem, gdy uytkownik klika przycisk polecenia, dla ktrego
zdefiniowano wyraenie odwoujce si do metody w atrybucie action, implementacja JSF
podejmuje nastpujce kroki:
1. uzyskuje dostp do wskazanego komponentu;
2. wywouje wskazan metod;
3. przeksztaca acuch wynikowy w identyfikator widoku;
4. wywietla odpowiedni stron (na podstawie identyfikatora widoku).

Oznacza to, e implementacja rozgazie (ang. branching) wymaga przekazania referencji


do metody w klasie odpowiedniego komponentu. Mamy du dowolno w kwestii miejsca
umieszczenia tej metody. Najlepszym rozwizaniem jest znalezienie klasy obejmujcej wszystkie dane potrzebne do podejmowania waciwych decyzji.

Odwzorowywanie wynikw na identyfikatory widokw


Jednym z najwaniejszych celw projektowych technologii JSF jest oddzielenie prezentacji
od logiki biznesowej. Jeli decyzje nawigacyjne maj charakter dynamiczny, kod obliczajcy
wynik z natury rzeczy nie powinien by zobligowany do znajomoci precyzyjnych nazw stron
internetowych. Technologia JSF oferuje mechanizm odwzorowywania wynikw logicznych,
na przykad success i failure, na waciwe strony internetowe.
Takie odwzorowanie mona zdefiniowa, dodajc wpisy navigation-rule do pliku facesconfig.xml. Typowy przykad takiej konstrukcji pokazano poniej:

84

JavaServer Faces
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.xhtml</to-view-id>
</navigation-case>
</navigation-rule>

Przytoczona regua okrela, e wynik success na stronie /index.xhtml ma kierowa uytkownika na stron /welcome.xhtml.

acuchy identyfikatorw widokw rozpoczynaj si od prawego ukonika (/). Jeli


programista stosuje odwzorowania rozszerze (na przykad przyrostka .faces), rozszerzenia musz odpowiada rozszerzeniom plikw (na przykad .xhtml), nie rozszerzeniom adresw URL.

Jeli programista odpowiednio dobierze acuchy wynikw, bdzie mg zebra wiele regu
nawigacji w jednym miejscu. Programista moe na przykad stworzy jedn regu dla
wszystkich przyciskw skojarzonych z akcj logout (dostpnych na wielu stronach danej
aplikacji). Wszystkie te przyciski mog powodowa przejcie na stron loggedOut.xhtml
wystarczy zdefiniowa jedn regu:
<navigation-rule>
<navigation-case>
<from-outcome>logout</from-outcome>
<to-view-id>/loggedOut.xhtml</to-view-id>
</navigation-case>
</navigation-rule>

Ta regua jest stosowana dla wszystkich stron, poniewa nie zdefiniowano elementu fromview-id.
Istnieje te moliwo scalania regu nawigacji z tym samym elementem from-view-id.
Przykad takiego rozwizania pokazano poniej:
<navigation-rule>
<from-view-id>/index.xhtml</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/newuser.xhtml</to-view-id>
</navigation-case>
</navigation-rule>

W przypadku prostych aplikacji reguy nawigacji zwykle w ogle nie s potrzebne.


Kiedy jednak budowane aplikacje staj si coraz bardziej zoone, warto stosowa
wyniki logiczne w ramach komponentw zarzdzanych oraz reguy nawigacji odwzorowujce te wyniki na widoki docelowe.

Rozdzia 3.

Nawigacja

85

Aplikacja JavaQuiz
W tym punkcie umiecimy zapisy dotyczce nawigacji w przykadowym programie prezentujcym uytkownikowi sekwencj pyta quizu (patrz rysunek 3.1).
Rysunek 3.1.
Pytanie quizu

Kiedy uytkownik klika przycisk Sprawd odpowied , aplikacja sprawdza, czy podana odpowied jest prawidowa. Jeli nie, uytkownik otrzymuje jeszcze jedn szans rozwizania tego
samego problemu (patrz rysunek 3.2).
Rysunek 3.2.
Jedna bdna
odpowied
sprbuj
ponownie

Po dwch bdnych odpowiedziach aplikacja prezentuje uytkownikowi kolejny problem


do rozwizania (patrz rysunek 3.3).
Oczywicie take w razie podania prawidowej odpowiedzi aplikacja przechodzi do nastpnego
problemu. I wreszcie po rozwizaniu ostatniego problemu nastpuje wywietlenie strony podsumowania z uzyskan liczb punktw i propozycj ponownego przystpienia do quizu (patrz
rysunek 3.4).

86

JavaServer Faces

Rysunek 3.3.
Dwie bdne
odpowiedzi
kontynuuj

Rysunek 3.4.
Quiz zako
czony
punktacja

Nasza aplikacja skada si z dwch klas. Klasa Problem (przedstawiona na listingu 3.1) opisuje
pojedynczy problem, czyli pytanie, odpowied oraz metod weryfikacji, czy dana odpowied
jest prawidowa.
Listing 3.1. Zawarto pliku javaquiz/src/java/com/corejsf/Problem.java
1. package com.corejsf;
2.
3. import java.io.Serializable;
4.
5. public class Problem implements Serializable {
6.
private String question;
7.
private String answer;
8.
9.
public Problem(String question, String answer) {
10.
this.question = question;
11.
this.answer = answer;
12.
}

Rozdzia 3.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22. }

Nawigacja

87

public String getQuestion() { return question; }


public String getAnswer() { return answer; }
// naley przykry t metod bardziej wyszukanym kodem sprawdzajcym
public boolean isCorrect(String response) {
return response.trim().equalsIgnoreCase(answer);
}

Klasa QuizBean opisuje quiz obejmujcy szereg pyta. Egzemplarz tej klasy dodatkowo ledzi
biece pytanie i czn punktacj uzyskan przez uytkownika. Kompletny kod tej klasy
przedstawiono na listingu 3.2.
Listing 3.2. Zawarto pliku javaquiz/src/java/com/corejsf/QuizBean.java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.

package com.corejsf;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.inject.Named;
// lub import javax.faces.bean.ManagedBean;
import javax.enterprise.context.SessionScoped;
// lub import javax.faces.bean.SessionScoped;
@Named // lub @ManagedBean
@SessionScoped
public class QuizBean implements Serializable {
private int currentProblem;
private int tries;
private int score;
private String response = "";
private String correctAnswer;
// Poniej zakodowano problemy na stae. W rzeczywistej aplikacji
// najprawdopodobniej odczytywalibymy je z bazy danych.
private ArrayList<Problem> problems = new ArrayList<Problem>(Arrays.asList(
new Problem(
"Jaki slogan reklamowa programowanie w Javie? Write once, ...",
"run anywhere"),
new Problem(
"Jak wygldaj 4 pierwsze bajty kadego pliku klasy (szesnastkowo)?",
"CAFEBABE"),
new Problem(
"Co zostanie wywietlone przez to wyraenie? System.out.println(1+\"2\");",
"12"),
new Problem(
"Ktre sowo kluczowe Javy suy do definiowania podklasy?",
"extends"),
new Problem(
"Jak brzmiaa oryginalna nazwa jzyka programowania Java?",
"Oak"),

88

JavaServer Faces
41.
new Problem(
42.
"Ktra klasa pakietu java.util opisuje punkt w czasie?",
43.
"Date")));
44.
45.
public String getQuestion() { return problems.get(currentProblem).getQuestion(); }
46.
47.
public String getAnswer() { return correctAnswer; }
48.
49.
public int getScore() { return score; }
50.
51.
public String getResponse() { return response; }
52.
public void setResponse(String newValue) { response = newValue; }
53.
54.
public String answerAction() {
55.
tries++;
56.
if (problems.get(currentProblem).isCorrect(response)) {
57.
score++;
58.
nextProblem();
59.
if (currentProblem == problems.size()) return "done";
60.
else return "success";
61.
}
62.
else if (tries == 1) return "again";
63.
else {
64.
nextProblem();
65.
if (currentProblem == problems.size()) return "done";
66.
else return "failure";
67.
}
68.
}
69.
70.
public String startOverAction() {
71.
Collections.shuffle(problems);
72.
currentProblem = 0;
73.
score = 0;
74.
tries = 0;
75.
response = "";
76.
return "startOver";
77.
}
78.
79.
private void nextProblem() {
80.
correctAnswer = problems.get(currentProblem).getAnswer();
81.
currentProblem++;
82.
tries = 0;
83.
response = "";
84.
}
85. }

W analizowanym przykadzie wanie klasa QuizBean jest waciwym miejscem dla metod
odpowiedzialnych za nawigacj. Wspomniany komponent dysponuje pen wiedz o dziaaniach uytkownika i moe bez trudu okreli, ktra strona powinna by wywietlona jako
nastpna.
Logik nawigacji zaimplementowano w metodzie answerAction klasy QuizBean. Metoda
answerAction zwraca jeden z kilku moliwych acuchw: "success" lub "done" (jeli uytkownik prawidowo odpowiedzia na pytanie), "again" (jeli uytkownik po raz pierwszy
udzieli bdnej odpowiedzi) oraz "failure" lub "done" (jeli po raz drugi pada za odpowied ).

Rozdzia 3.

Nawigacja

89

public String answerAction() {


tries++;
if (problems.get(currentProblem).isCorrect(response)) {
score++;
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "success";
}
else if (tries == 1) return "again";
else {
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "failure";
}
}

Z przyciskami na kadej z tych stron wiemy wyraenie odwoujce si do metody answer
Action. Na przykad strona index.xhtml zawiera nastpujcy element:
<h:commandButton value="#{msgs.checkAnswer}" action="#{quizBean.answerAction}"/>

Na rysunku 3.5 przedstawiono struktur katalogw naszej aplikacji. Na listingu 3.3 przedstawiono kod strony gwnej aplikacji quizu: index.xhtml. Kodem stron success.xhtml i failure.
xhtml nie bdziemy si zajmowa, poniewa rni si od kodu strony index.xhtml tylko
komunikatem wywietlanym w grnej czci.
Rysunek 3.5.
Struktura
katalogw
aplikacji quizu
o Javie

Listing 3.3. Kod strony javaquiz/web/index.xhtml


1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
3.
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4. <html xmlns="http://www.w3.org/1999/xhtml"
5.
xmlns:h="http://java.sun.com/jsf/html">
6.
<h:head>
7.
<title>#{msgs.title}</title>
8.
</h:head>

90

JavaServer Faces
9.
<h:body>
10.
<h:form>
11.
<p>#{quizBean.question}</p>
12.
<p><h:inputText value="#{quizBean.response}"/></p>
13.
<p>
14.
<h:commandButton value="#{msgs.checkAnswer}"
15.
action="#{quizBean.answerAction}"/>
16.
</p>
17.
</h:form>
18.
</h:body>
19. </html>

Strona done.xhtml, ktrej kod przedstawiono na listingu 3.4, prezentuje uytkownikowi


ostateczny wynik i zachca go do ponownej gry. Warto zwrci uwag na jedyny przycisk
dostpny na tej stronie. Na pierwszy rzut oka moe si wydawa, e mamy do czynienia
z nawigacj statyczn, poniewa kade kliknicie przycisku Rozpocznij od nowa powoduje
powrt na stron index.xhtml. Okazuje si jednak, e element definiujcy ten przycisk wykorzystuje wyraenie odwoujce si do metody:
<h:commandButton value="#{msgs.startOver}" action="#{quizBean.startOverAction}"/>

Listing 3.4. Zawarto pliku javaquiz/web/done.xhtml


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.

<?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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
<title>#{msgs.title}</title>
</h:head>
<h:body>
<h:form>
<p>
#{msgs.thankYou}
<h:outputFormat value="#{msgs.score}">
<f:param value="#{quizBean.score}"/>
</h:outputFormat>
</p>
<p>
<h:commandButton value="#{msgs.startOver}"
action="#{quizBean.startOverAction}"/>
</p>
</h:form>
</h:body>
</html>

Metoda startOverAction wykonuje wszelkie dziaania niezbdne do przywrcenia oryginalnego stanu gry. Dziaanie tej metody polega na przypadkowym uporzdkowaniu pyta i wyzerowaniu wyniku:
public String startOverAction() {
Collections.shuffle(problems);
currentProblem = 0;

Rozdzia 3.

Nawigacja

91

score = 0;
tries = 0;
response = "";
return "startOver";
}

Oglnie metody akcji peni dwie funkcje:


Q

aktualizuj model w reakcji na dziaania podejmowane przez uytkownika;

sygnalizuj mechanizmowi nawigacji konieczno skierowania uytkownika


w okrelone miejsce.

Podczas lektury rozdziau 8. Czytelnicy przekonaj si, e istnieje moliwo doczania do przyciskw take obiektw nasuchujcych akcji. Kiedy uytkownik klika
tak zdefiniowany przycisk, nastpuje wykonanie kodu metody processAction obiektu
nasuchujcego. Warto jednak pamita , e obiekt nasuchujcy akcji nie komunikuje
si z mechanizmem odpowiedzialnym za nawigacj.

Na listingu 3.5 przedstawiono plik konfiguracyjny tej aplikacji obejmujcy midzy innymi
reguy nawigacji. Aby lepiej zrozumie te reguy, warto rzuci okiem na diagram przechodzenia pomidzy stronami, pokazany na rysunku 3.6.
Listing 3.5. Zawarto pliku javaquiz/web/WEB-INF/faces-config.xml
1. <?xml version="1.0"?>
2. <faces-config xmlns="http://java.sun.com/xml/ns/javaee"
3.
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4.
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5.
http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
6.
version="2.0">
7.
<navigation-rule>
8.
<navigation-case>
9.
<from-outcome>startOver</from-outcome>
10.
<to-view-id>/index.xhtml</to-view-id>
11.
</navigation-case>
12.
</navigation-rule>
13.
<navigation-rule>
14.
<from-view-id>/again.xhtml</from-view-id>
15.
<navigation-case>
16.
<from-outcome>failure</from-outcome>
17.
<to-view-id>/failure.xhtml</to-view-id>
18.
</navigation-case>
19.
</navigation-rule>
20.
<navigation-rule>
21.
<navigation-case>
22.
<from-outcome>failure</from-outcome>
23.
<to-view-id>/again.xhtml</to-view-id>
24.
</navigation-case>
25.
</navigation-rule>
26.
27.
<application>
28.
<resource-bundle>
29.
<base-name>com.corejsf.messages</base-name>
30.
<var>msgs</var>

92

JavaServer Faces

Rysunek 3.6.
Diagram przej
aplikacji quizu
o Javie

31.
</resource-bundle>
32.
</application>
33. </faces-config>

Dla trzech spord naszych wynikw ("success", "again" i "done") nie zdefiniowano regu
nawigacji. Wymienione wyniki zawsze kieruj uytkownika odpowiednio na strony /success.
xhtml, /again.xhtml oraz /done.xhtml. Wynik "startOver" odwzorowujemy na stron
/index.xhtml. Nieco trudniejsza jest obsuga wyniku failure, ktry pocztkowo kieruje uytkownika na stron /again.xhtml, stwarzajc mu drug okazj do udzielenia odpowiedzi. Jeli
jednak take odpowied wpisana na tej stronie okazuje si bdna, ten sam wynik kieruje
uytkownika na stron /failure.xhtml:
<navigation-rule>
<from-view-id>/again.xhtml</from-view-id>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/failure.xhtml</to-view-id>
</navigation-case>
</navigation-rule>
<navigation-rule>
<navigation-case>
<from-outcome>failure</from-outcome>
<to-view-id>/again.xhtml</to-view-id>
</navigation-case>
</navigation-rule>

Warto pamita o tym, e kolejno regu nie jest bez znaczenia. Druga regua jest uwzgldniana w sytuacji, gdy biec stron nie jest /again.xhtml.

Rozdzia 3.

Nawigacja

93

I wreszcie na listingu 3.6 pokazano acuchy komunikatw.


Listing 3.6. Zawarto pliku javaquiz/src/java/com/corejsf/messages.properties
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.

title=Dziecinnie prosty quiz o Javie


checkAnswer=Sprawd odpowied
startOver=Rozpocznij od nowa
correct=Gratulacje, prawidowa odpowied.
notCorrect=Przykro nam, Twoja odpowied jest bdna. Sprbuj ponownie!
stillNotCorrect=Przykro nam, take tym razem podae bdn odpowied.
correctAnswer=Prawidowa odpowied: {0}.
score=Twj wynik punktowy: {0}.
nextProblem=A oto nastpne pytanie.
thankYou=Dzikujemy za udzia w quizie.

Przekierowania
Programista moe wymusi na implementacji technologii JavaServer Faces przekierowanie
(ang. redirection) uytkownika do nowego widoku. Implementacja JSF wysya nastpnie
przekierowanie protokou HTTP do klienta. Odpowied przekierowania wskazuje klientowi
adres URL kolejnej strony na tej podstawie klient generuje danie GET na odpowiedni
adres URL.
Przekierowywanie jest czasochonne, poniewa wymaga powtrzenia caego cyklu komunikacji z udziaem przegldarki. Przekierowanie ma jednak t zalet, e stwarza przegldarce
moliwo aktualizacji jej pola adresu.
Na rysunku 3.7 pokazano, jak zmienia si zawarto pola adresu wskutek uycia mechanizmu
przekierowania.
Bez przekierowania oryginalny adres URL (localhost:8080/javaquiz/faces/index.xhtml)
pozostaby niezmieniony przy okazji przejcia uytkownika ze strony /index.xhtml na stron
/success.xhtml. Przekierowanie powoduje, e przegldarka wywietla nowy adres URL
(localhost:8080/javaquiz/faces/success.xhtml).
Jeli nie stosujemy regu nawigacji, powinnimy uzupeni acuch wyniku o nastpujcy zapis:
?faces-redirect=true

Po wprowadzeniu tej zmiany przykadowy acuch wyniku moe mie nastpujc posta:
<h:commandButton label="Zaloguj" action="welcome?faces-redirect=true"/>

W regule nawigacji naley umieci element redirect bezporednio za elementem to-view-id:


<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/success.xhtml</to-view-id>
<redirect/>
</navigation-case>

94

JavaServer Faces

Rysunek 3.7. Przekierowanie aktualizuj ce adres URL w przegl darce

Przekierowanie i obiekt flash


Aby zminimalizowa rozmiary zasigu sesji, warto moliwie czsto rezygnowa z tego zasigu
na rzecz zasigu dania. Bez elementu redirect istnieje moliwo stosowania komponentw o zasigu dania dla danych prezentowanych w nastpnym widoku.
Przeanalizujmy teraz, jak bdzie dziaaa nasza aplikacja w przypadku uycia elementu
redirect:
1. Klient wysya danie na serwer.
2. Mapa zasigu dania jest wypeniana komponentami o zasigu dania.
3. Serwer wysya do klienta status HTTP 302 (przekierowanie tymczasowe) wraz

z miejscem docelowym przekierowania. Ten krok koczy biece danie, zatem


komponenty o zasigu dania s usuwane.
4. Klient generuje danie GET i wysya pod nowy adres.
5. Serwer wizualizuje nastpny widok. Okazuje si jednak, e komponenty nalece

do zasigu poprzedniego dania nie s ju dostpne.


Aby obej ten problem, technologia JSF 2.0 oferuje obiekt flash, ktry mona wypeni
podczas obsugi jednego dania i uy w ramach kolejnego dania. (Koncepcj obiektu flash

Rozdzia 3.

Nawigacja

95

zaczerpnito z frameworku internetowego Ruby on Rails). Typowym zastosowaniem obiektw


flash s komunikaty. Na przykad metoda obsugujca przycisk moe umieci jaki komunikat wanie w obiekcie flash:
ExternalContext.getFlash().put("message", "Twoje haso niedugo straci wano");

Metoda ExternalContext.getFlash() zwraca obiekt klasy Flash implementujcej interfejs


Map<String, Object>.
W kodzie strony JSF mona odwoa si do obiektu flash za pomoc zmiennej flash. Na
przykad powyszy komunikat mona wywietli, stosujc konstrukcj:
#{flash.message}

Po wizualizacji komunikatu i dostarczeniu przekierowania do klienta acuch komunikatu jest


automatycznie usuwany z obiektu flash.
Okazuje si, e warto w obiekcie flash mona utrzymywa duej ni podczas przetwarzania jednego dania. Na przykad wyraenie w postaci:
#{flash.keep.message}

nie tylko zwraca warto klucza message przechowywan w obiekcie flash, ale te dodaje t
warto ponownie z myl o kolejnym cyklu dania.
Jeli z czasem ilo danych przerzucanych pomidzy obiektem flash a komponentem staje si naprawd dua, warto rozway uycie zasigu konwersacji.

Nawigacja zgodna ze stylem REST i adresy URL


zapewniajce moliwo stosowania zakadek
Aplikacja JSF domylnie generuje sekwencj da POST wysyanych na serwer. Kade danie POST zawiera dane formularza. Takie rozwizanie jest uzasadnione w przypadku aplikacji
gromadzcych du ilo danych wejciowych wpisywanych przez uytkownika. Okazuje si
jednak, e znaczna cz aplikacji internetowych dziaa w zupenie inny sposb. Wyobra my
sobie na przykad sytuacj, w ktrej uytkownik przeglda katalog sklepu internetowego,
klikajc cza do kolejnych produktw. Poza wyborem klikanych czy trudno w tym przypadku mwi o jakichkolwiek danych wejciowych uytkownika.
cza powinny zapewnia moliwo stosowania zakadek (ang. bookmarkable), aby uytkownik mg wrci
na t sam stron po wpisaniu tego samego adresu URL. Co wicej, strony powinny by przystosowane do przechowywania w pamici podrcznej (ang. cacheable). Przechowywanie
stron w pamici podrcznej jest wanym czynnikiem decydujcym o efektywnoci aplikacji
internetowych. Stosowanie zakadek ani przechowywanie w pamici podrcznej oczywicie
nie jest moliwe w przypadku da POST.
Zgodnie z zaleceniami stylu architektury nazwanego REST (od ang. Representational State
Transfer) aplikacje internetowe powinny posugiwa si protokoem HTTP wedug oryginalnych

96

JavaServer Faces
regu przyjtych przez jego twrcw. Na potrzeby operacji wyszukiwania naley stosowa
dania GET. dania PUT, POST i DELETE powinny by wykorzystywane odpowiednio do tworzenia, modyfikowania i usuwania.
Zwolennicy stylu REST najbardziej ceni sobie adresy URL w nastpujcej formie:
http://serwer.pl/catalog/item/1729

Architektura REST nie narzuca nam jednak jednego stylu. Na przykad dla dania GET
z parametrem mona by uy nastpujcego adresu:
http://serwer.pl/catalog?item=1729

Take ten adres jest w peni zgodny ze stylem REST.


Naley pamita, e da GET nigdy nie powinno si uywa do aktualizowania informacji.
Na przykad danie GET dodajce element do koszyka w tej formie:
http://serwer.pl/addToCart?cart=314159&item=1729

nie byoby waciwe. dania GET powinny by idempotentne. Oznacza to, e dwukrotne
uycie tego samego dania nie powinno prowadzi do rezultatw innych ni jednorazowe
danie. Wanie od tego zaley moliwo przechowywania da w pamici podrcznej.
danie dodaj do koszyka z natury rzeczy nie jest idempotentne jego dwukrotne wysanie spowoduje dodanie dwch takich samych towarw do koszyka. W tym kontekcie duo
odpowiedniejsze byoby danie POST. Oznacza to, e nawet aplikacje internetowe zgodne ze
stylem REST musz korzysta z da POST.
Technologia JSF nie oferuje obecnie standardowego mechanizmu generowania ani przetwarzania tzw. dobrych adresw URL, jednak poczwszy od wersji JSF 2.0, moemy liczy
na obsug da GET. Omwimy ten aspekt w kolejnych punktach tego podrozdziau.

Parametry widoku
Przeanalizujmy teraz danie GET, ktre ma spowodowa wywietlenie informacji o konkretnym produkcie:
http://serwer.pl/catalog?item=1729

Identyfikator produktu jest przekazywany w formie parametru zapytania. Po otrzymaniu


dania warto tego parametru musi zosta przekazana do waciwego komponentu. Programista moe uy do tego celu parametrw widoku.
Na pocztku strony naley doda znaczniki podobne do poniszych:
<f:metadata>
<f:viewParam name="item" value="#{catalog.currentItem}"/>
</f:metadata>

W czasie przetwarzania dania warto parametru zapytania item jest przekazywana do


metody setCurrentItem komponentu catalog.

Rozdzia 3.

Nawigacja

97

Strona JSF moe zawiera dowoln liczb parametrw widoku. Jak wszystkie parametry dania, parametry widoku mona konwertowa i sprawdza pod ktem poprawnoci. (Zagadnienia zwizane z konwersj i weryfikacj zostan szczegowo omwione w rozdziale 7.).
Czsto niezbdne jest uzyskiwanie dodatkowych danych ju po ustawieniu parametrw widoku.
Na przykad po ustawieniu parametru widoku item moe zaistnie potrzeba uzyskania waciwoci tego produktu z bazy danych, aby wygenerowa stron opisujc ten produkt. W rozdziale 8. omwimy sposb implementacji tego rodzaju mechanizmw w ramach metody
obsugujcej zdarzenie preRenderView.

cza da GET


W poprzednim punkcie omwilimy sposb przetwarzania przez implementacj technologii
JSF dania GET. Aplikacje zgodne z architektur REST powinny zapewnia uytkownikom
moliwo nawigacji przy uyciu tego rodzaju da. Oznacza to, e programista powinien
umieszcza na swoich stronach przyciski i cza, ktrych klikanie generuje wanie dania GET.
Przyciski i cza tego typu mona definiowa odpowiednio za pomoc znacznikw h:button
i h:link. (Do definiowania przyciskw i czy generujcych dania POST su odpowiednio
znaczniki h:commandButton i h:commandLink).
Programista powinien mie kontrol nad identyfikatorami widokw docelowych i parametrami zapyta tego rodzaju da. Identyfikator widoku docelowego mona okreli za porednictwem atrybutu outcome. Warto tego atrybutu moe mie albo posta staego acucha:
<h:button value="Gotowe" outcome="done"/>

albo wyraenia reprezentujcego warto:


<h:button value="Pomi " outcome="#{quizBean.skipOutcome}"/>

Drugi zapis powoduje wywoanie metody getSkipOutcome. Metoda ta musi zwrci acuch
wyniku, ktry trafia do mechanizmu obsugi nawigacji, gdzie jest przetwarzany w tradycyjny
sposb w celu okrelenia identyfikatora widoku docelowego.
Istnieje zasadnicza rnica dzielca atrybut outcome znacznika h:button od atrybutu action
znacznika h:commandButton. Atrybut outcome jest przetwarzany przed wizualizacj strony,
zatem odpowiednie cze moe by osadzone w kodzie tej strony. Atrybut action jest natomiast przetwarzany dopiero po klikniciu przycisku polecenia przez uytkownika. Wanie
dlatego w specyfikacji JSF mona spotka termin nawigacji wyprzedzajcej (ang. preemptive navigation) stosowany w kontekcie wyznaczania identyfikatorw widokw docelowych
dla da GET.
Wyraenie jzyka wyrae (EL) przypisane atrybutowi outcome jest wyraeniem
reprezentujcym warto , nie wyraeniem odwoujcym si do metody. Oglnie,
akcja skojarzona z przyciskiem polecenia moe w ten czy inny sposb zmienia stan
aplikacji. Naley jednak pamita , e przetwarzanie wyniku cza dania GET nie powinno
skutkowa adnymi zmianami takie cze jest przecie umieszczane na stronie
z myl o potencjalnym wykorzystaniu w przyszoci.

98

JavaServer Faces

Okrelanie parametrw dania


Czsto stajemy przed koniecznoci doczania parametrw do czy da GET. Takie parametry mog pochodzi z trzech rnych rde:
Q

acucha wyniku,

parametrw widoku,

zagniedonych znacznikw f:param.

Jeli ten sam parametr zostanie okrelony wicej ni raz, pierwszestwo ma warto zdefiniowana przez p niejsze rdo z poniszej listy (najwyszy priorytet maj wic zagniedone
znaczniki f:param).
Przeanalizujmy teraz szczegy kadego z tych rozwiza.
Parametry mona okrela w ramach acucha wyniku, na przykad:
<h:link outcome="index?q=1" value="Skip">

Mechanizm obsugujcy nawigacj wyodrbnia parametry z acucha wyniku, okrela identyfikator widoku docelowego i dopisuje wyodrbnione wczeniej parametry do tego identyfikatora. Oznacza to, e w tym przypadku identyfikatorem widoku docelowego bdzie /index.
xhtml?q=1.
W razie zdefiniowania wielu parametrw koniecznie naley zastpi separator & odpowiedni
sekwencj specjaln (ucieczki):
<h:link outcome="index?q=1&amp;score=0" value="Skip">

W acuchu wyniku oczywicie zawsze mona uy wyraenia reprezentujcego warto,


na przykad:
<h:link outcome="index?q=#{quizBean.currentProblem + 1}" value="Skip">

Istnieje jeszcze wygodny zapis skrcony umoliwiajcy wczenie wszystkich parametrw


widoku do jednego acucha zapytania. Wystarczy doda do znacznika h:link nastpujcy
atrybut:
<h:link outcome="index" includeViewParams="true" value="Skip">

W ten sposb mona atwo przenosi wszystkie parametry widoku z jednej strony na drug,
co jest do typowym wymaganiem stawianym aplikacjom zgodnym z architektur REST.
Parametry widoku mona nadpisa, stosujc znacznik f:param. Przykad takiego rozwizania
pokazano poniej:
<h:link outcome="index" includeViewParams="true" value="Skip">
<f:param name="q" value="#{quizBean.currentProblem + 1}"/>
</h:link>

Rozdzia 3.

Nawigacja

99

Moliwo wczania parametrw widoku znacznie uatwia take definiowanie czy przekierowa, ktre take maj posta da GET. Zamiast jednak ustawia atrybut w znaczniku,
naley doda odpowiedni parametr do wyniku:
<h:commandLink action="index?faces-redirect=true&amp;includeViewParams=true"
value="Skip"/>

danie w tej formie nie uwzgldnia jednak zagniedonych znacznikw f:param.


Jeli reguy nawigacji s definiowane w pliku konfiguracyjnym w formacie XML, naley
uy atrybutu include-viewparams i zagniedonych znacznikw view-param, na przykad:
<redirect include-view-params=true>
<view-param>
<name>q</name>
<value>#{quizBean.currentProblem + 1}</value>
</view-param>
</redirect>

Nie naley przywizywa zbyt duej wagi do drobnych niekonsekwencji widocznych w powyszej konstrukcji skadniowej. Czytelnik powinien je traktowa raczej jako rodek do podniesienia poziomu czujnoci i tym samym udoskonalenia swoich umiejtnoci programistycznych.

Dodanie czy umoliwiajcych stosowanie zakadek do aplikacji quizu


Wrmy na chwil do aplikacji quizu, ktr omwilimy we wczeniejszej czci tego rozdziau (przy okazji demonstrowania zasad nawigacji). Czy mona t aplikacj w wikszym
stopniu dostosowa do wymogw architektury REST?
danie GET nie byoby waciwym sposobem wysyania odpowiedzi, poniewa w tym kontekcie nie spenia warunku idempotentnoci. Wysanie odpowiedzi modyfikuje wynik uytkownika. Okazuje si jednak, e moemy doda do naszej aplikacji zgodne z architektur REST
cza do nawigowania pomidzy pytaniami.
Aby zachowa prostot naszej aplikacji, umieszczamy na stronie pojedyncze cze umoliwiajce stosowanie zakadek i powodujce przejcie do nastpnego pytania. Uywamy do tego
celu parametru widoku:
<f:metadata>
<f:viewParam name="q" value="#{quizBean.currentProblem}"/>
</f:metadata>

Samo cze definiujemy w nastpujcy sposb:


<h:link outcome="#{quizBean.skipOutcome}" value="Skip">
<f:param name="q" value="#{quizBean.currentProblem + 1}"/>
</h:link>

Metoda getSkipOutcome klasy QuizBean zwraca acuch "index" lub "done" w zalenoci od
tego, czy s dostpne jeszcze jakie pytania:

100

JavaServer Faces
public String getSkipOutcome() {
if (currentProblem < problems.size() - 1) return "index";
else return "done";
}

Tak zdefiniowane cze bdzie miao nastpujc posta (patrz rysunek 3.8):
http://localhost:8080/javaquiz-rest/faces/index.xhtml?q=1

Rysunek 3.8.
Przykad  cza
zgodnego
z architektur
REST

Uytkownik moe doda to cze do zakadek i wrci do dowolnego pytania quizu.


Na listingu 3.7 pokazano kod strony index.xhtml zawierajcy parametr widoku i znacznik
h:link. Na listingu 3.8 pokazano zmodyfikowany kod komponentu QuizBean. Uzupenilimy
ten komponent o metod setCurrentProblem i zmodyfikowalimy mechanizm obliczania
wyniku punktowego. Poniewa aplikacja oferuje teraz moliwo wielokrotnego odwiedzenia
strony tego samego pytania, musimy mie pewno, e uytkownik nie otrzymuje punktw za
wicej ni jedn odpowied na to samo pytanie.
Listing 3.7. Zawarto pliku javaquiz-rest/web/index.xhtml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.

<?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:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html">
<f:metadata>
<f:viewParam name="q" value="#{quizBean.currentProblem}"/>
</f:metadata>
<h:head>
<title>#{msgs.title}</title>
</h:head>
<h:body>
<h:form>
<p>#{quizBean.question}</p>
<p><h:inputText value="#{quizBean.response}"/></p>

Rozdzia 3.

Nawigacja

101

17.
<p><h:commandButton value="#{msgs.checkAnswer}"
18.
action="#{quizBean.answerAction}"/></p>
19.
<p><h:link outcome="#{quizBean.skipOutcome}" value="Skip">
20.
<f:param name="q" value="#{quizBean.currentProblem + 1}"/>
21.
</h:link>
22.
</p>
23.
</h:form>
24.
</h:body>
25. </html>

Listing 3.8. Zawarto pliku javaquiz-rest/src/java/com/corejsf/QuizBean.java


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.

package com.corejsf;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import javax.inject.Named;
// lub import javax.faces.bean.ManagedBean;
import javax.enterprise.context.SessionScoped;
// lub import javax.faces.bean.SessionScoped;
@Named // lub @ManagedBean
@SessionScoped
public class QuizBean implements Serializable {
private int currentProblem;
private int tries;
private String response = "";
private String correctAnswer;
// Poniej zakodowano problemy na stae. W rzeczywistej aplikacji
// najprawdopodobniej odczytywalibymy je z bazy danych.
private ArrayList<Problem> problems = new ArrayList<Problem>(Arrays.asList(
new Problem(
"Jaki slogan reklamowa programowanie w Javie? Write once, ...",
"run anywhere"),
new Problem(
"Jak wygldaj 4 pierwsze bajty kadego pliku klasy (szesnastkowo)?",
"CAFEBABE"),
new Problem(
"Co zostanie wywietlone przez to wyraenie? System.out.println(1+\"2\");",
"12"),
new Problem(
"Ktre sowo kluczowe Javy suy do definiowania podklasy?",
"extends"),
new Problem(
"Jak brzmiaa oryginalna nazwa jzyka programowania Java?",
"Oak"),
new Problem(
"Ktra klasa pakietu java.util opisuje punkt w czasie?",
"Date")));
private int[] scores = new int[problems.size()];
public String getQuestion() {
return problems.get(currentProblem).getQuestion();

102

JavaServer Faces
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103. }

}
public String getAnswer() { return correctAnswer; }
public int getScore() {
int score = 0;
for (int s : scores) score += s;
return score;
}
public String getResponse() { return response; }
public void setResponse(String newValue) { response = newValue; }
public int getCurrentProblem() { return currentProblem; }
public void setCurrentProblem(int newValue) { currentProblem = newValue; }
public String getSkipOutcome() {
if (currentProblem < problems.size() - 1) return "index";
else return "done";
}
public String answerAction() {
tries++;
if (problems.get(currentProblem).isCorrect(response)) {
scores[currentProblem] = 1;
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "success";
}
else {
scores[currentProblem] = 0;
if (tries == 1) return "again";
else {
nextProblem();
if (currentProblem == problems.size()) return "done";
else return "failure";
}
}
}
public String startOverAction() {
Collections.shuffle(problems);
currentProblem = 0;
for (int i = 0; i < scores.length; i++)
scores[i] = 0;
tries = 0;
response = "";
return "startOver";
}
private void nextProblem() {
correctAnswer = problems.get(currentProblem).getAnswer();
currentProblem++;
tries = 0;
response = "";
}

Rozdzia 3.

Nawigacja

103

Zaawansowane techniki nawigacji


Techniki opisane w poprzednich podrozdziaach powinny w zupenoci wystarczy do implementacji mechanizmw nawigacji w wikszoci aplikacji. W niniejszym podrozdziale skoncentrujemy si na pozostaych reguach, ktre mona konfigurowa za porednictwem elementw nawigacji w pliku faces-config.xml. Diagram skadni tych elementw przedstawiono na
rysunku 3.9.

Rysunek 3.9. Diagram skadni elementw nawigacji


Z lektury podrozdziau Konfigurowanie komponentw w rozdziale 2. wiemy, e
informacje o nawigacji mona umieszcza take w innych plikach konfiguracyjnych
ni plik standardowy faces-config.xml.

Z diagramu przedstawionego na rysunku 3.9 wynika, e kady element navigation-rule


i navigation-case moe obejmowa dowoln liczb elementw description, display-name
i icon. Wymienione elementy w zaoeniu maj by stosowane na poziomie narzdzi do
wizualnego projektowania interfejsw, zatem nie bdziemy ich poddawa szczegowej
analizie.

104

JavaServer Faces

Symbole wieloznaczne
W elementach from-view-id wykorzystywanych w ramach regu nawigacji mona stosowa
symbole wieloznaczne. Poniej przedstawiono odpowiedni przykad:
<navigation-rule>
<from-view-id>/secure/*</from-view-id>
<navigation-case>
...
</navigation-case>
</navigation-rule>

Tak zdefiniowana regua bdzie stosowana dla wszystkich stron rozpoczynajcych si od
przedrostka /secure/. Dopuszczalny jest tylko jeden znak gwiazdki (*), ktry musi si znajdowa na kocu acucha identyfikatora.
Jeli bdzie istniao wiele dopasowa do wzorca zdefiniowanego z uyciem symbolu wieloznacznego, zostanie wykorzystane dopasowanie najdusze.
Zamiast rezygnowa z elementu from-view-id, mona zastosowa jedn z dwch
poniszych konstrukcji definiujcych regu stosowan dla wszystkich stron:
<from-view-id>/*</from-view-id>

lub
<from-view-id>*</from-view-id>

Stosowanie elementu from-action


Struktura elementu navigation-case jest bardziej zoona od tej, do ktrej ograniczalimy si
w naszych dotychczasowych przykadach. Oprcz elementu from-outcome mamy do dyspozycji
take element from-action. Taka elastyczno okazuje si szczeglnie przydatna w sytuacji,
gdy dysponujemy dwiema odrbnymi akcjami z identycznym acuchem wyniku.
Przypumy na przykad, e w naszej aplikacji quizu o Javie metoda startOverAction zwraca
acuch "again" zamiast acucha "startOver". Ten sam acuch moe zosta zwrcony
przez metod answerAction. Do rozrnienia obu przypadkw (z perspektywy mechanizmu
nawigacji) mona wykorzysta element from-action. Zawarto tego elementu musi jednak
by identyczna jak acuch wyraenia odwoujcego si do metody zastosowany w atrybucie
action:
<navigation-case>
<from-action>#{quizBean.answerAction}</from-action>
<from-outcome>again</from-outcome>
<to-view-id>/again.xhtml</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{quizBean.startOverAction}</from-action>
<from-outcome>again</from-outcome>
<to-view-id>/index.xhtml</to-view-id>
</navigation-case>

Rozdzia 3.

Nawigacja

105

Mechanizm odpowiedzialny za nawigacj nie wywouje metody otoczonej konstrukcj #{...}. Odpowiednia metoda jest wywoywana, zanim jeszcze wspomniany mechanizm przystpuje do pracy. W tej sytuacji mechanizm nawigacji ogranicza si do wykorzystania acucha zdefiniowanego w elemencie from-action w roli klucza umoliwiajcego odnalezienie pasujcego przypadku.

Warunkowe przypadki nawigacji


W wersji JSF 2.0 wprowadzono dodatkowy element if, ktry umoliwia aktywowanie przypadku nawigacji tylko w razie spenienia okrelonego warunku. W roli tego warunku naley
uy wyraenia reprezentujcego warto. Przykad takiego rozwizania pokazano poniej:
<navigation-case>
<from-outcome>previous</from-outcome>
<if>#{quizBean.currentQuestion != 0}</if>
<to-view-id>/main.xhtml</to-view-id>
</navigation-case>

Dynamiczne identyfikatory widokw docelowych


Element to-view-id moe mie posta wyraenia reprezentujcego warto w takim
przypadku wymaga dodatkowego przetworzenia. Wynik tego wyraenia jest uywany w roli
identyfikatora widoku. Przykad takiej konstrukcji przedstawiono poniej:
<navigation-rule>
<from-view-id>/main.xhtml</from-view-id>
<navigation-case>
<to-view-id>#{quizBean.nextViewID}</to-view-id>
</navigation-case>
</navigation-rule>

W tym przykadzie uzyskanie identyfikatora widoku docelowego wymaga wywoania metody


getNextViewID komponentu quiz.

Podsumowanie
W tym rozdziale omwilimy wszystkie elementy technologii JavaServer Faces w zakresie
zarzdzania nawigacj. Naley pamita, e nawigacja w najprostszej formie jest wyjtkowo
atwa do zaimplementowania akcje przyciskw polece i czy mog po prostu zwraca
wynik wskazujcy nastpn stron. Jeli jednak programista potrzebuje wikszej kontroli,
framework JSF udostpnia mu niezbdne narzdzia.
W nastpnym rozdziale bdziemy koncentrowali si wycznie na standardowych komponentach frameworku JSF.

You might also like