Middle
Как се обработва HTTP заявка в класа HttpServlet?
sobes.tech AI
Отговор от AI
Обработката на HTTP заявка в класа HttpServlet се извършва чрез презаписване на една от методите doGet, doPost, doPut, doDelete, doHead, doOptions, doTrace или service.
Цикълът на живот на обработката на заявката:
- Контейнерът за сервлети (например Tomcat) получава HTTP заявка.
- Контейнерът определя съответния сервлет въз основа на URL адреса на заявката.
- Ако сервлетът все още не е зареден, контейнерът го създава, извиква метода
init()(веднъж през целия му живот) и го поставя в пул. - Контейнерът създава обекти
HttpServletRequestиHttpServletResponse, които инкапсулират данните от заявката и предоставят методи за формиране на отговора. - Контейнерът извиква метода
service(HttpServletRequest req, HttpServletResponse resp)на сервлета. - В стандартната реализация
serviceопределя типа на HTTP метода (GET, POST и т.н.) и делегира обработката на съответния методdo<Method>(doGet,doPostи т.н.), предавайки им обектите на заявката и отговора. - Разработчикът презаписва необходимия метод
do<Method>за реализиране на специфична логика за обработка на заявката. - Методът
do<Method>формира отговора, като записва данни вHttpServletResponse. - След приключване на работата на метода
service, контейнерът изпраща формирания отговор към клиента. - Когато контейнерът реши да изтегли сервлета (например при спиране на приложението), той извиква метода
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> методи.