Bonjour ! Dans la leçon précédente, nous avons achevé la construction de notre couche d'accès aux données (DAO) en implémentant les opérations de mise à jour et de suppression. Vous disposez maintenant d'un composant CRUD complet et robuste, prêt à être utilisé.
Aujourd'hui, nous quittons le monde des applications console pour plonger dans le développement web avec Java. C'est une étape majeure dans votre parcours pour devenir développeur backend. L'objectif de cette leçon est de comprendre les deux piliers fondamentaux de toute application web Java : le rôle du conteneur de servlets (comme Apache Tomcat) et le cycle de vie d'une servlet. Ces concepts sont essentiels car ils constituent le moteur qui fait fonctionner votre code sur un serveur.
1. De l'application console à l'application web
Jusqu'à présent, nos programmes avaient un point d'entrée unique (main), s'exécutaient de manière séquentielle et se terminaient. Une application web est fondamentalement différente :
- Elle ne se termine pas. Elle tourne en continu sur un serveur.
- Elle attend des requêtes provenant de clients (généralement des navigateurs web).
- Elle doit pouvoir gérer plusieurs requêtes simultanément de la part de plusieurs utilisateurs.
Pour gérer cette complexité, les applications web Java ne s'exécutent pas seules. Elles sont déployées et gérées par un logiciel spécialisé : le conteneur de servlets.
2. Le rôle du conteneur de servlets
Imaginez le conteneur de servlets comme un environnement d'exécution spécialisé pour vos composants web. Apache Tomcat est l'un des conteneurs de servlets les plus populaires, et c'est celui que nous utiliserons. On l'appelle aussi parfois "moteur de servlets".
Ses responsabilités principales sont :
- Serveur HTTP : Il écoute les requêtes HTTP entrantes sur un port réseau (par exemple, 8080).
- Routage des requêtes : Il analyse l'URL de la requête et la transmet au bon composant Java (la bonne servlet) à exécuter.
- Gestion du cycle de vie des servlets : Il contrôle la création, l'utilisation et la destruction de vos servlets.
- Gestion de la concurrence : Il gère les threads pour traiter plusieurs requêtes en parallèle.
La vidéo suivante introduit très bien ces concepts.
Concepts de base Technologie Web JEE Servlet JSP MVC Spring MVC
Le professeur Youssfi explique ici l'architecture d'une application web Java EE (l'ancêtre de Jakarta EE) et le rôle central du conteneur.
Regardez les deux segments suivants : Le conteneur web : Focus sur la définition de Tomcat comme conteneur web et moteur de servlets. Le rôle de la servlet : Comprenez comment une requête HTTP est acheminée vers une servlet pour traitement.
Pour compléter cette introduction, voici une définition textuelle claire.
Développons en Java - Les servlets
Cet extrait du guide "Développons en Java" formalise le rôle du conteneur.
Lisez la section "Le rôle du conteneur web". Portez une attention particulière à la manière dont il gère le chargement, l'instanciation et l'initialisation des servlets.
En résumé, le conteneur est le chef d'orchestre de votre application web. Vous écrivez les "partitions" (les servlets), et le conteneur s'occupe de les faire jouer au bon moment.
3. La servlet et son cycle de vie
Maintenant, qu'est-ce qu'une servlet exactement ? C'est une classe Java qui étend les capacités d'un serveur. Elle reçoit des requêtes et formule des réponses, le plus souvent via le protocole HTTP.
Le conteneur gère la vie d'une servlet selon un cycle bien défini, marqué par trois phases principales. Ce cycle de vie est au cœur du fonctionnement des applications web Java.

Les méthodes qui définissent ce cycle proviennent de l'interface javax.servlet.Servlet.
Développons en Java - Les servlets
Ce document détaille les méthodes fondamentales qui constituent le cycle de vie d'une servlet.
Concentrez-vous sur le tableau décrivant les 5 méthodes de l'interface Servlet. Retenez surtout le rôle des trois méthodes principales du cycle de vie : init(), service(), et destroy().
Voici les étapes en détail :
-
Instanciation
- Le conteneur crée une seule instance de la classe de servlet. Par défaut, cela se produit soit au démarrage de l'application, soit lors de la toute première requête adressée à cette servlet.
- Point crucial : Contrairement à PHP où un script est ré-exécuté à chaque requête, en Java, la même instance d'objet servlet est utilisée pour traiter toutes les requêtes successives.
-
Initialisation (
init()a lieu une seule fois)- Juste après l'instanciation, le conteneur appelle la méthode
init()de la servlet. - Cette méthode est garantie de n'être appelée qu'une seule fois durant toute la vie de la servlet.
- C'est l'endroit idéal pour effectuer des initialisations coûteuses : ouvrir une connexion à une base de données, charger des fichiers de configuration, etc.
- Juste après l'instanciation, le conteneur appelle la méthode
-
Traitement des requêtes (
service()a lieu pour chaque requête)- Pour chaque requête client, le conteneur appelle la méthode
service()de l'instance de la servlet. - Cette méthode reçoit deux objets en paramètre :
ServletRequest: contient les informations de la requête du client (paramètres, en-têtes HTTP, etc.).ServletResponse: permet de construire et d'envoyer la réponse au client.
- Dans le cas de servlets HTTP, la méthode
service()examine la méthode HTTP (GET, POST, etc.) et délègue le travail aux méthodes correspondantes :doGet(),doPost(), etc.
- Pour chaque requête client, le conteneur appelle la méthode
-
Destruction (
destroy()a lieu une seule fois)- Lorsque le conteneur décide de décharger la servlet (par exemple, à l'arrêt de l'application), il appelle la méthode
destroy(). - Cette méthode est également appelée une seule fois.
- C'est l'endroit où l'on doit libérer les ressources acquises dans la méthode
init()(fermer les connexions, etc.).
- Lorsque le conteneur décide de décharger la servlet (par exemple, à l'arrêt de l'application), il appelle la méthode
La vidéo suivante offre une excellente explication détaillée de ce cycle de vie, en soulignant le rôle de Tomcat et en faisant une comparaison pertinente avec PHP qui vous sera familière.
Concepts de base Technologie Web JEE Servlet JSP MVC Spring MVC
Continuons avec la vidéo du professeur Youssfi, qui va maintenant détailler chaque phase du cycle de vie.
Regardez attentivement ce long segment, qui est le cœur de notre leçon : Cycle de vie d'une servlet : Suivez la chronologie complète, depuis le démarrage de Tomcat, l'instanciation de la servlet, l'appel à init(), les appels répétés à service() pour chaque requête, et enfin l'appel à destroy(). Notez bien la comparaison avec le modèle de PHP vers 00:36:15.
Pour voir ce concept en action, la vidéo suivante propose une démonstration pratique qui prouve le principe de l'instance unique.
TUTO JAVA EE - Cycle de vie d'une Servlet
Cette vidéo de Dominique Liard montre concrètement comment le cycle de vie se déroule.
Visualisez ces deux parties : Instance unique : L'auteur prouve par le code que le constructeur de la servlet n'est appelé qu'une seule fois, même avec de multiples requêtes de navigateurs différents. C'est la meilleure façon de visualiser le concept de "singleton". Les méthodes du cycle de vie : Il montre l'ordre d'appel des méthodes init(), doGet() et destroy() lors du démarrage, des requêtes et de l'arrêt du serveur.
4. Implications du modèle "une seule instance"
Le fait qu'une seule instance de servlet gère toutes les requêtes a une conséquence majeure que vous devez absolument comprendre pour éviter des erreurs courantes.
Si vous déclarez une variable d'instance (un attribut) dans votre classe de servlet, cette variable sera partagée par toutes les requêtes.
public class MaServlet extends HttpServlet {
private int compteur = 0; // Cet attribut est partagé !
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
compteur++; // Danger !
System.out.println("Cette servlet a été appelée " + compteur + " fois.");
// ...
}
}
Si deux utilisateurs accèdent à cette servlet en même temps, ils vont modifier le même compteur en mémoire, ce qui peut mener à des résultats imprévisibles (une "race condition").
Règle d'or : Les servlets doivent être conçues pour être "thread-safe". Évitez de stocker un état spécifique à une requête ou à un utilisateur dans les attributs d'instance de la servlet. Les données relatives à une requête doivent rester locales à la méthode (doGet, doPost, etc.).
La dernière partie de la vidéo de Dominique Liard illustre parfaitement ce point.
TUTO JAVA EE - Cycle de vie d'une Servlet
Cette courte section illustre le danger des variables d'instance partagées.
Regardez le segment Le compteur partagé. Il démontre comment un simple compteur en tant que variable d'instance est incrémenté par toutes les requêtes, quel que soit l'utilisateur.
Conclusion
Aujourd'hui, nous avons posé les fondations théoriques du développement web en Java.
Points clés à retenir :
- Un conteneur de servlets (comme Tomcat) est un programme serveur qui héberge et gère les applications web Java.
- Une servlet est une classe Java qui traite les requêtes HTTP et génère des réponses.
- Le conteneur gère le cycle de vie de la servlet en appelant les méthodes
init(),service(), etdestroy()à des moments précis. init()etdestroy()sont appelées une seule fois.service()est appelée pour chaque requête.- Par défaut, une servlet est un singleton (une seule instance). Ses attributs sont donc partagés entre toutes les requêtes, ce qui requiert une attention particulière à la gestion de l'état (concurrence).
Maintenant que vous comprenez la théorie, il est temps de passer à la pratique. Dans la prochaine leçon, nous installerons Tomcat, nous créerons notre toute première servlet dans IntelliJ, et nous la déploierons pour la voir répondre à une requête HTTP directement depuis notre navigateur.