Sobes.tech
Middle

Comment le conteneur de servlets gère-t-il le cycle de vie du servlet ? Quelles méthodes sont appelées et à quels moments ?

sobes.tech IA

Réponse de l'IA

Le conteneur gère le cycle de vie du servlet à travers un ensemble de méthodes : init, service, destroy.

  1. Chargement de la classe du servlet : Lorsque le conteneur reçoit la première requête vers le servlet ou lors du démarrage de l'application (si configuré).

  2. Création d'une instance du servlet : Le conteneur crée une seule instance de la classe du servlet pour toute l'application.

  3. Appel à init(): Le conteneur appelle la méthode init(ServletConfig config) une seule fois après la création de l'instance. Dans cette méthode, l'initialisation peut être effectuée, des ressources chargées et la configuration du servlet obtenue. La méthode ne doit pas être rappelée tant que le servlet n'est pas détruit et recréé.

    // java
    public void init(ServletConfig config) throws ServletException {
        // Initialisation du servlet
        this.config = config;
        // Récupération des paramètres d'initialisation
        String param = config.getInitParameter("someParam");
    }
    
  4. Appel à service(): Pour chaque requête entrante, le conteneur appelle la méthode service(ServletRequest request, ServletResponse response). Cette méthode traite la requête et génère la réponse. Elle délègue généralement le traitement à des méthodes HTTP spécifiques (doGet, doPost, etc.) dans les sous-classes de HttpServlet. La méthode service est multithread, le conteneur peut l'appeler simultanément pour plusieurs requêtes.

    // java
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        // Vérification du type de requête et appel de la méthode appropriée
        if (request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            // Délégation à HttpServlet
            super.service(request, response);
        } else {
            // Traitement d'autres types de requêtes
            throw new ServletException("Seules les requêtes HTTP sont supportées");
        }
    }
    
    // Exemple de méthode doXXX dans HttpServlet
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Traitement de la requête GET
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<h1>Bonjour</h1>");
    }
    
  5. Appel à destroy(): Le conteneur appelle la méthode destroy() une seule fois avant de détruire l'instance du servlet. Cela se produit lors de l'arrêt de l'application ou lors de la suppression du servlet du conteneur. Dans cette méthode, les ressources sont libérées (par exemple, fermeture des connexions à la base de données ou fichiers). Après l'appel à destroy, le conteneur peut effectuer la collecte de garbage pour l'instance du servlet.

    // java
    public void destroy() {
        // Libération des ressources
        // Par exemple, fermeture des connexions
    }
    

Le cycle de vie peut être représenté sous forme de tableau :

Méthode Appelée Objectif
init() Une fois après la création de l'instance du servlet Initialisation, chargement des ressources
service() Pour chaque requête entrante Traitement de la requête, génération de la réponse
destroy() Une fois avant la destruction de l'instance du servlet Libération des ressources, fin du travail

Le conteneur garantit que init sera appelé avant service, et que destroy sera appelé après le dernier appel à service. Les méthodes service peuvent être appelées en parallèle.