Cum gestionează containerul de servlete ciclul de viață al servletului? Ce metode sunt apelate și în ce momente?
Răspuns de la AI
sobes.tech AI
Контейнер управляет жизненным циклом сервлета через набор методов: init, service, destroy.
-
Загрузка класса сервлета: Когда контейнер получает первый запрос к сервлету или при старте приложения (если настроено).
-
Создание экземпляра сервлета: Контейнер создает один экземпляр класса сервлета для всего приложения.
-
Вызов
init(): Контейнер вызывает методinit(ServletConfig config)однократно после создания экземпляра. В этом методе можно выполнить инициализацию, загрузить ресурсы и получить конфигурацию сервлета. Метод не должен быть вызван снова, пока сервлет не будет уничтожен и воссоздан.// java public void init(ServletConfig config) throws ServletException { // Инициализация сервлета this.config = config; // Получение параметров инициализации String param = config.getInitParameter("someParam"); } -
Вызов
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>"); } -
Вызов
destroy(): Контейнер вызывает методdestroy()однократно перед уничтожением экземпляра сервлета. Это происходит при остановке приложения или при удалении сервлета из контейнера. В этом методе освобождаются ресурсы (например, закрываются соединения с базой данных или файлы). После вызоваdestroyконтейнер может выполнить сборку мусора для экземпляра сервлета.// java public void destroy() { // Освобождение ресурсов // Например, закрытие соединений }
Жизненный цикл можно представить в виде таблицы:
| Метод | Вызывается | Назначение |
|---|---|---|
init() |
Один раз после создания экземпляра сервлета | Инициализация, загрузка ресурсов |
service() |
Для каждого входящего запроса | Обработка запроса, генерация ответа |
destroy() |
Один раз перед уничтожением экземпляра сервлета | Освобождение ресурсов, завершение работы |
Контейнер гарантирует, что init будет вызван до вызова service, а destroy будет вызван после последнего вызова service. Методы service могут вызываться параллельно.