Назад к вопросам
Middle
72
questionbank

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

Sobes Copilot

Получайте ответы в реальном времени

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

sobes.tech AI

Жизненный цикл сервлета управляется контейнером сервлетов. Он проходит следующие этапы:

  1. Загрузка класса (Loading): Контейнер загружает класс сервлета.
  2. Создание экземпляра (Instantiation): Создается один экземпляр сервлета с помощью метода Class.newInstance(). Сервлеты являются синглтонами в контексте приложения.
  3. Инициализация (Initialization): Контейнер вызывает метод init(ServletConfig config). Этот метод вызывается только один раз за весь жизненный цикл сервлета. Он используется для выполнения задач инициализации, таких как чтение параметров конфигурации, создание подключений к базе данных и т.д.
    // Пример метода init()
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        // Инициализация ресурсов
        System.out.println("Сервлет инициализирован.");
    }
    
  4. Обработка запросов (Request Handling): Сервлет готов обрабатывать запросы клиентов. Для каждого входящего запроса контейнер создает новый поток и вызывает метод service(ServletRequest request, ServletResponse response). Метод service() обычно делегирует обработку запроса другим специфичным методам, таким как doGet(), doPost(), doPut(), doDelete() в зависимости от типа HTTP-запроса.
    // Пример метода service()
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Делегирование обработки запроса
        super.service(request, response);
    }
    
    // Пример метода doGet()
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Привет из сервлета!</h1>");
    }
    
  5. Уничтожение (Destruction): Когда контейнер решает выгрузить сервлет (например, при останове приложения), он вызывает метод destroy(). Этот метод вызывается только один раз перед уничтожением экземпляра сервлета. Он используется для освобождения ресурсов, таких как закрытие подключений к базе данных, очистка кэша и т.д.
    // Пример метода destroy()
    public void destroy() {
        // Освобождение ресурсов
        System.out.println("Сервлет уничтожен.");
    }
    

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

Этап Метод, вызываемый контейнером Описание Вызывается
Загрузка класса - Класс сервлета загружается в память Один раз
Создание экземпляра Class.newInstance() Создается экземпляр сервлета Один раз
Инициализация init(ServletConfig config) Выполнение инициализационных задач Один раз
Обработка запросов service(...), doGet(...), doPost(...) и т.д. Обработка входящих клиентских запросов Много раз
Уничтожение destroy() Освобождение ресурсов перед удалением экземпляра сервлета Один раз