Sobes.tech
Middle

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

sobes.tech AI

Отговор от 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 могат да се извикват паралелно.