You are on page 1of 37

IDZ DO

PRZYKADOWY ROZDZIA
SPIS TRECI

KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG

TWJ KOSZYK
DODAJ DO KOSZYKA

CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK

CZYTELNIA
FRAGMENTY KSIEK ONLINE

Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl

Java Servlet i JavaServer


Pages. Tom 1. Wydanie II
Autorzy: Marty Hall, Larry Brown
Tumaczenie: Piotr Rajca
ISBN: 83-246-0032-9
Tytu oryginau: Core Servlets and JavaServer
Pages, Vol. 1: Core Technologies, Second Edition
Format: B5, stron: 640
Zastosuj platform Java 2 do tworzenia
aplikacji internetowych i dynamicznych witryn WWW
Zainstaluj i skonfiguruj serwery aplikacji
Poznaj zasady tworzenia serwletw i dokumentw JSP
Pocz aplikacj z baz danych
Java Servlet i JavaServer Pages to oparte na platformie Java 2 technologie
wykorzystywane do tworzenia aplikacji internetowych i dynamicznych witryn WWW.
Stosuje si je wszdzie tam, gdzie niezbdna jest wysoka stabilno i niezawodno,
wydajno przy przetwarzaniu danych i elastyczno pozwalajca na szybkie
dodawanie kolejnych moduw rozszerzajcych moliwoci aplikacji. W oparciu o te
technologie powstaj midzy innymi systemy bankowoci elektronicznej, aplikacje
finansowe oraz systemy do obsugi programw lojalnociowych. Ogromn zalet tej
technologii jest fakt, e zarwno narzdzia programistyczne, jak i serwery aplikacji
dostpne s nieodpatnie, na zasadach open source, co redukuje koszty tworzenia
oraz uytkowania stworzonych za ich pomoc systemw.
Ksika Java Servlet i JavaServer Pages. Tom 1. Wydanie II przedstawia sposoby
wykorzystywania najnowszych moliwoci serwletw i stron JSP. Wyjania, w jakich
przypadkach naley stosowa serwlety, w jakich JSP oraz kiedy poczy te
technologie. Czytajc j, poznasz specyfikacj technologii Java Servlet w wersji 2.4
oraz technologii JSP w wersji 2.0, nauczysz si instalowa i konfigurowa serwery
aplikacji oraz dowiesz si, jak tworzy aplikacje w obu technologiach i jak czy je
z bazami danych za pomoc interfejsw JDBC. Zastosujesz w swoich projektach
najlepsze strategie, ktrych omwienie rwnie znajdziesz w tej ksice.
Instalacja i konfiguracja serwera Tomcat, JRun i Resin
Zasady tworzenia serwletw
Obsuga protokou HTTP oraz danych z formularzy HTML
Generowanie plikw XLS
ledzenie sesji i stosowanie plikw cookie
Podstawy stosowania JSP
Wykorzystywanie komponentw JavaBean
Architektura MVC
Poczenie z bazami danych za pomoc JDBC
Napisz wydajne i stabilne aplikacje internetowe, wykorzystujc nowoczesne technologie

Spis treci
Podzikowania ......................................................................................................................................... 13
O autorach ................................................................................................................................................ 14
Wprowadzenie ......................................................................................................................................... 15
Rozdzia 1. Oglne informacje o serwletach i JavaServer Pages ........................................................25
1.1. Rola serwletw .................................................................................................. 25
1.2. Dlaczego warto dynamicznie generowa strony WWW? .......................................... 27
1.3. Przedstawienie kodu serwletu ............................................................................. 28
1.4. Zalety serwletw w porwnaniu ze zwykymi programami CGI ................................. 30
Efektywno ................................................................................................. 30
Wygoda ........................................................................................................ 30
Due moliwoci ............................................................................................ 31
Przenono ................................................................................................. 31
Niewielkie koszty ........................................................................................... 31
Bezpieczestwo ............................................................................................ 32
Gwny kierunek rozwoju ................................................................................ 33
1.5. JavaServer Pages .............................................................................................. 33

Cz I Serwlety

35

Rozdzia 2. Instalacja i konfiguracja serwera ......................................................................................37


2.1. Pobranie oraz instalacja Java Software Development Kit (SDK) .............................. 38
2.2. Pobranie serwera na lokalny komputer ................................................................ 39
2.3. Konfiguracja serwera .......................................................................................... 42
2.4. Konfiguracja serwera Tomcat .............................................................................. 43
Okrelanie wartoci zmiennej rodowiskowej JAVA_HOME ................................ 44
Okrelanie portu uywanego przez serwer ........................................................ 45
Uaktywnianie opcji automatycznej aktualizacji serwletw .................................. 46
Uaktywnienie kontekstu gwnego .................................................................. 47
Wczenie serwletu wywoujcego ................................................................... 47
Powikszenie limitw pamici dla programw DOS ........................................... 48
Okrelenie wartoci zmiennej rodowiskowej CATALINA_HOME ......................... 48
Testowanie podstawowej konfiguracji serwera ................................................. 48

Java Servlet i JavaServer Pages. Tom 1


2.5. Konfiguracja serwera JRun .................................................................................. 49
Numer seryjny serwera .................................................................................. 50
Ograniczenia uytkownikw ............................................................................ 50
Katalog instalacyjny Javy ................................................................................ 50
Katalog instalacyjny serwera .......................................................................... 51
Nazwa i haso administratora ......................................................................... 51
Moliwo automatycznego uruchamiania serwera ........................................... 51
Okrelenie portu serwera ............................................................................... 52
Testowanie podstawowej konfiguracji serwera ................................................. 53
2.6. Konfiguracja serwera Resin ................................................................................ 54
Okrelanie wartoci zmiennej rodowiskowej JAVA_HOME ................................ 54
Okrelenie portu uywanego przez serwer Resin .............................................. 55
Testowanie podstawowej konfiguracji serwera ................................................. 55
2.7. Konfiguracja rodowiska pracy ............................................................................ 55
Stworzenie katalogu roboczego ...................................................................... 56
Okrelanie wartoci zmiennej rodowiskowej CLASSPATH ................................. 57
Tworzenie skrtw uatwiajcych uruchamianie i zatrzymywanie serwera ............ 58
Zapisanie adresu lub zainstalowanie dokumentacji API serwletw i JSP ............. 59
2.8. Testowanie konfiguracji ...................................................................................... 60
Sprawdzenie konfiguracji SDK ........................................................................ 60
Sprawdzenie podstawowej konfiguracji serwera ............................................... 61
Kompilacja i wdroenie prostych serwletw ..................................................... 63
2.9. Tworzenie uproszczonej metody wdraania ........................................................... 69
Utworzenie skrtw lub czy symbolicznych .................................................... 70
Stosowanie opcji -d kompilatora ..................................................................... 71
Wdraanie przy wykorzystaniu IDE ................................................................... 71
Zastosowanie programu ant lub podobnego .................................................... 72
2.10. Katalogi wdroeniowe dla domylnych aplikacji WWW. Podsumowanie .................. 72
Tomcat ......................................................................................................... 73
JRun ............................................................................................................ 73
Resin ........................................................................................................... 74
2.11. Aplikacje WWW prezentacja .......................................................................... 75
Utworzenie katalogu aplikacji ......................................................................... 76
Aktualizacja zmiennej rodowiskowej CLASSPATH ............................................ 77
Zarejestrowanie aplikacji WWW na serwerze .................................................... 77
Stosowanie prefiksw adresw URL ................................................................ 79
Przypisywanie serwletom niestandardowych adresw URL ................................ 81

Rozdzia 3. Podstawy tworzenia serwletw .........................................................................................85


3.1. Podstawowa struktura serwletw ........................................................................ 86
3.2. Serwlet generujcy zwyky tekst .......................................................................... 88
3.3. Serwlet generujcy kod HTML ............................................................................. 89
3.4. Umieszczanie serwletw w pakietach .................................................................. 92
3.5. Proste narzdzia pomocne podczas tworzenia dokumentw HTML ......................... 93
3.6. Cykl istnienia serwletw ..................................................................................... 96
Metoda service ............................................................................................. 97
Metody doGet, doPost oraz doXxx ................................................................... 98
Metoda init ................................................................................................... 98
Metoda destroy ........................................................................................... 103
3.7. Interfejs SingleThreadModel ............................................................................. 104
3.8. Testowanie serwletw ...................................................................................... 108

Spis treci

Rozdzia 4. Obsuga da: dane przesyane za pomoc formularzy ...................................................111


4.1. Znaczenie informacji przesyanych za pomoc formularzy .................................... 111
4.2. Odczytywanie danych formularzy w serwletach .................................................... 113
Odczytywanie pojedynczych wartoci: metoda getParameter ............................ 113
Odczytywanie wielu wartoci: metoda getParameterValues ............................. 114
Pobieranie nazw parametrw: metody getParameterNames
oraz getParameterMap ........................................................................... 114
Odczytywanie nieprzetworzonych danych formularza
i analiza przesyanych plikw: metody getReader oraz getInputStream ........ 115
Odczyt danych zakodowanych przy uyciu rnych zbiorw znakw:
metoda setCharacterEncoding ................................................................ 116
4.3. Przykad: odczytanie trzech konkretnych parametrw ........................................... 117
4.4. Przykad: odczytanie wszystkich parametrw ...................................................... 120
4.5. Stosowanie wartoci domylnych, gdy nie podano parametru
lub jego warto jest niewaciwa ..................................................................... 123
4.6. Filtrowanie acuchw w poszukiwaniu znakw specjalnych HTML ........................ 133
Implementacja filtrowania ............................................................................ 134
Przykad: serwlet wywietlajcy fragmenty kodu ............................................. 136
4.7. Automatyczne zapisywanie wartoci parametrw w obiektach Javy:
komponenty formularzy .................................................................................... 139
Zastosowanie klasy BeanUtilities ................................................................. 142
Pobieranie i instalacja pakietw Jakarta Commons ........................................ 145
4.8. Ponowne wywietlanie formularza w przypadku pominicia
lub bdnego podania wartoci parametrw ....................................................... 146
Opcje ponownego wywietlania formularza .................................................... 146
Serwlet obsugujcy aukcje .......................................................................... 148

Rozdzia 5. Obsuga da: nagwki da HTTP ................................................................................ 155


5.1. Odczytywanie wartoci nagwkw dania w serwletach ..................................... 156
5.2. Wywietlanie wszystkich nagwkw .................................................................. 157
5.3. Nagwki da protokou HTTP 1.1 .................................................................. 159
5.4. Przesyanie skompresowanych stron WWW ........................................................ 164
5.5. Rozrnianie przegldarek rnych typw ........................................................... 167
5.6. Modyfikowanie strony w zalenoci od tego, skd uytkownik na ni trafi ............ 169
5.7. Dostp do standardowych zmiennych CGI .......................................................... 173
Odpowiedniki zmiennych CGI dostpne w serwletach ..................................... 173
Serwlet wywietlajcy wartoci zmiennych CGI ............................................... 176

Rozdzia 6. Generowanie odpowiedzi: kody statusu HTTP ................................................................... 179


6.1. Okrelanie kodw statusu ................................................................................ 180
Okrelanie dowolnego kodu statusu: metoda setStatus ................................. 180
Stosowanie kodw statusu 302 oraz 404:
metody sendRedirect oraz sendError ....................................................... 181
6.2. Kody statusu protokou HTTP 1.1 oraz ich przeznaczenie .................................... 182
6.3. Serwlet przekierowujcy uytkownika na stron wybran
zalenie od uywanej przegldarki ..................................................................... 187
6.4. Interfejs uytkownika obsugujcy rne serwisy wyszukujce .............................. 189

Rozdzia 7. Generowanie odpowiedzi: nagwki odpowiedzi HTTP ...................................................... 195


7.1. Okrelanie nagwkw odpowiedzi z poziomu serwletw ...................................... 195
7.2. Nagwki odpowiedzi protokou HTTP 1.1 oraz ich znaczenie ................................ 197
7.3. Generowanie arkuszy kalkulacyjnych programu Excel .......................................... 204

Java Servlet i JavaServer Pages. Tom 1


7.4. Trwae przechowywanie stanu serwletu i automatyczne odwieanie stron ............ 205
Znajdowanie liczb pierwszych na potrzeby systemw kryptograficznych
z kluczem publicznym ............................................................................. 206
7.5. Zastosowanie serwletw do generowania obrazw JPEG ..................................... 215

Rozdzia 8. Obsuga cookies ................................................................................................................. 225


8.1. Korzyci pynce ze stosowania cookies ............................................................ 225
Identyfikacja uytkownikw podczas trwania sesji
na witrynach zajmujcych si handlem elektronicznym .............................. 226
Zapamitywanie nazwy uytkownika i hasa ................................................... 226
Dostosowywanie witryny ............................................................................... 227
Dobr reklam .............................................................................................. 227
8.2. Niektre problemy zwizane ze stosowaniem cookies ......................................... 227
8.3. Usuwanie cookies ............................................................................................ 230
8.4. Wysyanie i odbieranie cookies ......................................................................... 230
Wysyanie cookies do przegldarki ................................................................ 231
Odczytywanie cookies przesyanych przez klienta ........................................... 233
8.5. Zastosowanie cookies do wykrywania uytkownikw odwiedzajcych stron
po raz pierwszy ................................................................................................ 234
8.6. Stosowanie atrybutw cookies .......................................................................... 236
8.7. Rozrnianie cookies sesyjnych od trwaych ....................................................... 239
8.8. Proste narzdzia do obsugi cookies .................................................................. 242
Odnajdywanie cookie o okrelonej nazwie ..................................................... 242
Tworzenie cookies o dugim czasie wanoci ................................................. 243
8.9. Praktyczne zastosowanie klas uatwiajcych obsug cookies .............................. 244
8.10. Modyfikacja wartoci cookie: ledzenie iloci odwiedzin uytkownika .................... 246
8.11. Uycie cookies do zapamitywania preferencji uytkownika ................................. 248

Rozdzia 9. ledzenie sesji ................................................................................................................... 253


9.1. Potrzeba ledzenia sesji ................................................................................... 253
Cookies ...................................................................................................... 254
Przepisywanie adresw URL ......................................................................... 254
Ukryte pola formularzy ................................................................................. 255
ledzenie sesji w serwletach ........................................................................ 255
9.2. Podstawowe informacje o ledzeniu sesji .......................................................... 255
Pobieranie obiektu HttpSession skojarzonego z biecym daniem ................ 256
Pobieranie informacji skojarzonych z sesj .................................................... 257
Kojarzenie informacji z sesj ........................................................................ 257
Usuwanie danych sesji ................................................................................ 258
9.3. Interfejs programowania aplikacji sucy do obsugi sesji ................................... 258
9.4. Sesje przegldarki a sesje serwera ................................................................... 260
9.5. Przepisywanie adresw URL przesyanych do przegldarki ................................... 261
9.6. Serwlet generujcy indywidualny licznik odwiedzin dla kadego uytkownika .......... 263
9.7. Gromadzenie listy danych uytkownika ............................................................... 265
9.8. Internetowy sklep wykorzystujcy koszyki i ledzenie sesji ................................... 269
Tworzenie interfejsu uytkownika .................................................................. 269
Obsuga zamwie ...................................................................................... 273
To, czego nie wida: implementacja koszyka i katalogu produktw .................. 277

Spis treci

Cz II JavaServer Pages

285

Rozdzia 10. Przegld technologii JSP ................................................................................................. 287


10.1. Potrzeba technologii JSP ................................................................................ 288
10.2. Zalety JSP ..................................................................................................... 289
10.3. Zalety JSP w porwnaniu z innymi technologiami .............................................. 290
W porwnaniu z platform .NET oraz technologi Active Server Pages (ASP) ..... 291
W porwnaniu z PHP .................................................................................... 291
W porwnaniu z serwletami .......................................................................... 291
W porwnaniu z jzykiem JavaScript ............................................................. 292
W porwnaniu z WebMacro oraz Velocity ....................................................... 292
10.4. Bdne opinie dotyczce JSP ........................................................................... 293
Ignorowanie faktu, e JSP jest technologi dziaajc po stronie serwera ......... 293
Mylenie czasu przeksztacania z czasem dania ........................................... 294
Przypuszczenie, e wystarczy znajomo i stosowanie samej technologii JSP ... 295
Przypuszczenie, e wystarczy znajomo i stosowanie samych serwletw ......... 296
10.5. Instalacja stron JSP ....................................................................................... 296
Katalogi JSP na serwerze Tomcat (domylna aplikacja WWW) ......................... 297
Katalogi JSP na serwerze JRun (domylna aplikacja WWW) ............................. 297
Katalogi JSP na serwerze Resin (domylna aplikacja WWW) ............................ 297
10.6. Podstawowa skadnia JSP .............................................................................. 298
Tekst HTML ................................................................................................ 298
Komentarze HTML ....................................................................................... 298
Tekst szablonu ............................................................................................ 298
Komentarze JSP .......................................................................................... 299
Wyraenia JSP ............................................................................................. 299
Skryptlet ..................................................................................................... 299
Deklaracja JSP ............................................................................................ 299
Dyrektywa JSP ............................................................................................. 300
Akcja JSP ................................................................................................... 300
Element Jzyka Wyrae JSP ........................................................................ 300
Znacznik niestandardowy (akcja niestandardowa) .......................................... 300
Zabezpieczony tekst szablonu ...................................................................... 301

Rozdzia 11. Wywoywanie kodu Javy przy uyciu elementw skryptowych JSP ........................... 303
11.1. Tworzenie tekstu szablonu .............................................................................. 303
11.2. Wywoywanie kodu Javy w stronach JSP ........................................................... 304
Typy elementw skryptowych JSP .................................................................. 305
11.3. Ograniczanie iloci kodu umieszczanego na stronach JSP ................................. 305
Znaczenie stosowania pakietw ................................................................... 307
11.4. Stosowanie wyrae JSP ................................................................................ 309
Zmienne predefiniowane .............................................................................. 309
Te same rozwizania w serwletach i stronach JSP .......................................... 309
Zapis wyrae przy uyciu skadni XML .......................................................... 311
11.5. Przykad: wyraenia JSP .................................................................................. 311
11.6. Porwnanie serwletw i stron JSP ................................................................... 313
11.7. Pisanie skryptletw ........................................................................................ 315
Te same rozwizania w serwletach i stronach JSP .......................................... 316
Skadnia XML do zapisu skryptletw ............................................................. 317
11.8. Przykad skryptletu ......................................................................................... 317
11.9. Zastosowanie skryptletw do warunkowego wykonywania fragmentw stron JSP ... 319

Java Servlet i JavaServer Pages. Tom 1


11.10. Stosowanie deklaracji .................................................................................... 321
Te same rozwizania w serwletach i stronach JSP .......................................... 322
Skadnia XML do zapisu deklaracji ................................................................ 323
11.11. Przykad zastosowania deklaracji ..................................................................... 323
11.12. Stosowanie zmiennych predefiniowanych ......................................................... 325
11.13. Porwnanie wyrae JSP, deklaracji oraz skryptletw ........................................ 327
Przykad 1.: wyraenia JSP ........................................................................... 328
Przykad 2.: skryptlety .................................................................................. 328
Przykad 3.: deklaracje JSP .......................................................................... 330

Rozdzia 12. Dyrektywa page: strukturalizacja generowanych serwletw .................................... 333


12.1. Atrybut import ................................................................................................ 334
12.2. Atrybuty contentType oraz pageEncoding .......................................................... 337
Generowanie arkuszy kalkulacyjnych programu Microsoft Excel ....................... 337
12.3. Warunkowe generowanie arkuszy kalkulacyjnych programu Microsoft Excel ......... 338
12.4. Atrybut session ............................................................................................. 341
12.5. Atrybut isELIgnored ........................................................................................ 341
12.6. Atrybuty buffer oraz autoFlush ......................................................................... 342
12.7. Atrybut info ................................................................................................... 343
12.8. Atrybuty errorPage oraz isErrorPage ................................................................. 343
12.9. Atrybut isThreadSafe ...................................................................................... 346
12.10. Atrybut extends .............................................................................................. 347
12.11. Atrybut language ............................................................................................ 348
12.12. Skadnia XML zapisu dyrektyw ......................................................................... 348

Rozdzia 13. Doczanie plikw i apletw do dokumentw JSP .......................................................... 349


13.1. Doczanie plikw podczas obsugi da: znacznik akcji jsp:include .................. 350
Atrybut page: okrelanie doczanej strony .................................................... 350
Skadnia XML a znacznik akcji jsp:include ..................................................... 352
Atrybut flush ............................................................................................... 352
Strona z najnowszymi doniesieniami ............................................................. 352
Element jsp:param: uzupenianie parametrw dania .................................... 354
13.2. Doczanie plikw w czasie przeksztacania strony ............................................ 355
Problemy z utrzymaniem kodu w przypadku stosowania dyrektywy include ........ 356
Dodatkowe moliwoci, jakie daje dyrektywa include ...................................... 357
Aktualizacja strony gwnej ........................................................................... 357
Zapis dyrektywy include w postaci elementu XML ........................................... 358
Przykad: wielokrotne stosowanie stopki ........................................................ 358
13.3. Przekazywanie da przy uyciu znacznika akcji jsp:forward ............................. 360
13.4. Doczanie apletw zwizanych z Java Plug-In ................................................... 361
Element jsp:plugin ....................................................................................... 363
Elementy jsp:param oraz jsp:params ............................................................ 365
Element jsp:fallback .................................................................................... 365
Przykad zastosowania znacznika jsp:plugin ................................................... 366

Rozdzia 14. Zastosowanie komponentw JavaBean w dokumentach JSP ........................................ 371


14.1. Dlaczego warto stosowa komponenty? ........................................................... 371
14.2. Czym s komponenty? ................................................................................... 372
14.3. Podstawowe sposoby uycia komponentw ...................................................... 374
Tworzenie komponentw: jsp:useBean .......................................................... 374
Instalacja klas komponentw ....................................................................... 375

Spis treci

Stosowanie atrybutw znacznika akcji jsp:useBean:


scope, beanName oraz type .................................................................... 375
Dostp do waciwoci komponentw: jsp:getProperty ................................... 376
Podstawowy sposb okrelania wartoci waciwoci: jsp:setProperty ............. 377
14.5. Okrelanie wartoci waciwoci komponentw: techniki zaawansowane ............ 380
Kojarzenie waciwoci z parametrami wejciowymi ........................................ 384
Kojarzenie wszystkich waciwoci z parametrami wejciowymi ....................... 385
14.6. Wspuytkowanie komponentw .................................................................... 386
Warunkowe tworzenie komponentw ............................................................. 387
14.7. Wspuytkowanie komponentw na cztery rne sposoby przykad ............... 390
Tworzenie komponentu oraz testera komponentw ........................................ 391
Zastosowanie atrybutu scope="page" komponent nie jest wspuytkowany 392
Wspuytkowanie komponentu w obrbie dania ......................................... 393
Wspuytkowanie komponentu w obrbie sesji ............................................. 396
Wspuytkowanie komponentu w obrbie aplikacji ........................................ 398

Rozdzia 15. Integracja serwletw i JSP: architektura model-widok-kontroler (MVC) ................... 401
15.1. Potrzeba stosowania architektury MVC ............................................................ 401
Szkielety MVC ............................................................................................. 403
Architektura czy podejcie? .......................................................................... 403
15.2. Implementacja architektury MVC przy uyciu interfejsu RequestDispatcher ......... 403
Definiowanie komponentw reprezentujcych dane ........................................ 404
Tworzenie serwletw obsugujcych dania .................................................. 404
Zapis danych w komponentach ..................................................................... 405
Zapis wynikw ............................................................................................. 405
Przekazywanie dania na stron JSP ........................................................... 406
Pobieranie danych z komponentw ............................................................... 408
15.3. Podsumowanie kodu architektury MVC ............................................................ 409
Przechowywanie wspuytkowanych danych w obiekcie dania ..................... 409
Przechowywanie wspuytkowanych danych w obiekcie sesji .......................... 409
Przechowywanie wspuytkowanych danych w obiekcie aplikacji ..................... 410
15.4. Interpretacja adresw URL na stronie docelowej ............................................... 410
15.5. Stosowanie architektury MVC: dostp do stanu konta bankowego ..................... 411
15.6. Porwnanie trzech sposobw wspuytkowania danych .................................... 417
Wspuytkowanie danych przy uyciu obiektu dania ................................... 418
Wspuytkowanie danych przy uyciu obiektu sesji ........................................ 419
Wspuytkowanie danych przy uyciu kontekstu serwletu ............................... 422
15.7. Przekazywanie da ze stron JSP ................................................................... 424
15.8. Doczanie stron ............................................................................................ 425

Rozdzia 16. Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0 ...................................... 427
16.1. Cele stosowania jzyka wyrae ...................................................................... 427
16.2. Stosowanie jzyka wyrae ............................................................................. 429
Oznaczanie znakw specjalnych ................................................................... 430
16.3. Zapobieganie przetwarzaniu wyrae EL ........................................................... 430
Wyczanie obsugi jzyka wyrae w caej aplikacji ........................................ 430
Wyczanie obsugi jzyka wyrae na wielu stronach JSP ............................... 431
Wyczanie obsugi jzyka wyrae na konkretnych stronach JSP ..................... 431
Wyczanie obsugi konkretnych instrukcji jzyka wyrae ............................... 432
16.4. Uniemoliwianie stosowania zwyczajnych elementw skryptowych ...................... 432

10

Java Servlet i JavaServer Pages. Tom 1


16.5. Odwoania do zmiennych dostpnych w okrelonym zakresie ............................. 433
Wybr nazw atrybutw ................................................................................. 434
Przykad ...................................................................................................... 434
16.6. Dostp do waciwoci komponentw .............................................................. 436
Rwnowano notacji kropkowej oraz notacji charakterystycznej dla tablic ...... 437
Przykad ...................................................................................................... 438
16.7. Dostp do zawartoci kolekcji ......................................................................... 441
Przykad ...................................................................................................... 441
16.8. Odwoania do obiektw niejawnych .................................................................. 443
Przykad ...................................................................................................... 445
16.9. Stosowanie operatorw jzyka wyrae ............................................................ 446
Operatory arytmetyczne ............................................................................... 446
Operatory relacyjne ...................................................................................... 447
Operatory logiczne ....................................................................................... 448
Operator empty ........................................................................................... 448
Przykad ...................................................................................................... 448
16.10. Warunkowe przetwarzanie wyrae .................................................................. 450
Przykad ...................................................................................................... 451
16.11. Informacje o innych moliwociach jzyka wyrae ............................................ 453

Cz III Technologie pomocnicze

455

Rozdzia 17. Obsuga baz danych przy uyciu JDBC ........................................................................... 457
17.1. Podstawowe sposoby stosowania JDBC ........................................................... 458
Zaadowanie sterownika .............................................................................. 459
Okrelenie adresu URL poczenia ................................................................ 461
Nawizanie poczenia ................................................................................. 461
Utworzenie polecenia ................................................................................... 462
Wykonanie zapytania ................................................................................... 462
Przetworzenie wynikw ................................................................................. 463
Zamknicie poczenia ................................................................................ 466
17.2. Prosty przykad wykorzystania JDBC ................................................................. 466
17.3. Narzdzia JDBC uatwiajce korzystanie z baz danych ....................................... 472
17.4. Stosowanie polece przygotowanych ............................................................... 483
17.5. Tworzenie polece wywoywanych .................................................................... 487
Zdefiniowanie wywoania procedury zachowanej ............................................. 488
Przygotowanie obiektu CallableStatement reprezentujcego procedur ............ 488
Zarejestrowanie typw parametrw wyjciowych ............................................. 489
Podanie wartoci parametrw wejciowych .................................................... 489
Wykonanie procedury zachowanej ................................................................. 489
Pobranie parametrw wyjciowych ................................................................ 489
Przykad ...................................................................................................... 490
17.6. Stosowanie transakcji .................................................................................... 493
17.7. Odwzorowywanie danych na obiekty przy uyciu szkieletw ORM ........................ 497

Rozdzia 18. Konfiguracja baz danych MS Access, MySQL oraz Oracle9i ......................................... 505
18.1. Konfiguracja programu Microsoft Access do wsppracy z JDBC ......................... 506
Wybr systemowej nazwy rda danych
w programie Administrator rde danych ODBC ........................................ 507
Wybr sterownika dla DSN ........................................................................... 507
Wybr rda danych .................................................................................... 508
Zaakceptowanie nowego DSN ...................................................................... 509

Spis treci

11

18.2. Instalacja i konfiguracja serwera MySQL .......................................................... 509


Pobieranie i instalacja serwera MySQL .......................................................... 510
Tworzenie bazy danych ................................................................................ 510
Tworzenie uytkownika ................................................................................. 511
Instalacja sterownika JDBC .......................................................................... 511
18.3. Instalacja i konfiguracja serwera Oracle9i ........................................................ 512
Pobieranie i instalacja Oracle9i .................................................................... 514
Tworzenie bazy danych ................................................................................ 522
Tworzenie bazy danych przy uyciu programu Configuration Assistant .............. 522
Rczne tworzenie bazy danych ...................................................................... 528
Utworzenie uytkownika ............................................................................... 535
Instalacja sterownika JDBC .......................................................................... 535
18.4. Testowanie bazy danych przy wykorzystaniu poczenia JDBC ............................ 536
18.5. Tworzenie tabeli music ................................................................................... 543
Tworzenie tabeli music przy uyciu programu CreateMusicTable.java ............... 543
Tworzenie tabeli music przy uyciu skryptu create_music_table.sql .................. 546

Rozdzia 19. Tworzenie i przetwarzanie formularzy HTML ............................................................... 549


Domylna aplikacja WWW: Tomcat ............................................................... 549
Domylna aplikacja WWW: JRun ................................................................... 550
Domylna aplikacja WWW: Resin .................................................................. 550
19.1. Jak przesyane s dane z formularzy HTML ...................................................... 550
19.2. Element FORM .............................................................................................. 554
19.3. Tekstowe elementy sterujce .......................................................................... 560
Pola tekstowe ............................................................................................. 560
Pola hasa .................................................................................................. 562
Wielowierszowe pola tekstowe ..................................................................... 563
19.4. Przyciski ........................................................................................................ 564
Przycisk SUBMIT ......................................................................................... 565
Przyciski RESET ........................................................................................... 567
Przyciski JavaScript ..................................................................................... 568
19.5. Pola wyboru i przyciski opcji ............................................................................ 569
Pola wyboru ................................................................................................ 569
Przyciski opcji ............................................................................................. 570
19.6. Listy i listy rozwijane ...................................................................................... 572
19.7. Element sterujcy sucy do przesyania plikw ............................................... 576
19.8. Mapy odnonikw obsugiwane na serwerze ..................................................... 578
IMAGE standardowe mapy odnonikw obsugiwane po stronie serwera ...... 579
ISMAP alternatywny sposb tworzenia map odnonikw obsugiwanych
po stronie serwera ................................................................................. 580
19.9. Pola ukryte .................................................................................................... 582
19.10. Grupowanie elementw sterujcych ................................................................. 583
19.11. Okrelanie kolejnoci poruszania si pomidzy elementami formularzy .............. 585
19.12. Testowy serwer WWW ..................................................................................... 586
EchoServer ................................................................................................. 586

Dodatki

593

Dodatek A Organizacja i struktura serwera ...................................................................................... 595


Skorowidz ............................................................................................................................................. 609

16

Upraszczanie dostpu do kodu Javy:


jzyk wyrae JSP 2.0
Specyfikacja JSP 2.0 wprowadza uproszczony jzyk sucy do przetwarzania i wywietlania
wartoci obiektw Javy przechowywanych w standardowych miejscach. Ten jzyk wyrae (ang. Expression Language, nazywany take skrtowo EL) jest jedn z najwaniejszych nowych moliwoci, ktre pojawiy si w specyfikacji JSP 2.0; kolejn jest moliwo
tworzenia znacznikw niestandardowych przy uyciu kodu JSP, a nie kodu Javy (zagadnienia zwizane z tworzeniem znacznikw niestandardowych zostay opisane w II tomie niniejszej
ksiki).
Jzyka wyrae nie mona stosowa na serwerach zgodnych ze specyfikacj JSP w wersji
1.2 lub wczeniejsz.

16.1. Cele stosowania jzyka wyrae


Zgodnie z informacjami podanymi na rysunku 16.1, strona JSP moe uywa kodu napisanego w jzyku Java na kilka rnych sposobw. Jednym z najlepszych i najbardziej elastycznych rozwiza jest architektura MVC (opisana w rozdziale 15.). W tym rozwizaniu
na danie przesane przez klienta odpowiada serwlet. Wywouje on nastpnie kod implementujcy logik biznesow lub realizujcy operacje na bazie danych, umieszcza wynikowe dane w komponentach, ktre z kolei s zapisywane w obiekcie dania, sesji lub kontekcie serwletu; w kocu serwlet wywouje stron JSP, ktrej zadaniem jest przedstawienie
wynikw.
Jedyn czci tego rozwizania, ktra utrudnia jego stosowanie, jest ostatnia wykonywana
czynno: wywietlenie wynikw na stronie JSP. Zazwyczaj do tego celu s stosowane
znaczniki akcji jsp:useBean oraz jsp:getProperty; jednak kod, jaki naley stworzy, by ich
uy, jest dosy rozbudowany i niewygodny. Co wicej, znacznik jsp:getProperty po zwala

428

Cz II

JavaServer Pages

Rysunek 16.1.
Strategie
wywoywania
dynamicznego
kodu ze stron JSP

jedynie na pobieranie wartoci prostych waciwoci; jeli waciwo jest kolekcj lub innym komponentem, to odczytanie jej wartoci wymaga zastosowania zoonego wyraenia
napisanego w Javie (a przecie zastosowanie architektury MVC ma na celu uniknicie takiej koniecznoci).
Jzyk wyrae JSP 2.0 pozwala na uproszczenie warstwy prezentacji aplikacji WWW, poprzez zastpienie trudnego do utrzymania kodu skadajcego si z elementw skryptowych
JSP lub znacznikw akcji jsp:useBean oraz jsp:getProperty znacznie krtszymi i bardziej
przejrzystymi wyraeniami o postaci:
${wyraenie}

Konkretnie rzecz biorc, jzyk wyrae zapewnia nastpujce moliwoci:


Q

Zwizy sposb dostpu do zapisanych obiektw. W celu wywietlenia zmiennej


o nazwie sprzedazWartosc dostpnej w okrelonym zakresie (czyli obiektu
zapamitanego poprzez wywoanie metody setAttribute obiektw PageContext,
HttpServletRequest, HttpSession lub ServletContext), mona uy wyraenia
o postaci ${sprzedazWartosc}. Patrz podrozdzia 16.5

Uproszczony zapis odwoa do waciwoci komponentw. Aby wywietli


waciwo nazwaFirmy (na przykad wynik zwracany przez metod getNazwaFirmy)
innej zmiennej dostpnej w okrelonym zakresie, naley posuy si wyraeniem
${firma.nazwaFirmy}. Podobnie, aby odczyta waciwo imie obiektu dostpnego
jako waciwo prezes obiektu firma przechowywanego w zmiennej dostpnej
w okrelonym zakresie, naleaoby uy wyraenia o postaci ${firma.prezes.imie).
Patrz podrozdzia 16.6.

Uproszczony dostp do elementw kolekcji. Do odczytywania wartoci


elementw list, zawartoci obiektw List oraz Map su wyraenia o postaci:
${zmienna[indeksLubKlucz]}. Jeli indeks lub klucz ma posta, jak w jzyku Java
musz przybiera zmienne, to oprcz zapisu wykorzystujcego nawiasy kwadratowe,
mona take zastosowa standardow posta odwoa do waciwoci komponentw.
Patrz podrozdzia 16.7.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

429

Zwizy dostp do parametrw dania, cookies oraz innych danych


przesyanych w daniu. W celu uzyskania dostpu do standardowych rodzajw
informacji przesyanych w daniu, mona posuy si kilkoma predefiniowanymi,
niejawnymi obiektami. Patrz podrozdzia 16.8.

Niewielki, lecz uyteczny zbir prostych operatorw. Moliwe jest wykonywanie


operacji na obiektach uywanych w wyraeniach EL. Do tego celu suy kilka
operatorw arytmetycznych, relacyjnych i logicznych oraz operator sprawdzajcy,
czy zostaa okrelona warto waciwoci.

Prezentacj warunkow. W celu wybrania jednej z opcji prezentacji, nie trzeba


ju stosowa elementw skryptowych. Zamiast tego mona uy konstrukcji
o postaci ${test ? wartosc1 : wartosc2}. Patrz podrozdzia 16.10.

Automatyczn konwersj typw. Dziki jzykowi wyrae nie trzeba stosowa


wikszoci operacji rzutowania typw oraz konwersji acuchw znakw na liczby.

Zastosowanie pustych wartoci zamiast komunikatw o bdach. W wikszoci


przypadkw brak wartoci parametru wejciowego lub zgoszenie wyjtku
NullPointerException powoduje zastosowanie pustego acucha znakw,
a nie zgoszenie wyjtku.

16.2. Stosowanie jzyka wyrae


W JSP 2.0 jzyk wyrae jest wywoywany w przypadku zastosowania elementu o nastpujcej postaci:
${wyraenie}

Elementy EL mona umieszcza w zwyczajnym tekcie, bd te w atrybutach znacznikw JSP


(zakadajc, e mona w nich umieszcza standardowe wyraenia JSP. Oto przykad:
<UL>
<LI>Imi: ${wyraenie}
<LI>Adres: ${wyraenie2}
</UL>
<jsp:include page="${expression}" />

W przypadku stosowania jzyka wyrae w atrybutach znacznikw, mona w nich umieszcza


wiksz liczb wyrae (a nawet umieszcza pomidzy wyraeniami fragmenty tekstu)
takie wyraenia zostan przetworzone do postaci acucha znakw, a wszystkie te acuchy
poczone. Na przykad:
<jsp:include page="${wyraenie1}NieNieNie${wyraenie1}" />

W niniejszym rozdziale zostao przedstawione zastosowanie jzyka wyrae w zwyczajnym tekcie. Natomiast w II tomie ksiki podano informacje o stosowaniu elementw EL
w atrybutach samodzielnie tworzonych znacznikw niestandardowych oraz znacznikw
wchodzcych w skad bibliotek JSTL (ang. JSP Standard Tag Library) i JSF (ang. JavaServer Faces).

430

Cz II

JavaServer Pages

Oznaczanie znakw specjalnych


Jeli si zdarzy, e w tekcie strony JSP musi si pojawi acuch znakw ${, to naley go
zapisa jako \${. Jeli w wyraeniu EL naley umieci apostrof lub znaku cudzysowu,
naley je zapisywa w postaci: \' oraz \".

16.3. Zapobieganie przetwarzaniu wyrae EL


W specyfikacji JSP 1.2 oraz wczeniejszych, acuchy znakw o postaci ${...} nie miay
adnego szczeglnego znaczenia. A zatem moe si zdarzy, i w poprawnych stronach
JSP, ktre obecnie zaczy by uywane na serwerze obsugujcym JSP 2.0, pojawi si
acuchy znakw ${. W takim przypadku naley wyczy na stronie obsug jzyka wyrae.
Mona to zrobi na cztery sposoby:
Q

Wyczajc obsug jzyka wyrae w caej aplikacji WWW. Mona to zrobi


w pliku web.xml definiujcym serwlety zgodne ze specyfikacj JavaServlet
w wersji 2.3 (JSP 1.2) lub wczeniejszej. Szczegowe informacje na ten temat
podano w kolejnym punkcie rozdziau.

Wyczajc obsug jzyka wyrae na wielu stronach JSP. Wybrane strony


mona wskaza w elemencie jsp-property-group umieszczanym w pliku web.xml.
To rozwizanie opisano w drugim kolejnym punkcie rozdziau.

Wyczajc obsug jzyka wyrae na pojedynczych stronach JSP. Do tego


celu suy atrybut isELEnabled dyrektywy page. Wicej informacji na ten temat
podano w trzecim kolejnym punkcie rozdziau.

Wyczajc pojedyncze instrukcje jzyka wyrae. Jeli strony JSP tworzone


zgodnie ze specyfikacj 1.2 musz by przenoszone w oryginalnej postaci
(bez wprowadzania jakichkolwiek modyfikacji w pliku web.xml) na serwery
obsugujce nowsze wersje specyfikacji JSP, to wszystkie znaki $ wystpujce
w normalnym tekcie mona zastpi symbolem HTML o postaci &#36;.
W stronach JSP tworzonych zgodnie ze specyfikacj JSP 2.0, zawierajcych
zarwno wyraenia EL, jak i znaki $ wystpujce w normalnym tekcie, acuchy
znakw ${, ktre maj by traktowane dosownie, naley zapisywa jako \${.

Naley pamita, i powysze rozwizania s konieczne wycznie w przypadkach, gdy strona


zawiera acuch znakw o postaci ${.

Wyczanie obsugi jzyka wyrae w caej aplikacji


Jzyk wyrae JSP 2.0 jest automatycznie wyczany w aplikacjach WWW, ktrych deskryptor rozmieszczenia (czyli plik /WEB-INF/web.xml) odwouje si do specyfikacji serwletw w wersji 2.3 lub wczeniejszej (czyli JSP 1.2 lub wczeniejszej). Zagadnienia zwizane z plikami web.xml zostay szczegowo opisane w II tomie ksiki, jednak krtkie
informacje na ich temat mona znale w podrozdziale 2.11 (Aplikacje WWW prezentacja). Na przykad, poniszy pusty (lecz cakowicie poprawny) plik web.xml jest

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

431

zgodny ze specyfikacj JSP 1.2, a zatem oznacza, e jzyk wyrae powinien zosta domylnie wyczony w caej aplikacji.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
</web-app>

Z kolei poniszy plik web.xml jest zgodny ze specyfikacj JSP 2.0, co sprawia, e jzyk
wyrae bdzie domylnie wczony. (Oba pliki XML mona znale w archiwum przykadw zamieszczonych w niniejszej ksice, dostpnym pod adresem ftp://ftp.helion.pl/
przyklady/jsjsp1.zip).
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
</web-app>

Wyczanie obsugi jzyka wyrae na wielu stronach JSP


W aplikacjach WWW, ktrych deskryptor rozmieszczenia informuje, e aplikacja jest tworzona zgodnie ze specyfikacj 2.4 (JSP 2.0), istnieje moliwo okrelenia grupy stron, na
jakich jzyk wyrae powinien by ignorowany. Suy do tego element jsp-property-group
oraz jego atrybut el-ignored. Poniszy, przykadowy plik web.xml pokazuje, w jaki sposb
mona wyczy obsug jzyka wyrae we wszystkich stronach JSP umieszczonych
w katalogu stareWersje:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<jsp-property-group>
<url-pattern>/stareWersje/*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</web-app>

Element jsp-property-group zosta szczegowo opisany w II tomie niniejszej ksiki.

Wyczanie obsugi jzyka wyrae na konkretnych stronach JSP


Aby wyczy obsug jzyka wyrae na konkretnej stronie JSP, atrybutowi isELEnabled
dyrektywy page naley przypisa warto false:
<%@ page isELEnabled="false" %>

432

Cz II

JavaServer Pages

Naley zauway, i atrybut isELEnabled zosta wprowadzony w specyfikacji JSP 2.0, a zastosowanie go w aplikacjach zgodnych ze specyfikacj JSP 1.2 zostanie potraktowane jako
bd. Nie mona zatem wykorzysta tej metody, by zapewni poprawne dziaanie stron JSP
na nowszych i starszych serwerach, bez koniecznoci wprowadzania adnych zmian w ich
kodzie. Dlatego te zastosowanie elementu jsp-property-group jest zazwyczaj lepszym
rozwizaniem ni stosowanie atrybutu isELEnabled.

Wyczanie obsugi konkretnych instrukcji jzyka wyrae


Wyobramy sobie, e istnieje pewna strona JSP tworzona zgodnie ze specyfikacj JSP 1.2,
w ktrej pojawia si acuch znakw ${. T stron naley zastosowa w wielu miejscach, w tym
take w aplikacjach tworzonych zgodnie ze specyfikacj JSP 1.2, oraz aplikacjach zawierajcych strony, na ktrych jest stosowany jzyk wyrae. Co wicej, musi istnie moliwo
uywania tej strony w dowolnych aplikacjach, i to bez wprowadzania jakichkolwiek modyfikacji
zarwno w kodzie samej strony, jak i w kodzie pliku web.xml. Cho taki scenariusz jest raczej mao prawdopodobny, to jednak moe si zdarzy, a adne z rozwiza przedstawionych
wczeniej nie zapewnia takich moliwoci. W takim przypadku wystarczy zamieni znaki $
wystpujce w kodzie strony na symbole HTML reprezentujce ten znak. Innymi sowy,
kady umieszczony w kodzie strony acuch znakw ${ naley zastpi acuchem &#36;{.
Na przykad, acuch znakw:
&#36;{uhaha}

zostanie zapewne wywietlony w postaci:


${uhaha}

Naley jednak pamita, i te symbole HTML s zamieniane na odpowiednie znaki (w tym


przypadku na znak $) przez przegldark, a nie przez serwer. A zatem rozwizanie to mona
stosowa wycznie w przypadku generowania kodu HTML, ktry bdzie interpretowany
i wywietlany w przegldarce WWW.
A co zrobi w przypadku strony JSP tworzonej zgodnie ze specyfikacj JSP 2.0, na ktrej
uywany jest zarwno jzyk wyrae, jak i acuchy znakw ${? W takich sytuacjach
przed znakami $, ktre maj by wywietlone w niezmienionej postaci, naley zapisa znak
lewego ukonika. Na przykad:
\${1+1} to ${1+1}

zostanie wywietlone jako:


${1+1} to 2

16.4. Uniemoliwianie stosowania


zwyczajnych elementw skryptowych
Jzyk wyrae JSP zapewnia zwarty i przejrzysty sposb dostpu do obiektw Javy przechowywanych w standardowych miejscach. Moliwo ta sprawia, e w znacznej mierze
mona zrezygnowa ze stosowania jawnych elementw skryptowych opisanych w rozdziale 11.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

433

W rzeczywistoci, niektry programici decyduj si nawet na cakowit rezygnacj ze stosowania takich standardowych elementw skryptowych. W takim przypadku mona uy
elementu scripting-invalid umieszczanego wewntrz elementu jsp-propety-group, ktry
sprawia, e zastosowanie standardowego elementu skryptowego zostanie potraktowane jako
bd. Poniszy plik web.xml przedstawia przykad zastosowania tego elementu:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</web-app>

16.5. Odwoania do zmiennych dostpnych


w okrelonym zakresie
W przypadku stosowania architektury MVC (opisanej w rozdziale 15.) serwlet wywouje
kod, ktry tworzy dane, a nastpnie przekazuje obsug dania do odpowiedniej strony
JSP uywajc do tego celu metod RequestDispatcher.forward lub response.sendRedirect.
Aby strona JSP moga uzyska dostp do tych danych, serwlet musi zapisa je przy uyciu
metody setAttribute w jednym ze standardowych miejsc: obiekcie HttpServletRequest,
obiekcie HttpSession lub obiekcie ServletContext.
Obiekty zapisane w tych miejscach s nazywane zmiennymi dostpnymi w okrelonym
zakresie (ang. scoped variables), a jzyk wyrae JSP 2.0 zapewnia moliwo atwego i szybkiego dostpu do nich. Takie zmienne mona take zapisywa w obiektach PageContext,
jednak to rozwizanie jest znacznie mniej uyteczne, gdy obiekty PageContext nie s
wspuytkowane przez serwlety i strony JSP. A zatem zmienne dostpne w zakresie strony
reprezentuj jedynie obiekty zapisane wczeniej na tej samej stronie JSP, a nie obiekty zapisane przez serwlet.
Aby wywietli zawarto zmiennej dostpnej w pewnym zakresie, naley poda jej nazw
w elemencie jzyka wyrae. Na przykad, wyraenie:
${nazwa}

oznacza, e naley przeszuka obiekty PageContext, HttpServletRequest, HttpSession oraz


ServletContext (dokadnie w podanej kolejnoci), w poszukiwaniu atrybutu o nazwie nazwa. Jeli uda si odnale atrybut, to wywoywana jest jego metoda toString, a uzyskany
w ten sposb acuch znakw jest zwracany jako warto wyraenia. A zatem ponisze
dwa wyraenia zwrc identyczne wyniki:
${nazwa}
<%= pageContext.findAttribute("nazwa") %>

434

Cz II

JavaServer Pages

Jak wida, drugie z przedstawionych wyrae jest znacznie dusze, a co gorsza, wymaga
jawnego zastosowania kodu napisanego w jzyku Java. Istnieje co prawda moliwo wyeliminowania kodu Javy, jednak w efekcie trzeba uy jeszcze bardziej rozbudowanego
znacznika akcji jsp:useBean:
<jsp:useBean id="nazwa" type="jakisPakiet.JakasKlasa" scope="...">
<%= nazwa %>

Poza tym, w przypadku stosowania znacznika jsp:useBean naley wiedzie, w jakim zakresie
zostaa zapisana zmienna, oraz zna pen nazw jej klasy. Stanowi to dosy duy problem,
zwaszcza jeli tworzeniem stron JSP nie zajmuje si autor serwletu, lecz inna osoba.

Wybr nazw atrybutw


Przy stosowaniu jzyka wyrae do operowania na zmiennych dostpnych w okrelonych
zakresach, nazwy tworzonych atrybutw musz by zgodne ze wszystkimi zasadami okrelajcymi dopuszczaln posta nazw zmiennych w jzyku Java. A zatem nie naley
umieszcza w nich kropek, odstpw, ukonikw oraz wszelkich innych znakw, ktre
mona stosowa w zwyczajnych acuchach znakw, lecz nie w nazwach zmiennych.
Oprcz tego, naley pamita, by nazwy nadawane atrybutom nie kolidoway z nazwami
zmiennych predefiniowanych, przedstawionymi w podrozdziale 16.8.

Przykad
W ramach przedstawienia sposobu korzystania ze zmiennych dostpnych w okrelonym
zakresie, serwlet ScopedVars (przedstawiony na listingu 16.1) zapisuje pewien acuch znakw
w obiekcie HttpServletRequest, inny acuch w obiekcie HttpSession oraz dat w obiekcie
ServletContext. Nastpnie obsuga dania jest przekazywana na stron JSP (przedstawion
na listingu 16.2 oraz rysunku 16.2), na ktrej atrybuty te s wywietlane przy uyciu wyraenia
${nazwaAtrybutu}.
Listing 16.1. ScopedVars.java
package coreservlets;
/** Serwlet tworzy zmienne dostpne w okrelonym zakresie
* (czyli obiekty zapisywane jako atrybuty w pewnych
* standardowych miejscach). Nastpnie przekazuje obsug
* dania do strony JSP, ktra wywietla wartoci zapisane
* przez serwlet przy uyciu jzyka wyrae.
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class ScopedVars extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

request.setAttribute("attribute1", "Pierwsza warto");


HttpSession session = request.getSession();
session.setAttribute("attribute2", "Druga warto");
ServletContext application = getServletContext();
application.setAttribute("attribute3",
new java.util.Date());
request.setAttribute("repeated", "danie");
session.setAttribute("repeated", "Sesja");
application.setAttribute("repeated", "Obiekt ServletContext");
RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/scoped-vars.jsp");
dispatcher.forward(request, response);
}
}

Listing 16.2. scoped-vars.jsp


<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Zmienne dostpne w okrelonym zakresie</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Dostp do zmiennych dostpnych w rnych zakresach:
</TABLE>
<P>
<UL>
<LI><B>attribute1:</B> ${attribute1}
<LI><B>attribute2:</B> ${attribute2}
<LI><B>attribute3:</B> ${attribute3}
<LI><B>Warto atrybutu "repeated":</B> ${repeated}
</UL>
</BODY></HTML>

Rysunek 16.2.
Jzyk wyrae
JSP 2.0 upraszcza
dostp
do zmiennych
dostpnych
w okrelonych
zakresach
czyli obiektw
zapisywanych
jako atrybuty obiektu
strony, dania,
sesji lub kontekstu
serwletu

435

436

Cz II

JavaServer Pages

Warto zwrci uwag, i strona JSP odwouje si do wszystkich atrybutw przy uyciu tego samego zapisu, niezalenie od tego, w jakim zakresie zostay one zapisane. Zazwyczaj
takie rozwizanie jest wygodne, gdy serwlety obsugujce rozwizania typu MVC nadaj
zapamitywanym obiektom unikalne nazwy atrybutw. Niemniej jednak, z technicznego
punktu widzenia, istnieje moliwo kilkukrotnego zastosowania tej samej nazwy. Dlatego
naley pamita, e jzyk wyrae poszukuje atrybutu w nastpujcej kolejnoci: obiekt
PageContext, obiekt HttpServletRequest, obiekt HttpSession i na kocu obiekt ServletContext.
Aby przedstawi ten aspekt dziaania jzyka wyrae, serwlet zapisuje obiekt w trzech rnych zakresach, za kadym razem nadajc mu t sam warto klucza repeated. Warto zwrcona przez wyraenie ${repeated} (widoczna na rysunku 16.2) odpowiada pierwszemu atrybutowi odnalezionemu podczas przeszukiwania zakresw (w tym przypadku
zostanie ona odczytana z obiektu HttpServletRequest). Informacje na temat ograniczania
poszukiwania atrybutw do konkretnego zakresu zostay podane w podrozdziale 16.8 (Odwoania do obiektw niejawnych).

16.6. Dostp do waciwoci komponentw


W razie zastosowania przedstawionego wczeniej zapisu o postaci ${nazwa}, system odnajduje obiekt name, zmienia go na acuch znakw i zwraca. Cho takie dziaanie jest wygodne, to jednak bardzo rzadko trzeba bdzie wywietli warto samego obiektu zapisanego
przez serwlet. Zazwyczaj bdzie chodzio o wywietlenie konkretnych waciwoci tego
obiektu.
Jzyk wyrae JSP udostpnia prost, a jednoczenie dajc bardzo due moliwoci notacj kropkow, suc wanie do pobierania wartoci waciwoci obiektw. Aby pobra
warto waciwoci firstName zmiennej o nazwie klient dostpnej w pewnym zakresie,
wystarczy uy wyraenia o postaci ${klient.firstName}. Cho to wyraenie wydaje si
by bardzo proste, to jednak, aby moliwe byo wyznaczenie jego wartoci, system musi
wykorzysta technologi odzwierciedlania (badania wewntrznej struktury obiektu). A zatem, zakadajc, e obiekt jest typu NameBean, ktry naley do pakietu coreservlets, to aby
wykona t sam czynno przy uyciu zwykego kodu Javy, naleaoby zastpi wyraenie:
${klient.firstName}

nastpujcym blokiem kodu:


<% page import="coreservlets.NameBean" %>
<%
NameBean klient =
(NameBean) pageContext.findAttribute("klient");
%>
<%= klient.getfirstName %>

Co wicej, w przypadku zastosowania jzyka wyrae, jeli nie uda si odnale atrybutu, to
zostanie zwrcony pusty acuch znakw. Z kolei stosujc standardowe elementy skryptowe,
naleayby doda kolejny fragment kodu Javy, zabezpieczajcy przez zgoszeniem wyjtku
NullPointerException.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

437

Czytelnik zapewne pamita, e elementy skryptowe JSP nie s jedyn alternatyw dla jzyka
wyrae. O ile tylko znany jest zakres, w jakim zosta zapisany obiekt, oraz pena nazwa jego
klasy, to wyraenie:
${klient.firstName}

mona zastpi znacznikami akcji:


<jsp:useBean id="klient" type="coreservlets.NameBean"
scope="request, session lub application" />
<jsp:getProperty name="klient" property="firstName" />

Jednak jzyk wyrae pozwala na dowolne zagniedanie waciwoci. A zatem, gdyby klasa
NameBean dysponowaa waciwoci address (czyli metod getAddress) zwracajc obiekt typu
Address, ktry zawieraby waciwo zipCode (czyli metod getZipCode), to do waciwoci
zipCode mona by si odwoa w nastpujcy sposb:
${klient.address.zipCode}

Podobnego odwoania nie mona wykona przy uyciu znacznikw jsp:useBean oraz
jsp:getProperty konieczne byoby zastosowanie jawnego kodu napisanego w Javie.

Rwnowano notacji kropkowej


oraz notacji charakterystycznej dla tablic
Warto take zapamita, i jzyk wyrae pozwala na zastpienie notacji kropkowej zapisem
charakterystycznym dla odwoa do elementw tablic (wykorzystujcym nawiasy kwadratowe).
A zatem, zamiast wyraenia:
${nazwa.wlasciwosc}

mona napisa:
${nazwa["wlasciwosc"]}

W przypadku odwoywania si do waciwoci komponentw, ten drugi sposb zapisu jest


stosowany raczej rzadko. Niemniej jednak ma on dwie zalety.
Przede wszystkim, pozwala na wyznaczenie nazwy waciwoci w czasie obsugi dania.
Taki sposb zapisu pozwala bowiem, by warto umieszczona wewntrz nawiasw sama
bya zmienn w przypadku zastosowania notacji kropkowej, musi to by litera.
Poza tym, sposb zapisu charakterystyczny dla tablic pozwala na stosowanie nazw, ktre
jako nazwy waciwoci zostayby uznane za bdne. Moliwo ta nie ma znaczenia podczas operowania na waciwociach komponentw, jednak okazuje si niezwykle przydatna
w przypadku odwoa do kolekcji (patrz podrozdzia 16.7) lub nagwkw dania (patrz
podrozdzia 16.8).

438

Cz II

JavaServer Pages

Przykad
Na listingu 16.3 zosta przedstawiony przykadowy serwlet BeanProperties. Serwlet ten
tworzy komponent EmployeeBean (przedstawiony na listingu 16.4), zapisuje go w obiekcie
dania, jako atrybut o nazwie employee, po czym przekazuje danie do strony JSP.
Listing 16.3. BeanProperties.java
package coreservlets;
/** Serwlet tworzcy kilka komponentw, ktrych waciwoci
* zostan wywietlone przy uyciu jzyka wyrae JSP 2.0.
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class BeanProperties extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
NameBean name = new NameBean("Marty", "Hall");
CompanyBean company =
new CompanyBean("coreservlets.com",
"J2EE - Kursy i konsulatacje");
EmployeeBean employee = new EmployeeBean(name, company);
request.setAttribute("employee", employee);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/bean-properties.jsp");
dispatcher.forward(request, response);
}
}

Listing 16.4. EmployeeBean.java


package coreservlets;
public class EmployeeBean {
private NameBean name;
private CompanyBean company;
public EmployeeBean(NameBean name, CompanyBean company) {
setName(name);
setCompany(company);
}
public NameBean getName() { return(name); }
public void setName(NameBean newName) {
name = newName;
}
public CompanyBean getCompany() { return(company); }

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

439

public void setCompany(CompanyBean newCompany) {


company = newCompany;
}

Klasa EmployeeBean definiuje dwie waciwoci name oraz company zawierajce odpowiednio obiekty typw NameBean (patrz listing 16.5) oraz CompanyBean (patrz listing 16.6).
Klasa NameBean definiuje waciwoci lastName oraz firstName, z kolei klasa CompanyBean
definiuje waciwoci companyName oraz business. Strona JSP, przedstawiona na listingu 16.7,
wywietla wartoci wszystkich czterech atrybutw, uywajc do tego celu nastpujcych
wyrae EL:
${employee.name.firstName}
${employee.name.lastName}
${employee.company.companyName}
${employee.company.business}

Listing 16.5. NameBean.java


package coreservlets;
public class NameBean {
private String firstName = "Nie podano imienia";
private String lastName = "Nie podano nazwiska";
public NameBean() {}
public NameBean(String firstName, String lastName) {
setFirstName(firstName);
setLastName(lastName);
}
public String getFirstName() {
return(firstName);
}
public void setFirstName(String newFirstName) {
firstName = newFirstName;
}
public String getLastName() {
return(lastName);
}

public void setLastName(String newLastName) {


lastName = newLastName;
}

Listing 16.6. CompanyBean.java


package coreservlets;
public class CompanyBean {
private String companyName;
private String business;

440

Cz II

JavaServer Pages

public CompanyBean(String companyName, String business) {


setCompanyName(companyName);
setBusiness(business);
}
public String getCompanyName() { return(companyName); }
public void setCompanyName(String newCompanyName) {
companyName = newCompanyName;
}
public String getBusiness() { return(business); }
public void setBusiness(String newBusiness) {
business = newBusiness;
}
}

Listing 16.7. bean-properties.jsp


<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Dostp do waciwoci komponentw</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Dostp do waciwoci komponentw
</TABLE>
<P>
<UL>
<LI><B>Imi:</B> ${employee.name.firstName}
<LI><B>Nazwisko:</B> ${employee.name.lastName}
<LI><B>Nazwa firmy:</B> ${employee.company.companyName}
<LI><B>Profil dziaalnoci:</B> ${employee.company.business}
</UL>
</BODY></HTML>

Wyniki wykonania strony przedstawiono na rysunku 16.3.


Rysunek 16.3.
Dostp
do waciwoci
komponentw
jest moliwy
przy uyciu notacji
kropkowej lub zapisu
charakterystycznego
dla odwoa do tablic

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

441

16.7. Dostp do zawartoci kolekcji


Jzyk wyrae JSP 2.0 zapewnia jednolity sposb dostpu do kolekcji rnych typw. Bazuje on na zastosowaniu zapisu charakterystycznego dla odwoa do elementw tablic. Na
przykad, jeli zmienna o nazwie nazwaAtrybutu zawiera tablic, obiekt typu List lub Map,
to do zawartoci takiej kolekcji mona si odwoa, uywajc nastpujcego zapisu:
${nazwaAtrybutu[nazwaElementu]}

Jeli taka zamienna jest tablic, to nazwa elementu podawana w wyraeniu EL bdzie indeksem
tej tablicy, a warto caego wyraenia zostanie pobrana przy uyciu kodu: tablica[indeks].
Na przykad, jeli zmienna nazwyKlientow zawiera tablic acuchw znakw, to wyraenie:
${nazwyKlientow[0]}

zwrci zawarto pierwszego elementu tej tablicy.


Jeli zmienna bdzie obiektem implementujcym interfejs List, to nazwa elementu podana
w wyraeniu EL bdzie indeksem, a warto caego wyraenia zostanie pobrana przy uyciu
kodu: lista.get(indeks). Na przykad, jeli zmienna nazwyDostawcow reprezentuje obiekt
typu ArrayList, to wyraenie:
${nazwyDostawcow[0]}

zwrci pierwszy element listy.


Jeli zmienna bdzie obiektem implementujcym interfejs Map, to nazwa elementu podana
w wyraeniu EL bdzie kluczem, a warto caego wyraenia zostanie pobrana przy uyciu
kodu mapa.get(klucz). Na przykad, zakadajc, e zmienna stoliceStanow jest obiektem
typu HashMap, ktrego klucze okrelaj nazwy stanw USA, a skojarzone z nimi wartoci
okrelaj nazwy miast bdcych stolicami tych stanw, to wyraenie:
${stoliceStanow["maryland"]}

zwrci acuch znakw "annapolis". Jeli klucze obiektu Map speniaj wymagania narzucane
dopuszczalnym postaciom nazw zmiennych w jzyku Java, to zamiast zapisu z nawiasami
kwadratowymi mona uy notacji kropkowej. A zatem, powysze wyraenie mona take
zapisa w postaci:
${stoliceStanow.maryland}

Naley jednak pamita, i zastosowanie zapisu charakterystycznego dla odwoa do tablic


pozwala na okrelanie wartoci klucza w czasie obsugi dania; w przypadku uycia notacji
kropkowej warto klucza musi by znana podczas pisania programu.

Przykad
Zastosowanie wyrae EL do pobierania zawartoci kolekcji zostao przedstawione na
przykadzie serwletu Collections (patrz listing 16.8), ktry tworzy tablic acuchw znakw,
obiekt typu ArrayList oraz obiekt typu HashMap. Nastpnie serwlet przekazuje danie do strony
JSP (przedstawionej na listingu 16.9 oraz na rysunku 16.4), ktra wywietla elementy tych
trzech obiektw uywajc wyrae EL.

442

Cz II

JavaServer Pages

Listing 16.8. Collections.java


package coreservlets;
import java.util.*;
/** Serwlet tworzy kolekcje, ktrych elementy bd wywietlane
* przy uyciu jzyka wyrae JSP 2.0.
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Collections extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
String[] firstNames = { "Bill", "Scott", "Larry" };
ArrayList lastNames = new ArrayList();
lastNames.add("Ellison");
lastNames.add("Gates");
lastNames.add("McNealy");
HashMap companyNames = new HashMap();
companyNames.put("Ellison", "Sun");
companyNames.put("Gates", "Oracle");
companyNames.put("McNealy", "Microsoft");
request.setAttribute("first", firstNames);
request.setAttribute("last", lastNames);
request.setAttribute("company", companyNames);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/collections.jsp");
dispatcher.forward(request, response);
}
}

Listing 16.9. collections.jsp


<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Dostp do zawartoci kolekcji</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Dostp do zawartoci kolekcji
</TH></TR>
</TABLE>
<P>
<UL>
<LI>${first[0]} ${last[0]} (${company["Ellison"]})
<LI>${first[1]} ${last[1]} (${company["Gates"]})

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

443

<LI>${first[2]} ${last[2]} (${company["McNealy"]})


</UL>
</BODY></HTML>

Rysunek 16.4.
Podczas odwoywania
si do elementw
kolekcji mona uywa
notacji kropkowej
lub zapisu
wykorzystujcego
nawiasy kwadratowe.
Notacja kropkowa moe
by uywana wycznie
w przypadku, gdy nazwy
kluczy speniaj
wymagania okrelajce
dopuszczaln posta
nazw zmiennych w Javie

Nazwy waciwoci komponentw nie mog skada si wycznie z cyfr, dlatego podczas
odwoywania si do elementw tablic oraz zawartoci obiektw ArrayList naley uywa
zapisu wykorzystujcego nawiasy kwadratowe. Jednak zawarto obiektw HashMap mona
pobiera, uywajc zarwno zapisu z nawiasami kwadratowymi, jak i notacji kropkowej.
W celu uzyskania spjnego zapisu wyrae, w stronie JSP przedstawionej na listingu 16.9
zastosowano zapis wykorzystujcy nawiasy kwadratowe, jednak uyte na stronie wyraenie:
${company["Ellison"]}

z powodzeniem mona by zastpi wyraeniem o postaci:


${company.Ellison}

16.8. Odwoania do obiektw niejawnych


W wikszoci przypadkw jzyk wyrae JSP jest stosowany w aplikacjach dziaajcych
wedug zasad architektury MVC (model-widok-kontroler, opisanej w rozdziale 15.).
W aplikacjach tego typu serwlet, do ktrego s kierowane dania, tworzy niezbdne dane, po
czym przekazuje obsug dania do strony JSP. Zazwyczaj taka strona JSP uywa wycznie
obiektw utworzonych przez serwlet, wic w zupenoci wystarczaj jej oglne mechanizmy
dostpu do waciwoci komponentw oraz elementw kolekcji.
Nie oznacza to wcale, i jzyka wyrae JSP 2.0 mona uywa wycznie w aplikacjach
tego typu jeli tylko serwer obsuguje specyfikacj JSP 2.0, a plik web.xml odwouje si
do specyfikacji JavaServlet 2.4, to jzyk wyrae bdzie mona stosowa na wszystkich
stronach JSP. Jednak, aby moliwoci te byy przydatne, w specyfikacji JSP zdefiniowano
kilka opisanych poniej obiektw niejawnych.

444

Cz II

JavaServer Pages

pageContext
Obiekt pageContext reprezentuje obiekt PageContext biecej strony JSP. Z kolei
klasa PageContext definiuje waciwoci request, response, session, out oraz
servletContext (czyli metody: getRequest, getResponse, getSession, getOut oraz
getServletContext). A zatem ponisze wyraenie wywietla identyfikator biecej
sesji:
${pageContext.session.id}

param oraz paramValues


Te dwa obiekty pozwalaj odpowiednio na pobranie wartoci gwnego parametru
dania (param) oraz tablicy zawierajcej wartoci wszystkich parametrw dania
(paramValues). Ponisze wyraenie zwraca warto parametru dania custID
(przy czym, jeli parametr ten nie zostanie podany, zwracany jest pusty acuch
znakw, a nie warto null):
${param.custID}

Wicej informacji na temat parametrw dania mona znale w rozdziale 4.

header oraz headerValues


Te obiekty zapewniaj odpowiednio dostp do gwnych oraz wszystkich wartoci
nagwkw dania HTTP. Naley pamita, i stosowanie notacji kropkowej
nie jest dozwolone, jeli umieszczana po kropce nazwa nie jest poprawn nazw
waciwoci. A zatem warto nagwka Accept mona pobra na dwa sposoby:
${header.Accept}

oraz
${header["Accept"]}

Z kolei warto nagwka Accept-Encoding mona pobra wycznie przy uyciu


wyraenia o postaci:
${header["Accept-Encoding"]}

Wicej informacji na temat nagwkw dania HTTP mona znale w rozdziale 5.

cookie
Obiekt cookie pozwala na szybki dostp do cookies przesyanych z przegldarki.
Jednak koniecznie naley pamita, e zwracan wartoci jest obiekt Cookie,
a nie sama warto cookie. A zatem w celu odczytania wartoci cookie, naley
dodatkowo uy waciwoci value (czyli metody getValue) obiektu Cookie.
Na przykad, oba ponisze wyraenia wywietlaj warto cookie o nazwie
cookieUzytkownika (lub pusty acuch znakw, jeli wskazane cookie nie zostanie
odnalezione):
${cookie.cookieUzytkownika.value}
${cookie["cookieUzytkownika"].value}

Wicej informacji na temat cookies mona znale w rozdziale 8.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

445

initParam
Obiekt initParam pozwala na bardzo atwy dostp do parametrw inicjalizacyjnych
kontekstu. Na przykad, ponisze wyraenie wywietla warto parametru
inicjalizacyjnego o nazwie domyslnyKolor:
${initParam.domyslnyKolor}

Wicej informacji dotyczcych parametrw inicjalizacyjnych mona znale


w II tomie niniejszej ksiki.

pageScope, requestScope, sessionScope oraz applicationScope


Przy uyciu tych czterech obiektw mona ograniczy miejsca, w jakich system
bdzie poszukiwa zmiennych dostpnych w okrelonych zakresach. Na przykad,
w razie uycia wyraenia:
${nazwa}

system poszukuje zmiennej o nazwie nazwa najpierw w obiekcie PageContext,


nastpnie HttpServletRequest, HttpSession, i w kocu w obiekcie
ServletContext; zwrcona zostanie pierwsza odnaleziona zmienna. Jednak w razie
uycia nastpujcego wyraenia:
${requestScope.nazwa}

system bdzie poszukiwa zmiennej wycznie w obiekcie HttpServletRequest.

Przykad
Strona przedstawiona na listingu 16.10 uywa obiektw niejawnych w celu wywietlenia
parametrw dania, nagwkw dania HTTP, wartoci cookies oraz informacji dotyczcych
serwera. Wyniki generowane przez t stron zostay przedstawione na rysunku 16.5.
Listing 16.10. implicit-objects.jsp
<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Using Implicit Objects</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Zastosowanie obiektw niejawnych
</TH></TR>
</TABLE>
<P>
<UL>
<LI><B>Parametr dania "test":</B> ${param.test}
<LI><B>Nagwek User-Agent:</B> ${header["User-Agent"]}

446

Cz II

JavaServer Pages

<LI><B>Warto cookie "JSESSIONID":</B> ${cookie.JSESSIONID.value}


<LI><B>Serwer:</B> ${pageContext.servletContext.serverInfo}
</UL>
</BODY></HTML>

Rysunek 16.5.
Dostpnych jest
kilka zmiennych
definiowanych
automatycznie.
Takie
predefiniowane
zmienne
s nazywane
obiektami
niejawnymi

16.9. Stosowanie operatorw jzyka wyrae


Jzyk wyrae JSP 2.0 definiuje kilka grup operatorw; nale do nich operatory: arytmetyczne, relacyjne, logiczne oraz operator sprawdzajcy, czy zostaa okrelona warto
zmiennej. Cho stosujc te operatory mona tworzy wyraenia nieco prostsze od rwnowanego kodu Javy, to jednak nie naley zapomina o podstawowym celu, w jakim zosta
opracowany jzyk wyrae: zapewnieniu zwizego sposobu dostpu do istniejcych
obiektw i to zazwyczaj w aplikacjach dziaajcych wedug zasad architektury MVC.
Trudno zatem poda powane zalety zastpowania dugich elementw skryptowych pisanych
w Javie przez niewiele krtsze wyraenia EL. Oba te rozwizania s z zaoenia bdne
zoona logika biznesowa lub kod sucy do pobierania informacji w ogle nie powinien
by umieszczany na stronach JSP. W moliwie jak najwikszym stopniu zastosowanie jzyka
wyrae naley ogranicza do logiki prezentacji; logika biznesowa powinna by implementowana w normalnych klasach Javy i wywoywana przez serwlety.
Operatory jzyka wyrae powinny by uywane w prostych zastosowaniach, ktre maj
bezporedni zwizek z logik prezentacji (na przykad, przy podjciu decyzji, w jaki sposb
naley wywietli dane). Naley unika stosowania tych operatorw w logice biznesowej
(czyli do tworzenia i przetwarzania danych). Logik biznesow naley implementowa
w zwyczajnych klasach Javy, uywanych w kodzie serwletw, ktre, w architekturze MVC,
rozpoczynaj proces obsugi da.

Operatory arytmetyczne
Operatory arytmetyczne dostpne w jzyku wyrae s zazwyczaj uywane do wykonywania
prostych operacji na wartociach zapisanych w komponentach. Nie naley stosowa ich do
realizacji zoonych algorytmw; taki kod naley umieszcza w zwyczajnych klasach Javy.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

447

Operatory + oraz
To standardowe operatory dodawania i odejmowania, ktre maj dwie szczeglne
cechy. Po pierwsze, jeli ktrykolwiek z operandw jest acuchem znakw,
to przed wykonaniem dziaania zostanie on skonwertowany do postaci liczby
(trzeba przy tym pamita, e system nie przechwytuje automatycznie wyjtkw
NumberFormatException). Poza tym, jeli ktrykolwiek z operandw jest typu
BigInteger lub BigDecimal, to system wykona dziaania uywajc odpowiednich
metod add lub subtract.

Operatory *, / oraz div


To standardowe operatory mnoenia i dzielenia, ktre maj kilka cech szczeglnych.
Przede wszystkim, podobnie jak w przypadku operatorw + oraz -, typy operandw
s konwertowane automatycznie. Po drugie, podczas wykonywania dziaa
uwzgldniany jest standardowy priorytet operatorw. A zatem ponisze wyraenie:
${1 + 2 * 3 }

zwrci warto 7, a nie 9. Kolejno wykonywania poszczeglnych dziaa mona


zmienia przy uyciu nawiasw. Po trzecie, operatory / oraz div maj to samo
dziaanie; s one dostpne w celu zapewnienia zgodnoci z jzykami XPath
oraz JavaScript (ECMAScript).

Operatory % oraz mod


Operator % (oraz stanowicy jego odpowiednik operator mod) obliczaj modu
(czyli reszt z dzielenia) analogicznie jak operator % jzyka Java.

Operatory relacyjne
Operatory relacyjne najczciej s stosowane wraz z operatorem warunkowym udostpnianym przez jzyk wyrae (patrz podrozdzia 16.10), bd te w znacznikach niestandardowych, ktrych atrybuty wymagaj podania wartoci logicznej (na przykad, w znacznikach
umoliwiajcych wielokrotne przetwarzanie, takich jak te dostpne w bibliotece JSLT, opisanej w II tomie niniejszej ksiki).

Operatory == oraz eq
Te dwa rwnowane sobie operatory sprawdzaj, czy podane argumenty s sobie
rwne. Jednak pod wzgldem sposobu dziaania przypominaj one raczej metod
equals Javy, ni stosowany w tym jzyku operator ==. Operatory te zwracaj
warto true, jeli oba operandy s tym samym obiektem. Jeli operandy s
liczbami, to zostaj one porwnane przy uyciu standardowego operatora == Javy.
Jeli jeden z operandw ma warto null, to porwnanie zawsze zwraca warto
false. Jeli ktry z operandw jest obiektem typu BigInteger lub BigDecimal,
to operandy s porwnywane przy uyciu metody compareTo. We wszystkich
pozostaych przypadkach operandy s porwnywane przy uyciu metody equals.

448

Cz II

JavaServer Pages

Operatory != oraz ne
Te dwa rwnowane sobie operatory sprawdzaj, czy podane argumenty s rne
od siebie. Jednak take i one pod wzgldem sposobu dziaania przypominaj
raczej negacj metody equals Javy, ni stosowany w tym jzyku operator !=.
Jeli oba operandy s tym samym obiektem, to operatory te zwracaj warto false.
Jeli operandy s liczbami, to zostaj one porwnane przy uyciu standardowego
operatora != Javy. Jeli jeden z operandw ma warto null, to porwnanie zawsze
zwraca warto true. Jeli ktry z operandw jest obiektem typu BigInteger
lub BigDecimal, to operandy s porwnywane przy uyciu metody compareTo.
We wszystkich pozostaych przypadkach operandy s porwnywane przy uyciu
metody equals, a wynik wyraenia jest negacj wartoci zwrconej przez t metod.

Operatory < i lt, > i gt, <= i le oraz >= i ge


S to standardowe operatory relacyjne, ktre maj jednak dwie cechy szczeglne.
Przede wszystkim, porwnywane operandy s poddawane konwersji typw
(analogicznie jak w przypadku operatorw == oraz !=). A poza tym, jeli operandy
s acuchami znakw, to zostan one porwnane alfabetycznie.

Operatory logiczne
Te operatory su do czenia wynikw zwracanych przez operatory relacyjne.

Operatory &&, and, ||, or, ! oraz not


To standardowe operatory logicznej koniunkcji (AND), alternatywy (OR) oraz
zaprzeczenia (!). W pierwszej kolejnoci konwertuj one operandy do wartoci
logicznych, a nastpnie uywaj standardowych operatorw logicznych Javy
o skrconym cyklu przetwarzania (ktre sprawiaj, e przetwarzanie wyraenia
zostaje przerwane, kiedy tylko zostanie okrelony jego ostateczny wynik).
Operator && jest rwnowany z operatorem and, operator || jest rwnowany
z or, a ! rwnowany z not.

Operator empty
Ten operator zwraca warto true, jeli jego argumentem jest warto null, pusty acuch
znakw, pusta tablica, pusty obiekt Map lub pusta kolekcja. W przeciwnym razie operator
zwraca warto false.

Przykad
Listing 16.11 przedstawia zastosowanie kilku standardowych operatorw. Wyniki zostay
pokazane na rysunku 16.6.

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

Listing 16.11. operators.jsp


<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Operatory jzyka wyrae</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Operatory jzyka wyrae
</TH></TR>
</TABLE>
<P>
<TABLE BORDER=1 ALIGN="CENTER">
<TR><TH CLASS="COLORED" COLSPAN=2>Operatory arytmetyczne</TH>
<TH CLASS="COLORED" COLSPAN=2>Operatory relacyjne</TH>
</TR>
<TR><TH>Wyraenie</TH><TH>Wynik</TH><TH>Wyraenie</TH><TH>Wynik</TH></TR>
<TR ALIGN="CENTER">
<TD>\${3+2-1}<TD>${3+2-1} <%-- Dodawanie/odejmowanie --%></TD>
<TD>\${1&lt;2}<TD>${1<2}
<%-- Porwnanie liczb --%></TD>
</TR>
<TR ALIGN="CENTER">
<TD>\${"1"+2}<TD>${"1"+2}
<%-- Konwersja acuchw znakw --%></TD>
<TD>\${"a"&lt;"b"}<TD>${"a"<"b"} <%-- Porwnanie alfabetyczne --%></TD>
</TR>
<TR ALIGN="CENTER">
<TD>\${1 + 2*3 + 3/4}<TD>${1 + 2*3 + 3/4} <%-- Mnoenie/dzielenie --%></TD>
<TD>\${2/3 &gt;= 3/2}<TD>${2/3 >= 3/2}
<%-- >= --%></TD>
</TR>
<TR ALIGN="CENTER">
<TD>\${3%2}<TD>${3%2}
<%-- Reszta z dzielenia --%></TD>
<TD>\${3/4 == 0.75}<TD>${3/4 == 0.75} <%-- Liczbowo = --%></TD>
</TR>
<TR ALIGN="CENTER">
<%-- Operatory div oraz mod s odpowiednikami operatorw / and % --%></TD>
<TD>\${(8 div 2) mod 3}<TD>${(8 div 2) mod 3}
<%-- Porwnanie przy uyciu "equals" jednak zwraca warto
false w razie podania wartoci null --%></TD>
<TD>\${null == "test"}<TD>${null == "test"}</TD>
</TR>
<TR><TH CLASS="COLORED" COLSPAN=2>Operatry logiczne</TH>
<TH CLASS="COLORED" COLSPAN=2> Operator <CODE>empty</CODE></TH>
</TR>
<TR><TH>Wyraenie</TH><TH>Wynik</TH><TH>Wyraenie</TH><TH>Wynik</TH></TR>
<TR ALIGN="CENTER">
<TD>\${(1&lt;2) && (4&lt;3)}<TD>${(1<2) && (4<3)} <%--AND--%></TD>
<TD>\${empty ""}<TD>${empty ""} <%-- Pusty acuch znakw --%></TD>
</TR>
<TR ALIGN="CENTER">
<TD>\${(1&lt;2) || (4&lt;3)}<TD>${(1<2) || (4<3)} <%--OR--%></TD>
<TD>\${empty null}<TD>${empty null} <%-- null --%></TD>

449

450

Cz II

JavaServer Pages

</TR>
<TR ALIGN="CENTER">
<TD>\${!(1&lt;2)}<TD>${!(1<2)} <%-- NOT -%>
<%-- Obsuga wartoci null oraz pustych acuchw znakw
w parametrach dania --%></TD>
<TD>\${empty param.blah}<TD>${empty param.blah}</TD>
</TR>
</TABLE>
</BODY></HTML>

Rysunek 16.6.
Jzyk wyrae
JSP 2.0
udostpnia
niewielki zbir
operatorw.
Naley ich uywa
z duym umiarem
logika
biznesowa
powinna by
wykonywana
przez serwlety,
a nie na stronach
JSP

16.10. Warunkowe przetwarzanie wyrae


Jzyk wyrae JSP 2.0 sam w sobie nie udostpnia bogatych moliwoci realizacji logiki
warunkowej. Moliwoci, jakimi dysponuje, w rzeczywistoci zapewniaj znaczniki c:if
oraz c:choose biblioteki JSTL (ang. JSP Standard Template Library), bd jakiejkolwiek
innej biblioteki znacznikw niestandardowych. (Zagadnienia zwizane ze stosowaniem biblioteki JSTL oraz tworzeniem znacznikw niestandardowych zostay opisane w II tomie
niniejszej ksiki).
Niemniej jednak, jzyk wyrae udostpnia podstawowy operator ?:, doskonale znany
z jzykw Java, C oraz C++. Na przykad, jeli wyraenie test przyjmie warto true, to
ponisze wyraenie:
${ test ? wyraenie1 : wyraenie2 }

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

451

zwrci warto wyraenia wyraenie1; w przeciwnym przypadku zwrci ono warto wyraenia wyraenie2. Nie mona jednak zapomina, i podstawowym przeznaczeniem jzyka
wyrae jest upraszczanie logiki prezentacji; dlatego naley pamita, by nie stosowa tego
operatora do wykonywania operacji zwizanych z logik biznesow.

Przykad
Serwlet przedstawiony na listingu 16.12 tworzy dwa obiekty SalesBean (patrz listing 16.13),
po czym przekazuje danie na stron JSP (patrz listing 16.14) odpowiedzialn za przedstawienie wynikw (patrz rysunek 16.7). Jednak jeli cakowita ilo sprzedanych produktw bdzie mniejsza od 0, to strona JSP powinna zastosowa czerwone to w odpowiedniej
komrce tabeli. Implementacja takiego sposobu dziaania strony naley do zada logiki
prezentacji, a zatem zastosowanie operatora ?: jest waciwe.
Listing 16.12. Conditionals.java
package coreservlets;
/** Serwlet tworzy zmienne dostpne w zakresie dania, ktre
* zostan zastosowane do przedstawienia operatora warunkowego
* jzyka wyrae (xxx ? xxx : xxx).
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Conditionals extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
SalesBean apples =
new SalesBean(150.25, -75.25, 22.25, -33.57);
SalesBean oranges =
new SalesBean(-220.25, -49.57, 138.25, 12.25);
request.setAttribute("apples", apples);
request.setAttribute("oranges", oranges);
RequestDispatcher dispatcher =
request.getRequestDispatcher("/el/conditionals.jsp");
dispatcher.forward(request, response);
}
}

Listing 16.13. SalesBean.java


package coreservlets;
public class SalesBean {
private double q1, q2, q3, q4;
public SalesBean(double
double
double
double

q1Sales,
q2Sales,
q3Sales,
q4Sales) {

452

Cz II

q1
q2
q3
q4

=
=
=
=

JavaServer Pages
q1Sales;
q2Sales;
q3Sales;
q4Sales;

}
public double getQ1() { return(q1); }
public double getQ2() { return(q2); }
public double getQ3() { return(q3); }
public double getQ4() { return(q4); }
public double getTotal() { return(q1 + q2 + q3 + q4); }
}

Listing 16.14. conditionals.jsp


<%@ page contentType="text/html; charset=ISO-8859-2" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD><TITLE>Przetwarzanie warunkowe</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
<LINK REL=STYLESHEET
HREF="/el/JSP-Styles.css"
TYPE="text/css">
</HEAD>
<BODY>
<TABLE BORDER=5 ALIGN="CENTER">
<TR><TH CLASS="TITLE">
Przetwarzanie warunkowe
</TH></TR>
</TABLE>
<P>
<TABLE BORDER=1 ALIGN="CENTER">
<TR><TH></TH>
<TH CLASS="COLORED">Jabka</TH>
<TH CLASS="COLORED">Pomaracze</TH>
</TR>
<TR><TH CLASS="COLORED">Pierwszy kwarta</TH>
<TD ALIGN="RIGHT">${apples.q1}</TD>
<TD ALIGN="RIGHT">${oranges.q1}</TD>
</TR>
<TR><TH CLASS="COLORED">Drugi kwarta</TH>
<TD ALIGN="RIGHT">${apples.q2}</TD>
<TD ALIGN="RIGHT">${oranges.q2}</TD>
</TR>
<TR><TH CLASS="COLORED">Trzeci kwarta</TH>
<TD ALIGN="RIGHT">${apples.q3}</TD>
<TD ALIGN="RIGHT">${oranges.q3}</TD>
</TR>
<TR><TH CLASS="COLORED">Czwarty kwarta</TH>
<TD ALIGN="RIGHT">${apples.q4}</TD>
<TD ALIGN="RIGHT">${oranges.q4}</TD>
</TR>
<TR><TH CLASS="COLORED">Suma</TH>

Rozdzia 16.

Upraszczanie dostpu do kodu Javy: jzyk wyrae JSP 2.0

453

<TD ALIGN="RIGHT"
BGCOLOR="${(apples.total < 0) ? "RED" : "WHITE" }">
${apples.total}</TD>
<TD ALIGN="RIGHT"
BGCOLOR="${(oranges.total < 0) ? "RED" : "WHITE" }">
${oranges.total}</TD>
</TR>
</TABLE>
</P>
</BODY></HTML>

Rysunek 16.7.
W celu warunkowego
wywietlania rnych
elementw mona
zastosowa operator ?:
przypominajcy
analogiczny operator
znany z jzyka C.
Jednak czsto zdarza
si, i tak warunkow
prezentacj znacznie
wygodniej mona
zaimplementowa
przy uyciu
niestandardowych
znacznikw dostpnych
w bibliotece znacznikw
JSTL

16.11. Informacje o innych moliwociach


jzyka wyrae
W niniejszym rozdziale opisano wikszo moliwoci, jakie zapewnia jzyk wyrae JSP
2.0. Pominite zostay jedynie dwie z nich: zastosowanie jzyka wyrae w bibliotekach
znacznikw niestandardowych oraz zastosowanie funkcji jzyka wyrae. Oba te zagadnienia
zostay szczegowo przedstawione w II tomie niniejszej ksiki, gdy dopiero w nim zostay
opisane niezbdne technologie.
Oto bardzo skrtowe przedstawienie tych moliwoci: wyraenia EL mog by umieszczane w
dowolnych atrybutach znacznikw niestandardowych, ktre mog by przetwarzane w trakcie obsugi dania (czyli atrybutw opisywanych przez element attribute, ktrego atrybut rtexprvalue
przyjmuje warto true). Z kolei funkcje jzyka wyrae odpowiadaj publicznym, statycznym
metodom zwyczajnych klas Javy, ktre w pliku deskryptora biblioteki znacznikw (TLD) zostay
zdefiniowane przy uyciu elementu function.

You might also like