IDZ DO PRZYK ADOWY ROZDZIA KATALOG KSI EK ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOŒCIACH ZAMÓW CENNIK CZYTELNIA SPIS TREŒCI KATALOG ONLINE DODAJ DO KOSZYKA FRAGMENTY KSI EK ONLINE Java Servlet i Java Server Pages Autor: Marty Hall T³umaczenie: Piotr Rajca ISBN: 83-7197-603-8 Tytu³ orygina³u: Core Servlets and JavaServer Pages Format: B5, stron: 530 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. Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl
O Autorze...13 Wprowadzenie...15 Część I Serwlety 2.1 i 2.2...r... 23 Rozdział 1. Podstawowe informacje o serwletach i Java Server Pages...25 Serwlety...5...5......25 Zalety serwletów w porównaniu ze zwykłymi programami CGI...27 Efektywność...5...5...27 Wygoda...5...5...27 Duże możliwości...5...528 Przenośność...5...5...28 Bezpieczeństwo...5...5..28 Niewielkie koszty...5...29 Java Server Pages...5...5...29 Zalety JSP...5...5.....30 W porównaniu z Active Server Pages (ASP)...5...30 W porównaniu z PHP...5...30 W porównaniu z serwletami...5...30 W porównaniu z Server-Side Includes (SSI)...5...31 W porównaniu z językiem JavaScript...5...31 W porównaniu ze statycznym kodem HTML...5...31 Instalacja i konfiguracja...5...32 Zdobywanie oprogramowania do obsługi serwletów i dokumentów JSP...32 Zapamiętaj adres lub zainstaluj dokumentację Java Servlet oraz JSP API...34 Wskazanie klas używanych przez kompilator Javy...34 Umieszczanie klasy w pakietach...5...35 Konfiguracja serwera...5...36 Uruchomienie serwera...5...37 Kompilacja i instalacja własnych serwletów...5...37 Rozdział 2. Pierwsze serwlety...41 Podstawowa struktura serwletów...5...41 Prosty serwlet generujący zwykły tekst...5...43 Kompilacja i instalacja serwletów...5...43 Wywoływanie serwletów...5...45 Serwlety generujące kod HTML...5...45
4 Java Servlet i Java Server Pages Umieszczanie serwletów w pakietach...5...47 Tworzenie serwletów należących do konkretnego pakietu...48 Kompilacja serwletów należących do pakietów...5...49 Wywoływanie serwletów należących do pakietów...50 Proste narzędzia pomocne podczas tworzenia dokumentów HTML...51 Cykl istnienia serwletów...5...53 Metoda init...5...5...54 Metoda service...5...5...55 Metody doget, dopost oraz doxxx...5...56 Interfejs SingleThreadModel...5...57 Metoda destroy...5...5...57 Przykład zastosowania parametrów inicjalizacyjnych...558 Przykład wykorzystania inicjalizacji serwletu i daty modyfikacji strony...62 Testowanie serwletów...5...64 WebClient: interaktywna wymiana informacji z serwerem WWW...68 WebClient...5...5...68 HttpClient...5...5...71 NetworkClient...5...5...72 SocketUtil...5...5...74 CloseableFrame...5...5..74 LabeledTextField...5...575 Interruptible...5...5...77 Rozdział 3. Obsługa żądań: dane przesyłane za pomocą formularzy...79 Znaczenie informacji przesyłanych za pomocą formularzy...79 Odczytywanie danych formularzy w serwletach...5...80 Przykład: odczytanie trzech konkretnych parametrów...581 Przykład: odczytanie wszystkich parametrów...5...84 Serwis rejestracji życiorysów...5...87 Filtrowanie łańcuchów w poszukiwaniu znaków specjalnych HTML...97 Implementacja filtrowania...5...98 Przykład...5...5...99 Rozdział 4. Obsługa żądań: nagłówki żądań HTTP...103 Odczytywanie wartości nagłówków żądania w serwletach...104 Wyświetlanie wszystkich nagłówków...5...105 Nagłówki żądań protokołu HTTP 1.1...5...107 Przesyłanie skompresowanych stron WWW...5...113 Ograniczanie dostępu do stron WWW...5...115 Rozdział 5. Dostęp do standardowych zmiennych CGI...121 Odpowiedniki zmiennych CGI dostępne w serwletach...122 Serwlet wyświetlający wartości zmiennych CGI...5...125 Rozdział 6. Generowanie odpowiedzi: kody statusu...127 Określanie kodów statusu...5...128 Kody statusu protokołu HTTP 1.1 oraz ich przeznaczenie...129 Interfejs użytkownika obsługujący różne serwisy wyszukujące...138 Rozdział 7. Generowanie odpowiedzi: nagłówki odpowiedzi HTTP...145 Określanie nagłówków odpowiedzi z poziomu serwletów...145 Nagłówki odpowiedzi protokołu HTTP 1.1 oraz ich znaczenie...147 Trwałe przechowywanie stanu serwletu i automatyczne odświeżanie stron...156 Stosowanie trwałych połączeń HTTP...5...164 Wykorzystanie serwletów do generowania obrazów GIF...168
Spis treści 5 Rozdział 8. Obsługa cookies...177 Korzyści płynące ze stosowania cookies...5...177 Identyfikacja użytkowników podczas trwania sesji na witrynach komercyjnych..177 Unikanie konieczności podawania nazwy użytkownika i hasła...178 Dostosowywanie witryny...5...178 Dobór reklam...5...5...179 Niektóre problemy związane ze stosowaniem cookies...179 Narzędzia obsługi cookies dostępne w serwletach...5...180 Tworzenie cookies...5...181 Atrybuty cookies...5...181 Umieszczanie cookies w nagłówkach odpowiedzi...183 Odczytywanie cookies nadesłanych przez przeglądarkę...183 Przykłady generowania i odczytywania cookies...5...184 Proste narzędzia do obsługi cookies...5...187 Odnajdywanie cookie o określonej nazwie...5...187 Tworzenie cookies o długim czasie istnienia...5...188 Interfejs wyszukujący z możliwością zapamiętywania ustawień...190 Rozdział 9. Śledzenie sesji...193 Potrzeba śledzenia sesji...5...193 Cookies...5...5...193 Przepisywanie adresów URL...5...194 Ukryte pola formularzy...5...195 Śledzenie sesji w serwletach...5...195 Narzędzia programistyczne do śledzenia sesji...5...195 Pobieranie obiektu HttpSession skojarzonego z bieżącym żądaniem...195 Pobieranie informacji skojarzonych z sesją...5...196 Kojarzenie informacji z sesją...5...199 Kończenie sesji...5...5.200 Przepisywanie adresów URL przesyłanych do przeglądarki...200 Serwlet generujący indywidualny licznik odwiedzin dla każdego użytkownika...201 Internetowy sklep wykorzystujący koszyki i śledzenie sesji...203 Tworzenie interfejsu użytkownika...5...204 Obsługa zamówień...5...207 To czego nie widać: implementacja koszyka i katalogu produktów...211 Część II Java Server Pages...r... 219 Rozdział 10. Elementy skryptowe JSP...221 Elementy skryptowe...5...223 Tekst szablonu...5...5..223 Wyrażenia JSP...5...5...224 Predefiniowane zmienne...5...224 Składnia XML stosowana w wyrażeniach...5...225 Zastosowanie wyrażeń jako wartości atrybutów...5.225 Przykład...5...5...226 Skryptlety JSP...5...5...22 7 Wykorzystanie skryptletów do warunkowego wykonania fragmentu strony JSP.230 Specjalna składnia skryptletów...5...230 Deklaracje JSP...5...5...230 Specjalna składnia zapisu deklaracji...5...232 Predefiniowane zmienne...5...232
6 Java Servlet i Java Server Pages Rozdział 11. Dyrektywa page: strukturalizacja generowanych serwletów...235 Atrybut import...5...5...236 Katalogi służące do przechowywania własnych klas...236 Przykład...5...5...237 Atrybut contenttype...5...239 Generowanie zwykłych dokumentów tekstowych...239 Generowanie arkuszy kalkulacyjnych programu Microsoft Excel...240 Atrybut isthreadsafe...5...243 Atrybut session...5...5...245 Atrybut buffer...5...5...24 5 Atrybut autoflush...5...5...246 Atrybut extends...5...5...246 Atrybut info...5...5...2 46 Atrybut errorpage...5...5...246 Atrybut iserrorpage...5...5248 Atrybut language...5...5...249 Składnia XML zapisu dyrektyw...5...249 Rozdział 12. Dołączanie plików i apletów do dokumentów JSP...251 Dołączanie plików w czasie przekształcania strony...5..252 Dołączanie plików podczas obsługi żądań...5...254 Dołączanie apletów związanych z Java Plug-In...5...257 Znacznik akcji jsp:plugin...5...258 Znaczniki akcji jsp:param oraz jsp:params...5...260 Znacznik akcji jsp:fallback...5...261 Przykład: Generowanie tekstu z cieniem...5...261 Rozdział 13. Wykorzystanie komponentów JavaBeans w dokumentach JSP...267 Podstawowe sposoby użycia komponentów...5...268 Dostęp do właściwości komponentów...5...270 Określanie właściwości komponentów prosty przypadek...271 Instalacja klas komponentów...5...271 Przykład: StringBean...5...272 Określanie wartości właściwości komponentów...5...274 Kojarzenie właściwości z parametrami wejściowymi...277 Automatyczna konwersja typów...5...279 Kojarzenie wszystkich właściwości z parametrami wejściowymi...280 Wspólne wykorzystywanie komponentów...5...281 Warunkowe tworzenie komponentów...5...282 Rozdział 14. Tworzenie bibliotek znaczników...287 Elementy tworzące bibliotekę znaczników...5...288 Klasa obsługi znacznika...5...288 Plik deskryptora biblioteki znaczników...5...289 Plik JSP...5...5...290 Definiowanie prostych znaczników...5...292 Klasa obsługi znacznika...5...292 Plik deskryptora biblioteki znaczników...5...294 Plik JSP...5...5...295 Przypisywanie atrybutów znacznikom...5...296 Klasa obsługi znacznika...5...296 Plik deskryptora biblioteki znaczników...5...298 Plik JSP...5...5...299
Spis treści 7 Dołączanie zawartości znacznika...5...300 Klasa obsługi znacznika...5...301 Plik deskryptora biblioteki znaczników...5...303 Plik JSP...5...5...304 Opcjonalne dołączanie zawartości znacznika...5...306 Klasa obsługi znacznika...5...306 Plik deskryptora biblioteki znaczników...5...307 Plik JSP...5...5...308 Manipulowanie zawartością znacznika...5...309 Klasa obsługi znacznika...5...310 Plik deskryptora biblioteki znaczników...5...311 Plik JSP...5...5...312 Wielokrotne dołączanie lub obsługa zawartości znacznika...313 Klasa obsługi znacznika...5...314 Plik deskryptora biblioteki znaczników...5...315 Plik JSP...5...5...316 Stosowanie znaczników zagnieżdżonych...5...316 Klasy obsługi znaczników...5...317 Plik deskryptora biblioteki znaczników...5...322 Plik JSP...5...5...324 Rozdział 15. Integracja serwletów i dokumentów JSP...327 Przekazywanie żądań...5...328 Stosowanie zasobów statycznych...5...329 Przekazywanie informacji do strony docelowej...5..329 Interpretacja względnych adresów URL przez stronę docelową...331 Inne sposoby pobierania obiektu RequestDispatcher...332 Przykład: internetowe biuro podróży...5...332 Dołączanie danych statycznych lub dynamicznych...5...346 Przykład: prezentacja nieprzetworzonych wyników zwracanych przez serwlety lub strony JSP...5...347 Przekazywanie żądań ze stron JSP...5...351 Część III Technologie pomocnicze...r.. 353 Rozdział 16. Formularze HTML...355 Jak przesyłane są dane z formularzy HTML...5...355 Element FORM...5...5...359 Tekstowe elementy kontrolne...5...364 Pola tekstowe...5...5...364 Pola hasła...5...5...366 Wielowierszowe pola tekstowe...5...366 Przyciski...5...5....368 Przycisk SUBMIT...5...369 Przyciski RESET...5...371 Przyciski JavaScript...5...372 Pola wyboru i przyciski opcji...5...373 Pola wyboru...5...5...373 Przyciski opcji...5...5..374 Listy i listy rozwijane...5...376 Element kontrolny służący do przesyłania plików...5...379 Mapy odnośników obsługiwane na serwerze...5...380 IMAGE standardowe mapy odnośników obsługiwane po stronie serwera...381 ISMAP alternatywny sposób tworzenia map odnośników obsługiwanych po stronie serwera...5...383
8 Java Servlet i Java Server Pages Rozdział 17. Pola ukryte...5...5... 385 Grupowanie elementów kontrolnych...5...386 Określanie kolejności poruszania się pomiędzy elementami formularzy...388 Testowy serwer WWW...5...388 EchoServer...5...5...389 ThreadedEchoServer...5...392 NetworkServer...5...5..394 Zastosowanie apletów jako interfejsu użytkownika dla serwletów...397 Przesyłanie danych metodą GET i wyświetlanie wynikowej strony WWW...398 Narzędzie korzystające z wielu serwisów wyszukujących...399 Przesyłanie danych metodą GET i bezpośrednie przetwarzanie5 wyników (tunelowanie HTTP)...5...402 Odczyt danych binarnych lub danych ASCII...5...403 Odczyt serializowanych struktur danych...5...404 Przeglądarka zapytań wykorzystująca serializację obiektów i tunelowanie...407 Przesyłanie danych metodą POST i bezpośrednie przetwarzanie5 danych (tunelowanie HTTP)...5...413 Aplet przesyłający dane metodą POST...5...416 Pomijanie serwera HTTP...5...419 Rozdział 18. JDBC oraz zarządzanie pulami połączeń...421 Podstawowe etapy wykorzystania JDBC...5...422 Załadowanie sterownika...5...422 Określenie adresu URL połączenia...5...423 Nawiązanie połączenia...5...423 Utworzenie polecenia...5...424 Wykonanie zapytania...5...424 Przetworzenie wyników...5...425 Zamknięcie połączenia...5...426 Prosty przykład wykorzystania JDBC...5...426 Narzędzia ułatwiające korzystanie z JDBC...5...432 Wykorzystanie narzędzi ułatwiających obsługę JDBC...440 Interaktywna przeglądarka zapytań...5...444 Kod przeglądarki zapytań...5...446 Przygotowane polecenia (prekompilowane zapytania)...451 Zarządzanie pulami połączeń...5...455 Zarządzanie pulami połączeń: studium zagadnienia...5.461 Współużytkowanie pul połączeń...5...467 Współużytkowanie pul połączeń z zastosowaniem kontekstu serwletu...467 Współużytkowanie pul połączeń z zastosowaniem klas singleton...468 Dodatki...r... 469 Dodatek A Krótki przewodnik po serwletach i JSP...471 Prezentacja serwletów i JSP...5...471 Zalety serwletów...5...471 Zalety JSP...5...5...471 Bezpłatnie dostępne oprogramowanie do obsługi serwletów i JSP...472 Dokumentacja...5...5...472 Kompilacja serwletów informacje podawane w zmiennej środowiskowej CLASSPATH...5...472 Standardowe katalogi serwera Tomcat 3.0...5...472 Standardowe katalogi serwera Tomcat 3.1...5...473
Spis treści 9 Standardowe katalogi serwera JSWDK 1.0.1...5...473 Standardowe katalogi serwera Java Web Server 2.0...473 Pierwsze serwlety...5...5...473 Prosty serwlet...5...5...473 Instalacja serwletów...5...474 Uruchamianie serwletów...5...474 Cykl istnienia serwletów...5...474 Obsługa żądań dane przesyłane z formularzy...5...475 Odczyt parametrów...5...475 Przykład serwletu...5...475 Przykład formularza...5...476 Filtrowanie znaków specjalnych HTML...5...477 Obsługa żądań nagłówki żądań HTTP...5...477 Metody odczytujące nagłówki żądania...5...477 Inne informacje o żądaniu...5...478 Najczęściej używane nagłówki żądań protokołu HTTP 1.1...478 Dostęp do standardowych zmiennych CGI...5...479 Możliwości, które nie zostały opisane gdzie indziej...479 Odpowiedniki zmiennych CGI dostępne w serwletach...479 Generowanie odpowiedzi: Kody statusu HTTP...5...480 Format odpowiedzi HTTP...5...480 Metody określające kod statusu...5...480 Kategorie kodów statusu...5...481 Najczęściej wykorzystywane kody statusu protokołu HTTP 1.1...481 Generowanie odpowiedzi nagłówki odpowiedzi protokołu HTTP...482 Generowanie dowolnych nagłówków...5...482 Generowanie najczęściej używanych nagłówków...482 Najczęściej używane nagłówki odpowiedzi protokołu HTTP 1.1...483 Generowanie obrazów GIF przez serwlety...5...484 Obsługa cookies...5...5...484 Typowe zastosowania cookies...5...484 Problemy napotykane przy stosowaniu cookies...5..484 Ogólny sposób użycia cookies...5...485 Metody obsługi cookies...5...485 Śledzenie sesji...5...5...4 86 Pobieranie informacji o sesji getvalue...5...486 Kojarzenie informacji z sesją putvalue...5...486 Metody interfejsu HttpSession...5...487 Kodowanie adresów URL...5...488 Elementy skryptowe JSP...5...488 Typy elementów skryptowych...5...488 Tekst szablonu...5...5..489 Predefiniowane zmienne...5...489 Dyrektywa page określanie postaci generowanych serwletów...490 Atrybut import...5...5..490 Atrybut contenttype...5...490 Przykład użycia atrybutu contenttype...5...490 Przykład wykorzystania metody setcontenttype...490 Atrybut isthreadsafe...5...491 Atrybut session...5...5.491 Atrybut buffer...5...5...492 Atrybut autoflush...5...492 Atrybut extends...5...5492 Atrybut info...5...5...492
10 Java Servlet i Java Server Pages Atrybut errorpage...5...492 Atrybut iserrorpage...5...492 Atrybut language...5...492 Zapis zgodny z XML...5...493 Dołączanie plików i apletów do dokumentów JSP...5...493 Dołączanie plików w czasie przekształcania strony...493 Dołączanie plików w czasie obsługi żądania...5...493 Aplety obsługiwane przy użyciu Java Plug-In: Prosty przypadek...493 Atrybuty znacznika jsp:plugin...5...494 Parametry określane w kodzie HTML: jsp:param...494 Tekst alternatywny...5...495 Wykorzystanie komponentów JavaBeans w dokumentach JSP...495 Podstawowe wymagania jakie należy spełnić, aby klasa mogła być uznana za komponent...5...495 Podstawowe sposoby użycia komponentów...5...496 Kojarzenie właściwości z parametrami przesłanymi w żądaniu...496 Wspólne wykorzystywanie komponentów: atrybut scope znacznika akcji jsp:usebean...5...496 Warunkowe tworzenie komponentów...5...497 Tworzenie bibliotek znaczników...5...497 Klasa obsługi znacznika...5...497 Plik deskryptora biblioteki znaczników...5...497 Plik JSP...5...5...498 Przypisywanie atrybutów znacznikom...5...498 Dołączanie zawartości znacznika...5...498 Opcjonalne dołączanie zawartości znacznika...5...498 Przetwarzanie zawartości znacznika...5...498 Wielokrotne dołączanie lub przetwarzanie zawartości znacznika...499 Stosowanie zagnieżdżonych znaczników...5...499 Integracja serwletów i dokumentów JSP...5...499 Opis ogólny...5...5...499 Składnia służąca do przekazania żądania...5...499 Przekazywanie żądań do zwykłych dokumentów HTML...500 Tworzenie globalnie dostępnych komponentów JavaBeans...500 Tworzenie komponentów JavaBeans dostępnych w sesji...500 Interpretacja względnych adresów URL na stronie docelowej...500 Alternatywne sposoby pobierania obiektu RequestDispatcher5 (wyłącznie Java Servlet 2.2)...5...501 Dołączenie danych statycznych lub dynamicznych...501 Przekazywanie żądań ze stron JSP...5...501 Stosowanie formularzy HTML...5...501 Element FORM...5...5501 Pola tekstowe...5...5...501 Pola hasła...5...5...502 Obszary tekstowe...5...502 Przyciski SUBMIT...5...502 Alternatywna postać przycisków SUBMIT...5...502 Przyciski RESET...5...503 Alternatywna postać przycisków RESET...5...503 Przyciski JavaScript...5...503 Alternatywna postać przycisków JavaScript...5...503 Pola wyboru...5...5...504 Przyciski opcji...5...5..504 Listy rozwijane...5...5.504
Spis treści 11 Elementy kontrolne umożliwiające przesyłanie plików na serwer...504 Mapy odnośników obsługiwane na serwerze...5...505 Pola ukryte...5...5...505 Możliwości dostępne w przeglądarce Internet Explorer...505 Wykorzystanie apletów jako interfejsu użytkownika dla serwletów...505 Przesyłanie danych metodą GET i wyświetlanie strony wynikowej...505 Przesyłanie danych metodą GET i bezpośrednie przetwarzanie5 wyników (tunelowanie HTTP)...5...506 Przesyłanie serializowanych danych kod apletu...507 Przesyłanie serializowanych danych kod serwletu...507 Przesyłanie danych metodą POST i bezpośrednie przetwarzanie5 wyników (tunelowanie HTTP)...5...508 Pomijanie serwera HTTP...5...510 JDBC i zarządzanie pulami połączeń z bazami danych...510 Podstawowe etapy wykorzystania JDBC...5...510 Narzędzia obsługi baz danych...5...511 Przygotowane polecenia (prekompilowane zapytania)...512 Etapy implementacji puli połączeń...5...512 Skorowidz...515
Rozdział 9. W niniejszym rozdziale przedstawiono sposób, w jaki można wykorzystać mechanizmy śledzenia sesji dostępne w serwletach w celu przechowywania informacji o użytkownikach poruszających się po witrynie WWW. Potrzeba lledzenia sesji Cookies HTTP jest protokołem bezstanowym oznacza to, że za każdym razem, gdy przeglądarka pobiera stronę WWW, tworzone jest niezależne połączenie z serwerem. Serwer nie przechowuje automatycznie żadnych kontekstowych informacji skojarzonych 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ługują wiele żądań zgłaszanych w niewielkich odstępach czasu, nie ma żadnych wbudowanych mechanizmów ułatwiających przechowywanie takich kontekstowych informacji. Brak takiego mechanizmu może powodować liczne problemy. Szczególnie widoczne są one w przypadku sklepów internetowych, gdzie istnieje oczywista potrzeba śledzenia sesji użytkownika. Znane są trzy podstawowe sposoby rozwiązywania problemów tego typu cookies, przepisywanie adresów URL oraz zastosowanie ukrytych mpól formularzy. 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 powodować 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: #8621.#/798;36%2+2./280+836#86217 +78+,/203#/72/;+78+,/ +78+,/8+,-+3,+2+3.79+$+,-/+2#/77
194 Część I Serwlety 2.1 i 2.2 8+,-+3,+2+498.#/7Г203#/7 33/-33/#/72/;33/###Г.#/7 7/773233/7/8 +8 6/74327/+..33/-33/#/7 Dzięki temu podczas obsługi kolejnych żądań, na podstawie wartości cookie ###, serwer może pobierać z tablicy 8+,-+3,+2+ tablicę asocjacyjną 203#/7 zawierają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 posiadania narzędzi programistycznych wyższego poziomu, które pozwoliłyby na implementację 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 czymnności tych można zaliczyć: J pobieranie cookie przechowującego identyfikator sesjmi (możliwe jest nadesłanie kilku cookies z jednej przeglądarki); J określenie odpowiedniego czasu wygaśnięcia ważności mcookie (sesje, które są nieaktywne przez ponad 24 godziny prawdopodobnie powimnny zostać zamknięte); J skojarzenie tablic asocjacyjnych z każdym żądaniem; J generowanie unikalnego identyfikatora sesji. Należy podkreślić, że ze względu na doskonale znane i oczywiste zagrożenia prywatnoś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 problmemu. 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 przekazanego 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 funkcjonalne, 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 3-+832), został uzupełniony do dodatkowe informacje. Inną niedogodnością rozwiązania polegającego na przepisywaniu adresów URL jest fakt, że w po zakończeniu sesji i późniejszym nawiązania kolejnej sesji na danej witrynie za pomocą zapamiętanego adresu lub połączenia, wszystkie dotyczące jej informacje są tracone.
Rozdział 9. Śledzenie sesji 195 Ukryte pola formularzy W formularzach HTML można umieszczać pola o następującmej postaci: %$$ 7/7+&% Wykorzystanie takiego elementu oznacza, że podczas przesyłania formularza podana nazwa elementu oraz jego wartość są dołączane do pozostałych informacji przekazywanych 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ćm generowana dynamicznie. kledzenie sesji w serwletach Serwlety udostępniają bardzo dobre rozwiązanie problemu śledzenia sesji interfejs 884#/7732. Możliwości funkcjonalne tego interfejsu bazują na wykorzystywaniu cookies lub przepisywania adresów URL. W rzeczywistości większość serwerów wykorzystuje cookies, pod warunkiem, że są one obsługiwane przez przeglądarkę użytkownika. 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 dowolnych obiektów skojarzonych z każdą sesją. Narzdzia programistyczne do lledzenia sesji Wykorzystanie śledzenia sesji w serwletach jest bardzo proste i wiąże się z pobieraniem obiektu sesji skojarzonego z obsługiwanym żądaniem, w razie konieczności z tworzeniem nowego obiektu sesji, pobieraniem informacji skojarzonych z sesją, zapisywaniem informacji w obiekcie sesji oraz z usuwaniem przerwanych lub zakończonych sesji. Dodatkowo, jeśli do użytkownika przekazywane są jakiekolwiek adresy 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 mo sesji. Pobieranie obiektu HttpSession skojarzonego z biercym rdaniem Obiekt 884#/7732 można pobierać za pomocą metody 1/8#/7732 interfejsu 884 #/6:/8"/59/78. System pobiera identyfikator użytkownika z cookie lub z informacji dołączonych do adresu URL w niewidoczny sposób, a następnie używa go jako klucza przy pobieraniu odpowiedniego elementu z tablicy utworzonych wcześniej obiektów
196 Część I Serwlety 2.1 i 2.2 884#/7732. Wszystkie te czynności są wykonywane w sposób niezauważalny dla programisty, który jedynie wywołuje metodę 1/8#/7732. Jeśli wywołanie tej metody zwraca wartość 29, 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 dostępna jest specjalna opcja pozwalająca na utworzenie nowej sesji, jeśli sesja dla danego użytkownika jeszcze nie istnieje. W tym celu wystarczy przekazać wartość 869/ w wywołaniu metody 1/8#/7732. A zatem, pierwszy krok przy rozpoczynaniu sesji zazwyczaj wygląda w następujący sposób: 884#/77327/7+6/59/781/8#/7732869/ Sprawdzenie, czy dana sesja istniała już wcześniej, lub czy też została właśnie utworzona, jest możliwe za pomocą metody 7/;. Pobieranie informacji skojarzonych z sesj Obiekty 884#/7732 są przechowywane na serwerze. Są one automatycznie kojarzone z żądaniami podczas wykorzystywania niewidocznych mechanizmów, takich jak cookies lub przepisywanie adresów URL. Obiekty te posiadają wbudowaną strukturę danych, która umożliwia im przechowywanie dowolnej liczby kluczy oraz skojarzonych z nimi wartości. W specyfikacjach Java Servlet 2.1 oraz wcześniejszych do pobrania wartości uprzednio zapisanej w sesji stosuje się wywołanie 7/77321/8&+9/ 2+;+86,989. Metoda 1/8&+9/ zwraca obiekt typu,/-8, a zatem przywrócenie oryginalnego typu danej zapisanej w sesji jest możliwe poprzez zastosowanie odpowiedniego rzutowania typów. Metoda zwraca wartość 29, jeśli nie ma atrybutu o podanej nazwie. Oznacza to, że przed wywołaniem jakichkolwiek metod obiektu skojarzonego z sesją należy sprawdzić, czy nie jest mto wartość 29. W specyfikacji Java Servlet 2.2 metoda 1/8&+9/ została uznana za przestarzałą i zastąpiono ją metodą 1/8886,98/. Nazwa tej metody lepiej odpowiada metodzie 7/8886,98/ (w specyfikacji 2.1 metodzie 1/8&+9/ odpowiadała metoda 498&+9/, a nie 7/8&+9/). W przykładach przedstawionych w niniejszej książce zastosowano metodę 1/8&+9/, gdyż nie wszystkie dostępne na rynku komercyjne mechanizmy obsługi serwletów są zgodne ze specyfikacją 2.2. Poniżej podano przykład wykorzystania mechanizmu śledzenia sesji. Założono, że #34421+68 jest klasą zdefiniowaną w celu przechowywania informacji o zamawianych produktach (implementację tej klasy zamieszczono w podrozdziale Internetowy sklep wykorzystujący koszyki i śledzenie sesji ). 884#/77327/7+6/59/781/8#/7732869/ #34421+6837#34421+687/7+1/8&+9/734421+68 03729;7/72/+/7-/377+ 372/;#34421+68 7/7+498&+9/734421+68Г37 63,3737/37 W większości przypadków nazwa atrybutu jest znana, a celem działania jest pobranie wartości skojarzonej z tą nazwą. Istnieje także możliwość pobrania nazw wszystkich atrybutów skojarzonych z daną sesją służy do tego metoda 1/8&+9/+/7 zwracająca
Rozdział 9. Śledzenie sesji 197 tablicę łańcuchów znaków. Ta metoda jest jedynym sposobem określenia nazw atrybutów w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1. W przypadku mechanizmów zgodnych ze specyfikacją 2.2 nazwy atrybutów można pobierać za pomocą metody 1/8886,98/+/7. Metoda ta działa w bardziej spójny sposób, gdyż zwraca obiekt 29/6+832, podobnie jak metody 1/8/+./6+/7 oraz 1/8 +6+/8/6+/7 interfejsu 884#/6:/8"/59/78. 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 884#/7732: public Object getvalue(string nazwa) public Object getattribute(string nazwa) Metody te pobierają z obiektu sesji wartość, która umprzednio została w nim zapisana. Obydwie metody zwracają wartość 29, jeśli z podaną nazwą nie jest skojarzona żadna wartość. W mechanizmach obsługi serwmletów zgodnych ze specyfikacją Java Servlet 2.1 należy używać metody 1/8&+9/. W mechanizmach zgodnych ze specyfikacją 2.2 można używać obydwu metodm, jednak zalecane jest stosowanie metody 1/8886,98/, gdyż metoda 1/8&+9/ została uznana za przestarzałą. public void putvalue(string nazwa, Object wartolć) public void setattribute(string nazwa, Object wartoelć) Te metody kojarzą wartość atrybutu z jego nazwą. W mecmhanizmach obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1 należmy używać metody 498&+9/, natomiast w mechanizmach zgodnych ze specyfikacją m2.2 można stosować obydwie metody (rekomendowana jest metoda m7/8886,98/, gdyż metoda 498&+9/ została uznana za przestarzałą). Jeśli obiekt przekazamny w wywołaniu metody 498&+9/ lub 7/8886,98/ implementuje interfejs 884#/77322.2178/2/6, to po zapisaniu tego obiektu w sesji jest wywoływana jego metoda :+9/392.. Podobnie, jeśli obiekt implementuje interfejs 884#/77322.2178/2/6, po jego usunięciu z sesji jest wywoływana metoda :+9/%2,392. tego obiektu. public void removevalue(string nazwa) public void removeattribute(string nazwa) Obydwie te metody powodują usunięcie wartości skojarmzonych z podaną nazwą. Jeśli usuwana wartość implementuje interfejs 884#/77322.2178/2/6, wywoływana jest jej metoda :+9/%2,392.. W mechanizmach obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1 należy używać mmetody 6/3:/&+9/. W mechanizmach zgodnych ze specyfikacją 2.2 preferowanme jest użycie metody 6/3:/886,98/, choć w celu zapewnienia zgodności z poprzednimi wersjami oprogramowania można także używać metody 6/3:/&+9/ (uznawanej za przestarzałą).
198 Część I Serwlety 2.1 i 2.2 public String[] getvaluenames() public Enumeration getattributenames() Te metody zwracają nazwy wszystkich atrybutów w danemj sesji. W przypadku mechanizmów obsługi serwletów zgodnych ze specyfikacmją Java Servlet 2.1 należy używać metody 1/8&+9/+/7. W przypadku mechanizmów zgodnych ze specyfikacją 2.2 metoda ta jest wciąż dostępna, lecmz uznana za przestarzałą i z tego względu należy stosować metodę 1/8886,98/+/7. public String getid() Jest to metoda zwracająca unikalny identyfikator generowany dla każdej z sesji. Identyfikator ten jest czasami używany jako nazwa kmlucza. Dotyczy to sytuacji, gdy z sesją jest skojarzona tylko jedna wartość lub mgdy informacje o sesji są rejestrowane. public boolean isnew() Jest to metoda zwracająca wartość 869/, jeśli klient jeszcze nigdy nie korzystał z sesji (zazwyczaj dlatego, że sesja została właśnie mutworzona, a odbierane żądania jeszcze się do niej nie odwoływały). Jeśli danam sesja już istnieje od jakiegoś czasu, metoda ta zwraca wartość 0+7/. public long getcreationtime() Ta metoda zwraca czas utworzenia sesji wyrażony jakmo liczba milisekund, jakie upłynęły od początku 1970 roku (GMT). Aby przekształcić mtę wartość do powszechnie stosowanej formy, należy przekazać jmą do konstruktora klasy +8/ lub posłużyć się metodą 7/8$/27 klasy 6/136+2+/2.+6. public long getlastaccesstime() Metoda ta zwraca czas ostatniego przesłania sesji z pmrzeglądarki na serwer. Czas ten jest wyrażony jako liczba milisekund, jakime upłynęły od początku 1970 roku (GMT). public int getmaxinactiveinterval() public void setmaxinactiveinterval(int ilolćsekund) Pierwsza z tych metod pobiera, a druga określa czas m(wyrażony w sekundach), w którym klient musi nadesłać żądanie, aby sesja niem została automatycznie unieważniona. Jeśli w wywołaniu metody 7/8+2+-8:/28/6:+ jest podana wartość mniejsza od zera, dana sesja nigdy nie zostmanie automatycznie unieważniona. Należy pamiętać, iż limit czasu oczekimwania sesji jest przechowywany na serwerze i nie odpowiada dacie wygmaś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 im usunięcie z niej wszystkich skojarzonych z nią obiektów.
Rozdział 9. Śledzenie sesji 199 Kojarzenie informacji z sesj Zgodnie z tym, co podano w poprzednim podrozdziale, informacje skojarzone z sesją można odczytywać za pomocą metody 1/8&+9/ (stosowanej w mechanizmach obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1) oraz 1/8886,98/ (stosowanej 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ą 498&+9/, podając w jej wywołaniu klucz oraz wartość. W przypadku wykorzystywania mechanizmów zgodnych ze specyfikacją Java Servlet 2.2, należy zastosować metodę 7/8886,98/. Nazwa tej metody jest bardziej spójna z ogólnie stosowanym nazewnictwem, gdyż występują tu notacje 7/81/8 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 884#/77322.2178/2/6. Dzięki temu za każdym razem, gdy za pomocą metody 498&+9/ lub 7/8886,98/ nastąpi skojarzenie jakiegoś obiektu z sesją, zostanie wywołana jego metomda :+9/392.. Trzeba pamiętać, że metody 498&+9/ oraz 7/8886,98/ 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ą 6/3:/&+9/ (w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze specyfikacją Java Servlet 2.1) lub 6/3:/886,98/ (w przypadku korzystania z mechanizmów obsługi serwletów zgodnych ze specyfikacją 2.2). Jeśli usuwane obiekty implementują interfejs 884#/77322.2178/2/6, wywołanie którejkolwiek z tych metod spowoduje wywołanie metody :+9/%2,392. 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 6/0/6621 +1/). 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 atrybucie 46/:3978/). Założono, że w poniższym przykładzie wykorzystywane są dwie klasy klasa #34421+68 dysponująca metodą +..8/, obiekty której służą do przechowywania informacji o wybranych produktach, oraz klasa +8+31 udostępniająca statyczną metodę 1/88/ zwracającą produkt na podstawie podanego identyfikatora. Implementacje tych klas zamieszczono w podrozdziale Internetowy sklep wykorzystujący koszyki i śledzenie sesji. 884#/77327/7+6/59/781/8#/7732869/ 7/7+498&+9/6/0/6621 +1/Г6/59/781/8/+./6"/0/6/6 #34421+6837 #34421+687/7+1/8&+9/46/:3978/ 03729;7/72/+/7-/+.2/17337+ 372/;#34421+68 7/7+498&+9/46/:3978/Г37 #8621. 63.9896/59/781/8 +6+/8/68/ 0. 63.98929 37+..8/+8+311/88/. 63.989
200 Część I Serwlety 2.1 i 2.2 Koczenie sesji Sesja automatycznie staje się nieaktywna, jeśli odstęp pomiędzy kolejnymi żądaniami przekroczy czas określony przez metodę 1/8+2+-8:/28/6:+. W tym momencie automatycznie są usuwane wszelkie skojarzenia obiektów z tą sesją. To z kolei sprawia, że obiekty implementujące interfejs 884#/77322.2178/2/6 są zawiadomiane o fakcie usunięcia ich z sesji. Istnieje również sposób jawnego kończenia sesji służmy do tego metoda 2:+.+8/. Przepisywanie adresów URL przesyłanych do przegldarki 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ądarka 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 generowane przez serwlety. Adresy umieszczane na takich stronach powinny być odpowiednio zakodowane za pomocą metody /2-3./%" interfejsu 884#/6:/8"/74327/. 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: #86213612+2%"+7%");1/.29,/;1/.2 #8621+3;3;+2%"6/74327//2-3./%"3612+2%"7 39846282"+3.3;+2%" Drugim przypadkiem, gdzie podaje się adresy URL odwołujące się do tej samej witryny, jest wywołanie metody 7/2."/.6/-8 (oznacza to, że adresy te są umieszczane w nagłówku odpowiedzi 3-+832). 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 posłużyć się metodą /2-3./%". Interfejs 884#/6:/8"/74327/ udostępnia metodę /2-3./ "/.6/-8%", którą można zastosować w takich sytuacjach. Oto przykład zastosowania tej metody: #86213612+2%"+7%"74/-0+-+43;++2+9;+2/ ;1.2-+.6/7;7%" #8621+3.3;+2%"6/74327//2-3./"/.6/-8%"36127+2%" 6/74327/7/2."/.6/-8+3.3;+2%" Często się zdarza, że w chwili tworzenia serwletu nie można przewidzieć, czy w przyszł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 adresów URL odwołujących się do tej samej witryny.
Rozdział 9. Śledzenie sesji 201 Wskazane jest, aby wszystkie adresy URL odwołujce si do tej samej witryny przekształcać za pomoc metod 6/74327//2-3./%" lub 6/74327//2-3./"/.6/-8%", niezalernie od tego, czy serwlet wykorzystuje mechantizmy lledzenia sesji. Serwlet generujcy indywidualny licznik odwiedzin dla kardego urytkownika Listing 9.1 przedstawia prosty serwlet wyświetlający podstawowe informacje dotyczą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 6/59/781/8#/7732869/. Następnie serwlet sprawdza, czy w sesji zapisano atrybut typu 28/1/6 o nazwie +--/773928. Jeśli atrybut ten nie jest odnaleziony, zakłada się, że liczba wcześniejszych odwiedzin danej strony wynosi. Jeśli atrybut +--/773928 zostanie odnaleziony, serwlet pobiera jego wartość. Wartość ta jest następnie inkrementowana i ponownie kojarzona z sesją poprzez wywołanie metody 498&+9/. Następnie serwlet generuje niewielką tabelę HTML zawierającą informacje o sesji. Rysunek 9.1 przedstawia stronę wygenerowaną przez serwlet podczas pierwszej wizyty użytkownika na witrynie, a rysunek 9.2 po jej kilkukrotnym odświeżeniu. Listing 9.1. ShowSession.java 4+-+1/-36/7/6:/87 4368+:+3 4368+:+7/6:/8 4368+:+7/6:/8884 4368+:+2/8 4368+:+98 637846o+././2+7/7+6./ ++;+273;+246o+.//784//28+-+37; #34421+68+:+ 49,--+77#3;#/7732/8/2.7884#/6:/8 49,-:3..3/8884#/6:/8"/59/786/59/78Г 884#/6:/8"/74327/6/74327/ 863;7#/6:/8-/4832Г-/4832 6/74327/7/8328/28$4/8/88-+67/8# 628'68/63986/74327/1/8'68/6 #862188/ 6o+././2+7/7 884#/77327/77326/59/781/8#/7732869/ #8621/+.21 '/-+2+-3,7o917/6;/8;13.2-/74/-0+- +:+#/6:/8++78/83.1/8&+9/2+/78373;+
202 Część I Serwlety 2.1 i 2.2 /83.1/8886,98/ 28/1/6+--/773928 28/1/67/77321/8&+9/+--/773928 0+--/77392829 +--/7739282/;28/1/6 /+.21'8+Г23;/2-/ /7/ /+.21'8+4323;2/ +--/7739282/;28/1/6+--/77392828&+9/ '/-+2+-3,7o917/6;/8;13.2-/74/-0+- +:+#/6:/8++78/83.498&+9/2+/78373;+ /83.7/8886,98/ 7/7732498&+9/+--/773928Г+--/773928 39846282#/6:/8%88/7/+.'8$8/88/ "2 $"/+.212 2036+-/3$;3/7/72 $""$"2 $""2 $$4$'+6832 $"2 $2 $7/77321/8.2 $"2 $+798;36/2+2 $ 2/;+8/7/77321/86/+832$/2 $"2 $+7378+82/13.378492 $ 2/;+8/7/77321/8+78--/77/.$/2 $"2 $33.;/.22 $+--/7739282 $2 $.+2+$ #$+,3,7o91;+2//.2+3;3 49,-:3..3 378884#/6:/8"/59/786/59/78Г 884#/6:/8"/74327/6/74327/ 863;7#/6:/8-/4832Г-/4832.3/86/59/78Г6/74327/
Rozdział 9. Śledzenie sesji 203 Rysunek 9.1. Strona wygenerowana po pierwszym wykonaniu serwletu ShowSession Rysunek 9.2. Strona wygenerowana po jedenastym wykonaniu serwletu ShowSession Internetowy sklep wykorzystujcy koszyki i lledzenie sesji W tym podrozdziale przedstawiono rozbudowany przykład opisujący sposób tworzenia internetowego sklepu wykorzystującego mechanizmy śledzenia sesji. W pierwszej części podrozdziału przedstawiono sposób tworzenia stron wyświetlających informacje o sprzedawanych produktach. Kod każdej ze stron prezentujących sprzedawane produkty zawiera wyłącznie tytuł strony oraz identyfimkatory produktów, jakie mają się na niej pojawić. Sam kod HTML każdej z tych stron jest generowany automatycznie przez metody klasy bazowej na podstawie opisów produktów przechowywanych w katalogu. W drugiej części podrozdziału opisano stronę obsługującą zamawianie produktów. Strona ta kojarzy każdego z użytkowników z koszykiem i pozwala użytkownikowi na zmodyfikowanie liczby każdego z zamówionych produktów. W celu prawidłowego kojarzenia użytkowników z koszykami strona ta wykorzystuje mechanizmy
204 Część I Serwlety 2.1 i 2.2 śledzenia sesji. W trzeciej części niniejszego podrozdziału przedstawiono implementację koszyka struktury danych reprezentującej poszczególne produkty oraz zamówienia oraz katalogu produktów. Tworzenie interfejsu urytkownika Listing 9.2 przedstawia abstrakcyjną klasę bazową używaną podczas tworzenia serwletów, które mają prezentować sprzedawane produkty. Serwlet ten pobiera identyfikatory 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 4+-+1/-36/7/6:/87 4368+:+3 4368+:+7/6:/8 4368+:+7/6:/8884 4368+:+98 +7+,+3;+7863246//289--463.98+8+3179 #/6;/8./.--/438/+7,+3;/97 36/;;/8+2////28+8+31936+889o 78632+27/6;/8378+2/;32+2 '8-/9;/83./288+/137/6;/892+/7 ;;3o+/83.7/88/736+7/8$8/+7,+3;/7 49,-+,786+-8-+77+8+31 +1//8/2.7884#/6:/8 46:+8/8/8/7 46:+8/#86218/7 46:+8/#862188/ 74329-8+,-./280+836;463.98;3.79+7 /;+8+319+8+31+473.43;+.+-/7 3,/88/.38+,-8/7,/88/+;/76+ 68347Г4/o234736+-/2463.989Г+- 92+29-//78./280+836463.989 #/6;/8./.--/43+7/+8+31 +1/,97,;;3o;+8/83.+;-+ ;/83./28+27/6;/8378+2/;;3o+27 4638/-8/.:3.7/88/7#86218/7 878/78/7 8/72/;8/8/7/218 036288/7/218 8/7+8+311/88/8/7
Rozdział 9. Śledzenie sesji 205 6/+889o78632Г86/78;;/8+22+ 78632/;23;/;2+1o;9 #/6;/8./.--/43+7/+8+31 +1/,97,;;3o;+8/83.+;-+ ;/83./28+27/6;/8378+2/;;3o+27 4638/-8/.:3.7/8$8/#862188/ 8788/88/ /83.+;4/6;7/3/23-;;/8+889oГ+2+77842/.++./13463.989+8+319Г86+,46/.778+;32 2+.+2/78632/Г;;/8+/1368347;72+1o;9 Г-/2;2+;+7+-36+4/o2347432/ 32/3479+./13463.989;;/8+2/78467-793;+- o3/2/+;/2+.38--/13.+2/13463.9892036+-/ 46/7o+2/7.37/6;/896./6 +1/,3,+-3.$1/2/63;+246/8/83.Г2+/ ;32+7/6;/8.7337 +1/9,$/-337 +1/3,7.;/ 8/+7./.-43+,786+-2/+7/+8+731 +1/ ;,6+34-';/83.6.o3;9,/3.43;7/.2 ;46/1.+6-/ 49,-:3..3/8884#/6:/8"/59/786/59/78Г 884#/6:/8"/74327/6/74327/ 863;7#/6:/8-/4832Г-/4832 6/74327/7/8328/28$4/8/88-+67/8# 08/729 6/74327/7/2.66366/74327/#)$)%Г 6+463.98; 6/8962 628'68/63986/74327/1/8'68/6 39846282#/6:/8%88/7/+.'8$8/88/ "2 $"88/ 8/8/ 036288/7/218 39846282" 8/8/7 ';/82036+-/3,o./Г/+7+43832+7 43.+o+./280+836463.989Г86/132/+;7+8+319 08/29 39846282$"" /2+2./280+836463.98978/7 $ /7/ 39846282 #8621036%" 7/6:/8-36/7/6:/876./6 +1/.6/7%"3.;3o9-/7.38/7+/;86272+/ 46/78+o-++433-/83./2-3./%" 036%"6/74327//2-3./%"036%" 39846282
206 Część I Serwlety 2.1 i 2.2 "$036%"2 %$$ 8/ &%8/1/88/2 8/1/8#368/7-64832 8/1/83782 8/1/8321/7-648322 2$"2 %$$ #%$ &%3.+.337+2 $"2 2" 39846282"2$.+2+ #$$+,3,7o91;+2/8+7+3 49,-:3..3 378884#/6:/8"/59/786/59/78Г 884#/6:/8"/74327/6/74327/ 863;7#/6:/8-/4832Г-/4832.3/86/59/78Г6/74327/ Listing 9.3. KidsBooksPage.java 4+-+1/-36/7/6:/87 +7+43832+7/6;/89+8+31 +1/;;/8+-+ 78632'''93;+-+;/2/86/-2+2-7/67/.+./- +;/2+746/7o+2/.37/6;/896./6 +1/ 49,--+77.7337 +1//8/2.7+8+31 +1/ 49,-:3.28 #8621.7/;7Г+/+2./6Г63;21 7/88/7.7 7/8$8/'-2+/47/70+28+7.+./-7 Listing 9.4. TechBooksPage.java 4+-+1/-36/7/6:/87 +7+43832+7/6;/89+8+31 +1/;;/8+-+ 78632'''93;+-+;/2/.;-.3732+o-7/3498/63;- +;/2+746/7o+2/.37/6;/896./6 +1/ 49,--+77$/-337 +1//8/2.7+8+31 +1/ 49,-:3.28 #8621.7+Г+ 7/88/7.7
Rozdział 9. Śledzenie sesji 207 7/8$8/'-2+/47/73498/63;/ 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łanych przez różne strony katalogowe (przedstawione w poprzedniej części podrozdziału). Serwlet ten kojarzy każdego użytkownika z koszykiem wykorzystując przy tym mechanizmy śledzenia sesji. Ponieważ każdy użytkownik dysponuje osobnym koszykiem, jest mało prawdopodobne, że wiele wątków będzie jednocześnie próbowało uzyskać dostęp do tego samego koszyka. Niemniej jednak można wyobrazić sobie sytuację, w których mógłby nastąpić jednoczesny dostęp do tego samego koszyka.
208 Część I Serwlety 2.1 i 2.2 Rysunek 9.4. Wyniki wykonania serwletu TechBooksPage Zatem w celu zapewnienia wysokiego poziomu bezpieczeństwa kod serwletu synchronizuje dostęp do koszyków na podstawie obiektu sesji. W ten sposób inne wątki korzystające z tej samej sesji nie będą mogły równocześnie uzyskiwać dostępu do przechowywanych w niej informacji, choć wciąż będzie możliwa równoczesna obsługa żądań nadsyłanych przez różnych użytkowników. Typowe wyniki wykonania tego serwletu zostały przedstawione na rysunkach 9.5 oraz 9m.6. Listing 9.5. OrderPage.java 4+-+1/-36/7/6:/87 4368+:+3 4368+:+7/6:/8 4368+:+7/6:/8884 4368+:+98 4368+:+8/89,/636+8 ';/8+2036+-/3463.98+-Г86/+89+2/ 2+.97;379#34421+68 6/1.+6 +7;3/;o+72/7/7/Г2+43.78+;/86-36/+2//78462+/2337;/83 /784/6;7+;8+2+78632/93;+-/ 7o+.+2/+;/qГ/788;363223;37 %83;2-+;-+46/-3.2+878632/78632 46//289--463.98Г86/32+++;+Г.+8/13
Rozdział 9. Śledzenie sesji 209 8/8+78632+.3.+/23;///28.337+/.27+ 983;2-31+4+8++.6/78/78632;;/78+ 437o919-77899,32-78632318+/ ;6-2+2+-46-789+9+;/2/7 43+2/-,/1/4+6/.2/13++;+2-7 463.98; 49,--+776./6 +1//8/2.7884#/6:/8 49,-:3..3/8884#/6:/8"/59/786/59/78Г 884#/6:/8"/74327/6/74327/ 863;7#/6:/8-/4832Г-/4832 884#/77327/77326/59/781/8#/7732869/ #34421+68-+68 72-632/.7/7732 -+68#34421+687/77321/8&+9/734421+68 +23;-983;2;8;3632/723;/37 %83;2-Г869.7432937+ 9;+8-Г86/378+o.+2-;-/2/98;3632/ 0-+6829 -+682/;#34421+68 7/7732498&+9/734421+68Г-+68 #86218/6/59/781/8 +6+/8/68/ 08/29 #8621298/7#8621 6/59/781/8 +6+/8/6298/7 0298/7#862129 /;.+29378+o43.+2./280+836+/ 2/-,+Г8332+-+83Г/983;2876+0o 898++-46-73.+.337+72+/.2/ /7863246//289-/463.98+8+3179 -+68+..8/8/ /7/ /;.+29378+o43.+2+6;23./2870+836 +-,+Г8332+-+83Г/9837;2 86+0o2+78632+-46-789+79 +;/2/43+2/-,/1/4+6/7.2/13 ++;+2-463.98;+/;6-9;+1Г743.+2/ ;+683-+3-,/1/4+6++;+27/13463.989 746+;Г/.+2463.98378+2/97928737+ 28298/7 86 298/728/1/64+67/28298/7#8621 -+8-9,/636+8-/483220/ 298/7 -+687/896./6/.8/Г298/7 3+78+897+;/2+2/+/2/3.8/13Г-983;2 /3.03;+o-2/ 6/74327/7/8328/28$4/8/88-+67/8# 628'68/63986/74327/1/8'68/6 #862188/#8+897+;/2+ 39846282#/6:/8%88/7/+.'8$8/88/
210 Część I Serwlety 2.1 i 2.2 "2 $"88/ 72-632/.7/7732 &/-8368/76./6/.-+681/88/76./6/. 08/76./6/.7/ 398462826+463.98;;379 /7/ /;379/78-32+2//./2463.978Г ;;/88+,/2036+-+32 39846282 $""$"2 $""2 $./280+836$472 $/2+/.23783;+$3$'+683 8/6./636./6 +361+.3.;-/7-4346/-29Г ;78+;+2+.3+6+9,22/;+98Г78. ;778313.2/,/-978+;/2+3+2 9,/636+8036+88/6 9,/636+81/8966/2-278+2-/ #8621036%" 7/6:/8-36/7/6:/876./6 +1/.6/7%"3.;3o9-/7.3786328/7+/;7862 46/78+o-+469-9/83./2-3./%" 036%"6/74327//2-3./%"036%" ++./13463.9899/7-32/13;3797 8;36;/678+,/+;/6+-./2807+836 463.989Г347Г/13-/2/.23783;Г -,+;32-/1/4+636+o-2-/2 -,++;+2-/1/4+6;;/8+ ;4398/783;Г8++,983;21o7/2 3.+83;3Г3,343+Г;;/8+46-7 89+9+;/2/Г8643;3.9/4323;2/7 46/7o+2/8/7+/786322+7/6;/6Г46-7 /2+2+/78-,+++;+2-/1/4+67.+2/13463.989 036288/76./6/.7/ 36./68/6./68/76./6/.///288 39846282 $"2 $36./61/88/2 $36./61/8#368/7-648322 $ 036+88/6036+836./61/8%283782 $ "$036%"2 %$$ 8/2 &%36./61/88/2 %$$ $$298/72 #&% 36./61/898/72 #2 %$$ #%$2 &%89+9+;/2/2