Sobes.tech
Middle

Как се обработва HTTP заявка в класа HttpServlet?

sobes.tech AI

Отговор от AI

Обработката на HTTP заявка в класа HttpServlet се извършва чрез презаписване на една от методите doGet, doPost, doPut, doDelete, doHead, doOptions, doTrace или service.

Цикълът на живот на обработката на заявката:

  1. Контейнерът за сервлети (например Tomcat) получава HTTP заявка.
  2. Контейнерът определя съответния сервлет въз основа на URL адреса на заявката.
  3. Ако сервлетът все още не е зареден, контейнерът го създава, извиква метода init() (веднъж през целия му живот) и го поставя в пул.
  4. Контейнерът създава обекти HttpServletRequest и HttpServletResponse, които инкапсулират данните от заявката и предоставят методи за формиране на отговора.
  5. Контейнерът извиква метода service(HttpServletRequest req, HttpServletResponse resp) на сервлета.
  6. В стандартната реализация service определя типа на HTTP метода (GET, POST и т.н.) и делегира обработката на съответния метод do<Method> (doGet, doPost и т.н.), предавайки им обектите на заявката и отговора.
  7. Разработчикът презаписва необходимия метод do<Method> за реализиране на специфична логика за обработка на заявката.
  8. Методът do<Method> формира отговора, като записва данни в HttpServletResponse.
  9. След приключване на работата на метода service, контейнерът изпраща формирания отговор към клиента.
  10. Когато контейнерът реши да изтегли сервлета (например при спиране на приложението), той извиква метода destroy() за освобождаване на ресурсите.

Пример за презаписване на doGet:

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 MyServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Настройка на типа съдържание и кодирането на отговора
        response.setContentType("text/html;charset=UTF-8");

        // Получаване на PrintWriter за запис на отговора
        try (PrintWriter out = response.getWriter()) {
            // Записване на HTML разметка в отговора
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Поздрав</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Поздрав от моя сервлет!</h1>");
            out.println("</body>");
            out.println("</html>");
        }
    }
}

Таблица с основните методи do<Method> и тяхното предназначение:

Метод Предназначение
doGet Обработка на GET заявки (получаване на данни, идемпотентни операции).
doPost Обработка на POST заявки (изпращане на данни за обработка, създаване на ресурси).
doPut Обработка на PUT заявки (актуализация на ресурси).
doDelete Обработка на DELETE заявки (изтриване на ресурси).
doHead Обработка на HEAD заявки (получаване само на заглавките на отговора).
doOptions Обработка на OPTIONS заявки (получаване на информация за наличните методи).
doTrace Обработка на TRACE заявки (отстраняване на грешки, ехо на заявката).

Презаписването на метода service позволява напълно да се пренапише логиката за маршрутизиране на заявките, но обикновено се презаписват конкретните do<Method> методи.