Servlety to klasy, których celem jest przetwarzanie żądań HTTP i generowanie zawartości która będzie odesłana w odpowiedzi na te żądania. Innymi słowy, servlety służą do implementacji dynamicznych aplikacji WWW.
Z założenia servlety mogą obsługiwać także protokoły inne niż HTTP, jednak w praktyce ich użycie ogranicza się niemal wyłącznie do implementacji aplikacji WWW opartych na HTTP. Możemy zatem myśleć o servletach jak o narzędziu służącym tylko i wyłącznie do tego właśnie celu.
Przechodząc do konkretów – servlety to klasy, które implementują interfejs javax.servlet.Servlet. Możemy zaimplementować servlet jako klasę implementującą ten interfejs, jednak łatwiej będzie nam zaimplementować klasę dziedziczącą z klasy javax.servlet.http.HttpServlet (która to klasa implementuje interfejs Servlet). Tak właśnie w praktyce robi się najczęściej. Przykład poniżej:
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; public class HelloWorldServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><head><title>My Servlet</title></head><body>"); out.println("Hello World!"); out.println("<body></html>"); out.close(); } }
To, jak taki servlet zainstalować na serwerze aplikacji i uruchomić opisałem w artykule „Pierwsza aplikacja WWW”.
Każde żądanie HTTP ma swój typ, definiujący akcję którą serwer powinien wykonać w odpowiedzi. Podstawowe typy żądań to żądania GET i POST. Żądanie GET oznacza, że klient wysyłający żądanie do serwera chce pobrać zasób wskazywany przez URI przekazany wraz z tym żądaniem. Żądanie POST oznacza, że klient wysyła do serwera, a konkretnie do zasobu wskazanego przez URI dołączony do żądania, pewną porcję danych i zleca przetworzenie tych danych. W każdym żądaniu przesyłane są dodatkowo (opcjonalnie) parametry, nagłówki, oraz ciasteczka. Każdy taki element żądania możemy pobrać w kodzie Servletu i wykorzystać zgodnie ze swoją niczym nie skrępowaną wolą.
Implementując klasę servletu implementujemy de facto metody obsługujące żądania HTTP. Aby zaimplementować obsługę metody HTTP GET musimy zaimplementować metodę doGet(…).Aby zaimplementować obsługę metody HTTP POST musimy zaimplementować metodę doPost(…). W powyższym przykładzie zaimplementowaliśmy jedynie metodę doGet(…), co oznacza że servlet ten obsługuje tylko i wyłącznie żądania HTTP typu GET.
Metody doGet(…) i doPost(…) przyjmują dwa parametry wywołania – obiekty reprezentujące żądanie i odpowiedź HTTP. Obiekty te są tworzone i przekazywane do implementowanego przez nas servletu przez serwer aplikacji.
Parametr reprezentujący żądanie HTTP to obiekt typu javax.servlet.http.HttpServletRequest. Obiekt reprezentujący odpowiedź to obiekt typu javax.servlet.http.HttpServletResponse. Z instancji reprezentującej żądanie odczytujemy szczegóły żądania (parametry, ciasteczka, nagłówki itd.) a do bufora związanego z instancją reprezentującą odpowiedź zapisujemy to, co ma być odesłane do klienta, czyli elementy strony WWW (np. HTML). W jaki sposób zapisujemy tę odpowiedź widzimy na powyższym przykładzie.