Serwlet interfejsu 1.1

Dzisiaj zaczynamy nowy i ciekawy temat - serwlety . Dopiero dodanie serwletów do Javy sprawiło, że Java stała się de facto standardem dla dużych aplikacji serwerowych. 80% całego oprogramowania korporacyjnego na świecie jest napisane w Javie. A w Chinach wszystko jest na 100%. Czym więc są serwlety?

Serwlet jest dokładnie tym, co zamienia program Java w usługę sieciową i umożliwia mu przetwarzanie żądań od klientów. A było tak...

W latach 90., zaraz po pojawieniu się sieci World Wide Web, pojawiły się klienty sieciowe (przeglądarki) i serwery sieciowe. Serwery sieciowe zwykle po prostu dystrybuowały przez Internet przechowywane przez siebie pliki: strony HTML, skrypty, obrazy itp.

W pewnym momencie wszyscy doszli do wniosku, że konieczne będzie uczynienie obu stron mądrzejszymi. Do stron HTML dodano JavaScript, a do serwerów dodano wtyczki - specjalne skrypty, które były wywoływane w odpowiedzi na określone żądania i czyniły zachowanie serwera bardziej elastycznym i inteligentniejszym.

Tak więc serwlet jest taką wtyczką Java , która została wbudowana Java web-serveri pozwalała na wykonywanie kodu Java na żądanie dla niektórych stron. I już ten kod Java, reprezentowany przez klasę odziedziczoną z klasy Servlet, zrobił to, co zamierzali jego twórcy.

A jak już wiesz, najpopularniejszym serwerem internetowym Java jest Tomcat . Nawiasem mówiąc, nazwany na cześć kota Toma z kreskówki „Tom i Jerry”.

Jak Tomcat współdziała z serwletami? W rzeczywistości proces ten jest ustandaryzowany i nazywany jest cyklem życia serwletu . W nim aplet jest ładowalnym obiektem, a serwer WWW jest kontenerem serwletu .

Jeśli aplet nie został jeszcze załadowany , to:

  1. Klasa serwletu jest ładowana przez kontener.
  2. Kontener tworzy instancję klasy (obiektu) serwletu.
  3. Kontener wywołuje metodę init()na obiekcie serwletu. Metoda jest wywoływana tylko raz.

Standardowy cykl pracy - obsługa zgłoszenia klienta :

  • Każde żądanie jest przetwarzane w osobnym wątku.
  • Kontener wywołuje metodę service()serwletu i przekazuje tam obiekty ServletRequest i ServletResponse.
  • destroy()Aby zakończyć działanie serwletu, na obiekcie serwletu wywoływana jest metoda . Nazywa się to tylko raz.

Może być wiele powodów, dla których aplet kończy działanie:

  • Programista restartuje serwer WWW, konieczne jest płynne zamknięcie wszystkich serwletów.
  • Programista ładuje nową wersję serwletu, stara musi zostać poprawnie rozładowana.
  • I tak dalej.

Pamiętaj o najważniejszej rzeczy: serwer WWW i jego serwlety powinny działać bez awarii i restartów przez miesiące, obsługując tysiące żądań na minutę. Dlatego kod służący zarówno do ładowania, działania, jak i usuwania serwletu powinien być zawsze napisany bardzo wysokiej jakości.

1.2 Klasa HttpServlet

Klasa Servlet istnieje w celu ujednolicenia działania serwletu i kontenera. Programiści nie pracują bezpośrednio z tą klasą. Cóż, rzadko działają. Najczęściej używana klasa HttpServletjest dziedziczona z Servletu.

Ta klasa ma kilka metod, które będą dla nas przydatne. Będziesz ich często używać:

metoda Opis
1 init() Wywoływana raz, gdy serwlet jest ładowany
2 destroy() Wywoływany raz, gdy aplet jest rozładowywany
3 service(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu do serwletu
4 doGet(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu GET do serwletu
5 doPost(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu POST do serwletu
6 doHead(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu HEAD do serwletu
7 doDelete(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu DELETE do serwletu
8 doPut(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu PUT do serwletu

Metody init()i destroy()są dziedziczone z klasy Servlet. Dlatego, jeśli zdecydujesz się nadpisać je w swoim serwlecie, będziesz musiał również wywołać ich implementację z klasy bazowej. Służy do tego polecenie super.method name().

Przykład serwletu:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Getting the parameter “secret” from request
        String secret = request.getParameter("secret");
 
        // Put parameter “secret” into Http-session
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Print HTML as response for browser
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Header</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet example "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

1.3 metoda usługi (HttpServletRequest, HttpServletResponse)

Jeśli spojrzysz na przetwarzanie żądania klienta z punktu widzenia serwletu, to wygląda to mniej więcej tak.

Dla każdego żądania klienta kontener (serwer WWW) tworzy obiekty HttpServletRequesti HttpServletResponse, a następnie wywołuje metodę service(HttpServletRequest request, HttpServletResponse response)odpowiedniego serwletu. Obiekty te są do niej przekazywane, aby metoda mogła pobrać niezbędne dane requesti umieścić wynik pracy w pliku response.

Metoda service()ma domyślną implementację. Jeśli nie zostanie ponownie zdefiniowany, zostanie wykonany. To właśnie robi.

Metoda service()określa typ metody HTTP z żądania (GET, POST, ...) i wywołuje metodę odpowiadającą żądaniu.

metoda Opis
1 service(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu do serwletu
2 doGet(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu GET do serwletu
3 doPost(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu POST do serwletu
4 doHead(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu HEAD do serwletu
5 doDelete(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu DELETE do serwletu
6 doPut(HttpRequest, HttpResponse) Wywoływana przy każdym nowym żądaniu PUT do serwletu

W swojej klasie możesz albo przedefiniować jedną metodę service(), albo zostawić ją w spokoju, ale potem przedefiniować metody doGet(), doPost(), ... w razie potrzeby.