Что такое Servlet API в Java?

«Что такое Servlet API в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

**Servlet API (Jakarta Servlet API)** — это стандартная спецификация Java (часть Jakarta EE, ранее Java EE), которая определяет контракт между веб-сервером (контейнером сервлетов, таким как Apache Tomcat, Jetty, Undertow) и компонентом приложения (**сервлетом**) для обработки HTTP-запросов и формирования ответов. **Ключевые компоненты API:** * **`javax.servlet.Servlet` (теперь `jakarta.servlet.Servlet`):** Базовый интерфейс с методами жизненного цикла: `init()`, `service()`, `destroy()`. * **`javax.servlet.http.HttpServlet`:** Абстрактный класс, расширяющий `Servlet`, предоставляющий методы для обработки конкретных HTTP-методов: `doGet()`, `doPost()`, `doPut()`, `doDelete()` и др. * **`ServletRequest` / `HttpServletRequest`:** Предоставляют доступ к данным входящего запроса (параметры, заголовки, тело, сессия). * **`ServletResponse` / `HttpServletResponse`:** Позволяют формировать исходящий ответ (устанавливать статус, заголовки, записывать тело). * **`ServletContext`:** Представляет контекст всего веб-приложения (общие атрибуты, доступ к ресурсам). **Пример простого HTTP-сервлета:** ```java import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/hello") // Объявление сервлета и его URL-маппинга с помощью аннотации public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // Устанавливаем тип контента ответа response.setContentType("text/html; charset=UTF-8"); // Получаем параметр из запроса String name = request.getParameter("name"); // Формируем и отправляем ответ response.getWriter().println("

Hello, " + (name != null ? name : "World") + "!

"); } } ``` **Жизненный цикл и особенности:** 1. **Загрузка и инициализация:** Контейнер загружает класс сервлета и вызывает `init()` один раз. 2. **Обработка запросов:** Для каждого HTTP-запроса контейнер создает новые объекты `HttpServletRequest`/`HttpServletResponse` и вызывает метод `service()` (который, в свою очередь, вызывает `doGet()`, `doPost()` и т.д.) **в отдельном потоке**. Один экземпляр сервлета обслуживает множество запросов параллельно. 3. **Выгрузка:** При остановке приложения контейнер вызывает метод `destroy()` для освобождения ресурсов. **Эволюция:** Современная разработка часто использует фреймворки более высокого уровня (Spring MVC, Jakarta Faces, JAX-RS), которые сами построены на Servlet API, абстрагируя разработчика от низкоуровневых деталей.