Karol Bieńkowski
Referat z "Aplikacji Bazodanowych w Internecie"
Wydział Matemetyki, Informatyki i Mechaniki Uniwersytetu Warszawskiego
Warszawa, 8 stycznia 2002 r.
Wersja offline


Serwlety



Co będzie?



Co to jest serwlet?



Przykładowy kod serwletu http

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SimpleServlet extends HttpServlet
{ 
    public void doGet (HttpServletRequest request,
                   HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter    out;

        response.setContentType("text/html");

        out = response.getWriter();
        out.println("<HTML><HEAD><TITLE>");
        out.println("Hello world servlet");
        out.println("</TITLE></HEAD><BODY>");
        out.println("<H1>" + title + "</H1>");
        out.println("<P>This is output from SimpleServlet.");
        out.println("</BODY></HTML>");
        out.close();
    }
}


Po co są serwlety?

Zasadniczo: do wyświetlania dynamicznych stron WWW.

Miejsce serwletów w aplikacjach J2EE

[j2ee tiers]
Rysunek 1. Warstwy w modelu J2EE (obrazek z J2EE Tutorial)


[j2ee containters]
Rysynek 2. Kontenery w modelu J2EE (obrazek z J2EE Tutorial)


Komunikacja z klientem



Przykład komunikacji z klientem

<html>
<head><title>Formularz</title></head>
<body>
    <form action="/karolb/test" method="post">
    Podaj tekst: <input type="text" name="tekst" value="">
    </form>
</body>
</html>
zadziała następujący serwlet:
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class TestServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter out;
        String tekst;
        
        response.setContentType("text/html");
        out = response.getWriter();
        out.println("<HTML><HEAD><TITLE>Wyniki z formularza");
        out.println("</TITLE></HEAD><BODY>");
        tekst = request.getParameter("tekst");
        if (tekst != null)
            out.println("Z formularza otrzymalem: " + tekst);
        else
            out.println("Brak danych z formularza");        
        out.println("</BODY></HTML>");
        out.close();
    }

    public void doGet(HttpServletRequest request, 
        HttpServletResponse response)
    throws ServletException, IOException {
        PrintWriter out;
        String tekst;
        
        response.setContentType("text/html");
        out = response.getWriter();
        out.println("<HTML><HEAD><TITLE>Uwaga</TITLE>");
        out.println("</HEAD><BODY>");
        out.println("Ten serwlet nie obsluguje metody GET!");        
        out.println("</BODY></HTML>");
        out.close();
    }
    
}

Wzmianka o wielowątkowości

Serwlety wykonują się w środowisku wielowątkowym, więc może się zdarzyć, że wiele kopii serwletu będzie działać naraz. A może być tak, że będzie jedna instancja serwletu, ale wiele wątków wykonujących metodę service. Jeżeli w serwlecie jest odwołanie do zasobu, który wymaga wyłączności to:

Cykl życia serwletu



Utrzymywanie stanu (session tracking)

To jedna z najważniejszych zalet serwletów. Nie ma tego w CGI.
Schemat: Cechy:

Przykład użycia sesji



Ciasteczka

Schemat użycia: Lepiej jednak używać sesji.


Dzielenie zasobów między serwlety (ServletContext)

Schemat (podobny do tego przy obsłudze sesji): Przechowywanie jest podobne do tego związanego z sesjami, ale te same obiekty są dostępne dla wszystkich serwletów na serwerze (w kontenerze). Dlatego trzeba szczególnie uważać na nazwy atrybutów, żeby się nie zdarzyło, że dwie różne apliacje chcą korzystać z tego samego atrybutu.

Przykład użycia kontekstu

public class WyswietlDane extends HttpServlet {

    public synchronized void init() throws ServletExcpetion {
        
        BazaDanych bd = (BazaDanych) 
            getServletContext().getAttribute("pl.sklep.bd.baza");

        if (bd == null) {
            bd = new BazaDanych("http://pulsar", "scott", "tiger");
            getServletContext().setAttribute("pl.sklep.bd.baza", bd);
        }
    
    }

    ...
}


Inne możliwości serwletów



Instalowanie serwletów na Tomcat'cie



Literatura:

Nie tylko o serwletach:

© 2001-2002 Karol Bieńkowski