Poznań Java Users Group Komunikacja między serwletami Bartosz Walter Instytut Informatyki Politechniki Poznańskiej
Sceny z życia serwletów Obsługa żądań Żądanie Kontener GET / index.html HTTP/1.0 Serwlet <HTML> <HEAD> <BODY>... Odpowiedź
Sceny z życia serwletów Narodziny, życie i śmierć void init(servletconfig) Serwlet void service(servletrequest, ServletResponse) void destroy() javax.servlet.servlet
Sceny z życia serwletów Środowisko i konfiguracja Definicja nazwy serwleta Parametry serwleta Przypisanie serwleta do URLa web.xml <servlet> <servlet-name>serwlet_a</servlet-name> <servlet-class> moj.pakiet.servleta </servlet-class> <init-param> <param-name>parametr</param-name> <param-value>wartość</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>serwlet_a</servlet-name> <url-pattern>/a/*</url-pattern> </servlet-mapping>
Aplikacje się rozrastają... Zwiększamy funkcjonalność Pomysł 1: puchnący serwlet Serwlet Serwlet Serwlet
Aplikacje się rozrastają... Zwiększamy funkcjonalność Pomysł 2: specjalizowane serwlety Serwlet C Serwlet A Serwlet B Serwlet D
Aplikacje się rozrastają... Zwiększamy funkcjonalność A czego potrzebujemy? komunikacji między serwletami specjalizacji funkcjonalnej modularyzacji konfiguracji przez administratora
Rys historyczny cz. I Java Servlets TM 2.0 dawno temu, w odległej galaktyce... serwlet jako jednostka przetwarzająca żądania brak mechanizmów komunikacyjnych podstawowe mechanizmy obsługi żądań Apache JServ
Rys historyczny cz. II Java Servlets TM 2.1 listopad 1998 podstawy komunikacji między serwletami wprowadzenie pojęcia kontenera serwletów Apache Tomcat 3.1
Rys historyczny cz. III Java Servlets TM 2.2 grudzień 1999 wprowadzenie pojęcia aplikacji webowej rozszerzenie mechanizmu komunikacji między serwletami obserwatory zdarzeń Apache Tomcat 3.2
Rys historyczny cz. IV Java Servlets TM 2.3 sierpień 2001 mechanizm filtrowania zdarzenia w cyklu życia serwleta integracja z J2EE Apache Tomcat 4.x i Borland Enterprise Server
O czym chcemy mówić? Spis treści Komunikacja między serwletami jak to działa? modele przetwarzania Filtrowanie model przetwarzania filtrowanie żądań i odpowiedzi kilka sztuczek
Komunikacja między serwletami Żądanie Żądanie Kontener Serwlet A Serwlet B znajdź następny Odpowiedź Odpowiedź
Znajdowanie serwletów cz. I Sposób 1: podanie URLa Serwlet A Serwlet B znajdź następny / ctx / serwlet_a / ctx / serwlet_b muszę znać URL serwleta B!
Znajdowanie serwletów cz. II Sposób 2: podanie nazwy serwleta Serwlet A Serwlet B znajdź następny serwleta serwletb muszę znać nazwę serwleta B!
Komunikacja między serwletami Serwlet A Serwlet B Kontener Serwlet A Serwlet B
Metody komunikacji: forwarding Serwlet A Serwlet B Kontener znajdź następny RequestDispatcher rd = ctx.getrequestdispatcher ("/serwlet_b"); rd.forward(request, response); // nie ma powrotu do serwleta A
Metody komunikacji: including Serwlet A Serwlet B Kontener RequestDispatcher rd = ctx.getrequestdispatcher ("/serwlet_b"); rd.include(request, response); // powrót sterowania do serwleta A
Przykład MojSerwlet wyświetla stronę, zarządza prezentacją DBSerwlet odczytuje z bazy danych imię i nazwisko użytkownika MojSerwlet DBSerwlet Kontener
Wady i zalety Forwarding prosty, potokowy model quasi-filtrowanie problem z zatwierdzaniem odpowiedzi Including delegacyjny model przetwarzania problem z modularnością słaba konfigurowalność zmiana w topologii wymaga rekompilacji
Ogólna zasada filtrowania Żądanie Żądanie Kontener Filtr Serwlet A Odpowiedź Odpowiedź
Budowa filtra Filtr void init(filterconfig) void dofilter(servletrequest, ServletResponse, FilterChain) { // modyfikacja żądania chain.dofilter(request, response); // modyfikacja odpowiedzi } void destroy() javax.servlet.filter
Konfiguracja filtra Definicja nazwy filtra Parametry filtra web.xml <filter> <filter-name>filter_1</filter-name> <filter-class> moj.pakiet.filter1 </filter-class> <init-param> <param-name>parametr</param-name> <param-value>wartość</param-value> Przypisanie do URLa lub serwleta </init-param> </servlet> <filter-mapping> <filter-name>filter_1</filter-name> <url-pattern>/a/*</url-pattern> </servlet-mapping>
Przykład Filtr zmienia kodowanie żądania HTTP Serwlet przetwarza żądanie Filtr Serwlet Kontener
Filtry i opakowania Żądanie i odpowiedź są niezmienne! Zatwierdzonej odpowiedzi nie można modyfikować! HttpServletRequest HttpServletRequest Żądanie Filtr HttpServletRequest javax.servlet.httpservletrequestwrapper javax.servlet.httpservletresponsewrapper
Przykład Filtr modyfikuje odpowiedź HTTP Serwlet przetwarza żądanie Serwlet Filtr Kontener
Łańcuchy filtrów FilterChain FilterChain Filtr 1 Filtr 2 Filtr 3... chain.dofilter(request, chain.dofilter(request, response); response);
Konfiguracja łańcuchów Definicja nazw filtrów 1 i 2 Filtr 1 najpierw... web.xml <filter> <filter-name>filter_1</filter-name>... </servlet> <filter> <filter-name>filter_2</filter-name>... </servlet> <filter-mapping>...a potem filtr 2 <filter-name>filter_1</filter-name> <filter-name>filter_2</filter-name> <url-pattern>/a/*</url-pattern> </servlet-mapping>
Kolejność filtrów A co jeśli zmienimy kolejność filtrów? Filtr pl2en Filtr CesarianASCII ćma i koń cma i kon dnb j lpo Filtr CesarianASCII Filtr pl2en ćma i koń çma i koň çnb j lpň
Podsumowanie Droga serwletów do aplikacji klasy enterprise Większa elastyczność dzięki filtrom Konfiguracja przez administratora bez rekompilacji Pełna modularyzacja Przetwarzanie potokowe i zagnieżdżone
Pytania?