Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00626 007699 11066009 na godz. na dobę w sumie
Head First Servlets & JSP. Edycja polska. Wydanie II (Rusz głową!) - książka
Head First Servlets & JSP. Edycja polska. Wydanie II (Rusz głową!) - książka
Autor: , , Liczba stron: 924
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-1814-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> jsp i javaservlet - programowanie
Porównaj ceny (książka, ebook, audiobook).

Wykorzystaj innowacyjne metody nauki i zacznij tworzyć dynamiczne aplikacje internetowe!

Statyczna strona internetowa dziś już nikogo nie zachwyca. Czas na zmianę! Pora sprawić, aby tworzone przez Ciebie aplikacje stały się wyjątkowo dynamiczne, elastyczne i interaktywne. Poznaj i wykorzystaj w tym celu nowoczesną technologię serwletów i stron JSP. Dzięki niej zbudujesz złożony serwis z zastosowaniem języka Java wplecionego w kod HTML danej strony oraz serwletu, który przetwarza informacje otrzymane z serwera, aby dostarczyć użytkownikowi gotowy obraz witryny. Aby Twoja aplikacja działała idealnie, potrzebujesz jeszcze tylko zabezpieczeń, kontenerów serwletów i modelu MCV. Jak to wszystko złożyć i uruchomić? Tego dowiesz się właśnie z naszego nowatorskiego podręcznika!

Książka 'Head First Servlets & JSP. Edycja polska. Wydanie II' napisana została w oparciu o innowacyjne metody przekazywania wiedzy, polegające na włączaniu w proces nauki elementów zabawy oraz oddziaływaniu na wiele zmysłów. To pomaga szybko zrozumieć tę technologię i osiągnąć biegłość w tworzeniu dynamicznych stron oraz aplikacji. Z bogato ilustrowanego i napisanego lekkim językiem podręcznika dowiesz się m.in., co to jest serwlet, kontener i protokół HTTP, do czego służą strony JSP oraz jak tworzyć środowisko wdrożeniowe aplikacji i zabezpieczać przesyłane informacje. Architektura aplikacji internetowej nie będzie już miała przed Tobą żadnych tajemnic!

Książka przygotowuje do najnowszej wersji egzaminu SCWCD z platformy J2EE 1.5!

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

Darmowy fragment publikacji:

Head First Servlets JSP. Edycja polska. Wydanie II Autor: Bryan Basham, Kathy Sierra, Bert Bates T‡umaczenie: Miko‡aj Szczepaniak ISBN: 978-83-246-1814-9 Tytu‡ orygina‡u: Head First Servlets and JSP, 2 ed. Format: 200x230, stron: 920 Wykorzystaj innowacyjne metody nauki i zacznij tworzy(cid:230) dynamiczne aplikacje internetowe! (cid:149) Jak korzysta(cid:230) z technologii JSP? (cid:149) Jak dzia‡aj„ serwlety? (cid:149) Jak zastosowa(cid:230) wzorzec projektowy MCV? Statyczna strona internetowa dzi(cid:156) ju¿ nikogo nie zachwyca. Czas na zmianŒ! Pora sprawi(cid:230), aby tworzone przez Ciebie aplikacje sta‡y siŒ wyj„tkowo dynamiczne, elastyczne i interaktywne. Poznaj i wykorzystaj w tym celu nowoczesn„ technologiŒ serwlet(cid:243)w i stron JSP. DziŒki niej zbudujesz z‡o¿ony serwis z zastosowaniem jŒzyka Java wplecionego w kod HTML danej strony oraz serwletu, kt(cid:243)ry przetwarza informacje otrzymane z serwera, aby dostarczy(cid:230) u¿ytkownikowi gotowy obraz witryny. Aby Twoja aplikacja dzia‡a‡a idealnie, potrzebujesz jeszcze tylko zabezpieczeæ, kontener(cid:243)w serwlet(cid:243)w i modelu MCV. Jak to wszystko z‡o¿y(cid:230) i uruchomi(cid:230)? Tego dowiesz siŒ w‡a(cid:156)nie z naszego nowatorskiego podrŒcznika! Ksi„¿ka (cid:132)Head First Servlets JSP. Edycja polska. Wydanie II(cid:148) napisana zosta‡a w oparciu o innowacyjne metody przekazywania wiedzy, polegaj„ce na w‡„czaniu w proces nauki element(cid:243)w zabawy oraz oddzia‡ywaniu na wiele zmys‡(cid:243)w. To pomaga szybko zrozumie(cid:230) tŒ technologiŒ i osi„gn„(cid:230) bieg‡o(cid:156)(cid:230) w tworzeniu dynamicznych stron oraz aplikacji. Z bogato ilustrowanego i napisanego lekkim jŒzykiem podrŒcznika dowiesz siŒ m.in., co to jest serwlet, kontener i protok(cid:243)‡ HTTP, do czego s‡u¿„ strony JSP oraz jak tworzy(cid:230) (cid:156)rodowisko wdro¿eniowe aplikacji i zabezpiecza(cid:230) przesy‡ane informacje. Architektura aplikacji internetowej nie bŒdzie ju¿ mia‡a przed Tob„ ¿adnych tajemnic! (cid:149) Przegl„d technologii serwlet(cid:243)w i stron JSP (cid:149) Architektura aplikacji internetowej (cid:149) Wdra¿anie aplikacji internetowej (cid:149) Strony bezskryptowe (cid:149) Znaczniki niestandardowe (cid:149) Zabezpieczenia serwlet(cid:243)w (cid:149) Filtry (cid:149) Korporacyjne wzorce projektowe (cid:149) Protok(cid:243)‡ HTTPS Ksi„¿ka przygotowuje do najnowszej wersji egzaminu SCWCD z platformy J2EE 1.5! Wydawnictwo Helion ul. Ko(cid:156)ciuszki 1c 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl Spis treści (skrócony) 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Wprowadzenie Do czego służą serwlety i strony JSP? Wprowadzenie i przegląd najważniejszych zagadnień Architektura aplikacji internetowej. Bardziej szczegółowy przegląd zagadnień Minipodręcznik MVC. Omówienie MVC Być serwletem. Żądanie i odpowiedź Być aplikacją internetową. Atrybuty i obiekty nasłuchujące Stan konwersacyjny. Zarządzanie sesjami Być stroną JSP. Stosowanie technologii JSP Strony bezskryptowe. Bezskryptowe strony JSP Potęga znaczników niestandardowych. Stosowanie biblioteki JSTL Kiedy JSTL nie wystarcza. Tworzenie znaczników niestandardowych Jak wdrożyć aplikację internetową? Wdrażanie aplikacji internetowych Zachowaj to w tajemnicy, ukryj w bezpiecznym miejscu. Bezpieczeństwo aplikacji internetowych Potęga filtrów. Filtry i opakowania 13. 14. Korporacyjne wzorce projektowe. Wzorce i Struts Dodatek A Końcowy egzamin próbny Skorowidz Spis treści 15 29 65 95 121 175 251 309 371 467 527 629 677 729 765 819 893 Spis treści 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 zachowam miejsce na bardziej istotne informacje, na przykład: jakich dzikich zwierząt należy unikać bądź czy jazda nago na snowboardzie jest dobrym pomysłem”. Jak w takim razie można przekonać swój mózg, że nasze życie zależy od opanowania 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 27 5 Spis treści Przegl(cid:267)darka internetowa Klient 1 (cid:303)(cid:267)danie HTTP Odpowied(cid:302) HTTP Kluczowe elementy strumienia odpowiedzi: (cid:104) kod stanu (określający, czy dane żądanie zostało pomyślnie przetworzone), (cid:104) typ zawartości (tekst, obraz, HTML itp.), (cid:104) zawartość (właściwy kod HTML, obraz itp.). 2 Do czego służą serwlety i strony JSP? Aplikacje internetowe są super. Ile tradycyjnych aplikacji z graficznym interfejsem użytkownika używanych przez miliony osób na całym świecie potrafisz wymienić? Jako programista aplikacji internetowych możesz uwolnić się od problemów wdrażania będących udziałem wszystkich standardowych aplikacji i udostępniać swoje aplikacje każdemu, kto dysponuje przeglądarką internetową. Będziesz jednak potrzebował serwletów i stron JSP. Będziesz ich potrzebował, ponieważ zwykłe, statyczne strony HTML były dobre… w latach 90. ubiegłego wieku. Zatem dowiedz się, jak przekształcić witrynę WWW w aplikację internetową. Kluczowe elementy strumienia żądania: (cid:104) metoda HTTP (akcja, którą należy podjąć), (cid:104) docelowa strona (adres URL), (cid:104) parametry formularza (np. argumenty danej metody). Serwer Cele egzaminu 30 Czym zajmuje się serwer WWW i klient oraz jak się ze sobą porozumiewają? 32 35 Dwuminutowy kurs języka HTML Czym jest protokół HTTP? 38 44 Anatomia żądań GET i POST oraz odpowiedzi protokołu HTTP 48 Lokalizacja stron WWW przy użyciu adresów URL 52 Serwery WWW, strony statyczne i CGI Serwlety bez tajemnic: pisanie, wdrażanie i uruchamianie serwletów 58 62 Technologia JSP jest efektem wprowadzenia języka Java do kodu HTML Architektura aplikacji internetowej Serwlety potrzebują pomocy. Kiedy do naszej aplikacji dociera żądanie, ktoś musi utworzyć obiekt serwletu lub przynajmniej wątek, który to żądanie obsłuży. 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 decydować o życiu, śmierci i zasobach niezbędnych do pracy serwletu. W tym rozdziale przyjrzymy się koncepcji kontenera i po raz pierwszy zwrócimy uwagę na wzorzec projektowy MVC. Serwlet Kontroler JSP Stara dobra Java class Foo { void bar() { doBar(); } } Model BD Widok 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 6 3 tomcat tomcat Katalogi właściwe dla Tomcata Nazwa tego katalogu jednocześnie reprezentuje „katalog główny kontekstu” 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. webapps Piwo-w1 Spis treści 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), deskryptorów wdrożenia w formacie XML oraz widoków opartych 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. Część specyfikacji serwletów WEB-INF html body ... /body /html form.html ... wynik.jsp Katalogi właściwe dla danej aplikacji classes lib Ten plik web.xml MUSI się znajdować w katalogu WEB-INF webapp . . /webapp web.xml 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 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 wdrażanie komponentów widoku (to właśnie JSP) Rozszerzenie serwletu o wywołanie strony JSP 96 97 100 103 105 108 110 111 115 116 0010 0001 1100 1001 0001 0011 0101 0110 WyborPiwa.class 0010 0001 1100 1001 0001 0011 0101 0110 EkspertPiwny.class 4 Być serwletem Serwlety potrzebują pomocy. 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 kluczowe dane, a kod Twojego serwletu musi wiedzieć, jak należy te dane odszukać i jak ich użyć. Co więcej, kod serwletu musi wiedzieć, jak odesłać odpowiedź. A jeśli nie… (cid:0) (cid:41)(cid:68)(cid:69)(cid:77)(cid:80)(cid:79)(cid:84)(cid:69)(cid:78)(cid:67)(cid:74)(cid:65)(cid:0) (cid:84)(cid:79)(cid:0)(cid:78)(cid:73)(cid:67)(cid:0) (cid:87)(cid:83)(cid:84)(cid:89)(cid:68)(cid:76)(cid:73)(cid:87)(cid:69)(cid:71)(cid:79)(cid:98) (cid:56)(cid:51)(cid:47)(cid:90)(cid:89)(cid:97)(cid:94)(cid:75)(cid:92)(cid:100)(cid:75)(cid:86)(cid:88)(cid:79) Serwlet wykorzystuje dane dołączone do żądania POST do zaktualizowania bazy danych. POST ... ... HTTP/1.1 200 OK html head ... /head body img src=... /body /html Serwlet DB Serwlet odsyła odpowiedź z wygenerowanym kodem strony HTML. Klient Cele egzaminu Życie serwletu w kontenerze Inicjalizacja i wątki serwletu FAKTYCZNYM celem serwletu jest obsługa żądań GET i POST Historia pewnego niepowtarzalnego żądania Co sprawia, że przeglądarka wysyła albo żą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 kontra przydział żądań Przegląd klasy HttpServletResponse 122 123 129 133 140 145 147 154 161 164 168 7 Spis treści 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. Stosujemy komponenty modelu, widoku oraz kontrolera. Wykorzystujemy także rozmaite klasy pomocnicze. Jednak w jaki sposób należy łączyć wszystkie te elementy, aby tworzyły jedną aplikację internetową? W jaki sposób komponenty mogą korzystać z tych samych informacji? Jak ukrywać pewne informacje? Jak zapewniać bezpieczeństwo informacji podczas przetwarzania wielowątkowego? Od odpowiedzi na te pytania może zależeć Twoja praca. pobiera pobiera html body jsp:setProperty name=”foo” property=”bar” /body /html JSP pobiera html body jsp:setProperty name=”foo” property=”bar” /body /html Widok JSP pobiera html body jsp:setProperty name=”foo” property=”bar” /body /html Widok JSP Cele egzaminu Wybawieniem są parametry inicjalizacji i 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 Kompletna historia — obiekt nasłuchujący kontekstu Osiem obiektów nasłuchujących nie tylko zdarzeń kontekstu Czym dokładnie jest atrybut Interfejs API atrybutów — ciemna strona atrybutów Zasięg kontekstu nie zapewnia bezpieczeństwa wątków! Analiza tego problemu w zwolnionym tempie... Próba synchronizacji Czy atrybuty sesji gwarantują bezpieczeństwo przetwarzania wielowątkowego? Interfejs SingleThreadModel Tylko atrybuty żądania i zmienne lokalne zapewniają bezpieczną wielowątkowość! Atrybuty żądania i przydział żądań 176 177 183 185 187 194 196 204 206 208 213 217 220 221 223 226 229 232 233 Atrybuty kontekstu w i a a t s u serwlet „Adres poczty administratora” foo@wickedlysmart.com pobiera serwlet u s t a w i a ContextL i s tener pobiera BD Po(cid:226)(cid:267)czenie z baz(cid:267) danych „U(cid:304)ytkownicy pracuj(cid:267)cy równocze(cid:292)nie” 42 Dost(cid:272)p do tych atrybutów ma ka(cid:304)dy sk(cid:226)adnik aplikacji. Atrybuty sesji KoszykZ a k upów Dost(cid:272)pne tylko dla komponentów z dost(cid:272)pem do okre(cid:292)lonego obiektu HttpSession Atrybuty ŻĄDANIA RekomendacjaPiwosza Moose Drool Dost(cid:272)pne tylko dla komponentów z dost(cid:272)pem do okre(cid:292)lonego obiektu ServletRequest w i a a t s ustawia a r b i e o u s t a w i a u p serwlet serwlet Serwlet A serwlet Serwlet B u s t a w i a serwlet Kontroler 8 6 Spis treści Stan konwersacyjny Serwery WWW nie mają pamięci krótkotrwałej. 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 nich podczas obsługi wielu żądań jest konieczne. Koszyk w sklepie internetowym nie mógłby działać, gdyby użytkownik musiał wybierać wszystkie towary i realizować zamówienie w ramach jednego żądania. Oto Twoje ciasteczko z identyfikatorem sesji w środku… Ciasteczka 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 Content-Length: 397 Date: Wed, 19 Nov 2003 03:25:40 GMT Server: Apache-Coyote/1.1 Connection: close html ... /html Odpowied(cid:302) 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 będzie dłuższa konwersacja, czyli jak działają sesje Identyfikatory sesji, ciasteczka i pozostałe podstawy działania sesji Przepisywanie adresów URL, sposób rozwiązania problemu Kiedy sesje stają się nieaktualne — eliminowanie zbędnych sesji Czy ciasteczka mogą mieć także zastosowania inne niż obsługa sesji? Najważniejsze momenty w życiu obiektu HttpSession Nie zapominaj o interfejsie HttpSessionBindingListener Migracja sesji Przykłady klas nasłuchujących 252 254 259 265 269 278 282 284 285 289 (cid:303)(cid:267)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. Warto jednak wiedzieć, co dzieje się w czasie konwertowania Twojego kodu strony JSP na kod Javy. W ramach kodu JSP można co prawda umieszczać kod Javy, ale czy na pewno powinniśmy to robić? A jeśli w kodzie stron JSP nie umieścimy żadnych wyrażeń Javy, co znajdzie się w kodzie naszego serwletu? Przyjrzymy się sześciu rodzajom elementów JSP — z których każdy ma swoje przeznaczenie i, niestety, odmienną składnię. Dowiesz się, co i dlaczego można umieszczać w kodzie stron JSP. Dowiesz się także, czego nie powinieneś umieszczać w tym kodzie. pisze html body jsp:setProperty name=”foo” property=”bar” /body /html MojJSP.jsp jest t(cid:226)uma- czony na kompilowany w package head- (cid:287)rst; import javax. servlet. HttpServlet.*; MojJSP_jsp.java 0010 0001 1100 1001 0001 0011 0101 0110 jest wczytywany i inicjalizowany jako obiekt serwletu MojJSP_jsp.class Serwlet MojJSP_jsp Cele egzaminu Tworzymy prostą stronę JSP wykorzystującą zmienną out i dyrektywę page Wyrażenia, zmienne i deklaracje JSP Czas zapoznać się 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 310 311 316 324 326 334 342 345 351 9 Spis treści 8 Strony bezskryptowe Porzuć skrypty. Czy współpracujący z Tobą projektanci stron internetowych naprawdę muszą znać Javę? Czy sami oczekują od programistów Javy, aby byli jednocześnie np. grafikami? A jeśli nawet przyjmiemy, że 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 dzięki nowej specyfikacji JSP 2.0, a przede wszystkim wskutek wprowadzenia nowego języka wyrażeń (EL). Ponieważ język EL bazuje na językach JavaScript i XPATH, projektanci stron mogą go stosować bez najmniejszych problemów; zresztą także Ty go polubisz (kiedy już się do niego przyzwyczaisz). Jednak EL stwarza też pewne pułapki. Jego wyrażenia wyglądają co prawda jak wyrażenia Javy, jednak w rzeczywistości nimi nie są. Niektóre wyrażenia EL działają nawet inaczej niż wyrażenia Javy o identycznej składni, zatem warto mieć się na baczności! 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 i map wartości Operator [] stwarza dodatkowe 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 wyrażeń dołączania 372 373 377 382 388 391 396 398 400 404 413 420 430 444 445 446 Nie oczekuj ode MNIE odrzucania wszystkich nadmiarowych znaczników otwierających i zamykających. 1 Plik nagłówka („Naglowek.jsp”) img src=”images/Web-Services.jpg” br em strong Wiemy jak u(cid:239)atwi(cid:202) stosowanie protoko(cid:239)u SOAP. /strong /em br 2 Kontakt.jsp html body @ include file= Naglowek.jsp br em Mo(cid:285)emy pomóc. /em br br Skontaktuj si(cid:218) z nami: ${initParam.glownyEmail} br @ include file= Stopka.html /body /html Zwróć uwagę na fakt usunięcia z dołączanych plików wszystkich znaczników HTML i BODY. 3 Plik stopki ( Stopka.jsp ) a href= index.html strona domowa /a Uwaga: przedstawiona idea odrzucania otwierających i zamykających znaczników dotyczy OBU mechanizmów dołączania — standardowej akcji jsp:include oraz dyrektywy include. 1 2 3 10 9 Spis treści 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 doskonale zdajesz sobie sprawę z możliwości błyskawicznego skonstruowania odpowiedniej pętli w skryptlecie. Z drugiej strony, staramy się nie używać kodu skryptowego. To żaden problem. Kiedy język wyrażeń (EL) i akcje standardowe okazują się niewystarczające, zawsze można wykorzystać znaczniki niestandardowe. Ich stosowanie w kodzie stron JSP jest równie proste jak korzystanie z akcji standardowych. Co więcej, znaczniki, których najprawdopodobniej będziesz potrzebował, ktoś już napisał i umieścił 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}” a r t c:forEach var=”film” items=”${elementListy}” td ${film} /td /c:forEach Jedna z tablic łańcuchów, która została przypisana do atrybutu var zewnętrznej pętli. p t l a ę w e w n ę n z pętla zewnętrzna /c:forEach /table Z pierwszej tablicy typu String[] Z drugiej tablicy typu String[] Cele egzaminu Pętle bez skryptów, c:forEach Kontrola warunkowa z użyciem znaczników c:if oraz c:choose Zastosowanie znaczników c:set i c:remove Znacznik c:import , czyli trzeci sposób dołączania treści Modyfikowanie dołączanej zawartości Realizacja tego samego zadania za pomocą znacznika c:param Znacznik c:url jako narzędzie realizacji wszystkich zadań związanych z obsługą hiperłączy Tworzenie własnych stron o błędach Znacznik c:catch , który jest jak… konstrukcja 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 468 474 479 483 488 490 491 493 496 500 503 508 510 511 512 515 11 Spis treści 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ługująca. Z drugiej strony, takie rozwiązanie wymaga od Ciebie sporo nauki, ponieważ własne, niestandardowe znaczniki można tworzyć na aż trzy różne sposoby. Dwa spośród nich (chodzi o znaczniki proste oraz pliki znaczników) wprowadzono z myślą o naszej wygodzie dopiero w specyfikacji JSP 2.0. 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? Proste klasy obsługujące znaczniki Prosty znacznik z zawartością Co zrobić, jeśli w zawartości znacznika pojawia się wyrażenie? Wciąż musimy znać klasyczne klasy obsługujące znaczniki niestandardowe Bardzo prosta, klasyczna klasa obsługi znacznika niestandardowego Cykl życia znacznika klasycznego zależy od zwracanych wartości Interfejs IterationTag pozwala na wielokrotne przetwarzanie zawartości znacznika Wartości domyślne zwracane przez metody klasy TagSupport Interfejs DynamicAttributes Interfejs BodyTag udostępnia dwie kolejne metody A co, jeśli znaczniki współpracują ze sobą? Interfejs programowy PageContext dla klas obsługi znaczników 528 530 537 541 542 547 557 559 564 565 567 584 591 595 605 11 Wdrażanie aplikacji internetowych W końcu Twoja aplikacja jest gotowa. 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 niezrozumiałych reguł. Jak powinieneś nazwać swoje katalogi? Jakich nazw użył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 ejb-local-ref ejb-ref-name ejb/Klient /ejb-ref-name ejb-ref-type Entity /ejb-ref-type Nazwa używana w kodzie, która będzie poszukiwana przy użyciu JNDI. local-home com.bardzosprytni.KlientHome /local-home local com.bardzosprytni.Klient /local /ejb-local-ref To musi być w pełni kwalifikowana nazwa udostępnionego interfejsu komponentu. JVM Serwlet Komponent LOKALNY oznacza, (cid:304)e klient (w tym przypadku jest nim serwlet) oraz komponent musz(cid:267) dzia(cid:226)a(cid:254) na tej samej wirtualnej maszynie Javy (JVM). 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 JVM JVM Serwlet 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 wdrożenia Konfiguracja stron błędów w deskryptorze wdrożenia Konfigurowanie inicjalizacji serwletu w deskryptorze wdrożenia Tworzenie stron JSP zgodnych z zasadami konstrukcji dokumentów XML: dokumenty JSP 630 631 640 644 650 654 656 657 12 12 Spis treści Zachowaj to w tajemnicy, ukryj w bezpiecznym miejscu Twoja aplikacja internetowa jest w niebezpieczeństwie. Problemy czyhają w każdym zakamarku sieci. Nie chcesz chyba, aby ci źli faceci podsłuchiwali transakcje realizowane w Twoim sklepie internetowym i przechwytywali podawane numery kart kredytowych? Nie chcesz też, by byli w stanie przekonać Twój serwer, iż tak naprawdę są Bardzo Ważnymi Klientami Liczącymi Na Bardzo Duże Upusty. I w końcu nie chcesz, by ktokolwiek (niezależnie od zamiarów) miał dostęp do poufnych informacji o pracownikach. Czy Janek z działu marketingu naprawdę musi wiedzieć, że Lucyna z działu technicznego zarabia trzy razy więcej od niego? Dziesięć najważniejszych powodów przemawiających za deklaratywnym określaniem bezpieczeństwa 10 Któż z nas nie potrzebuje więcej praktyki w pracy z dokumentami w języku 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! Takie rozwiązanie pozwala ograniczyć koszty utrzymania rozwijanej aplikacji. Jest to czynnik, którym można wytłumaczyć i usprawiedliwić wysoką cenę kontenera. Takie rozwiązanie jest zgodne z ideą programowania z wykorzystaniem komponentów. 9 8 7 6 5 4 3 2 1 Cele egzaminu Wielka Czwórka świata zabezpieczeń serwletów Jak realizować uwierzytelnianie w świecie protokołu HTTP? Dziesięć najważniejszych powodów przemawiających za deklaratywnym określaniem bezpieczeństwa Kto implementuje zabezpieczenia aplikacji internetowej? Autoryzacja: role i ograniczenia CZTERY typy uwierzytelniania Zabezpieczanie przesyłanych informacji — protokół HTTPS śpieszy z pomocą Jak należy wybiórczo i deklaratywnie implementować poufność i integralność danych? 678 681 684 687 688 690 705 710 712 13 Potęga filtrów Filtry umożliwiają przechwytywanie żądań. A skoro można przechwycić żądanie, 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 dzielącym odebranie żądania przez kontener od wywołania metody service() serwletu. 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? To także żaden problem. A co najlepsze — nie musisz przy tym w żaden sposób modyfikować kodu serwletów. Filtr3 doFilter(z,o,l) Stos 1 W momencie odebrania (cid:304)(cid:267)dania kontener wywo(cid:226)uje metod(cid:272) doFilter() (cid:192) ltra Filtr3; metoda ta jest wykonywana a(cid:304) do momentu wywo(cid:226)ania metody lancuch. doFilter(). Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 2 Kontener umieszcza wywo(cid:226)anie metody doFilter() (cid:192) ltra Filtr7 na wierzcho(cid:226)ku stosu, metoda ta jest wykonywana a(cid:304) do momentu wywo(cid:226)ania metody lancuch. doFilter(). SerwletA service() Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 3 Kontener umieszcza na wierzcho(cid:226)ku stosu metod(cid:272) service() serwletu SerwletA, metoda ta jest wykonywana a(cid:304) do momentu jej zako(cid:282)czenia, po czym jest usuwana ze stosu. Filtr7 doFilter(z,o,l) Filtr3 doFilter(z,o,l) Stos 4 Kontener przekazuje sterowanie do (cid:192) ltra Filtr7, który ko(cid:282)czy wykonywanie swojej metody doFilter(); po zako(cid:282)czeniu metoda ta jest usuwana ze stosu. Filtr3 doFilter(z,o,l) Stos 5 Kontener przekazuje sterowanie do (cid:192) ltra Filtr3, który ko(cid:282)czy wykonywanie swojej metody doFilter(); po zako(cid:282)czeniu metoda ta jest usuwana ze stosu. Wraz z zako(cid:282)czeniem wykonywania tej metody kontener ko(cid:282)czy obs(cid:226)ug(cid:272) (cid:304)(cid:267)dania. 730 Cele egzaminu 735 Tworzenie filtra śledzącego żądania 736 Cykl życia filtrów Deklarowanie i określanie kolejności filtrów 738 Kompresja wyników przy wykorzystaniu filtra operującego na odpowiedzi 741 Opakowania są świetne! 747 750 Prawdziwy kod filtra kompresji odpowiedzi Kod opakowania kompresji odpowiedzi 752 13 Spis treści 14 Korporacyjne wzorce projektowe Ktoś to już wcześniej zrobił. Jeśli właśnie zaczynasz tworzyć aplikacje internetowe w języku Java, masz dużo szczęścia. Możesz czerpać z wiedzy dziesiątek tysięcy programistów, którzy od dawna się tym zajmują i mają już swoje firmowe koszulki. 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 świecie aplikacji internetowych najważniejszym wzorcem projektowym jest MVC, który zastosowano między innymi w bardzo popularnym frameworku Struts (stworzonym z myślą o wsparciu programistów tworzących elastyczne i łatwe w utrzymaniu kontrolery frontonów serwletów). Wykorzystanie pracy innych jesteś winien samemu sobie, dzięki temu będziesz mógł poświęcić więcej czasu na ważniejsze sprawy. xml validate ... /validate mapping ... /mapping /xml XML deklaruj(cid:267)cy odwzorowania 1a 2a 3a 1b Komponent wery(cid:192) kacji formularza 2b 2c (cid:303)(cid:267)danie Kontroler 3b Komponent akcji (cid:304)(cid:267)dania Model Cele egzaminu Sprzętowe i programowe argumenty na rzecz wzorów projektowych 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 Czas poznać wzorzec Transfer Object? Wzorce warstwy biznesowej — krótki przegląd Nasz pierwszy wzorzec po raz wtóry — MVC Tak! To Struts (i wzorzec Front Controller) w zarysie Przystosowanie aplikacji piwnej do korzystania z frameworku Struts Przegląd wzorców projektowych Widok A S 14 BAR KAWOWY Końcowy Egzamin Próbny Baru Kawowego. To jest to. 69 pytań. Charakter, zagadnienia i poziom trudności jest niemal taki sam jak na prawdziwym egzaminie. Możesz nam wierzyć. Końcowy egzamin próbny Odpowiedzi Skorowidz 766 767 772 773 775 781 787 789 790 795 798 806 819 856 893 2. Bardziej szczegółowy przegląd zagadnień Architektura aplikacji internetowej Poznaj potęgę mojego kontenera… nawet tysiąc jednoczesnych uderzeń nie powali mnie na kolana. Hm… kolejna ofiara gorączki J2EE. Serwlety potrzebują pomocy. Kiedy żądanie HTTP dociera do serwera WWW, ktoś musi jeszcze stworzyć egzemplarz serwletu lub przynajmniej utworzyć nowy wątek obsługujący to żądanie. Ktoś musi przecież wywołać metodę doPost() lub doGet() serwletu. Warto też pamiętać o otrzymywaniu przez wspomniane metody dwóch kluczowych argumentów — obiektów reprezentujących żądanie i odpowiedź protokołu HTTP. Ktoś te obiekty musi oczywiście przekazać do serwletu. Ktoś musi zarządzać życiem, śmiercią i zasobami serwletu. Tym kimś jest kontener (ang. container). W tym rozdziale przyjrzymy się zasadom funkcjonowania aplikacji internetowych w ramach kontenerów i rzucimy okiem na strukturę aplikacji internetowych budowanych z wykorzystaniem wzorca projektowego MVC (ang. Model View Controller). to jest nowy rozdział (cid:23) 65 Cele oficjalnego egzaminu firmy SUN Wysokopoziomowa architektura aplikacji internetowych 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ę HttpServlet, która odpowiada danej metodzie protokołu HTTP. 1.4. Opisz znaczenie i sekwencję zdarzeń składających się na cykl życia serwletu: (1) załadowanie klasy serwletu, (2) konkretyzacja serwletu, (3) wywołanie metody init(), (4) wywołanie metody service() oraz (5) wywołanie metody destroy(). 2.1. Skonstruuj strukturę plików i katalogów dla aplikacji internetowej zawierającej (a) statyczną treść, (b) strony JSP, (c) klasy serwletów, (d) deskryptor wdrożenia, (e) biblioteki znaczników, (f) pliki JAR oraz (g) pliki klas Javy. Opisz techniki ochrony plików zasobów przed dostępem za pośrednictwem protokołu HTTP. 2.2. Opisz przeznaczenie i semantykę każdego z wymienionych dalej elementów deskryptora wdrożenia: egzemplarz serwletu, nazwa serwletu, klasa serwletu, parametry inicjalizacji serwletu, adres URL nazwanego odwzorowania serwletu. 66 Rozdział 2. Uwagi wyjaśniające: Wszystkie cele wymienione w tym podrozdziale zostaną dogłębnie przeanalizowane w pozostałych rozdziałach, zatem niniejszy rozdział należy traktować jak pierwsze spojrzenie na podstawy tego, czym szczegółowo zajmiemy się w kolejnych częściach. Innymi słowy, nie powinieneś się przejmować, jeśli po przeczytaniu tego rozdziału nie będziesz potrafił odpowiedzieć na postawione tutaj pytania (lub jeśli nie będziesz tych pytań nawet pamiętał). Na końcu tego rozdziału nie będziemy analizowali żadnych przykładowych pytań egzaminacyjnych, ponieważ ich analiza będzie możliwa dopiero po zapoznaniu się z bardziej szczegółowym materiałem zawartym w kolejnych rozdziałach. Ciesz się z prostego, wprowadzającego materiału, póki możesz! PAMIĘTAJ JEDNAK, że prezentowane w tym rozdziale zagadnienia będą nam potrzebne w kolejnych rozdziałach. Jeśli masz już pewne doświadczenie w kwestii serwletów, prawdopodobnie możesz ten rozdział jedynie przekartkować (najlepiej analizując tylko najważniejsze rysunki i wykonując ćwiczenia) i przejść do rozdziału 3. Architektura wysokopoziomowa Czym jest kontener? Serwlety nie zawierają metody main(). Serwlety są kontrolowane przez inną aplikację Javy nazywaną kontenerem. Przykładem kontenera (ang. container) jest Tomcat. Kiedy nasza aplikacja serwera WWW (np. Apache) otrzymuje żądanie dotyczące serwletu (w przeciwieństwie np. do przestarzałej, płaskiej, statycznej strony HTML), serwer nie przekazuje tego żądania bezpośrednio do wskazywanego serwletu, tylko do kontenera, w którym ten serwlet wcześniej umieszczono. Od tej pory to kontener odpowiada za przekazanie do serwletu obiektów żądania i odpowiedzi protokołu HTTP oraz za wywołanie właściwych metod serwletu (takich jak doPost() lub doGet()). żądanie GET ... ... GET ... ... komputer serwera WWW GET ... ... kod Javy aplikacja serwera WWW aplikacja kontenera WWW serwlet kod Javy komputer serwera WWW HTTP/1.1 200 OK .................... html head ... /head body img src=... /body /html odpowiedź aplikacja serwera WWW html head /head body ... /body /html html head /head body ... /body /html serwlet aplikacja kontenera WWW Przeglądarka internetowa Klient Przeglądarka internetowa Klient jesteś tutaj (cid:23) 67 Życie bez serwletów Co zrobić, jeśli mam odpowiedni kod Javy, ale nie mam ani serwletów, ani kontenerów? Jakie rozwiązanie należy zastosować w sytuacji, gdy musimy napisać program Javy, który ma obsługiwać dynamiczne żądania przychodzące do aplikacji serwera WWW (np. Apache’a), ale bez dodatkowego kontenera (takiego jak wspominany już Tomcat)? Innymi słowy, wyobraźmy sobie, że nie istnieje pojęcie serwletu i że dysponujemy jedynie standardowymi bibliotekami J2SE. W takim przypadku należy oczywiście przyjąć, że mamy możliwość takiego skonfigurowania aplikacji serwera WWW, by wywoływał naszą aplikację napisaną w Javie. Stosowanie takiego rozwiązania byłoby uzasadnione, gdyby nie była nam znana koncepcja kontenera. Wystarczy sobie wyobrazić sytuację, w której musimy stworzyć aplikację internetową, dysponując tylko klasyczną Javą. wojownik nigdy nie ucieka się do stosowania kontenerów. Taki wojownik napisałby wszystko Prawdziwy gołymi rękami, korzystając wyłącznie z klas J2SE. Wymień kilka funkcji, które musielibyśmy zaimplementować w aplikacji J2SE, gdybyśmy nie mogli korzystać z aplikacja kontenera WWW: * Stwórz gniazdo połączenia z serwerem i odpowiedni obiekt nasłuchujący (odbiornik) dla nowego gniazda. obsługa JSP (o Boże!), zarządzanie pamięcią… techniki zabezpieczeń, coś do filtrowania takich elementów jak zapisy dziennika, Możliwe odpowiedzi: stwórz obiekt zarządzający wątkami, zaimplementuj 68 Rozdział 2. Co daje nam kontener? Wiemy już, że to właśnie kontener uruchamia serwlety i nimi zarządza, ale właściwie dlaczego tak się dzieje? Czy warto wprowadzać dodatkową warstwę i godzić się na związane z tym opóźnienia? Architektura wysokopoziomowa Obsługa komunikacji Kontener zapewnia prosty mechanizm komunikacji pomiędzy naszymi serwletami a serwerem WWW. Dzięki kontenerom nie musimy budować gniazd serwera, nasłuchiwać komunikacji na porcie, tworzyć strumieni itp. Kontener zna odpowiedni protokół porozumiewania się z serwerem WWW, zatem nasze serwlety nie muszą się martwić o zapewnienie interfejsu API pomiędzy np. serwerem Apache a kodem naszej aplikacji internetowej. W tej sytuacji programista aplikacji internetowej musi jedynie zadbać o logikę biznesową umieszczoną w serwlecie (odpowiedzialną na przykład za przyjmowanie i przetwarzanie zamówień składanych w sklepie internetowym). Zarządzanie cyklem życia Kontener jest panem życia i śmierci naszych serwletów. Właśnie kontener odpowiada za wczytywanie niezbędnych klas, tworzenie egzemplarzy i inicjalizację serwletów, wywoływanie ich metod oraz przystosowywanie serwletów do współpracy z mechanizmami odśmiecania pamięci. Dzięki kontenerom nie musimy tracić naszego cennego czasu na zarządzanie zasobami. Obsługa wielowątkowości Kontener automatycznie tworzy nowy wątek Javy dla każdego otrzymanego żądania dotyczącego serwletu. Kiedy serwlet kończy wykonywanie metody obsługującej przysłane przez klienta żądanie HTTP, odpowiedni wątek jest zamykany (zabijany). Nie oznacza to jednak, że programista jest zwolniony z obowiązku zapewniania bezpieczeństwa wątków — nadal musi pamiętać o ich właściwej synchronizacji. Z drugiej strony, samo przejęcie przez serwer odpowiedzialności za tworzenie i zarządzanie wątkami obsługującymi równocześnie wiele żądań pozwala mu zaoszczędzić mnóstwo pracy. Bezpieczeństwo deklaratywne Korzystanie z kontenera wiąże się ze stosowaniem deskryptora wdrożenia (w formacie XML), który konfiguruje (i modyfikuje) mechanizmy zabezpieczeń bez konieczności trwałego umieszczania odpowiednich instrukcji w kodzie klasy serwletu (lub kodzie dowolnej innej klasy Javy). Aż trudno w to uwierzyć! Możesz zarządzać i wprowadzać zmiany w zabezpieczeniach bez konieczności modyfikowania i ponownego kompilowania swojego kodu źródłowego Javy. Wiesz już, jak wygodne są strony JSP. Kto Twoim Obsługa JSP zdaniem zajmuje się tłumaczeniem kodu JSP do postaci właściwego kodu języka programowania Java? To oczywiste — kontener. Dzięki kontenerowi MOŻESZ się w większym stopniu skoncentrować na własnej logice biznesowej, zamiast martwić się pisaniem kodu zarządzającego wątkami, zapewniającego bezpieczeństwo oraz obsługującego komunikację sieciową. Możesz skupić całą swoją energię na opracowaniu bajecznego sklepu internetowego z folią z bąbelkami i pozostawić usługi pracujące w tle (w tym zapewnianie bezpieczeństwa oraz przetwarzanie stron JSP) kontenerowi. Teraz, zamiast pisania całego kodu działań realizowanych przez kontener, muszę się martwić wyłącznie o to, jak sprzedać moją folię z bąbelkami jej miłośnikom. jesteś tutaj (cid:23) 69 Kontener Jak kontener obsługuje żądanie HTTP? Co prawda najsmakowitsze kąski pozostawimy sobie na kolejne rozdziały tej książki, jednak warto już teraz dokonać krótkiego przeglądu sposobu funkcjonowania kontenerów: 1 Przeglądarka internetowa Klient 2 Przeglądarka internetowa Klient 3 Przeglądarka internetowa Klient Żądanie HTTP GET ... ... kontener serwlet Użytkownik klika łącze zawierające adres URL serwletu (zamiast adresu URL wskazującego na statyczną stronę WWW). kontener serwlet żądanie odpowiedź Kontener „widzi”, że żądanie jest kierowane do serwletu, zatem tworzy dwa niezbędne obiekty: 1. HttpServletResponse 2. HttpServletRequest kontener żą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 przekazuje do nowego wątku serwletu obiekty reprezentujące żądanie i odpowiedź. 70 Rozdział 2. Architektura wysokopoziomowa 4 Przeglądarka internetowa Klient 5 Przeglądarka internetowa Klient kontener żądanie odpowiedź serwlet service() Kontener wywołuje metodę service() serwletu. W zależności od typu żądania metoda service() wywołuje albo metodę doGet(), albo metodę doPost(). W tym przypadku zakładamy, że do kontenera dotarło żądanie protokołu HTTP typu GET. kontener serwlet odpowiedź service() html head /head body ... /body /html doGet() Metoda doGet() generuje dynamiczną stronę HTML i umieszcza ją w obiekcie odpowiedzi. Pamiętaj, że kontener cały czas utrzymuje referencję do obiektu odpowiedzi! 6 Przeglądarka internetowa Klient HTTP header info html head /head body ... /body /html Odpowiedź HTTP kontener serwlet żądanie odpowiedź brak wątku Działanie wątku się kończy, kontener przekształca obiekt odpowiedzi w odpowiedź protokołu HTTP, odsyła tę odpowiedź do klienta, po czym usuwa obiekty żądania i odpowiedzi. jesteś tutaj (cid:23) 71 Kod serwletu Jak to wszystko wygląda w kodzie (co sprawia, że serwlet jest serwletem)? W świecie rzeczywistym 99,9 wszystkich serwletów nadpisuje metodę doGet() bądź metodę doPost(). import javax.servlet.*; import javax.servlet.http.*; import java.io.*; 99,9999 serwletów dziedziczy właśnie po klasie HttpServlet. Zwróć uwagę na brak metody main(). Metody związane z cyklem życia serwletu (w tym doGet()) są wywoływane przez kontener. public class Ch2Servlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { PrintWriter out = response.getWriter(); java.util.Date dzisiaj = new java.util.Date(); out.println(“ html “ + “ body “ + “ h1 style=”text-align:center ” + “Nasz drugi serwlet: Ch2Servlet /h1 ” + “ br ” + dzisiaj + “ /body ” + “ /html ”); } } W tym miejscu nasz serwlet otrzymuje referencje do utworzonych przez kontener obiektów reprezentujących żądanie i odpowiedź. Obiekt klasy PrintWriter możemy uzyskać za pośrednictwem obiektu odpowiedzi przekazanego naszemu serwletowi przez kontener. Obiekt PrintWriter służy do zapisywania w obiekcie odpowiedzi tekstu HTML (można też użyć innych obiektów umożliwiających zapisywanie zamiast tekstu HTML, np. obrazów). Nie ma niemądrych pytań P: Pamiętam o metodach doGet() oraz doPost(), ale na poprzedniej stronie była przecież mowa o metodzie service(). Skąd się wzięła ta metoda? O: Twój serwlet odziedziczył ją po klasie HttpServlet, która z kolei odziedziczyła tę metodę po klasie GenericServlet, która odziedziczyła ją po… zresztą, hierarchię klas opiszemy wyczerpująco w rozdziale „Być serwletem”, więc musisz się wykazać odrobiną cierpliwości. P: Do tej pory unikałeś wyjaśnienia, skąd kontener wie, gdzie szukać właściwego serwletu i jak adres URL jest odwzorowywany na odpowiedni serwlet. Czy użytkownik musi podawać kompletną ścieżkę i nazwę pliku klasy serwletu? O: Dobre pytanie, ale odpowiedź brzmi „nie”. Poruszyłeś jednak bardzo istotny problem (odwzorowywania serwletu oraz wzorców URL), którym krótko zajmiemy się na kolejnych kilku stronach i który dogłębnie omówimy w rozdziale poświęconym wdrażaniu aplikacji internetowych. 72 Rozdział 2. Architektura wysokopoziomowa Zastanawiasz się pewnie, jak kontener znajduje odpowiedni serwlet… Adres URL, który dociera do serwera WWW jako część żądania klienta, jest w jakiś sposób odwzorowywany na odwołanie do konkretnego serwera. Takie odwzorowywanie adresów URL na serwlety może się odbywać na wiele różnych sposobów i jest jednym z kluczowych problemów, przed którymi stajemy w procesie wytwarzania aplikacji internetowych. Żądanie użytkownika musi zostać przekształcone w prawidłowe odwołanie do konkretnego serwletu — zrozumienie i (często) konfiguracja tego typu odwzorowań należy do programisty aplikacji internetowej. Co o tym myślisz? WYTĘŻ UMYSŁ Jak kontener powinien odwzorowywać serwlety na adresy URL? Kiedy użytkownik robi coś w swojej przeglądarce (klika łącze, naciska przycisk Wyślij zapytanie, wpisuje adres URL itp.), należy podjąć jakieś kroki, które spowodują wysłanie żądania do konkretnego serwletu (lub innego zasobu aplikacji internetowej, np. strony JSP). Jak to działa w praktyce? Wymień zalety i wady każdego z poniższych rozwiązań. Zapisanie odwzorowania na stałe w kodzie strony HTML. Innymi słowy, klient wykorzystuje dokładną ścieżkę i nazwę pliku (klasy) serwletu: ZALETY: WADY: Wykorzystanie do odwzorowania narzędzia dostarczonego przez producenta kontenera: ZALETY: WADY: Użycie swoistej tabeli właściwości reprezentującej odwzorowania: ZALETY: WADY: 1 2 3 jesteś tutaj (cid:23) 73 Odwzorowanie adresów URL na serwlety Serwlet może mieć aż TRZY nazwy Serwlet musi oczywiście mieć nazwę ścieżki do pliku klasy (np. classes/registration/ SignUpServlet.class), czyli ścieżkę do faktycznego pliku klasy. Twórca oryginalnej klasy serwletu wybiera jej nazwę (i nazwę pakietu, która definiuje odpowiednią część struktury katalogów), natomiast pełna nazwa ścieżki jest uzależniona od położenia pliku klasy na serwerze. Każda osoba wdrażająca serwlet na serwerze WWW może mu dodatkowo nadać specjalną nazwę wdrożenia. Nazwa wdrożenia jest po prostu poufną nazwą wewnętrzną, która nie musi być taka sama jak nazwa klasy lub nazwa pliku. Nazwa wdrożenia może co prawda odpowiadać nazwie klasy serwletu (registration. SignUpServlet) lub względnej ścieżce do pliku klasy (classes/registration/ SignUpServlet.class), ale też może być zupełnie inna (np. EnrollServlet). I wreszcie, serwlet ma publiczną nazwę URL — nazwę znaną klientowi. Publiczną nazwę URL koduje się w języku HTML, dzięki czemu w chwili kliknięcia przez użytkownika łącza wskazującego nasz serwlet można tę nazwę wysłać na serwer wraz z żądaniem HTTP. 1 2 3 Kliknę łącze do serwletu „register/ registerMe”. Mam zamiar wywołać serwlet „EnrollServlet”. classes registration 101101 101101 10101000010 1010 10 0 01010 1 1010101 10101010 1001010101 1 0 1 10 10 SignUpServlet.class Znana klientowi nazwa URL Klient widzi adres URL serwletu (zakodowany w języku HTML), ale nie wie, jak ta nazwa serwletu zostanie w praktyce odwzorowana na rzeczywiste katalogi i pliki składowane na serwerze. Publiczna nazwa URL jest swoistą podróbką stworzoną specjalnie dla klientów. Znana wdrożeniowcowi poufna nazwa wewnętrzna Wdrożeniowiec może stworzyć nazwę, która będzie znana tylko jemu i innym użytkownikom pracującym w rzeczywistym środowisku operacyjnym. Także ta nazwa jest fałszywką stworzoną wyłącznie na potrzeby procesu wdrażania serwletu. Poufna nazwa wewnętrzna nie musi odpowiadać ani wykorzystywanej przez klienta publicznej nazwie URL, ani rzeczywistej nazwie pliku czy ścieżki do klasy serwletu. Faktyczna nazwa pliku Opracowana przez programistę klasa serwletu ma w pełni kwalifikowaną nazwę, która obejmuje zarówno nazwę klasy, jak i nazwę pakietu. Plik klasy serwletu ma oczywiście rzeczywistą ścieżkę i swoją nazwę (zależną od miejsca składowania struktury katalogów pakietu na serwerze WWW). 74 Rozdział 2. Architektura wysokopoziomowa Czy to nie dziwne, że każdy może swobodnie wyrażać swoją kreatywność i definiować własną nazwę dla tego samego składnika aplikacji internetowej? W czym tkwi problem? Dlaczego nie możemy po prostu korzystać z jednej, prawdziwej i jednoznacznej nazwy pliku? Odwzorowywanie nazw serwletów poprawia elastyczność i bezpieczeństwo naszych aplikacji internetowych Przemyśl to. Przyjmijmy, że trwale zakodowałeś rzeczywistą ścieżkę i nazwę pliku w swoich stronach JSP i pozostałych stronach HTTP korzystających z danego serwletu. Świetnie. Co w takim razie należałoby zrobić w razie konieczności reorganizacji aplikacji i — być może — przeniesienia niektórych jej składników do innej struktury katalogów? Czy naprawdę chcesz wymusić na wszystkich użytkownikach swojego serwletu znajomość (i konieczność nieustannej weryfikacji) tej samej struktury katalogów? Jeśli zamiast zapisywania w kodzie źródłowym rzeczywistej nazwy pliku i ścieżki zastosujemy mechanizm odwzorowań, będziemy mogli swobodnie przenosić składniki aplikacji bez konieczności koszmarnie czasochłonnego wyszukiwania i aktualizowania kodu klienta, który sztywno odwołuje się do starej lokalizacji plików serwletu. A co z bezpieczeństwem? Czy naprawdę zależy nam na tym, aby klient dokładnie znał strukturę plików i katalogów w naszym serwerze? Czy chcemy, by na przykład próbował bezpośrednio przeglądać pliki serwletów bez kontroli zapewnianej przez właściwe strony lub formularze? Nie ma wątpliwości, że użytkownik końcowy dysponujący wiedzą o rzeczywistej ścieżce do pliku klasy serwletu będzie mógł tę ścieżkę wpisać w swojej przeglądarce, aby przynajmniej spróbować uzyskać bezpośredni dostęp do tego serwletu. jesteś tutaj (cid:23) 75 Odwzorowywanie serwletów w deskryptorze wdrożenia Odwzorowania adresów URL na serwlety za pośrednictwem deskryptora wdrożenia Podczas wdrażania naszego serwletu w kontenerze WWW musimy opracować stosunkowo prosty dokument XML nazywany deskryptorem wdrożenia (ang. Deployment Descriptor — DD), który na potrzeby kontenera określa sposób, w jaki należy wykonywać nasze serwlety i (lub) strony JSP. Deskryptory wdrożenia nie służą co prawda wyłącznie odwzorowywaniu nazw, ale zawierają dwa elementy języka XML odpowiedzialne właśnie za definiowanie odwzorowań adresów URL na serwlety — jeden odwzorowuje znaną klientowi publiczną nazwę URL na naszą nazwę wewnętrzną, drugi odwzorowuje naszą nazwę wewnętrzną do postaci w pełni kwalifikowanej nazwy klasy. Dwa elementy deskryptora wdrożenia wykorzystywane do odwzorowywania adresów URL: 1 servlet odwzorowuje nazwę wewnętrzną do postaci w pełni kwalifikowanej nazwy klasy 2 servlet-mapping odwzorowuje nazwę wewnętrzną w publiczną nazwę URL Ta aplikacja internetowa składa się z dwóch serwletów. Znacznik otwierający web-app definiuje ZNACZNIE więcej danych, których jednak nie chcemy przedstawiać i omawiać już teraz (odpowiedni przykład znajdziesz na końcu tego rozdziału). web-app ... servlet servlet-name Nazwa wewnętrzna 1 /servlet-name servlet-class foo.Servlet1 /servlet-class /servlet Element servlet mówi kontenerowi, które pliki klas są częścią tej konkretnej aplikacji internetowej. servlet servlet-name Nazwa wewnętrzna 2 /servlet-name servlet-class foo.Servlet2 /servlet-class /servlet ................................................... servlet-mapping servlet-name Nazwa wewnętrzna 1 /servlet-name url-pattern /Public1 /url-pattern /servlet-mapping servlet-mapping servlet-name Nazwa wewnętrzna 2 /servlet-name url-pattern /Public2 /url-pattern /servlet-mapping Element servlet-name jest wykorzystywany do wiązania elementu servlet z konkretnym elementem servlet- mapping . Użytkownik końcowy aplikacji NIGDY nie widzi tej nazwy, ponieważ definiujemy ją wyłącznie na potrzeby innych elementów tego deskryptora wdrożenia. W tym miejscu umieszczamy w pełni kwalifikowaną nazwę klasy (nie stosujemy jednak rozszerzenia .class). Właśnie ta nazwa jest widoczna dla klienta — klient wykorzystuje ją do uzyskania dostępu do serwletu, chociaż nazwa ta jest sztuczna i (poza deskryptorem wdrożenia) niezwiązana z rzeczywistą nazwą klasy serwletu. Element servlet- mapping należy traktować jak źródło wiedzy dla kontenera, który w momencie otrzymania żądania pyta deskryptor wdrożenia: „Który serwlet powinienem wywołać dla żądanego adresu URL?”. /web-app 76 Rozdział 2. W elemencie url-pattern istnieje możliwość stosowania symboli wieloznacznych… więcej informacji na ich temat i na temat ścieżek znajdziesz w dalszej części tego rozdziału. Zaczekaj! W deskryptorze wdrożenia możemy zrobić znacznie więcej Poza definiowaniem odwzorowań adresów URL na rzeczywiste nazwy serwletów, deskryptory wdrożenia można wykorzystywać do dostosowywania do naszych potrzeb także innych aspektów aplikacji internetowej, jak role bezpieczeństwa, strony o błędach, biblioteki znaczników, informacje o konfiguracji początkowej czy wręcz (jeśli korzystamy z pełnowartościowego serwera J2EE) deklaracje dostępu do konkretnych komponentów Enterprise JavaBeans (EJB). Nie przejmuj się na razie szczegółami. Póki co zasadnicze znaczenie ma dla nas możliwość deklaratywnego modyfikowania naszej aplikacji na poziomie deskryptora wdrożenia zamiast wprowadzania zmian w kodzie źródłowym (i ponownego kompilowania tego kodu)! Pomyśl tylko… oznacza to, że nawet osoby niebędące programistami Javy mogą dostosowywać do swoich potrzeb napisane w tym języku aplikacje internetowe bez konieczności zawracania nam głowy i zakłócania wakacji w tropikach. Nie ma niemądrych pytań P: Mam kłopot. W przedstawionym deskryptorze wdrożenia nadal nie widzę niczego, co mogłoby wskazywać na rzeczywistą nazwę ścieżki do serwletu! Deskryptor wspomina tylko o nazwie klasy. Nadal nie ma więc odpowiedzi na pytanie, w jaki sposób kontener wykorzystuje tę nazwę do odnajdywania konkretnych plików klas serwletów. Może istnieje gdzieś INNE odwzorowanie, które określa, że taka i taka nazwa klasy jest odwzorowywana na taki i taki plik w takiej i takiej lokalizacji? O: Wiedziałem, że zwrócisz na to uwagę. Masz rację — w elemencie servlet-class w deskryptorze wdrożenia umieszczamy jedynie nazwę klasy (w pełni kwalifikowaną, a więc z nazwą pakietu). Wynika to z faktu, iż kontener dysponuje określonym miejscem, w którym odnajduje wszystkie te serwlety, dla których w deskryptorze wdrożenia zdefiniowano odpowiednie odwzorowania. W praktyce kontener stosuje wyszukany zbiór reguł do odnajdywania pasujących do siebie adresów URL (pochodzących z żądań klienta) i rzeczywistych klas Javy (przechowywanych gdzieś w serwerze). Omówimy to zagadnienie bardziej szczegółowo w dalszej części tej książki (w rozdziale poświęconym wdrażaniu aplikacji internetowych). Na razie w zupełności wystarczy, jeśli zapamiętasz, że definiowanie tego typu odwzorowań nie wymaga żadnych dodatkowych czynności. Architektura wysokopoziomowa Deskryptor wdrożenia (DD) oferuje nam mechanizm „deklaratywnego” dostosowywania aplikacji internetowych do potrzeb użytkownika bez konieczności modyfikowania ich kodu źródłowego! Zalety deskryptorów wdrożenia (cid:81) Minimalizują liczbę operacji na kodzie źródłowym, który przeszedł już niezbędne testy. (cid:81) Umożliwiają nam dostosowywanie możliwości naszej aplikacji, nawet jeśli nie mamy dostępu do kodu źródłowego. (cid:81) Dają możliwość przystosowywania naszej aplikacji do korzystania z różnych zasobów (np. baz danych) bez konieczności ponownego kompilowania i testowania kodu źródłowego. (cid:81) Ułatwiają zarządzanie dynamicznymi regułami bezpieczeństwa, w tym listami kontrolnymi i rolami bezpieczeństwa. (cid:81) Osobom niebędącym programistami umożliwiają modyfikowanie i wdrażanie naszych aplikacji internetowych w czasie, gdy my możemy się koncentrować na ciekawszych zajęciach (np. na doborze najlepszych ciuchów przed wyjazdem nad morze). jesteś tutaj (cid:23) 77 Witryna randkowa Boba Opowiadanie: Bob buduje witrynę swatającą Umawianie się na randki jest w dzisiejszych czasach dosyć trudne. Kto ma na to czas, skoro zawsze jest jakiś dysk do zdefragmentowania? Bob, który chce wejść w interes dot.com (załóżmy na chwilę, że rynek tego typu witryn nie jest jeszcze nasycony), wierzy, że stworzenie specjalnej witryny randkowej dla pasjonatów informatyki będzie jego przepustką do wielkiej kariery i ostatecznego porzucenia dotychczasowej roli komiksowego Dilberta. Problem w tym, że Bob był menedżerem projektów informatycznych tak długo, że nie jest już zbyt biegły we współczesnych technikach inżynierii oprogramowania. Zna jednak kilka trudnych pojęć oraz niektóre konstrukcje Javy; poświęcił też trochę czasu na pobieżną lekturę materiałów o serwletach, zatem błyskawicznie opracował niezbędny projekt i przystąpił do kodowania... Chcę stworzyć elastyczną witrynę randkową, na której informatycy będą mogli się spotykać i łączyć w pary. Ponieważ nie każdemu udaje się zainstalować Linuksa… Randki „78 naszych transakcji kończy się zatwierdzeniem (poleceniem COMMIT).” Złączenie Zapytanie DQL Dostosuj mój profil Dostosuj mój profil Zmodyfikuj swój profil Podaj swój stan Zajęcie Wiek OS Atrybuty Wyjątki Deklaracja typu Wstaw Zapytanie Skonstruuj swój łańcuch randkowego języka zapytań (Dating Query Language — DQL): Wyniki zapytania DQL Dalej Popraw Więcej 78 Rozdział 2. Architektura wysokopoziomowa Bob przystąpił do tworzenia garści serwletów… po jednym dla każdej strony Bob rozważał zastosowanie tylko jednego serwletu pełnego niezbędnych wyrażeń warunkowych, ale ostatecznie zdecydował, że podział funkcjonalności pomiędzy wiele osobnych serwletów będzie rozwiązaniem właściwszym — każdy serwlet powinien odpowiadać za generowanie i obsługę pojedynczej strony (strony zapytania, strony zapisywania do serwisu, strony wyników wyszukiwania itp.). Każdy serwlet obejmuje kompletną logikę biznesową niezbędną do zmodyfikowania lub odczytania zawartości bazy danych oraz zapisania w strumieniu odpowiedzi (a więc odesłania do klienta) odpowiedniego kodu HTML. // polecenia importowania public class DatingServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // w tym miejscu jest zakodowana logika biznesowa // bieżącego serwletu; wykonywany kod zależy od zakresu // działań danego serwletu (zapis w bazie danych, // wykonanie zapytania itp.) PrintWriter out = response.getWriter(); // wygeneruj dynamiczną stronę HTML out.println(”w tym miejscu znajduje się coś naprawdę okropnego”); } } komputer serwera WWW 101101 101101 10101000010 1010 10 0 01010 1 1010101 10101010 1001010101 1 0 1 10 10 InputDQLServlet 101101 101101 10101000010 10
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Head First Servlets & JSP. Edycja polska. Wydanie II (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ą: