SPIS TRE„CI i Java Server Pages

35
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOŒCIACH ZAMÓW INFORMACJE O NOWOŒCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TREŒCI SPIS TREŒCI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE Java Servlet i Java Server Pages Autor: 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.

Transcript of SPIS TRE„CI i Java Server Pages

Page 1: 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.

Page 2: SPIS TRE„CI i Java Server Pages

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

Page 3: SPIS TRE„CI i Java Server Pages

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

Page 4: SPIS TRE„CI i Java Server Pages

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

Page 5: SPIS TRE„CI i Java Server Pages

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

Page 6: SPIS TRE„CI i Java Server Pages

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

Page 7: SPIS TRE„CI i Java Server Pages

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

Page 8: SPIS TRE„CI i Java Server Pages

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

Page 9: SPIS TRE„CI i Java Server Pages

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

Page 10: SPIS TRE„CI i Java Server Pages

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

Page 11: SPIS TRE„CI i Java Server Pages

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:

��������������� ���������������������������������������������������������������������������������������������� ��� �����!"���#�������

Page 12: SPIS TRE„CI i Java Server Pages

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.

Page 13: SPIS TRE„CI i Java Server Pages

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

Page 14: SPIS TRE„CI i Java Server Pages

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

Page 15: SPIS TRE„CI i Java Server Pages

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

Page 16: SPIS TRE„CI i Java Server Pages

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.

Page 17: SPIS TRE„CI i Java Server Pages

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

Page 18: SPIS TRE„CI i Java Server Pages

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.

Page 19: SPIS TRE„CI i Java Server Pages

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

Page 20: SPIS TRE„CI i Java Server Pages

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

Page 21: SPIS TRE„CI i Java Server Pages

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

Page 22: SPIS TRE„CI i Java Server Pages

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

Page 23: SPIS TRE„CI i Java Server Pages

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$���������� "<�;��� ����������#���<�;��� "<�;����������� �$%������

Page 24: SPIS TRE„CI i Java Server Pages

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��������#�����

Page 25: SPIS TRE„CI i Java Server Pages

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.

Page 26: SPIS TRE„CI i Java Server Pages

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

Page 27: SPIS TRE„CI i Java Server Pages

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

Page 28: SPIS TRE„CI i Java Server Pages

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

Page 29: SPIS TRE„CI i Java Server Pages

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.

Page 30: SPIS TRE„CI i Java Server Pages

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

Page 31: SPIS TRE„CI i Java Server Pages

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����������%��� ��������[�

Page 32: SPIS TRE„CI i Java Server Pages

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��$

Page 33: SPIS TRE„CI i Java Server Pages

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

Page 34: SPIS TRE„CI i Java Server Pages

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

Page 35: SPIS TRE„CI i Java Server Pages

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