Java Servlet to program po stronie serwera napisany w języku programowania o tej samej nazwie, który odbiera sygnały klienta i odsyła do niego odpowiedzi. Jest to kluczowy element konstrukcyjny w typowej Java EE, oprócz JSP, EJB, XML i innych powiązanych technologii. Aplikacja może być spakowana w pliku WAR (chive Web AR) w celu wdrożenia na serwerze WWW. Serwer, na którym można uruchomić serwlet Java, nazywany jest kontenerem. Program działający na takim serwerze może tworzyć dynamiczne strony internetowe.
Serwlet Java: podstawy
Najpopularniejszymi i najczęściej używanymi kontenerami są Tomcat i JBoss. Technicznie rzecz biorąc, Servlet jest normalną klasą Javy, która ma rozszerzenie dla protokołu Common Client Server Protocol lub HTTP. W praktyce jest używany do przetwarzania żądań odpowiednio przez nadpisania HttpServlet GET i POST. Kontener Java Servlet udostępnia Http.ServletRequest i Http.ServletResponse, które są obiektami typu żądanie-odpowiedź. I jest zwykle używany w połączeniu z JSP do generowania zawartości dynamicznej.
Typowy scenariusz modelu:
Filtry serwletów Java to wtyczki Java, które służą do przechwytywania i przetwarzania żądań przed ich wysłaniem do serwletów i odpowiadania po zakończeniu kodu oraz przed wysłaniem przez kontener odpowiedzi do klienta.
Typowe zadania wykonywane za pomocą filtrów:
Filtry są połączone i skonfigurowane w pliku deskryptora wdrażania (web.xml). Serwlety i filtry nie znają się nawzajem, więc możesz dodać lub usunąć filtr po prostu edytując web.xml. Dozwolone jest posiadanie wielu filtrów dla pojedynczego zasobu, tworzenie łańcucha filtrów dla web.xml lub uruchamianie filtrów Java Servlet poprzez implementację interfejsu javax.servlet.Filter.
Żądania równoległe do serwera są przetwarzane przez wątki, co zapewnia ważne cechy sieci - wielowątkowość i współbieżność.
Główne funkcje:
Potrzeba dynamicznych stron internetowych
Istnieje wiele powodów, dla których firma chciałaby tworzyć dynamiczne strony internetowe w locie, na przykład gdy dane na stronie często się zmieniają. Witryny z wiadomościami i pogodą zazwyczaj polegają na CGI, aby zachować aktualność treści bez konieczności ciągłej uwagi programistów. Strony internetowe e-commerce, które zawierają aktualne ceny i stany magazynowe, wykorzystują CGI do pobierania tych treści na żądanie z wewnętrznej infrastruktury firmy.
Wielu użytkowników ma doświadczenie w używaniu technologii Java do tworzenia usług internetowych opartych na CGI, ale Serwlety Java są wydajniejsze, wydajniejsze, łatwiejsze w użyciu i tańsze niż tradycyjne alternatywy CGI.
Korzyści z serwletów Java:
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 utartej ścieżki i wkroczyć na terytorium tworzenia aplikacji webowych w Javie? Dobra wiadomość dla Ciebie: język jest dostarczany z pełnym API Servlet, który pozwala na tworzenie 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 i 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
$ (naruszenie).
Plik zawiera prosty kod HTML z kilkoma dodatkami. Oto piękno JSP połączone z JSTL i JEL. Zwróć uwagę, jak łatwo jest sprawdzić błędy walidacji za pomocą standardowych tagów, takich jak<с:if>oraz
Atrybut akcji formularza rejestracyjnego wskazuje na następujący adres URL: $ (pageContext.request.contextPath) / processcustomer. Oznacza to, że za każdym razem, gdy klient spróbuje się zarejestrować, dane zostaną przesłane do klienta procesowego niezależnie od adresu URL, pod którym dostępny jest formularz. Osiąga się to poprzez funkcjonalność obiektów dostępnych z pliku JSP, takich jak żądanie.
Wkrótce zobaczymy, w jaki sposób aplet łączy się z adresem URL klienta procesu i jak współdziała z danymi wejściowymi. Na razie spójrzmy na plik JSP, który odpowiada za stronę powitalną:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Dziękujemy za rejestrację!
Wprowadzone przez Ciebie dane:
Nazwa:$ (imię)
Nazwisko:$ (nazwisko)
E-mail:$ (e-mail)
Teraz, gdy zorientowaliśmy się, w jaki sposób strony są wyświetlane, następnym krokiem jest utworzenie serwletu odpowiedzialnego za zbieranie danych klienta z żądań POST i weryfikację danych w łatwy sposób.
Pisanie kontrolera
Napisanie apletu, który może pobierać dane z formularza rejestracyjnego, jest tak proste, jak łuskanie gruszek. Wystarczy napisać podklasę dla klasy HttpServlet i zaimplementować jej metody doGet() lub doPost() (lub obie, jeśli to konieczne). W takim przypadku aplet będzie oddziaływał z danymi pochodzącymi z żądań POST.
Tak to wygląda:
@WebServlet (name = "CustomerController", urlPatterns = "/ processcustomer") public class CustomerController extends HttpServlet (@Override protected void doPost (HttpServletRequest request, HttpServletResponse response) rzuca ServletException, IOestException (requestPrommetersquestrequestrequestrequestrequestre) .setA); customer.validate (); if (! naruszenia.isEmpty ()) (request.setAttribute ("naruszenia", naruszenia);) String url = defineUrl (naruszenia); request.getRequestDispatcher (url ) .forward (żądanie, odpowiedź); ) private String określUrl (Lista naruszeń) (if (! naruszenia.isEmpty ()) (zwraca "/";) else (zwraca "/WEB-INF/views/customerinfo.jsp"; )) prywatna statyczna klasa RequestCustomer (koniec prywatny String firstName; prywatny końcowy String lastName; prywatny końcowy String e-mail; prywatny RequestCustomer (String firstName, String lastName, String e-mail) (this.firstName = firstName; th is.lastName = nazwisko; ten.email = e-mail; ) publiczny statyczny RequestCustomer fromRequestParameters (żądanie HttpServletRequest) (zwróć nowy RequestCustomer (request.getParameter ("imię")), request.getParameter ("nazwisko"), request.getParameter ("email"));) public void setAsRequest requestAttributes (HttpServletRequest request.setAttribute („imię”, imię); request.setAttribute („nazwisko”, nazwisko); request.setAttribute („e-mail”, e-mail);) walidacja listy publicznej () (naruszenia listy = nowa ArrayList<>(); if (! StringValidator.validate (firstName)) (violations.add ("Imię jest polem wymaganym");) if (! StringValidator.validate (lastName)) (violations.add ("Nazwisko jest polem wymaganym") ;) if ( ! EmailValidator.validate (e-mail)) (violations.add ("E-mail musi być poprawnie sformułowany"));) zwraca naruszenia; )))
Pierwszą rzeczą, na którą należy zwrócić uwagę, jest użycie adnotacji @WebServlet (name = "CustomerController", urlPatterns = "/ processcustomer"). Nakazuje on kontenerowi serwletów używać klasy CustomerController do obsługi żądań HTTP w /processcustomer. Ten sam efekt można osiągnąć, dodając dyrektywy mapowania serwletów do pliku web.xml, ale ponieważ używamy specyfikacji Servlet 3.1, nie musimy uciekać się do tej metody.
Tutaj nazwaliśmy serwlet CustomerController, ponieważ dobrą praktyką jest użycie nazwy klasy serwletu jako wartości atrybutu name adnotacji @WebServlet. W przeciwnym razie niektóre kontenery nie będą pasować, co spowoduje błąd 404.
Sama klasa CustomerController wykonuje kilka prostych zadań. W pierwszej kolejności zbiera dane wprowadzone do formularza za pomocą implementacji interfejsu HttpServletRequest, który zawiera wartości odpowiadające polu imienia, nazwiska i adresu e-mail formularza. Następnie ustawia te wartości jako atrybuty żądania, dzięki czemu można je ponownie wyświetlić w formularzu lub na stronie wyników. Na koniec walidatory sprawdzają poprawność wprowadzonych danych.
Walidatory to proste klasy, które sprawdzają pewne właściwości, takie jak to, czy ciąg jest pusty i czy wiadomość e-mail wygląda jak wiadomość e-mail. Na autorskim GitLabie można przyjrzeć się ich realizacji.
Wynik walidacji wpływa na dalszy przebieg zdarzeń: jeśli dane nie są poprawne, klient jest przekierowywany przez obiekt RequestDispatcher na stronę rejestracji, gdzie wyświetlane są odpowiednie błędy. Jeśli wszystko jest w porządku, wyświetla się strona powitalna.
Stworzyliśmy więc całą aplikację internetową Java, która umożliwia rejestrację klientów za pomocą formularza HTML, podstawowego serwletu i kilku stron JSP. Czas zacząć.
Uruchamianie aplikacji
Aby uruchomić aplikację, musisz wykonać następujące czynności:
IntelliJ POMYSŁ). Po wdrożeniu projektu i uruchomieniu go domyślna przeglądarka powinna zaczynać się od okna rejestracji.
Wniosek
Dzięki temu masz wszystkie umiejętności potrzebne do tworzenia własnej aplikacji internetowej Java bez konieczności uciekania się do skomplikowanych frameworków. Wszystko czego potrzebujesz to API Servlet, technologia taka jak JSP do renderowania i wbudowana Java. Świetnie, prawda?
Warto zauważyć, że implementacja klasy CustomerController podkreśla zalety i wady serwletów: z jednej strony pokazuje pokrótce, jak łatwo można przetwarzać parametry żądania i wysyłać odpowiedzi do klienta w różnych formatach. Ale ta funkcjonalność ma swoją cenę: obie implementacje interfejsów HttpServletResponse i HttpServletResponse są zwykłymi lokalizatorami usług. Nie oznacza to, że jest to zła rzecz, ponieważ lokalizatory po prostu zawierają dane. Należy jednak pamiętać, że te implementacje zawsze będą powiązane z apletem.
Serwlety to programy Java, które działają po stronie serwera aplikacji sieci Web. Tak jak aplety dynamicznie rozszerzają funkcjonalność przeglądarki WWW, tak aplety 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 serwletu.
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(), a aplet jest usuwany z pamięci.
- Jakie są zadania, funkcjonalność kontenera serwletów?
Kontener serwletów może działać jako samodzielny serwer WWW, udostępniać strony 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, tylko je modyfikują. Filtr wstępnie przetwarza żądanie przed wejściem 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 żądań będzie kierowanych 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, w jaki sposób żądanie jest tworzone i niszczone oraz jak atrybuty są dodawane i usuwane 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 zabezpieczeń i opisuje określone wymagania konfiguracyjne. Składnia plików deskryptora wdrażania to XML.
- Jak zaimplementować uruchomienie serwletu wraz z uruchamianiem aplikacji?
Kontener serwletów zwykle ładuje serwlet przy pierwszym żądaniu 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, który jest tworzony przez kontener serwletów. 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
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 serwletowi, a ServletContext służy do dostarczania parametrów inicjujących aplikacji dla wszystkich apletów.
- Nie mamy możliwości ustawienia atrybutów w obiekcie ServletConfig, podczas gdy 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 (serwlet, stronę 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 względne w stosunku 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, np. 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 uzyskać 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 żądań i odpowiedzi serwletów. 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.
Czym są serwlety? Serwlety są w rzeczywistości modułami przetwarzania żądań HTTP i FTP, używanymi do budowania 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 odgrywa rolę podstawowego serwletu, 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:
- klient łączy się z serwerem
- serwer przekazuje żądanie do „Serwletu Podstawowego”
- serwlet podstawowy pobiera identyfikator URI zasobu z żądania
- jeśli 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”
- aplet, któremu nadano kontrolę, przetwarza dane, tworzy odpowiedź, a następnie odpowiedź jest wysyłana z powrotem do bazowego serwletu.
- podstawowy serwlet, bez przetwarzania otrzymanych danych, natychmiast odsyła je z powrotem na serwer
- 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 własny moduł, własna „cegła programowa”. W rzeczywistości przetwarzanie żądania może składać się z wielu innych etapów. 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 dołą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 odbioru danych z serwera, a 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 odbywa się właśnie przez te interfejsy, więc porozmawiajmy o nich bardziej szczegółowo.
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
Istotą interfejsu javax.servlet.ServletConfig są 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) generuje 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 zrobić to: getServletConfig ().GetServletContext ().GetNamedDispatcher ("sample1"). Przekaż (żą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 służy do przekierowania żądania, a drugi to za włączenie wyniku pracy 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 jak ServletContext:
Public Object getAttribute (String nazwa) public java.util.Enumeration getAttributeNames () public void setAttribute (String nazwa, 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ń danych wyjściowych 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, 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. public boolean isCommitted() Za pomocą tej metody można uzyskać flagę informującą, że 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 doGet . HttpServletResponse) zgłasza ServletException, java.io.IOException chroniony void doPost (HttpServletRequest req, HttpServletResponse lub) zgłasza Servlet.Exception zgłasza ServletException, java.io.IOException chroniony void doTrace (HttpServletRequest req.vlet.req.HttpServletResponse) IOException chronionej usługi void (HttpServletRequest req, HttpServ throwResvlet lub 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. ostatnia modyfikacja 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, która jest 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 int), 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 logiczne) boolean isRequestedSessionIdFromCookie () boolean isRequestedSessionIdFromURL () boolean isRequestedSessionIdValid () Funkcje. pozwalając na pracę z tak ważnym mechanizmem przesyłania danych jak sesje.
Sesje są niezbędne 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ć do użytkownika... 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: dane przesyłane przez użytkownika zapisywane są przez serwer 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, aka identyfikator sesji) – unikalny wskaźnik do pliku zawierającego dane specjalnie dla tego użytkownika. Teraz, aby uzyskać wszystkie dane dotyczące tego klienta, serwer musi znać tylko klucz sesji. Zaletą tej metody jest wygoda i szybkość jej użytkowania.
To są wszystkie główne metody interfejsu HttpServletRequest. Pełna lista metod znajduje się 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 plik cookie do nagłówka logiczna zawieraHeader (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 zawiera 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 (StatusBID) - Kod statusu (404) SC_ALLOWED_NOT kod (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 - Kod statusu (413) SC_REQUEST kod kodu (415) SC_REQUESTED_SATED_RANIS 416) SC_EXPECTATION_FAILED - Kod statusu (417) SC_INTERNAL_SERVER_ERROR - Kod statusu (500) SC_NOT_IMPLEMENTED - Kod statusu SC_BAD_GATEW2) (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 wyświetlania 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ę. j. *; importować javax. serwlet *; importować javax. serwlet. http.*; importować javę. wykorzystaj. 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 String 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 zakończeniu pracy tej funkcji dokument zostanie wysłany } }Drugi przykład pokazuje, w jaki sposób aplet może renderować stronę w sposób ciągły. Ten rodzaj wyświetlania strony można wykorzystać na przykład w czatach: aby czytać nowe wiadomości, nie trzeba 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ę. j. *; 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) wyrzuca 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 początkowe dane 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 (sen (3000);) catch (wyjątek e) ())))
Pozostaje powiedzieć, że mechanizm serwletów jest bardzo elastyczny i pozwala na tworzenie 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 i brak wszystkich programów Java - niska prędkość pracy z łańcuchami. Ta ostatnia okoliczność staje się zauważalna, gdy działają aplety akceptujące 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 łańcuchem przy użyciu 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 funkcja java i stanowi problem w implementacji funkcji klasy String. Więc jeśli chcesz napisać szybki aplet, unikaj pracy z długimi łańcuchami poprzez klasę String, użyj na przykład 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 tekstowej bazy danych 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 inny 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 dopiero wtedy, gdy dostanie się do niego „śmieciarz”, a tymczasem drugi program nadal nie będzie miał dostępu do zapisu do pliku.
Oprócz wielozadaniowości, chciałbym zauważyć, że za pomocą 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.
Przykładowy serwlet zawiera sam serwlet HelloWorld.java oraz deskryptor aplikacji web.xml. Aplet umożliwia utworzenie strony odpowiedzi przy użyciu cyrylicy. Na poniższym zrzucie ekranu przedstawiono strukturę przykładowego serwletu w środowisku Eclipse IDE.
Lista przykładu serwletu HelloWorld.java
Poniższy kod implementuje prosty serwlet HelloWorld.java który zwraca statyczną stronę HTML do przeglądarki. W tym przykładzie serwlet dziedziczy właściwości HttpServlet, który implementuje interfejs Serwlet.
Importuj java.io.IOException; import java.io.OutputStream; importowanie javax.servlet.ServletConfig; importowanie javax.servlet.http.HttpServlet; import javax.servlet.ServletException; importowanie javax.servlet.http.HttpServletRequest; importowanie javax.servlet.http.HttpServletResponse; public class HelloWorld extends HttpServlet (prywatna konfiguracja ServletConfig; @Override public void init (konfiguracja ServletConfig) wyrzuca ServletException (this.config = config;) @Override public void destroy () () @Override public ServletConfig getServletConfig () (konfiguracja powrotu;) @Override public String getServletInfo () (zwraca "Prosty serwlet";) publiczna usługa void (żądanie HttpServletRequest, odpowiedź HttpServletResponse) wyrzuca ServletException, IOException (response.setContentType ("text/html"); String text = " " + "
" + " " + "Witam% s% s!
"+" "; text = String.format (text, config.getInitParameter (" name"), config.getInitParameter (" mname ")); OutputStream outStream = response.getOutputStream (); outStream.write (text.getBytes (" UTF-8 ")); outStream.flush (); outStream.close ();))Podczas uzyskiwania dostępu do serwletu metoda jest wywoływana usługa który renderuje stronę odpowiedzi i przekazuje ją do przeglądarki za pośrednictwem HttpServletResponse. Pierwsze wiersze odpowiedzi serwera definiują nagłówek Typ zawartości ze wskazaniem kodowania UTF-8. Ponadto nazwa i patronimik otrzymane z deskryptora aplikacji web.xml są zastępowane do szablonu odpowiedzi. Oznacza to, że odczytuje parametry konfiguracyjne serwletu.
Aby móc zwrócić stronę z cyrylicą, użyj Strumień wyjściowy... Wszelkie informacje mogą być wyprowadzane do strumienia wyjściowego (w naszym przykładzie prosty kod HTML).
Lista deskryptorów aplikacji XML
W deskryptorze aplikacji web.xml Parametry serwletu (nazwa nazwa-serwletu i klasa klasa-serwletu) oraz parametry inicjalizacji (imię, drugie imię mnazwa) są zdefiniowane. Aplet odczytuje te parametry za pomocą Konfiguracja serwletu.
Aby uruchomić przykładowy serwlet z poziomu środowiska Eclipse IDE, uruchom serwer aplikacji i wprowadź następujący wiersz w pasku adresu przeglądarki:
Http: // localhost: 8080 / ServletHello / hello
Przeglądarka wyświetli nam powitanie wskazujące głównego bohatera dzieł Ilfa i Pietrowa.
Aby skompilować serwlet oddzielnie, można użyć pliku wsadowego, którego tekst w systemie Windows może wyglądać tak.
SET TOMCAT_LIB = "C: \ Program Files \ Apache Software Foundation \ Tomcat \ common \ lib" SET JAVA_SDK = C: \ Java \ Sun \ SDK \ jdk \ bin \% JAVA_SDK% javac -classpath% TOMCAT_LIB% \ servlet-api. słoik * .java
Po skompilowaniu serwletu HelloWorld.class musi być umieszczony w katalogu WEB-INF / zajęcia / Aplikacje WEB na serwerze Tomcat i rejestracja w deskryptorze dostawy web.xml.
Pobierz przykład
Dostępny jest kod źródłowy przykładowego apletu omówionego w tekście strony (191 KB).
Można obejrzeć przykład serwletu wykorzystującego bibliotekę graficzną Chart.js do dynamicznego generowania strony z wykresami.