Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00573 008235 10457854 na godz. na dobę w sumie
Head First Servlets & JSP. Edycja polska (Rusz głową!) - książka
Head First Servlets & JSP. Edycja polska (Rusz głową!) - książka
Autor: , , Liczba stron: 888
Wydawca: Helion Język publikacji: polski
ISBN: 83-7361-810-4 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> jsp i javaservlet - programowanie
Porównaj ceny (książka, ebook, audiobook).

Poznaj w niekonwencjonalny sposób nowoczesną technologię
tworzenia stron WWW

Otwórz swój umysł. Poznaj wszystko, co jest związane z serwletami i JSP, w sposób gwarantujący szybkie i skuteczne opanowanie zasad ich stosowania. Zapomnij o listingach liczących tysiące linii, długich i nużących opisach teoretycznych oraz rozbudowanych diagramach. Czytając książkę 'Head First Servlets & JSP. Edycja polska', poznasz jedną z najnowocześniejszych metod tworzenia aplikacji WWW w inny sposób. Serwlety i JSP to technologia pozwalająca na budowanie zarówno pojedynczych stron WWW, jak i złożonych dynamicznych serwisów z wykorzystaniem języka Java połączonego z kodem HTML. Aby ją prawidłowo stosować, należy poznać założenia, w oparciu o które została stworzona, oraz nauczyć się tworzyć elementy aplikacji we właściwy sposób.

Dzięki książce 'Head First Servlets & JSP. Edycja polska' serwlety i technologia Java Server Pages przestaną być dla Ciebie wiedzą z pogranicza magii. Autorzy książki, wykorzystując najnowsze elementy teorii uczenia, przedstawią Ci wszystkie zagadnienia niezbędne do rozpoczęcia projektowania i tworzenia aplikacji internetowych oraz serwisów WWW z wykorzystaniem JSP. Poznasz typowe elementy aplikacji i zasady ich budowania. Jednak, co najważniejsze, nauczysz się stosować tę wiedzę w praktyce.

Naucz się stosowania nowoczesnej technologii tworzenia aplikacji, wykorzystując nowoczesną technologię uczenia.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TREĎCI SPIS TREĎCI KATALOG KSI¥¯EK KATALOG KSI¥¯EK KATALOG ONLINE KATALOG ONLINE ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG TWÓJ KOSZYK TWÓJ KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE ZAMÓW INFORMACJE O NOWOĎCIACH O NOWOĎCIACH ZAMÓW CENNIK ZAMÓW CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Head First Servlets JSP. Edycja polska Autorzy: Bryan Basham, Kathy Sierra, Bert Bates T³umaczenie: Piotr Rajca, Miko³aj Szczepaniak ISBN: 83-7361-810-4 Tytu³ orygina³u: Head First Servlets JSP Format: B5, stron: 888 Poznaj w niekonwencjonalny sposób nowoczesn¹ technologiê tworzenia stron WWW • Dowiedz siê, czym s¹ serwlety i jak dzia³aj¹ • Poznaj model MVC • Zastosuj serwlety i JSP w praktyce • Naucz siê projektowaæ aplikacje internetowe Otwórz swój umys³. Poznaj wszystko, co jest zwi¹zane z serwletami i JSP, w sposób gwarantuj¹cy szybkie i skuteczne opanowanie zasad ich stosowania. Zapomnij o listingach licz¹cych tysi¹ce linii, d³ugich i nu¿¹cych opisach teoretycznych oraz rozbudowanych diagramach. Czytaj¹c ksi¹¿kê „Head First Servlets JSP. Edycja polska”, poznasz jedn¹ z najnowoczeġniejszych metod tworzenia aplikacji WWW w inny sposób. Serwlety i JSP to technologia pozwalaj¹ca na budowanie zarówno pojedynczych stron WWW, jak i z³o¿onych dynamicznych serwisów z wykorzystaniem jêzyka Java po³¹czonego z kodem HTML. Aby j¹ prawid³owo stosowaæ, nale¿y poznaæ za³o¿enia, w oparciu o które zosta³a stworzona, oraz nauczyæ siê tworzyæ elementy aplikacji we w³aġciwy sposób. Dziêki ksi¹¿ce „Head First Servlets JSP. Edycja polska” serwlety i technologia Java Server Pages przestan¹ byæ dla Ciebie wiedz¹ z pogranicza magii. Autorzy ksi¹¿ki, wykorzystuj¹c najnowsze elementy teorii uczenia, przedstawi¹ Ci wszystkie zagadnienia niezbêdne do rozpoczêcia projektowania i tworzenia aplikacji internetowych oraz serwisów WWW z wykorzystaniem JSP. Poznasz typowe elementy aplikacji i zasady ich budowania. Jednak, co najwa¿niejsze, nauczysz siê stosowaæ tê wiedzê w praktyce. • Serwlety i strony JSP • Architektura aplikacji internetowych i model MVC • Zasady tworzenia serwletów i aplikacji internetowych • Budowanie obiektów wchodz¹cych w sk³ad aplikacji • Tworzenie stron JSP • Stosowanie niestandardowych znaczników • Wdra¿anie aplikacji internetowych • Bezpieczeñstwo serwletów • Wykorzystywanie wzorców projektowych Naucz siê stosowania nowoczesnej technologii tworzenia aplikacji, wykorzystuj¹c nowoczesn¹ technologiê uczenia. Spis treści (skrócony) Wprowadzenie 1. Do czego służą serwlety i strony JSP? Wprowadzenie i przegląd najważniejszych zagadnień 2. Architektura aplikacji internetowej. Bardziej szczegółowy przegląd zagadnień 3. Minipodręcznik MVC. Omówienie MVC 4. Być serwletem. Żądanie i odpowiedź 5. Być aplikacją internetową. Atrybuty i obiekty nasłuchujące 6. Stan konwersacyjny. Zarządzanie sesjami 7. Być stroną JSP. Stosowanie technologii JSP 8. Strony bezskryptowe. Bezskryptowe strony JSP 9. Potęga znaczników niestandardowych. Stosowanie biblioteki JSTL 10. Kiedy JSTL nie wystarcza. Tworzenie znaczników niestandardowych 11. 12. Zachowaj je w tajemnicy, ukryj je w bezpiecznym miejscu. 13. Potęga filtrów. Filtry i opakowania 14. Korporacyjne wzorce projektowe. Wzorce i Struts A Ostateczny egzamin próbny Jak wdrożyć aplikację internetową? Wdrażanie aplikacji internetowych Bezpieczeństwo aplikacji internetowych Skorowidz 15 29 65 95 121 175 249 307 369 461 517 597 645 697 733 787 865 Spis treści (na serio) W Wprowadzenie Twój mózg koncentruje siê na serwletach. W tym rozdziale Ty próbujesz siê czegoś nauczyæ, a Twój mózg robi Ci przys³ugê i nie przyk³ada siê do zapamiêtywania zdobytej wiedzy. Twój mózg myśli sobie: „Lepiej zostawiê miejsce w pamiêci na bardziej istotne informacje, na przyk³ad: jakich dzikich zwierz¹t nale¿y unikaæ b¹dź czy je¿d¿enie nago na snowboardzie jest dobrym pomys³em”. A zatem w jaki sposób mo¿esz przekonaæ swój mózg, ¿e Twoje ¿ycie zale¿y od poznania serwletów? Dla kogo jest ta książka? Wiemy, co sobie myśli Twój mózg Metapoznanie Zmuś swój mózg do posłuszeństwa Czego potrzebujesz, aby skorzystać z tej książki? Zdajemy egzamin certyfikujący Redaktorzy techniczni Podziękowania 16 17 19 21 22 24 26 28 5 1 Do czego służą serwlety i strony JSP? Aplikacje internetowe s¹ super. Ile znasz normalnych aplikacji o graficznym interfejsie u¿ytkownika, których u¿ywaj¹ miliony osób na ca³ym świecie? Jako programista aplikacji internetowych mo¿esz uwolniæ siê od problemów z wdra¿aniem, jakie wystêpuj¹ w przypadku tworzenia wszystkich standardowych aplikacji, i udostêpniaæ swoje aplikacje wszystkim, którzy posiadaj¹ przegl¹darki WWW. Jednak do tego bêdziesz potrzebowaæ serwletów i stron JSP. Bêdziesz ich potrzebowaæ, poniewa¿ zwyk³e, statyczne strony HTML by³y dobre… w latach 90. Zatem dowiedz siê, jak zmieniæ witrynê WWW w aplikacjê internetow¹. Kluczowe elementy strumienia żądania: ➤ metoda HTTP (akcja, którą należy podjąć), ➤ docelowa strona (adres URL), ➤ parametry formularza (np. argumenty danej metody). Żądanie HTTP Odpowiedź HTTP Cele egzaminu Czym zajmuje się serwer WWW i klient oraz w jaki sposób porozumiewają się ze sobą Dwuminutowy kurs języka HTML Czym jest protokół HTTP? Anatomia żądań GET i POST oraz odpowiedzi protokołu HTTP Lokalizacja stron WWW przy użyciu adresów URL Serwery WWW, strony statyczne i CGI Serwlety bez tajemnic: pisanie, wdrażanie i uruchamianie serwletów Technologia JSP jest efektem wprowadzenia języka Java do kodu HTML 30 34 35 38 43 48 52 58 62 Przeglądarka internetowa Klient Kluczowe elementy strumienia odpowiedzi: ➤ kod stanu (określający, czy dane żądanie zostało pomyślnie przetworzone), typ zawartości (tekst, obraz, HTML itp.), zawartość (rzeczywisty kod HTML, obraz itp.). Serwer Przeglądarka internetowa Klient ➤ ➤ Serwlet Kontroler 2Architektura aplikacji internetowej Serwlety potrzebuj¹ pomocy. Kiedy jest odbierane ¿¹danie, ktoś musi utworzyæ egzemplarz serwletu albo przynajmniej utworzyæ w¹tek, który bêdzie umia³ obs³u¿yæ ¿¹danie. Ktoś musi wywo³aæ metodê doPost() lub doGet() serwletu. Ktoś musi przekazaæ ¿¹danie do serwletu oraz odebraæ to, co serwlet wygeneruje w odpowiedzi. Ktoś musi zarz¹dzaæ ¿yciem, śmierci¹ oraz zasobami u¿ywanymi przez serwlet. W tym rozdziale bêdziemy pisaæ o kontenerze i po raz pierwszy przyjrzymy siê wzorcowi MVC. JS P WIDOK 6 Stara klasa Javy class Foo { void bar() { doBar(); } } Model BD Cele egzaminu Czym jest kontener oraz co nam daje? Jak to wszystko wygląda w kodzie (co sprawia, że serwlet jest serwletem)? Określanie nazw serwletów i kojarzenie ich z adresami URL w deskryptorze wdrożenia Opowiadanie: Bob buduje witrynę swatającą (wprowadzenie do wzorca MVC) Ogólne informacje i przykład wzorca model-widok-kontroler (MVC) „Działający” deskryptor wdrożenia (DD) Jaka w tym wszystkim jest rola platformy J2EE? 66 67 72 74 78 82 92 93 3 Minipodręcznik MVC Tworzenie i wdra¿anie aplikacji internetowych MVC. Nadszed³ czas, aby utrudziæ nasze d³onie pisaniem formularzy HTML, kontrolerów serwletów, modeli (zwyk³ych, tradycyjnych klas Javy), deskryptora rozmieszczenia w formacie XML oraz widoku opartego na stronach JSP. Najwy¿sza pora zbudowaæ, wdro¿yæ i przetestowaæ tak¹ aplikacjê. Najpierw jednak musimy przygotowaæ odpowiednie środowisko wytwarzania aplikacji. Nastêpnie musimy przygotowaæ środowisko wdra¿ania, postêpuj¹c przy tym zgodnie ze specyfikacj¹ serwletów i JSP oraz wymaganiami Tomcata. Owszem… tworzymy ma³¹ aplikacjê, jednak niemal ¿adna aplikacja nie jest na tyle ma³a, by nie mo¿na w niej by³o wykorzystaæ wzorca MVC. tomcat tomcat webapps Piwo-w1 Katalogi specyficzne dla Tomcata Ta nazwa katalogu reprezentuje także katalog główny kontekstu, który jest wykorzystywany przez Tomcata podczas odnajdywania zasobów wskazywanych przez adresy URL. Bardziej szczegółowo zajmiemy się tym zagadnieniem w rozdziale poświęconym wdrażaniu aplikacji internetowych. Część specyfikacji serwletów WEB-INF classes lib 96 97 100 103 105 108 110 111 115 116 122 123 129 133 140 145 147 154 161 164 168 7 html body ... /body /html ... form.html wynik.jsp webapp . . /webapp web.xml Ten plik web. xml MUSI się znajdować w katalogu WEB-INF Cele egzaminu Zbudujmy aplikację internetową MVC — pierwszy projekt Tworzenie środowisk wytwarzania i wdrażania aplikacji Tworzenie i testowanie kodu HTML początkowej strony formularza Tworzenie deskryptora wdrożenia (DD) Tworzenie, kompilacja, wdrażanie i testowanie serwletu kontrolera Projektowanie, tworzenie i testowanie komponentu modelu Rozszerzenie kontrolera o wywołania modelu Tworzenie i wdrożenie komponentów widoku (to jest JSP) Rozszerzenie serwletu o wywołanie strony JSP Twoja aplikacja com example Ta struktura pakietu niczym nie różni się od struktury, której użyliśmy w przygotowanym wcześniej środowisku wytwarzania aplikacji. Jeśli nie składujesz swoich klas w plikach JAR (omówimy te pliki w dalszej części tej książki), koniecznie MUSISZ umieścić strukturę katalogów pakietu bezpośrednio pod katalogiem WEB-INF/classes. web model 0010 0001 1100 1001 0001 0011 0101 0110 0010 0001 1100 1001 0001 0011 0101 0110 Idempotencja to nic wstydliwego… 4 Być serwletem Serwlety ¿yj¹, by obs³ugiwaæ klientów. Zadaniem serwletu jest obs³uga ¿¹dañ klientów i odsy³anie do klienta w³aściwych odpowiedzi. Ż¹danie mo¿e byæ zupe³nie proste, np. prześlij mi stronê powitaln¹, lub znacznie bardziej skomplikowane, np. wygeneruj zamówienie na podstawie zawartości mojego koszyka. Ż¹danie obejmuje dane kluczowe, a kod Twojego serwletu musi wiedzieæ, jak nale¿y te dane odszukaæ i jak mo¿na ich u¿yæ. Co wiêcej, kod serwletu musi wiedzieæ, jak odes³aæ odpowiedź. A jeśli nie… Cele egzaminu Życie serwletu w kontenerze Inicjalizacja i wątki serwletu RZECZYWISTYM celem serwletu jest obsługa żądań GET i POST Historia pewnego niepowtarzalnego żądania Co sprawia, że przeglądarka wysyła żądanie GET albo żądanie POST? Wysyłanie i stosowanie parametrów Dobrze, wiemy już, do czego służy klasa Request… przyjrzyjmy się teraz klasie Response Możesz ustawiać nagłówki odpowiedzi, możesz dodawać nagłówki odpowiedzi Przekierowania a przydzielanie żądania Przypomnienie: HttpServletResponse NIEpowtarzalne Serwlet wykorzystuje dane dołączone do żądania POST do zaktualizowania bazy danych. GET ... ... HTTP/1.1 200 OK ...................... html head ... /head body img src=... /body /html BD Serwlet Serwer odsyła odpowiedź z wygenerowanym kodem strony HTML. Klient 5 Być aplikacją internetową Żaden serwlet nie dzia³a samodzielnie. We wspó³czesnych aplikacjach internetowych osi¹ganie zamierzonego celu jest mo¿liwe dziêki wspó³pracy wielu komponentów. Stosowane s¹ komponenty modelu, widoku oraz kontrolera. Wykorzystuje siê tak¿e ró¿ne klasy pomocnicze. Jednak w jaki sposób wszystkie te elementy wspólnie tworz¹ jedn¹ aplikacjê internetow¹? W jaki sposób komponenty mog¹ wspólnie korzystaæ z pewnych informacji? Jak ukrywaæ pewne informacje? Jak zapewniæ bezpieczeñstwo informacji podczas wykonywania w¹tków? Od odpowiedzi na te pytania mo¿e zale¿eæ Twoja praca. Atrybuty kontekstu a w i a t s u serwlet Context Listener ustawia pobiera w ia usta BD Połączenie z bazą danych „Użytkownicy pracujący równocześnie” 42 „Adres poczty administratora” foo@wickedlysmart.com serwlet Dostęp do tych atrybutów ma każdy składnik aplikacji. Atrybuty sesji KoszykZa ku pów ustawia a r w ia p b ie o u s t a serwlet Serwlet A serwlet Serwlet B pobiera pobiera pobiera serwlet html body jsp:setProperty name=”foo” property=”bar” /body /html JSP pobiera html body jsp:setProperty name=”foo” property=”bar” /body /html Widok JSP Dostępne tylko dla komponentów z dostępem do określonego obiektu HttpSession Atrybuty ŻĄDANIA „RekomendacjaPiwosza” Moose Drool” ustawia serwlet Kontroler pobiera html body jsp:setProperty name=”foo” property=”bar” /body /html Widok JSP Dostępne tylko dla komponentów z dostępem do określonego obiektu ServletRequest Cele egzaminu Wybawieniem są parametry inicjalizacji oraz obiekt ServletConfig Jak strona JSP może uzyskać dostęp do parametrów inicjalizacji serwletu? Wybawieniem są parametry inicjalizacji kontekstu Porównanie obiektów ServletConfig oraz ServletContext Chcemy obiektu ServletContextListener Przewodnik: prosty obiekt ServletContextListener Kompilacja, wdrażanie i testowanie obiektu nasłuchującego Cała historia — obiekt nasłuchujący kontekstu Osiem interfejsów obiektów nasłuchujących — nie tylko zdarzenia kontekstu Czym dokładnie jest atrybut i jakie są dla niego rodzaje zasięgów Interfejs API dla atrybutów — ciemna strona atrybutów Zasięg kontekstu nie zapewnia bezpieczeństwa wątków! Jak można zapewnić bezpieczeństwo wątków podczas przetwarzania atrybutów kontekstu? Próba wykorzystania synchronizacji Czy atrybuty sesji są bezpieczne z punktu widzenia wielowątkowości? Zły model jednowątkowy Tylko atrybuty żądania i zmienne lokalne są bezpieczne z punktu widzenia wielowątkowości! Atrybuty żądania i przydzielanie żądań 176 178 183 185 187 192 196 204 206 208 213 217 220 222 223 226 229 230 231 8 6 Stan konwersacyjny Serwery WWW nie maj¹ pamiêci krótkoterminowej. Zaraz po odes³aniu do nas odpowiedzi serwery WWW zapominaj¹, kim jesteśmy. Kiedy wysy³amy kolejne ¿¹danie, docelowy serwer WWW ju¿ nas nie rozpoznaje. Innymi s³owy, serwery WWW nie pamiêtaj¹ ani tego, czego ¿¹daliśmy w przesz³ości, ani tego, co do nas wys³a³y w ramach odpowiedzi. Zupe³nie nic! Jednak czasami przechowywanie informacji o stanie konwersacji z klientem i korzystanie z niego podczas obs³ugi kolejnych ¿¹dañ jest konieczne. Koszyk w sklepie internetowym nie dzia³a³by, gdyby u¿ytkownik musia³ wybieraæ wszystkie towary i realizowaæ zamówienie w ramach jednego ¿¹dania. Ciasteczka Oto Twoje ciasteczko z identyfikatorem sesji w środku… ”Set-Cookie” jest po prostu kolejnym nagłówkiem wysyłanym w ramach odpowiedzi. HTTP/1.1 200 OK Set-Cookie: JSESSIONID=0AAB6C8DE415 Content-Type: text/html Date: Wed, 19 Nov 2003 03:25:40 GMT Server: Apache-Coyote/1.1 Connection: close html ... /html Odpowiedź HTTP Dobrze, oto moje ciasteczko odsyłane z kolejnym żądaniem. ”Cookie” jest kolejnym nagłówkiem wysyłanym w ramach żądania HTTP. POST /wybor/wybierzSmakPiwa2. do HTTP/1.1 Host: www.wickedlysmart.com User-Agent: Mozilla/5.0 Cookie: JSESSIONID=0AAB6C8DE415 Accept: text/xml.application/xml.application/ xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x- msg,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Cele egzaminu To ma być konwersacja (jak działają sesje?) Identyfikatory sesji, ciasteczka oraz pozostałe podstawy działania sesji Przepisywanie adresów URL, sposób rozwiązania problemu Kiedy sesje stają się nieaktualne — usuwanie sesji błędnych Czy ciasteczka mogą mieć także inne zastosowania oprócz obsługi sesji? Kluczowe momenty w życiu obiektu HttpSession Nie zapominaj o interfejsie HttpSessionBindingListener Migracja sesji Przykłady klas nasłuchujących 250 252 257 263 267 276 280 282 283 287 Żądanie HTTP 7 Być stroną JSP Strona JSP staje siê serwletem. Serwletem, którego nie musisz tworzyæ. Kontener przegl¹da kod Twojej strony JSP, t³umaczy go na kod źród³owy jêzyka programowania Java i kompiluje tak przet³umaczony kod na postaæ pe³nowartościowej klasy serwletu Javy. Musisz jednak wiedzieæ, co dzieje siê w czasie konwertowania Twojego kodu strony JSP na kod Javy. W ramach kodu JSP mo¿esz co prawda umieszczaæ kod Javy, ale czy na pewno powinieneś? A jeśli w kodzie stron JSP nie umieszczamy ¿adnych wyra¿eñ jêzyka Java, to co znajdzie siê w tym kodzie? Przyjrzymy siê sześciu rodzajom elementów JSP — z których ka¿dy ma swoje przeznaczenie i, no niestety, odmienn¹ sk³adniê. Dowiesz siê, co i dlaczego mo¿na umieszczaæ w kodzie stron JSP. Dowiesz siê tak¿e, czego nie nale¿y umieszczaæ w kodzie stron JSP. pisze html body jsp:setProperty name=”foo” property=”bar” /body /html MojJSP.jsp jest tłumaczony na package head- first; import javax. servlet. HttpServlet.*; MojJSP_jsp.java kom pilo w any w jest wczytywany i inicjalizowany jako 0010 0001 1100 1001 0001 0011 0101 0110 MojJSP_jsp.class Obiekt serwletu Serwlet MojJSP_jsp Cele egzaminu Tworzymy prostą stronę JSP wykorzystującą zmienną out i dyrektywę page Wyrażenia JSP, zmienne oraz deklaracje Czas się zapoznać z wygenerowanym serwletem Zmienna out nie jest jedynym obiektem domyślnym… Cykl życia i inicjalizacja stron JSP Skoro już poruszyliśmy ten temat… porozmawiajmy o trzech dyrektywach Czy skryptlety można uznać za niebezpieczne? Oto EL Ale zaczekaj… nie widzieliśmy jeszcze akcji 308 309 314 322 324 332 340 343 349 9 8 Strony bezskryptowe Porzuæ skrypty. Czy wspó³pracuj¹cy z Tob¹ projektanci stron internetowych naprawdê musz¹ znaæ Javê? Czy oczekuj¹ oni od programistów Javy, aby byli jednocześnie np. grafikami? A jeśli przyjmiemy nawet, ¿e Ty jesteś jedynym cz³onkiem zespo³u, czy rzeczywiście chcia³byś umieszczaæ rozbudowane fragmenty kodu Javy w swoich stronach JSP? Czy¿ nie nasuwa Ci siê określenie „koszmar konserwacji oprogramowania”? Pisanie stron bezskryptowych jest nie tylko mo¿liwe, ale sta³o siê znacznie prostsze i bardziej elastyczne w specyfikacji JSP 2.0, g³ównie dziêki nowemu jêzykowi wyra¿eñ. Dziêki temu, i¿ bazuje on na jêzyku JavaScript oraz XPATH, projektanci stron mog¹ go stosowaæ bez najmniejszych problemów; zreszt¹ tak¿e Ty go polubisz (kiedy ju¿ siê do niego przyzwyczaisz). Jednak EL ma tak¿e pewne pu³apki. Jego wyra¿enia wygl¹daj¹ jak wyra¿enia Javy, jednak nimi nie s¹. Czasami wyra¿enia EL dzia³aj¹ inaczej ni¿ wyra¿enia Javy o identycznej sk³adni, a zatem musisz uwa¿aæ! Nie oczekujcie ode MNIE odrzucania wszystkich nadmiarowych znaczników otwierających i zamykających. Cele egzaminu Które atrybuty są komponentami JavaBean Standardowe akcje: useBean, getProperty oraz setProperty Czy można tworzyć polimorficzne referencje do komponentów? Rozwiązaniem jest użycie atrybutu param Konwersja właściwości Uratował nas język wyrażeń (EL) Stosowanie operatora kropki (.) do uzyskiwania dostępu do właściwości oraz odwzorowywania wartości Operator [] daje nam więcej możliwości (listy, tablice…) Więcej szczegółów o operatorach kropki (.) oraz [] Obiekty domyślne języka EL Funkcje języka EL i obsługa wartości „null” Szablony wielokrotnego użytku — dwa rodzaje „dołączania” Standardowa akcja jsp:forward Ona nie wie jeszcze o znacznikach JSTL (zapowiedź) Przegląd standardowych akcji i dołączania 370 371 374 380 386 389 394 396 397 402 409 415 426 437 441 442 1 Plik nagłówka (”Naglowek.jspf”) Rozszerzenie.jspf jest obecnie standardem stosowanym dla segmentów JSP (takie segmenty były niegdyś znane jako „fragmenty”). img src=”images/Web-Services.jpg” br em strong Wiemy, jak ułatwić stosowanie protokołu SOAP. /strong /em br 2 Kontakt.jsp html body @ include file=”Naglowek.jspf” br em Możemy pomóc. /em br br Skontaktuj się z nami: ${initParam.glownyEmail} br @ include file=”Stopka.html” /body /html Plik stopki (”Stopka.jsp”) 3 a href=”index.html” strona domowa /a 1 2 3 Zwróć uwagę na usunięcie z dołączanych plików wszystkich znaczników HTML i BODY. Uwaga: przedstawiona idea odrzucania otwierających i zamykających znaczników dotyczy OBU mechanizmów dołączania — standardowej akcji jsp:include oraz dyrektywy include. 10 9 Potęga znaczników niestandardowych Czasami potrzebujemy czegoś wiêcej ni¿ tylko jêzyka wyra¿eñ (EL) i akcji standardowych. Co bêdzie, jeśli zechcesz u¿yæ pêtli do przeszukania danych sk³adowanych tablicy i wyświetlenia po jednym elemencie w ka¿dym wierszu generowanej dynamicznie tabeli HTML? Oczywiście zdajesz sobie sprawê z tego, ¿e mo¿na w tym celu b³yskawicznie skonstruowaæ odpowiedni¹ pêtlê w skryptlecie. Jednak staramy siê nie u¿ywaæ kodu skryptowego. To ¿aden problem. Gdyby jêzyk wyra¿eñ (EL) oraz akcje standardowe okaza³y siê niewystarczaj¹ce, to zawsze mo¿na wykorzystaæ znaczniki niestandardowe. W kodzie stron JSP stosowanie ich jest równie proste co stosowanie akcji standardowych. Najlepsze jest to, ¿e ktoś ju¿ napisa³ takie znaczniki, których najprawdopodobniej bêdziesz potrzebowa³, i umieści³ je w standardowej bibliotece znaczników JSP (ang. JSP Standard Tag Library, w skrócie JSTL). W tym rozdziale dowiesz siê, jak u¿ywaæ znaczników niestandardowych, a w nastêpnym — jak tworzyæ w³asne znaczniki. table Atrybut żądania typu ArrayList c:forEach var= elementListy items= ${filmy} c:forEach var= film items= ${elementListy} a n z td ${film} /td r t ę n /c:forEach w e w Jedna z tablic łańcuchów, która została przypisana do atrybutu ”var” zewnętrznej pętli. a n z r t ę n w e z a l t ę p a l t ę p /c:forEach /table Z pierwszej tablicy typu String[] Z drugiej tablicy typu String[] Cele egzaminu Pętle bez skryptów: c:forEach Kontrola warunkowa przy wykorzystaniu znaczników c:if oraz c:choose Zastosowanie znaczników c:set oraz c:remove Dzięki znacznikowi c:import mamy do dyspozycji aż trzy metody dołączania treści Dostosowywanie dołączanej zawartości Realizacja tego samego zadania za pomocą znacznika c:param Stosowanie znacznika c:url do realizacji wszystkich zadań związanych z obsługą hiperłączy Tworzenie własnych stron o błędach Znacznik c:catch , który przypomina trochę… konstrukcję try-catch Co będzie, jeśli uznamy za niezbędne użycie znacznika SPOZA biblioteki JSTL? Zwróć uwagę na element rtexprvalue Co może się znaleźć w ciele znacznika Klasa obsługująca znacznik, deskryptor TLD i strona JSP Podelement uri elementu taglib jest tylko nazwą, nie lokalizacją Kiedy strona JSP wykorzystuje więcej niż jedną bibliotekę znaczników 462 464 469 473 478 480 481 483 486 490 493 498 500 501 502 505 11 10 Kiedy JSTL nie wystarcza… Czasami JSTL i standardowe akcje nie wystarczaj¹. Kiedy trzeba zrobiæ coś niestandardowego, a nie chcesz uciekaæ siê do stosowania skryptu, mo¿esz stworzyæ w³asne procedury obs³ugi znaczników. Dziêki temu projektanci stron bêd¹ mogli u¿ywaæ w projektowanych stronach Twoich znaczników, a ca³¹ „czarn¹ robotê” bêdzie, w niewidoczny sposób, realizowaæ Twoja klasa obs³ugi znacznika. Niemniej jednak czeka Ciê du¿o nauki, gdy¿ w³asne niestandardowe znaczniki mo¿na tworzyæ na trzy ró¿ne sposoby. Dwa spośród nich zosta³y wprowadzone w JSP 2.0, aby u³atwiæ nam ¿ycie (chodzi o znaczniki proste oraz pliki znaczników). Ale dlaczego? Dlaczego mu nie powiedziałeś, że możesz to zrobić? Nie wiedziałem o istnieniu znaczników niestandardowych… Myślałem, że mogę używać tylko JSTL, a żadne znaczniki należące do JSTL nie pozwalały na zrobienie tego, czego żądał szef. Och… gdybym tylko wtedy wiedział, że mogę tworzyć własne znaczniki… teraz jest już dla mnie za późno. Pamiętaj o tym… i ratuj siebie… Cele egzaminu Pliki znaczników — podobnie jak znacznik include, tylko lepiej Gdzie kontener szuka plików znaczników? Tworzenie prostej klasy obsługi znacznika A co, jeśli w zawartości znacznika pojawi się wyrażenie? Wciąż musimy znać klasyczne klasy obsługi znaczników niestandardowych Interfejs programowy klas obsługi znaczników Bardzo prosta klasyczna klasa obsługi znacznika niestandardowego Cykl istnienia znacznika klasycznego zależy od wartości zwracanych Interfejs IterationTag pozwala na wielokrotne przetwarzanie zawartości znacznika Domyślne wartości zwracane przez metody klasy TagSupport Interfejs BodyTag udostępnia dwie kolejne metody A co, jeśli znaczniki współpracują ze sobą? Wykorzystanie interfejsu programowego klasy PageContext 518 520 527 531 537 547 548 549 554 555 557 561 565 575 11 Jak wdrożyć aplikację internetową? W koñcu Twoja aplikacja jest skoñczona. Strony zosta³y dopracowane w najdrobniejszych szczegó³ach, kod jest przetestowany i zoptymalizowany, a termin… min¹³ dwa tygodnie temu. Ale gdzie to wszystko nale¿y umieściæ? Jest tyle ró¿nych katalogów, tyle zasad. Jakie nazwy powinieneś nadaæ katalogom? Jakie nazwy nada³by klient ? Do jakich zasobów tak naprawdê bêdzie siê odwo³ywaæ klient i sk¹d kontener ma wiedzieæ, gdzie nale¿y ich szukaæ? Odwołania do komponentu lokalnego N a z w a u ż y w a n a w k o d z i e , k t ó r a b ę d z i e p o s z u k i w a n a p r z y u ż y c i u J N D I . ejb-local-ref ejb-ref-name ejb/Klient /ejb-ref-name ejb-ref-type Entity /ejb-ref-type local-home com.bardzosprytni.KlientHome /local-home local com.bardzosprytni.Klient /local /ejb-local-ref JVM Serwlet To musi być w pełni kwalifikowana nazwa udostępnionego interfejsu komponentu. Odwołania do zdalnego komponentu ejb-ref ejb-ref-name ejb/KlientLokalny /ejb-ref-name ejb-ref-type Entity /ejb-ref-type home com.bardzosprytni.KlientHome /home remote com.bardzosprytni.Klient /remote /ejb-ref Serwlet JVM JVM 12 Cele egzaminu Podstawowe zagadnienia związane z wdrażaniem różnych elementów aplikacji Pliki WAR Jak NAPRAWDĘ działają odwzorowania serwletów? Konfiguracja plików powitalnych w deskryptorze rozmieszczenia Konfiguracja stron błędów w deskryptorze rozmieszczenia Konfigurowanie inicjalizacji serwletu w deskryptorze rozmieszczenia Tworzenie stron JSP zgodnych z zasadami konstrukcji dokumentów XML — dokumenty JSP 598 599 607 612 618 622 624 625 12 Zachowaj je w tajemnicy, ukryj je w bezpiecznym miejscu Twoja aplikacja internetowa jest w niebezpieczeñstwie. Problemy czyhaj¹ w ka¿dym zakamarku sieci. Nie chcesz, aby ci źli faceci pods³uchiwali transakcje realizowane w Twoim sklepie internetowym albo przechwytywali numery kart kredytowych. Nie chcesz, by byli w stanie przekonaæ Twój serwer, i¿ tak naprawdê s¹ Bardzo Wa¿nymi Klientami Posiadaj¹cymi Bardzo Du¿e Upusty. I w koñcu nie chcesz, by ktokolwiek (niezale¿nie od tego, czy dobry czy z³y) mia³ dostêp do wa¿nych informacji na temat pracowników. Czy Janek z dzia³u marketingu naprawdê musi wiedzieæ, ¿e Liza z dzia³u technicznego zarabia trzy razy wiêcej? Cele egzaminu Wielka czwórka bezpieczeństwa serwletów Jak realizować uwierzytelnianie w świecie protokołu HTTP? Dziesięć najważniejszych powodów przemawiających za deklaratywnym określaniem bezpieczeństwa Kto zajmuje się zabezpieczeniem aplikacji internetowej? Autoryzacja: role i ograniczenia Uwierzytelnianie: cztery odmiany CZTERY typy uwierzytelniania Zabezpieczanie przesyłanych informacji — protokół HTTPS śpieszy z pomocą W jaki sposób wybiórczo i deklaratywnie zaimplementować poufność i integralność danych? 646 649 652 655 656 659 673 673 678 680 10 9 8 7 6 5 4 3 2 1 Dziesięć najważniejszych powodów przemawiających za deklaratywnym określaniem bezpieczeństwa Kto nie potrzebuje lepszego opanowania sposobów wykorzystania jêzyka XML? Czêsto mo¿na w naturalny sposób odwzorowaæ stanowiska zajmowane przez poszczególne osoby w dziale informatycznym firmy. To świetnie wygl¹da w ¿yciorysie zawodowym. Pozwala na bardziej elastyczne wykorzystywanie ju¿ napisanych serwletów. Te zagadnienia pojawiaj¹ siê na egzaminie. Dziêki temu programiści zajmuj¹cy siê tworzeniem aplikacji mog¹ wielokrotnie u¿ywaæ serwletów bez konieczności dostêpu do ich kodu źród³owego. Bo tak jest fajnie! Rozwi¹zanie to pozwala na ograniczenie kosztów utrzymania wraz z rozwojem aplikacji. Jest to czynnik, którym mo¿na wyt³umaczyæ i usprawiedliwiæ wysok¹ cenê kontenera. Rozwi¹zanie to jest zgodne z ide¹ programowania bazuj¹cego na stosowaniu komponentów. 13 Potęga filtrów Filtry pozwalaj¹ na przechwytywanie ¿¹dañ. A jeśli mo¿na przechwyciæ ¿¹danie, to mo¿na tak¿e kontrolowaæ odpowiedź. Ale najlepsze w tym wszystkim jest to, ¿e serwlet nie ma o tym najmniejszego pojêcia. Serwlet nigdy nie wie, czy coś siê zdarzy³o w czasie pomiêdzy odebraniem ¿¹dania przez kontener a wywo³aniem metody service() serwletu. A co to oznacza dla Ciebie? D³u¿sze wakacje. Poniewa¿ czas, który musia³byś poświêciæ na modyfikowanie tylko jednego z istniej¹cych serwletów, mo¿esz poświêciæ na napisanie i skonfigurowanie filtra, który bêdzie mia³ wp³yw na wszystkie Twoje serwlety. Mo¿e chcia³byś dodaæ opcjê śledzenia ¿¹dañ we wszystkich serwletach tworz¹cych aplikacjê? Nie ma ¿adnego problemu. A mo¿e chcia³byś w określony sposób modyfikowaæ wyniki generowane przez wszystkie serwlety wchodz¹ce w sk³ad aplikacji? Nie ma ¿adnego problemu. A co najlepsze — nie musisz przy tym w ¿aden sposób modyfikowaæ kodu serwletów. Filtr3 doFilter(z,o,l) Stos 1 Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 2 ServletA service() Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 3 Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 4 W momencie odebrania żądania kontener wywołuje metodę doFilter() filtra Filtr3; metoda ta jest wykonywana aż do momentu wywołania metody lancuch. doFilter(). Kontener umieszcza wywołanie metody doFilter() filtra Filtr7 na wierzchołku stosu, metoda ta jest wykonywana aż do momentu wywołania metody lancuch. doFilter(). Kontener umieszcza na wierzchołku stosu metodę service() serwletu SerwletA, metoda ta jest wykonywana aż do momentu jej zakończenia, po czym jest usuwana ze stosu. Kontener przekazuje sterowanie do filtra Filtr7, który kończy wykonywanie swojej metody doFilter(); po zakończeniu metoda ta jest usuwana ze stosu. Cele egzaminu Tworzenie filtra służącego do śledzenia żądań Cykl istnienia filtrów Deklarowanie i określanie kolejności filtrów Kompresja wyników przy wykorzystaniu filtra operującego na odpowiedzi Opakowania są świetne! Prawdziwy kod filtra kompresji odpowiedzi Kod opakowania kompresji odpowiedzi Filtr3 doFilter(z,o,l) Stos 5 Kontener przekazuje sterowanie do filtra Filtr3, który kończy wykonywanie swojej metody doFilter(); po zakończeniu metoda ta jest usuwana ze stosu. Wraz z zakończeniem wykonywania tej metody kontener kończy obsługę żądania. 698 703 704 706 709 715 718 720 13 14 Korporacyjne wzorce projektowe Ktoś to ju¿ wcześniej zrobi³. Jeśli w³aśnie zaczynasz tworzyæ aplikacje internetowe w jêzyku Java, to masz du¿o szczêścia. Mo¿esz wykorzystaæ wspóln¹ m¹drośæ dziesi¹tków tysiêcy programistów, którzy ju¿ od dawna siê tym zajmuj¹ i maj¹ ju¿ firmow¹ koszulkê. Wykorzystuj¹c wzorce projektowe — zarówno te zwi¹zane z platform¹ J2EE, jak i wszelkie inne — mo¿esz uprościæ swój kod i swoje ¿ycie. W przypadku aplikacji internetowych najwa¿niejszym wzorcem projektowym jest wzorzec MVC. Zosta³ on wykorzystany w bardzo popularnym szkielecie aplikacji, o nazwie Struts, który pomaga przy tworzeniu elastycznego i ³atwego w utrzymaniu serwletu Kontrolera Frontowego. Wykorzystanie pracy innych jesteś winien samemu sobie — dziêki temu bêdziesz móg³ poświêciæ wiêcej czasu na wa¿niejsze sprawy. Struts w zarysie xml validate ... /validate mapping ... /mapping /xml struts-config. xml 1a 2a 3a 1b Komponent formularza Żądanie Serwlet akcji 2b 3b 2c Obiekt akcji Model Cele egzaminu Sprzętowe i programowe siły związane z wzorcami projektowymi Przegląd zasad związanych z projektowaniem oprogramowania Wzorce wspomagają zdalne komponenty modelu JNDI oraz RMI — krótka prezentacja Delegat Biznesowy jest obiektem pośredniczącym Uproszczenie używanych delegatów biznesowych poprzez zastosowanie lokalizatora usług Nadszedł czas na przedstawienie obiektu transferowego? Nasz pierwszy wzorzec po raz wtóry — MVC Tak! To Struts (i Kontroler Frontowy) w zarysie Przystosowanie aplikacji piwnej do korzystania ze szkieletu Struts Przegląd wzorców projektowych Widok A Bar kawowy Ostateczny Egzamin Próbny Baru Kawowego. To jest to. 69 pytañ. Charakter, zagadnienia i poziom trudności jest niemal identyczny jak na prawdziwym egzaminie. My to wiemy. Ostateczny egzamin próbny Odpowiedzi S Skorowidz 14 734 735 739 741 743 749 750 755 758 763 766 774 787 826 865 Rozdział 4. Żądanie i odpowiedź Być serwletem Użył żądania GET do zaktualizowania bazy danych. Kara musi być jak najsurowsza… żadnych zajęć z jogi przez najbliższych 90 dni. Serwlety żyją dla klientów korzystających z usług. Zadaniem serwletu jest obsługa żądań klientów i odsyłanie do klienta odpowiednich odpowiedzi. Żądanie może być zupełnie proste, np. „prześlij mi stronę powitalną”, lub znacznie bardziej skomplikowane, np. „wygeneruj zamówienie na podstawie zawartości mojego koszyka”. Żądanie obejmuje kluczowe dane, a kod Twojego serwletu musi wiedzieć, jak należy te dane odszukać i jak można ich użyć. Odpowiedź musi zawierać informacje niezbędne do wizualizowania strony (lub pobranych bajtów) przez przeglądarkę, zatem kod Twojego serwletu musi wiedzieć, jak te informacje wysłać. Okazuje się jednak, że może być inaczej… Twój serwlet może decydować o przekazaniu żądania zupełnie gdzie indziej — do innej strony, serwletu lub JSP. to jest nowy rozdział 121 Cele oficjalnego egzaminu firmy SUN Wdrażanie aplikacji internetowych Uwagi wyjaśniające: 1.1. Dla każdej z metod przesyłania żądań protokołu HTTP (takich jak GET, POST, HEAD itp.) opisz jej przeznaczenie i charakterystyki techniczne, wymień czynniki, które mogą decydować o wyborze danej metody przez klienta (zazwyczaj przeglądarkę internetową), oraz zidentyfikuj metodę klasy HttpServlet, która odpowiada danej metodzie protokołu HTTP. 1.2. Wykorzystując interfejs HttpServletRequest, napisz kod odczytujący z żądania protokołu HTTP parametry formularza HTML, odczytujący informacje nagłówka protokołu HTTP lub odczytujący z żądania ciasteczka klienta. 1.3. Wykorzystując interfejs HttpServletResponse, napisz kod, który ustawia nagłówek odpowiedzi protokołu HTTP, ustawia typ zawartości odpowiedzi, uzyskuje dostęp do strumienia tekstowego odpowiedzi, uzyskuje dostęp do strumienia binarnego odpowiedzi, przekierowuje żądanie HTTP na inny adres URL lub dodaje do odpowiedzi ciasteczka dla klienta1. 1.4. Opisz znaczenie i sekwencję zdarzeń składających się na cykl życia serwletu: (1) wczytanie klasy serwletu, (2) stworzenie egzemplarza klasy serwletu, (3) wywołanie metody init(), (4) wywołanie metody service() oraz (5) wywołanie metody destroy(). 1 Celom egzaminu związanym z ciasteczkami klienta poświęcimy więcej czasu dopiero w rozdziale dotyczącym sesji. 122 Rozdział 4 Wszystkie wymienione obok cele egzaminu zostaną dokładnie omówione jeszcze w tym rozdziale (wyjątkiem jest fragment celu 1.3 poświęcony ciasteczkom). O znacznej części zagadnień opisywanych w tym rozdziale wspominaliśmy już w rozdziale 2., jednak w tamtym rozdziale zasugerowaliśmy, iż Czytelnik nie musi zapamiętywać prezentowanych treści. W tym rozdziale MUSISZ nieco zwolnić i przystąpić do rzeczywistego studiowania przedstawianego materiału włącznie z jego zapamiętywaniem. Pamiętaj, że do szczegółów wymienionych obok celów egzaminu nie będziemy już wracali w kolejnych rozdziałach, zatem jest to Twoja ostatnia szansa na ich przeanalizowanie. Wykonuj wszystkie ćwiczenia opisywane w tym rozdziale, dokładnie analizuj cały jego materiał i w skupieniu spróbuj odpowiedzieć na pytania pierwszego egzaminu próbnego na końcu rozdziału. Jeśli odsetek prawidłowych odpowiedzi nie przekroczy 80 , ZANIM przystąpisz do lektury kolejnego (piątego) rozdziału, wróć do treści rozdziału i jeszcze raz zapoznaj się z materiałem, którego nieznajomość została ujawniona w trakcie testu. Niektóre z próbnych pytań egzaminacyjnych, które dotyczą wymienionych obok celów, zostały przeniesione do rozdziałów 5. i 6., ponieważ odpowiedź na nie wymaga dodatkowej wiedzy w zakresie omawianym dopiero w tamtych rozdziałach. Oznacza to, że po przeczytaniu tego rozdziału będziesz musiał odpowiedzieć na mniejszą liczbę pytań egzaminacyjnych niż w późniejszych rozdziałach (w ten sposób uniknęliśmy testowania wiedzy, której nie miałeś jeszcze okazji posiąść). Ważna uwaga: o ile w pierwszych trzech rozdziałach omawialiśmy przede wszystkim informacje stanowiące tło dla właściwej treści tej książki, o tyle już od następnej strony niemal cały materiał będzie bezpośrednio związany z konkretnymi fragmentami egzaminu. Żądanie i odpowiedź Serwlety są kontrolowane przez kontener W rozdziale drugim pobieżnie omówiliśmy rolę kontenera w życiu serwletu — tworzy on obiekty żądania i odpowiedzi, tworzy lub przydziela pamięć dla nowego wątku serwletu oraz wywołuje metodę service() serwletu (przekazując w postaci argumentów tej funkcji referencje do obiektów żądania i odpowiedzi). Oto krótkie przypomnienie… 1 Przeglądarka internetowa GET ... ... kontener Klient serwlet Użytkownik klika łącze obejmujące adres URL do serwletu. 2 Przeglądarka internetowa Klient kontener odpowiedź serwlet Kontener „widzi”, że żądanie jest kierowane do serwletu, zatem tworzy dwa niezbędne obiekty: 1. HttpServletResponse 2. HttpServletRequest żądanie 3 Przeglądarka internetowa Klient kontener service (żądanie, odpowiedź) serwlet w ą t e k Kontener odnajduje odpowiedni serwlet na podstawie adresu URL dołączonego do żądania, tworzy lub przydziela pamięć dla wątku obsługującego to żądanie oraz wywołuje metodę service() serwletu i przekazuje w postaci argumentów obiekty reprezentujące żądanie i odpowiedź. jesteś tutaj(cid:1) 123 Serwlety i kontener Dalszy ciąg historii życia serwletu… 4 Przeglądarka internetowa Klient kontener serwlet doGet(żądanie, odpowiedź) 5 Przeglądarka internetowa Klient kontener HTTP/1.1 200 OK ...................... html head ... /head body img src=... /body /html odpowiedź serwlet żądanie Metoda service() określa na postawie przysłanej przez klienta metody protokołu HTTP (GET, POST itp.), którą metodę serwletu należy wykonać. Klient wysłał żądanie HTTP GET, zatem metoda service() wywołuje metodę doGet() z obiektem żądania i obiektem odpowiedzi przekazanymi w formie argumentów. Serwlet wykorzystuje obiekt odpowiedzi do zapisania swojej odpowiedzi dla klienta. Odpowiedź jest odsyłana do klienta za pośrednictwem kontenera. 6 Przeglądarka internetowa HTTP/1.1 200 OK ...................... html head ... /head body img src=... /body /html kontener Klient 124 Rozdział 4 serwlet koniec wątku żądanie odpowiedź Wykonywanie metody service() kończy się, zatem odpowiedni wątek jest albo zabijany, albo zwracany do zarządzanej przez kontener puli wątków. Referencje do obiektów reprezentujących żądanie i odpowiedź wypadają poza bieżący zakres, zatem zajmowana przez nie pamięć może zostać zwolniona (w procesie odśmiecania pamięci). Klient otrzymuje wygenerowaną odpowiedź. Żądanie i odpowiedź Życie serwletu toczy się jednak nadal W naszych rozważaniach gładko przeszliśmy do środka życia serwletu, nadal jednak pozostawiliśmy bez odpowiedzi wiele istotnych pytań. Kiedy klasa serwletu jest wczytywana? Kiedy jest wywoływany konstruktor serwletu? Jak długo żyje obiekt serwletu? Kiedy powinniśmy inicjalizować zasoby naszego serwletu? Kiedy należy te zasoby zwolnić? Cykl życia serwletu jest prosty; istnieje tylko jeden stan — zainicjalizowany. Jeśli serwlet nie jest zainicjalizowany, musi się znajdować w stanie jest inicjalizowany (jeśli w danej chwili wykonywany jest jego konstruktor lub metoda init()), w stanie jest niszczony (jeśli w danym momencie wykonywana jest jego metoda destroy()) lub w stanie nie istnieje. nie istnieje konstruktor, init() destroy() zainicjalizowany service() Kontener WWW Klasa serwletu Obiekt serwletu Kontener Wczytaj klasę 101101 101101 10101000010 1010 10 0 01010 1 1010101 10101010 1001010101 1 0 1 10 10 Serwlet.class Stwórz egzemplarz serwletu (wywołaj konstruktor) W y k o n y w a n y j e s t b e z a r g u m e n t o w y k o n s t r u k t o r Tw o j e j k l a s y s e r w l e t u ( N I E p o w i n i e n e ś p i s a ć k o d u k o n s t r u k t o r a , n a l e ż y r a c z e j k o r z y s t a ć z o b s ł u g i w a n e g o p r z e z k o m p i l a t o r k o n s t r u k t o r a d o m y ś l n e g o ) . Metoda wywoływana tylko RAZ w całym cyklu życia serwletu — jej wykonanie musi się zakończyć, zanim kontener będzie mógł wywołać metodę service() init() service() destroy() W tym miejscu serwlet spędza większość swojego życia. zainicjalizowany obsługuje żądania klienta doGet(), doPost() etc. ( K a ż d e ż ą d a n i e j e s t o b s ł u g i w a n e w o s o b n y m w ą t k u . ) zainicjalizowany Kontener wywołuje metodę destroy(), aby umożliwić serwletowi zwolnienie wszelkich przydzielonych mu zasobów przed jego zniszczeniem (czyli przygotować go do procesu odśmiecania pamięci). Podobnie jak metoda init() także metoda destroy() jest wywoływana tylko raz. jesteś tutaj(cid:1) 125 Interfejs API serwletu Twój serwlet dziedziczy metody cyklu życia interface Servlet Interfejs Servlet (javax.servlet.Servlet) U WA G A : N I E p r ó b u j z a p a m i ę t y w a ć w s z y s t k i c h w y m i e n i o n y c h n a t e j s t r o n i e i n f o r m a c j i ! Z a p o z n a j s i ę t y l k o z e s p o s o b e m f u n k c j o n o w a n i a t e g o i n t e r f e j s u A P I … service(ServletRequest, ServletResponse) init(ServletConfig) destroy() getServletConfig() getServletInfo() GenericServlet service(ServletRequest, ServletResponse) init(ServletConfig) init() destroy() getServletConfig() getServletInfo() getInitParameter(String) getInitParameterNames() getServletContext() log(String) log(String, Throwable) Interfejs Servlet określa, że wszystkie serwlety muszą zawierać te pięć metod (trójka metod oznaczona pogrubieniem należy do cyklu życia serwletu). Klasa GenericServlet (javax.servlet.GenericServlet) GenericServlet jest klasą abstrakcyjną, która implementuje większość potrzebnych nam metod serwletów, włącznie z tymi zadeklarowanymi w interfejsie Servlet. Prawdopodobnie NIGDY nie będziesz samodzielnie rozszerzał tej klasy. „Zachowanie” większości Twoich serwletów będzie pochodziło właśnie z klasy GenericServlet. HttpServlet service(HttpServletRequest, HttpServletResponse) service(ServletRequest, ServletResponse) doGet(HttpServletRequest, HttpServletResponse) doPost(HttpServletRequest, HttpServletResponse) doHead(HttpServletRequest, HttpServletResponse) doOptions(HttpServletRequest, HttpServletResponse) doPut(HttpServletRequest, HttpServletResponse) doTrace(HttpServletRequest, HttpServletResponse) doDelete(HttpServletRequest, HttpServletResponse) getLastModified(HttpServletRequest) Klasa HttpServlet (javax.servlet.http.HttpServlet) Klasa HttpServlet (także abstrakcyjna) implementuje metodę service(), która jest niezbędna do zapewnienia zgodności serwletu z protokołem HTTP — metoda service() nie pobiera ŻADNYCH żądań i odpowiedzi serwletu, tylko właśnie żądania i odpowiedzi HTTP. MojSerwlet doPost(HttpServletRequest, HttpServletResponse) mojaMetodaBiznesowa() Klasa MojSerwlet (com.wickedlysmart.foo) Większość serwletowości Twojej aplikacji jest obsługiwana przez metody pochodzące z rozszerzanych nadklas. W swojej klasie serwletu musisz przykryć tylko te metody HTTP, których potrzebujesz. 126 Rozdział 4 Trzy najważniejsze momenty w cyklu życia serwletu 1 init() Kiedy jest wywoływana? Kontener wywołuje metodę init() należącą do egzemplarza serwletu po utworzeniu tego egzemplarza, ale zanim dany serwlet będzie mógł obsłużyć jakiekolwiek żądania klientów. Do czego służy? Daje programiście możliwość inicjalizowania serwletu jeszcze przed przystąpieniem do obsługi żądań klientów. 2 service() Kiedy jest wywoływana? Kiedy do serwera dociera żądanie klienta, kontener uruchamia nowy wątek serwletu lub przydziela do nowego zadania istniejący wątek z dostępnej puli wątków, po czym wymusza wywołanie metody service() danego serwletu. Do czego służy? Metoda analizuje otrzymane żądanie, określa metodę protokołu HTTP (GET, POST itp.) i wywołuje odpowiednią metodę (doGet(), doPost() itp.) udostępnianą przez dany serwlet. 3 doGet() i (lub) doPost() Kiedy są wywoływane? Metoda service() wywołuje metodę doGet() lub doPost() w zależności od metody protokołu HTTP (GET, POST itp.) otrzymanej w ramach żądania od klienta. (W tym miejscu wspominamy wyłącznie o metodach doGet() i doPost(), ponieważ są to prawdopodobnie jedyne tego typu metody, z których kiedykolwiek będziesz korzystał.) Do czego służą? Właśnie w tym miejscu zaczyna się Twój kod! Metoda doGet() lub doPost() jest odpowiedzialna za realizację właściwych ZADAŃ Twojej aplikacji internetowej. Możesz oczywiście wywoływać inne metody należące do innych obiektów, jednak wszelkie tego typu działania rozpoczynają się właśnie od tego miejsca. Żądanie i odpowiedź Czy będziesz ją przykrywał? Być może. Jeśli dysponujesz kodem inicjalizującym aplikację internetową (np. przez utworzenie połączenia z bazą danych lub zarejestrowanie innych obiektów), musisz przykryć metodę init() w klasie swojego serwletu. Czy będziesz ją przykrywał? Nie, to bardzo mało prawdopodobne. NIE powinieneś przykrywać metody service(). Twoim zadaniem jest przykrycie metody doGet() i (lub) metody doPost() oraz pozostawienie odpowiedzialności za wywołanie właściwej części kodu metodzie service() klasy HttpServlet. Czy będziesz je przykrywał? ZAWSZE, przynajmniej jedną z nich (doGet() lub doPost())! To, którą metodę (lub które metody) przykrywasz, jest sygnałem dla kontenera, które typy żądań będą obsługiwane w Twoim serwlecie. Przykładowo, jeśli nie przykryjesz metody doPost(), tym samym dasz kontenerowi jasno do zrozumienia, ze Twój serwlet nie obsługuje żądań POST protokołu HTTP. jesteś tutaj(cid:1) 127 Wątki serwletu Myślę, że już wiem, o co chodzi… zacznijmy od początku: kontener wywołuje należącą do mojego serwletu metodę init(), jeśli jednak tej metody nie przykryję w swoim kodzie, zostanie wykonana domyślna metoda init() z klasy GenericServlet. Następnie, kiedy do serwera dociera żądanie klienta, kontener uruchamia nowy wątek lub wykorzystuje jeden z wątków dostępnych w puli, po czym wywołuje metodę service(), której nie przykrywam (zatem faktycznie wykonywana jest metoda service() z klasy HttpServlet). Należąca do klasy HttpServlet metoda service() wywołuje następnie przykrytą przeze mnie metodę doGet() lub doPost(). Oznacza to, że za każdym razem, gdy wywoływana jest moja metoda doGet() lub doPost(), metoda ta jest wykonywana w osobnym wątku. Metoda service() zawsze jest wywoływana w ramach jej własnego stosu … Inicjalizacja serwletu Pierwsze żądanie klienta Drugie żądanie klienta init() Wątek A Kontener wywołuje metodę init() egzemplarza serwletu, oczywiście już po utworzeniu tego egzemplarza, ale zanim serwlet będzie mógł obsłużyć jakiekolwiek żądania klienta. Jeśli dysponujesz kodem inicjalizującym aplikację internetową (np. przez utworzenie połączenia z bazą danych lub zarejestrowanie innych obiektów), musisz przykryć metodę init() w klasie swojego serwletu. W przeciwnym razie wykonywana jest metoda init() należąca do klasy GenericServlet. doGet() service() Wątek B Kiedy do serwera WWW dociera pierwsze żądanie klienta, kontener uruchamia (lub znajduje w puli) wątek i wymusza wywołanie metody service() serwletu wskazanego w żądaniu. Zazwyczaj NIE będziesz przykrywał metody service(), zatem w większości przypadków wykonywana będzie metoda service() należąca do klasy bazowej HttpServlet. Metoda service() określa, której metody protokołu HTTP (GET, POST itp.) użyto w żądaniu, i wywołuje odpowiednią metodę serwletu (odpowiednio doGet() lub doPost()). Zdefiniowane w klasie HttpServlet metody doGet() i doPost() nie wykonują żadnych działań, zatem przynajmniej jedną z tych metod musimy przykryć w kodzie naszego serwletu. Kiedy działanie metody service() się kończy, odpowiedni wątek jest zabijany lub zwracany do puli zarządzanej przez kontener. doGet() service() Wątek C Kiedy do serwera WWW dotrze drugie (i każde kolejne) żądanie klienta, kontener ponownie utworzy lub wyszuka w puli wątek i wymusi wywołanie metody service() należącej do odpowiedniego serwletu. Zatem sekwencja metod servlet() i doGet() jest wykonywana za każdym razem, gdy do serwera dociera żądanie klienta. W dowolnym momencie będziesz miał dokładnie tyle wykonywalnych wątków, ile żądań klientów będzie obsługiwanych przez Twoją aplikację internetową — ich liczba może być ograniczana przez dostępne zasoby lub strategie (ustawienia konfiguracyjne) zastosowane w kontenerze (możesz np. wykorzystywać kontener, który umożliwia określanie maksymalnej liczby jednocześnie utrzymywanych wątków i oferuje mechanizm kolejkowania żądań oczekujących na przydział własnych wątków). 128 Rozdział 4 Żądanie i odpowiedź Każde żądanie jest realizowane w osobnym wątku! Być może miałeś okazję usłyszeć wyrażenie „każdy egzemplarz serwletu…”, takie określenie jest jednak niepoprawne. Nie istnieje wiele egzemplarzy żadnej klasy serwletu z wyjątkiem bardzo specyficznych przypadków (pracujących w rzadko stosowanym i niezalecanym modelu jednowątkowym), których w tej książce nie będziemy omawiali. Kontener uruchamia wiele wątków, których zadaniem jest przetworzenie wielu żądań adresowanych do pojedynczego serwletu. Każde żądanie klienta generuje także nową parę obiektów reprezentujących żądanie i odpowiedź. Klient A Żądanie HTTP Kontener Żądanie HTTP Przeglądarka internetowa Klient Serwlet Klient B Przeglądarka internetowa Klient wątek A wątek B odpowiedź żądanie odpowiedź żądanie Każdy klient otrzymuje osobny wątek dla każdego żądania, kontener przydziela do tego wątku nowe obiekty żądania i odpowiedzi. Nie ma niemądrych pytań P: Wciąż mam pewne wątpliwości… na powyższym rysunku przedstawiono dwóch klientów, z których każdy korzysta z własnego wątku. Co się stanie, jeśli ten sam klient wygeneruje wiele żądań? Czy kontener stworzy wów- czas po jednym wątku dla każdego klienta czy po jednym wątku dla każdego żądania? O: Po jednym wątku dla każdego żądania. Kontenera w ogóle nie interesuje, kto przysłał dane żądanie — każde otrzymane żądanie wiąże się z koniecznością stworzenia (przydzielenia) nowego wątku-stosu. P: Co się stanie, jeśli kontener wykorzystuje technikę łączenia w klastry i rozprasza aplikację internetową na więcej niż jednej wirtualnej maszynie Javy? O: Wyobraź sobie, że przedstawiony powyżej rysunek dotyczy pojedynczej wirtualnej maszyny Javy oraz że taki sam rysunek istnieje dla każdej wirtualnej maszyny należącej do naszej aplikacji. W przypadku rozproszonej aplikacji inter- netowej musiałby istnieć jeden egzemplarz konkretnego serwletu w każdej wirtualnej maszynie Javy, ale pojedyncza wirtualna maszyna Javy nadal może utrzymywać tylko jeden egzemplarz tego serwletu. P: Zauważyłem, że klasa HttpServlet należy do innego pakietu niż klasa GenericServlet… ile wobec tego istnieje pakietów dla serwletów? O: Wszystko, co wiąże się z serwletami (poza elementami technologii JSP), jest obsługiwane albo w pakiecie javax. servlet, albo w pakiecie javax. servlet.http. Nietrudno także opisać różnice pomiędzy tymi pakietami… kod związany z obsługą żądań protokołu HTTP należy do pakietu javax.servlet. http, cała reszta (ogólne klasy i interfejsy serwletów) jest zakodowana w pakiecie javax.servlet. Technologii JSP poświęcimy kilka rozdziałów w dalszej części tej książki. jesteś tutaj(cid:1) 129 Inicjalizacja serwletu Etap pierwszy. Wczytywanie i inicjalizacja Życie serwletu rozpoczyna się w momencie, w którym kontener (odpowiedzialny za realizację żądań klientów) odnajduje plik klasy serwletu. Klasa serwletu jest niemal zawsze odnajdywana już w chwili rozpoczęcia pracy kontenera (np. w momencie uruchomienia Tomcata). Uruchamiany kontener przegląda strukturę katalogów w poszukiwaniu wdrożonych aplikacji internetowych, po czym przystępuje do odnajdywania wszystkich plików klas serwletów, które składają się na znalezione aplikacje (proces odnajdywania serwletów omówimy bardziej szczegółowo w rozdziale poświęconym wdrażaniu aplikacji internetowych). Samo znalezienie pliku klasy jest tylko pierwszym krokiem. Wczytanie klasy jest drugim krokiem, którego realizacja ma miejsce albo podczas uruchamiania kontenera, albo w czasie obsługi pierwszego żądania klienta. Twój kontener może Ci umożliwić wybór odnośnie czasu wczytywania klas, ale może także wczytywać klasy w dowolnym wybranym przez siebie momencie. Niezależnie od tego, czy Twój kontener z góry przygotowuje serwlety aplikacji internetowych czy wczytuje je na bieżąco, w odpowiedzi na potrzeby zgłaszane przez użytkownika, metoda service() serwletu nigdy nie zostanie wykonana przed pełną inicjalizacją serwletu. Metoda init() zawsze kończy swoje działanie przed pierwszym wywołaniem metody service(). Twój serwlet zawsze musi zostać wczytany i zainicjalizowany ZANIM będzie mógł obsłużyć pierwsze żądania klientów. WYTĘŻ UMYSŁ Po co w ogóle istnieje metoda init()? Inaczej mówi¹c, dlaczego sam konstruktor nie wystarczy do zainicjalizowania serwletu? Jakiego rodzaju kod nale¿y umieściæ w ciele metody init()? Wskazówka: Metoda init() pobiera w formie argumentu referencjê do obiektu. Jak myślisz, jaka jest rola tego argumentu metody init() i jak (lub do czego) móg³byś tego argumentu u¿yæ? 130 Rozdział 4 nie istnieje Inicjalizacja serwletu. Kiedy obiekt staje się serwletem Żądanie i odpowiedź Najbardziej doniosłe wydarzenie w moim życiu miało miejsce w momencie, w którym Wielki Mistrz Kontener uczynił mnie serwletem przez stworzenie dla mnie obiektu ServletConfig i wywołanie metody init(). Zanim to nastąpiło, byłem zwykłym obiektem. Jednak dopiero teraz, już jako serwlet, korzystam ze specjalnych przywilejów, włącznie z możliwością rejestrowania zdarzeń, otrzymywania referencji do innych zasobów oraz tworzenia i zapisywania atrybutów dla innych serwletów… konstruktor, init() destroy() zainicjalizowany service() M u s i s z p a m i ę t a ć , ż e m e t o d a i n i t ( ) j e s t w y k o n y w a n a t y l k o r a z w c a ł y m ż y c i u s e r w l e t u ! N i e p r ó b u j w y k o n y w a ć p e w n y c h d z i a ł a ń z b y t w c z e ś n i e … k o n s t r u k t o r n i e j e s t w ł a ś c i w y m m i e j s c e m d l a o p e r a c j i c h a r a k t e r y s t y c z n y c h d l a s e r w l e t u . Początek procesu przejścia serwletu ze stanu nie istnieje w stan zainicjalizowany (który tak naprawdę oznacza gotowość do obsługi żądań klientów) wiąże się z wykonaniem konstruktora. Warto jednak pamiętać, że sam konstruktor tworzy jedynie obiekt, nie serwlet. Aby zostać pełnoprawnym serwletem, obiekt taki musi jeszcze otrzymać podstawowe atrybuty serwletowości. Kiedy obiekt staje się serwletem, otrzymuje jednocześnie wszystkie unikatowe uprawnienia, które wiążą się z funkcjonowaniem wszystkich serwletów, w tym możliwość wykorzystywania referencji do kontekstu ServletContext, za pośrednictwem którego serwlet może uzyskiwać potrzebne informacje z kontenera. Dlaczego w ogóle zajmujemy się szczegółami procesu inicjalizacji? Ponieważ gdzieś pomiędzy konstruktorem a metodą init() serwlet znajduje się w stanie serwletu Schroedingera2. Wykonywanie kodu inicjalizującego Twój serwlet (np. uzyskującego informacje o konfiguracji aplikacji internetowej lub wyszukującego referencje do innych części aplikacji) może zakończyć się niepowodzeniem, jeśli spróbujesz to zrobić zbyt wcześnie w życiu serwletu. Reguła decydująca o właściwym miejscu dla kodu inicjalizującego jest jednak dosyć prosta — wystarczy pamiętać, aby niczego nie umieszczać w konstruktorze serwletu! Serwlet nie musi zawierać żadnego kodu, którego wykonanie nie może poczekać na wywołanie metody init(). 2 Jeśli Twoja wiedza na temat mechaniki kwantowej była ostatnimi czasy zaniedbywana, możesz w wyszukiwarce Google wpisać wyrażenie Kot Schroedingera (uwaga: miłośnicy zwierząt domowych powinni unikać tego zagadnienia). Mówiąc o stanie Schroedingera, mamy na myśli coś, co nie jest ani w pełni martwe, ani w pełni żywe — znajduje się w zagadkowym punkcie pomiędzy życiem a śmiercią. jesteś tutaj(cid:1) 131 ServletConfig i ServletContext Co tak naprawdę oznacza „bycie serwletem”? Co siê stanie, kiedy serwlet przejdzie st¹d… tutaj? obiekt o f i c j a l n y , z a r e j e s t r o w a n y s e r w l e t Uwaga Oglądnij to! Nie należy mylić parametrów obiektu ServletConfig z parametrami obiektu ServletContext! Nie mieliśmy zamiaru omawiać tych zagadnień w tym miejscu, lecz w kolejnym rozdziale, jednak tak wiele osób myli ze sobą parametry obu obiektów, że warto już teraz położyć nacisk na konieczność rozróżniania tych parametrów. Zacznijmy od analizy samych nazw: W nazwie obiektu ServletConfig występuje słowo „config”, które reprezentuje „konfigurację” (ang. configuration). Tak rozumiana konfiguracja jest po prostu zbiorem wartości (ustawień) definiowanych dla serwletu w czasie wdrażania aplikacji (dla każdego serwletu istnieje osobny zbiór ustawień konfiguracyjnych). Konfiguracja obejmuje ustawienia, które z jednej strony mają być dostępne dla serwletu, ale z drugiej strony nie powinny być trwale kodowane w tym serwlecie — dotyczy to np. nazwy bazy danych. Parametry obiektu ServletConfig nie są zmieniane w całym okresie wykorzystywania serwletu po jego wdrożeniu. Aby je zmienić, będziesz musiał ponownie wdrożyć dany serwlet w swoim środowisku. Obiekt ServletContext w rzeczywistości powinien nosić nazwę AppContext (niestety, nikt nie chce uwzględnić naszej opinii na ten temat), ponieważ dla każdej aplikacji internetowej istnieje tylko jeden taki obiekt (nie jak w przypadku obiektu ServletConfig, gdzie mamy do czynienia z jednym obiektem dla każdego serwletu). Tak czy inaczej wszystkie te zagadnienia szczegółowo omówimy w następnym rozdziale — ten tekst należy traktować wyłącznie jak jego zapowiedź. 132 Rozdział 4 1 Obiekt ServletConfig ■ Dla każdego serwletu istnieje jeden obiekt ServletConfig. ■ Obiektu ServletConfig należy używać do przekazywania do serwletu informacji znanych już w czasie wdrażania aplikacji (np. nazw identyfikujących bazy danych lub komponenty EJB), których nie chcemy trwale kodować w samym serwlecie (np. w postaci jego parametrów inicjalizacji). ■ Obiektu ServletConfig należy używać także do uzyskiwania dostępu do kontekstu serwletu (obiektu ServletContext). ■ Parametry tego obiektu są konfigurowane w deskryptorze rozmieszczenia (DD). 2 Obiekt ServletContext ■ Dla każdej aplikacji internetowej istnieje dokładnie jeden obiekt ServletContext (należałoby więc nazywać te obiekty kontekstami aplikacji lub np. AppContext). ■ Obiektu ServletContext należy używać do uzyskiwania dostępu do parametrów aplikacji internetowej (także skonfigurowanych w deskryptorze rozmieszczenia). ■ Obiekt ServletContext można również wykorzystywać w roli komunikatora, za pomocą którego możesz tworzyć komunikaty (nazywane atrybutami) udostępniane pozostałym częściom aplikacji internetowej (więcej informacji na temat tego typu rozwiązań znajdziesz w kolejnym rozdziale). ■ Obiektu ServletContext należy używać także do uzyskiwania informacji o serwerze, włącznie z nazwą i wersją wykorzystywanego kontenera oraz wersją obsługiwanego interfejsu API. Żądanie i odpowiedź RZECZYWISTYM zadaniem serwletu jest jednak obsługa żądań. Dopiero wtedy życie serwletu ma jakiś sens W kolejnym rozdziale zajmiemy się obiektami ServletConfig i ServletContext, na razie musimy jednak szczegółowo przeanalizować funkcjonowanie mechanizmu obsługującego żądania i odpowiedzi. Warto pamiętać, że obiekty ServletConfig i ServletContext istnieją wyłącznie po to, by umożliwić naszemu serwletowi realizację jego najważniejszego zadania — obsługę żądań klientów! Zanim przystąpimy do omawiania sposobu, w jaki nasze obiekty kontekstu i konfiguracji mogą pomóc w wykonywaniu tego zadania, musimy wrócić do podstaw przetwarzania żądań i odpowiedzi. Wiemy już, że obiekty reprezentujące żądanie i odpowiedź są przekazywane do naszego serwletu w postaci argumentów metody doGet() lub doPost(), warto się jednak zastanowić, co szczególnego wynika z dostępu do tego typu obiektów. Co możemy zrobić z tymi obiektami, i dlaczego przywiązujemy do nich tak dużą wagę ? Przygotuj ołówek Kontener WWW Klasa serwletu Obiekt serwletu Kontener Load class 101101 101101 10101000010 1010 10 0 01010 1 1010101 10101010 1001010101 1 0 1 10 10 Serwlet.class Oznacz etykietami brakujące elementy (puste pola) przedstawionego wykresu cyklu życia serwletu (porównaj swoje odpowiedzi z wykresem przedstawionym we wcześniejszej części tego rozdziału). Dodaj własne komentarze, które pozwolą Ci lepiej zapamiętać szczegóły tego schematu. init() service() destroy() jesteś tutaj(cid:1) 133 Żądanie i odpowiedź Żądanie i odpowiedź — kluczowe obiekty będące także argumentami metody service()3 Interfejs ServletRequest (javax.servlet.ServletRequest) interfejs ServletRequest getAttribute(String) getContentLength() getInputStream() getLocalPort() getParameter() getParameterNames() // I WIELE innych metod... Interfejs Http
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Head First Servlets & JSP. Edycja polska (Rusz głową!)
Autor:
, ,

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: