JavaServer Faces Wydanie III javfa3

background image
background image

Idź do

• Spis treści
• Przykładowy rozdział

• Katalog online

• Dodaj do koszyka

• Zamów cennik

• Zamów informacje

o nowościach

• Fragmenty książek

online

Helion SA

ul. Kościuszki 1c

44-100 Gliwice

tel. 32 230 98 63

e-mail: helion@helion.pl

© Helion 1991–2011

Katalog książek

Twój koszyk

Cennik i informacje

Czytelnia

Kontakt

• Zamów drukowany

katalog

JavaServer Faces.
Wydanie III

Autorzy:

David Geary

,

Cay S. Horstmann

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

.

background image

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:

background image

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.

background image

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).

background image

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. }

background image

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"),

background image

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).

background image

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>

background image

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;

background image

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>

background image

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.

background image

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>

background image

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

background image

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

background image

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

.

background image

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.

background image

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&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 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>

background image

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&amp;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:

background image

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>

background image

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();

background image

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. }

background image

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.

background image

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>

background image

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.

background image

Wyszukiwarka

Podobne podstrony:
JavaServer Faces Wydanie III 2
JavaServer Faces Wydanie III
JavaServer Faces Wydanie II javfac
Giełda Podstawy inwestowania Wydanie III zaktualizowane
C cwiczenia Wydanie III cwcsh3
opengl ksiega eksperta wydanie iii UZFSAM5UH2NWETWCPGG2PS3RHAX75LU5XCNZJJI
PHP, MySQL i Apache dla kazdego Wydanie III
Helion Linux Komendy i polecenia Wydanie III
BIOS Leksykon kieszonkowy Wydanie III biosl3
PHP Programowanie Wydanie III
Oracle latwiejszy niz przypuszczasz Wydanie III oracl3
Ksiazka o fotografowaniu Wydanie III rozszerzone
JavaServer Faces i Eclipse Galileo Tworzenie aplikacji WWW

więcej podobnych podstron