JavaServer Faces i Eclipse Galileo Tworzenie aplikacji WWW

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–2010

Katalog książek

Twój koszyk

Cennik i informacje

Czytelnia

Kontakt

• Zamów drukowany

katalog

JavaServer Faces i Eclipse
Galileo. Tworzenie
aplikacji WWW

Autor: Andrzej Marciniak
ISBN: 978-83-246-2656-4
Format: 158×235, stron: 384

• Jak projektować estetyczne i wygodne interfejsy użytkownika aplikacji WWW?
• Od czego zacząć projekt wykorzystujący JavaServer Faces?
• Co oferuje środowisko Eclipse Galileo, a co narzędzia Web Tools Platform?

Dobry interfejs aplikacji WWW to połowa jej sukcesu. Osiągnij go z JavaServer Faces! Język Java
od lat zdobywa i ugruntowuje swoją popularność wśród programistów i twórców aplikacji WWW,
a rozmaite platformy i rozwiązania, w których jest on wykorzystywany, zostały na stałe włączone
do pakietu narzędzi stosowanych przez wielu z nich na co dzień. Jednym z najbardziej popularnych
tego typu narzędzi jest JavaServer Faces. Można dzięki niemu w prosty sposób tworzyć interfejsy
użytkownika aplikacji, wykorzystujące platformę Java EE. Ten spójny i kompletny szkielet
programistyczny jest obecnie najbardziej elastycznym, najlepiej dopracowanym i najprostszym
w użyciu rozwiązaniem, opartym na technologii serwletów.

Jednak „najprostszy” wcale nie musi oznaczać „prosty”, o czym z pewnością miało okazję
przekonać się wielu studentów kierunków informatycznych i profesjonalnych programistów,
którzy postanowili praktycznie zapoznać się z możliwościami tej technologii. Nieocenioną
pomocą okaże się dla nich książka „JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW”,
dzięki której można uniknąć wielu typowych błędów i nauczyć się biegle korzystać z JSF,
zdobywając przy tym kompletną wiedzę na temat mechanizmów i rozwiązań zapewniających
działanie tej platformy. Co więcej, opisano tu nie tylko samą technologię, lecz również sposób jej
praktycznego wykorzystania w konkretnych projektach, co w przyszłości zaowocuje z pewnością
opracowaniem niejednej doskonałej i cieszącej oko aplikacji WWW.

• Mechanizmy działania aplikacji WWW i sposoby ich projektowania w oparciu o język Java
• Podstawowe informacje na temat szkieletu programistycznego JSF
• Realizacja praktycznego projektu z wykorzystaniem JavaServer Faces
• Rozszerzanie standardowej implementacji JSF i tworzenie niestandardowych interfejsów

użytkownika

• Opis środowiska programistycznego Eclipse Galileo oraz pakietu narzędzi Web Tools

Platform

Naucz się szybko i sprawnie tworzyć rozbudowane interfejsy użytkownika aplikacji

WWW za pomocą szkieletu programistycznego JavaServer Faces

background image

Spis treci

Wstp .............................................................................................. 7

Geneza ksiki .................................................................................................................. 7
Cele .................................................................................................................................. 9
Czytelnicy ....................................................................................................................... 10
Ukad zagadnie ............................................................................................................. 10
Materiay pomocnicze .................................................................................................... 11
Podzikowania ................................................................................................................ 12

Rozdzia 1. Przed przystpieniem do pracy z JSF ............................................... 13

1.1. Dlaczego JSF? ......................................................................................................... 13

1.1.1. Wersje JSF ................................................................................................... 15

1.2. JSF i Java EE (J2EE) ............................................................................................... 17

1.2.1. Serwlety i strony JSP ................................................................................... 19
1.2.2. Technologie prezentacji ............................................................................... 23
1.2.3. MVC w aplikacjach webowych ................................................................... 27
1.2.4. Implementacja MVC w JSF ......................................................................... 32
1.2.5. Kluczowe elementy JSF — podsumowanie ................................................. 38

1.3. Pierwsza aplikacja JSF w rodowisku Eclipse ......................................................... 38

1.3.1. Instalacja kontenera serwletów .................................................................... 40
1.3.2. Instalacja rodowiska Eclipse Galileo .......................................................... 40
1.3.3. Integracja kontenera serwletów ze rodowiskiem Eclipse ........................... 43
1.3.4. Tworzenie projektu JSF ............................................................................... 44
1.3.5. Praca z JSF w oknie roboczym .................................................................... 48
1.3.6. Definiowanie modelu ................................................................................... 53
1.3.7. Definiowanie komponentu wspierajcego ................................................... 54
1.3.8. Utworzenie strony do wprowadzania danych ............................................... 56
1.3.9. Utworzenie strony do wywietlania wyniku ................................................ 59
1.3.10. Deklarowanie regu nawigacji .................................................................... 62
1.3.11. Uruchamianie aplikacji .............................................................................. 63
1.3.12. Podsumowanie przykadu .......................................................................... 65

Rozdzia 2. Planowanie, modelowanie i projektowanie aplikacji JSF

na platformie Java EE ..................................................................... 67

2.1. Modelowanie interfejsu uytkownika przy wykorzystaniu techniki scenopisu ....... 68

2.1.1. Przypadki uycia .......................................................................................... 69
2.1.2. Model ekranów interfejsu uytkownika ....................................................... 70
2.1.3. Model nawigacji .......................................................................................... 72
2.1.4. Prototypy ekranów ....................................................................................... 73
2.1.5. Diagram maszyny stanowej ......................................................................... 75

background image

4

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

2.2. Warstwa biznesowa ................................................................................................. 77

2.2.1. Rola i elementy warstwy biznesowej ........................................................... 77
2.2.2. Interfejs do warstwy trwaoci danych ......................................................... 85

2.3. Organizacja kodu aplikacji w Eclipse ...................................................................... 95

2.3.1. Projekty i moduy Java EE w Eclipse .......................................................... 95
2.3.2. Zastosowanie projektu uytkowego

do przechowywania kodu warstwy biznesowej .......................................... 96

2.3.3. Moduy zalene ............................................................................................ 99

Rozdzia 3. Uywanie JSF ............................................................................... 101

3.1. Komponenty zarzdzane ........................................................................................ 101

3.1.1. Deklaracja komponentu ............................................................................. 102
3.1.2. Zasig komponentów ................................................................................. 105
3.1.3. Inicjalizacja waciwoci komponentów .................................................... 106
3.1.4. Odwoania do komponentów zarzdzanych ............................................... 113
3.1.5. Komponenty referowane ............................................................................ 115
3.1.6. Komponenty wspierajce ........................................................................... 116
3.1.7. Jzyk wyrae UEL ................................................................................... 118
3.1.8. Konfiguracja komponentów i innych zasobów .......................................... 123

3.2. Obsuga zdarze .................................................................................................... 127

3.2.1. Typy zdarze i metody ich obsugi ............................................................ 127
3.2.2. Natychmiastowe wykonywanie metod obsugi zdarze ............................. 136
3.2.3. Parametryzacja komponentów UI .............................................................. 137

3.3. Nawigacja .............................................................................................................. 140

3.3.1. Definiowanie regu nawigacji .................................................................... 140
3.3.2. Nawigacja statyczna i dynamiczna ............................................................ 143
3.3.3. Rozstrzyganie niejednoznacznoci w reguach .......................................... 144
3.3.4. Przekierowanie i nawigacja poza JSF ........................................................ 144

3.4. Przetwarzanie pakietów zasobów i internacjonalizacja ......................................... 146

3.4.1. Lokalizatory ............................................................................................... 147
3.4.2. Pakiety zasobów ........................................................................................ 150
3.4.3. Pakiety komunikatów ................................................................................. 154
3.4.4. Internacjonalizacja w warstwie biznesowej ............................................... 157

3.5. Konwersja .............................................................................................................. 159

3.5.1. Standardowe konwertery ............................................................................ 159
3.5.2. Obsuga bdów konwersji ......................................................................... 162

3.6. Walidacja ............................................................................................................... 164

3.6.1. Implementacja metod walidacji ................................................................. 165
3.6.2. Standardowe walidatory ............................................................................. 168
3.6.3. Kombinowanie rónych walidatorów ........................................................ 168
3.6.4. Wymuszanie wprowadzania danych .......................................................... 169
3.6.5. Pomijanie weryfikacji ................................................................................ 169

3.7. Standardowe znaczniki i komponenty UI .............................................................. 169

3.7.1. Komponenty i znaczniki biblioteki html .................................................... 170
3.7.2. Komponenty i znaczniki biblioteki core .................................................... 201

Rozdzia 4. Dopasowywanie JSF ..................................................................... 211

4.1. Przetwarzanie da .............................................................................................. 211

4.1.1. Scenariusze obsugi da ......................................................................... 211
4.1.2. Standardowy cykl przetwarzania dania JSF ........................................... 214
4.1.3. Kolejka zdarze ......................................................................................... 225
4.1.4. Kolejka komunikatów ................................................................................ 228

4.2. Konfigurowanie i rozszerzanie standardowej implementacji ................................. 229

4.2.1. Infrastruktura aplikacji JSF ........................................................................ 229
4.2.2. Mechanizm nawigacji ................................................................................ 238

background image

Spis treci

5

4.2.3. Mechanizm zarzdzania widokami ............................................................ 238
4.2.4. Mechanizm zarzdzania stanem ................................................................. 239
4.2.5. Mechanizm przetwarzania wyrae EL ..................................................... 239
4.2.6. Mechanizm obsugi akcji ........................................................................... 243

4.3. Model komponentów ............................................................................................. 243

4.3.1. Struktura klas ............................................................................................. 244
4.3.2. Identyfikatory komponentów ..................................................................... 251

4.4. Praktyczne zastosowania obiektów PhaseListener ................................................ 255

4.4.1. Wzorzec POST-Redirect-GET ................................................................... 256
4.4.2. Generowanie danych binarnych ................................................................. 258

4.5. Zoone tabele ....................................................................................................... 260

4.5.1. Modele danych ........................................................................................... 260
4.5.2. Przykad tabeli interaktywnej ..................................................................... 261

4.6. JSF i bezpieczestwo ............................................................................................. 264

4.6.1. Bezpieczestwo zarzdzane przez kontener ............................................... 265
4.6.2. Bezpieczestwo zarzdzane przez aplikacj .............................................. 270

Rozdzia 5. Tworzenie komponentów uytkownika ........................................... 275

5.1. Komponenty interfejsu uytkownika (UI) ............................................................. 275

5.1.1. Implementacja komponentu ....................................................................... 276
5.1.2. Przechowywanie stanu komponentu .......................................................... 280
5.1.3. Rejestracja komponentu ............................................................................. 282
5.1.4. Generowanie i obsuga zdarze ................................................................. 282
5.1.5. Integracja z JSP .......................................................................................... 284

5.2. Renderery .............................................................................................................. 289

5.2.1. Podstawy implementacji rendererów ......................................................... 290
5.2.2. Renderery i JavaScript ............................................................................... 291
5.2.3. Rejestracja rendererów ............................................................................... 295

5.3. Konwertery ............................................................................................................ 296

5.3.1. Podstawy implementacji konwerterów ...................................................... 297
5.3.2. Rejestracja konwerterów ............................................................................ 300
5.3.3. Integracja konwerterów z JSP .................................................................... 302

5.4. Walidatory ............................................................................................................. 304

5.4.1. Podstawy implementacji walidatorów ....................................................... 305
5.4.2. Rejestracja walidatorów ............................................................................. 306
5.4.3. Integracja walidatorów z JSP ..................................................................... 308

5.5. Komponenty JSF i AJAX ...................................................................................... 309

5.5.1. Podstawy AJAX-a ...................................................................................... 310
5.5.2. Biblioteka AJAX4JSF ................................................................................ 313
5.5.3. Biblioteki AJAX-a ..................................................................................... 315

Rozdzia 6. Narzdzia wsparcia i integracja z innymi szkieletami ..................... 327

6.1. Narzdzia Web Tools Platform .............................................................................. 327

6.1.1. Zarzdzanie serwerem aplikacji ................................................................. 328
6.1.2. Monitorowanie portów ............................................................................... 330
6.1.3. Narzdzia uatwiajce prac z bazami danych ........................................... 333

6.2. Technologie widoku .............................................................................................. 338

6.2.1. Facelets ...................................................................................................... 339
6.2.2. Apache Tiles 2 ........................................................................................... 344
6.2.3. Smile .......................................................................................................... 350

background image

6

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Dodatek A Standardy kodowania IANA ........................................................... 353

Dodatek B Zaoenia JSF 2.0 ......................................................................... 355

Dodatek C Wspólne elementy konfiguracji ..................................................... 357

Dodatek D Komunikaty o bdach .................................................................. 359

Komunikaty o bdach komponentów .......................................................................... 359
Komunikaty o bdach konwerterów ............................................................................ 359
Komunikaty o bdach walidatorów ............................................................................. 360

Dodatek E Atrybuty przekazywane HTML i zdarzenia DHTML ........................... 361

Literatura ..................................................................................... 363

Skorowidz .................................................................................... 365

background image

Rozdzia 2.

Planowanie, modelowanie
i projektowanie aplikacji
JSF na platformie Java EE

Po zapoznaniu si z podstawowymi wiadomociami na temat architektury i moliwo-
ci szkieletu JSF moemy przej do zagadnie zwizanych z wytwarzaniem realnych
aplikacji WWW w rodowisku programistycznym Eclipse Galileo. W niniejszym
rozdziale wybrane fazy wytwarzania aplikacji s zilustrowane na przykadzie Inter-
netowego Systemu Recenzowania Publikacji
(w skrócie ISRP), przeznaczonego do
zapewnienia obsugi informatycznej pracy redakcji czasopism naukowych oraz
wspomagania organizacji konferencji naukowych. Zakres funkcjonalnoci projekto-
wanego systemu obejmuje obsug rejestracji artykuów zgaszanych przez autorów,
proces recenzji artykuów oraz administrowanie kontami uytkowników.

Nie jest intencj autora zamieszczenie w tym miejscu penej dokumentacji systemu ISRP
jako zoonego studium przypadku uycia JSF (ang. case study), ale raczej przedsta-
wienie pewnych praktyk projektowych zwizanych z architektur i projektowaniem
aplikacji JSF na platformie Java EE. Prezentowane rozwizania s wypadkow do-
wiadcze wielu osób w zakresie wykorzystania szkieletu JSF do wytwarzania war-
stwy prezentacji w aplikacjach o architekturze wielowarstwowej. Szczególna uwaga
powicona jest wybranym aspektom zwizanym z czynnociami fazy przedimple-
mentacyjnej projektu, takim jak modelowanie interfejsu uytkownika oraz projekto-
wanie aplikacji oparte na architekturze wielowarstwowej. Zamieszczone w tym rozdziale
model i zaoenia projektowe bd rozwijane w dalszej czci ksiki i stanowi jed-
noczenie odniesienie dla kolejnych przykadów ilustrujcych elementy technologii JSF.

background image

68

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

2.1. Modelowanie interfejsu

uytkownika przy wykorzystaniu
techniki scenopisu

Jako modelu projektowanego systemu czsto decyduje o powodzeniu projektu in-
formatycznego, a jego najbardziej podan cech jest kompromisowo . Model po-
winien by jednoczenie zrozumiay dla klientów, którzy na jego podstawie oceniaj
funkcjonalno systemu, jak te zawiera wszystkie niezbdne dane dla zespou pro-
jektowego, który z niego korzysta w fazie projektowania. Z jednej strony model powinien
by dopasowany do technologii stosowanych w fazach projektowania i implementacji
(przy zaoeniu, e s one znane wczeniej i wynikaj np. z wymaga niefunkcjonal-
nych), a jednoczenie nie powinien wymaga rozlegej wiedzy na ich temat od ana-
lityków wytwarzajcych model.

Ze wzgldu na komponentowy charakter szkieletu JSF, scenopis wydaje si technik
modelowania, która doskonale spenia opisane wyej kryteria. Scenopis specyfikuje
model zawierajcy analiz funkcjonaln, komponenty funkcjonalne oraz interakcje
pomidzy nimi na ekranach oraz przepywy i projekty ekranów. Najwiksz zalet
scenopisu jest to, e jest on zrozumiay dla osób spoza brany informatycznej, co za-
pewniaj diagramy przypadków uycia i prototypy ekranów. W dalszej czci roz-
dziau zaprezentowane zostan poszczególne elementy scenopisu, ilustrowane wybra-
nymi fragmentami modelu aplikacji ISRP.

Scenopis i metodyki modelowania,
projektowania i dokumentowania systemów informatycznych

Metodyki wytwarzania systemów informatycznych stanowi jeden z gównych nur-
tów inynierii oprogramowania. Obecnie standardowym narzdziem do modelowania
systemów informatycznych jest jzyk UML w wersji 2.1, który stanowi jednoczenie
system wizualizacji, specyfikowania oraz dokumentowania elementów systemu in-
formatycznego. UML jest uywany wraz z jego reprezentacj graficzn — jego ele-
mentom przypisane s symbole, które wizane s ze sob na diagramach. Ze wzgldu
na to e UML zosta stworzony z myl o opisie wiata w analizie obiektowej, jego
specyfikacja nie definiuje gotowych rozwiza dla specyficznych zastosowa, takich
jak modelowanie interfejsu uytkownika. Poniewa nie powsta zunifikowany stan-
dard dla modelowania zachowania i struktury aplikacji WWW, np. w zakresie mode-
lowania nawigacji, przepywów sterowania na ekranach czy projektów ekranów, ró-
ne organizacje i firmy forsuj wasne rozszerzenia jzyka UML w tym zakresie.

Opierajc si na UML, stworzono metodyk projektowania oprogramowania RUP
(Rational Unified Process), która definiuje szablon procesu iteracyjnego wytwarzania
oprogramowania opracowany przez firm Rational Software Corporation. Szablon
RUP pozwala na korzystanie z jego elementów w zalenoci od potrzeb projektowych.
Sporód najlepszych praktyk i zasad inynierii oprogramowania, które s w nim za-
warte, warto wskaza do istotne z punktu widzenia specyfiki aplikacji tworzonych

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

69

w JSF zarzdzanie wymaganiami (ang. Requirement Management), uywanie archi-
tektury bazujcej na komponentach (ang. Component-based Architecture) czy gra-
ficzne projektowanie oprogramowania.

Scenopis (ang. storyboard) jest modelem projektowym, zwykle tworzonym przez
analityków biznesowych i projektantów interfejsu uytkownika, dostarczonym ze-
spoowi deweloperów jako cz specyfikacji funkcjonalnej. Idea scenopisu wywodzi
si z przedstawionej wyej metodyki RUP, która definiuje m.in. model projektowania
interakcji oparty na dowiadczeniu uytkownika
(ang. User-eXperience — UX) w po-
staci ekranów, ich dynamicznej zawartoci i sposobu nawigacji. Typowy scenopis
zawiera pi elementów:



przypadki uycia opisujce wymagania funkcjonalne i przepywy zdarze,



model ekranów UI specyfikujcy ekrany, komponenty i elementy UX,



diagram nawigacji ilustrujcy zwizki pomidzy ekranami (przede wszystkim
reguy nawigacji), oparty na notacji graficznej diagramu klas,



makiety ekranów (ang. mock-up) pokazujce szczegóowo elementy
funkcjonalne interfejsu GUI, tj. kontrolki i ich rozmieszczenie,



diagramy maszyny stanowej dla kadego ekranu ilustrujce interakcj warstwy
kontrolera ekranu z warstw modelu aplikacji.

2.1.1. Przypadki uycia

Wygodnym narzdziem stosowanym na potrzeby identyfikacji i dokumentacji wyma-
ga funkcjonalnych s diagramy przypadków uycia (ang. Use Case UC) w jzy-
ku UML. Ilustruj one funkcjonalno systemu poprzez wyszczególnienie i przedsta-
wienie za pomoc symboli graficznych: aktorów inicjujcych dziaania, przypadków
uycia systemu oraz wystpujcych pomidzy nimi zwizków. Dziki swojej prosto-
cie oraz abstrahowaniu od rozwiza technicznych, diagramy przypadków uycia s
zrozumiae nawet dla osób, które nie posiadaj wyksztacenia informatycznego. Z zao-
enia stanowi one czytelne narzdzie pozwalajce na komunikacj pomidzy twórcami
systemu i jego potencjalnymi odbiorcami czy inwestorami. Podsumowujc, przypadki
uycia opisuj, co system powinien robi , a nie jak ma to robi .

Na rysunku 2.1 przedstawiono diagram przypadków uycia modelujcy aktorów, przy-
padki uycia oraz powizania pomidzy nimi, wystpujce w systemie ISRP. Sche-
matyczny rysunek postaci ludzkiej zoony z kilku kresek jest symbolem graficznym
aktora, definiujcego spójny zbiór ról odgrywanych przez uytkowników przypadku
uycia w czasie jego realizacji. Przypadki uycia oznaczone s przy wykorzystaniu
wypenionych elips, a ich realizacje zwykymi liniami. Relacje rozszerzania i zawie-
rania dla przypadków uycia opisane s przy zastosowaniu stereotypów umieszczo-
nych w cudzysowach ostroktnych. Relacje uogólniania (w sensie zwizku taksono-
micznego, opisujcego dziedziczenie cech) przedstawione zostay za pomoc linii
zakoczonych strzak z pustym grotem.

background image

70

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Autor

(from Actors)

Recenzent

(from Actors)

Uytkownik

uwierzytelniony

(from Actors)

Administrator

(from Actors)

Dodaj prac

Edytuj prac

Poka szczegóy

pracy

Wywietl list prac

Zarejestruj

Wywietl szczegóy

recenzji

Wywietl list

recenzji

Edytuj dane osobowe

Dodaj recenzj

Wywietl list

uytkowników

Dodaj recenzenta

Zarzdzaj

uytkownikami

Przypisz recenzenta

do pracy

Zarzdzaj pracami

Zaloguj

Odzyskaj haso

«extend»

«include»

«include»

Rysunek 2.1.

Diagram przypadków uycia dla ISRP

Dokadny opis wykorzystania diagramów UC do modelowania funkcjonalnoci sys-
temu Czytelnik znajdzie w ksice Jzyk UML 2.0 w modelowaniu systemów infor-
matycznych
, a wyczerpujcy opis scenariuszy przypadków uycia (tekstowej formy
prezentacji UC) znajduje si w ksice Writing Effective Use Cases

1

.

2.1.2. Model ekranów interfejsu uytkownika

Model ekranów UI stanowi centralny punkt wyjciowy dla równolegego rozwoju apli-
kacji, prowadzonego w zespoach projektantów stron WWW i programistów aplikacji,
stanowic jednoczenie interfejs umoliwiajcy integracj kodu wytwarzanego przez

1

Polskie wydanie: Alistair Cockburn, Jak pisa efektywne przypadki uycia, tum. Krzysztof Stencel,
Warszawa 2004.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

71

oba zespoy. Model ekranów UI definiuje zbiór ekranów (wraz z ich zawartoci) nie-
zbdnych do zrealizowania wymaga funkcjonalnych okrelonych przez przypadki
uycia. W przypadku zawartoci ekranów model definiuje wycznie elementy funk-
cjonalne, jakie powinny znale si na nich, bez okrelania szczegóów dotyczcych
typów kontrolek (np. pola tekstowego albo listy rozwijanej) czy ich rozmieszczenia.

W technice scenopisów standardowym elementom UML nadawane s nowe znaczenia
poprzez uycie stereotypów przedstawionych w tabeli 2.1.

Tabela 2.1.

Stereotypy modelu UI wykorzystywane w technice scenopisów

Stereotyp

Rozszerzany element UML

Reprezentuje

Screen

Class

Ekran (w postaci strony WWW).

Compartment

Class

Fragment ekranu (strony WWW) przeznaczony do
wykorzystania na wielu stronach aplikacji WWW
(definiujcy sekcj strony np. stopk, nagówek itp.).

Form

Class

Formularz strony WWW.

Input

Attribute

Pole wejciowe formularza.

Submit

Operation

Element zatwierdzajcy formularz i generujcy akcj.

Statyczne informacje takie jak etykiety, obrazki czy panele nie s w ogóle reprezen-
towane w modelu UI. Dane biznesowe s przedstawiane na ekranie przy uyciu atry-
butów
. Jeli atrybut opatrzony jest stereotypem

<<input>>

, oznacza to, e suy on do

wprowadzania danych. Peny opis atrybutu prezentowany jest wedug nastpujcego
formatu:

widoczno nazwa :typ liczebno =domylna_warto {waciwoci}

. Zaó-

my, e mamy ekran sucy do tworzenia konta nowego uytkownika, dostpny wy-
cznie dla administratora systemu. Pole suce do wprowadzania uprawnie dla no-
wego uytkownika moe zosta opisane w nastpujcy sposób:

<<input>> +role :String 1 =reviewer {user.role==admin}

Powyszy zapis informuje nas, e atrybut

role

reprezentuje pole wejciowe dla da-

nych typu String, wypeniane przez uytkowników z uprawnieniami administratora.
Widoczno elementu okrela, czy jego zawarto jest wywietlana na ekranie (+),
czy te jest ukryta (-). Nazwa atrybutu powinna identyfikowa pole wprowadzania danych
(np. warto atrybutu

name

dla odpowiedniego pola formularza). Typem atrybutu mo-

e by dowolny typ prymitywny lub obiektowy, wcznie z abstrakcyjnymi typami
danych, reprezentujcymi zoone struktury danych (takie jak listy czy mapy, które
mog by reprezentowane przez klasy abstrakcyjne

List

bd

Map

). Pozostae waci-

woci atrybutu s opcjonalne i nie musz by definiowane. Liczebno okrela, ile in-
stancji elementu moe by renderowanych na ekranie, warto domylna jest wartoci
uywan dla elementów, które nie s inicjowane, a nawiasy klamrowe umoliwiaj
zamieszczenie dodatkowych waciwoci bd ogranicze dotyczcych atrybutu, np.
w zakresie dostpu do pola danych.

Zdarzenia generowane przez interfejs uytkownika oraz akcje uytkownika reprezen-
towane s za pomoc operacji. Jeli operacja jest dodatkowo opatrzona stereotypem

<<submit>>

, oznacza to, e wskazany element UI suy do zatwierdzania formularza

background image

72

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

i generowania akcji, której wynik moe wpywa na nawigacj aplikacji. Peny opis ope-
racji prezentowany jest wedug nastpujcego formatu:

widoczno nazwa (lista_

parametrów) :zwracany_typ {waciwoci}

. Na przykad element wyzwalajcy akcj

polegajc na przejciu do okna edycji biecego uytkownika moe by opisany w na-
stpujcy sposób:

<<submit>> + edit ():String {current.user==notEmpty}

Nazwa operacji powinna by powizana z nazw metody sucej do obsugi zdarze-
nia wygenerowanego przez operacj lub nazw powizanego z operacj pola (np. gdy
operacja dotyczy walidacji danych wprowadzanych do pola wejciowego po stronie
klienta). Widoczno elementu okrela, czy akcja ma by podjta po stronie klienta (-),
czy po stronie serwera (+). Waciwoci dodatkowo charakteryzujce operacje za-
mieszczane s w opcjonalnych nawiasach klamrowych.

Na rysunku 2.2 zaprezentowano model ekranu realizujcego dwa przypadki uycia
systemu ISRP — rejestracj nowego uytkownika i edycj danych uytkownika uwie-
rzytelnionego. Obie funkcjonalnoci systemu s do podobne i operuj na jednym
zbiorze danych, wic do ich obsugi zamodelowany zosta jeden ekran. Ekran skada
si z trzech czci: nagówka (

topMenu

) zawierajcego przyciski nawigacji, menu dla

uwierzytelnionych uytkowników (

leftMenu

) i formularza danych uytkownika. W przy-

padku rejestracji nowego uytkownika elementy menu leftMenu oraz przycisk zapi-
sywania formularza nie s widoczne, podobnie jak przyciski nawigacji (patrz rysunek
2.4). Z kolei w przypadku korzystania z ekranu przez administratora wszystkie jego
elementy s widoczne.

2.1.3. Model nawigacji

W technice scenopisów diagramy nawigacji nie koncentruj si na konkretnym prze-
pywie zdarze, ale pokazuj zwizki pomidzy ekranami. Model nawigacji zawiera
graficzn ilustracj przepywów nawigacji dla wszystkich przypadków uycia. Prze-
pywy nawigacji dla poszczególnych przypadków mog by prezentowane na od-
dzielnych diagramach bd jednym diagramie zbiorczym, jak pokazano na rysunku
2.3. Jak mona zauway , przedstawiony diagram nawigacji jest bardziej szczegóowy
ni opisana w rozdziale 1. graficzna reprezentacja regu nawigacji w Eclipse WTP.
Niemniej podczas tworzenia diagramu mona wykorzysta gotowe obiekty ekranów,
stanowice zawarto utworzonego wczeniej modelu ekranów interfejsu uytkownika.

Wystpujce na diagramie asocjacje skierowane wskazuj kierunek przepywu stero-
wania pomidzy dwoma ekranami. W szczególnych przypadkach asocjacje mog by
wyprowadzane do formularza (

<<form>>

), ale zawsze miejscem docelowym jest ekran.

Kada asocjacja powinna posiada powizan z docelowym ekranem unikatow na-
zw, która bdzie moga zosta wykorzystana podczas definiowania regu nawigacji
JSF (jako warto elementu

<from-outcome>

).

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

73

«compartment»

includes::leftMenu

«submit»

+ addPaper {user.role==author}() : String
+ addUser {user.role==admin}() : String
+ allPapersList {user.role==admin}() : String
+ authorsPapersList {user.role==author}() : String

+ editAccount{currentUser==notEmpty}(): String

+ reviewersPapersList {user.role==reviewer}() : String

+ usersList {user.role==admin}() : String

«compartment»

includes::topMenu

+ userName {user==authorized}: String

+ english() : void
+ polish()

:

void

«submit»

+ login {user==notAuthorized}() : String
+ logout {user==authorized}() : String
+ registration {user==notAuthorized}() : String

«form»

addEditUserForm

«input»

+

city: text

+

country: select

+

department: text

+

firstName: text

+

gender: radio

+

lastName: text

+

password: text

+

phone: text

+

role {user.role==admin}: select

+

street: text

+

title: text

+

zipCode: text

«submit»

+

save {currentUser==notEmpty}() : String

+

registration {currentUser==empty}() : String

«screen»

addEditUser

+

globalMessage: String [0..*]

Rysunek 2.2.

Model ekranu rejestracji i edycji danych uytkownika

2.1.4. Prototypy ekranów

Zrozumiay, ergonomiczny i przejrzysty interfejs uytkownika jest jednym z kluczo-
wych czynników decydujcych o sukcesie aplikacji WWW. Konsultowanie wygldu
interfejsu przez potencjalnych uytkowników systemu w fazie przedimplementacyjnej
lub w trakcie implementacji pozwala ten sukces osign . Celem przeanalizowania
preferencji uytkowników w zakresie funkcjonalnoci interfejsu stosuje si tzw. pro-
totypowanie, polegajce na wytwarzaniu makiet ekranów (ang.

mock-up). Pojcie

makiety jest mao precyzyjne i charakteryzuje wszelkie projekty ekranów, poczwszy
od odrcznych szkiców, poprzez

projekty szkieletowe ekranu (ang. wireframes), a po

gotowe interaktywne prototypy ekranów posiadajce bogat szat graficzn i umoli-
wiajce testowanie ekranu na faszywych danych. Projekty szkieletowe nie uwzgld-
niaj szaty graficznej, a ich celem jest przedstawienie ogólnej funkcjonalnoci poszcze-
gólnych ekranów oraz sposobu prezentacji danych biznesowych.

background image

74

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

«screen»

index

+ welcomeMessage:

String

«screen»

login

+ globalMessage: String [0..*]

«submit»

+ forgotPassword() : String
+ notRegistered() : String

«screen»

forgotPassword

+ globalMessage: String [0..*]

«input»

+ email:

text

«submit»

+ getNewPassword() : String

«screen»

addEditUser

+ globalMessage: String [0..*]

«screen»

papersList {user.role==admin}

+

globalMessages: String [0..*]

«screen»

assignReviewer

{user.role==admin}

+

paper.title: String

«input»

+

reviewers: select

«submit»

+

assign() : String

«screen»

paperDetails

+

paper.abstract: String

+

paper.acronym: String

+

paper.authors: String

+

paper.title: String

«submit»

+

downloadFile() : void

«screen»

reviewerPaperList

+ globalMessages: Strin [0..*]

«screen»

addReview

{user.role==reviewer}

+ globalMessages: String [0..*]

«screen»

auhtorPaperList

{user.role==author}

+ globalMessages: String [0..*]

«screen»

addEditPaper

{user.role==author}

«screen»

addNewVersion

{user.role==author}

«input»

+ paper.file:

file

«submit»

+ addNewVersion() : String

«screen»

usersList {user.role==admin}

+ globalMessages: String [0..*]

«screen»

reviewDetails

+

review.commentToAdmin {user.role==admin || user.role==reviewer}: String

+

review.commentToAuthor {user.role==author || user.role==reviewer}: String

+

review.grade: String

«compartment»

:topMenu

«compartment»

:leftMenu

edit_success

papers_details

add_review

assign_success

delete

aprove/reject

review_details

logout_success

assign_reviewer

paper_details

add_success

registration_success

get_password_success

forgot_password

login_success

registration

paper_details

edit_user

add_paper

author_papers_list

reviewer_papers_list

all_papers_list

add_user

registration

review_details

delete

add_success

add_success

edit_success

add_success

review_details

add_new_version

edit_paper

all_users_list

login

Rysunek 2.3.

Diagram nawigacji dla aplikacji ISRP

W technice scenopisów generalnie zaleca si stosowanie projektów szkieletowych,
które mog by wytwarzane zarówno odrcznie, z wykorzystaniem narzdzi graficznych
(do popularny jest pakiet MS PowerPoint), jak i za pomoc specjalnych narzdzi
dostpnych w pakietach do modelowania, np. Microsoft Visio Toolkit for Wireframe,
MockupScreens czy Screen Architect for Sparx Enterprise Architect. W rodowisku
Eclipse warto rozway wykorzystanie edytora stron WWW pakietu WTP — utworzo-
ne w ten sposób projekty mog by póniej stosowane podczas implementacji.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

75

Przykad projektu szkieletowego dla ekranu rejestracji uytkownika w systemie ISRP
zosta pokazany na rysunku 2.4. Projekt stanowi rozwinicie modelu ekranu zamiesz-
czonego na rysunku 2.2 zarówno w zakresie specyfikacji kontrolek realizujcych ele-
menty funkcjonalne, jak i rozmieszczenia elementów wizualnych, majcych uatwi
korzystanie ze strony.

Rysunek 2.4.

Projekt szkieletowy ekranu rejestracji aplikacji ISRP

2.1.5. Diagram maszyny stanowej

W technice scenopisów diagram maszyny stanowej suy do opisania zachowania ekra-
nu w trakcie realizacji przypadku uycia. Diagram modeluje stan znajdujcego si po
stronie serwera kontrolera ekranu oraz jego zmiany nastpujce w wyniku interakcji
uytkownika z ekranem. Na rysunku 2.5 zamieszczony zosta przykad diagramu ma-
szyny stanowej, ilustrujcy zmiany stanów kontrolera ekranu rejestracji (przedstawio-
nego na rysunku 2.4).

background image

76

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

start

«ControllerState»

Rejestracja nieaktywna

+ entry / dezaktywuj przycisk Zarejestruj

«ControllerState»

Rejestracja aktywna

+ entry / uaktywnij przycisk Zarejestruj
+ exit / waliduj dane formularza

Final

zaznaczenie pola

wyboru
[pole=false]

zatwierdzenie
formularza [walidacja

poprawna]
/dodaj uytkownika

zatwierdzenie formularza
[walidacja niepoprawna]
/poka bdy

klikniciu przycisku

nawigacji

zaznaczenie
pola wyboru
[pole=true]

wyjcie po

Rysunek 2.5.

Diagram maszyny stanowej dla ekranu rejestracji

Stan pocztkowy reprezentuje stan kontrolera po utworzeniu jego instancji i jest
oznaczony przez strzak wychodzc od elementu start. Kade przejcie (tranzycja)
na diagramie definiuje relacj midzy dwoma stanami kontrolera, wskazujc, e kontro-
ler znajdujcy si w pierwszym stanie wykona pewne akcje i przejdzie do drugiego
stanu, ilekro zajdzie okrelone zdarzenie i bd spenione okrelone warunki. Opis
przejcia skada si z trzech opcjonalnych elementów: wyzwalacza (ang. trigger), dozoru
(ang. guard) i aktywnoci (ang. activity), które opisywane s wedug nastpujcej
skadni:

wyzwalacz [dozór] /aktywno

. Wyzwalaczem jest zazwyczaj pojedyncze

zdarzenie, które moe spowodowa przejcie i zmian stanu. Dozór okrela warunek
logiczny, jaki musi by speniony, aby przejcie zostao wykonane; warunek ten jest
obliczany w momencie pojawienia si wyzwalacza. Aktywno definiuje operacj
wykonywan w momencie przejcia ze stanu do stanu; nawet jeeli akcja przejcia
jest zoona z wielu akcji elementarnych, jest ona wykonywana niepodzielnie.

Przejcia s oznaczane za pomoc strzaek czcych dwa stany kontrolera i mog by
postrzegane jako zmiany na ekranie, które nie powoduj uaktywnienia regu nawiga-
cji skutkujcych wywietleniem innego ekranu. Podobnie jak w zwykym diagramie
maszyny stanowej, równie tutaj mog wystpowa szczególne przypadki przej ,
których wykonanie nie prowadzi do zmiany danego stanu, tj. przejcia wewntrzne
lub zwrotne. W przypadku przejcia zwrotnego s wykonywane czynnoci wejciowe
oraz wyjciowe danego stanu, w przypadku przej wewntrznych s one pomijane.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

77

Przejcia wewntrzne nie maj odrbnego oznaczenia graficznego, lecz s specyfiko-
wane w obszarze stanu, obok definicji nastpujcych czynnoci:

 entry

— czynnoci wykonywane w momencie, gdy obiekt przyjmuje dany stan;

 do

— czynnoci wykonywane nieprzerwanie w czasie, gdy obiekt przebywa

w danym stanie;

 exit

— czynnoci wykonywane w momencie opuszczenia stanu.

Przejcia wewntrzne lub zwrotne wystpuj w sytuacjach, gdy kompozycja ekranu
zmienia si tylko nieznacznie lub wcale. Stan kocowy (ang. final) wskazuje, e maszyna
stanów jest kompletna, a obiekt kontrolera oraz wszystkie przechowywane w nim zmien-
ne mog zosta usunite.

2.2. Warstwa biznesowa

W rozdziale 1.2.4, „Implementacja MVC w JSF”, przedstawiono ogólny schemat im-
plementacji wzorca MVC w aplikacjach opartych na JSF oraz korzyci pynce z izolo-
wania warstwy biznesowej i prezentacji. W tym punkcie zostan omówione dobre
praktyki projektowe, rozwizania i technologie zwizane z tworzeniem samej warstwy
biznesowej.

2.2.1. Rola i elementy warstwy biznesowej

Pojcie warstwy biznesowej do sugestywnie okrela rol tej warstwy, w której mo-
delowane s obiekty i reguy biznesowe. Stanowi ona zazwyczaj rdze aplikacji i jest
najbardziej rozleg jej warstw, z jednej strony wiadczc usugi dla warstwy pre-
zentacji, z drugiej strony korzystajc z zewntrznych róde danych, takich jak bazy
danych, korporacyjne systemy informacyjne (ang. Enterprise Information Systems
EIS) czy zewntrzne systemy informatyczne. Separowanie warstwy biznesu od prezen-
tacji uatwia implementacj regu biznesowych i umoliwia uycie obiektów bizneso-
wych w dowolnym rodowisku uruchomieniowym (strona 29 „Korzyci wynikajce
z izolowania warstw widoku i logiki biznesowej”). Ze wzgldu na rozlego warstwy
biznesowej dobrze jest podzieli j na podwarstwy, które s od siebie logicznie od-
dzielone i posiadaj cile zdefiniowane zakresy odpowiedzialnoci, tj. model dzie-
dzinowy, warstw usug i interfejs do warstwy trwaoci danych (patrz rysunek 2.6),
omówione w kolejnych punktach.

Najpopularniejsze podejcia do tworzenia warstwy biznesowej w aplikacjach WWW
oparte s na wykorzystaniu:



zarzdzanych przez kontener komponentów,



zwykych obiektów Javy (ang. Plain Old Java Objects POJO).

background image

78

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Rysunek 2.6.
Warstwowy model
architektury
wykorzystany
w aplikacji ISRP

Warstwa prezentacji

Warstwa biznesowa

Warstwa trwaoci

Model dziedzinowy (POJO)

Warstwa usugowa (fasady)

Interfejs do warstwy trwaoci (DAO)

Programowanie komponentowe jest naturalnym rozszerzeniem programowania zo-
rientowanego obiektowo — nie posiada ono zupenie nowych atrybutów w stosunku
do programowania obiektowego, a jedynie konsekwentnie i w peni wykorzystuje ce-
chy obiektowoci. Komponenty oferuj hermetycznie opakowane, wysokopoziomowe
funkcje realizujce logik biznesow. Zarzdzaniem komponentami zajmuje si kon-
tener, który kontroluje róne aspekty ich ycia, m.in. tworzenie instancji, wprowadza-
nie zalenoci pomidzy nimi czy te zarzdzanie cyklem ich ycia. Kontener po-
zwala na ograniczenie zada stojcych przed komponentami do realizacji jedynie
funkcji biznesowych, dziki czemu s one atwe do zrozumienia, maj czytelne inter-
fejsy i mog by rozproszone w sieci. Programowanie komponentowe boryka si jednak
z wieloma problemami implementacyjnymi, przede wszystkim z du rónorodnoci
protokoów komponentowych i jzyków interfejsów, problemami ze wzajemnym poro-
zumiewaniem si komponentów czy zoonoci infrastruktur rodowisk uruchomienio-
wych. Popularnymi technologiami komponentów s Enterprise Java Beans czy Spring.

Do implementacji warstwy biznesowej w zawartych w ksice przykadach wykorzy-
stywane jest podejcie oparte na klasach POJO. Zalet tego podejcia jest brak zale-
noci od technologii EJB czy Java EE oraz moliwo uycia i testowania jej kodu
bez potrzeby korzystania ze rodowiska uruchomieniowego serwera.

Klasy POJO i komponenty JavaBean

Termin Plain Old Java Objects okrela obiekty zwykych klas Javy, które nie s
ograniczone adnymi specjalnymi restrykcjami i nie musz implementowa adnych
specjalnych zachowa w odrónieniu od np. komponentów EJB 2.x. Klasy POJO nie
powinny dziedziczy po wczeniej predefiniowanych klasach, implementowa predefi-
niowanych interfejsów czy zawiera predefiniowanych adnotacji, jeli te nie s zwizane
z ich podstawow funkcjonalnoci (cho nawet tych wymaga nie naley traktowa
zbyt rygorystycznie). Pojcie POJO zostao wprowadzone przez Martina Fowlera,
Rebecc Parsons i Josha McKenziego w 2000 roku, którzy poprzez wprowadzenie
atrakcyjnie brzmicej nazwy dla zwykych obiektów Javy chcieli wyróni ide wy-
korzystania prostych technik projektowych w programowaniu obiektowym.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

79

Poniewa w aplikacjach korporacyjnych Java EE (J2EE) wymagane s dodatkowe
usugi, takie jak zarzdzanie transakcjami, utrzymywanie bezpieczestwa czy trwao-
ci danych (w alternatywnym podejciu usugi te zapewniaj kontenery EJB), po-
wstay specjalne lekkie szkielety programistyczne (ang. lightweight frameworks), udo-
stpniajce wybrane usugi obiektom POJO. Przykadami lekkich szkieletów s Spring,
Hibernate czy iBatis. Pozytywne dowiadczenia ze stosowania lekkich szkieletów i klas
POJO skoniy równie projektantów technologii EJB do gruntownej przebudowy ich
rozwizania. Poczwszy od wersji EJB 3.0, komponenty EJB s w zasadzie klasami
POJO, które zawieraj adnotacje specyfikujce dodatkowe waciwoci obiektów tych
klas (poza kontenerem EJB adnotacje nie s interpretowane, wic mona stwierdzi ,
e EJB 3.0 to POJO).

Komponenty JavaBean s to napisane w odpowiedniej konwencji klasy POJO, bdce
niezalenymi moduami wielokrotnego uytku w programach Javy. Narzdzia do
tworzenia oprogramowania s w stanie czy i wykorzystywa komponenty JavaBeans
oraz manipulowa nimi dziki przyjciu odpowiednich konwencji w nazywaniu me-
tod, konstrukcji klasy i jej zachowania, a mianowicie:



klasa musi posiada publiczny i bezparametrowy konstruktor;



hermetyzowane waciwoci klasy musz by dostpne do odczytu i modyfikacji
za pomoc specjalnych metod publicznych (tzw. getters & setters), które musz
mie odpowiednio skonstruowane nazwy, zawierajce przedrostki

get-

,

set-

i opcjonalnie

is-

dla typu

boolean

, np.:

public int getTemperature()

,

public

void setTemperature(int t)

,

public boolean isFinished()

— dla waciwoci

temperature

i

finished

;



klasa powinna by serializowalna (implementowa interfejs

Serializable

lub

Externalizable

);



klasa nie powinna zawiera metod obsugi zdarze.

Przykadowymi komponentami JavaBean s komponenty wspierajce.

2.2.1.1. Model dziedzinowy

Na podstawie analizy przypadków uycia moemy zidentyfikowa podstawowe klasy
konceptualne (pojcia, rzeczy bd obiekty) wystpujce w projektowanym systemie.
Model konceptualny stanowi punkt wyjciowy generowania obiektowego modelu
dziedzinowego
oraz modelu relacyjnego (fizycznego). Diagram konceptualny na rysunku
2.7 przedstawia podstawowe pojcia wystpujce w systemie ISRP.

Dokadne odwzorowanie obiektowe koncepcji biznesowych wystpujcych w mode-
lowanym rodowisku zapewnia tzw. model drobnoziarnisty (ang. fine-grained model),
oparty na wykorzystaniu wielu prostych obiektów POJO, reprezentujcych istotne
koncepcje biznesowe. Modele drobnoziarniste znakomicie speniaj swoje funkcje, o ile
nie wystpuje potrzeba rozproszenia obiektów na rónych serwerach. W modelu drobno-
ziarnistym wystpuje mnóstwo wzajemnych odwoa pomidzy obiektami, co stanowi
problem w systemach rozproszonych, gdy zdalne wywoania s do kosztowne.

background image

80

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

java.io.Serializable

Pytanie

java.io.Serializable

Kraj

java.io.Serializable

Artyku

java.io.Serializable

Odpowied

java.io.Serializable

Recenzja

java.io.Serializable

Uytkownik

mieszka

nadsya

wykonuje

Rysunek 2.7.

Diagram konceptualny systemu ISRP

W takich systemach podejcie komponentowe moe by przydatniejsze, a kontenery
Java EE mog dodatkowo zapewni bezpieczestwo, transakcyjno czy poczenia
w systemach heterogenicznych.

Model dziedzinowy aplikacji ISRP zaimplementowany jest w postaci klas POJO.
Przykad obiektu biznesowego dla koncepcji uytkownika zosta przedstawiony na li-
stingu 2.1.

Listing 2.1.

Kod klasy User

package isrp.hibernate.model.businessobject;
import java.util.Date;

public class User implements java.io.Serializable {
private Integer id;
private int countryId;
private String title;
private String firstName;
private String lastName;
private String organization;
private String department;
private String street;
private String zipCode;
private String city;
private String email;
private String password;
private String phone;
private boolean gender;
private Date entryDate;
private Byte role;

public User() { //konstruktor na potrzeby serializacji
}

public User(int countryId, String title, String firstName, String lastName,
String organization, String department, String street,
String zipCode, String city, String email, String password,
String phone, boolean gender, Date entryDate, Byte role) {

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

81

this.countryId = countryId;
this.title = title;
this.firstName = firstName;
this.lastName = lastName;
this.organization = organization;
this.department = department;
this.street = street;
this.zipCode = zipCode;
this.city = city;
this.email = email;
this.password = password;
this.phone = phone;
this.gender = gender;
this.entryDate = entryDate;
this.role = role;
}

public Integer getId() {return this.id;}

public void setId(Integer id) {this.id = id;}

/* ...Pozostae gettery i settery ...*/
}

Podejcie polegajce na wyprowadzeniu implementacji logiki biznesowej poza mo-
del dziedzinowy i obiekty reprezentujce dane okrelane jest w literaturze mianem
anemicznego modelu dziedzinowego. Wprowadzi je Martin Fowler, który traktuje
takie rozwizanie jako antywzorzec. Najwaniejszym zarzutem, jaki stawia Fowler
takiemu modelowi, jest naruszenie zasad OOP w zakresie enkapsulacji i hermety-
zacji kodu — przetwarzaniem stanu obiektów dziedzinowych czy te ich walidacj
zajmuj si zewntrzne klasy. Inne istotne mankamenty to zmniejszenie czytelnoci
kodu oraz zwikszenie moliwoci wystpowania duplikacji w kodzie. Mimo tych wad
(wyjanionych dokadnie w artykule pod adresem http://www.martinfowler.com/bliki/
AnemicDomainModel.html
) rozwizanie to jest czsto i chtnie stosowane, zwaszcza
gdy obiektowy model dziedzinowy jest generowany automatycznie, za pomoc na-
rzdzi ORM, na podstawie istniejcego wczeniej modelu fizycznego.

2.2.1.2. Warstwa usugowa

Bardzo wane na etapie projektowania jest rozrónienie dwóch aspektów funkcjonal-
noci systemu wystpujcych w warstwie biznesowej: modelu dziedzinowego i logiki
biznesowej
. Model dziedzinowy reprezentuje koncepcje biznesowe i ich zachowanie,
podczas gdy logika biznesowa reprezentuje procesy i przepywy sterowania odpowia-
dajce scenariuszom przypadków uycia. Oddzielenie logiki biznesowej od modelu
dziedzinowego jest moliwe poprzez wprowadzenie warstwy usugowej (ang. service
layer
) odpowiedzialnej za:



zdefiniowanie uproszczonego interfejsu dla klientów modelu dziedzinowego,



implementacj zoonych obiektów usug zdefiniowanych przez wyej
wymieniony interfejs.

Obiekty usug mog zapewnia fasady dla modelu dziedzinowego (strona 83 „Wzo-
rzec fasady”) oraz implementowa procesy biznesowe.

background image

82

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Na przykad na diagramie przypadków uycia systemu ISRP wystpuje przypadek
Przypisz recenzenta do pracy

, który reprezentuje zoony proces biznesowy. W ra-

mach tego procesu zachodzi nastpujca sekwencja czynnoci: redaktor z uprawnie-
niami administratora wybiera z listy recenzenta, do którego automatycznie wysyane
jest zawiadomienie (poczt elektroniczn — SMTP), i zapisywany jest stan procesu
w bazie danych. Zamiast wywoywa wiele metod dla obiektów modelu dziedzinowego
w warstwie prezentacji, moemy wywoa jedn metod

void assignReviewer(Paper

paper,int reviewerId)

, zdefiniowan w fasadzie

PaperService

, której kod zosta za-

mieszczony na listingu 2.2. Zgodnie z dobr praktyk programowania obiektowego,
polegajc na przedkadaniu interfejsów nad implementacje, wszystkie metody wy-
magane dla realizacji procesów biznesowych zwizanych z przetwarzaniem artykuów
konferencyjnych s okrelone w interfejsie

PaperService

.

Listing 2.2.

Kod ródowy interfejsu PaperService

package isrp.model.service;
import java.util.List;
import org.apache.myfaces.custom.fileupload.UploadedFile;
import isrp.hibernate.model.businessobject.Paper;
import isrp.hibernate.model.businessobject.User;
import isrp.hibernate.model.util.email.EmailConfiguration;

public interface PaperService {

boolean addPaperNewVersion(Paper paper,User author,UploadedFile

´uploadedFile,String uploadPath,EmailConfiguration emailConfiguration);

void update(Paper paper);
void assignReviewer(Paper paper,int reviewerId,EmailConfiguration

´emailConfiguration);

boolean addPaper(Paper paper,User author,UploadedFile uploadedFile,String

´uploadPath,EmailConfiguration emailConfiguration);

Paper findById(int id);
void delete(Paper paper);
void approvePaper(Paper paper,EmailConfiguration emailConfiguration);
void rejectPaper(Paper paper,EmailConfiguration emailConfiguration);
List<Paper> getReviewerPapers(int reviewerId, String sortColumn);
List<Paper> getAuthorPapers(int userId, String sortColumn);
List<Paper> getAllPapers(String sortColumn);
List<Paper> getAllPapers(String sortColumn,Integer userId, Integer role);
}

Implementacja metod interfejsu

PaperService

znajduje si w klasie

PaperServiceImpl

.

Poniewa rozmiar caego kodu klasy jest obszerny, na listingu 2.3 zamieszczony zo-
sta wycznie jego fragment, zawierajcy deklaracj klasy oraz implementacj metody
odpowiedzialnej za przypisanie recenzenta i wysanie powiadomienia poczt elektro-
niczn.

Listing 2.3.

Implementacja interfejsu PaperService

public class PaperServiceImpl implements PaperService{

public PaperServiceImpl() {}// bezargumentowy konstruktor

public void assignReviewer(Paper paper, int reviewerId,
EmailConfiguration emailConfiguration) {

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

83

/* pobranie obiektów dostpowych do tabel — patrz listing 2.11*/

PaperDao pDao = DaoFactory.getInstance().getPaperDao();
UserDao uDao = DaoFactory.getInstance().getUserDao();
pDao.saveOrUpdate(paper);
User author=(User) uDao.findById(paper.getAuthorId());//pobranie obiektu autora
User reviewer=(User) uDao.findById(reviewerId);//pobranie obiektu recenzenta
/* wysanie potwierdzenia poczt elektroniczn*/
EmailSender eSender = new EmailSender(emailConfiguration);
eSender.sendEMail(EmailMessagesUtil
.assignReviewerMessageToReviewer(reviewer, paper));
}
/* ... implementacje pozostaych metod interfejsu PaperService*/
}

Wzorzec fasady

Wzorzec fasady jest jednym z podstawowych i jednoczenie najprostszych struktural-
nych wzorców projektowych. Zapewnia on dostp do zoonych systemów, prezentujc
uproszczony lub uporzdkowany interfejs programistyczny. Wzorzec fasady pozwala:



ukry zoono tworzonego systemu poprzez dostarczenie prostego interfejsu API,



uproci interfejs istniejcego systemu poprzez stworzenie nakadki, która
dostarcza nowy interfejs API.

Obiekt fasady jest prostym obiektem poredniczcym pomidzy obiektem klasy klienta
dajcym okrelonej funkcjonalnoci a klasami dostarczajcymi elementów do uzy-
skania tej funkcjonalnoci.

2.2.1.3. Lokalizatory usug

Usugi biznesowe powinny by atwo dostpne dla wszelkiego typu klientów, nieza-
lenie od tego, czy s one klientami lokalnymi, czy te zdalnymi. Gdy w warstwie
biznesowej wystpuje wiele fasad, korzystanie z usug biznesowych moemy uatwi
poprzez zastosowanie uproszczonej wersji wzorca lokalizatora usug (czciowo opi-
sanego w rozdziale 1., w ramce „Wzorzec delegata biznesowego”). Obiekt lokalizato-
ra tworzy jeden punkt dostpowy do kodu warstwy biznesowej, jednoczenie zmniej-
szajc zaleno klienta od implementacji mechanizmów wyszukiwania usug.
Zazwyczaj lokalizator jest implementowany jako pojedynczy obiekt (singleton), chyba
e stosowany jest w rodowisku rozproszonym.

Na przykad w systemie ISRP istniej zdefiniowane odrbne fasady dla usug zwizanych
z przetwarzaniem artykuów, uytkowników, recenzentów, formularzy z pytaniami
oraz danych sownikowych. Przedstawiony na listingu 2.4 interfejs

ServiceLocator

zawiera deklaracje metod, które udostpniaj obiekty implementujce interfejsy tych
fasad. Operowanie na interfejsach pozwala na uniezalenienie si od jednej konkretnej
implementacji zestawu fasad, dziki czemu atwo moemy dostarczy implementacje
zoptymalizowane pod ktem wydajnoci czy bezpieczestwa.

background image

84

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Listing 2.4.

Kod ródowy interfejsu lokalizatora usug

package isrp.model.service.factory;
import isrp.model.service.CountryService;
import isrp.model.service.PaperService;
import isrp.model.service.QuestionService;
import isrp.model.service.ReviewService;
import isrp.model.service.UserService;

public interface ServiceLocator {
PaperService getPaperService();
UserService getUserService();
ReviewService getReviewService();
CountryService getCountryService();
QuestionService getQuestionService();
}

Na listingu 2.5 przedstawiono kod klasy lokalizatora

ServiceLocatorImpl

, definiujcego

metody dostpowe zwracajce obiekty fasad. Aby tak prosty lokalizator wykonywa
swoje zadanie, naley waciwie zainicjowa i przechowa jego instancj w kontenerze,
co jest opisane w nastpnym punkcie.

Listing 2.5.

Kod ródowy lokalizatora usug ServiceLocatorImpl

package isrp.model.service.factory;
import org.apache.commons.logging.*;
import isrp.model.service.*;
import isrp.model.service.impl.*;

public class ServiceLocatorImpl implements ServiceLocator{

private PaperService paperService;
private UserService userService;
private ReviewService reviewService;
private CountryService countryService;
private QuestionService questionService;

private Log log = LogFactory.getLog(this.getClass());

public ServiceLocatorImpl() {
this.paperService = new PaperServiceImpl();
this.userService = new UserServiceImpl();
this.reviewService = new ReviewServiceImpl();
this.countryService = new CountryServiceImpl();
this.questionService = new QuestionServiceImpl();
this.log.info("Service locator bean is initialized");
}
public PaperService getPaperService() {return paperService;}
public UserService getUserService() {return userService;}
public ReviewService getReviewService() {return reviewService;}
public CountryService getCountryService() {return countryService;}
public QuestionService getQuestionService() {return questionService;}
}

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

85

2.2.1.4. Integracja warstwy usugowej z warstw prezentacji JSF

Wygodnym sposobem integracji warstwy usugowej z warstw prezentacji aplikacji
JSF jest wykorzystanie mechanizmu komponentów zarzdzanych. Na przykad obiekt
lokalizatora usug moe zosta zarejestrowany w aplikacji jako komponent zarzdzany
o zasigu aplikacji. Bdzie on wówczas automatycznie tworzony w momencie pierw-
szego odwoania si do niego, a nastpnie przechowywany w kontekcie aplikacji JSF
a do koca jej dziaania.

Deklaratywny sposób rejestracji obiektu lokalizatora w pliku faces-config.xml zosta
zaprezentowany na listingu 2.6. Pokazane na przykadzie rozwizanie umoliwia do-
stp do obiektu lokalizatora poprzez wykorzystanie jego identyfikatora —

service

´LocatorImpl

lub waciwoci komponentu uytkowego

utilBean

(opis komponentów

zarzdzanych znajduje si w rozdziale 3.). W omawianym przykadzie lokalizatorem
jest obiekt zaprezentowanej na listingu 2.5 klasy

ServiceLocatorImpl

, ale dziki sto-

sowaniu interfejsów fasad moe on zosta atwo zamieniony na inny obiekt bdcy
lokalizatorem, do czego wystarczy zmiana wartoci elementu

<managed-bean-class>

.

Moe si to okaza przydatne, np. gdy bdziemy chcieli zapewni buforowanie prze-
syanych danych czy zdalny dostp do usug.

Listing 2.6.

Integracja warstwy usugowej w pliku faces-config.xml

<managed-bean>
<description> Komponent lokalizatora </description>
<managed-bean-name>serviceLocatorImpl</managed-bean-name>
<managed-bean-class>isrp.model.service.factory.ServiceLocatorImpl</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>utilBean</managed-bean-name>
<managed-bean-class>isrp.viewbeans.UtilBean</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
<managed-property>
<property-name>serviceLocator</property-name>
<value>#{serviceLocatorImpl}</value>
</managed-property>

<!-- pozostae waciwoci -->

</managed-bean>

2.2.2. Interfejs do warstwy trwaoci danych

Cho wspóczesne aplikacje WWW mog korzysta z wielu moliwoci w zakresie
utrwalania danych, to wci najpopularniejsz z nich jest stosowanie relacyjnych baz da-
nych. Interfejs do warstwy trwaoci powinien cakowicie oddziela szczegóy techno-
logii relacyjnych od warstwy biznesu, jednoczenie zapewniajc nastpujce operacje:



funkcje CRUD, tj. ang. Create, Retrieve, Update, Delete (utwórz, odczytaj,
modyfikuj i usu obiekty w pamici trwaej),



tworzenie i uruchamianie zapyta do bazy danych,



zarzdzanie poczeniami, transakcjami, buforowaniem i wydajnoci.

background image

86

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Korzystajc z relacyjnych baz danych, naley zapewni odwzorowania obiektów Javy
na tabele, kolumny i rekordy, podobnie jak mapowanie wzajemnych relacji pomidzy
obiektami na powizania tabel i rekordów. W tym celu mona zastosowa :



interfejs JDBC API,



komponenty encji dostpne w technologii Java Persistence API,



technologie odwzorowa obiektowo-relacyjnych (ORM).

W zasadzie dwa ostatnie rozwizania s do podobne — JPA byo wzorowane na
szkieletach ORM Hibernate i TopLink. Technologie ORM pozwalaj zarówno utrwala
obiekty POJO w bazie danych, jak i generowa model dziedzinowy na podstawie
schematu bazy danych (tzw. reverse engineering). Dziki temu stanowi wygodne
rozwizanie, które moemy wykorzysta niezalenie od scenariusza, wedug jakiego
wytwarzana jest warstwa trwaoci, a mianowicie gdy:



istnieje kod Javy i naley zapewni przechowywanie obiektów Javy w bazie
danych,



istnieje zaprojektowana (lub odziedziczona z innego systemu) baza danych
i naley napisa kod aplikacji. Model dziedzinowy w Javie jest dopasowywany
do schematu bazy danych,



istnieje zarówno baza danych, jak i cz kodu Javy, które naley powiza .

W dalszych punktach przyblione zostan najwaniejsze informacje dotyczce wyko-
rzystania biblioteki Hibernate w celu zapewnienia dostpu do danych.

2.2.2.1. Interfejs warstwy danych oparty na Hibernate

Hibernate jest darmowym szkieletem programistycznym, sucym do realizacji war-
stwy dostpu do danych i zapewniajcym translacj danych pomidzy relacyjn baz
danych a wiatem obiektowym. Uycie Hibernate powoduje, e z punktu widzenia
programisty baza danych zawiera zwyke obiekty Javy (POJO). Hibernate zapewnia
poczenia z baz danych i obsug podstawowych operacji na nich z uwzgldnieniem
przenonoci midzy rónymi dialektami SQL.

Zasada dziaania Hibernate opiera si na zastosowaniu plików konfiguracyjnych defi-
niowanych w jzyku XML oraz uyciu mechanizmu refleksji do pobierania obiektów
i waciwoci klas. Plik konfiguracyjny o nazwie hibernate.cfg.xml zawiera globalne
ustawienia parametrów szkieletu oraz poczenia do bazy danych. Przykad pliku kon-
figuracyjnego dla aplikacji ISRP zosta przedstawiony na listingu 2.7. Znaczenie po-
szczególnych elementów opisane jest w komentarzach do kodu.

Listing 2.7.

Plik konfiguracji Hibernate

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

87

<!-- parametry sterownika i poczenia do bazy danych -->
<property name="hibernate.connection.driver_class">com.mysql.

´jdbc.Driver</property>

<property name="hibernate.connection.url">jdbc:mysql:

´//localhost/isrp</property>

<property name="hibernate.connection.useUnicode">yes</property>
<property name="hibernate.connection.characterEncoding">UTF-8</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.dialect">org.hibernate.dialect.

´MySQLDialect</property>

<property name="current_session_context_class">thread</property>
<!-- podgld generowanych wyrae SQL na konsoli -->
<property name="hibernate.show_sql">true</property>
<!-- pliki mapowa obiektowo-relacyjnych -->
<mapping resource="isrp/hibernate/model/businessobject/Answer.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/User.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/Country.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/Paper.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/Question.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/Review.hbm.xml" />
<mapping resource="isrp/hibernate/model/businessobject/

´Answersquestions.hbm.xml" />

</session-factory>
</hibernate-configuration>

Pliki mapowa Hibernate odpowiadaj za translacj danych znajdujcych si w tabeli
na obiekty Javy i odwrotnie. Oznaczane s przyrostkiem .hbm.xml, gdzie pierwszy ele-
ment przyrostka jest skrótem od wyraenia „HiBernate Mapping”. Poniej zamieszczono
fragment pliku mapowania User.hbm.xml. Diagram penego mapowania przykado-
wej klasy

User

do tabeli

user

, wygenerowany przy uyciu narzdzia HibernateTools,

zaprezentowano na rysunku 2.8.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2009-10-11 21:28:51 by Hibernate Tools 3.2.5.Beta -->
<hibernate-mapping>
<class name="isrp.hibernate.model.businessobject.User" table="user" catalog="isrp">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="identity" />
</id>
<property name="countryId" type="int">
<column name="countryId" not-null="true" />
</property>
</class>
</hibernate-mapping>

Instalacja Hibernate sprowadza si do pobrania i rozpakowania pakietów instalacyjnych,
dostpnych na stronie http://sourceforge.net/projects/hibernate/files/hibernate3/. Po
rozpakowaniu pliki bibliotek powinny zosta umieszczone w ciece przeszukiwania
klas projektu. Najwaniejsze klasy Hibernate znajduj si w pliku hibernate3.jar, a klasy
pomocnicze w plikach bibliotek: commons-collections.jar, commons-logging.jar,
dom4j.jar, hsqldb.jar, jta.jar, c3p0.jar, ehcache.jar, cglib.jar i antlr.jar.

background image

88

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Rysunek 2.8.

Przykadowy diagram mapowania wygenerowany w HibernateTools

Hibernate Tools

Wsparcie korzystania z biblioteki Hibernate w rodowisku Eclipse zapewnia wtyczka
programistyczna Hibernate Tools, udostpniana za darmo przez Red Hat Inc. Hibernate
Tools dostarcza zestaw widoków i kreatorów zawierajcy m.in.:



kreator dla realizacji procesu inynierii wstecznej (ang. reverse engineering),
umoliwiajcy wygenerowanie modelu obiektowego na podstawie tabel i kolumn
istniejcej bazy danych,



kreator konfiguracji hibernate.cfg.xml,



w peni funkcjonalny edytor dla jzyka Hibernate HQL,



okno komend jzyka SQL,



podpowiadanie skadni SQL,



w peni funkcjonalny edytor plików odwzorowa .hbm.xml.

Wtyczk Hibernate Tools moemy zainstalowa wedug opisu w ramce „Wtyczki pro-
gramistyczne w Eclipse”. Wówczas w polu Work with menedera instalacji wpisuje-
my nastpujcy adres:

http://download.jboss.org/jbosstools/updates/stable.

2.2.2.2. Obiekty dostpu do danych DAO

Obiekty implementujce interfejs do warstwy trwaoci s zazwyczaj okrelane jako
obiekty dostpu do danych (ang. Data Access ObjectsDAO). Dobr praktyk pro-
jektow wynikajc ze stosowania tego wzorca jest tworzenie pojedynczego obiektu
DAO dla kadej utrwalanej klasy. Generalnie do najwaniejszych zada DAO nale
tworzenie (pobieranie) sesji Hibernate oraz zapisywanie (pobieranie) obiektów.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

89

Poniewa pewne operacje (zapis, odczyt czy wyszukiwanie) powtarzaj si we wszystkich
DAO, celem uniknicia powielania kodu moemy zdefiniowa wspólny interfejs oraz
klas abstrakcyjn zawierajc definicj powtarzajcych si dla rónych typów operacji.
Generyczny interfejs zosta zaprezentowany na listingu 2.8, a implementujca jego
metody klasa abstrakcyjna

GenericDao

na listingu 2.9.

Listing 2.8.

Interfejs definiujcy podstawowe operacje dla DAO

package isrp.hibernate.model.dao;
import java.util.List;

public interface GenericDaoInterface {
public abstract Object findById(int id);//wyszukiwanie po id
public abstract void save(Object object);//zapisywanie nowego obiektu
public abstract void saveOrUpdate(Object object);//zapisywanie lub modyfikowanie
//obiektu, jeli istnieje
public abstract void delete(Object object);//usuwanie obiektu
public abstract List findAll();//wyszukiwanie wszystkich obiektów
}

Listing 2.9.

Implementacje podstawowych operacji dostpnych w DAO

package isrp.hibernate.model.dao;
import isrp.hibernate.model.util.HibernateUtil;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Criteria;

public abstract class GenericDao implements GenericDaoInterface {
protected Class persistedClass;
protected Session session;

public GenericDao(Class persistedClass) {

/* pobranie sesji Hibernate z obiektu klasy uytkowej, zaprezentowanej na listingu 2.14*/

SessionFactory factory = HibernateUtil.getSessionFactory();
this.session = factory.getCurrentSession();
this.persistedClass = persistedClass;
}
public Object findById(int id) {
Object object = (Object) session.get(persistedClass, id);
return object;
}
public void save(Object object) {
session.save(object);
}
public void saveOrUpdate(Object object) {
session.saveOrUpdate(object);
}
public void delete(Object object) {
session.delete(object);
}
public List findAll() {
Criteria criteria = session.createCriteria(persistedClass);
return criteria.list();
}
}

background image

90

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Zastosowanie klasy abstrakcyjnej

GenericDao

pozwala na znaczne uproszczenie im-

plementacji konkretnych obiektów DAO. Na listingu 2.10 znajduje si kod ródowy
klasy

UserDao

, w którym zaimplementowane zostay wycznie operacje specyficzne

dla utrwalania obiektów

User

.

Listing 2.10.

Kod ródowy klasy UserDao

package isrp.hibernate.model.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import isrp.hibernate.model.businessobject.User;
import isrp.hibernate.model.util.Md5HashCode;

public class UserDao extends GenericDao {

public UserDao() {
super(User.class);//
}
public String getAdministratorEmail(){
User user = null;
Query query = session.createQuery("FROM User where role=?")
.setByte(0, new Byte("1"));
user = (User) query.uniqueResult();
return user.getEmail();
}
public List getReviewers(){
return session.createCriteria(persistedClass)
.add(Restrictions.eq("role", new Byte("3")))
.list();
}
public User authenticate(String email, String password) {
password = Md5HashCode.getMd5HashCode(password);
return (User) session.createCriteria(persistedClass)
.add(Restrictions.eq("email", email))
.add(Restrictions.eq("password", password))
.uniqueResult();
}
public User checkIfEmailExistInDB(String email) {
Query query = session.createQuery("FROM User where email=?")
.setString(0, email);
return (User) query.uniqueResult();
}
public List<User> getUsers(String sortColumn){
if (sortColumn==null){
sortColumn="firstName";
}
return (List<User>) session.createCriteria(persistedClass)
.addOrder(Order.asc(sortColumn))
.list();
}
}

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

91

Automatyczne generowanie DAO w Hibernate Tools

Hibernate umoliwia automatyczne generowanie obiektów DAO z wykorzystaniem
narzdzia Ant (opis znajduje si w dokumentacji Hibernate) bd wymienionej ju w tym
rozdziale wtyczki Hibernate Tools. Korzystajc z wtyczki Hibernate Tools, w rodo-
wisku Eclipse w grupie menu Run pojawi si nowa opcja — Hibernate Code Generation
Configurations
, bdca konfiguracj uruchomieniow automatycznego generowania
kodu przy uyciu Hibernate. Wybór tej opcji powoduje wywietlenie okna kreatora
Create, manage and run configurations, które w zakadce Exporters pozwala ustawi
opcj automatycznego generowania kodu ródowego klas DAO (opcja DAO code).
Automatycznie generowane w ten sposób klasy bd jednak opiera si na wykorzystaniu
interfejsu JNDI i obiektów klasy

javax.naming.InitialContext

. Nie jest to proble-

mem w przypadku serwerów aplikacji, ale przy korzystaniu z prostych kontenerów
serwletów, takich jak Tomcat, stanowi to utrudnienie, gdy naley samodzielnie za-
pewni kontekst pocztkowy. Tomcat wprawdzie dostarcza wasny obiekt kontekstowy
JNDI, ale nie mona go modyfikowa z poziomu kodu aplikacji (jest tylko do odczy-
tu), co powoduje, e nie moe on by wykorzystany przez Hibernate. Rozwizaniem
tego problemu jest uycie biblioteki Sun FS Context, dostpnej w pliku fscontext.jar,
która umoliwia przechowanie kontekstu aplikacji w postaci plików.

2.2.2.3. Fabrykowanie obiektów DAO

Analogicznie do problemu lokalizacji fasad w warstwie usugowej w przypadku uy-
cia DAO równie istotnym problemem jest zapewnienie atwej lokalizacji obiektów
poprzez centralizacj dostpu. W przypadku interfejsu do warstwy trwaoci centrali-
zacja ma za zadanie uatwienie tworzenia obiektów DAO oraz zamiany ich imple-
mentacji. Dostarczenie interfejsu do tworzenia rónych obiektów implementujcych
wspólny interfejs bez specyfikowania ich konkretnych klas zapewnia wzorzec pro-
jektowy fabryki abstrakcyjnej (ang. abstract factory). Umoliwia on jednemu obiektowi
tworzenie rónych, powizanych ze sob reprezentacji podobiektów, okrelajc ich
typy podczas dziaania programu.

Przykadowa fabryka abstrakcyjna dla obiektów DAO uyta w aplikacji ISRP zapre-
zentowana zostaa na listingu 2.11, a jej implementacja na listingu 2.12. Przykady
wykorzystania fabryki obiektów do tworzenia DAO w warstwie usugowej zaprezen-
towano na listingu 2.13.

Listing 2.11.

Fabryka abstrakcyjna obiektów DAO

package isrp.hibernate.model.dao.factory;
import isrp.hibernate.model.dao.*;

public abstract class DaoFactory {
private static DaoFactory instance = new HibernateDaoFactory();

public static DaoFactory getInstance() {
return instance;
}

background image

92

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

public abstract UserDao getUserDao();
public abstract CountryDao getCountryDao();
public abstract PaperDao getPaperDao();
public abstract QuestionDao getQuestionDao();
public abstract ReviewDao getReviewDao();
public abstract AnswersquestionsDao getAnswersquestionsDao();
}

Listing 2.13.

Implementacja fabryki obiektów DAO

package isrp.hibernate.model.dao.factory;
import isrp.hibernate.model.dao.*;

public class HibernateDaoFactory extends DaoFactory {

public UserDao getUserDao() {return new UserDao();}
public CountryDao getCountryDao() {return new CountryDao();}
public PaperDao getPaperDao() {return new PaperDao();}
public QuestionDao getQuestionDao() {return new QuestionDao();}
public ReviewDao getReviewDao() {return new ReviewDao();}
public AnswersquestionsDao getAnswersquestionsDao() {return new

´AnswersquestionsDao();}

}

Listing 2.13.

Kod filtru umoliwiajcego automatyczne zarzdzanie sesj Hibernate

package isrp.filters;
import isrp.util.HibernateUtil;
import java.io.IOException;
import javax.servlet.*;
import org.apache.commons.logging.*;
import org.hibernate.*;

public class HibernateSessionFilter implements Filter {

private SessionFactory factory = null;
private static final Log log = LogFactory.getLog(HibernateSessionFilter.class);
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
log.debug("<< HIBERNATE START");
chain.doFilter(request, response);
log.debug(">> HIBERNATE END");
session.getTransaction().commit();
} catch (Throwable e) {
try {
if (session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
} catch (HibernateException e1) {
log.error("Niemoliwe wykonanie operacji rollback", e1);
e1.printStackTrace();
}
throw new ServletException(e);

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

93

}
}

public void destroy() {}

public void init(FilterConfig filterConfig) throws ServletException{
factory = HibernateUtil.getSessionFactory();
if (filterConfig == null) {
log.error("HibernateSessionFilter: Nie zainicjowano filtru");
throw new ServletException();
}
}
}

2.2.2.4. Zarzdzanie sesj Hibernate w warstwie widoku

W celu zapewnienia zarzdzania poczeniem z baz danych (tzw. sesj Hibernate)
moemy wykorzysta wzorzec Open Session in View (OSIV), którego idea opiera si
na zaoeniu, e zawsze do wygenerowania odpowiedzi HTTP niezbdne s informacje
przechowywane w bazie danych. Sesja Hibernate otwierana jest po pojawieniu si -
dania HTTP i jest dostpna przez cay proces generowania strony widoku. Wprowadzone
zmiany do bazy zatwierdzane s dopiero po realizacji caego dania, tj. wygenero-
waniu dokumentu odpowiedzi HTTP. Nie jest to jedyna moliwa do zastosowania tutaj
strategia; warto wspomnie o rozwizaniach polegajcych na wprowadzaniu zmian do
bazy danych w trybie automatycznego zatwierdzania transakcji (autocommit) czy te
inicjowaniu sesji i pobieraniu danych niezbdnych do generowania warstwy widoku
jeszcze przed przekazaniem sterowania do niej. Strategie zarzdzania sesj Hibernate
opisane s wyczerpujco w ksikach POJOs in Action. Developing Enterprise Appli-
cations with Lightweight Frameworks

2

oraz Java Persistence with Hibernate

3

. Wzorzec

OSIV pozwala na realizacj wielu operacji w trakcie jednej sesji z Hibernate. Na listingu
2.13 przedstawiono uyty w aplikacji ISRP filtr implementujcy wzorzec OSIV. Filtr
przechwytuje wszystkie dania pynce do aplikacji i dla kadego z nich rozpoczyna
now transakcj, w której realizowane s wszystkie operacje na bazie danych, reali-
zowane w trakcie przetwarzania dania HTTP. Transakcja jest zatwierdzana dopiero
po zakoczeniu przetwarzania dania. Filtr zawiera obsug wszelkich wyjtków i b-
dów, które mog wystpi podczas przetwarzania dania. Jeli istnieje aktywna sesja
Hibernate, to po wystpieniu bdów lub wyjtków zmiany w bazie danych s wyco-
fywane (rollback). W kodzie do pobrania biecej sesji Hibernate uyto klasy po-
mocniczej

HibernateUtil

,

zaprezentowanej na listingu 2.14. Interakcje wystpujce

pomidzy elementami implementacji wzorca OSIV przedstawione zostay na rysunku 2.9.

Rejestracja filtru w pliku web.xml w najprostszym schemacie bdzie mie nastpujc
posta :

2

Chris Richardson, POJOs in Action. Developing Enterprise Applications with Lightweight Frameworks,
Manning 2006.

3

Christian Bauer, Gavin King, Java Persistence with Hibernate, Manning 2006.

background image

94

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

<filter>
<filter-name>HibernateSessionFilter</filter-name>
<filter-class>isrp.filters.HibernateSessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HibernateSessionFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

Jak atwo zauway , w powyszym kodzie wykonano mapowanie filtru na wszystkie
zasoby URL, co jest rozwizaniem wysoce niewydajnym — sesja Hibernate jest two-
rzona zawsze, równie dla tych da HTTP, których przetwarzanie nie wymaga po-
czenia do bazy danych. Uytkownik w tym miejscu w zalenoci od potrzeb moe
zmieni mapowanie na wybrane dania lub filtracj da obsugiwanych tylko
przez wybrany serwlet (np. poprzez wstawienie w miejsce znaczników

<url-pattern>

znacznika

<servlet-name>Faces Servlet</servlet-name>

do obsugi da przez apli-

kacj JSF).

Listing 2.14.

Kod klasy uytkowej HibernateUtil

package isrp.hibernate.model.util;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.SessionFactory;

public class HibernateUtil {
private static final SessionFactory sessionFactory;
private static final Log log = LogFactory.getLog(HibernateUtil.class);

static {
try {// Tworzy SessionFactory na podstawie konfiguracji w pliku hibernate.cfg.xml
sessionFactory = new AnnotationConfiguration()
.configure().buildSessionFactory();
} catch (Throwable ex) {
log.error("Nie mona pobra sesji Hibernate " + ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
}

Organizujc kod aplikacji, naley pamita, e

HibernateSessionFilter jest elemen-

tem warstwy widoku aplikacji WWW, podczas gdy klasa

HibernateUtil zapewnia

dostp do warstwy trwaoci.

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

95

Klient

Kontener Web

Hibernate Filter

HibernateUtil

FacesServlet

JSF Request()

doFilter()

getSessionFactory()

beginTransaction()

service()

commit()

Rysunek 2.9.

Diagram sekwencji wzorca OSIV dla aplikacji JSF

2.3. Organizacja kodu aplikacji

w Eclipse

Kod aplikacji WWW opartych na technologii Java EE zazwyczaj jest wytwarzany
w postaci wielu moduów, rozwijanych niezalenie przez róne zespoy projektowe.
Rozproszenie kodu aplikacji w wielu projektach uatwia m.in.:



zarzdzanie kodem ródowym i plikami zasobów,



podzia pracy w zespoach,



zautomatyzowanie procesu wytwarzania i testowania aplikacji.

W dalszej czci rozdziau znajduje si opis rozwiza, jakie zapewnia Eclipse WTP
w zakresie organizacji kodu ródowego oraz integracji i wdraania skompilowanych
moduów aplikacji na serwerze.

2.3.1. Projekty i moduy Java EE w Eclipse

Zanim zajmiemy si planowaniem rozmieszczenia kodu aplikacji ISRP, warto przybliy
podstawowe koncepcje zwizane z wytwarzaniem i wdraaniem aplikacji Java EE w ro-
dowisku Eclipse Web Tools Platform, a mianowicie projekt i modu aplikacji.

background image

96

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Wszystkie pliki ródowe oraz inne zasoby aplikacji bd biblioteki musz by umiesz-
czone w projekcie skadajcym si z jednego lub wielu zagniedonych katalogów.
Projekt stanowi podstawow jednostk organizacyjn kodu aplikacji i jest zapisywany
w przestrzeni projektów (ang. workspace). Projekt opisywany jest za pomoc meta-
danych, które zawieraj pomocnicze informacje o wymaganych zasobach zewntrz-
nych, sposobie kompilacji czy rodowisku uruchomieniowym. Logiczna struktura
prezentowanych w oknie Project Explorer katalogów i zasobów projektu jest zopty-
malizowana pod ktem uatwienia pracy deweloperom.

Modu aplikacji

(ang. module) reprezentuje gotowy do wdroenia na serwerze apli-

kacji kod wynikowy projektu (powstay po jego skompilowaniu), który moe by re-
prezentowany przy uyciu plików archiwalnych, np. WAR lub JAR. Moduy Java EE
posiadaj okrelon przez specyfikacj Java EE fizyczn struktur katalogów oraz
plików. Moduy mog by wdraane w kontenerze Java EE zarówno w postaci spa-
kowanych plików archiwum, jak te rozpakowanych struktur katalogów. Eclipse
WTP wspiera wytwarzanie i wdraanie nastpujcych moduów Java EE (w nawiasach
podano typy archiwum oraz nazwy odpowiadajcych im projektów Eclipse po mylniku):



Enterprise application (EAR) — Enterprise application Project,



Enterprise application client (JAR) — Application Client Project,



Enterprise JavaBean (JAR) — EJB Project,



Web application (WAR) — Dynamic Web Project,



Resource adapter for JCA (RAR) — Connector Project,



Utility module (JAR) — Utility Project.

Pierwszych pi wymienionych typów moduów jest okrelonych w specyfikacji Java
EE, natomiast ostatni typ zosta wprowadzony przez rodowisko Eclipse i stanowi
modu uytkowy

(Utility module) ogólnego przeznaczenia, umoliwiajcy podzia

kodu aplikacji na oddzielne projekty. Kady projekt WTP moe generowa tylko jeden
modu aplikacji, ale w kodzie ródowym projektu mona odwoywa si do kodu
umieszczonego w innych moduach. Odwoywanie si do kodu znajdujcego si w innych
moduach wymaga jednak jawnego zdefiniowania zalenoci pomidzy projektami,
co jest zilustrowane przykadem w dalszej czci rozdziau.

2.3.2. Zastosowanie projektu uytkowego

do przechowywania kodu warstwy biznesowej

Zaómy, e chcemy umoliwi rozwijanie aplikacji ISRP w dwóch projektach, tak
by kod warstwy prezentacji opartej na szkielecie JSF znajdowa si w jednym projek-
cie, a kod pozostaych warstw (biznesowej i dostpu do danych) w innym. Zalet ta-
kiego podziau bdzie moliwo wielokrotnego wykorzystania moduu zawierajcego
warstw biznesow w aplikacjach zawierajcych interfejsy oparte na rónych tech-
nologiach (np. JSF i Swing).

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

97

W materiaach pomocniczych do ksiki Czytelnik znajdzie m.in. kod moduu uyt-
kowego ISRPModel, zawierajcy implementacj warstwy biznesowej, udostpniony
w postaci zarchiwizowanego pliku projektu Eclipse oraz skompilowanej wersji mo-
duu w pliku JAR. Czytelnik, który chciaby pomin zagadnienia wytwarzania war-
stwy biznesowej, moe skorzysta z gotowego do uycia moduu ISRPModel i skupi
si wycznie na implementacji interfejsu uytkownika wedug wskazówek zamieszczo-
nych w nastpnych rozdziaach.

Na rysunku 2.10 przedstawiono struktur aplikacji ISRP, która skada si z moduów
Web Application oraz Utility Module. Modu Web Application zawiera kod warstwy
prezentacji i jest tworzony w rodowisku Eclipse przy uyciu projektu typu Dynamic
Web Project (przykad takiego projektu zosta zaprezentowany w rozdziale 1.). Modu
Utility Module przechowuje warstw biznesow aplikacji ISRP i jest tworzony w ro-
dowisku Eclipse przy uyciu projektu typu Utility Project.

Dynamic Web Project (WAR)

«library»

JavaServer Faces

Utility Project (JAR)

«interface»

Interfejsy warstwy usugowej

«library»

Hibernate

Obiekty DAO

Odwzorowania OR

Komponenty

wspierajce

Komponenty

zarzdzane

Warstwa dostpu do danych

Warstwa biznesowa

Implementacje

usug

Model dziedzinowy

(obiekty biznesowe)

Zasoby

Widoki JSP

Walidatory i

konwertery

Filtry

Rysunek 2.10.

Struktura moduów aplikacji ISRP oraz zalenoci wystpujce pomidzy nimi

background image

98

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Projekt typu Java EE Utility Project jest bardzo podobny do zwykego projektu Javy
w rodowisku Eclipse, ale posiada dodatkowy pakiet rozszerze (tzw. facet) — Utility
Module (idea pakietów rozszerze Eclipse zostaa omówiona w rozdziale 1., w ramce
„JSF Facet”). Utility Module stanowi cz konfiguracji uruchomieniowej projektu
i umoliwia wykorzystanie skompilowanego kodu projektu w innych moduach aplikacji
korporacyjnej (Java EE). Gdy zmiany w projekcie zostan zapisane, Eclipse automa-
tycznie go skompiluje i spakuje kod wynikowy do pliku JAR, który nastpnie jest pu-
blikowany (bd aktualizowany) na serwerze oraz w innych projektach, które z niego
korzystaj.

Ze wzgldu na opisane wyej waciwoci Utility Project znakomicie nadaje si do
przechowywania kodu warstwy biznesowej oraz interfejsu warstwy trwaoci, oczy-
wicie pod warunkiem, e model dziedzinowy nie jest oparty na komponentach EJB
(w takim przypadku wymagany jest EJB Module).

W celu utworzenia nowego projektu Java EE Utility Project naley wykona nastpujce
kroki:

1.

Z menu aplikacji wybieramy opcj File/New/Project. Pojawi si okno kreatora
New Project, w którym wywietli si lista typów projektów.

2.

Na licie wskazujemy grup projektów korporacyjnych (Java EE). Po rozwiniciu
elementów grupy wybieramy opcj Utility Project i zatwierdzamy przyciskiem Next.
Wywietli si okno kreatora New Java Utility Module, pokazane na rysunku 2.11.

Rysunek 2.11.
Tworzenie projektu
typu Utility Project

background image

Rozdzia 2.

i Planowanie, modelowanie i projektowanie aplikacji JSF na platformie Java

99

3.

W polu Project name wpisujemy nazw projektu. Nastpnie z listy rozwijanej
Target Runtime wybieramy rodowisko uruchomieniowe serwera, na którym
ma by publikowany kod wynikowy projektu. Aby doda kolejne pakiety
rozszerze Eclipse do projektu (np. dla szkieletu Spring), naley w sekcji
Configuration klikn przycisk Modify i w nowym oknie kreatora zaznaczy
odpowiednie pola wyboru. Wszystko zatwierdzamy przyciskiem Next
i przechodzimy do kolejnego okna, w którym moemy zaczy do projektu
dodatkowe róda. Cao zatwierdzamy przyciskiem Finish.

2.3.3. Moduy zalene

Istniej dwa sposoby wykorzystania gotowego moduu uytkowego w aplikacji, a miano-
wicie:



bezporednie wdroenie moduu uytkowego w rodowisku uruchomieniowym
serwera (opisane w poprzednim punkcie),



ustawienie zalenoci pomidzy projektami i wykorzystanie moduu uytkowego
podczas budowy innego moduu.

W drugim przypadku we waciwociach projektu Utility Project ustawiamy warto
<None> w polu Target Runtime. Aby doczy modu Utility Module do dowolnego
innego projektu Java EE, w oknie Project Explorer zaznaczamy projekt docelowy i z menu
kontekstowego wybieramy opcj Properties. Nastpnie w oknie waciwoci wybie-
ramy stron Java EE Module Dependencies, po czym zaznaczamy pole wyboru przy
nazwie projektu, którego skompilowany kod chcemy doczy , jak pokazano na ry-
sunku 2.12.

Rysunek 2.12.
Ustawianie zalenoci
pomidzy projektami
Java EE

background image

100

JavaServer Faces i Eclipse Galileo. Tworzenie aplikacji WWW

Na przykad do budowy aplikacji ISRP wykorzystamy dwa projekty — projekt Dynamic
Web Project (DWP) do rozwijania kodu warstwy prezentacji oraz Utility Project (UP)
do rozwijania warstwy biznesowej oraz warstwy dostpu do danych. Poniewa ocze-
kiwanym moduem wynikowym aplikacji ma by aplikacja WWW, projekt DWP b-
dzie zaleny od UP. Po kadej kompilacji wynikowy modu Utility Module bdzie
automatycznie dodawany (zamieniany) do wynikowego pliku WAR oraz sekcji Web
App Libraries w ciece przeszukiwania projektu DWP. Jednoczenie kada zmiana
pliku WAR bdzie powodowa automatyczn publikacj nowej wersji aplikacji WWW
na serwerze, chyba e uytkownik zmieni domylne ustawienia dotyczce publiko-
wania (patrz rozdzia 6., rysunek 6.2).

Wszystkie klasy i doczone do projektu uytkowego biblioteki s widoczne w projekcie
zalenym. Klasy i biblioteki projektu zalenego nie s jednak widoczne w projekcie
uytkowym. Niestety, nie moemy zdefiniowa odwrotnej zalenoci, gdy spowo-
dowaoby to powstanie cyrkularnoci, która jest przez rodowisko Eclipse automa-
tycznie wykrywana i traktowana jako bd. Do powszechnym rozwizaniem tego
problemu jest umieszczenie kodu niezbdnych dla obu projektów klas w oddziel-
nym projekcie uytkowym (Utility Project). W takim przypadku dwa projekty s za-
lene od trzeciego i nie powstaje pomidzy nimi zaleno cyrkularna.

background image

Wyszukiwarka

Podobne podstrony:
Eclipse Web Tools Platform Tworzenie aplikacji WWW w jezyku Java
PHP i MySQL Tworzenie aplikacji WWW phmsap
PHP i MySQL Tworzenie aplikacji WWW
PHP i MySQL Tworzenie aplikacji WWW phmsap
Ruby on Rails Tworzenie aplikacji WWW
PHP i MySQL Tworzenie aplikacji WWW 2
Ruby on Rails Tworzenie aplikacji WWW rrtwww
PHP i MySQL Tworzenie aplikacji WWW phmsap
PHP i MySQL Tworzenie aplikacji WWW
PHP i MySQL Tworzenie aplikacji WWW phmsap
PHP i MySQL Tworzenie aplikacji WWW
Ruby on Rails Tworzenie aplikacji WWW 2
PHP i MySQL Tworzenie aplikacji WWW
Podstawy ASP NET 2 0 – tworzenie stron WWW oraz aplikacji Web
Java Tworzenie aplikacji sieciowych za pomoca Springa Hibernate i Eclipse

więcej podobnych podstron