← Назад к вопросам

Сталкивался ли с сервлетами

2.7 Senior🔥 231 комментариев
#Docker, Kubernetes и DevOps#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сервлеты в Java: практический опыт

Что такое сервлеты

Сервлет — это Java-класс, который работает на серверной стороне и обрабатывает HTTP-запросы от клиентов. По сути, это основной строительный блок веб-приложений на Java, существующий более 25 лет и используемый в production-системах по всему миру.

Да, я активно работал с сервлетами на протяжении своей карьеры. Они остаются фундаментом для понимания веб-разработки в Java, даже если современные приложения часто используют фреймворки вроде Spring Boot, которые скрывают сервлеты под капотом.

Основные компоненты сервлета

Вот базовый пример сервлета:

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

public class HelloServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // Получение параметра из запроса
        String name = request.getParameter("name");
        if (name == null) {
            name = "World";
        }
        
        // Установка типа контента
        response.setContentType("text/html; charset=UTF-8");
        
        // Отправка ответа
        response.getWriter().println(
            "<html><body>Hello, " + name + "!</body></html>"
        );
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {
        // Обработка POST-запросов
        String data = request.getParameter("data");
        response.setContentType("application/json");
        response.getWriter().println("{\"status\":\"success\"}");
    }
}

Жизненный цикл сервлета

Каждый сервлет проходит через три ключевые фазы:

  1. Инициализация — метод init() вызывается один раз при загрузке сервлета контейнером. Здесь инициализируются ресурсы (подключения к БД, конфигурация).

  2. Обработка запросов — методы doGet(), doPost(), doPut(), doDelete() вызываются для каждого входящего запроса. Сервлет может обрабатывать множество запросов параллельно в отдельных потоках.

  3. Уничтожение — метод destroy() вызывается один раз перед выгрузкой сервлета. Здесь освобождаются ресурсы.

Практический опыт с сервлетами

В своей работе я:

  • Писал фильтры сервлетов для аутентификации и логирования:
public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String token = httpRequest.getHeader("Authorization");
        
        if (token != null && validateToken(token)) {
            chain.doFilter(request, response);
        } else {
            ((HttpServletResponse) response).sendError(
                HttpServletResponse.SC_UNAUTHORIZED
            );
        }
    }
}
  • Работал с HttpSession для управления состоянием пользователя
  • Обрабатывал загрузку файлов через multipart/form-data
  • Использовал RequestDispatcher для перенаправления между сервлетами
  • Интегрировал сервлеты с JSP для отделения логики от представления

Переход на современные фреймворки

В наши дни основной объём работы я выполняю с помощью Spring Framework (особенно Spring Boot), которая предоставляет более удобный и декларативный способ обработки HTTP-запросов через контроллеры. Однако понимание того, как работают сервлеты на нижнем уровне, помогает мне:

  • Отлаживать сложные проблемы с жизненным циклом
  • Писать кастомные фильтры и интерцепторы
  • Понимать, как Spring Boot работает под капотом
  • Эффективнее оптимизировать производительность

Сервлеты — это не просто наследство Java, а прочный фундамент, на котором построены все современные веб-приложения в экосистеме Java.