serwlet - to Java-nporpaMMa, która używa klasy HttpSerwis. Serwlet służy do rozszerzenia możliwości istniejącego serwera, w szczególności serwera WWW. Zwykle serwlet działa na serwerze dedykowanym. Serwery te nazywane są serwerami aplikacji Java. Serwer aplikacji Java zawiera jako element konstrukcyjny serwer WWW (czasem nie jeden, ale kilka), a także serwery współpracujące z komponentami serwera, serwery usług pomocniczych itp. Serwlet działa w środowisku dostarczonym przez serwer. Część serwera przeznaczona do obsługi serwletów nazywana jest kontenerem serwletów. Specyfikacja serwletu zakłada, że klasa serwletu ma standardowe metody, które są wykonywane w pewnym momencie cyklu życia serwletu. Metody te są wywoływane przez kontener serwletu. Implementacja specyfikacji serwletu jest zawarta w zestawie standardowych pakietów językowych Java.
Ta książka skupia się na serwerze aplikacji Java o nazwie Blazix. Serwer Blazix zapewnia pełny zestaw możliwości serwletów. Oprócz utworzenia klasy serwletu (lub klas), a także skonfigurowania utworzonego programu serwletu i zainstalowania go na serwerze, należy zmienić plik konfiguracyjny serwera WWW. Główne wartości są określone w pliku konfiguracyjnym w następujący sposób: servlet.name: myservlet
servlet.myservlet.className: mypackage.MyServletClass servlet.myservlet.url: /mysrvlet
Każdy serwlet musi mieć nazwę(servlet.name), za pomocą którego jest identyfikowany na serwerze. Ta nazwa służy do ustawienia właściwości serwletu, w szczególności do wskazania nazwy klasy, w której przechowywany jest program serwletu (następna linia), a także adresu, pod którym ten serwlet jest wywoływany (trzecia linia).
Klient pyta serwer WWW o adres, pod którym znajduje się serwlet (adres musi być określony jako wartość servlet.myservlet.url w pliku konfiguracyjnym serwera WWW). Serwer przekazuje żądanie i dane (jeśli istnieją) do serwletu, odbiera odpowiedź od serwletu i wysyła ją do klienta.
Na tym wyjaśnieniu, czym jest serwlet, można by zakończyć. Istnieje jednak wiele interesujących i przydatnych szczegółów, na które należy zwrócić uwagę i przestudiować je bardziej szczegółowo.
Szczególnie ważne jest, aby pamiętać, że ścieżka klasy serwletu musi być określona w zmiennej ciasspath lub można go umieścić w katalogu C:\Blazix\classes lub w katalogu określonym w pliku konfiguracyjnym serwera WWW jako wartość server.ciassDir. Po zmodyfikowaniu pliku konfiguracyjnego w celu uwzględnienia informacji o nowym aplecie należy zatrzymać i ponownie uruchomić serwer. Serwlet może być również hostowany na działającym serwerze za pomocą narzędzia administracyjnego, ale aby to zrobić, serwlet musi być spakowany w pliku archiwum WAR Web. Jeśli plik klasy serwletu uległ zmianie, nie ma potrzeby zatrzymywania i ponownego uruchamiania serwera. Domyślnie serwer jest skonfigurowany w taki sposób, że wywołanie serwletu pod adresem http://localhost:81/_reload powoduje ponowne załadowanie wszystkich klas i udostępnienie zmodyfikowanej klasy serwletu dla żądań klientów (rysunek 4.1). Odwiedź tę stronę po zmodyfikowaniu pliku klasy serwletu. Zatrzymanie serwera po prostu nie jest konieczne.
Jeśli czytelnik miał już pewne doświadczenie z serwletami, doceni prostotę serwera Blazix w porównaniu z innymi serwerami Java, takimi jak serwer Tomcat.
Aby od razu przejść do rzeczy, rozważmy prosty przykład, serwlet jakiś serwlet (listing 4.1).
Lista 4.1. Servlet SomeServlet.java I
importuj java.io.*; import javax.servlet.*; importuj javax.servlet.http.*;
klasa publiczna SomeServlet rozszerza HttpServlet ( public void doGet(HttpServletRequest request,
HttpServletResponse response) zgłasza ServletException, IOException ( Printwriter out = response.getWriter(); out.println("Hello World");
W pliku konfiguracyjnym serwera WWW wpisz:
nazwa.servletu: pierwszy
nazwa.pierwszej.klasy serwletu: Jakiśserwlet
servlet.first.url: /dofirst
Wtedy wywołanie serwletu z przeglądarki przybierze postać http://lokalnyhost:81 /dofirst (Rysunek 4.2).
Serwlety Javy zapewniają niezależną od platformy metodę budowania aplikacji internetowych (nie jest to pewne, ale nie będziemy zagłębiać się w ten temat, ponieważ wtedy musielibyśmy zdefiniować, co należy rozumieć przez aplikację internetową, która nie jest zawarta w lista poruszanych tematów), a wiele aplikacji działa szybko i nie ma ograniczeń aplikacji CGI. Serwlet działa pod serwerem WWW iw przeciwieństwie do apletu nie wymaga graficznego interfejsu użytkownika. Serwlet komunikuje się z serwerem, wymieniając z nim żądania i odpowiedzi. Program kliencki wysyła żądania do serwera. Żądanie jest przetwarzane przez serwer, przekazywane do serwletu, serwlet wysyła odpowiedź za pośrednictwem serwera do klienta. Serwlety są dziś bardzo popularne do tworzenia interaktywnych aplikacji internetowych. Istnieje wiele serwerów WWW, które mogą współpracować z serwletami, na przykład Tomcat, iPlanet Web Server (wcześniej Netscape
Enterprise Server), Blazix. J Builder Enterprise korzysta z Borland Enterprise Server (BES) dołączonego do pakietu, a także obsługuje serwery WWW Logika, WebSphere i iPlanet. J Builder Enterprise Server zawiera serwer Tomcat, który jest używany „domyślnie”.
Ryż. 4.2. Wywoływanie serwletu
Jedną z ważnych zalet serwletów jest ich szybkość. W przeciwieństwie do aplikacji CGI, serwlety są ładowane do pamięci tylko raz, a następnie wykonywane bezpośrednio z pamięci. Serwlety to zasadniczo aplikacje wielowątkowe. Ponadto są niezależne od platformy, ponieważ są napisane w Javie.
technologia JSP do której Rozdział 3 jest rozszerzeniem technologii serwletów w JSP Specjalna uwaga koncentruje się na pracy z dokumentami HTML i XML. Jako część kodu HTML i XML, fragmenty JSP znajdują swoje najpowszechniejsze zastosowanie. Jak dokonać wyboru i zdecydować, czego użyć: serwletów czy stron serwera? Serwlety są bardziej odpowiednie do rozwiązywania zadań programowania niskiego poziomu i mniej odpowiednie do rozwiązywania zadań związanych z tworzeniem logiki prezentacji aplikacji. Z drugiej strony strony JSP po stronie serwera skupiają się głównie na tym, jak najwygodniej przedstawić użytkownikowi wynik. Strony serwera są tworzone bezpośrednio z kodem HTML przy użyciu stylu tworzenia dokumentów HTML. Technologia JSP zapewnia znacznie bogatsze funkcje niż zwykły HTML. JSP mogą zapewnić możliwość implementacji logiki aplikacji przy użyciu prostych komponentów Java, jak również EJB po stronie serwera, poprzez tworzenie niestandardowych bibliotek skrótów. Same strony serwera Java mogą być modułowymi komponentami wielokrotnego użytku, które współpracują z logiką prezentacji i mogą być używane w połączeniu z różnymi szablonami i filtrami. Strony JSP są konwertowane na serwlety, więc teoretycznie można używać tylko serwletów. Jednak technologia JSP została zaprojektowana w celu uproszczenia procesu tworzenia dokumentów internetowych poprzez oddzielenie logiki prezentacji aplikacji od zawartości dokumentu. W większości przypadków odpowiedź wysyłana do klienta składa się zarówno z szablonów prezentacji dokumentów, jak i danych, które są generowane automatycznie po wypełnieniu szablonu. W takich sytuacjach strony JSP są znacznie łatwiejsze w obsłudze niż serwlety.
Jedną z najprzyjemniejszych cech języka Java jest jego wielowymiarowość. Oczywiście tworzenie tradycyjnego pulpitu, a nawet aplikacje mobilne- To jest świetne. Ale co, jeśli chcesz zejść z utartych szlaków i wejść na terytorium programowania Java? Dla ciebie tam dobre wieści: Język jest dostarczany z kompletnym interfejsem API Servlet, który umożliwia tworzenie solidnych aplikacji internetowych bez większych problemów.
Tworzenie aplikacji Java za pomocą serwletów
Stworzyliśmy już pliki konfiguracyjne 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 po pomyślnej rejestracji będą wyświetlać powyższy formularz i dane klienta. To właśnie teraz zrobimy.
Praca nad wyglądem
Wygląd aplikacji definiować będą dwa pliki JSP – w kontekście MVC nazywane są widokami. Pierwszy będzie odpowiedzialny za wyświetlenie formularza rejestracyjnego i możliwe błędy wywoływana po sprawdzeniu poprawności wprowadzonych danych. Druga będzie normalną stroną powitalną, na której zostaną wyświetlone 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 HTML z kilkoma dodatkami. Na tym polega piękno JSP połączonego z JSTL i JEL. Zwróć uwagę, jak łatwo jest sprawdzić błędy sprawdzania poprawności przy użyciu standardowych tagów, takich jak<с:if>I
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 procesucustomer 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 request .
Wkrótce zobaczymy, jak aplet wiąże się z adresem URL klienta procesowego i jak wchodzi w interakcję z danymi wejściowymi. Na razie przyjrzyjmy się plikowi JSP, który odpowiada za stronę powitalną:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Dziękujemy za rejestrację!
Twoje wprowadzone dane:
Nazwa:$(imię)
Nazwisko:$(nazwisko)
E-mail:$(e-mail)
Skoro mamy już za sobą renderowanie stron, kolejnym krokiem jest stworzenie serwletu odpowiedzialnego za zbieranie danych klienta z żądań POST i walidację tych danych w prosty sposób.
Piszemy kontroler
Napisanie serwletu, który może odbierać dane z formularza rejestracyjnego, jest tak proste, jak łuskanie gruszek. Wszystko, co musimy zrobić, to napisać podklasę klasy HttpServlet i zaimplementować jej metody doGet() lub doPost() (lub obie w razie potrzeby). W takim przypadku aplet będzie współdziałał z danymi pochodzącymi z żądań POST.
Oto jak to wygląda:
@WebServlet(name = "CustomerController", urlPatterns = "/processcustomer") klasa publiczna CustomerController rozszerza HttpServlet ( @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) zgłasza wyjątek ServletException, IOException ( RequestCustomer klient = RequestCustomer.fromRequestParameters(request); klient .setAsRequestAttributes(żądanie); Lista naruszeń = klient.validate(); if (!violations.isEmpty()) ( request.setAttribute("naruszenia", naruszenia); ) String url =determinUrl(naruszenia); request.getRequestDispatcher(url .forward(żądanie, odpowiedź); ) private StringdeterminUrl(Lista naruszeń) ( if (!violations.isEmpty()) ( return "/"; ) else ( return "/WEB-INF/views/customerinfo.jsp"; ) ) prywatna klasa statyczna RequestCustomer ( private final String firstname; private string lastname; private final String email; private RequestCustomer(String firstName, String lastName, String email) ( this.firstName = firstName; this.lastName = lastName; this.email = e-mail; ) public static RequestCustomer fromRequestParameters(HttpServletRequest request) ( return new RequestCustomer(request.getParameter("imię"), request.getParameter("nazwisko"), request.getParameter("email")); ) public void setAsRequestAttributes(HttpServletRequest request) ( request.setAttribute("imię", imię); request.setAttribute("nazwisko", lastName); request.setAttribute("email", e-mail); ) public List validate() ( Naruszenia listy = new ArrayList<>(); if (!StringValidator.validate(firstName)) ( naruszenie.add("Imię jest polem wymaganym"); ) if (!StringValidator.validate(nazwisko)) ( naruszenie.add("Nazwisko jest polem wymaganym") ; ) if ( !EmailValidator.validate(email)) ( naruszenie.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"). Mówi kontenerowi serwletu, aby używał klasy CustomerController do obsługi żądań HTTP do /processcustomer . Ten sam efekt można osiągnąć, dodając dyrektywy mapowania serwletów do web.xml, na przykład , ale ponieważ używamy specyfikacji serwletów 3.1, nie musimy uciekać się do tej metody.
Tutaj nazwaliśmy aplet CustomerController, ponieważ dobrą praktyką jest używanie 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ń. Po pierwsze, zbiera dane wejściowe z formularza za pomocą implementacji interfejsu HttpServletRequest, który zawiera wartości odpowiadające polu imię, nazwisko i adres e-mail formularza. Następnie ustawia te wartości jako atrybuty zapytania, dzięki czemu można je ponownie renderować w formularzu lub na stronie wyników. Na koniec walidatorzy sprawdzają poprawność wprowadzonych danych.
Walidatory to proste klasy, które sprawdzają określone właściwości, takie jak to, czy ciąg znaków jest pusty lub czy wiadomość e-mail wygląda jak wiadomość e-mail. Na autorskim GitLabie można zobaczyć ich implementację.
Wynik walidacji wpływa na dalszy przebieg zdarzeń: jeśli dane są niepoprawne, klient jest przekierowywany przez obiekt RequestDispatcher na stronę rejestracji, na której wyświetlane są odpowiednie błędy. Jeśli wszystko jest w porządku, zostanie wyświetlona strona powitalna.
Stworzyliśmy więc kompletną aplikację internetową Java, która umożliwia rejestrację klientów za pomocą formularza HTML, podstawowego serwletu i kilku plików JSP. Pora go uruchomić.
Uruchomienie aplikacji
Aby uruchomić aplikację, musisz wykonać następujące czynności:
POMYSŁ IntelliJ). Po wdrożeniu projektu i uruchomieniu go domyślna przeglądarka powinna uruchomić się z oknem logowania.
Wniosek
Zdobyłeś więc wszystkie umiejętności potrzebne do stworzenia własnej aplikacji internetowej Java bez konieczności uciekania się do złożonych frameworków. Wszystko, czego potrzebujesz, to Servlet API, technologia taka jak JSP do renderowania i wbudowane funkcje Java. To świetnie, prawda?
Warto zauważyć, że implementacja klasy CustomerController uwydatnia zalety i wady serwletów: z jednej strony pokrótce pokazuje, jak łatwo jest przetwarzać parametry żądania i wysyłać odpowiedzi do klienta w różne formaty. 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łe, ponieważ lokalizatory po prostu zawierają dane. Należy jednak pamiętać, że te implementacje zawsze będą powiązane z serwletem.
Serwlet to program Java, który działa po stronie serwera aplikacji internetowej. Tak jak aplety dynamicznie rozszerzają funkcjonalność przeglądarki WWW, tak aplety dynamicznie rozszerzają funkcjonalność serwera WWW.
praca serwlet„i można to opisać w następujący sposób: kiedy nadejdzie żądanie od klienta, serwer WWW może określić, który serwlet ma zostać wykonany przy użyciu specjalnego pliku konfiguracyjnego. Następnie serwer WWW uruchamia maszynę JVM, która z kolei wykonuje serwlet. Serwlet przetwarza żądanie i przekazuje zawartość serwera WWW (prawdopodobnie w postaci strony HTML). Serwer WWW wysyła odpowiedź (stronę HTML wygenerowaną przez serwlet) do klienta.
Serwer WEB jest zasadniczo rodzajem kontenera, który pobiera serwlet„s, wykonuje je i otrzymawszy od nich wynik, wysyła go do klienta.
Servlet w architekturze aplikacji internetowych
Ze względu na swoją moc i elastyczność, serwlet mogą odgrywać 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 pełni rolę serwera aplikacji w tzw. trójwarstwowym systemie klient-serwer i znajduje się pomiędzy „lekkim” klientem, jakim jest przeglądarka WWW, a źródłem danych.
Servlet jako serwer proxy
Aby obsługiwać aplety, serwlety mogą działać jako ich serwery proxy. Może to być ważne, ponieważ system bezpieczeństwa Java zezwala apletom na łączenie 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"S
Serwlety mogą być uruchamiane i zatrzymywane dla każdego żądania klienta. Mogą być również uruchamiane podczas uruchamiania 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 WWW i trwają do jego zatrzymania. Serwlety są instalowane jako trwałe rozszerzenia serwera, jeśli koszt uruchomienia jest bardzo wysoka (np. nawiązywanie połączenia z bazą danych), jeśli oferują stałą funkcjonalność po stronie serwera (np. usługa RMI) lub w przypadkach, gdy muszą jak najszybciej odpowiedzieć na żądania klientów. Nie ma określonego kodu do przypisania serwlet„ale stałe lub tymczasowe; jest to funkcja ustawienia serwera WWW.
Cykl życia serwletu, javax.servlet.Servlet
Serwlety działają na platformie serwera WWW jako część 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()
- praca()
- zniszczyć()
oraz dwie metody pomocnicze:
- getServletConfig()
- getServletInfo()
Podobieństwa między interfejsami serwlet"a aplet Javy jest oczywisty. Tak został zaprojektowany! Serwlety Javy są dla serwerów sieciowych tym, czym aplety dla przeglądarek internetowych. Aplet działa w przeglądarce internetowej, wykonując akcje na żądanie za pośrednictwem specjalnego interfejsu. Serwlet robi to samo podczas pracy na serwerze WWW.
Inicjalizacja serwletu, metoda init().
Przy pierwszym ładowaniu serwletu wywoływana jest metoda init(). Pozwala to serwletowi na wykonanie wszelkich prac instalacyjnych, takich jak otwieranie plików lub nawiązywanie połączeń z serwerami. Jeśli serwlet jest zainstalowany na serwerze na stałe, jest ładowany podczas uruchamiania serwera. W przeciwnym razie serwer wywołuje serwlet na pierwsze żądanie klienta w celu wykonania usługi zapewnianej przez ten serwlet.
Gwarantuje się, że metoda w tym() zakończy się przed jakimkolwiek innym wywołaniem serwletu, takim jak wywołanie metody praca(). zauważ to 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 - referencję do obiektu ServletConfig, który zawiera argumenty do zainicjowania serwletu. Ten obiekt ma metodę getServletContext(), która zwraca obiekt ServletContext A, który zawiera informacje o środowisku serwletu.
Rdzeń serwletu, metoda service().
metoda praca() jest sercem serwletu. Każde żądanie klienta powoduje jedno wywołanie metody praca(). Ta metoda odczytuje żądanie i generuje komunikat odpowiedzi, używając swoich dwóch argumentów ServletRequest i ServletResponse:
Tak więc istnieją dwa sposoby przekazywania informacji od klienta do serwletu. Pierwszy polega na przekazywaniu wartości w parametrach żądania. Wartości parametrów można wstawić do adresu URL. Drugim sposobem przekazywania informacji od klienta do serwletu jest InputStream (lub Reader).
Działanie metody praca() jest zasadniczo prosty - tworzy odpowiedź na każde żądanie klienta przekazane do niego z serwera. Należy jednak pamiętać, że w tym samym czasie może być przetwarzanych kilka równoległych żądań. Jeśli metoda praca() wymaga jakichkolwiek zasobów zewnętrznych, takich jak pliki, bazy danych, wówczas konieczne jest zapewnienie, aby dostęp do zasobów był bezpieczny wątkowo.
Rozładowanie serwletu, metoda destroy().
metoda zniszczyć() wezwany do uwolnienia wszystkich zasobów (np. Otwórz pliki i połączenia z bazą danych) przed wyładowaniem serwletu. Ta metoda może być pusta, jeśli nie ma potrzeby wykonywania żadnych operacji końcowych. Przed wywołaniem metody zniszczyć() serwer czeka albo na zakończenie wszystkich operacji serwisowych, albo na upłynięcie określonego czasu. Oznacza to, że metoda zniszczyć() można wywołać podczas wykonywania dowolnej długiej metody praca().
Ważne jest sformalizowanie metody zniszczyć() w taki sposób, aby uniknąć zamknięcia niezbędnych zasobów do czasu wszystkich wezwań praca() nie skończy się.
Konfiguracja serwletu, metoda getServletConfig().
metoda getServletConfig() zwraca referencję do obiektu, który implementuje interfejs ServletConfig. Ten obiekt zapewnia dostęp do informacji o konfiguracji serwletu, tj. dostęp do parametrów inicjalizacji serwletu i obiektu kontekstu serwletu ServletContext, co daje dostęp do serwletu i jego środowiska.
Informacje o serwlecie, metoda getServletInfo().
metoda getServletInfo() zdefiniowany przez programistę tworzącego serwlet w celu zwrócenia łańcucha zawierającego informacje o serwlecie, takie jak autor i wersja serwletu.
Interfejs ServletRequest
ServletRequest dostarcza klientowi informacji o parametrach żądania HTTP do serwletu, tj. udostępnia dane, w tym nazwy i wartości parametrów, atrybuty i strumień wejściowy. Ta informacja jest przekazywana do metody praca().
Następny przykład serwletu pokazuje, jak uzyskać informacje z parametru wniosek metoda praca():
Czytnik BufferedReader; Ciąg param1; Ciąg param2; public void service (żądanie ServletRequest, odpowiedź ServletResponse) (reader = request.getReader(); param1 = request.getParameter("First"); param2 = request.getParameter("Second"); )
Dodatkowe informacje o żądaniu są dostępne dla apletu za pomocą metod, główne z nich są wymienione w poniższej tabeli:
getAttribute() | Zwraca wartość określonego atrybutu tego żądania. |
getContentLength() | 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. |
GetParameterNames() | Zwraca tablicę łańcuchów z nazwami wszystkich parametrów. |
getParameterValues() | Zwraca tablicę wartości dla określonego parametru. |
getProtocol() | Zwraca protokół i wersję żądania jako ciąg formularza |
getReader() | Zwraca BufferedReader, aby otrzymać tekst z treści żądania. |
getRealPath() | Zwraca rzeczywistą ścieżkę dla określonej ścieżki wirtualnej. |
getRemoteAddr() | Adres IP klienta, który wysłał to żądanie. |
getRemoteHost() | Nazwa hosta komputera klienckiego, który wysłał żądanie. |
getScheme() | Zwraca schemat użyty w adresie URL tego żądania (na przykład https, http, ftp itp.). |
pobierzNazwęSerwera() | Nazwa hosta serwera, który zaakceptował to żądanie. |
getServerPort() | Zwraca numer portu użyty do odebrania tego żądania. |
Interfejs ServletResponse
Interfejs Odpowiedź serwletu to narzędzie do przesyłania danych do klienta. Wszystkie metody tego narzędzia służą właśnie temu zadaniu:
Publiczny java.lang.String getCharacterEncoding() publiczny void setLocale(java.util.Locale loc) publiczny java.util.Locale getLocale()
Pierwsza metoda zwraca typ kodowania MIME (na przykład UTF8), w którym zostaną wyświetlone informacje. Drugie dwie metody działają również z zestawem znaków. Wskazują język używany w dokumencie (na przykład - rosyjski).
Publiczna funkcja ServletOutputStream getOutputStream() zgłasza wyjątek java.io.IOException
Metoda getOutputStream zwraca strumień wyjściowy dla serwletu. Ten strumień jest używany na przykład do wysyłania plików binarnych. Dane tekstowe można wyprowadzić za pomocą java.io.Writer:
Publiczna funkcja java.io.PrintWriter getWriter() zgłasza wyjątek 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ść pola nagłówka HTTP „Content-Length”
public void setContentType (typ ciągu)
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 część danych zostanie wydana klientowi dopiero po zapełnieniu bufora.
public void setBufferSize(int size) public int getBufferSize() public void flushBuffer() zgłasza java.io.IOException public void resetBuffer()
Powyższe 4 metody pozwalają odpowiednio ustawić rozmiar bufora nadawczego, pobrać jego rozmiar, zainicjować wysłanie zawartości bufora do klienta bez oczekiwania na jego zapełnienie oraz wyczyścić ten bufor z danych.
Publiczna wartość logiczna isCommission()
Za pomocą metody isCommission można uzyskać flagę, czy wysyłanie danych do klienta już się rozpoczęło. Flaga będzie pozytywna, jeśli nagłówek odpowiedzi HTTP został już wysłany.
publiczne nieważne resetowanie ()
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
Biblioteki graficznej JFreeChart można używać w serwletach do tworzenia wykresów i wyświetlania ich jako obrazów na stronach internetowych. Przedstawiono szczegółowe opisy i przykłady wykorzystania 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 wykorzystania JNI w serwletach.
Komunikaty JMS w serwlecie
Servlet może służyć do wymiany JMS wiadomości między aplikacjami. Przedstawiono przykład wykorzystania serwletu do wysyłania i odczytywania komunikatów JMS w kontenerze JBoss.
Java Servlet to program po stronie serwera napisany w języku programowania o tej samej nazwie, który odbiera sygnały od klienta i odsyła mu odpowiedzi. Jest to kluczowy element, który tworzy typowy Java EE, oprócz JSP, EJB, XML i innych powiązanych technologii. Aplikację można spakować w pliku WAR (Web AR chive) 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 WWW.
Podstawy serwletów Java
Najpopularniejszymi i szeroko stosowanymi kontenerami są Tomcat i JBoss. Z technicznego punktu widzenia Servlet jest normalną klasą Java, która ma rozszerzenie dla protokołu Common Client/Server Protocol lub HTTP. W praktyce jest używany do przetwarzania żądań, odpowiednio poprzez 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 używane do przechwytywania i przetwarzania żądań przed ich wysłaniem do serwletu i odpowiadania na nie po zakończeniu jego kodu i przed wysłaniem odpowiedzi przez kontener z powrotem do klienta.
Typowe zadania do wykonania z filtrami:
Filtry są uwzględniane i konfigurowane w pliku deskryptora wdrażania (web.xml). Serwlety i filtry nie wiedzą o sobie nawzajem, więc możesz dodać lub usunąć filtr, po prostu edytując plik web.xml. Dopuszczalne jest posiadanie wielu filtrów dla pojedynczego zasobu lub łańcuch filtrów dla pliku web.xml lub uruchamianie filtrów Java Servlet poprzez implementację interfejsu javax.servlet.Filter.
Równoległe żądania do serwera są przetwarzane przez wątki, co zapewnia ważne cechy sieci - wielowątkowość i równoległość.
Główne funkcje:
Potrzeba dynamicznych stron internetowych
Istnieje wiele powodów, dla których firmy chcą tworzyć dynamiczne strony internetowe w locie, na przykład gdy dane w witrynie często się zmieniają. Witryny z wiadomościami i pogodą zazwyczaj polegają na CGI, aby zachować aktualność treści bez ciągłej uwagi programistów. Strony internetowe handlu elektronicznego, które podają aktualne ceny i stany magazynowe, wykorzystują CGI do pobierania tych treści na żądanie, pobierając je 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.
Zalety serwletów Java:
Minęło prawie dwadzieścia lat od pojawienia się języka programowania Java. W tym czasie Java była prorokowana przez śmierć i zapomnienie, programiści tutaj śmiali się z jej powolności i chciwości zasobów. Ale byli też tacy, którzy wierzyli w Javę, rozwijali wszelkiego rodzaju biblioteki, rozwijali społeczność, uparcie udowadniali, że dla Javy nie ma ograniczeń: realtime, embedded, AI – wszystko jest możliwe. Postanowiliśmy nie stać z boku i zrobić małą serię artykułów o Javie w tej sekcji. Iść!
Twój czajnik wybiera Javę
Według samego Oracle, dziś wirtualny maszyna Javy zainstalowanych na ponad trzech miliardach urządzeń. I to nie tylko komputery i smartfony, ale także aparaty fotograficzne, telewizory, odtwarzacze Blue-ray, drukarki, karty SIM, bankomaty, a nawet samochody. Lista ta będzie się systematycznie powiększać, a wraz z nią oferty pracy dla programistów Javy. Już teraz liczba wakatów dla programistów Java przewyższa pozostałe. A firmy są gotowe płacić coraz więcej, kłusując pracowników i organizując korzystniejsze warunki pracy.
A dlaczego ona jest dobra?
Programistów Javy pociąga minimalizm składni. Bez dodatkowych modyfikatorów i słów serwisowych. Nawet brak dziedziczenia wielokrotnego, który początkowo nieco dezorientował programistów C++, ostatecznie okazuje się rozsądny i uzasadniony. Prosta logika, automatyczna praca z pamięcią, szczegółowa dokumentacja, fora z odpowiedziami na najróżniejsze pytania, otwarte źródło- to wszystko pozwala na szybkie zrozumienie procesu deweloperskiego i znacznie ogranicza liczbę potencjalnych błędów. Nawet indyjscy wieśniacy uczą się Jawy w kilka miesięcy, przynajmniej tak mówią ich dyplomy :). Ponadto Java jest językiem interpretowanym. Kompilator tłumaczy kod źródłowy na tak zwany kod bajtowy, który można łatwo przekonwertować z powrotem, co czyni Javę szczególnie atrakcyjną dla inżynierii wstecznej.
Cóż, zacznijmy
Java jest językiem zorientowanym obiektowo, co oznacza, że wszystkie zmienne, metody, stałe są zadeklarowane 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 implementować dowolną liczbę interfejsów, co pozwala jednemu obiektowi pełnić wiele funkcji, ale udostępniać tylko część z nich.
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 na dowolnej architekturze i dowolnym urządzeniu int zajmuje cztery bajty pamięci. Jest to dość wygodne do obliczeń. Tablica danych zawiera specjalny atrybut długości, który przechowuje rozmiar tablicy, za co specjalne podziękowania należą się programistom. Dane różnych typów są przekazywane do metod na różne sposoby. Typy proste są zawsze przekazywane przez wartość. Obiekt - zawsze przez odniesienie, aby zaoszczędzić pamięć. Oznacza to, że jeśli przekażemy int a = 10 i zmienimy jego wartość na 5 w wywoływanej metodzie, to a w oryginalnej metodzie nadal będzie wynosić 10. Ale jeśli zmienimy właściwość obiektu, zmieni się ona w oryginalnej metodzie, jak Dobrze.
Pamiętaj o pamięci
Chociaż Programista Javy i uwolniony od konieczności alokowania i zwalniania pamięci, nieznajomości niektórych cech dzieła maszyna wirtualna a Garbage Collector może z łatwością zmienić twój program w żarłocznego potwora, który pożera czas procesora i całą dostępną pamięć.
Tworząc nową tablicę, zawsze pamiętaj, że znacznie łatwiej jest stworzyć wiele małych fragmentów pamięci niż jeden duży. W przeciwnym razie istnieje ryzyko wystąpienia błędu braku pamięci, co z grubsza oznacza, że miałeś pamięć, ale wszystko wyszło.
Wielu programistów, kiedy przestawia się na Javę i dowiaduje się o automatycznym czyszczeniu pamięci, zaczyna tworzyć obiekty w ogromnych ilościach, mając nadzieję, że wszystko samo się wyczyści. Tymczasem śmieciarka jest jak maszyna, która może zbierać tylko śmieci wyrzucone do kosza w pobliżu domu. Jeśli nie potrzebujesz już danych, nie przechowuj ich na wszelki wypadek, jak stosu starych pocztówek - przypisz null do wskaźnika danych, pomóż sprzątaczowi posprzątać :). Dobrą praktyką jest również wyczyszczenie listy, jeśli już jej nie potrzebujesz. Pamiętaj, że obiekt będzie przechowywany w pamięci tak długo, jak długo w kodzie znajdują się odniesienia do niego. Nawet jeśli twój program działa na 16 gigabajtach pamięci i nie grozi mu awaria pamięci, będzie stawał się coraz bardziej niezgrabny i powolny z powodu nadmiaru używanej pamięci. 99% skarg użytkowników na powolne programy Java wynika z nieefektywnie napisanych kod źródłowy. Jeśli musisz stale tworzyć obiekty, które są szybko używane i nie są już potrzebne, takie jak wiele małych wiadomości, rozważ utworzenie puli, która będzie przechowywać wiele instancji do wielokrotnego użytku. Pamiętaj, że tworzenie i usuwanie obiektu to kosztowna operacja.
Do roboty Panowie.
Jeden przykład jest lepszy niż tysiąc słów. Możesz przewinąć instrukcję i bez nas spojrzeć na standardowe słowa powitalne, 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 portale społecznościowe. Aby to zrobić, nie trzeba nawet dostać pracy w NSA - użytkownicy rozpowszechniają wszystko o sobie, a my będziemy musieli tylko odbierać, usystematyzować i pokazać te informacje w piękny sposób. Weź jeden z popularnych służby socjalne, na przykład czworokąt, i narysuj ruchy naszych przyjaciół na mapie.
Najpierw zobaczmy, co możemy uzyskać z Foursquare. Po przejrzeniu stron dla programistów zwracamy uwagę na dwie metody:
- https://developer.foursquare.com/docs/users/checkins - miejsca odwiedzane przez użytkownika. Niestety obecnie jest obsługiwana tylko dla użytkownika zarejestrowanego w programie i krążą pogłoski, że ze względu na ograniczenia w implementacji tak pozostanie;
- https://developer.foursquare.com/docs/checkins/recent - miejsca odwiedzane przez znajomych zarejestrowanego użytkownika. Jeśli trochę pobawisz się tą funkcją, okaże się smutny fakt: dla każdego przyjaciela zwracane jest dokładnie jedno miejsce - ostatnie miejsce, w którym się sprawdził.
Aby korzystać z Foursquare API należy zarejestrować naszą przyszłą aplikację, wejść na ten adres: https://ru.foursquare.com/developers/register i wypełnić pola (tak, trzeba będzie zarejestrować się również w samym Foursquare, ale możesz to zrobić doskonale beze mnie).
Spośród ważnych pól można tutaj odnotować tylko „Nazwa aplikacji”, „URL strony pobierania / powitania” (wprowadź tutaj dowolny adres internetowy) i „URI przekierowania” - jest to adres, na który serwer nas wyśle po rejestracji. Żądaną wartość wprowadzimy 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.
Wznosimy się do chmur
Kapitan Oczywisty przekazuje, że każda aplikacja serwerowa potrzebuje serwera do działania. Postawienie serwera na własną rękę to hemoroidy, dlatego 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. Aby rozpocząć, przejdź tutaj i pobierz Google App Engine SDK for Java.
Teraz możesz przystąpić do tworzenia projektu. 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 zakładce zaznacz Web Application i Google App Engine po lewej stronie i wskaż ścieżkę do wcześniej pobranego i rozpakowanego App Engine SDK.
Teraz usiądź wygodnie i pozwól IDE zrobić swoje. Jeśli wybrałeś IDEA i zrobiłeś wszystko dobrze, 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 projektu, który zawiera folder src. Tutaj umieścimy kod źródłowy. Źródła w Javie są pogrupowane według pakietów. Pakiet to folder na dysku. Paczki są potrzebne, aby nie zrzucać wszystkich źródeł na stos, ale je rozdzielać, kierując się zasadami logiki. Na przykład kod związany z interfejsem użytkownika byłby logicznie umieszczony w pakiecie ui, interakcje sieciowe w pakiecie sieciowym. To znacznie ułatwia późniejszy rozwój i wsparcie projektu. W przeszłości zwyczajem było rozpoczynanie struktury pakietu od nazwy firmy, po której następowała nazwa programu. Pomoże to łatwo zidentyfikować nasze źródła wśród wielu takich samych w przyszłości. Dla naszego programu utworzymy pakiet org.nsa.tracker. W nim stworzymy klasy.
Serwlety służą do przetwarzania żądań użytkowników na serwerze. Serwlet jest klasą, która zwykle dziedziczy po HttpServlet i działa na zasadzie żądanie-odpowiedź. Wystarczy zastąpić metodę doGet. Na żądanie użytkownika musimy zalogować się do Foursquare, załadować listę zameldowań znajomych i przekierować zapytanie na stronę z mapą.
Do pracy z API Foursquare użyjemy darmowej biblioteki Foursquare-api-Java, którą można pobrać stąd. Biblioteka Java to archiwum ZIP z rozszerzeniem jar, które zawiera skompilowane klasy Java, które implementują określone funkcje. Do autoryzacji potrzebujemy ClientId oraz ClientSecret uzyskanych na etapie rejestracji aplikacji w Foursquare. Ponieważ parametry te nie zmieniają się podczas wykonywania programu, deklarujemy 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. Wykorzystując przykład autoryzacji z biblioteki foursquare-api-java otrzymujemy mniej więcej taki kod:
Chronione void doGet(HttpServletRequest req, HttpServletResponse resp) zgłasza ServletException, IOException ( FoursquareApi foursquareApi = new FoursquareApi(CLIENT_ID, CLIENT_SECRET, CALLBACK_URL); String code = req.getParameter("code"); if (code == null) ( // Przejdź do strony rejestracji resp.sendRedirect(foursquareApi.getAuthenticationUrl()); ) else (try (foursquareApi.authenticateCode(code); // Rejestracja powiodła się, przesyłanie danych Wynik
Zwróć uwagę na „zgłasza wyjątek 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 wystąpienie wyjątku. Są weryfikowalne i nieweryfikowalne. Sprawdzone wyjątki muszą być obsługiwane przez otoczenie części kodu blokiem try-catch lub przekazanie powyżej. Niesprawdzone wyjątki na ogół nie są obsługiwane, ponieważ występują, gdy program nie może odzyskać swojego stanu. W tej metodzie obsługujemy tylko wyjątek FoursquareApiException.
Gdy serwer WWW otrzymuje żądanie dotyczące aplikacji, używa deskryptora wdrażania w celu dopasowania adresu URL żądania do kodu, który powinien obsłużyć żądanie. Deskryptor wdrażania to plik XML o nazwie web.xml. Dodajmy opis serwletu śledzącego.
Teraz żądania do /track będą przetwarzane przez nasz serwlet o nazwie TrackerServlet. Możesz ustawić parametr Callback Url na poprawną wartość http://localhost:8080/track.
Aby wyświetlić wyniki, możesz użyć Static Maps API, udostępnionego przez tę samą korporację Google (https://developers.google.com/maps/documentation/staticmaps/). Nasz serwlet wygeneruje prostą stronę HTML i zwróci ją w odpowiedzi na żądanie użytkownika.
StringBuilder sb = nowy StringBuilder("
- "); index = 1; for (Sprawdzanie sprawdzania:result.getResult()) ( sb.append("
Do wygenerowania strony wykorzystywana jest klasa StringBuilder, wynika to z faktu, że stringi w Javie są obiektami niezmiennymi. Podczas łączenia ciągów przy użyciu operatora +. Utworzony Nowa linia w umyśle. StringBuilder oszczędza pamięć, ponieważ używa tablicy char do przechowywania łańcuchów, które mają zostać połączone. Wysyłanie odpowiedzi do użytkownika:
Byte resultBytes = sb.toString().getBytes("utf-8"); resp.setContentLength(wynikBajty.długość); resp.getOutputStream().write(bajty wyników);
…I wszystko gotowe. Uruchamiamy i widzimy coś podobnego do obrazka z napisem „Wynik programu”.
Co dalej?
Aplikację można ulepszyć, na przykład oddzielając 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 możliwe będzie wyświetlanie nie pojedynczych punktów, ale połączonej trasy. Przy odrobinie zagłębienia się w interfejs API Foursquare możesz uzyskać jeszcze więcej informacji o aktywności użytkowników.
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 programistów Java
Naukę języka radzimy rozpocząć od książki „Java. Java: przewodnik dla początkujących autorstwa Herberta Schildta. Następnym poziomem jest „Java. Kompletny przewodnik” od niego, a więcej informacji na temat serwletów można znaleźć w książce Java Servlet and JSP Cookbook autorstwa Bruce'a W. Perry'ego.