Sobes.tech
Middle
86
questionbank

Как контейнер сервлетов управляет жизненным циклом сервлета? Какие методы вызываются и в какие моменты?

Ответ от нейросети

sobes.tech AI

Контейнер управляет жизненным циклом сервлета через набор методов: init, service, destroy.

  1. Загрузка класса сервлета: Когда контейнер получает первый запрос к сервлету или при старте приложения (если настроено).

  2. Создание экземпляра сервлета: Контейнер создает один экземпляр класса сервлета для всего приложения.

  3. Вызов init(): Контейнер вызывает метод init(ServletConfig config) однократно после создания экземпляра. В этом методе можно выполнить инициализацию, загрузить ресурсы и получить конфигурацию сервлета. Метод не должен быть вызван снова, пока сервлет не будет уничтожен и воссоздан.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Инициализация сервлета
        this.config = config;
        // Получение параметров инициализации
        String param = config.getInitParameter("someParam");
    }
    
  4. Вызов service(): Для каждого входящего запроса контейнер вызывает метод service(ServletRequest request, ServletResponse response). Этот метод обрабатывает запрос и генерирует ответ. Обычно он делегирует обработку специфичным методам HTTP (doGet, doPost и т.д.) в потомках класса HttpServlet. Метод service является многопоточным, контейнер может вызывать его одновременно для нескольких запросов.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Проверка типа запроса и вызов соответствующего метода
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Делегирование в HttpServlet
            super.service(request, response);
        } else {
            // Обработка других типов запросов
            throw new ServletException("Только HTTP запросы поддерживаются");
        }
    }
    
    // Пример doXXX метода в HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Обработка GET запроса
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Привет</h1>");
    }
    
  5. Вызов destroy(): Контейнер вызывает метод destroy() однократно перед уничтожением экземпляра сервлета. Это происходит при остановке приложения или при удалении сервлета из контейнера. В этом методе освобождаются ресурсы (например, закрываются соединения с базой данных или файлы). После вызова destroy контейнер может выполнить сборку мусора для экземпляра сервлета.

    // java
    public void destroy() {
        // Освобождение ресурсов
        // Например, закрытие соединений
    }
    

Жизненный цикл можно представить в виде таблицы:

Метод Вызывается Назначение
init() Один раз после создания экземпляра сервлета Инициализация, загрузка ресурсов
service() Для каждого входящего запроса Обработка запроса, генерация ответа
destroy() Один раз перед уничтожением экземпляра сервлета Освобождение ресурсов, завершение работы

Контейнер гарантирует, что init будет вызван до вызова service, а destroy будет вызван после последнего вызова service. Методы service могут вызываться параллельно.