Menu
Jest wolny
rejestracja
Dom  /  NA/ Napisanie apletu do szpiegowania użytkowników mediów społecznościowych. Jawa

Napisanie apletu do szpiegowania użytkowników mediów społecznościowych. Jawa

Serwlety to programy Java, które działają po stronie serwera aplikacji sieci Web. Tak jak aplety dynamicznie rozszerzają funkcjonalność przeglądarki WWW, tak serwlety dynamicznie rozszerzają funkcjonalność serwera WWW. Chociaż serwlety mogą obsługiwać dowolne żądanie, są powszechnie używane do rozszerzania serwerów WWW. Dla takich aplikacji technologia Java Servlet definiuje klasy serwletów specyficzne dla HTTP. Pakiety javax.servlet i javax.servlet.http udostępniają interfejsy i klasy do tworzenia serwletów.

  • Jaka jest struktura projektu internetowego?

  • Co to jest kontener serwletów? Cykl życia serwletów.

Kontener serwletów to program, który zarządza cyklem życia serwletów.
Cykl życia serwletu: jest zarządzany przez kontener serwletów, przy pierwszym dostępie do serwletu jest on ładowany do pamięci i wywoływana jest metoda init(). W całej aplikacji wywoływana jest metoda service() w celu obsługi żądań klientów. Po zakończeniu działania aplikacji wywoływana jest metoda destroy () i aplet jest usuwany z pamięci.

  • Jakie są zadania, funkcjonalność kontenera serwletów?

Kontener serwletów może działać jako samodzielny serwer WWW, służyć jako dostawca stron dla innego serwera WWW, takiego jak Apache, lub integrować się z serwerem aplikacji Java EE. Zapewnia wymianę danych pomiędzy serwletem a klientami, zajmuje się takimi funkcjami jak tworzenie środowiska programowego dla działającego serwletu, identyfikowanie i autoryzacja klientów, organizowanie sesji dla każdego z nich.

  • Czym różni się sendRedirect () od forward ()?

Metoda forward () służy do wywoływania strony JSP przy użyciu ścieżki względnej, a metoda sendRedirect () służy do odwoływania się do strony JSP przy użyciu ścieżki bezwzględnej. Różnica między tymi metodami polega na tym, że istniejący obiekt żądania jest przekazywany za pomocą metody forward(), a nowe żądanie jest generowane po wywołaniu metody sendRedirect(). W tym drugim przypadku informacje powinny być przekazywane wraz z innymi obiektami. Ponadto metoda forward () jest szybsza.

  • Co wiesz o filtrach serwletów?

Implementacja interfejsu Filter pozwala na stworzenie obiektu, który przechwytuje żądanie, potrafi transformować nagłówek i treść żądania klienta. Filtry nie tworzą żądania ani odpowiedzi, jedynie je modyfikują. Filtr wstępnie przetwarza żądanie, zanim dotrze do apletu, a następnie (jeśli to konieczne) przetwarza odpowiedź przychodzącą z apletu. Filtr może wchodzić w interakcje z różnymi typami zasobów, w szczególności z serwletami i stronami JSP. Filtry serwletów mogą:

  • przechwycić inicjację apletu przed zainicjowaniem apletu.
  • określić treść żądania przed zainicjowaniem apletu.
  • zmodyfikuj nagłówki żądania i dane, w które pakowane jest żądanie przychodzące.
  • modyfikować nagłówki odpowiedzi i dane, w które pakowana jest odebrana odpowiedź.
  • przechwycić inicjację apletu po wywołaniu apletu.

Filtr serwletów można skonfigurować do pracy z pojedynczym serwletem lub grupą serwletów. Podstawą generowania filtrów jest interfejs javax.servlet.Filter, który implementuje trzy metody:

  • void init (konfiguracja FilterConfig) wyrzuca ServletException;
  • nieważne zniszczyć ();
  • void doFilter (żądanie ServletRequest, odpowiedź ServletResponse, łańcuch FilterChain) wyrzuca IOException, ServletException;

Metoda init() jest wywoływana przed uruchomieniem filtru i skonfigurowaniem obiektu konfiguracyjnego filtru. Metoda doFilter wykonuje rzeczywistą pracę filtra. W ten sposób serwer wywołuje init () raz, aby uruchomić filtr, a następnie wywołuje doFilter () tyle razy, ile żądania będą kierowane bezpośrednio do tego filtra. Po zakończeniu pracy filtru wywoływana jest metoda destroy().

  • Dlaczego potrzebujesz słuchaczy w serwletach?

Detektory kontekstu i sesji to klasy, które mogą śledzić, kiedy kontekst lub sesja zostały zainicjowane, lub śledzić, kiedy powinny zostać zniszczone i kiedy atrybuty zostały dodane lub usunięte z kontekstu lub sesji. Servlet 2.4 rozszerza model nasłuchiwania żądań, umożliwiając śledzenie sposobu tworzenia i niszczenia żądania oraz dodawania i usuwania atrybutów z serwletu. W Servlecie 2.4 dodano następujące klasy:

  • ServletRequestListener
  • Serwlet ŻądanieZdarzenie
  • ServletRequestAttributeListener
  • ServletRequestAtrybutZdarzenie

  • Jak mam obsługiwać wyjątki zgłoszone przez inny serwlet w aplikacji?

Ponieważ przeglądarka rozpoznaje tylko HTML, gdy aplikacja zgłosi wyjątek, kontener serwletów obsłuży wyjątek i wygeneruje odpowiedź HTML. Jest to podobne do tego, co dzieje się z kodami błędów, takimi jak 404, 403 itp. Servlet API zapewnia obsługę naszych własnych serwletów do obsługi wyjątków i błędów, które możemy określić w deskryptorze wdrażania. Głównym zadaniem takich apletów jest obsługa błędu lub wyjątku i wysłanie użytkownikowi czytelnej odpowiedzi HTML. Na przykład możesz podać link do strony głównej, a także opis niektórych szczegółów dotyczących błędu.

  • Co to jest deskryptor wdrożenia?

Deskryptor wdrażania to plik konfiguracyjny artefaktu, który zostanie wdrożony w kontenerze serwletów. W specyfikacji Java Platform, Enterprise Edition deskryptor wdrażania opisuje sposób wdrażania komponentu, modułu lub aplikacji (takiej jak aplikacja internetowa lub aplikacja korporacyjna).

Ten plik konfiguracyjny określa opcje wdrażania modułu lub aplikacji z określonymi ustawieniami, opcjami bezpieczeństwa i opisuje określone wymagania konfiguracyjne. Składnia plików deskryptora wdrażania to XML.

  • Jak zaimplementować uruchomienie serwletu wraz z uruchomieniem aplikacji?

Kontener serwletów zwykle ładuje serwlet na pierwsze żądanie klienta, ale czasami konieczne jest załadowanie serwletu bezpośrednio na początku aplikacji (na przykład, jeśli serwlet jest nieporęczny i jego załadowanie zajmie dużo czasu). Aby to zrobić, musisz użyć elementu load-on-startup w deskryptorze (lub adnotacji loadOnStartup), który wskaże, czy aplet powinien być ładowany przy starcie.

Wartość musi być int. Jeśli wartość jest ujemna, to aplet zostanie załadowany na żądanie klienta, a jeśli 0 i dalej, to zostanie załadowany na początku aplikacji. Im niższa liczba, tym wcześniej aplet znajdzie się w kolejce pobierania.

  • Co to jest obiekt ServletConfig?

Interfejs javax.servlet.ServletConfig służy do przekazywania informacji konfiguracyjnych do serwletu. Każdy serwlet ma swój własny obiekt ServletConfig, za tworzenie instancji odpowiedzialny jest kontener serwletu. Parametry init w web.xml (lub adnotacje WebInitParam) służą do ustawiania parametrów konfiguracyjnych. Metoda getServletConfig () służy do pobrania obiektu ServletConfig dla tego serwletu.

  • Co to jest obiekt ServletContext?

Interfejs javax.servlet.ServletContext definiuje szereg metod, których aplet używa do komunikacji ze swoim kontenerem serwletów, takich jak pobieranie typu MIME pliku, wysyłanie żądań lub zapisywanie do pliku dziennika. Obiekt ServletContext jest unikalny i dostępny dla wszystkich serwletów w aplikacji internetowej. Możemy użyć obiektu ServletContext, gdy potrzebujemy zapewnić dostęp jednemu lub większej liczbie serwletów do zainicjowanych parametrów aplikacji internetowej. Aby to zrobić, użyj elementu w web.xml. Obiekt ServletContext można uzyskać za pomocą metody getServletContext () interfejsu ServletConfig.

Kontenery serwletów mogą również dostarczać obiekty kontekstowe, które są unikalne dla grupy serwletów. Każda z grup będzie powiązana z innym zestawem adresów URL ścieżki hosta.

ServletContext został rozszerzony w specyfikacji Servlet 3 i umożliwia programowe dodawanie detektorów i filtrów do aplikacji. Ten interfejs ma również wiele przydatnych metod, takich jak getMimeType(), getResourceAsStream() itp.

  • Jaka jest różnica między ServletContext a ServletConfig?

Poniżej znajdują się niektóre różnice:

  • ServletConfig jest unikalnym obiektem dla każdego serwletu, podczas gdy ServletContext jest unikalny dla całej aplikacji.
  • ServletConfig służy do dostarczania parametrów inicjujących do serwletu, a ServletContext jest używany do dostarczania parametrów inicjujących aplikacji dla wszystkich apletów.
  • Nie mamy możliwości ustawienia atrybutów w obiekcie ServletConfig, natomiast możemy ustawić atrybuty w obiekcie ServletContext, które będą dostępne dla innych apletów.

  • Interfejs ServletResponse.

Interfejs ServletResponse to narzędzie do wysyłania danych do klienta. Wszystkie metody tego narzędzia służą właśnie temu celowi.

  • Interfejs żądania serwletu.

Interfejs ServletRequest jest narzędziem do pobierania parametrów żądań HTTP. Ten interfejs ma kilka metod, które są identyczne pod względem nazwy i przeznaczenia z ServletContext.

  • Co to jest dyspozytor żądań?

Interfejs RequestDispatcher służy do przekazywania żądania do innego zasobu (może to być HTML, JSP lub inny serwlet w tej samej aplikacji). Możemy to wykorzystać do dodania treści z innego zasobu do odpowiedzi. Ten interfejs jest używany do wewnętrznej komunikacji między serwletami w tym samym kontekście. W interfejsie zaimplementowane są dwie metody:

  • void forward (ServletRequest var1, ServletResponse var2) - przekazuje żądanie z serwletu do innego zasobu (serwletu, pliku JSP lub HTML) na serwerze.
  • void include (ServletRequest var1, ServletResponse var2) — zawiera w odpowiedzi treść zasobu (stronę Servlet, JSP lub HTML).

Dostęp do interfejsu można uzyskać za pomocą metody ServletContext getRequestDispatcher (String s). Ścieżka musi zaczynać się od /, co będzie interpretowane jako odnoszące się do bieżącej ścieżki głównej kontekstu.

  • Jak można stworzyć zakleszczenie w aplecie?

Zakleszczenie można uzyskać implementując zapętlone wywołanie metody, na przykład wywołując metodę doPost() w metodzie doGet() i wywołując doGet() w metodzie doPost().

  • Jak uzyskać adres serwletu na serwerze?

Aby uzyskać rzeczywistą ścieżkę serwletu na serwerze, możesz użyć tej konstrukcji: getServletContext () GetRealPath (request.getServletPath ()).

  • Jak uzyskać informacje o serwerze z serwletu?

Informacje o serwerze można uzyskać za pomocą obiektu ServletContext za pomocą metody getServerInfo (). Te. getServletContext (). getServerInfo ().

  • Jak zdobyć adres IP klienta na serwerze?

Użyj request.getRemoteAddr(), aby uzyskać adres IP klienta w serwlecie.

  • Co wiesz o klasach opakowujących serwlety?

API Servlet HTTP udostępnia dwie klasy opakowujące, HttpServletRequestWrapper i HttpServletResponseWrapper. Pomagają programistom zaimplementować własne implementacje typów serwletów żądania i odpowiedzi. Możemy rozszerzyć te klasy i przesłonić tylko niezbędne metody, aby zaimplementować własne typy obiektów odpowiedzi i żądania. Klasy te nie są używane w standardowym programowaniu serwletów.

Od pojawienia się języka programowania Java minęło prawie dwadzieścia lat. W tym czasie Java przepowiadała śmierć i zapomnienie, programiści na miejscu śmiali się z jej zahamowań i chciwości zasobów. Ale byli też tacy, którzy wierzyli w Javę, rozwijali wszelkiego rodzaju biblioteki, rozwijali społeczność, wytrwale udowadniali, że dla Javy nie ma granic: czasu rzeczywistego, wbudowanego, AI – wszystko jest możliwe. Postanowiliśmy nie stać z boku i zrobić w tej sekcji małą serię artykułów o Javie. Udać się!

Twój czajnik wybiera Javę

Według samego Oracle, wirtualna maszyna Java jest obecnie zainstalowana na ponad trzech miliardach urządzeń. A to nie tylko komputery i smartfony, ale także aparaty, telewizory, odtwarzacze Blu-ray, drukarki, karty SIM, bankomaty, a nawet samochody. Lista będzie stale rosnąć, a wraz z nią oferty pracodawców dla programistów Java. Nawet teraz liczba wakatów dla programistów Java przewyższa resztę. A firmy są skłonne płacić coraz więcej, kłusując pracowników i organizując lepsze warunki pracy.

A do czego to służy?

Programistów Java przyciąga minimalizm składni. Bez zbędnych modyfikatorów i słów serwisowych. Nawet brak wielokrotnego dziedziczenia, który początkowo nieco mylił programistów C++, w końcu okazuje się rozsądny i uzasadniony. Prosta logika, automatyczne zarządzanie pamięcią, szczegółowa dokumentacja, fora z odpowiedziami na różnego rodzaju pytania, open source - wszystko to pozwala szybko zagłębić się w proces rozwoju i znacznie zmniejsza liczbę potencjalnych błędów. Nawet indyjscy chłopi uczą się Javy w kilka miesięcy, przynajmniej tak mówią ich dyplomy :). Ponadto Java jest językiem interpretowanym. Kompilator tłumaczy kod źródłowy na tzw. kod bajtowy, który można łatwo przekonwertować z powrotem, co czyni Javę szczególnie atrakcyjną dla inżynierii wstecznej.

Cóż, zaczynajmy

Java jest językiem obiektowym, co oznacza, że ​​wszystkie zmienne, metody, stałe są deklarowane w ramach klasy. Oprócz klas istnieją również interfejsy - specjalna abstrakcyjna konstrukcja, która pozwala opisać zachowanie obiektu bez określania konkretnej implementacji. A jeśli w Javie nie ma wielokrotnego dziedziczenia klas, to klasa może zaimplementować dowolną liczbę interfejsów, co pozwala jednemu obiektowi mieć wiele funkcji, ale udostępnia tylko ich część.

Typy danych można podzielić na dwie grupy: proste (int, long, char itd.) oraz obiektowe: klasy, interfejsy, tablice. Typy proste mają zawsze i wszędzie stały wymiar. Na przykład w dowolnej architekturze i dowolnym urządzeniu int zajmuje cztery bajty pamięci. Jest to bardzo przydatne do obliczeń. Tablica danych zawiera specjalny atrybut length, który przechowuje rozmiar tablicy, za co specjalnie dziękujemy programistom. Różne typy danych są przekazywane do metod na różne sposoby. Typy proste są zawsze przekazywane przez wartość. Obiekt - zawsze przez odniesienie do zaoszczędzenia pamięci. Oznacza to, że jeśli przekażemy int a = 10 i zmienimy jego wartość na 5 w wywoływanej metodzie, to w oryginalnej metodzie a nadal będzie wynosić 10. Ale jeśli zmienimy właściwość obiektu, to zmieni się to w oryginalnej metodzie także.

Zapamiętaj wspomnienie

Chociaż programista Java jest wolny od konieczności przydzielania i zwalniania pamięci, nieznajomość niektórych osobliwości maszyny wirtualnej i garbage collectora może z łatwością zmienić twój program w nienasyconego potwora pochłaniającego czas procesora i całą dostępną pamięć.

Tworząc nową tablicę, zawsze pamiętaj, że dużo łatwiej jest utworzyć wiele małych fragmentów pamięci niż jedną dużą. W przeciwnym razie istnieje ryzyko wystąpienia błędu braku pamięci, co z grubsza oznacza, że ​​masz pamięć, ale wszystko wyszło.

Wielu programistów, gdy przejdą na Javę i dowie się o automatycznym czyszczeniu pamięci, zaczyna tworzyć obiekty w ogromnych ilościach, mając nadzieję, że wszystko samo się wyjaśni. Tymczasem śmieciarz jest jak maszyna, która może zbierać śmieci tylko wrzucone do kosza na śmieci w pobliżu domu. Jeśli nie potrzebujesz już danych, nie powinieneś ich przechowywać na wszelki wypadek, jak stos starych pocztówek - przypisz wskaźnik do wartości null, pomóż sprzątaczowi posprzątać :). Dobrą praktyką jest również jasne określenie listy, jeśli nie jest ona już potrzebna. Pamiętaj, że obiekt będzie przechowywany w pamięci, o ile w kodzie znajdują się odniesienia do niego. Nawet jeśli twój program działa na 16 gigabajtach pamięci i nie grozi awarią z powodu braku pamięci, będzie stawał się coraz bardziej niezgrabny i powolny z powodu nadmiaru zużytej pamięci. 99% skarg użytkowników na powolne programy Java wynika z nieefektywnie napisanego kodu źródłowego. Jeśli musisz stale tworzyć obiekty, które są szybko używane i nie są już potrzebne, na przykład dużo małych wiadomości, rozważ utworzenie puli, która będzie przechowywać wiele instancji do wielokrotnego użytku. Pamiętaj, tworzenie i usuwanie obiektu jest kosztowne.

Dla sprawy, panowie

Jeden przykład jest lepszy niż tysiąc słów. Możesz przejrzeć instrukcję i spojrzeć na standardowe Hellowords bez nas, więc założymy, że już to zrobiłeś i jesteś gotowy do zaimplementowania ciekawszego przykładu.

Ty i ja zajmiemy się serwerową aplikacją Javy i napiszemy mały program do „szpiegowania” użytkowników sieci społecznościowych. Aby to zrobić, nie trzeba nawet szukać pracy w NSA – użytkownicy rozsiewają wszystko dla siebie, a my będziemy musieli tylko zdobyć te informacje, uporządkować je i pięknie wyeksponować. Weźmy na przykład jeden z popularnych serwisów społecznościowych foursquare i narysujmy na mapie ruch naszych znajomych.

Najpierw zobaczmy, co możemy wyciągnąć z kwadratu. Po przejrzeniu stron deweloperskich zwracamy uwagę na dwie metody:

  • https://developer.foursquare.com/docs/users/checkins - Miejsca odwiedzane przez użytkownika. Niestety póki co obsługiwany jest tylko dla użytkownika zarejestrowanego w programie, a krążą plotki, że ze względu na ograniczenia implementacyjne tak pozostanie;
  • https://developer.foursquare.com/docs/checkins/recent - miejsca odwiedzane przez znajomych zarejestrowanego użytkownika. Jeśli pobawisz się trochę tą funkcją, to smutny fakt staje się jasny: za każdego przyjaciela zwracane jest dokładnie jedno miejsce - ostatnie, w którym się zameldował.

Aby korzystać z foursquare API, musisz zarejestrować naszą przyszłą aplikację, wejdź na ten adres: https://en.foursquare.com/developers/register i wypełnij pola (tak, będziesz musiał zarejestrować się w foursquare, ale możesz to zrobić dobrze beze mnie).

Z ważnych pól tutaj możesz zaznaczyć tylko "Nazwa aplikacji", "Url strony do pobrania/powitania" (tu wpisz dowolny adres WWW) oraz "Przekieruj URI(i)" - jest to adres, na który serwer nam wyśle po rejestracji. Żądaną wartość napiszemy tutaj później, ale na razie możesz po prostu wpisać dowolny adres internetowy. Kliknij „Zapisz”, a nasza aplikacja śledząca została pomyślnie zarejestrowana.

Wspinaczka w chmury

Kapitan Obvious przekazuje, że każda aplikacja serwerowa wymaga serwera do działania. Podnieś serwer sobie hemoroidy, więc skorzystamy z popularnych obecnie rozwiązań chmurowych. Chmura będzie sponsorowana przez Google Corporation, ponieważ ich Google App Engine jest bezpłatny, dość łatwy w konfiguracji i obsłudze. Najpierw przejdź tutaj i pobierz pakiet SDK Google App Engine dla języka Java.

Teraz możesz zacząć tworzyć swój projekt. Do programowania w Javie używam IntelliJ IDEA, ale możesz skorzystać z darmowego i równie dobrze znanego środowiska Eclipse.

Wybierzmy nowy projekt Java. Nazwijmy to nsa_tracker.


Na kolejnej karcie zaznacz po lewej stronie Web Application i Google App Engine oraz wskaż ścieżkę do wcześniej pobranego i rozpakowanego SDK App Engine.


Teraz usiądź wygodnie i pozwól IDE zrobić swoje. Jeśli wybrałeś IDEA i zrobiłeś wszystko poprawnie, w rezultacie zobaczysz gotowy projekt, który po uruchomieniu otwiera okno przeglądarki z pustą zawartością. Możesz zacząć kodować.

zaczynamy szukać

Mamy więc folder z projektem, który zawiera folder src. Tam umieścimy źródła. Źródła Java są pogrupowane według pakietów. Pakiet to folder na dysku. Pakiety są potrzebne, aby nie zrzucać wszystkich źródeł w stos, ale je rozdzielać, kierując się zasadami logiki. Na przykład logiczne byłoby umieszczenie kodu związanego z interfejsem użytkownika w pakiecie interfejsu użytkownika, a interakcjami sieciowymi w pakiecie sieciowym. To znacznie ułatwia późniejszy rozwój i obsługę projektu. W przeszłości praktyką było rozpoczynanie struktury pakietu od nazwy firmy, po której następuje nazwa programu. Pomoże to łatwo zidentyfikować nasze źródła wśród stosu tego samego w przyszłości. Dla naszego programu stworzymy pakiet org.nsa.tracker. W nim stworzymy klasy.

Serwlety są używane na serwerze do przetwarzania żądań użytkowników. Serwlet to klasa, która zazwyczaj dziedziczy po HttpServlet i działa na zasadzie żądanie-odpowiedź. Wszystko czego potrzebujesz to nadpisać metodę doGet. Na prośbę użytkownika musimy zalogować się do foursquare, pobrać listę zameldowań znajomych i przekierować prośbę na stronę z mapą.

Aby pracować z foursquare API, użyjemy darmowej biblioteki foursquare-api-java, którą można pobrać stąd. Biblioteka Java to archiwum ZIP z rozszerzeniem jar zawierającym skompilowane klasy Java, które implementują określoną funkcjonalność. Do autoryzacji potrzebujemy ClientId oraz ClientSecret uzyskanych na etapie rejestracji aplikacji w foursquare. Ponieważ parametry te nie zmieniają się podczas wykonywania programu, zadeklarujemy je jako stałe.

Prywatny statyczny końcowy String CLIENT_ID = "FAKE_CLIENT_ID"; prywatny statyczny końcowy String CLIENT_SECRET = "FAKE_CLIENT_SECRET";

Final oznacza, że ​​tej zmiennej została przypisana wartość końcowa, której nie można zmienić. Static udostępnia zmienną wszystkim instancjom danej klasy. Korzystając z przykładu autoryzacji z biblioteki foursquare-api-java otrzymujemy następujący kod:

Chroniony void doGet (HttpServletRequest req, HttpServletResponse odp.) zgłasza ServletException, IOException (FoursquareApi foursquareApi = new FoursquareApi (CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req. .getAuthenticationUrl ());) else (try (foursquareApi.authenticateCode (kod); // Rejestracja powiodła się, załaduj dane Wynik wynik = foursquareApi.checkinsRecent ("0.0,0.0", 100, 0l); ) catch (FoursquareApiException e) (e.printStackTrace ();)))

Zwróć uwagę na "zgłasza ServletException, IOException" w deklaracji metody. Ten wiersz oznacza, że ​​metoda może potencjalnie zgłosić jeden z tych wyjątków. Wyjątek w Javie to obiekt, który sygnalizuje zgłoszenie wyjątku. Są weryfikowalne i nieweryfikowalne. Sprawdzone wyjątki powinny być obsługiwane przez otoczenie części kodu blokiem try-catch lub przekazywane powyżej. Niesprawdzone wyjątki zwykle nie są obsługiwane, ponieważ są zgłaszane w przypadkach, gdy program nie może odzyskać swojego stanu. W tej metodzie obsługujemy tylko wyjątek FoursquareApiException.

Gdy serwer WWW odbiera żądanie dla aplikacji, używa deskryptora wdrażania, aby dopasować adres URL żądania do kodu, który musi przetworzyć żądanie. Deskryptor wdrażania to plik XML o nazwie web.xml. Dodajmy opis serwletu śledzenia.

ścieżka org.nsa.tracker.TrackerServlet ścieżka / ścieżka

Teraz żądania do/śledzenia będą obsługiwane przez nasz TrackerServlet. Możesz ustawić parametr Callback Url na poprawną wartość http://localhost:8080/track.

Aby wyświetlić wyniki, możesz użyć interfejsu API Static Maps, udostępnionego przez tę samą korporację Google (https://developers.google.com/maps/documentation/staticmaps/). Nasz aplet wygeneruje prostą stronę HTML i zwróci ją w odpowiedzi na żądanie użytkownika.

StringBuilder sb = nowy StringBuilder (" NSA Tracker"); sb.append (" "); sb.append ("

    "); index = 1; for (checkin checkin: result.getResult()) (sb.append (" ") .append (indeks ++). append (" - ") .append (checkin.getUser (). getFirstName ()) .append (" ") .append (checkin.getUser (). getLastName ()). append ("");) sb.append ("
"); sb.append (" ");

Do wygenerowania strony używana jest klasa StringBuilder, jest to spowodowane tym, że stringi w Javie są obiektami niezmiennymi. Podczas łączenia ciągów za pomocą operatora +. w pamięci tworzony jest nowy wiersz. StringBuilder oszczędza pamięć, używając tablicy znaków do przechowywania połączonych ciągów. Odpowiedź wysyłamy do użytkownika:

Byte resultBytes = sb.toString ().GetBytes ("utf-8"); resp.setContentLength (resultBytes.length); odp.getOutputStream ().zapis (resultBytes);

… I wszystko gotowe. Uruchamiamy go i widzimy coś podobnego do obrazka z napisem „Wynik działania programu”.


Co dalej?

Aplikację można ulepszyć, na przykład, aby oddzielić gromadzenie i wyświetlanie danych. Przenieś gromadzenie danych do oddzielnej usługi, która będzie działać stale i zapamiętywać wszystkie ruchy użytkowników w bazie danych. Wtedy będzie można wyświetlić nie pojedyncze punkty, ale połączoną trasę. Zagłębiając się trochę w API foursquare, możesz wydobyć jeszcze więcej informacji o aktywności użytkownika.

Ale mam nadzieję, że udało mi się najważniejsze: przekonać Cię, że Java jest prosta i fajna. Do zobaczenia za miesiąc!

Książki dla programisty Java

Zalecamy rozpoczęcie nauki języka od książki „Java. Przewodnik dla początkujących Herberta Schildta. Następny poziom to „Java. Kompletny przewodnik "od niego, a więcej o serwletach możesz dowiedzieć się z książki "Java Servlet and JSP Cookbook" Bruce'a W. Perry'ego.

Serwlet to program Java, który działa po stronie serwera aplikacji sieci Web. Tak jak aplety dynamicznie rozszerzają funkcjonalność przeglądarki WWW, tak serwlety dynamicznie rozszerzają funkcjonalność serwera WWW.

Praca serwlet„ale można to opisać w następujący sposób: gdy żądanie pochodzi od klienta, serwer sieciowy może użyć specjalnego pliku konfiguracyjnego, aby określić, który serwlet ma zostać wykonany. Następnie serwer sieciowy uruchamia maszynę JVM, która z kolei wykonuje serwlet. Serwlet przetwarza żądanie i przesyła treść do serwera WWW (prawdopodobnie w formie strony HTML) Serwer WWW wysyła odpowiedź (stronę HTML wygenerowaną przez serwlet) do klienta.

Serwer WEB jest zasadniczo rodzajem kontenera, który się ładuje serwlet s, wykonuje je, a po otrzymaniu od nich wyniku wysyła go do klienta.

Serwlet w architekturze aplikacji internetowych

Ze względu na swoją moc i elastyczność, serwlet„Możesz odegrać znaczącą rolę w architekturze systemu. Mogą wykonywać zadania aplikacyjne przeznaczone dla warstwy pośredniej, pełnić rolę serwera proxy dla klienta, a nawet poprawiać funkcjonalność warstwy pośredniej poprzez dodanie obsługi nowych protokołów i Inne funkcje Warstwa środkowa działa jako serwer aplikacji w tzw.

Servlet jako serwer proxy

Aby obsługiwać aplety, aplety mogą działać jako ich serwery proxy. Może to być ważne, ponieważ zabezpieczenia Java pozwalają apletom łączyć się tylko z serwerem, z którego zostały pobrane. Jeśli aplet musi połączyć się z serwerem bazy danych znajdującym się na innym komputerze, serwlet może utworzyć to połączenie dla apletu.

Tymczasowe i stałe serwlet„NS

Serwlety mogą się uruchamiać i zatrzymywać na każde żądanie klienta. Mogą one również uruchamiać się wraz z uruchomieniem serwera sieci Web i istnieć do momentu jego zatrzymania. Tymczasowy serwlet są ładowane na żądanie i oferują dobry sposób na oszczędzanie zasobów serwera dla rzadko używanych funkcji. Trwałe serwlety są ładowane podczas uruchamiania serwera internetowego i istnieją do momentu jego wyłączenia. Serwlety są instalowane jako trwałe rozszerzenia serwera, jeśli obciążenie jest bardzo wysokie (takie jak nawiązywanie połączenia z bazą danych), jeśli oferują trwałe funkcje po stronie serwera (takie jak usługa RMI) lub w przypadkach, gdy muszą odpowiadać na żądania klientów tak szybko, jak to możliwe. serwlet„ale stałe lub tymczasowe; jest to funkcja konfiguracji serwera WWW.

Cykl życia serwletu, javax.servlet.Servlet

Serwlety działają na platformie serwera WWW w ramach tego samego procesu, co sam serwer WWW. Serwer WWW jest odpowiedzialny za inicjowanie, wywoływanie i niszczenie każdej instancji serwletu. Serwer WWW komunikuje się z serwletem za pomocą prostego interfejsu: javax.servlet.Servlet.

Interfejs javax.servlet.Servlet obejmuje trzy główne metody:

  • w tym ()
  • usługa ()
  • zniszczyć ()

oraz dwie metody pomocnicze:

  • getServletConfig ()
  • getServletInfo ()

Podobieństwa między interfejsami serwlet„ah i aplety Java są oczywiste. Dokładnie to zostało zaprojektowane! Aplety Java są dla serwerów WWW tym, czym aplety dla przeglądarek WWW. Aplet jest wykonywany w przeglądarce WWW, wykonując na żądanie akcje za pośrednictwem specjalnego interfejsu. robi to samo podczas pracy na serwerze WWW.

Inicjalizacja serwletu, metoda init()

Przy pierwszym załadowaniu serwletu wywoływana jest metoda init(). Pozwala to apletowi na wykonanie dowolnej pracy instalacyjnej, takiej jak otwieranie plików lub nawiązywanie połączeń z ich serwerami. Jeśli serwlet jest na stałe zainstalowany na serwerze, jest ładowany podczas uruchamiania serwera. W przeciwnym razie serwer wywołuje aplet po otrzymaniu od klienta pierwszego żądania wykonania usługi świadczonej przez ten serwlet.

Gwarantuje się, że metoda w tym () zakończy się przed jakimkolwiek innym wywołaniem serwletu - takim jak na przykład wywołanie metody usługa ()... zauważ, że w tym () zostanie wywołany tylko raz; nie zostanie wywołany, dopóki aplet nie zostanie rozładowany, a następnie ponownie załadowany przez serwer.

metoda w tym () przyjmuje jeden argument - odwołanie do obiektu Konfiguracja serwletu który zawiera argumenty do zainicjowania serwletu. Ten obiekt ma metodę getServletContext () zwracanie przedmiotu Kontekst serwletu który zawiera informacje o środowisku apletu.

Rdzeń serwletu, metoda usługi ()

metoda usługa () jest sercem serwletu. Każde żądanie od klienta skutkuje jednym wywołaniem metody usługa ()... Ta metoda odczytuje żądanie i konstruuje komunikat odpowiedzi, używając dwóch argumentów ServletRequest i ServletResponse:

Istnieją zatem dwa sposoby przesyłania informacji od klienta do serwletu. Pierwszym z nich jest przekazywanie wartości w parametrach żądania. Wartości parametrów można wstawić do adresu URL. Drugim sposobem przesyłania informacji od klienta do serwletu jest użycie InputStream (lub Readera).

Metoda pracy usługa () zasadniczo proste - tworzy odpowiedź na każde żądanie klienta wysłane do niego z serwera. Należy jednak pamiętać, że w tym samym czasie może być przetwarzanych wiele równoległych żądań. Jeśli metoda usługa () wymaga wszelkich zasobów zewnętrznych, takich jak pliki, bazy danych, konieczne jest zapewnienie, że dostęp do zasobów jest bezpieczny wątkowo.

Rozładowanie serwletu, metoda zniszczenia ()

metoda zniszczyć () wywoływana w celu zwolnienia wszystkich zasobów (takich jak otwarte pliki i połączenia z bazą danych) przed zwolnieniem serwletu. Ta metoda może być pusta, jeśli nie ma potrzeby wykonywania żadnych operacji wykończeniowych. Przed wywołaniem metody zniszczyć () serwer czeka na zakończenie wszystkich operacji obsługi lub przez określony czas. Oznacza to, że metoda zniszczyć () można wywołać, gdy działa jakaś długo działająca metoda usługa ().

Ważne jest, aby sformalizować metodę zniszczyć () w taki sposób, aby uniknąć zamknięcia wymaganych zasobów do czasu wszystkich połączeń usługa () się nie skończy.

Konfiguracja serwletu, metoda getServletConfig ()

metoda getServletConfig () zwraca referencję do obiektu, który implementuje interfejs Konfiguracja serwletu... Obiekt ten zapewnia dostęp do informacji konfiguracyjnych serwletów, tj. dostęp do parametrów inicjalizacji serwletu i obiektu kontekstu serwletu Kontekst serwletu co daje dostęp do serwletu i jego środowiska.

Informacje o serwlecie, metoda getServletInfo ()

metoda getServletInfo () jest zdefiniowany przez programistę tworzącego serwlet, aby zwrócić ciąg znaków zawierający informacje o aplecie, takie jak autor i wersja serwletu.

Interfejs żądania serwletu

ServletRequest dostarcza do serwletu informacje klienta o parametrach żądania HTTP, tj. udostępnia dane, w tym nazwę i wartości parametru, atrybuty i strumień wejściowy. Ta informacja jest przekazywana do metody usługa ().

Następny przykład serwletu pokazuje, jak uzyskać informacje z parametru wniosek metoda usługa ():

Czytnik BufferedReader; Ciąg param1; Ciąg param2; public void service (żądanie ServletRequest, odpowiedź ServletResponse) (reader = request.getReader (); param1 = request.getParameter ("Pierwszy"); param2 = request.getParameter ("Drugi");)

Dodatkowe informacje o żądaniu są dostępne dla apletu za pomocą metod, z których główne przedstawiono w poniższej tabeli:

pobierzAtrybut () Zwraca wartość określonego atrybutu tego żądania.
pobierzDługośćZawartości () Poproś o rozmiar, jeśli jest znany.
getContentType () Zwraca typ MIME treści żądania.
getInputStream () Zwraca InputStream do odczytywania danych binarnych z treści żądania.
Pobierz nazwy parametrów () Zwraca tablicę ciągów z nazwami wszystkich parametrów.
getParameterValues ​​() Zwraca tablicę wartości dla określonego parametru.
pobierzProtokół () Zwraca protokół i wersję dla żądania jako ciąg formularza /..
getReader () Zwraca BufferedReader, aby pobrać tekst z treści żądania.
getRealPath () Zwraca rzeczywistą ścieżkę dla określonej ścieżki wirtualnej.
pobierzRemoteAddr () Adres IP klienta zgłaszającego to żądanie.
pobierzRemoteHost () Nazwa hosta komputera klienckiego, który wysłał to żądanie.
pobierzSchemat () Zwraca schemat użyty w adresie URL dla tego żądania (na przykład https, http, ftp itp.).
pobierz nazwęSerwera () Nazwa hosta serwera, który zaakceptował żądanie.
pobierz port_serwera () Zwraca numer portu użyty do odebrania tego żądania.

Interfejs ServletResponse

Berło Odpowiedź serwletu to narzędzie do przesyłania danych do klienta. Wszystkie metody tego narzędzia służą właśnie rozwiązaniu tego problemu:

Public java.lang.String getCharacterEncoding () public void setLocale (java.util.Locale loc) public java.util.Locale getLocale ()

Pierwsza metoda zwraca typ kodowania MIME (na przykład UTF8), w którym będą wyświetlane informacje. Dwie drugie metody działają również z zestawem znaków. Wskazują język użyty w dokumencie (na przykład - rosyjski).

Public ServletOutputStream getOutputStream () wyrzuca java.io.IOException

Metoda getOutputStream zwraca strumień wyjściowy dla serwletu. Ten strumień jest używany na przykład do wyprowadzania plików binarnych. Dane tekstowe można wyprowadzić za pomocą java.io.Writer:

Publiczny java.io.PrintWriter getWriter () wyrzuca java.io.IOException

Metoda getWriter() automatycznie konwertuje ciągi znaków na zestaw znaków określony w metodach getCharacterEncoding() i getLocale().

Public void setContentLength (int len)

Metoda setContentLength ustawia wartość nagłówka HTTP „Content-Length”

Publiczny void setContentType (typ String)

Metoda setContentType służy do wysyłania typu zawartości MIME dokumentu. Pole nagłówka HTTP „Content-Type”.

Strumień wyjściowy jest buforowany. Oznacza to, że porcja danych zostanie zwrócona klientowi dopiero po zapełnieniu bufora.

Public void setBufferSize (rozmiar int) public int getBufferSize () public void flushBuffer () wyrzuca java.io.IOException public void resetBuffer ()

Powyższe 4 metody pozwalają odpowiednio ustawić rozmiar bufora wysyłania, uzyskać jego rozmiar, zainicjować wysyłanie zawartości bufora do klienta bez oczekiwania na jego wypełnienie, a także wyczyścić ten bufor danych.

Publiczna wartość logiczna isCommitted ()

Za pomocą metody isCommitted można uzyskać flagę, czy wysyłanie danych do klienta już się rozpoczęło. Flaga będzie dodatnia, jeśli nagłówek odpowiedzi HTTP został już wysłany.

Reset publicznego unieważnienia ()

Jeśli nagłówek HTTP nie został jeszcze wysłany, metoda resetowania „resetuje” nagłówek HTTP do wartości „domyślnych”.

Wykresy JFreeChart w serwletach

Biblioteka graficzna JFreeChart może być używana w serwletach do tworzenia wykresów i wyświetlania ich na stronach serwisu w postaci obrazów. Podano szczegóły i przykłady użycia JFreeChart w serwletach.

Servlet z biblioteką graficzną Chart.js

JNI w serwlecie

W niektórych przypadkach może być konieczne użycie JNI w aplikacji WEB. Przedstawiono przykład użycia JNI w serwletach.

Wiadomości JMS w serwlecie

Servlet może służyć do wymiany JMS wiadomości między aplikacjami. Przedstawiono przykład użycia serwletu do wysyłania i odczytywania wiadomości JMS w kontenerze JBoss.

Czym są serwlety? Serwlety to w rzeczywistości moduły przetwarzania HTTP i FTP używane do budowy bramek internetowych.

Podstawą tych portali jest sam WEB serwer - program przechowujący gniazdo serwera, odbierający i przesyłający dane. Najczęściej, aby przyspieszyć pracę, serwer jest napisany nie w Javie, ale w jakimś innym języku programowania (na przykład w C++).

Podstawowy serwlet działa w połączeniu z serwerem. To do niego serwer wysyła dane i od niego otrzymuje odpowiedź wysłaną do klienta. W rzeczywistości bazowy serwlet jest „mózgiem” serwera. Główną funkcją tego apletu jest odczytanie żądania klienta, odszyfrowanie go i zgodnie z deszyfrowaniem przekazanie pracy do apletu odpowiedzialnego za tego typu żądane informacje. Często sam serwer działa jako bazowy serwlet, aby osiągnąć prędkość. Tak właśnie działa Jacarta Tomcat.

Rysunek przedstawia schemat przekazywania połączeń (żądań) i odpowiedzi (odpowiedzi) między serwerem a serwletami. Ten diagram przedstawia działanie serwera HTTP, który ma kilka stron JSP i dwa zasoby „/przykład1” i „/przykład2”, które są przetwarzane przez dwa serwlety – odpowiednio „Przykład1 serwlet” i „Przykład2 serwlet”.

Przeanalizujmy krok po kroku, co pokazano na rysunku:

  1. klient łączy się z serwerem
  2. serwer przekazuje żądanie do "Servlet Podstawowy"
  3. bazowy serwlet pobiera identyfikator URI zasobu z żądania
    • jeśli identyfikator URI wskazuje na „/ sample1”, to żądanie całkowicie(bez zmian) przekazany do serwletu „Sample1 Servlet”, który dalej przetwarza to żądanie
    • jeśli URI wskazuje na "/ sample2", serwer przekazuje żądanie do "Sample2 Servlet"
    • we wszystkich innych przypadkach żądanie jest przekazywane do modułu „JSP Servlet”
  4. aplet, któremu nadano kontrolę, przetwarza dane, tworzy odpowiedź, a następnie odpowiedź jest wysyłana z powrotem do bazowego serwletu.
  5. podstawowy serwlet, bez przetwarzania otrzymanych danych, natychmiast odsyła je z powrotem na serwer
  6. serwer wysyła dane do klienta

W ten sposób zadanie przetwarzania żądania podzielone jest na logiczne części, za każdą z których odpowiada osobny moduł, własna „cegła programowa”. W rzeczywistości może być o wiele więcej etapów przetwarzania żądania. Na przykład za metody „GET” i „POST” mogą odpowiadać różne moduły.

Interfejs serwletu

Cechą wspólną wszystkich tych modułów jest to, że są one połączone na całej linii za pomocą interfejsu javax.servlet.Servlet

Przyjrzyjmy się temu interfejsowi. Wymienia tylko 5 metod:

Publiczne void init (konfiguracja ServletConfig) zgłasza ServletException Ta metoda jest wywoływana w celu poinformowania serwletu, że jest on włączony jako moduł do obsługi żądań klientów. Parametr config oddziela interfejs javax.servlet.ServletConfig, który zawiera informacje o środowisku serwera, nazwie serwletu, parametrach początkowych i innych walorach. Interfejs javax.servlet.ServletConfig zostanie omówiony nieco później. Zakłada się, że po wywołaniu tej funkcji aplet starannie zapisze tę konfigurację w swojej zmiennej i wyda ją inną metodą: public ServletConfig getServletConfig() Po otrzymaniu informacji systemowych za pomocą "getServletConfig()" serwer może chcieć się dowiedzieć nazwisko autora, data utworzenia, inne informacje o aplecie, które uzyskuje się poprzez wywołanie public String getServletInfo()

Aby przetworzyć żądanie i uzyskać wynik jego przetworzenia, użyj funkcji

Publiczna usługa void (żądanie ServletRequest, odpowiedź ServletResponse) wyrzuca ServletException, java.io.IOException W tej funkcji do kodu, który będzie przetwarzał dane, przekazywane są dwa narzędzia: jedno do odebrania danych z serwera, drugie do wysłania wyniku serwletu. W związku z tym są to parametry żądania i odpowiedzi, które oddzielają interfejsy javax.servlet.ServletRequest i javax.servlet.ServletResponse. Cała praca z danymi jest wykonywana właśnie przez te interfejsy, więc omówimy je bardziej szczegółowo poniżej.

Gdy serwer nie potrzebuje już tego modułu, wywoływana jest metoda

Public void destroy(), które kończy wszystkie operacje na obiekcie serwletu.

Interfejs ServletConfig

Na interfejs javax.servlet.ServletConfig składają się 4 oczywiste metody:

Public String getServletName () public ServletContext getServletContext () public String getInitParameter (nazwa ciągu) public java.util.Enumeration getInitParameterNames ()

Myślę, że cel wszystkich funkcji jest jasny, z wyjątkiem

Public ServletContext getServletContext () Ta metoda zwraca łącze do bardzo przydatnego narzędzia serwerowego:

Interfejs ServletContext

ServletContext to interfejs definiujący dostęp do następujących bardzo przydatnych funkcji:

GetAttribute obiektu publicznego (nazwa ciągu) public java.util.Enumeration getAttributeNames () public void setAttribute (nazwa ciągu, obiekt obiektu) public void removeAttribute (nazwa ciągu) Cztery metody pracy z atrybutami. Rolę atrybutów pełni dowolny obiekt dowolnej klasy. Celem tych funkcji jest przenoszenie różnych obiektów pomiędzy niepowiązanymi serwletami. public String getInitParameter (String name) public java.util.Enumeration getInitParameterNames () Dostęp do parametrów, z którymi serwer został uruchomiony. Może być też nazwa hosta, port i inne przydatne rzeczy. public int getMajorVersion () public int getMinorVersion () Zwraca wersje Servlet API. public String getMimeType (plik String) Zwraca typ MIME skojarzony z plikiem określonym w zmiennej file. Pamiętaj, jak musiałeś zdefiniować MIME w SimpleWEBServer i doceń wygodę! public java.util.Set getResourcePaths () public java.net.URL getResource (ścieżka String) zgłasza java.net.MalformedURLException public InputStream getResourceAsStream (ścieżka String) Zwraca ścieżki do zasobów dostępnych dla serwera oraz same zasoby jako adresy URL i dane strumieniowe . public RequestDispatcher getRequestDispatcher (ścieżka) public RequestDispatcher getNamedDispatcher (nazwa) RequestDispatcher to narzędzie do przekazywania żądania do innego zasobu. Te funkcje są potrzebne, aby uzyskać obiekt tego narzędzia dla określonych zasobów. To znaczy, powiedzmy, aby przekazać żądanie do serwletu „sample1” z ciała serwletu, możesz to zrobić: getServletConfig ().GetServletContext ().GetNamedDispatcher („sample1”) Prześlij (żądanie, odpowiedź);

Sama klasa RequestDispatcher zawiera tylko dwie metody:

Public void forward (żądanie ServletRequest, odpowiedź ServletResponse) zgłasza ServletException, java.io.IOException public void include (żądanie ServletRequest, odpowiedź ServletResponse) zgłasza ServletException, java.io.IOException Pierwszy to przekierowanie żądania, a drugi to uwzględnienie wynik wywoływanego apletu do wyniku bieżącego. Na przykład, serwlet 1 wypisuje słowo „test 1”, następnie wywołuje include dla serwletu drugiego, a następnie wypisuje słowo „test 2”. Servlet 2 po prostu drukuje słowo „i”. Serwlet 1 wypisze ciąg „test 1 i test 2”. public void log (String msg) Napisz coś do logu serwera. public void log (String message, Throwable throwable) Zdefiniuj wyjątek i frazę, która będzie rejestrowana po odebraniu tego wyjątku. public String getRealPath (ścieżka ciągu) Tłumaczy ścieżkę, taką jak "/index.html" na "http: //host/contextPath/index.html" public String getServerInfo () Zwraca nazwę serwera. public ServletContext getContext (String uripath) Ta metoda umożliwia wymianę ServletContext między różnymi zasobami tego samego serwera. public String getServletContextName () Zwraca nazwę serwletu, do którego należy ten obiekt interfejsu ServletContect.

Interfejs żądania serwletu

Interfejs ServletRequest jest narzędziem do pobierania parametrów żądań HTTP. Ten interfejs ma kilka metod, które są identyczne pod względem nazwy i przeznaczenia z ServletContext:

Public Object getAttribute (nazwa ciągu) public java.util.Enumeration getAttributeNames () public void setAttribute (nazwa ciągu, obiekt o) public void removeAttribute (java.lang.String nazwa) public String getServerName () public RequestDispatcher getRequestDispatcher (ścieżka ciągu)

Pozostałe metody pozwalają wygodnie pracować z nagłówkiem żądania HTTP:

Public String getCharacterEncoding () public void setCharacterEncoding (String env) wyrzuca java.io.UnsupportedEncodingException Praca z kodowaniem znaków w polach nagłówka HTTP. Funkcje ustawiają metodę deszyfrowania żądań CGI z formularza %NN na zwykłe znaki. Na przykład, który standard - KOI8-R, windows-1251 czy UTF-8 - powinien być używany do odszyfrowywania znaków cyrylicy. public int getContentLength () public String getContentType () Odczytuje pola „Content-Length”, „Content-Type” z żądania HTTP. public jString getParameter (nazwa ciągu) public java.util.Enumeration getParameterNames () public String getParameterValues ​​(nazwa ciągu) public java.util.Map getParameterMap () Funkcje do pobrania pola z nagłówka HTTP i jego wartości. public ServletInputStream getInputStream () rzuca java.io.IOException public java.io.BufferedReader getReader () rzuca java.io.IOException Pobierz przychodzący strumień danych lub jego „czytnik”. Czytnik służy do odczytywania informacji tekstowych - automatycznie odszyfruje ciągi znaków zgodnie z określonym zestawem znaków. Uwaga! W J2EE 1.3 występuje poważny błąd: podczas odszyfrowywania znaku% 25 (znak% w żądaniach Post i Get), czytnik wyświetla błąd (błąd występuje na serwerach Tomcat 4 i Resign). Możliwe, że podobny błąd występuje z innymi symbolami. public String getProtocol () Pobierz wersję HTTP protokołu żądania (na przykład „HTTP / 1.1”). public String getScheme () Zwraca nazwę schematu żądania. Na przykład „http”, „https” lub „ftp”. public int getServerPort () public String getRemoteAddr () public String getRemoteHost () public boolean isSecure () Port serwera, adres IP klienta, nazwa hosta klienta i czy połączenie jest prywatne (HTTPS) public java.util.Locale getLocale () public java.util .Enumeration getLocales () Preferowany język dokumentu klienta (wynik przetworzenia pola „Accept-Language”)

Interfejs ServletResponse

Interfejs ServletResponse to narzędzie do wysyłania danych do klienta. Wszystkie metody tego narzędzia służą właśnie temu celowi:

Public java.lang.String getCharacterEncoding() public void setLocale (java.util.Locale loc) public java.util.Locale getLocale() Pierwsza metoda zwraca typ kodowania MIME (na przykład UTF8), w którym będą wystawiany. Dwie drugie metody działają również z zestawem znaków. Wskazują język użyty w dokumencie (na przykład - rosyjski). public ServletOutputStream getOutputStream () wyrzuca java.io.IOException Zwraca strumień wyjściowy dla serwletu. Ten strumień jest używany na przykład do wyprowadzania plików binarnych. Dane tekstowe mogą być wyprowadzane za pomocą java.io.Writer: public java.io.PrintWriter getWriter () wyrzuca java.io.IOException Ta metoda automatycznie konwertuje ciągi znaków na zestaw znaków określony w metodach getCharacterEncoding () i getLocale (). public void setContentLength (int len) Ta metoda ustawia wartość pola nagłówka HTTP „Content-Length” public void setContentType (typ String) Metoda wysyłania typu zawartości MIME dokumentu. Pole nagłówka HTTP „Content-Type”. public void setBufferSize (rozmiar int) public int getBufferSize () public void flushBuffer () wyrzuca java.io.IOException public void resetBuffer () Chodzi o to, że strumień wyjściowy jest buforowany. Oznacza to, że następna porcja danych zostanie wydana klientowi dopiero po zapełnieniu bufora. Metody te pozwalają odpowiednio ustawić rozmiar bufora wysyłania, pobrać jego rozmiar, zainicjować wysłanie zawartości bufora do klienta bez czekania na jego wypełnienie, a także wyczyścić ten bufor z danych. public boolean isCommitted () Za pomocą tej metody można uzyskać flagę, czy dane zostały już wysłane do klienta. Flaga będzie dodatnia, jeśli nagłówek odpowiedzi HTTP został już wysłany. public void reset() Jeśli nagłówek HTTP nie został jeszcze wysłany, ta metoda „resetuje” nagłówek HTTP do jego „domyślnych” wartości.

Predefiniowane typy serwletów

Java Servlet API, oprócz rzeczywistych interfejsów, zawiera również kilka klas serwletów, które mogą służyć jako podstawa dla twoich programów.

Podstawą dla wszystkich tych klas jest klasa abstrakcyjna javax.servlet.GenericServlet:

Publiczna klasa abstrakcyjna GenericServlet implementuje Servlet, ServletConfig, java.io.Serializable

Jak widać z definicji tej klasy, posiada ona wszystkie metody interfejsów Servlet i ServletConfig. Jedyną niezaimplementowaną metodą jest

Publiczna abstrakcyjna usługa void (ServletRequest req, ServletResponse res) wyrzuca ServletException, java.io.IOException, który został zadeklarowany jako abstrakcyjny.

Na podstawie tej klasy powstała kolejna klasa abstrakcyjna - javax.servlet.http.HttpServlet:

Publiczna klasa abstrakcyjna HttpServlet rozszerza GenericServlet implementuje java.io.Serializable

Klasa ta została stworzona zgodnie z koncepcją „jeszcze większej wygody dla programisty” i posiada wiele przydatnych metod:

Chronione void doDelete (HttpServletRequest req, HttpServletResponse ew.) zgłasza ServletException, java.io.IOException protected void doGet (HttpServletRequest req, HttpServletResponse ew.) rzuca Servlet. throwException, wyjątek java.io.io protected Req. HttpServletResponse (odp.) zgłasza ServletException, java.io.IOException chroniony void doPost (HttpServletRequest req, HttpServletResponse odp.) zgłasza Servlet.Exception zgłasza ServletException, java.io.IOException chroniony void doTrace (HttpServletRequest req.vlet.req.HttpServletResponse) IOException chroniony void service (HttpServletRequest req, HttpServ throws, java. resp., ServletR response res) generuje ServletException, java.io.IOException Różne opcje usług (ServletRequest req, ServletResponse res) dla różnych metod HTTP od DELETE i GET do PUT i TRACE. Aby wygodnie odbierać dane przez interfejs CGI bez odszyfrowywania nagłówka, stworzono klasy HttpServletRequest i HttpServletResponse, które są dołączone do HttpServlet w pakiecie javax.servlet. ostatniej modyfikacji obiektu HttpServlet req Pobiera wartość czasu z pola „Date” nagłówka żądania HTTP. Jeśli pole nie zostanie znalezione, zwraca -1.

W związku z tym przeanalizujemy interfejsy HttpServletRequest i HttpServletResponse. Dziedziczą one odpowiednio z ServletRequest i ServletResponse.

HttpServletRequest, oprócz metod odziedziczonych po ServletRequest, posiada również następujące bardzo przydatne metody:

Cookie getCookies () Zwraca zestaw plików cookie wysłanych przez klienta do serwera.

Klasa Cookie, będąca częścią tego samego pakietu javax.servlet.http, zawiera wszystkie możliwe informacje o pliku cookie. Najważniejsze metody tej klasy to

Int getMaxAge () String getName () String getValue () podając odpowiednio czas życia tego ciasteczka, nazwę ciasteczka i jego wartość. Również Cookie (String name, String value) void setValue (String newValue) void setMaxAge (wygaśnięcie), aby utworzyć ciasteczko, ustawić jego wartość i maksymalny wiek. long getDateHeader (String name) Zwraca datę z nagłówka HTTP, jeśli taki istnieje. int getIntHeader (java.lang.String name) Zwraca wartość liczbową pola o nazwie name z nagłówka żądania HTTP String getMethod () Zwraca metodę żądania HTTP. String getQueryString () String getRequestURI () StringBuffer getRequestURL () Zwraca ciąg zawarty w adresie URL dokumentu po znaku „?”, identyfikatorze URI dokumentu i pełnym adresie URL. HttpSession getSession () HttpSession getSession (tworzenie wartości logicznej) boolean isRequestedSessionIdFromCookie () boolean isRequestedSessionIdFromURL () boolean isRequestedSessionIdValid () Funkcje. pozwalając na pracę z tak ważnym mechanizmem przesyłania danych jak sesje.

Sesje są potrzebne do przeciągania danych ze strony na stronę za użytkownikiem. Na przykład, użytkownik odwiedza stronę (1), gdzie przesyłane są do niego pewne dane dla strony (2), a ten zapisuje inne rzeczy dla strony (3).

W zasadzie na stronie (1) możesz wysłać dane do użytkownika, następnie pobrać je na stronie (2), coś dodać, wysłać użytkownikowi… W ten sposób będziesz musiał stale przesyłać cały zestaw danych od klienta do serwera iz powrotem, i wiele razy. Poza tym, że taka spedycja nie zawsze jest wygodna, to dodatkowo pochłania ruch.

Możesz zrobić to samo inaczej - użyj mechanizmu sesji. Mechanizm ten działa w następujący sposób: serwer zapisuje dane przesłane przez użytkownika w osobnym pliku - pliku sesji. Wszelkie prace nad zmianą danych będą wykonywane na zawartości tego pliku. Klient otrzymuje „klucz sesji” (aka klucz sesji, czyli identyfikator sesji) — unikalny wskaźnik do pliku zawierającego dane specjalnie dla tego użytkownika. Teraz, aby otrzymać wszystkie dane dotyczące tego klienta, serwer musi znać tylko klucz sesji. Zaletą tej metody jest wygoda i szybkość jej stosowania.

To są wszystkie główne metody interfejsu HttpServletRequest. Pełną listę metod można znaleźć w dokumentacji Java Servlet API.

Teraz o interfejsie HttpServletRequest. Główna różnica między klasami, które współużytkują ten interfejs, polega na tym, że dane nie są wyprowadzane natychmiast. Po pierwsze, wszystkie dane są pakowane w odpowiedź HTTP. Odpowiedź jest wysyłana dopiero po zakończeniu działania HttpServlet.service().

A więc o metodach:

Void addHeader (nazwa ciągu, wartość ciągu) void addIntHeader (nazwa ciągu, wartość int) void addDateHeader (nazwa ciągu, długa data) Metody dodają parametry do nagłówka HTTP. Ostatnia metoda ustawia parametr „Date”. void addCookie (Cookie cookie) Metoda dodaje cookie do nagłówka boolean ContainsHeader (String name) Umożliwia sprawdzenie, czy nagłówek zawiera już określony parametr. String encodeURL (String url) String encodeRedirectURL (String url) Pierwsza metoda koduje znaki przy użyciu zamiany % NN. Druga metoda robi to samo i wywołuje void sendRedirect (String location) void setStatus (int sc) void sendError (int sc) void sendError (int sc, String msg) Pierwsza ustawia kod powrotu, dwie drugie wysyłają komunikat o błędzie. Interfejs ma następujące możliwe błędy dla parametru sc, odpowiadające kodom powrotu protokołu HTTP: SC_CONTINUE - Kod statusu (100) SC_SWITCHING_PROTOCOLS - Kod statusu (101) SC_OK - Kod statusu (200) SC_CREATED - Kod statusu (201) SC_ACCEPTED - Kod statusu (202) SC_NON_AUTHORITATIVE_INFORMATION - Kod statusu (203) SC_NO_CONTENT - Kod statusu (204) SC_RESET_CONTENT - Kod statusu (205) SC_PARTIAL_CONTENT - Kod statusu (206) SC_MULTIPLE_CHOICES (Status_MULTIPLE_CHOICES - Kod statusu (300) SCAN_MOVED 303) SC_NOT_MODIFIED - Kod statusu (304) SC_USE_PROXY - Kod statusu (305) SC_BAD_REQUEST - Kod statusu (400) SC_UNAUTHORIZED - Kod statusu (401) SC_PAYMENT_REQUIRED - Kod statusu (402) SC_FORBID (Kod statusu) - Kod statusu (404) SC_METHOD_NOT_ Kod statusu (405) SC_NOT_ACCEPTABLE - Kod statusu (406) SC_PROXY_AUTHENTICATION_REQUIRED - Kod statusu (407) SC_REQUEST_TIMEOUT - Status s kod (408) SC_CONFLICT - Kod statusu (409) SC_GONE - Kod statusu (410) SC_LENGTH_REQUIRED - Kod statusu (411) SC_PRECONDITION_FAILED - Kod statusu (412) SC_REQUEST_ENTITY_TOO_LARGE - Status (413) SC_REQUEST kod (415) SC_REQUESABLE - Kod statusu (412) ) SC_EXPECTATION_FAILED - Kod statusu (417) SC_INTERNAL_SERVER_ERROR - Kod statusu (500) SC_NOT_IMPLEMENTED - Kod statusu SC_BAD_CodeAEW2) (504) SC_HTTP_VERSION_NOT_SUPPORTED - Kod statusu (505)

To wszystko, co można powiedzieć o HttpServletResponse

Korzystanie z serwletów w aplikacjach internetowych

Porozmawiajmy teraz o wykorzystaniu serwletów w aplikacjach WEB. Aby to zrobić, podam dwa przydatne przykłady, które mogą być przydatne w praktyce.

Pierwszy przykład pokazuje metody pracy z HttpServlet i wyprowadzania skompresowanej zawartości strony HTML. Teoretycznie strona HTML w odpowiedzi przeglądarki jest wyświetlana w postaci zwykłego tekstu, ale w celu zmniejszenia ilości przesyłanych danych można zastosować kompresję GZIP. Nowoczesne przeglądarki (przynajmniej przeglądarki czwartej generacji i nowsze) obsługują tę metodę wysyłania informacji tekstowych i renderują stronę tak, jakby nie była skompresowana.

importuj javę. i.*; importować javax. serwlet *; importować javax. serwlet. http.*; importuj javę. utyl. zamek błyskawiczny. *; // serwlet dziedziczy po HttpServlet public class ZipServlet rozszerza HttpServlet ( // funkcja do obsługi metody GET public void doGet (żądanie HttpServletRequest, odpowiedź HttpServletResponse) wyrzuca ServletException, IOException ( // ustaw stronę jako dokument HTML odpowiedź. setContentType ("tekst / html"); // pobierz parametr "Accept-Encoding" z nagłówka HTTP Kodowanie ciągów = żądanie. getHeader ("Kodowanie akceptacji"); // weź parametr "encoding" - wcześniej określone kodowanie dokumentu Ciąg encodeFlag = żądanie. getParameter („kodowanie”); // Gdzie wypiszemy PrintWriter się; // jeśli w żądaniu występuje pole „Accept-Encoding” if (kodowanie! = null) ( // a jeśli to pole zawiera wartość "gzip" a kodowanie nie zostało jeszcze ustawione, if ((encodings. indexOf ("gzip")! = - 1) &&! encodeFlag. equals ("none")) ( // po wyjściu pojawi się jeden i skompresuje tekst za pomocą GZIP out = new PrintWriter (new GZIPOutputStream (response. getOutputStream ()), false); // i ustaw flagę dla przeglądarki, że dokument będzie skompresowany odpowiedź. setHeader („Kodowanie treści”, „gzip”); ) w przeciwnym razie out = odpowiedź. getWriter (); ) w przeciwnym razie // w przeciwnym razie wypiszemy bez kompresji out = odpowiedź. getWriter (); na zewnątrz. println ("To test !!!"); // napisz treść dokumentu na zewnątrz. blisko (); // i zamknij wyjście. // Wszystko, po wykonaniu tej funkcji dokument zostanie wysłany } }

Drugi przykład pokazuje, jak aplet może renderować stronę w sposób ciągły. Ten rodzaj wyświetlania strony może być używany na przykład w czatach: aby przeczytać nowe wiadomości, nie będziesz musiał za każdym razem odświeżać strony, nowe wiadomości będą po prostu pobierane z czasem. Należy zauważyć, że niektóre serwery proxy nie obsługują tego typu przesyłania danych, ale z tym - niestety - nic się nie da zrobić.

importuj javę. i.*; importować javax. serwlet *; // program implementuje interfejs Servlet klasa DoloadServlet implementuje Servlet (konfiguracja ServletConfig; // obiekt ServletConfig public DoloadServlet () () // nic nie robić // zapisz konfigurację podczas inicjalizacji public void init (konfiguracja ServletConfig) zgłasza ServletException (this.config = config;) // rozdaje zapisaną konfigurację public ServletConfig getServletConfig () (zwróć konfigurację;) // informacje o serwlecie public String getServletInfo () (zwróć "DoloadServlet";) public void zniszcz () () // nic nie robić // Przetwarzanie żądania public void service (żądanie ServletRequest, odpowiedź ServletResponse) wyrzuca ServletException, java. ja. IOException ( // nie przeanalizujemy żądania, to tylko bałagan // utwórz nagłówek HTTP: Nagłówek ciągu = "HTTP / 1.0 200 OK \ n" + + "Serwer: DoloadServlet \ n" + "Typ treści: tekst / html; zestaw znaków = UTF-8 \ n"+ "Połączenie: Keep-Alive \ n" + "Kodowanie treści: wieloczęściowe / mieszane \ n"+ "Kodowanie transferu: podzielone" + "Pragma: brak pamięci podręcznej \ n \ n"; // teraz dodaj początkowe dane // dla tego przykładu - 20 tagów "
„z łamaniem wiersza
dla (int i = 0; i< 20 ; i++ ) head = head + "
\ n "; // weź strumień wyjściowy ServletOutputStream os = odpowiedź. getOutputStream (); // wpisz tam tytuł i dane początkowe os. druk (głowa); // wyślij klientowi wszystko zapisane w buforze odpowiedź. bufor do płukania (); // zacznij dodawać nowe linie: // te linie będą wyglądać tak: numer linii, a następnie "
\ n "
// każda nowa linia będzie pojawiać się co 3 sekundy int i = 0; podczas (prawda) ( // licznik przyrostów++; // napisz linię os. drukuj ("" + i + "
\ n "); // opróżnij bufor response.flushBuffer(); // zamrozić strumień na 3 sekundy spróbuj (sleep (3000);) catch (wyjątek e) ())))

Pozostaje powiedzieć, że mechanizm serwletów jest bardzo elastyczny i pozwala robić rzeczy, które mogą wymagać napisania osobnego serwera WEB (jak na przykład w przypadku serwletu wznowienia). Wadami serwletów są niska prędkość pierwszego uruchomienia (serwlet jest po prostu kompilowany przez maszynę JIT), duże zużycie pamięci oraz brak wszystkich programów Java - niska prędkość pracy z łańcuchami. Ta ostatnia okoliczność staje się zauważalna, gdy działają aplety, które akceptują dane tekstowe w żądaniach POST. Żądanie POST o wielkości 50 KB do HttpServlet podczas analizowania za pomocą HttpServletRequest.getReader() może sparaliżować serwer na kilka minut. To samo dotyczy innych programów Java.

Oto dwa małe przykłady:

// podano ciąg Ciąg tekst // przykład 1 // praca z napisem przy użyciu operacji "+" dla String Test ciągu1 = ""; dla (int i = 0; i< text. length(); i++ ) test1 += text. charAt(i); // przykład 2 // praca z ciągiem za pomocą bufora char buf = nowy znak [tekst. długość ()]; dla (int i = 0; i< text. length(); i++ ) buf[ i] = text. charAt(i); String sample2 = new String(buf);

Jeśli weźmiemy małe napisy - do 2-3 kb, to różnice w działaniu przykładów są nieznaczne, ale jeśli weźmiemy tekst napisowy o wielkości co najmniej 10 kb, to w pierwszym przypadku program zadziała ze sznurkiem znacznie wolniej. Jest to zgodne z projektem w java i stanowi problem w implementacji funkcji klasy String. Więc jeśli chcesz napisać szybki serwlet, unikaj pracy z długimi łańcuchami poprzez klasę String, na przykład użyj klasy StringBuffer. Ostrzeżenie to dotyczy przede wszystkim odbierania dużych tekstów z sieci i przetwarzania lokalnych plików (na przykład w przypadku bazy tekstowej dla księgi gości z dużą liczbą wiadomości).

Kolejny problem dotyczy wielozadaniowości systemu WEB. Należy pamiętać, że wielu użytkowników może jednocześnie zażądać serwletu. Często występują problemy z synchronizacją danych, wymianą informacji pomiędzy różnymi wątkami obliczeniowymi tego samego serwletu, a najczęstszym problemem jest problem synchronicznego dostępu do plików i innych nazwanych zasobów systemowych. Na przykład jeden program otworzył plik do odczytu, podczas gdy drugi próbuje coś tam napisać. W rezultacie drugi program albo otrzymuje wyjątek, albo czeka na zwolnienie pliku do zapisu. W związku z tym chciałbym zwrócić waszą uwagę: nie zostawiajcie za sobą niezamkniętych strumieni i zamykajcie strumienie, gdy tylko przestaną być potrzebne. Strumień oczywiście zostanie później automatycznie zamknięty, ale stanie się to tylko wtedy, gdy dostanie się do niego „zamiatacz”, a tymczasem drugi program nadal nie będzie miał dostępu do zapisu do pliku.

Oprócz wielozadaniowości chciałbym zauważyć, że przy użyciu metod interfejsu ServletContext "Object getAttribute (String name)" i "void setAttribute (String name, Object object)" można wymieniać dane między serwletami, w tym synchronizować dane.

Jedną z najprzyjemniejszych cech Javy jest jej wieloaspektowy charakter. Oczywiście budowanie tradycyjnych aplikacji stacjonarnych, a nawet mobilnych jest świetne. Ale co, jeśli chcesz zejść z utartych ścieżek i wkroczyć na terytorium tworzenia aplikacji webowych w Javie? Dobrą wiadomością dla Ciebie jest to, że język jest wyposażony w pełne API Servlet, które pozwala na budowanie solidnych aplikacji internetowych bez większego wysiłku.

Pisanie aplikacji Java za pomocą serwletów

Stworzyliśmy więc już pliki konfiguracyjne dla aplikacji. Jednak w obecnym stanie dosłownie nic nie robi. Chcemy, aby klienci mogli rejestrować się za pomocą formularza HTML, więc następną rzeczą, którą musimy zrobić, jest utworzenie plików JSP, które będą wyświetlać powyższy formularz i dane klienta po pomyślnej rejestracji. To właśnie zamierzamy teraz zrobić.

Pracujemy nad wyglądem

O wyglądzie aplikacji decydują dwa pliki JSP - w kontekście MVC są to tak zwane widoki. Pierwszy będzie odpowiedzialny za wyświetlenie formularza rejestracyjnego oraz ewentualne błędy powstałe po sprawdzeniu wprowadzonych danych. Drugim będzie zwykła strona powitalna, na której będą widoczne dane wprowadzone przez klienta po pomyślnym zakończeniu procesu rejestracji.

Oto pierwszy plik JSP:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> rejestracja

rejestracja

$ (naruszenie).