¿Cómo gestiona el contenedor de servlets el ciclo de vida del servlet? ¿Qué métodos se llaman y en qué momentos?
Respuesta de la IA
sobes.tech AI
El contenedor gestiona el ciclo de vida del servlet a través de un conjunto de métodos: init, service, destroy.
-
Carga de la clase del servlet: Cuando el contenedor recibe la primera solicitud al servlet o al iniciar la aplicación (si está configurado).
-
Creación de una instancia del servlet: El contenedor crea una única instancia de la clase del servlet para toda la aplicación.
-
Llamada a
init(): El contenedor llama al métodoinit(ServletConfig config)una sola vez después de crear la instancia. En este método se puede realizar la inicialización, cargar recursos y obtener la configuración del servlet. El método no debe ser llamado de nuevo hasta que el servlet sea destruido y recreado.// java public void init(ServletConfig config) throws ServletException { // Inicialización del servlet this.config = config; // Obtener parámetros de inicialización String param = config.getInitParameter("someParam"); } -
Llamada a
service(): Para cada solicitud entrante, el contenedor llama al métodoservice(ServletRequest request, ServletResponse response). Este método procesa la solicitud y genera la respuesta. Normalmente delega el procesamiento a métodos específicos de HTTP (doGet,doPost, etc.) en las subclases deHttpServlet. El métodoservicees multihilo, el contenedor puede llamarlo simultáneamente para varias solicitudes.// java public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // Verificación del tipo de solicitud y llamada al método correspondiente if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) { // Delegación a HttpServlet super.service(request, response); } else { // Procesamiento de otros tipos de solicitudes throw new ServletException("Solo se soportan solicitudes HTTP"); } } // Ejemplo de método doXXX en HttpServlet protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // Procesamiento de solicitud GET response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<h1>Hola</h1>"); } -
Llamada a
destroy(): El contenedor llama al métododestroy()una sola vez antes de destruir la instancia del servlet. Esto ocurre al detener la aplicación o al eliminar el servlet del contenedor. En este método se liberan recursos (por ejemplo, se cierran conexiones a bases de datos o archivos). Tras llamar adestroy, el contenedor puede realizar la recolección de basura para la instancia del servlet.// java public void destroy() { // Liberación de recursos // Por ejemplo, cierre de conexiones }
El ciclo de vida se puede representar en forma de tabla:
| Método | Se llama | Propósito |
|---|---|---|
init() |
Una vez después de crear la instancia del servlet | Inicialización, carga de recursos |
service() |
Para cada solicitud entrante | Procesamiento de solicitud, generación de respuesta |
destroy() |
Una vez antes de destruir la instancia del servlet | Liberación de recursos, finalización del trabajo |
El contenedor garantiza que init será llamado antes de service, y que destroy será llamado después de la última llamada a service. Los métodos service pueden ser llamados en paralelo.