SPIS TRE„CI i Java Server Pages
Transcript of SPIS TRE„CI i Java Server Pages
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: [email protected]
PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£
IDZ DOIDZ DO
ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG
KATALOG KSI¥¯EKKATALOG KSI¥¯EK
TWÓJ KOSZYKTWÓJ KOSZYK
CENNIK I INFORMACJECENNIK I INFORMACJE
ZAMÓW INFORMACJEO NOWOŒCIACH
ZAMÓW INFORMACJEO NOWOŒCIACH
ZAMÓW CENNIKZAMÓW CENNIK
CZYTELNIACZYTELNIA
FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE
SPIS TREŒCISPIS TREŒCI
DODAJ DO KOSZYKADODAJ DO KOSZYKA
KATALOG ONLINEKATALOG ONLINE
Java Servlet
i Java Server PagesAutor: Marty Hall
T³umaczenie: Piotr Rajca
ISBN: 83-7197-603-8
Tytu³ orygina³u:
Format: B5, stron: 530
Core Servlets and JavaServer Pages
Niniejsza ksi¹¿ka przeznaczona jest dla prawdziwych programistów. Jej celem nie jest
przedstawienie potencja³u internetowego handlu ani sposobów, w jaki aplikacje
internetowe mog¹ zrewolucjonizowaæ przedsiêbiorstwo. Jest to praktyczna ksi¹¿ka
przeznaczona dla programistów, którzy ju¿ doskonale rozumiej¹, jak istotne jest
tworzenie dynamicznych witryn WWW. Zadaniem niniejszej ksi¹¿ki jest przedstawienie
poprawnego sposobu prowadzenia takiej pracy. Prezentuj¹c metody tworzenia
dynamicznych witryn WWW autor stara³ siê uwzglêdniæ najwa¿niejsze u¿ywane techniki
i opisaæ najczêœciej napotykane problemy. Jednoczeœnie przedstawiono bardzo du¿o
praktycznych zastosowañ (na przyk³ad — ponad sto klas Javy). Podano szczegó³owe
przyk³ady dla wszystkich najwa¿niejszych i najczêœciej wykorzystywanych mo¿liwoœci,
a tak¿e zamieszczono podsumowania przedstawiaj¹ce równie¿ rzadziej wykorzystywane
zastosowania i wskazano dostêpne w Internecie Ÿród³a informacji dotycz¹ce interfejsów
programistycznych (API) umo¿liwiaj¹cych wykorzystanie tych najrzadziej stosowanych
mo¿liwoœci.
Nie ma tu wielu pobie¿nych opisów licznych technologii. Nie by³o zamierzeniem autora,
aby niniejsza ksi¹¿ka sta³a siê ostatecznym Ÿród³em informacji na wszystkie omawiane
w niej tematy. S¹ to zagadnienia bardzo obszerne. Przyk³adowo, istnieje kilka ksi¹¿ek
o porównywalnej objêtoœci poœwiêconych wy³¹cznie JDBC. Nale¿y podkreœliæ, ¿e
poszczególne zagadnienia zosta³y tutaj przedstawione na tyle szczegó³owo, aby
Czytelnik móg³ samodzielnie rozpocz¹æ tworzenie programów nadaj¹cych siê do
praktycznego zastosowania. Jedynym warunkiem jest znajomoœæ podstaw jêzyka Java:
jego zastosowania i wykorzystywania. W razie braku tych umiejêtnoœci Czytelnik
powinien zaznajomiæ siê z zasadami programowania w tym jêzyku.
O Autorze ...........................................................................................................13
Wprowadzenie ....................................................................................................15
Część I Serwlety 2.1 i 2.2 ................................................................ 23
Rozdział 1. Podstawowe informacje o serwletach i Java Server Pages ...............25Serwlety ..........................................................................................................................25Zalety serwletów w porównaniu ze zwykłymi programami CGI...................................27
Efektywność .............................................................................................................27Wygoda ....................................................................................................................27Duże możliwości ......................................................................................................28Przenośność ..............................................................................................................28Bezpieczeństwo ........................................................................................................28Niewielkie koszty .....................................................................................................29
Java Server Pages ...........................................................................................................29Zalety JSP .......................................................................................................................30
W porównaniu z Active Server Pages (ASP) ...........................................................30W porównaniu z PHP ...............................................................................................30W porównaniu z serwletami.....................................................................................30W porównaniu z Server-Side Includes (SSI) ...........................................................31W porównaniu z językiem JavaScript ......................................................................31W porównaniu ze statycznym kodem HTML ..........................................................31
Instalacja i konfiguracja..................................................................................................32Zdobywanie oprogramowania do obsługi serwletów i dokumentów JSP................32Zapamiętaj adres lub zainstaluj dokumentację Java Servlet oraz JSP API ..............34Wskazanie klas używanych przez kompilator Javy .................................................34Umieszczanie klasy w pakietach ..............................................................................35Konfiguracja serwera ...............................................................................................36Uruchomienie serwera..............................................................................................37Kompilacja i instalacja własnych serwletów............................................................37
Rozdział 2. Pierwsze serwlety ..........................................................................41Podstawowa struktura serwletów ...................................................................................41Prosty serwlet generujący zwykły tekst..........................................................................43
Kompilacja i instalacja serwletów............................................................................43Wywoływanie serwletów .........................................................................................45
Serwlety generujące kod HTML ....................................................................................45
4 Java Servlet i Java Server Pages
Umieszczanie serwletów w pakietach ............................................................................47Tworzenie serwletów należących do konkretnego pakietu ......................................48Kompilacja serwletów należących do pakietów.......................................................49Wywoływanie serwletów należących do pakietów..................................................50
Proste narzędzia pomocne podczas tworzenia dokumentów HTML .............................51Cykl istnienia serwletów.................................................................................................53
Metoda init ...............................................................................................................54Metoda service .........................................................................................................55Metody doGet, doPost oraz doXxx ..........................................................................56Interfejs SingleThreadModel....................................................................................57Metoda destroy .........................................................................................................57
Przykład zastosowania parametrów inicjalizacyjnych ...................................................58Przykład wykorzystania inicjalizacji serwletu i daty modyfikacji strony ......................62Testowanie serwletów ....................................................................................................64WebClient: interaktywna wymiana informacji z serwerem WWW...............................68
WebClient.................................................................................................................68HttpClient .................................................................................................................71NetworkClient ..........................................................................................................72SocketUtil .................................................................................................................74CloseableFrame ........................................................................................................74LabeledTextField......................................................................................................75Interruptible ..............................................................................................................77
Rozdział 3. Obsługa żądań: dane przesyłane za pomocą formularzy ....................79Znaczenie informacji przesyłanych za pomocą formularzy ...........................................79Odczytywanie danych formularzy w serwletach ............................................................80Przykład: odczytanie trzech konkretnych parametrów...................................................81Przykład: odczytanie wszystkich parametrów................................................................84Serwis rejestracji życiorysów .........................................................................................87Filtrowanie łańcuchów w poszukiwaniu znaków specjalnych HTML...........................97
Implementacja filtrowania........................................................................................98Przykład....................................................................................................................99
Rozdział 4. Obsługa żądań: nagłówki żądań HTTP............................................103Odczytywanie wartości nagłówków żądania w serwletach..........................................104Wyświetlanie wszystkich nagłówków..........................................................................105Nagłówki żądań protokołu HTTP 1.1...........................................................................107Przesyłanie skompresowanych stron WWW................................................................113Ograniczanie dostępu do stron WWW .........................................................................115
Rozdział 5. Dostęp do standardowych zmiennych CGI .....................................121Odpowiedniki zmiennych CGI dostępne w serwletach................................................122Serwlet wyświetlający wartości zmiennych CGI .........................................................125
Rozdział 6. Generowanie odpowiedzi: kody statusu .........................................127Określanie kodów statusu .............................................................................................128Kody statusu protokołu HTTP 1.1 oraz ich przeznaczenie ..........................................129Interfejs użytkownika obsługujący różne serwisy wyszukujące.....................................138
Rozdział 7. Generowanie odpowiedzi: nagłówki odpowiedzi HTTP ......................145Określanie nagłówków odpowiedzi z poziomu serwletów ..........................................145Nagłówki odpowiedzi protokołu HTTP 1.1 oraz ich znaczenie...................................147Trwałe przechowywanie stanu serwletu i automatyczne odświeżanie stron .................156Stosowanie trwałych połączeń HTTP...........................................................................164Wykorzystanie serwletów do generowania obrazów GIF ............................................168
Spis treści 5
Rozdział 8. Obsługa cookies ..........................................................................177Korzyści płynące ze stosowania cookies ......................................................................177
Identyfikacja użytkowników podczas trwania sesji na witrynach komercyjnych..177Unikanie konieczności podawania nazwy użytkownika i hasła.............................178Dostosowywanie witryny .......................................................................................178Dobór reklam..........................................................................................................179
Niektóre problemy związane ze stosowaniem cookies ................................................179Narzędzia obsługi cookies dostępne w serwletach .......................................................180
Tworzenie cookies..................................................................................................181Atrybuty cookies ....................................................................................................181Umieszczanie cookies w nagłówkach odpowiedzi.................................................183Odczytywanie cookies nadesłanych przez przeglądarkę........................................183
Przykłady generowania i odczytywania cookies ..........................................................184Proste narzędzia do obsługi cookies .............................................................................187
Odnajdywanie cookie o określonej nazwie ............................................................187Tworzenie cookies o długim czasie istnienia .........................................................188
Interfejs wyszukujący z możliwością zapamiętywania ustawień .................................190
Rozdział 9. Śledzenie sesji .............................................................................193Potrzeba śledzenia sesji ................................................................................................193
Cookies ...................................................................................................................193Przepisywanie adresów URL .................................................................................194Ukryte pola formularzy ..........................................................................................195Śledzenie sesji w serwletach ..................................................................................195
Narzędzia programistyczne do śledzenia sesji..............................................................195Pobieranie obiektu HttpSession skojarzonego z bieżącym żądaniem....................195Pobieranie informacji skojarzonych z sesją ...........................................................196Kojarzenie informacji z sesją .................................................................................199Kończenie sesji.......................................................................................................200Przepisywanie adresów URL przesyłanych do przeglądarki .................................200
Serwlet generujący indywidualny licznik odwiedzin dla każdego użytkownika .........201Internetowy sklep wykorzystujący koszyki i śledzenie sesji........................................203
Tworzenie interfejsu użytkownika .........................................................................204Obsługa zamówień .................................................................................................207To czego nie widać: implementacja koszyka i katalogu produktów......................211
Część II Java Server Pages .............................................................. 219
Rozdział 10. Elementy skryptowe JSP ..............................................................221Elementy skryptowe .....................................................................................................223
Tekst szablonu........................................................................................................223Wyrażenia JSP ..............................................................................................................224
Predefiniowane zmienne ........................................................................................224Składnia XML stosowana w wyrażeniach .............................................................225Zastosowanie wyrażeń jako wartości atrybutów....................................................225Przykład..................................................................................................................226
Skryptlety JSP...............................................................................................................227Wykorzystanie skryptletów do warunkowego wykonania fragmentu strony JSP .230Specjalna składnia skryptletów ..............................................................................230
Deklaracje JSP ..............................................................................................................230Specjalna składnia zapisu deklaracji ......................................................................232
Predefiniowane zmienne...............................................................................................232
6 Java Servlet i Java Server Pages
Rozdział 11. Dyrektywa page: strukturalizacja generowanych serwletów ...........235Atrybut import ..............................................................................................................236
Katalogi służące do przechowywania własnych klas.............................................236Przykład..................................................................................................................237
Atrybut contentType.....................................................................................................239Generowanie zwykłych dokumentów tekstowych .................................................239Generowanie arkuszy kalkulacyjnych programu Microsoft Excel ........................240
Atrybut isThreadSafe....................................................................................................243Atrybut session .............................................................................................................245Atrybut buffer ...............................................................................................................245Atrybut autoflush ..........................................................................................................246Atrybut extends.............................................................................................................246Atrybut info ..................................................................................................................246Atrybut errorPage .........................................................................................................246Atrybut isErrorPage ......................................................................................................248Atrybut language ..........................................................................................................249Składnia XML zapisu dyrektyw ...................................................................................249
Rozdział 12. Dołączanie plików i apletów do dokumentów JSP ..........................251Dołączanie plików w czasie przekształcania strony .....................................................252Dołączanie plików podczas obsługi żądań ...................................................................254Dołączanie apletów związanych z Java Plug-In ...........................................................257
Znacznik akcji jsp:plugin .......................................................................................258Znaczniki akcji jsp:param oraz jsp:params ............................................................260Znacznik akcji jsp:fallback.....................................................................................261Przykład: Generowanie tekstu z cieniem ...............................................................261
Rozdział 13. Wykorzystanie komponentów JavaBeans w dokumentach JSP .......267Podstawowe sposoby użycia komponentów.................................................................268
Dostęp do właściwości komponentów ...................................................................270Określanie właściwości komponentów — prosty przypadek.................................271Instalacja klas komponentów .................................................................................271
Przykład: StringBean ....................................................................................................272Określanie wartości właściwości komponentów ..........................................................274
Kojarzenie właściwości z parametrami wejściowymi............................................277Automatyczna konwersja typów ............................................................................279Kojarzenie wszystkich właściwości z parametrami wejściowymi.........................280
Wspólne wykorzystywanie komponentów ...................................................................281Warunkowe tworzenie komponentów....................................................................282
Rozdział 14. Tworzenie bibliotek znaczników ....................................................287Elementy tworzące bibliotekę znaczników ..................................................................288
Klasa obsługi znacznika .........................................................................................288Plik deskryptora biblioteki znaczników .................................................................289Plik JSP...................................................................................................................290
Definiowanie prostych znaczników..............................................................................292Klasa obsługi znacznika .........................................................................................292Plik deskryptora biblioteki znaczników .................................................................294Plik JSP...................................................................................................................295
Przypisywanie atrybutów znacznikom .........................................................................296Klasa obsługi znacznika .........................................................................................296Plik deskryptora biblioteki znaczników .................................................................298Plik JSP...................................................................................................................299
Spis treści 7
Dołączanie zawartości znacznika .................................................................................300Klasa obsługi znacznika .........................................................................................301Plik deskryptora biblioteki znaczników .................................................................303Plik JSP...................................................................................................................304
Opcjonalne dołączanie zawartości znacznika...............................................................306Klasa obsługi znacznika .........................................................................................306Plik deskryptora biblioteki znaczników .................................................................307Plik JSP...................................................................................................................308
Manipulowanie zawartością znacznika ........................................................................309Klasa obsługi znacznika .........................................................................................310Plik deskryptora biblioteki znaczników .................................................................311Plik JSP...................................................................................................................312
Wielokrotne dołączanie lub obsługa zawartości znacznika..........................................313Klasa obsługi znacznika .........................................................................................314Plik deskryptora biblioteki znaczników .................................................................315Plik JSP...................................................................................................................316
Stosowanie znaczników zagnieżdżonych ........................................................................316Klasy obsługi znaczników......................................................................................317Plik deskryptora biblioteki znaczników .................................................................322Plik JSP...................................................................................................................324
Rozdział 15. Integracja serwletów i dokumentów JSP .......................................327Przekazywanie żądań....................................................................................................328
Stosowanie zasobów statycznych...........................................................................329Przekazywanie informacji do strony docelowej.....................................................329Interpretacja względnych adresów URL przez stronę docelową ...........................331Inne sposoby pobierania obiektu RequestDispatcher.............................................332
Przykład: internetowe biuro podróży............................................................................332Dołączanie danych statycznych lub dynamicznych......................................................346Przykład: prezentacja nieprzetworzonych wynikówzwracanych przez serwlety lub strony JSP ................................................................347
Przekazywanie żądań ze stron JSP ...............................................................................351
Część III Technologie pomocnicze..................................................... 353
Rozdział 16. Formularze HTML .........................................................................355Jak przesyłane są dane z formularzy HTML ................................................................355Element FORM.............................................................................................................359Tekstowe elementy kontrolne.......................................................................................364
Pola tekstowe..........................................................................................................364Pola hasła................................................................................................................366Wielowierszowe pola tekstowe ..............................................................................366
Przyciski .......................................................................................................................368Przycisk SUBMIT ..................................................................................................369Przyciski RESET....................................................................................................371Przyciski JavaScript ...............................................................................................372
Pola wyboru i przyciski opcji .......................................................................................373Pola wyboru............................................................................................................373Przyciski opcji ........................................................................................................374
Listy i listy rozwijane ...................................................................................................376Element kontrolny służący do przesyłania plików .......................................................379Mapy odnośników obsługiwane na serwerze ...............................................................380
IMAGE — standardowe mapy odnośników obsługiwane po stronie serwera.......381ISMAP — alternatywny sposób tworzenia map odnośnikówobsługiwanych po stronie serwera .......................................................................383
8 Java Servlet i Java Server Pages
Pola ukryte ....................................................................................................................385Grupowanie elementów kontrolnych............................................................................386Określanie kolejności poruszania się pomiędzy elementami formularzy.....................388Testowy serwer WWW.................................................................................................388
EchoServer .............................................................................................................389ThreadedEchoServer ..............................................................................................392NetworkServer........................................................................................................394
Rozdział 17. Zastosowanie apletów jako interfejsu użytkownika dla serwletów....397Przesyłanie danych metodą GET i wyświetlanie wynikowej strony WWW................398Narzędzie korzystające z wielu serwisów wyszukujących...........................................399Przesyłanie danych metodą GET i bezpośrednie przetwarzanie wyników(tunelowanie HTTP)...................................................................................................402
Odczyt danych binarnych lub danych ASCII.........................................................403Odczyt serializowanych struktur danych................................................................404
Przeglądarka zapytań wykorzystująca serializację obiektów i tunelowanie ................407Przesyłanie danych metodą POST i bezpośrednie przetwarzanie danych(tunelowanie HTTP)...................................................................................................413
Aplet przesyłający dane metodą POST ........................................................................416Pomijanie serwera HTTP..............................................................................................419
Rozdział 18. JDBC oraz zarządzanie pulami połączeń .........................................421Podstawowe etapy wykorzystania JDBC .....................................................................422
Załadowanie sterownika.........................................................................................422Określenie adresu URL połączenia ........................................................................423Nawiązanie połączenia ...........................................................................................423Utworzenie polecenia .............................................................................................424Wykonanie zapytania .............................................................................................424Przetworzenie wyników .........................................................................................425Zamknięcie połączenia ...........................................................................................426
Prosty przykład wykorzystania JDBC..........................................................................426Narzędzia ułatwiające korzystanie z JDBC..................................................................432Wykorzystanie narzędzi ułatwiających obsługę JDBC ................................................440Interaktywna przeglądarka zapytań ..............................................................................444
Kod przeglądarki zapytań.......................................................................................446Przygotowane polecenia (prekompilowane zapytania) ................................................451Zarządzanie pulami połączeń .......................................................................................455Zarządzanie pulami połączeń: studium zagadnienia ....................................................461Współużytkowanie pul połączeń ..................................................................................467
Współużytkowanie pul połączeń z zastosowaniem kontekstu serwletu.................467Współużytkowanie pul połączeń z zastosowaniem klas singleton.........................468
Dodatki ................................................................................................ 469
Dodatek A Krótki przewodnik po serwletach i JSP..........................................471Prezentacja serwletów i JSP .........................................................................................471
Zalety serwletów ....................................................................................................471Zalety JSP...............................................................................................................471Bezpłatnie dostępne oprogramowanie do obsługi serwletów i JSP .......................472Dokumentacja.........................................................................................................472Kompilacja serwletów — informacje podawanew zmiennej środowiskowej CLASSPATH..........................................................472
Standardowe katalogi serwera Tomcat 3.0.............................................................472Standardowe katalogi serwera Tomcat 3.1.............................................................473
Spis treści 9
Standardowe katalogi serwera JSWDK 1.0.1 ........................................................473Standardowe katalogi serwera Java Web Server 2.0..............................................473
Pierwsze serwlety .........................................................................................................473Prosty serwlet .........................................................................................................473Instalacja serwletów ...............................................................................................474Uruchamianie serwletów........................................................................................474Cykl istnienia serwletów ........................................................................................474
Obsługa żądań — dane przesyłane z formularzy..........................................................475Odczyt parametrów ................................................................................................475Przykład serwletu ...................................................................................................475Przykład formularza ...............................................................................................476Filtrowanie znaków specjalnych HTML................................................................477
Obsługa żądań — nagłówki żądań HTTP ....................................................................477Metody odczytujące nagłówki żądania ..................................................................477Inne informacje o żądaniu ......................................................................................478Najczęściej używane nagłówki żądań protokołu HTTP 1.1...................................478
Dostęp do standardowych zmiennych CGI ..................................................................479Możliwości, które nie zostały opisane gdzie indziej ..............................................479Odpowiedniki zmiennych CGI dostępne w serwletach..........................................479
Generowanie odpowiedzi: Kody statusu HTTP ...........................................................480Format odpowiedzi HTTP......................................................................................480Metody określające kod statusu .............................................................................480Kategorie kodów statusu ........................................................................................481Najczęściej wykorzystywane kody statusu protokołu HTTP 1.1...........................481
Generowanie odpowiedzi — nagłówki odpowiedzi protokołu HTTP .........................482Generowanie dowolnych nagłówków ....................................................................482Generowanie najczęściej używanych nagłówków .................................................482Najczęściej używane nagłówki odpowiedzi protokołu HTTP 1.1 .........................483Generowanie obrazów GIF przez serwlety ............................................................484
Obsługa cookies............................................................................................................484Typowe zastosowania cookies ...............................................................................484Problemy napotykane przy stosowaniu cookies.....................................................484Ogólny sposób użycia cookies ...............................................................................485Metody obsługi cookies..........................................................................................485
Śledzenie sesji...............................................................................................................486Pobieranie informacji o sesji — getValue..............................................................486Kojarzenie informacji z sesją — putValue.............................................................486Metody interfejsu HttpSession ...............................................................................487Kodowanie adresów URL ......................................................................................488
Elementy skryptowe JSP ..............................................................................................488Typy elementów skryptowych ...............................................................................488Tekst szablonu........................................................................................................489Predefiniowane zmienne ........................................................................................489
Dyrektywa page — określanie postaci generowanych serwletów................................490Atrybut import ........................................................................................................490Atrybut contentType...............................................................................................490Przykład użycia atrybutu contentType ...................................................................490Przykład wykorzystania metody setContentType ..................................................490Atrybut isThreadSafe .............................................................................................491Atrybut session .......................................................................................................491Atrybut buffer.........................................................................................................492Atrybut autoflush....................................................................................................492Atrybut extends ......................................................................................................492Atrybut info ............................................................................................................492
10 Java Servlet i Java Server Pages
Atrybut errorPage ...................................................................................................492Atrybut isErrorPage................................................................................................492Atrybut language ....................................................................................................492Zapis zgodny z XML..............................................................................................493
Dołączanie plików i apletów do dokumentów JSP.......................................................493Dołączanie plików w czasie przekształcania strony...............................................493Dołączanie plików w czasie obsługi żądania .........................................................493Aplety obsługiwane przy użyciu Java Plug-In: Prosty przypadek .........................493Atrybuty znacznika jsp:plugin................................................................................494Parametry określane w kodzie HTML: jsp:param..................................................494Tekst alternatywny .................................................................................................495
Wykorzystanie komponentów JavaBeans w dokumentach JSP...................................495Podstawowe wymagania jakie należy spełnić,aby klasa mogła być uznana za komponent .........................................................495
Podstawowe sposoby użycia komponentów ..........................................................496Kojarzenie właściwości z parametrami przesłanymi w żądaniu ............................496Wspólne wykorzystywanie komponentów: atrybut scopeznacznika akcji jsp:useBean ................................................................................496
Warunkowe tworzenie komponentów....................................................................497Tworzenie bibliotek znaczników..................................................................................497
Klasa obsługi znacznika .........................................................................................497Plik deskryptora biblioteki znaczników .................................................................497Plik JSP...................................................................................................................498Przypisywanie atrybutów znacznikom...................................................................498Dołączanie zawartości znacznika ...........................................................................498Opcjonalne dołączanie zawartości znacznika ........................................................498Przetwarzanie zawartości znacznika ......................................................................498Wielokrotne dołączanie lub przetwarzanie zawartości znacznika .........................499Stosowanie zagnieżdżonych znaczników...............................................................499
Integracja serwletów i dokumentów JSP......................................................................499Opis ogólny ............................................................................................................499Składnia służąca do przekazania żądania ...............................................................499Przekazywanie żądań do zwykłych dokumentów HTML......................................500Tworzenie globalnie dostępnych komponentów JavaBeans ..................................500Tworzenie komponentów JavaBeans dostępnych w sesji ......................................500Interpretacja względnych adresów URL na stronie docelowej ..............................500Alternatywne sposoby pobierania obiektu RequestDispatcher(wyłącznie Java Servlet 2.2) ................................................................................501
Dołączenie danych statycznych lub dynamicznych ...............................................501Przekazywanie żądań ze stron JSP.........................................................................501
Stosowanie formularzy HTML.....................................................................................501Element FORM ......................................................................................................501Pola tekstowe..........................................................................................................501Pola hasła................................................................................................................502Obszary tekstowe ...................................................................................................502Przyciski SUBMIT .................................................................................................502Alternatywna postać przycisków SUBMIT ...........................................................502Przyciski RESET....................................................................................................503Alternatywna postać przycisków RESET ..............................................................503Przyciski JavaScript ...............................................................................................503Alternatywna postać przycisków JavaScript ..........................................................503Pola wyboru............................................................................................................504Przyciski opcji ........................................................................................................504Listy rozwijane .......................................................................................................504
Spis treści 11
Elementy kontrolne umożliwiające przesyłanie plików na serwer ........................504Mapy odnośników obsługiwane na serwerze .........................................................505Pola ukryte..............................................................................................................505Możliwości dostępne w przeglądarce Internet Explorer ........................................505
Wykorzystanie apletów jako interfejsu użytkownika dla serwletów ...........................505Przesyłanie danych metodą GET i wyświetlanie strony wynikowej......................505Przesyłanie danych metodą GET i bezpośrednie przetwarzanie wyników(tunelowanie HTTP) ............................................................................................506
Przesyłanie serializowanych danych — kod apletu ...............................................507Przesyłanie serializowanych danych — kod serwletu............................................507Przesyłanie danych metodą POST i bezpośrednie przetwarzanie wyników(tunelowanie HTTP) ............................................................................................508
Pomijanie serwera HTTP .......................................................................................510JDBC i zarządzanie pulami połączeń z bazami danych ...............................................510
Podstawowe etapy wykorzystania JDBC ...............................................................510Narzędzia obsługi baz danych ................................................................................511Przygotowane polecenia (prekompilowane zapytania) ..........................................512Etapy implementacji puli połączeń ........................................................................512
Skorowidz ........................................................................................................515
Rozdział 9.
W niniejszym rozdziale przedstawiono sposób, w jaki można wykorzystać mechani-
zmy śledzenia sesji dostępne w serwletach w celu przechowywania informacji o użyt-
kownikach poruszających się po witrynie WWW.
Potrzeba ledzenia sesji
HTTP jest protokołem „bezstanowym” — oznacza to, że za każdym razem, gdy prze-
glądarka pobiera stronę WWW, tworzone jest niezależne połączenie z serwerem.
Serwer nie przechowuje automatycznie żadnych kontekstowych informacji skojarzo-
nych z przeglądarką, która to połączenie nawiązała. Nawet w przypadku serwerów,
które wykorzystują trwałe połączenia HTTP i za pomocą jednego połączenia obsłu-
gują wiele żądań zgłaszanych w niewielkich odstępach czasu, nie ma żadnych wbu-
dowanych mechanizmów ułatwiających przechowywanie takich kontekstowych in-
formacji. Brak takiego mechanizmu może powodować liczne problemy. Szczególnie
widoczne są one w przypadku sklepów internetowych, gdzie istnieje oczywista po-
trzeba śledzenia sesji użytkownika.
Znane są trzy podstawowe sposoby rozwiązywania problemów tego typu — cookies,
przepisywanie adresów URL oraz zastosowanie ukrytych pól formularzy.
Cookies
Istnieje możliwość wykorzystywania cookies w celu przechowywania informacji
o sesji w sklepie internetowym, a każde kolejne połączenie z tym sklepem może po-
wodować odszukanie danej sesji i pobranie przechowywanych na serwerze informacji
o niej. Na przykład, utworzony w tym celu serwlet mógłby przeprowadzać następują-
ce czynności:
��������������� ���������������������������������������������������������������������������������������������� ��� �����!"���#�������
194 Część I ���� Serwlety 2.1 i 2.2
���������������$% �������&����������'�������������������'�����(�)���*+�"(&�����������'����$�,����(-(���%��$���'���������������
Dzięki temu podczas obsługi kolejnych żądań, na podstawie wartości cookie �����������,
serwer może pobierać z tablicy ��� ����� tablicę asocjacyjną ��������� zawie-
rającą informacje o konkretnej sesji. Jest to bardzo dobre rozwiązanie, które często
jest wykorzystywane przy obsłudze sesji. Niemniej jednak wciąż istnieje potrzeba po-
siadania narzędzi programistycznych wyższego poziomu, które pozwoliłyby na im-
plementację bardziej wyrafinowanych rozwiązań. Choć serwlety dysponują łatwymi
w obsłudze narzędziami wysokiego poziomu przeznaczonymi do obsługi cookies
(opisano je w rozdziale 8.), wciąż jednak istnieje stosunkowo dużo drobnych czynno-
ści, które należy przeprowadzić samodzielnie. Do czynności tych można zaliczyć:
���� pobieranie cookie przechowującego identyfikator sesji (możliwe jest nadesłanie
kilku cookies z jednej przeglądarki);
���� określenie odpowiedniego czasu wygaśnięcia ważności cookie (sesje, które są
nieaktywne przez ponad 24 godziny prawdopodobnie powinny zostać zamknięte);
���� skojarzenie tablic asocjacyjnych z każdym żądaniem;
���� generowanie unikalnego identyfikatora sesji.
Należy podkreślić, że ze względu na doskonale znane i oczywiste zagrożenia prywat-
ności, jakie wiążą się z wykorzystywaniem cookies (patrz podrozdział rozdziału 8.
„Niektóre problemy związane ze stosowaniem cookies”), niektórzy użytkownicy wy-
łączają ich obsługę. Wynika z tego potrzeba posiadania, oprócz protokołu wysokiego
poziomu, także alternatywnego rozwiązania tego problemu.
Przepisywanie adresów URL
Rozwiązanie to polega na dopisywaniu na końcu adresu URL pewnych dodatkowych,
identyfikujących sesję danych, które pozwalają serwerowi na skojarzenie przekazane-
go identyfikatora z przechowywanymi informacjami dotyczącymi danej sesji. Na
przykład, w adresie URL http://komputer/katalog/plik.html;sessionid=1234 dołączone
informacje o sesji mają postać sessionid=1234. Rozwiązanie to jest bardzo funkcjo-
nalne, a przy tym posiada tę dodatkową zaletę, że można z niego korzystać nawet
w przypadku przeglądarek nie obsługujących cookies oraz wtedy, gdy użytkownik
wyłączył obsługę cookies. Jednak także i to rozwiązanie zmusza program działający
na serwerze do wykonywania wielu prostych, lecz uciążliwych czynności. Poza tym
należy zwracać szczególną uwagę, aby każdy adres URL odwołujący się do danej
witryny i przekazywany do przeglądarki użytkownika (nawet w sposób niejawny,
przykładowo, za pomocą nagłówka �� ����), został uzupełniony do dodatkowe in-
formacje. Inną niedogodnością rozwiązania polegającego na przepisywaniu adresów
URL jest fakt, że w po zakończeniu sesji i późniejszym nawiązania kolejnej sesji na
danej witrynie za pomocą zapamiętanego adresu lub połączenia, wszystkie dotyczące
jej informacje są tracone.
Rozdział 9. ���� Śledzenie sesji 195
Ukryte pola formularzy
W formularzach HTML można umieszczać pola o następującej postaci:
.�+,� � /,)�(��"")+(�+01)�(��(�203�)�($$$(4
Wykorzystanie takiego elementu oznacza, że podczas przesyłania formularza podana
nazwa elementu oraz jego wartość są dołączane do pozostałych informacji przekazy-
wanych na serwer. Więcej informacji na temat ukrytych pól formularzy znajduje się
w podrozdziale rozdziału 16. „Pola ukryte”. W takich ukrytych polach formularzy można
przechowywać informacje na temat sesji. Jednak wykorzystywanie tej metody ma
jedną podstawową wadę — każda strona witryny musi być generowana dynamicznie.
�ledzenie sesji w serwletach
Serwlety udostępniają bardzo dobre rozwiązanie problemu śledzenia sesji — interfejs
�����������. Możliwości funkcjonalne tego interfejsu bazują na wykorzystywaniu
cookies lub przepisywania adresów URL. W rzeczywistości większość serwerów wy-
korzystuje cookies, pod warunkiem, że są one obsługiwane przez przeglądarkę użyt-
kownika. Jeśli przeglądarka nie obsługuje cookies lub gdy ich obsługa została jawnie
wyłączona, często automatycznie stosowane jest przepisywanie adresów URL. W ten
sposób autorzy serwletów nie muszą jawnie obsługiwać cookies ani informacji dołą-
czanych do adresów URL, a zyskują bardzo wygodny sposób przechowywania do-
wolnych obiektów skojarzonych z każdą sesją.
Narz�dzia programistycznedo ledzenia sesji
Wykorzystanie śledzenia sesji w serwletach jest bardzo proste i wiąże się z pobiera-
niem obiektu sesji skojarzonego z obsługiwanym żądaniem, w razie konieczności
z tworzeniem nowego obiektu sesji, pobieraniem informacji skojarzonych z sesją, za-
pisywaniem informacji w obiekcie sesji oraz z usuwaniem przerwanych lub zakoń-
czonych sesji. Dodatkowo, jeśli do użytkownika przekazywane są jakiekolwiek adre-
sy URL odwołujące się do danej witryny i jeśli jest stosowane przepisywanie adresów
URL, to do każdego adresu URL należy dołączać informacje o sesji.
Pobieranie obiektu HttpSession skojarzonegoz bie"#cym "#daniem
Obiekt ����������� można pobierać za pomocą metody ���������� interfejsu �����
��������������. System pobiera identyfikator użytkownika z cookie lub z informacji
dołączonych do adresu URL w niewidoczny sposób, a następnie używa go jako klucza
przy pobieraniu odpowiedniego elementu z tablicy utworzonych wcześniej obiektów
196 Część I ���� Serwlety 2.1 i 2.2
�����������. Wszystkie te czynności są wykonywane w sposób niezauważalny dla
programisty, który jedynie wywołuje metodę ����������. Jeśli wywołanie tej metody
zwraca wartość ����, oznacza to, że z danym użytkownikiem jeszcze nie skojarzono
żadnej sesji, a zatem można ją utworzyć. Sesje są tworzone bardzo często, zatem do-
stępna jest specjalna opcja pozwalająca na utworzenie nowej sesji, jeśli sesja dla da-
nego użytkownika jeszcze nie istnieje. W tym celu wystarczy przekazać wartość ����
w wywołaniu metody ����������. A zatem, pierwszy krok przy rozpoczynaniu sesji
zazwyczaj wygląda w następujący sposób:
���%�����������5 �$��������� ��
Sprawdzenie, czy dana sesja istniała już wcześniej, lub czy też została właśnie utwo-rzona, jest możliwe za pomocą metody �����.
Pobieranie informacji skojarzonych z sesj#
Obiekty ����������� są przechowywane na serwerze. Są one automatycznie kojarzo-ne z żądaniami podczas wykorzystywania niewidocznych mechanizmów, takich jakcookies lub przepisywanie adresów URL. Obiekty te posiadają wbudowaną strukturędanych, która umożliwia im przechowywanie dowolnej liczby kluczy oraz skojarzo-nych z nimi wartości. W specyfikacjach Java Servlet 2.1 oraz wcześniejszych do po-brania wartości uprzednio zapisanej w sesji stosuje się wywołanie ������� ���!���"��#�$��%����&. Metoda ���!��� zwraca obiekt typu ��� �, a zatem przywróce-nie oryginalnego typu danej zapisanej w sesji jest możliwe poprzez zastosowanie od-powiedniego rzutowania typów. Metoda zwraca wartość ����, jeśli nie ma atrybutuo podanej nazwie. Oznacza to, że przed wywołaniem jakichkolwiek metod obiektuskojarzonego z sesją należy sprawdzić, czy nie jest to wartość ����.
W specyfikacji Java Servlet 2.2 metoda ���!��� została uznana za przestarzałą i za-stąpiono ją metodą ���$�������. Nazwa tej metody lepiej odpowiada metodzie���$������� (w specyfikacji 2.1 metodzie ���!��� odpowiadała metoda ���!���,a nie ���!���). W przykładach przedstawionych w niniejszej książce zastosowanometodę ���!���, gdyż nie wszystkie dostępne na rynku komercyjne mechanizmy ob-sługi serwletów są zgodne ze specyfikacją 2.2.
Poniżej podano przykład wykorzystania mechanizmu śledzenia sesji. Założono, że�'������(�� jest klasą zdefiniowaną w celu przechowywania informacji o zamawia-nych produktach (implementację tej klasy zamieszczono w podrozdziale „Internetowysklep wykorzystujący koszyki i śledzenie sesji”).
���%�����������5 �$��������� �����%%���'����������������%%���'������$��2�� �(��%%���'���(���������������� ����6�--���������#�����������������������������%%���'����������$% �2�� �(��%%���'���(&�������7����'�!8�����#��������
W większości przypadków nazwa atrybutu jest znana, a celem działania jest pobraniewartości skojarzonej z tą nazwą. Istnieje także możliwość pobrania nazw wszystkichatrybutów skojarzonych z daną sesją — służy do tego metoda ���!����)�� zwracająca
Rozdział 9. ���� Śledzenie sesji 197
tablicę łańcuchów znaków. Ta metoda jest jedynym sposobem określenia nazw atry-butów w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze spe-cyfikacją Java Servlet 2.1. W przypadku mechanizmów zgodnych ze specyfikacją 2.2nazwy atrybutów można pobierać za pomocą metody ���$��������)��. Metoda tadziała w bardziej spójny sposób, gdyż zwraca obiekt ���)������, podobnie jak me-tody �����*���)�� oraz ���+�)�����)�� interfejsu ������������������.
Najczęściej wykorzystywanymi danymi są dane bezpośrednio skojarzone z sesją,
niemniej jednak dostępne są także inne, użyteczne informacje dotyczące sesji. Poniżej
przedstawiono metody interfejsu �����������:
public Object getValue(String nazwa)public Object getAttribute(String nazwa)
Metody te pobierają z obiektu sesji wartość, która uprzednio została w nim
zapisana. Obydwie metody zwracają wartość ����, jeśli z podaną nazwą nie jest
skojarzona żadna wartość. W mechanizmach obsługi serwletów zgodnych ze
specyfikacją Java Servlet 2.1 należy używać metody ���!���. W mechanizmach
zgodnych ze specyfikacją 2.2 można używać obydwu metod, jednak zalecane
jest stosowanie metody ���$�������, gdyż metoda ���!��� została uznana
za przestarzałą.
public void putValue(String nazwa, Object warto�ć)public void setAttribute(String nazwa, Object warto�ć)
Te metody kojarzą wartość atrybutu z jego nazwą. W mechanizmach obsługi
serwletów zgodnych ze specyfikacją Java Servlet 2.1 należy używać metody
���!���, natomiast w mechanizmach zgodnych ze specyfikacją 2.2 można
stosować obydwie metody (rekomendowana jest metoda ���$�������, gdyż
metoda ���!��� została uznana za przestarzałą). Jeśli obiekt przekazany
w wywołaniu metody ���!��� lub ���$������� implementuje interfejs
�����������,��*�����������, to po zapisaniu tego obiektu w sesji jest
wywoływana jego metoda ����,���*. Podobnie, jeśli obiekt implementuje
interfejs �����������,��*�����������, po jego usunięciu z sesji jest wywoływana
metoda ����-����* tego obiektu.
public void removeValue(String nazwa)public void removeAttribute(String nazwa)
Obydwie te metody powodują usunięcie wartości skojarzonych z podaną nazwą.
Jeśli usuwana wartość implementuje interfejs �����������,��*�����������,
wywoływana jest jej metoda ����-����*. W mechanizmach obsługi serwletów
zgodnych ze specyfikacją Java Servlet 2.1 należy używać metody ��)���!���.
W mechanizmach zgodnych ze specyfikacją 2.2 preferowane jest użycie
metody ��)���$�������, choć w celu zapewnienia zgodności z poprzednimi
wersjami oprogramowania można także używać metody ��)���!��� (uznawanej
za przestarzałą).
198 Część I ���� Serwlety 2.1 i 2.2
public String[] getValueNames()public Enumeration getAttributeNames()
Te metody zwracają nazwy wszystkich atrybutów w danej sesji. W przypadku
mechanizmów obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1
należy używać metody ���!����)��. W przypadku mechanizmów zgodnych
ze specyfikacją 2.2 metoda ta jest wciąż dostępna, lecz uznana za przestarzałą
i z tego względu należy stosować metodę ���$��������)��.
public String getId()
Jest to metoda zwracająca unikalny identyfikator generowany dla każdej z sesji.
Identyfikator ten jest czasami używany jako nazwa klucza. Dotyczy to sytuacji,
gdy z sesją jest skojarzona tylko jedna wartość lub gdy informacje o sesji
są rejestrowane.
public boolean isNew()
Jest to metoda zwracająca wartość ����, jeśli klient jeszcze nigdy nie korzystał
z sesji (zazwyczaj dlatego, że sesja została właśnie utworzona, a odbierane
żądania jeszcze się do niej nie odwoływały). Jeśli dana sesja już istnieje
od jakiegoś czasu, metoda ta zwraca wartość ����.
public long getCreationTime()
Ta metoda zwraca czas utworzenia sesji wyrażony jako liczba milisekund,
jakie upłynęły od początku 1970 roku (GMT). Aby przekształcić tę wartość
do powszechnie stosowanej formy, należy przekazać ją do konstruktora klasy
��� lub posłużyć się metodą ���.�)���/���� klasy ��������(���*�.
public long getLastAccessTime()
Metoda ta zwraca czas ostatniego przesłania sesji z przeglądarki na serwer.
Czas ten jest wyrażony jako liczba milisekund, jakie upłynęły od początku
1970 roku (GMT).
public int getMaxInactiveInterval()public void setMaxInactiveInterval(int ilo�ćSekund)
Pierwsza z tych metod pobiera, a druga określa czas (wyrażony w sekundach),
w którym klient musi nadesłać żądanie, aby sesja nie została automatycznie
unieważniona. Jeśli w wywołaniu metody ���/0�� ����������� jest podana
wartość mniejsza od zera, dana sesja nigdy nie zostanie automatycznie
unieważniona. Należy pamiętać, iż limit czasu oczekiwania sesji jest
przechowywany na serwerze i nie odpowiada dacie wygaśnięcia ważności
cookies, która jest przesyłana do przeglądarki.
public void invalidate()
Wywołanie tej metody powoduje unieważnienie sesji i usunięcie z niej
wszystkich skojarzonych z nią obiektów.
Rozdział 9. ���� Śledzenie sesji 199
Kojarzenie informacji z sesj#
Zgodnie z tym, co podano w poprzednim podrozdziale, informacje skojarzone z sesją
można odczytywać za pomocą metody ���!��� (stosowanej w mechanizmach obsłu-
gi serwletów zgodnych ze specyfikacją Java Servlet 2.1) oraz ���$������� (stosowa-
nej w mechanizmach obsługi serwletów zgodnych ze specyfikacją 2.2). Aby podać te
informacje w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze
specyfikacją 2.1, należy posłużyć się metodą ���!���, podając w jej wywołaniu
klucz oraz wartość. W przypadku wykorzystywania mechanizmów zgodnych ze spe-
cyfikacją Java Servlet 2.2, należy zastosować metodę ���$�������. Nazwa tej meto-
dy jest bardziej spójna z ogólnie stosowanym nazewnictwem, gdyż występują tu no-
tacje ���1��� stosowane w komponentach JavaBeans. Aby wartości przechowywane
w sesji mogły dawać jakieś efekty w chwili ich zapisywania w sesji, używane obiekty
muszą implementować interfejs �����������,��*�����������. Dzięki temu za każ-
dym razem, gdy za pomocą metody ���!��� lub ���$������� nastąpi skojarzenie
jakiegoś obiektu z sesją, zostanie wywołana jego metoda ����,���*.
Trzeba pamiętać, że metody ���!��� oraz ���$������� zastępują wszelkie wartości
skojarzone z podaną nazwą. Jeśli trzeba usunąć tę wartość bez podawania zamiennika,
należy posłużyć się metodą ��)���!��� (w przypadku korzystania z mechanizmów
obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1) lub ��)���$�������
(w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze specyfika-
cją 2.2). Jeśli usuwane obiekty implementują interfejs �����������,��*�����������,
wywołanie którejkolwiek z tych metod spowoduje wywołanie metody ����-����*
usuwanego obiektu. Czasami zachodzi potrzeba jedynie zastąpienia istniejącej warto-
ści atrybutu. W takim przypadku można zastosować metodę przedstawioną w drugim
wierszu poniższego przykładu (określającego wartość atrybutu ����������+���). Je-
żeli należy pobrać aktualną wartość atrybutu i zmodyfikować ją można posłużyć się
przedstawionym w poniższym przykładzie sposobem (operacje wykonywane na atry-
bucie ������������)�). Założono, że w poniższym przykładzie wykorzystywane są
dwie klasy — klasa �'������(�� dysponująca metodą **���), obiekty której służą
do przechowywania informacji o wybranych produktach, oraz klasa (���� udostęp-
niająca statyczną metodę ������) zwracającą produkt na podstawie podanego identy-
fikatora. Implementacje tych klas zamieszczono w podrozdziale „Internetowy sklep
wykorzystujący koszyki i śledzenie sesji”.
���%�����������5 �$��������� ���������������� ��� ���������� ��������������� ������ � �������%%���'�������������������%%���'�������$��2�� �(%�9�� ��#(���������������� ����6�--���������#�������:����������������������������%%���'����������$% �2�� �(%�9�� ��#(&��������7���������,��� �� ����5 �$��,���#���(��#�"(��������,��� �� �;��� ����6�������$�����#�'������$����#���,��� �� ���7
200 Część I ���� Serwlety 2.1 i 2.2
Ko%czenie sesji
Sesja automatycznie staje się nieaktywna, jeśli odstęp pomiędzy kolejnymi żądaniami
przekroczy czas określony przez metodę ���/0�� �����������. W tym momencie
automatycznie są usuwane wszelkie skojarzenia obiektów z tą sesją. To z kolei sprawia,
że obiekty implementujące interfejs �����������,��*����������� są zawiadomiane
o fakcie usunięcia ich z sesji.
Istnieje również sposób jawnego kończenia sesji — służy do tego metoda �����*��.
Przepisywanie adresów URLprzesyłanych do przegl#darki
Jeśli przy śledzeniu sesji wykorzystywana jest metoda przepisywania adresów URL
i jeśli do przeglądarki przesyłane są adresy URL odwołujące się do danej witryny,
konieczne jest jawne dodawanie do nich informacje o sesji. Wspomniano, że serwlety
mogą automatycznie stosować metodę przepisywania adresów URL, jeśli przeglądar-
ka nie obsługuje cookies. Dlatego też należy zawsze kodować wszystkie adresy URL
odwołujące się do witryny. Adresy URL odwołujące się do tej samej witryny mogą
być stosowane w dwóch przypadkach. Pierwszym z nich są strony WWW generowa-
ne przez serwlety. Adresy umieszczane na takich stronach powinny być odpowiednio
zakodowane za pomocą metody �� �*�-�� interfejsu �������������������. Metoda ta
automatycznie stwierdza, czy przepisywanie adresów jest aktualnie wykorzystywane
i w razie konieczności dopisuje do adresu informacje o sesji. W przeciwnym razie
metoda zwraca adresu URL w oryginalnej postaci.
Oto przykład:
������������������<3��������<3=�������3 �>���������������������������<3����%��$�����<3������������<3��� �$%�������(.0��<)?�@((�A������������<3�A�(@(4$$$.-04��
Drugim przypadkiem, gdzie podaje się adresy URL odwołujące się do tej samej wi-
tryny, jest wywołanie metody ���*��*��� � (oznacza to, że adresy te są umieszczane
w nagłówku odpowiedzi �� ����). W tym przypadku obowiązują inne sposoby okre-
ślania, czy do adresu należy dodać informacje o sesji czy nie, a zatem nie można po-
służyć się metodą �� �*�-��. Interfejs ������������������� udostępnia metodę �� �*��
��*��� �-��, którą można zastosować w takich sytuacjach. Oto przykład zastosowania
tej metody:
������������������<3��������<3��--�%����������B$B�%���������� :��������������������������������������--�����C���������D���<3������������������<3����%��$����<������<3������������<3���%��$��<�����������������<3��
Często się zdarza, że w chwili tworzenia serwletu nie można przewidzieć, czy w przy-
szłości stanie się on częścią grupy strony wykorzystujących śledzenie sesji. Warto
zatem uwzględnić taką możliwość i zapewnić kodowanie w serwlecie wszystkich ad-
resów URL odwołujących się do tej samej witryny.
Rozdział 9. ���� Śledzenie sesji 201
Wskazane jest, aby wszystkie adresy URL odwołuj�ce si� do tej samej witrynyprzekształcać za pomoc� metod �%��$�����<3 lub �%��$����<������<3,niezale�nie od tego, czy serwlet wykorzystuje mechanizmy "ledzenia sesji.
Serwlet generuj�cyindywidualny licznik odwiedzindla ka�dego u�ytkownika
Listing 9.1 przedstawia prosty serwlet wyświetlający podstawowe informacje doty-
czące sesji. Po nawiązaniu połączenia serwlet pobiera istniejącą sesję lub, jeśli sesji
jeszcze nie ma, tworzy ją. Obydwie te czynności realizowane są za pomocą jednego
wywołania — ������� ����������"����&. Następnie serwlet sprawdza, czy w sesji
zapisano atrybut typu ������� o nazwie „ ���(����2. Jeśli atrybut ten nie jest od-
naleziony, zakłada się, że liczba wcześniejszych odwiedzin danej strony wynosi 3. Je-
śli atrybut ���(���� zostanie odnaleziony, serwlet pobiera jego wartość. Wartość
ta jest następnie inkrementowana i ponownie kojarzona z sesją poprzez wywołanie
metody ���!���. Następnie serwlet generuje niewielką tabelę HTML zawierającą in-
formacje o sesji. Rysunek 9.1 przedstawia stronę wygenerowaną przez serwlet pod-
czas pierwszej wizyty użytkownika na witrynie, a rysunek 9.2 — po jej kilkukrotnym
odświeżeniu.
Listing 9.1. ShowSession.java
%����������9���
�#%������9�$��$E��#%������9�F$�9��$E��#%������9�F$�9��$���%$E��#%������9�$��$E��#%������9�$ ���$E�
-EE�,�����%����G���H���������$�>�������E�������������#�%����G��#�����#%�#������������D��E�����%%���'���$��9�$�E-
% ������������������F�������%��9���6��% �����9������������%��9��<5 ���5 �&�����������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6�����%��$�'����� �%�(�F�-��#�����������*IJJKLIB(������,����M������ �����%��$��M�������������������������(,����G���H���������(��������������������������� ������������������� ���������� ����������������� �!�"�#����$"�#���%�&������ '��('�$����)#��$�����#)��*�#�+����� �,�-���� -���.�.�$�"�����"����)�����������/)������'�0
202 Część I ���� Serwlety 2.1 i 2.2
����� �"����1����2�� �%��������� �����3����� ��##���4�������������3����� ������������������##���4����������������##���4������������5�������##���4���������'�3����� �6�������������������!���")����')�*���#��������7�����5�����������������!���")�����'������������##���4���������'�3����� ��##���4��������������8�9������7����� �!�"�#����$"�#���%�&������ '��('�$����)#��$�����#)��*�#�+����� �,�-���� -���.�.�$�"�����"����)�����������/)������'�0����� �"����1����2�� �%��������� ����������������������##���4��������##���4������
����� �$%���������9���������$���M��� ����������A����������������(.>*"/�>�'*3*<�@(N?"?K)O@(4@�(�A����������������(.�P�03��+�@(')+ )<@(4(�A��������A�(.-�P4@�(�A����������������(.�B4�����#������ �������Q.-�B4@�(�A����������������(. 0>3)�>*<")<�P�03��+�@(')+ )<@(4@�(�A����������������(. <�>�'*3*<�@(N??0"RR@(4@�(�A����������������(��. �4 �%. �4M����HS@�(�A����������������(. <4@�(�A����������������(��. "4�"@�(�A����������������(��. "4(�A������������3����A�(@�(�A����������������(. <4@�(�A����������������(��. "4'��� ��������@�(�A����������������(��. "4(�A�������������������"��������������4 ������:�"�����A�(@�(�A����������������(. <4@�(�A����������������(��. "4'���������������C% @�(�A����������������(��. "4(�A�������������������"��������������;���2##�����:�"�����A�(@�(�A����������������(. <4@�(�A����������������(��. "4���HS���������@�(�A����������������(��. "4(�A��##���4�����A�(@�(�A����������������(.- 0>3)4@�(�A����������������(.->*"/4.-� 134(��
��7
��-EE�TU�������) ���,*� �#��U���S���G ��������������$�E-
��% �����9������,������%��9��<5 ���5 �&������������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6����������5 �&��%������77
Rozdział 9. ���� Śledzenie sesji 203
Rysunek 9.1.Strona wygenerowanapo pierwszymwykonaniu serwletuShowSession
Rysunek 9.2.Strona wygenerowanapo jedenastymwykonaniu serwletuShowSession
Internetowy sklepwykorzystuj�cy koszykii ledzenie sesji
W tym podrozdziale przedstawiono rozbudowany przykład opisujący sposób tworze-nia internetowego sklepu wykorzystującego mechanizmy śledzenia sesji. W pierwszejczęści podrozdziału przedstawiono sposób tworzenia stron wyświetlających informa-cje o sprzedawanych produktach. Kod każdej ze stron prezentujących sprzedawaneprodukty zawiera wyłącznie tytuł strony oraz identyfikatory produktów, jakie mają sięna niej pojawić. Sam kod HTML każdej z tych stron jest generowany automatycznieprzez metody klasy bazowej na podstawie opisów produktów przechowywanychw katalogu. W drugiej części podrozdziału opisano stronę obsługującą zamawianieproduktów. Strona ta kojarzy każdego z użytkowników z koszykiem i pozwala użyt-kownikowi na zmodyfikowanie liczby każdego z zamówionych produktów. W celu pra-widłowego kojarzenia użytkowników z koszykami strona ta wykorzystuje mechanizmy
204 Część I ���� Serwlety 2.1 i 2.2
śledzenia sesji. W trzeciej części niniejszego podrozdziału przedstawiono implemen-tację koszyka — struktury danych reprezentującej poszczególne produkty oraz za-mówienia — oraz katalogu produktów.
Tworzenie interfejsu u"ytkownika
Listing 9.2 przedstawia abstrakcyjną klasę bazową używaną podczas tworzenia serw-
letów, które mają prezentować sprzedawane produkty. Serwlet ten pobiera identyfi-
katory produktów, odszukuje je w katalogu, a następnie pobiera z niego nazwy i ceny
produktów i wyświetla je na stronie umożliwiającej zamawianie. Listingi 9.3 oraz 9.4
przedstawiają łatwy sposób tworzenia stron zawierających informacje o produktach za
pomocą klasy bazowej z listingu 9.2. Wygląd stron zdefiniowanych na listingach 9.3
oraz 9.4 został przedstawiony na rysunkach 9.3 oraz 9.4.
Listing 9.2. CatalogPage.java
%����������9���
�#%������9�$��$E��#%������9�F$�9��$E��#%������9�F$�9��$���%$E��#%������9�$ ���$E�
-EE�8����������������%���� �U�����%��� ������������� $�E�����������������U��%������������������# �U�E�����H��S���H��������#����������� ��������� G�E��������.�4����#.-�4���������������������$�E��M���#��� ���#���������������������� ����:��E������G�S�#��������#������� ���������������$�E-
% �����������������'������,���F�������%��9���6��%��9�����#VW���#���%��9���������VW���#�"���%��9���������������
��-EE�"�%�� �U��������U�������������D��%��� ��D����� ������E������������� ��'������������%�����%�������U���#���E�����������#��������������#$�*��������#��������U���E����D�����%�&�%G����%���������C�%��� �� &���������E�� �������#��� ��#�����������������%��� �� $���E��.,4���E�����������������U��%�������'������,�����E��.�4# �U.-�4�����G���S��C�#���C��������������E����#����������������#�����������������G���$���E-
%�������9�������#�������VW���#�"��6�������$��#�"�����#�"�������#��������#V��#�"$�����W���������������R���.��#$��������AA��6��������#V�W���'������$����#���#�"V�W������7��7
Rozdział 9. ���� Śledzenie sesji 205
-EE�*��H������ G������&���D��������H�������������E����������������������GD�� �.�P4$���E��.,4���E�����������������U��%�������'������,�����E��.�4# �U.-�4�����G���S��C�#���C��������������E����#����������������#�����������������G���$���E-
��%�������9����� �����������������6�������$��������������7
��-EE�1�������%������������H�����H��������� G&������C%�����E��������:����%��� �� ���������� &���D���#����S�%�������������E���������������&���H������������D�����%��������GD�� ���E��.�B4�&���C�������������������%G����%��%���:�$���E��,���:���%� ���:����%��� �� ���H�����������%������� #�:������U�����E���G�:�����#D������������U����������%��� �� �I������#������E��%���G���U�������� �*���,��$���E��.,4���E��0����������S������ 13����������%�����C�#���C&����:����E��������S������8��>���,���� �� ��>���,�������������E�����������������U�%�������������������'������,������E���������S��%��C�(M�H���������X�D�G���(��� �������%�����������E����%����U����$���E-
��% �����9������������%��9��<5 ���5 �&�����������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6�����%��$�'����� �%�(�F�-��#�����������*IJJKLIB(������������#����� ����6�������%��$��)������%��$�'=+* =?*�+"&�������������������������(>����%��� ��D�$(���������� �������7����,����M������ �����%��$��M������������ �$%���������9���������$���M��� ����������A����������������(.>*"/�>�'*3*<�@(N?"?K)O@(4@�(�A����������������(.�P�03��+�@(')+ )<@(4(�A������A�(.-�P4(��������#���#���������������R���.��#$��������AA��6������� �$%�������(.�<4(����������#�����#V�W�������--�M�H����������#�������GC���&��H��������%���#��������--�%���G���������������%��� �� &���D�������#����������� ������������#����� ����6��������� �$%�������(.?*+ �'*3*<�@(<)"@(4(�A��������������������(+��������������������%��� �� (�A���#�"V�W�A��������������������(.-?*+ 4(��������7���6��������� �$%���������������������������#�<3������������(-�9��-����9��$*���,��(���������--�0�����<3�����G �U���C��������#�������������:���������--�%������G��S����%�#��U�#����������<3$���������� "<�;��� ����������#���<�;��� "<�;����������� �$%������
206 Część I ���� Serwlety 2.1 i 2.2
�����������(.?*<1�0' �*+�@((�A��� "<�;�A�(@(4@�(�A�����������(.�+,� � /,)�@(��"")+@(�+01)�@(��#�"@(�(�A�����������(�������203�)�@((�A���#$����#�"���A�(@(4@�(�A�����������(.�B4(�A���#$�������"���%�������A�����������(��Y(�A���#$��'�����A�(�.-�B4@�(�A�������������#$��3���"���%�������A�(@�(�A�����������(.,4@�.')+ )<4@�(�A�����������(.�+,� � /,)�@(��>1� @(�(�A�����������(203�)�@("��������������@(4@�(�A�����������(.-')+ )<4@�.,4@�.-?*<14(��7����7����� �$%�������(.�<4@�.->*"/4.-� 134(����7
��-EE�TU������,*� ����) �#��U���S���G �����������#�$�E-
��% �����9������,������%��9��<5 ���5 �&������������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6����������5 �&��%������77
Listing 9.3. KidsBooksPage.java
%����������9���
-EE�8����%���#������� �'������,�����H������U���E������C�MMM� #�:������U�U���#D�������������������E��������U:�����������$�E��!�#D������U�%���G���������� �*���,��$�E-
% ���������8��>���,���F����'������,���6��% �����9�����������6����������VW������6�(���RRP(&�(��F����RRP(&�(�������RRP(�7��������#���������� ����(M��U:�����%����U:�������������������(����77
Listing 9.4. TechBooksPage.java
%����������9���
-EE�8����%���#������� �'������,�����H������U���E������C�MMM� #�:������U�U���#D�������D���E��������G������U:����#% �������$�E��!�#D������U�%���G���������� �*���,��$�E-
% ��������� ��>���,���F����'������,���6��% �����9�����������6����������VW������6�(����RRP(&�(����RRB(�7��������#�����
Rozdział 9. ���� Śledzenie sesji 207
����� ����(M��U:�����%����U:�����#% ����(����77
Rysunek 9.3.Wyniki
wykonania serwletu
KidsBooksPage
Obsługa zamówie%
Listing 9.5 przedstawia kod serwletu służącego do obsługi zamówień nadsyłanychprzez różne strony katalogowe (przedstawione w poprzedniej części podrozdziału).Serwlet ten kojarzy każdego użytkownika z koszykiem wykorzystując przy tym me-chanizmy śledzenia sesji. Ponieważ każdy użytkownik dysponuje osobnym koszy-kiem, jest mało prawdopodobne, że wiele wątków będzie jednocześnie próbowałouzyskać dostęp do tego samego koszyka. Niemniej jednak można wyobrazić sobiesytuację, w których mógłby nastąpić jednoczesny dostęp do tego samego koszyka.
208 Część I ���� Serwlety 2.1 i 2.2
Rysunek 9.4.Wynikiwykonania serwletuTechBooksPage
Zatem w celu zapewnienia wysokiego poziomu bezpieczeństwa kod serwletu syn-chronizuje dostęp do koszyków na podstawie obiektu sesji. W ten sposób inne wątkikorzystające z tej samej sesji nie będą mogły równocześnie uzyskiwać dostępu doprzechowywanych w niej informacji, choć wciąż będzie możliwa równoczesna obsłu-ga żądań nadsyłanych przez różnych użytkowników. Typowe wyniki wykonania tegoserwletu zostały przedstawione na rysunkach 9.5 oraz 9.6.
Listing 9.5. OrderPage.java
%����������9���
�#%������9�$��$E��#%������9�F$�9��$E��#%������9�F$�9��$���%$E��#%������9�$ ���$E��#%������9�$�F�$+ #��?��#���
-EE�M�H�����������#������%��� �����&���D����� �����E������� �U��C�������� �����%%���'����$�,����U������E��#��U������G����&����%���������D�����E�����H�������%������:��HS������D�$�ZH������E�����%���������������������� #�:������U���E���G��������#D��[&�����������������������$�E���:��������������������%�������U�����C�����C��������E��%���� �U�����%��� ���&���D��#�:�����#����S&�������
Rozdział 9. ���� Śledzenie sesji 209
�E���:����������������������#������������$�Z�����E�� :����������#��U���%�#�C��S������������������H�����S�E���U�%�G � �U���C����U� � ������������$�1��U����:�E����D��S������U�������U��%�������(0�� ���� ����#D����(�E��%���#��������������#%����������������#���������E��%��� ��D�$�E-
% ���������*���,���F�������%��9���6��% �����9������������%��9��<5 ���5 �&�����������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6�������%������������5 �$��������� ���������%%���'�����������������������������6������#� �������������4� ��������������������������4� �������������=����')#���/)�*�'��*('��'� $�����+���'��*��$)*�����������</)�*�'��#)��*�( $)���/��)������+�*��$)*�"�����������/)'��+��)#���*�( ��$����&)������#��'#$�>�������'� $���������������#� ���������5��������#� ������'���������4� ������������������������������������4� ����#� ���������7���������������#�"����5 �$��,���#���(��#�"(��������������#�"�;��� ����6���������������� #��#�������������������5 �$��,���#���(� #��#(��������������� #��#����������� ����6����������--�ZH�����:U���� �����G�%���������������������"��������������--����������&��������������&�:� :��������������G����������--�� ����������U��%�������("��������������(������������������--��������%���� �U���%��� ������������� $��������������$�����#���#�"����������7���6����������--�ZH�����:U���� �����G�%���������D��������������������������--���"��������������&��������������&�:� :������������������--������G��������C�������U��%�������(0�� ���� �����������--���#D����(�%���#��������������#%���������������������--�����#���������%��� ��D�$�+��:�����D��S� ���C&��:�%���������������--������H���R���������������#%��������#��������%��� �� ����������--�%����&�:������%��� ���������� ��C�����������$��������������� #��#���������������6������������� #��#��������$%������� #��#������������������7�������+ #��?��#��)F�%���������6������������� #��#���P�����������7��������������$�+ #*�������#�"&�� #��#����������7������7����7����--�,���:���� ���#D�����������:���������&����� :������������--����#���������G�������$�����%��$�'����� �%�(�F�-��#�����������*IJJKLIB(������,����M������ �����%��$��M�������������������������(���� ���#D�����(������ �$%���������9���������$���M��� ����������A
210 Część I ���� Serwlety 2.1 i 2.2
����������������(.>*"/�>�'*3*<�@(N?"?K)O@(4@�(�A����������������(.�P�03��+�@(')+ )<@(4(�A������A�(.-�P4(����������������������6������2�������#*�����������$����#*�������������������#*����$��������R��6��������� �$%�������(.�B4.�4>����%��� ��D��������� $$$.-�4.-�B4(��������7���6��������--�ZH���������� ����������#��������%��� ��&��������--���H���������C��������#����#������#$��������� �$%�����������������(. 0>3)�>*<")<�P�03��+�@(')+ )<@(4@�(�A�����������(. <�>�'*3*<�@(N??0"RR@(4@�(�A�����������(��. �4������������. �4*%�@�(�A�����������(��. �4'������������. �4���HS. �4M����HS(������������#*���������
��������--�!����U���#�������D���#����%��%������ &��������--�������#���������������� ���������� ���&����$��������--�������������������:U��#�� �������#���������#�$��������+ #��?��#������#����������������+ #��?��#��$��' ��������������
������������������#�<3������������(-�9��-����9��$*���,��(���������--�0�����<3�����G �U���C�������������#�����������������--�%������G��#��%���� :��� �#����������<3$���������� "<�;��� ����������#���<�;��� "<�;��
��������--�"�����:����%��� �� � #���������������� ��������--�������#��������������������U�����������������������--�%��� �� ���"�&��%�&�������C���������U&��������--������C���#D����������#%�����������GU���U���C$��������--�3����C���#�����������#%��������H�����#���������--���%�� �������#&��������� :���������#D�G��U��#���S$��������--�"��������&������%���&���H�����#��%��������������--�(0�� ���� ����#D����(&���D���%���� ��%�������������--�%��G��������#��������������&�%�������#��������--��#�������������������#�����������#%�������������--�������%��� �� $������������������R���.��#*����$�������AA��6��������������������#*������#*����$�#��0���������������� �$%�������������������(. <4@�(�A�������������(��. "4(�A�����$����#�"���A�(@�(�A�������������(��. "4(�A�����$�������"���%�������A�(@�(�A�������������(��. "4(�A����������������#����$���#�������$������'������A�(@�(�A�������������(��. "4(�A�������������(.?*<1�0' �*+�@((�A��� "<�;�A�(@(4@�(�A�������������(.�+,� � /,)�@(��"")+@(�+01)�@(��#�"@(@�(�A�������������(�������203�)�@((�A�����$����#�"���A�(@(4@�(�A�������������(.�+,� � /,)�@( )\ @(�+01)�@(� #��#@(@�(�A�������������(���������!)�]�203�)�@((�A�����������������$��+ #��#���A�(@(4@�(�A�������������(.�10334@�(�A�������������(.�+,� � /,)�@(��>1� @(@��(A�������������(�������203�)�@(0�� ���� ����#D����@(4@�(�A
Rozdział 9. ���� Śledzenie sesji 211
�������������(.-�10334@�(�A�������������(.-?*<14@�(�A�������������(��. "4(�A����������������#����$���#�������$�� ����'���������������7�������������������� ��<3�������������%��$�����<3�(-'���� �$��#�(����������--�,�������U���H�����������%�������(<��������(��������� �$%�����������������(.- 0>3)4@�(�A�����������(.?*<1�0' �*+�@((�A������ ��<3�A�(@(4@�(�A�����������(.>��4.')+ )<4@�(�A�����������(.�+,� � /,)�@(��>1� @(@�(�A�����������(�������203�)�@(<��������@(4@�(�A�����������(.-')+ )<4.->��4.-?*<14(��������7������� �$%�������(.->*"/4.-� 134(������7��7
��-EE�TU�������) ���,*� �U���G ������������������%�D��E-
��% �����9������,������%��9��<5 ���5 �&������������������������%��9��<%����%�����������������9��)F�%����&��*)F�%�����6����������5 �&��%������77
Rysunek 9.5.Wyniki wygenerowane
przez serwlet
OrderPage
po kliknięciu przycisku
Dodaj do koszyka
na stronie
KidsBooksPage
To czego nie widać: implementacja koszykai katalogu produktów
Listing 9.6 przedstawia implementację koszyka. Obiekt koszyka — �'������(��4— za-wiera obiekt !� ��� przechowujący informacje o zamówionych produktach i dyspo-nuje metodami umożliwiającymi dodawanie i aktualizację zamówienia. Na listingu 9.7został przedstawiony kod obiektu reprezentującego element katalogu produktów. Kla-sa przedstawiona na listingu 9.8 reprezentuje status zamówienia konkretnego pro-duktu. Wreszcie listing 9.9 przedstawia implementację katalogu produktów.
212 Część I ���� Serwlety 2.1 i 2.2
Rysunek 9.6.Wyniki wygenerowane
przez serwlet
OrderPage
po zamówieniu kilku
dodatkowych książek
i wprowadzeniu kilku
zmian w zamówieniu
Listing 9.6. ShoppingCart.java
%����������9���
�#%������9�$ ���$E�
-EE�8�����#%�#�� �U���������I��������� �� ����������E��G :U������%������������������#���������#���������E��%��� �����$�E��������*���,���������������������������D��E������:�U��U$�E-
% ������������%%���'����6��%��9���2�������#*�����
��-EE� �D���% ���������E-
��% ��������%%���'������6������#*����������2���������7
-EE�!������2����������D����#*�����������U�������E�������#��������#D��������%��� ������������������$���E-
��% �����2���������#*�������6������ �����#*��������7
��-EE�,����U�����������%������&���������� ���C�� :���E������#���#D�����������U��%��� �� ���%�����#���E���������������$�ZH����������#D������������������������E��������������#%������������%��� �� ��������#�������$���E��ZH������#����#D������������U����%�������%��� �� &
Rozdział 9. ���� Śledzenie sesji 213
���E�����#�����%��������������� ��'�������������#��������#���E����������������������%������������$���E-
��% ����������������9���������#����������#�"��6������#*�����������������������R���.��#*����$�������AA��6����������������#*������#*����$�#��0�������������������$����#�"��$5 �����#�"���6������������$����#��+ #��#������������� ���������7����7������#*������*�����������#*����'������$����#���#�"���������#*����$���)�#�����*�������7
��-EE�,����U�����������%�� ������ ��%� �������U������E��%��� �� ���%�����#��������������$�ZH���%���������������E�������C����������&�����������������������������H�������E�����������#D����������#%������������%��� �� $�ZH�����E��%����������������#�������HS�R��� ��#����U�������&���E�����#�:����U%�S���%���%��� ��GC� � :����������&���E���%���%���� �U��������%��� ������ �������������$���E-
��% ����������������9�����+ #*��������������#�"&���������������������������������������������� #*������6������#*�����������������������R���.��#*����$�������AA��6����������������#*������#*����$�#��0�������������������$����#�"��$5 �����#�"���6������������� #*�����.��R��6������������#*����$�#�9)�#��0�������������7���6��������������$�+ #��#�� #*��������������7���������� ���������7����7������#*������*����������������#*����'������$����#���#�"���������#*����$���)�#�����*�������77
Listing 9.7. Item.java
%����������9���
-EE�*%� ���#���������� ������������������% $�E������������������#�"������%�����������%�D���������� ����:���E���#��&���D�����%�������"���%�������������E����D���������#������%��� ����������������������E��� ���������� G���U:���&����G ����%�������"���%������E��������������[����G�������%� �U����������%��� ��������[�
214 Część I ���� Serwlety 2.1 i 2.2
�E�����������������������U���U�%��� �� $�E��!��D������D���&��������G ����%��#�:�������S������ 13$�E-
% �����������#�6��%��9������������#�"���%��9��������������"���%�������%��9��������������"���%�������%��9����� �������
��% �������#����������#�"&������������"���%����&�������������������������"���%����&��� ��������6�������#�"���#�"������������"���%���������"���%�����������3���"���%���������"���%�����������'����������7
��% ����������������#�"���6������ �����#�"����7
��%�������9�������#�"����������#�"��6�������$��#�"�����#�"���7
��% �������������������"���%�������6������ �������"���%��������7
��%�������9����������"���%����������������"���%������6�������$����"���%�����������"���%�������7
��% ��������������3���"���%�������6������ �������"���%��������7
��%�������9�����3���"���%����������������"���%������6�������$����"���%�����������"���%�������7
��% ������� �����'�����6������ ����������7
��%�������9�����'����� ��������6�������$������������77
Listing 9.8. ItemOrder.java
%����������9���
-EE�8��������#���������� ����#������������#���#D����#�E��%�%������%�#�C����������#����������������#���������E����#%������������%��� �� ����������GU����������H��$
Rozdział 9. ���� Śledzenie sesji 215
�E������C%�������:�%��������#����� #�:������U��E���%���������������#�������%�������������������������#�E�������������H�������%��������$�E-
% �����������#*����6��%��9�����#���#���%��9�������� #��#�
��% �������#*������#���#��6�������#���#�������+ #��#�P����7
��% �������#�����#���6������ �����#����7
��%�������9�������#���#���#��6�������$��#�����#���7
��% ����������������#�"���6������ �������#��$����#�"������7
��% �������������������"���%�������6������ �������#��$�������"���%����������7
��% ��������������3���"���%�������6������ �������#��$��3���"���%����������7
��% ������� ���������'�����6������ �������#��$��'��������7
��% �����������+ #��#���6������ ���� #��#����7
��% �����9�����+ #��#��������6�������$� #��#�������7
% �����9��������#��+ #��#���6�����+ #��#���+ #��#���A�P����7
��% �����9���������*������6�����+ #��#�R����7
��% ������� ����� ����'�����6������ �����+ #��#���E�������'��������77
216 Część I ���� Serwlety 2.1 i 2.2
Listing 9.9. Catalog.java
%����������9���
-EE�8��������������U��������#������%��� ������E�����C%����������������#���%�$�E-
% ���������'�������6��--�+��#������������#������G����%�������������%��������--��������������$��%��9�����������#VW���#������6������#�(����RRP(&���������������(.�4Z�9����9�����Z�9����9��,��.-�4�(�A�����������������(�� ����1���������(&���������������("�����G��%��������������������)3�*+�%�H��C�����(�A�����������������(�����#���Z�,$@�(�A�����������������(+�#�������������������+���������������������� ��$(&���������������]L$LK�&�����������#�(����RRB(&���������������(.�4'���M��,�����##���&�Z�9�B�)������.-�4�(�A�����������������(�� �����Q�1���������&�3�����>����������(�A�����������������(,� ��1�+�#(&���������������(M%����G����U:�������%�����#��D���%��������(�A�����������������(�����������$�*#��������������������������# �U�@�(�A�����������������(.�34.3�4���G���U�%�������C�%������#��Z�9��B��(�A�����������������(����#��U��D�&��������[���������&�%���� ������&�@�(�A�����������������(Z�9�B"�������������&@�(�A�����������������(.3�4��D�����%������������� 13�^$RP&�(�A�����������������(�������U��%�������C� �G��D����#�&���� ������D�&�@�(�A�����������������(�����������������[�+���%�+�9���������(�A�����������������(�������)F%����&@�(�A�����������������(.3�4��D�����%������������%������G �� ,�P$P&�(�A�����������������(����D����Z�9����9��,��&@�(�A�����������������(.3�4��D�����#D������C�����Z�9�����%��P$B@�(�A�����������������(.-�34(&���������������^L$LK�&�����������#�(���RRP(&���������������(.�4*%���H�����+�����.-�4�� ���Q�'$�$�3��(&���������������(8�������������C���%���HS�%������������#�������(�A�����������������(0�����M�������3������������������@�(�A�����������������(��>��GU�M��X#U�������G�#���G�$(�A�����������������(�#���&����������&��� �����������@�(�A�����������������(��#D��U�������C��������U��GC���U�� ����U�(�A�����������������(������C$���������# ����U:��@�(�A�����������������(.�4��������������������.-�4&@�(�A�����������������(.�43�&�M��X#�������������.-�4&@�(�A�����������������(.�48�[���������G�%��.-�4&@�(�A�����������������(.�48�U:C�'�%���.-�4&@�(�A�����������������(.�4,���D:.-�4&@�(�A�����������������(.�4���������G�.-�4������@�(�A�����������������(.�4*������������.-�4$(&���������������PL$LK�&�����������#�(��F����RRP(&���������������(.�4��������,������.-�4�� ���Q�3�����0�F����(&���������������( ����&�%���������������H��[&�%���GU�����C����(�A�����������������(%��C:����3����������������������������# ���@�(�A
Rozdział 9. ���� Śledzenie sesji 217
�����������������(������%��������0��������I�3�������0�� 9��$�M����(�A�����������������(�������#��%�������DG#�������%�C��U���C:�����U�@�(�A�����������������()������&�����#�?����� �#�?���##&�(�A�����������������(��%DG��G�����#�� ���&� �������������(�A�����������������(���#����������&���������������������H��$@�(�A�����������������(��������# �����C% �U����U:��Q�@�(�A�����������������(.�48�C��������.-�4&�@�(�A�����������������(.�4'�����������G.-�4&�@�(�A�����������������(.�4!�#��3����.-�4&�@�(�A�����������������(.�4 �����MC������.-�4������@�(�A�����������������(.�4M�������D�.-�4$(&���������������PL$LK�&�����������#�(�������RRP(&���������������(.�4 ���������������#�,�����.-�4�� �����Q�(�A�����������������(Z$8$�<������(&���������������(,������������U:�����������%�% �������������(�A�����������������(%���U�� �U��#���������� ������#�,������@�(�A�����������������(�����������G������#�%���U������������D��(�A�����������������(���D����������������������������G���$������@�(�A�����������������(���# ����U:��Q�@�(�A�����������������(.�4������,���������#�[�(�A�������������������(������������.-�4&�@�(�A�����������������(.�4������,���������#�����(�A�������������������(���#���.-�4������@�(�A�����������������(.�4������,�������(�A�������������������(��C��[�0������ .-�4$(&���������������BK$LK�����7�
��% �������������#�����#����������#�"��6������#���#�����������#�"����� ����6�������� ���� ��������7��������������R���.��#$��������AA��6��������#�����#V�W�������������#�"$5 �����#$����#�"�����6���������� �����#��������7����7������ ���� ������77