Baza Wiedzy

Servlet

Servlet jest podstawowym elementem aplikacji biznesowych tworzonych w języku Java. W rzeczywistości jest to klasa rozszerzająca klasę HttpServlet, która jest zdolna do przetwarzania żądań HTTP. Serwlety wykorzystywane są zarówno w aplikacjach Javy EE jak i tych tworzonych w Spring MVC.

Serwlety do poprawnego działania wymagają kontenera serwletów, wśród których najpopularniejsze to Tomcat, czy Jetty.

    Mapowanie adresu URL

    W obecnej specyfikacji Javy EE, Servlety dostępne są w wersji 3.1, a od Javy EE 8 pojawi się ich wersja 4.0. Największą zmianę przyniosły Servlety 3.0, w których wprowadzono możliwość określenia docelowego adresu URL nie tylko poprzez plik web.xml (deskryptor wdrożenia), ale również w sposób deklaratywny poprzez adnotację @WebServlet.

    W starszych wersjach serwletów mapowanie ustawialiśmy w pliku web.xml w następujący sposób:

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    	version="3.1">
    	
    	<servlet>
    		<servlet-name>Hello</servlet-name>
    		<servlet-class>pl.javastart.servlet.HelloServlet</servlet-class>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>Hello</servlet-name>
    		<url-pattern>/hi</url-pattern>
    	</servlet-mapping>
    </web-app>

    Dwie kluczowe sekcje to <servlet>, która zawiera definicję servletu oraz <servlet-mapping> zawierająca mapowanie adresu URL. Jeśli więc wyślemy żądanie do naszej aplikacji pod adres /hi, to wywołana zostanie jedna z metod klasy HelloServlet. Dostępne metody to:

      • doGet()
      • doPost()
      • doTrace()
      • toHead()
      • doPut()
      • doOptions()

      jak nazwy sugerują odpowiadają one poszczególnym metodom HTTP, czyli GET, POST, TRACE...

      Od specyfikacji Servlet 3.0 plik web.xml stał się opcjonalny ze względu na silny zwrot w kierunku konfiguracji opartych o adnotacje i automatyczne konfiguracje. Od Javy EE6 (servlet 3.0) najczęściej spotkamy się więc z mapowaniem postaci:

      import javax.servlet.annotation.WebServlet;
      import javax.servlet.http.HttpServlet;
      
      @WebServlet("/hi")
      public class HelloServlet extends HttpServlet {
      	//...
      }

      Cykl życia

      Cykl życia Servletu wygląda tak, że przy pierwszym odwołaniu do niego kontener (np. Tomcat) tworzy obiekt klasy reprezentującej serwlet zmapowany na dany adres URL. Zycie obiektu składa się z kilku etapów:

        • utworzenie obiektu serwletu poprzez konstruktor
        • wywołanie metody init()
        • wielokrotne wywoływanie metod doGet, doPost itp.
        • wywołanie metody destroy()

        Ważne jest to, że powstanie tylko jeden taki obiekt i będzie współdzielony pomiędzy wszystkich użytkowników naszej aplikacji, dlatego należy zwrócić szczególną uwagę na kwestie wielowątkowości - np. definiowanie w serwletach współdzielonych, niesynchronizowanych pól klasy.

        Żądanie i odpowiedź

        Każda z metod wspomnianych w punkcie Mapowane adresu URL przyjmuje dwa parametry:

          • HttpServletRequest
          • HttpServletResponse

          które reprezentują odpowiednio żądanie i odpowiedź HTTP. Z punktu widzenia programisty z pierwszego obiektu możemy odczytać parametry żądania, ciasteczka, czy też odwołać się do sesji powiązanej z użytkownikiem, natomiast korzystając z obiektu response możemy wysłać odpowiedź.

          serlvlet request lifecycle

          Servlet a JSP

          Servlety mają silny związek z technologią JSP (JavaServer Pages). Jest to spowodowane tym, że strony JSP w rzeczywistości przechodzą proces translacji (są kompilowane przez specjalny silnik) do postaci serwletu.

          Przykład

          import java.io.IOException;
          
          import javax.servlet.ServletException;
          import javax.servlet.annotation.WebServlet;
          import javax.servlet.http.HttpServlet;
          import javax.servlet.http.HttpServletRequest;
          import javax.servlet.http.HttpServletResponse;
          
          @WebServlet("/hi")
          public class HelloServlet extends HttpServlet {
          	
          	@Override
          	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          		String name = request.getParameter("name");
          		response.getWriter().write("Hello " + name);
          	}
          	
          }

          Po wysłaniu żądania np. z przeglądarki pod adres naszaAplikacja/hi?name=Jan w odpowiedzi zobaczymy powitanie:

          servlet in firefox

          Zapisz się do newslettera

          Otrzymuj nasz Newsletter z przykładowymi pytaniami rekrutacyjnymi, wyzwaniami programistycznymi i nowościami ze świata Javy, a także informacje o nowych kursach i promocjach.

          Traktujemy Twoją prywatność poważnie. Nikomu nie udostępniamy Twojego maila no i zawsze możesz się wypisać.

          Komentarze do artykułu

          Wyłączyliśmy możliwość dodawania komentarzy. Poniżej znajdziesz archiwalne wpisy z czasów gdy strona była jeszcze hobbystycznym blogiem. Zapraszamy natomiast do zadawnia pytań i dyskusji na naszej grupe na facebooku.

          JavaStart na Youtube