Idź do
• Spis treści
• Przykładowy rozdział
Helion SA
ul. Kościuszki 1c
44-100 Gliwice
tel. 32 230 98 63
© Helion 1991–2011
Katalog książek
Twój koszyk
Cennik i informacje
Czytelnia
Kontakt
JavaServer Faces.
Wydanie III
Autorzy:
Tłumaczenie: Mikołaj Szczepaniak
ISBN: 978-83-246-2904-6
Tytuł oryginału:
Core JavaServer Faces (3rd Edition)
Format: 172×245, stron: 584
Ta książka zawiera wszystko, czego Ci potrzeba do opanowania frameworka JSF 2.0!
• Jak korzystać ze znaczników JSF?
• Jak tworzyć komponenty złożone?
• Jak nawiązywać połączenie z bazami danych i usługami zewnętrznymi?
JavaServer Faces (JSF) to technologia platformy Java EE, ułatwiająca projektowanie i tworzenie
interfejsów użytkownika aplikacji internetowych. Umożliwia sprawną pracę nad aplikacjami
działającymi po stronie serwera i wprowadzanie jasnego podziału na wizualną prezentację oraz
właściwą logikę aplikacji. Specyfikacja JSF 2.0 (inaczej niż poprzednia) jest pochodną wielu
rzeczywistych projektów open source. Dzięki temu sam framework jest dużo prostszy i lepiej
zintegrowany ze stosem technologii Java EE niż wersja JSF 1.0. Co więcej, jego specyfikacja
przewiduje teraz obsługę technologii takich, jak AJAX czy REST. Framework JSF 2.0 jest obecnie
jednym z najznamienitszych frameworków aplikacji internetowych tworzonych w Javie. Do jego
mocnych stron należą także: uproszczony model programowania poprzez zastosowanie adnotacji
i wprowadzenie zasady konwencji ponad konfiguracją oraz rozszerzalny model komponentów.
Książka „JavaServer Faces. Wydanie III” zawiera wszystko, czego trzeba do opanowania
rozbudowanych elementów frameworka JSF 2.0. Poznaj tajniki znaczników frameworka JSF oraz
obsługi zdarzeń. Dowiedz się, jak budować komponenty złożone, i naucz się implementować własne,
niestandardowe. Wykorzystaj w swoich aplikacjach technologię AJAX i opanuj nawiązywanie
połączeń z bazami danych czy innymi usługami zewnętrznymi. W ostatnim rozdziale znajdziesz
pomocne wskazówki na temat diagnozowania i rejestrowania zdarzeń, a także praktyczne
przykłady kodu, rozszerzające technologię JSF.
• Komponenty zarządzane
• Zasięg komponentów
• Nawigacja statyczna i dynamiczna
• Znaczniki standardowe
• Facelety
• Tabele danych
• Konwersja i weryfikacja danych
• Obsługa zdarzeń
• Komponenty złożone
• Technologia AJAX
• Usługi zewnętrzne
• 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 katalogów ................................................................................................ 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 komunikatów .................................................................................................... 50
Komunikaty obejmujce zmienne .............................................................................. 52
Konfigurowanie ustawie regionalnych aplikacji ......................................................... 53
Przykadowa aplikacja ................................................................................................... 54
Zasig komponentów .................................................................................................... 60
Zasig sesji ............................................................................................................ 61
4
JavaServer Faces
Zasig dania ....................................................................................................... 62
Zasig aplikacji ....................................................................................................... 63
Zasig konwersacji
........................................................................................... 63
Zasig widoku
.............................................................................................. 64
Zasigi niestandardowe
................................................................................. 65
Konfigurowanie komponentów ....................................................................................... 65
Wstrzykiwanie komponentów CDI
....................................................................... 65
Wstrzykiwanie komponentów zarzdzanych
..................................................... 66
Adnotacje cyklu ycia komponentu ............................................................................ 66
Konfigurowanie komponentów zarzdzanych na poziomie XML-a ................................. 67
Skadnia jzyka wyrae ................................................................................................ 72
Tryby l-wartoci i r-wartoci ....................................................................................... 72
Stosowanie nawiasów 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 wyników na identyfikatory widoków .................................................. 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 parametrów 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 widoków docelowych
............................................. 105
Podsumowanie .......................................................................................................... 105
Rozdzia 4. Znaczniki standardowe JSF ...............................................................................................107
Przegld podstawowych znaczników JSF ....................................................................... 108
Atrybuty, parametry i facety .................................................................................... 109
Przegld znaczników JSF reprezentujcych znaczniki HTML (JSF HTML) ........................... 110
Atrybuty wspólne ................................................................................................... 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 pól tekstowych .............................................. 130
Wywietlanie tekstu i obrazów ................................................................................ 133
Spis treci
5
Przyciski i cza .......................................................................................................... 136
Stosowanie przycisków .......................................................................................... 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 szablonów technologii Facelets .................................................................. 176
Budowanie stron na podstawie wspólnych szablonów .............................................. 179
Organizacja widoków ............................................................................................. 182
Dekoratory ........................................................................................................... 188
Parametry ............................................................................................................. 189
Znaczniki niestandardowe ........................................................................................... 190
Komponenty i fragmenty ........................................................................................ 192
Zakoczenie .............................................................................................................. 193
Znacznik <ui:debug> ............................................................................................. 193
Znacznik <ui:remove> ........................................................................................... 195
Obsuga znaków 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
Nagówki, 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 komórek tabeli ........................................................................................... 212
Usuwanie wierszy
........................................................................................ 215
Tabele bazy danych .................................................................................................... 218
Modele tabel ............................................................................................................. 222
Wywietlanie numerów wierszy ............................................................................... 222
Identyfikacja wybranego wiersza ............................................................................. 223
Sortowanie i filtrowanie ......................................................................................... 223
Techniki przewijania ................................................................................................... 230
Przewijanie z uyciem paska przewijania ................................................................. 230
Przewijanie za pomoc widgetów stronicowania ....................................................... 231
Podsumowanie .......................................................................................................... 232
Rozdzia 7. Konwersja i weryfikacja poprawnoci danych ............................................................... 233
Przegld procesu konwersji i weryfikacji poprawnoci .................................................... 233
Stosowanie konwerterów standardowych ...................................................................... 235
Konwersja liczb i dat ............................................................................................. 235
6
JavaServer Faces
Bdy konwersji ..................................................................................................... 239
Kompletny przykad konwertera .............................................................................. 244
Stosowanie standardowych mechanizmów weryfikujcych .............................................. 247
Weryfikacja dugoci acuchów i przedziaów liczbowych .......................................... 247
Weryfikacja wartoci wymaganych .......................................................................... 249
Wywietlanie komunikatów o bdach weryfikacji ..................................................... 250
Pomijanie procesu weryfikacji ................................................................................. 250
Kompletny przykad mechanizmu weryfikacji ............................................................ 252
Weryfikacja na poziomie komponentów Javy
....................................................... 254
Programowanie z wykorzystaniem niestandardowych konwerterów
i mechanizmów weryfikujcych .................................................................................. 259
Implementacja klas konwerterów niestandardowych ................................................. 259
Wskazywanie konwerterów
........................................................................... 262
Raportowanie bdów konwersji .............................................................................. 264
Uzyskiwanie dostpu do komunikatów o bdach
zapisanych w pakiecie komunikatów .................................................................... 265
Przykadowa aplikacja zbudowana na bazie konwertera niestandardowego ................. 269
Przekazywanie konwerterom atrybutów .................................................................... 272
Implementacja klas niestandardowych mechanizmów weryfikacji .............................. 273
Rejestrowanie wasnych mechanizmów weryfikacji ................................................... 274
Weryfikacja danych wejciowych za pomoc metod komponentów Javy ...................... 277
Weryfikacja relacji czcych wiele komponentów ..................................................... 277
Implementacja niestandardowych znaczników konwerterów i mechanizmów 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 komponentów wejciowych ............................................ 301
Stosowanie bezporednich komponentów 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 komponentów ............................................................................. 311
Podejmowanie decyzji przed wizualizacj widoku ...................................................... 312
Podsumowanie caego materiau w jednym miejscu ....................................................... 317
Podsumowanie .......................................................................................................... 324
Rozdzia 9. Komponenty zoone
............................................................................................... 325
Biblioteka znaczników komponentów zoonych ............................................................. 326
Stosowanie komponentów zoonych ........................................................................... 327
Implementowanie komponentów zoonych ................................................................... 329
Konfigurowanie komponentów zoonych ...................................................................... 330
Typy atrybutów ........................................................................................................... 331
Atrybuty wymagane i domylne wartoci atrybutów ........................................................ 332
Spis treci
7
Przetwarzanie danych po stronie serwera ..................................................................... 333
Lokalizacja komponentów zoonych ............................................................................ 336
Udostpnianie komponentów zoonych ....................................................................... 337
Udostpnianie róde akcji ..................................................................................... 339
Facety ....................................................................................................................... 341
Komponenty potomne ................................................................................................. 342
JavaScript .................................................................................................................. 343
Komponenty wspomagajce ........................................................................................ 348
Pakowanie komponentów 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 pól przy uyciu technologii Ajax ................................................................... 368
Monitorowanie da technologii Ajax .......................................................................... 369
Przestrzenie nazw JavaScriptu ..................................................................................... 372
Obsuga bdów technologii Ajax .................................................................................. 373
Odpowiedzi technologii Ajax ........................................................................................ 374
Biblioteka JavaScriptu frameworku JSF 2.0 .................................................................. 375
Przekazywanie dodatkowych parametrów 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 znaczników ......................................................... 394
Dekodowanie: przetwarzanie wartoci dania .............................................................. 397
Deskryptor biblioteki znaczników
....................................................................... 403
Stosowanie zewntrznych mechanizmów wizualizacji ..................................................... 406
Przetwarzanie atrybutów 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 komponentów i facet potomnych ............................................................... 424
Przetwarzanie znaczników potomnych typu SelectItem .............................................. 427
Przetwarzanie facet ............................................................................................... 428
Stosowanie pól ukrytych ........................................................................................ 429
Zapisywanie i przywracanie stanu ................................................................................ 435
Czciowe zapisywanie stanu
...................................................................... 436
Konstruowanie komponentów technologii Ajax
...................................................... 439
Implementacja autonomicznej funkcji Ajax w ramach komponentu niestandardowego ....... 441
Obsuga znacznika f:ajax w komponentach niestandardowych ................................... 445
Podsumowanie .......................................................................................................... 450
8
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 wycieków pocze ............................................................................ 453
Stosowanie gotowych wyrae ................................................................................ 455
Transakcje ........................................................................................................... 456
Uywanie bazy danych Derby .................................................................................. 457
Konfigurowanie róda danych ..................................................................................... 459
Uzyskiwanie dostpu do zasobów zarzdzanych przez kontener ................................ 459
Konfigurowanie zasobów baz danych w ramach serwera GlassFish ............................ 460
Konfigurowanie zasobów baz danych w ramach serwera Tomcat ............................... 460
Kompletny przykad uycia bazy danych ................................................................... 462
Stosowanie architektury JPA ........................................................................................ 470
Krótki kurs architektury JPA ................................................................................... 470
Stosowanie architektury JPA w aplikacjach internetowych ......................................... 472
Stosowanie komponentów zarzdzanych i bezstanowych komponentów 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 komponentów? ......................................................... 505
Jak zaimplementowa obsug wysyania plików na serwer? .......................................... 506
Jak wywietla map obrazów? ................................................................................... 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 której 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 krótkim rozdziale omówimy sposób konfigurowania regu nawigacji w ramach budo-
wanej aplikacji internetowej. W szczególnoci 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 której uytkownik aplikacji internetowej wypenia formu-
larz 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 prze-
kazywane na serwer.
Aplikacja internetowa analizuje wówczas dane wpisane przez uytkownika i na ich podsta-
wie decyduje, której strony JSF naley uy do wizualizacji odpowiedzi. Za wybór 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 przed-
stawiono 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). Wrócimy do tematu
wyniku w punkcie „Odwzorowywanie wyników na identyfikatory widoków” w nastpnym
podrozdziale — okazuje si, e wynik mona opcjonalnie odwzorowywa na identyfikatory
widoków. 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 wyników na identyfikatory widoków s opcjonalne, poczw-
szy 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 przycisków, ale
take od danych wejciowych wpisywanych przez uytkownika. Na przykad wysyajc dane
ze strony logowania (zwykle nazw uytkownika i haso), moemy oczekiwa dwóch odpo-
wiedzi 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 zwi-
za z wyraeniem odwoujcym si do metody:
<h:commandButton label="Zaloguj" action="#{loginController.verifyUser}"/>
W naszym przypadku wyraz
loginController
odwouje si do komponentu pewnej klasy,
która musi definiowa metod nazwan
verifyUser
.
Wyraenie odwoujce si do metody, które przypisujemy atrybutowi
action
, nie otrzymuje
adnych parametrów, ale moe zwraca warto jakiego typu. Zwracana warto jest konwer-
towana na acuch za pomoc wywoania metody
toString
.
Rozdzia 3.
Q
Nawigacja
83
W standardzie JSF 1.1 metody bdce przedmiotem odwoa w tego rodzaju wyra-
eniach musiay zwraca wartoci typu
String. W technologii JSF 1.2 zwracana
warto moe by obiektem dowolnego typu. Taka moliwo jest szczególnie wana
w przypadku typów wyliczeniowych, poniewa eliminuje ryzyko przeoczenia literówek
w nazwach akcji (wychwytywanych przez kompilator).
Przykad metody akcji przedstawiono poniej:
String verifyUser() {
if (...)
return "success";
else
return "failure";
}
Powysza metoda zwraca jeden z dwóch acuchów wynikowych:
"success"
lub
"failure"
.
Na podstawie tej wartoci identyfikuje si nastpny widok.
Metoda akcji moe zwróci warto
null, aby zasygnalizowa konieczno ponow-
nego wywietlenia tej samej strony. W takim przypadku zasig widoku (który omówi-
limy w rozdziale 2.) jest zachowywany. Kady wynik inny ni
null powoduje wyczysz-
czenie tego zasigu, nawet jeli widok wynikowy jest taki sam jak widok biecy.
Krótko mówic, za kadym razem, gdy uytkownik klika przycisk polecenia, dla którego
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 wszyst-
kie dane potrzebne do podejmowania waciwych decyzji.
Odwzorowywanie wyników na identyfikatory widoków
Jednym z najwaniejszych celów 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 wyników logicznych,
na przykad
success
i
failure
, na waciwe strony internetowe.
Takie odwzorowanie mona zdefiniowa, dodajc wpisy
navigation-rule
do pliku faces-
config.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 uytkow-
nika na stron /welcome.xhtml.
acuchy identyfikatorów widoków rozpoczynaj si od prawego ukonika (/). Jeli
programista stosuje odwzorowania rozszerze (na przykad przyrostka .faces), roz-
szerzenia musz odpowiada rozszerzeniom plików (na przykad .xhtml), nie rozszerze-
niom adresów URL.
Jeli programista odpowiednio dobierze acuchy wyników, bdzie móg zebra wiele regu
nawigacji w jednym miejscu. Programista moe na przykad stworzy jedn regu dla
wszystkich przycisków 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
from-
´
view-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 ogóle nie s potrzebne.
Kiedy jednak budowane aplikacje staj si coraz bardziej zoone, warto stosowa
wyniki logiczne w ramach komponentów zarzdzanych oraz reguy nawigacji odwzorowu-
jce te wyniki na widoki docelowe.
Rozdzia 3.
Q
Nawigacja
85
Aplikacja JavaQuiz
W tym punkcie umiecimy zapisy dotyczce nawigacji w przykadowym programie prezen-
tujcym uytkownikowi sekwencj pyta quizu (patrz rysunek 3.1).
Rysunek 3.1.
Pytanie quizu
Kiedy uytkownik klika przycisk Sprawd odpowied, aplikacja sprawdza, czy podana odpo-
wied jest prawidowa. Jeli nie, uytkownik otrzymuje jeszcze jedn szans rozwizania tego
samego problemu (patrz rysunek 3.2).
Rysunek 3.2.
Jedna bdna
odpowied
— spróbuj
ponownie
Po dwóch 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 pod-
sumowania z uzyskan liczb punktów i propozycj ponownego przystpienia do quizu (patrz
rysunek 3.4).
86
JavaServer Faces
Rysunek 3.3.
Dwie bdne
odpowiedzi
— kontynuuj
Rysunek 3.4.
Quiz zakoczony
— punktacja
Nasza aplikacja skada si z dwóch 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.
Q
Nawigacja
87
13.
14. public String getQuestion() { return question; }
15.
16. public String getAnswer() { return answer; }
17.
18. // naley przykry t metod bardziej wyszukanym kodem sprawdzajcym
19. public boolean isCorrect(String response) {
20. return response.trim().equalsIgnoreCase(answer);
21. }
22. }
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. package com.corejsf;
2.
3. import java.io.Serializable;
4.
5. import java.util.ArrayList;
6. import java.util.Arrays;
7. import java.util.Collections;
8.
9. import javax.inject.Named;
10. // lub import javax.faces.bean.ManagedBean;
11. import javax.enterprise.context.SessionScoped;
12. // lub import javax.faces.bean.SessionScoped;
13.
14. @Named // lub @ManagedBean
15. @SessionScoped
16. public class QuizBean implements Serializable {
17. private int currentProblem;
18. private int tries;
19. private int score;
20. private String response = "";
21. private String correctAnswer;
22.
23. // Poniej zakodowano problemy na stae. W rzeczywistej aplikacji
24. // najprawdopodobniej odczytywalibymy je z bazy danych.
25. private ArrayList<Problem> problems = new ArrayList<Problem>(Arrays.asList(
26. new Problem(
27. "Jaki slogan reklamowa programowanie w Javie? Write once, ...",
28. "run anywhere"),
29. new Problem(
30. "Jak wygldaj 4 pierwsze bajty kadego pliku klasy (szesnastkowo)?",
31. "CAFEBABE"),
32. new Problem(
33. "Co zostanie wywietlone przez to wyraenie? System.out.println(1+\"2\");",
34. "12"),
35. new Problem(
36. "Które sowo kluczowe Javy suy do definiowania podklasy?",
37. "extends"),
38. new Problem(
39. "Jak brzmiaa oryginalna nazwa jzyka programowania Java?",
40. "Oak"),
88
JavaServer Faces
41. new Problem(
42. "Która 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 dziaa-
niach uytkownika i moe bez trudu okreli, która strona powinna by wywietlona jako
nastpna.
Logik nawigacji zaimplementowano w metodzie
answerAction
klasy
QuizBean
. Metoda
answerAction
zwraca jeden z kilku moliwych acuchów:
"success"
lub
"done"
(jeli uyt-
kownik 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.
Q
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 katalogów naszej aplikacji. Na listingu 3.3 przed-
stawiono kod strony gównej aplikacji quizu: index.xhtml. Kodem stron success.xhtml i failure.
xhtml nie bdziemy si zajmowa, poniewa róni si od kodu strony index.xhtml tylko
komunikatem wywietlanym w górnej czci.
Rysunek 3.5.
Struktura
katalogów
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, której kod przedstawiono na listingu 3.4, prezentuje uytkownikowi
ostateczny wynik i zachca go do ponownej gry. Warto zwróci 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
powrót na stron index.xhtml. Okazuje si jednak, e element definiujcy ten przycisk wyko-
rzystuje wyraenie odwoujce si do metody:
<h:commandButton value="#{msgs.startOver}" action="#{quizBean.startOverAction}"/>
Listing 3.4. Zawarto pliku javaquiz/web/done.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:f="http://java.sun.com/jsf/core"
6. xmlns:h="http://java.sun.com/jsf/html">
7. <h:head>
8. <title>#{msgs.title}</title>
9. </h:head>
10. <h:body>
11. <h:form>
12. <p>
13. #{msgs.thankYou}
14. <h:outputFormat value="#{msgs.score}">
15. <f:param value="#{quizBean.score}"/>
16. </h:outputFormat>
17. </p>
18. <p>
19. <h:commandButton value="#{msgs.startOver}"
20. action="#{quizBean.startOverAction}"/>
21. </p>
22. </h:form>
23. </h:body>
24. </html>
Metoda
startOverAction
wykonuje wszelkie dziaania niezbdne do przywrócenia oryginal-
nego stanu gry. Dziaanie tej metody polega na przypadkowym uporzdkowaniu pyta i wyze-
rowaniu wyniku:
public String startOverAction() {
Collections.shuffle(problems);
currentProblem = 0;
Rozdzia 3.
Q
Nawigacja
91
score = 0;
tries = 0;
response = "";
return "startOver";
}
Ogólnie metody akcji peni dwie funkcje:
Q
aktualizuj model w reakcji na dziaania podejmowane przez uytkownika;
Q
sygnalizuj mechanizmowi nawigacji konieczno skierowania uytkownika
w okrelone miejsce.
Podczas lektury rozdziau 8. Czytelnicy przekonaj si, e istnieje moliwo do-
czania do przycisków take obiektów 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 przechodze-
nia 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 sporód naszych wyników (
"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
, który pocztkowo kieruje uyt-
kownika 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 uwzgld-
niana w sytuacji, gdy biec stron nie jest /again.xhtml.
Rozdzia 3.
Q
Nawigacja
93
I wreszcie na listingu 3.6 pokazano acuchy komunikatów.
Listing 3.6. Zawarto pliku javaquiz/src/java/com/corejsf/messages.properties
1. title=Dziecinnie prosty quiz o Javie
2. checkAnswer=Sprawd odpowied
3. startOver=Rozpocznij od nowa
4. correct=Gratulacje, prawidowa odpowied.
5. notCorrect=Przykro nam, Twoja odpowied jest bdna. Spróbuj ponownie!
6. stillNotCorrect=Przykro nam, take tym razem podae bdn odpowied.
7. correctAnswer=Prawidowa odpowied: {0}.
8. score=Twój wynik punktowy: {0}.
9. nextProblem=A oto nastpne pytanie.
10. 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 powtórzenia caego cyklu komuni-
kacji 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 aktualizujce adres URL w przegldarce
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 komponen-
tów 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, który mona wypeni
podczas obsugi jednego dania i uy w ramach kolejnego dania. (Koncepcj obiektu flash
Rozdzia 3.
Q
Nawigacja
95
zaczerpnito z frameworku internetowego Ruby on Rails). Typowym zastosowaniem obiektów
flash s komunikaty. Na przykad metoda obsugujca przycisk moe umieci jaki komu-
nikat 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 przetwarza-
nia 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 kompo-
nentem 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 da-
nie
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 sposób. Wyobramy
sobie na przykad sytuacj, w której uytkownik przeglda katalog sklepu internetowego,
klikajc cza do kolejnych produktów. Poza wyborem klikanych czy trudno w tym przy-
padku mówi o jakichkolwiek danych wejciowych uytkownika. cza powinny zapew-
nia moliwo stosowania zakadek (ang. bookmarkable), aby uytkownik móg wróci
na t sam stron po wpisaniu tego samego adresu URL. Co wicej, strony powinny by przy-
stosowane 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 twórców. Na potrzeby operacji wyszukiwania naley stosowa
dania
GET
. dania
PUT
,
POST
i
DELETE
powinny by wykorzystywane odpowiednio do two-
rzenia, 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 rezultatów 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 wysa-
nie spowoduje dodanie dwóch takich samych towarów 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 przetwa-
rzania tzw. dobrych adresów URL, jednak poczwszy od wersji JSF 2.0, moemy liczy
na obsug da
GET
. Omówimy ten aspekt w kolejnych punktach tego podrozdziau.
Parametry widoku
Przeanalizujmy teraz danie
GET
, które ma spowodowa wywietlenie informacji o konkret-
nym 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. Progra-
mista moe uy do tego celu parametrów 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.
Q
Nawigacja
97
Strona JSF moe zawiera dowoln liczb parametrów widoku. Jak wszystkie parametry da-
nia, parametry widoku mona konwertowa i sprawdza pod ktem poprawnoci. (Zagad-
nienia zwizane z konwersj i weryfikacj zostan szczegóowo omówione w rozdziale 7.).
Czsto niezbdne jest uzyskiwanie dodatkowych danych ju po ustawieniu parametrów widoku.
Na przykad po ustawieniu parametru widoku
item
moe zaistnie potrzeba uzyskania wa-
ciwoci tego produktu z bazy danych, aby wygenerowa stron opisujc ten produkt. W roz-
dziale 8. omówimy sposób implementacji tego rodzaju mechanizmów w ramach metody
obsugujcej zdarzenie
preRenderView
.
cza da GET
W poprzednim punkcie omówilimy sposób 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, których klikanie generuje wanie dania
GET
.
Przyciski i cza tego typu mona definiowa odpowiednio za pomoc znaczników
h:button
i
h:link
. (Do definiowania przycisków i czy generujcych dania
POST
su odpowiednio
znaczniki
h:commandButton
i
h:commandLink
).
Programista powinien mie kontrol nad identyfikatorami widoków docelowych i parame-
trami zapyta tego rodzaju da. Identyfikator widoku docelowego mona okreli za pored-
nictwem 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 zwróci acuch
wyniku, który trafia do mechanizmu obsugi nawigacji, gdzie jest przetwarzany w tradycyjny
sposób w celu okrelenia identyfikatora widoku docelowego.
Istnieje zasadnicza rónica 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 nato-
miast przetwarzany dopiero po klikniciu przycisku polecenia przez uytkownika. Wanie
dlatego w specyfikacji JSF mona spotka termin nawigacji wyprzedzajcej (ang. preemp-
tive navigation) stosowany w kontekcie wyznaczania identyfikatorów widoków docelowych
dla da
GET
.
Wyraenie jzyka wyrae (EL) przypisane atrybutowi
outcome jest wyraeniem
reprezentujcym warto, nie wyraeniem odwoujcym si do metody. Ogólnie,
akcja skojarzona z przyciskiem polecenia moe w ten czy inny sposób 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 parametrów dania
Czsto stajemy przed koniecznoci doczania parametrów do czy da
GET
. Takie para-
metry mog pochodzi z trzech rónych róde:
Q
acucha wyniku,
Q
parametrów widoku,
Q
zagniedonych znaczników
f:param
.
Jeli ten sam parametr zostanie okrelony wicej ni raz, pierwszestwo ma warto zdefinio-
wana przez póniejsze ródo z poniszej listy (najwyszy priorytet maj wic zagniedone
znaczniki
f:param
).
Przeanalizujmy teraz szczegóy 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 identy-
fikator widoku docelowego i dopisuje wyodrbnione wczeniej parametry do tego identyfika-
tora. Oznacza to, e w tym przypadku identyfikatorem widoku docelowego bdzie /index.
xhtml?q=1.
W razie zdefiniowania wielu parametrów koniecznie naley zastpi separator
&
odpowiedni
sekwencj specjaln (ucieczki):
<h:link outcome="index?q=1&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 skrócony umoliwiajcy wczenie wszystkich parametrów
widoku do jednego acucha zapytania. Wystarczy doda do znacznika
h:link
nastpujcy
atrybut:
<h:link outcome="index" includeViewParams="true" value="Skip">
W ten sposób 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.
Q
Nawigacja
99
Moliwo wczania parametrów widoku znacznie uatwia take definiowanie czy prze-
kierowa, które take maj posta da
GET
. Zamiast jednak ustawia atrybut w znaczniku,
naley doda odpowiedni parametr do wyniku:
<h:commandLink action="index?faces-redirect=true&includeViewParams=true"
value="Skip"/>
danie w tej formie nie uwzgldnia jednak zagniedonych znaczników
f:param
.
Jeli reguy nawigacji s definiowane w pliku konfiguracyjnym w formacie XML, naley
uy atrybutu
include-viewparams
i zagniedonych znaczników
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 powy-
szej konstrukcji skadniowej. Czytelnik powinien je traktowa raczej jako rodek do pod-
niesienia poziomu czujnoci i — tym samym — udoskonalenia swoich umiejtnoci progra-
mistycznych.
Dodanie czy umoliwiajcych stosowanie zakadek do aplikacji quizu
Wrómy na chwil do aplikacji quizu, któr omówilimy we wczeniejszej czci tego roz-
dziau (przy okazji demonstrowania zasad nawigacji). Czy mona t aplikacj w wikszym
stopniu dostosowa do wymogów architektury REST?
danie
GET
nie byoby waciwym sposobem wysyania odpowiedzi, poniewa w tym kontek-
cie nie spenia warunku idempotentnoci. Wysanie odpowiedzi modyfikuje wynik uyt-
kownika. 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 umoli-
wiajce 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 sposób:
<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 wróci 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 punktów za
wicej ni jedn odpowied na to samo pytanie.
Listing 3.7. Zawarto pliku javaquiz-rest/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:f="http://java.sun.com/jsf/core"
6. xmlns:h="http://java.sun.com/jsf/html">
7. <f:metadata>
8. <f:viewParam name="q" value="#{quizBean.currentProblem}"/>
9. </f:metadata>
10. <h:head>
11. <title>#{msgs.title}</title>
12. </h:head>
13. <h:body>
14. <h:form>
15. <p>#{quizBean.question}</p>
16. <p><h:inputText value="#{quizBean.response}"/></p>
Rozdzia 3.
Q
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. package com.corejsf;
2.
3. import java.io.Serializable;
4.
5. import java.util.ArrayList;
6. import java.util.Arrays;
7. import java.util.Collections;
8. import javax.inject.Named;
9. // lub import javax.faces.bean.ManagedBean;
10. import javax.enterprise.context.SessionScoped;
11. // lub import javax.faces.bean.SessionScoped;
12.
13. @Named // lub @ManagedBean
14. @SessionScoped
15. public class QuizBean implements Serializable {
16. private int currentProblem;
17. private int tries;
18. private String response = "";
19. private String correctAnswer;
20.
21. // Poniej zakodowano problemy na stae. W rzeczywistej aplikacji
22. // najprawdopodobniej odczytywalibymy je z bazy danych.
23. private ArrayList<Problem> problems = new ArrayList<Problem>(Arrays.asList(
24. new Problem(
25. "Jaki slogan reklamowa programowanie w Javie? Write once, ...",
26. "run anywhere"),
27. new Problem(
28. "Jak wygldaj 4 pierwsze bajty kadego pliku klasy (szesnastkowo)?",
29. "CAFEBABE"),
30. new Problem(
31. "Co zostanie wywietlone przez to wyraenie? System.out.println(1+\"2\");",
32. "12"),
33. new Problem(
34. "Które sowo kluczowe Javy suy do definiowania podklasy?",
35. "extends"),
36. new Problem(
37. "Jak brzmiaa oryginalna nazwa jzyka programowania Java?",
38. "Oak"),
39. new Problem(
40. "Która klasa pakietu java.util opisuje punkt w czasie?",
41. "Date")));
42.
43. private int[] scores = new int[problems.size()];
44.
45. public String getQuestion() {
46. return problems.get(currentProblem).getQuestion();
102
JavaServer Faces
47. }
48.
49. public String getAnswer() { return correctAnswer; }
50.
51. public int getScore() {
52. int score = 0;
53. for (int s : scores) score += s;
54. return score;
55. }
56.
57. public String getResponse() { return response; }
58. public void setResponse(String newValue) { response = newValue; }
59.
60. public int getCurrentProblem() { return currentProblem; }
61. public void setCurrentProblem(int newValue) { currentProblem = newValue; }
62.
63. public String getSkipOutcome() {
64. if (currentProblem < problems.size() - 1) return "index";
65. else return "done";
66. }
67.
68. public String answerAction() {
69. tries++;
70. if (problems.get(currentProblem).isCorrect(response)) {
71. scores[currentProblem] = 1;
72. nextProblem();
73. if (currentProblem == problems.size()) return "done";
74. else return "success";
75. }
76. else {
77. scores[currentProblem] = 0;
78. if (tries == 1) return "again";
79. else {
80. nextProblem();
81. if (currentProblem == problems.size()) return "done";
82. else return "failure";
83. }
84. }
85. }
86.
87. public String startOverAction() {
88. Collections.shuffle(problems);
89. currentProblem = 0;
90. for (int i = 0; i < scores.length; i++)
91. scores[i] = 0;
92. tries = 0;
93. response = "";
94. return "startOver";
95. }
96.
97. private void nextProblem() {
98. correctAnswer = problems.get(currentProblem).getAnswer();
99. currentProblem++;
100. tries = 0;
101. response = "";
102. }
103. }
Rozdzia 3.
Q
Nawigacja
103
Zaawansowane techniki nawigacji
Techniki opisane w poprzednich podrozdziaach powinny w zupenoci wystarczy do imple-
mentacji mechanizmów nawigacji w wikszoci aplikacji. W niniejszym podrozdziale skon-
centrujemy si na pozostaych reguach, które mona konfigurowa za porednictwem elemen-
tów nawigacji w pliku faces-config.xml. Diagram skadni tych elementów przedstawiono na
rysunku 3.9.
Rysunek 3.9. Diagram skadni elementów nawigacji
Z lektury podrozdziau „Konfigurowanie komponentów” 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 elementów
description
,
display-name
i
icon
. Wymienione elementy w zaoeniu maj by stosowane na poziomie narzdzi do
wizualnego projektowania interfejsów, zatem nie bdziemy ich poddawa szczegóowej
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 (
*
), który musi si znaj-
dowa na kocu acucha identyfikatora.
Jeli bdzie istniao wiele dopasowa do wzorca zdefiniowanego z uyciem symbolu wielo-
znacznego, zostanie wykorzystane dopasowanie najdusze.
Zamiast rezygnowa z elementu
from-view-id, mona zastosowa jedn z dwóch
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 której ograniczalimy si
w naszych dotychczasowych przykadach. Oprócz elementu
from-outcome
mamy do dyspozycji
take element
from-action
. Taka elastyczno okazuje si szczególnie 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 zwrócony
przez metod
answerAction
. Do rozrónienia obu przypadków (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.
Q
Nawigacja
105
Mechanizm odpowiedzialny za nawigacj nie wywouje metody otoczonej konstruk-
cj
#{...}. Odpowiednia metoda jest wywoywana, zanim jeszcze wspomniany me-
chanizm przystpuje do pracy. W tej sytuacji mechanizm nawigacji ogranicza si do wyko-
rzystania acucha zdefiniowanego w elemencie
from-action w roli klucza umoliwiaj-
cego odnalezienie pasujcego przypadku.
Warunkowe przypadki nawigacji
W wersji JSF 2.0 wprowadzono dodatkowy element
if
, który umoliwia aktywowanie przy-
padku 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 widoków 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 omówilimy wszystkie elementy technologii JavaServer Faces w zakresie
zarzdzania nawigacj. Naley pamita, e nawigacja w najprostszej formie jest wyjtkowo
atwa do zaimplementowania — akcje przycisków 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 komponen-
tach frameworku JSF.