Servlety – aplikacje sieciowe

Serwlety to technologia, która umożliwia tworzenie dynamicznych stron internetowych. Chociaż serwlety nie mają ściśle określonego typu obsługiwanych żądań, to naszym głównym powodem zainteresowania będzie ich najczęstsze zastosowanie – czyli aplikacje sieciowe korzystające z protokołu HTTP.

Jak działają servlety

Servlety działają w architekturze klient-serwer. W pewnym uproszczeniu ten model pozwala na podział ról na:

  • klienta – wysyła żądanie odpowiedzi od serwera,
  • serwer – dostawcę usługi, który przesyła odpowiedź do stacji klienta.

Servlet możemy uruchomić np. na serwerze Tomcat. Klientem natomiast może być przeglądarka, która wyświetli stronę html lub zwykła aplikacja desktopowa, która powinna zapewniać możliwość użycia protokołu HTTP w celu nawiązania połączenia w servletem.

Klient serwer
Klient serwer

Aplikacje sieciowe

Aplikacje sieciowe służą do tworzenia dynamicznych treści. Możemy je podzielić na dwa typy.

  • Prezentacyjne – zorientowane na tworzenie dynamicznych stron internetowych oraz ich prezentację użytkownikowi. Przy ich tworzeniu przydatne są technologie Java Server Pages, Java Server Faces oraz Facelets.
  • Usługowe – zorientowane na udostępnianiu usług. Do ich implementacji przydatne są serwlety.

Klasa HttpServlet

Tworząc własne klasy serwletów możemy wykorzystać mechanizm dziedziczenia, dzięki czemu możemy skupić się na metodach protokołu HTTP takich jak get, post, delete oraz put. Serwer wywołując metodę service() pozwala wykorzystywać poniższe metody.

  • doGet() – nadpisanie tej metody pozwala obsługiwać żądanie oraz dane przesłane metodą get protokołu HTTP oraz wysłać odpowiedź.
  • doPost() – Podobnie jak wyżej z tą różnicą, że dotyczy to zapytania post.
  • doPut() – pozwala na przechwycenie metody put.
  • doDelete() – przechwycenie delete.

Cykl życia servletu

  1. Wczytanie klasy serwletu.
  2. Utworzenie instacji klasy serwletu.
  3. Inicjalizacja metodą init() serwletu.
  4. Kontener serwletów wykonuje metodę service()
  5. usunięcie serwletu metodą destroy().

Tworzenie własnego servletu

Aby utworzyć serwlet będziemy potrzebowali wersję Eclipse EE oraz zainstalowany serwer np. Tomcat, Jetty. Instalacja przebiega tak samo jak w przypadku standardowej wersji. Podobnie pierwszym krokiem będzie założenie nowego projektu. Klikamy.

File → New → Dynamic Web Project

Powinniśmy zobaczyć następujące okienko.

Okienko new dynamic web project Eclipse
Okienko new dynamic web project Eclipse

Uzupełniamy w nim nazwę projektu oraz możemy wybrać od razu wcześniej skonfigurowane środowisko np. Apache Tomcat 9. Możemy od razu kliknąć Finish.

Po przejściu przyciskiem next jest opcja wygenerowania pliku XML, który przy aktualnej wersji Javy nie jest konieczny. Wszystkie informacje, które kiedyś były w nim zawarte są aktualnie umieszczone w specjalnych znacznikach.

Kolejnym krokiem jest utworzenie serwletu. W tym celu klikamy.

Java Resources → src → new servlet

Tworzenie servletu Eclipse
Tworzenie servletu Eclipse

Następnie w powyższym okienku uzupełniamy nazwę oraz pakiet. Zwróćmy uwagę, że klasą nadrzędną automatycznie jest wpisana klasa HttpServlet. Przechodzimy dalej do ostatniego okienka.

Tworzenie servletu - konfiguracja
Tworzenie servletu – konfiguracja

Wybieramy tak jak na obrazku jedynie utworzenie metody doGet() ponieważ tylko ją aktualnie chcemy obsłużyć. Klikamy Finish i pokaże nam się automatycznie wygenerowany serwlet. Możemy spróbować go od razu uruchomić przyciskiem Run Servlet.

Po kliknięciu next wybieramy klasę naszego serwletu i dodajemy go na prawą stronę. Następnie Finish.

Uruchamianie servletu na serwerze Tomcat dodawanie klasy
Uruchamianie serwletu na serwerze Tomcat dodawanie klasy

Uruchomimy w ten sposób serwlet, a Eclipse w swojej wbudowanej przeglądarce pokaże nam odpowiedź od serwera Tomcat. Czemu jednak od razu pokazał nam się błąd?

Odpowiedź serwera - błąd 404
Odpowiedź serwera – status 404

Otóż otworzyliśmy główny folder na naszym serwerze, który jest pusty. Aby wykonać metodę doGet() musimy dopisać do adresu część zawartą w adnotacji. Aby jednak wyświetlić jakąkolwiek treść w naszym głównym adresie wystarczy utworzyć dokument index.html w folderze WebContent. Po uaktualnieniu się danych na serwerze powinniśmy otrzymać treść naszego dokumentu.

Uruchomienie serwletu z dokumentem index.html
Uruchomienie serwletu z dokumentem index.html

Poniżej wyświetlamy wynik uruchomienia metody doGet().

obsługa metody doGet
obsługa metody doGet

Wygenerowany automatycznie kod serwletu

Powyżej znajduje się kod wygenerowany automatycznie. Zwróćmy uwagę na kilka rzeczy.

@WebServlet(„/Test”)

To jest fragment wskazujący pod jakim adresem będzie znajdował się serwlet.  Poniżej pokazujemy pełny adres.

http://localhost:8080/MojServlet/Test

  • localhost – jest nazwą hosta możliwą do ustawienia w konfiguracji serwera.
  • 8080 – numer portu, na którym serwer nasłuchuje żądań http.
  • MojServlet – adres serwletu.
  • Test – podany przez nas adnotacja wskazująca pod jakim adresem znajduje się wykonywany przez nas kod.

Zwróćmy również uwagę na argumenty metody doGet(). Pierwszy jest obiektem klasy HttpServletRequest i pozwala na odbieranie parametrów przesłanych metodą post lub get. Drugi natomiast jest klasy HttpServletResponse i to właśnie on pozwala serwletowi na odpowiedź.

Przekazywanie parametrów get

W celu pokazania przekazywania parametrów przyda nam się dodatkowy dokument z formularzem, dlatego zmodyfikujmy nasz index.html.

A poniżej pokazujemy klasę serwletu.

Uruchomienie serwletu wygląda następująco.

Przekazywanie parametrów do servletu metodą get
Przekazywanie parametrów do serwletu metodą get

Oraz efekt wykonania kodu po stronie serwera i odpowiedź.

Przekazywanie parametrów do servletu metodą get - odpowiedź
Przekazywanie parametrów do serwletu metodą get – odpowiedź

Zwróćmy uwagę na to, że odpowiedź serwera czyli kod html jest zawarty w kodzie Javy, co nie jest wygodne, gdy dokument jest skomplikowany.

Przekazywanie parametrów post

Metoda post jest nieco wygodniejsza przy przesyłaniu większej liczby parametrów gdyż nie jest widoczna w adresie URL. Minusem tego rozwiązania jest jednak brak możliwości wysłania bezpośrednio zapytania bez wypełnienia formularza podstawiając samemu parametry w linku.

Naszym zadaniem będzie obliczenie wyznacznika macierzy 3×3. Zadanie jest proste. Potrzebujemy tylko pola tekstowego, które przyjmie dane od użytkownika. Zakładamy, że 3 pierwsze liczby będą pierwszym rzędem, trzy następne drugim itd. Załóżmy również, że będziemy obliczać wyłącznie wyznaczniki macierzy składające się z liczb całkowitych dodatnich. Tym razem będziemy potrzebowali metody doPost(). W przypadku jej braku dostaniemy po prostu odpowiedź, że żądanie nie może zostać obsłużone.

Poniżej znajduje się zawartość pliku index.html.

Poniżej kod naszego serwletu.

Przekazywanie parametrów wygląda podobnie jak w przypadku metody doGet(). Różnicą jest natomiast to, że tym razem nie widać ich w linku. Poniżej znajduje się przykładowe działanie serwletu.

Przekazywanie parametrów do servletu metodą post
Przekazywanie parametrów do servletu metodą post

Oraz odpowiedź od serwera

Przekazywanie parametrów do servletu metodą post - odpowiedź
Przekazywanie parametrów do servletu metodą post – odpowiedź