Sobes.tech
Middle
157

¿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.

  1. Carga de la clase del servlet: Cuando el contenedor recibe la primera solicitud al servlet o al iniciar la aplicación (si está configurado).

  2. Creación de una instancia del servlet: El contenedor crea una única instancia de la clase del servlet para toda la aplicación.

  3. Llamada a init(): El contenedor llama al método init(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");
    }
    
  4. Llamada a service(): Para cada solicitud entrante, el contenedor llama al método service(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 de HttpServlet. El método service es 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>");
    }
    
  5. Llamada a destroy(): El contenedor llama al método destroy() 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 a destroy, 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.