Bonjour ! Dans la leçon précédente, nous avons jeté les bases théoriques du développement web en Java, en explorant le rôle du conteneur de servlets comme Tomcat et le cycle de vie d'une servlet. Vous savez maintenant qu'une servlet est instanciée une seule fois et que ses méthodes init(), service() et destroy() sont orchestrées par le conteneur.
Aujourd'hui, nous mettons cette théorie en pratique. L'objectif est de créer notre première servlet fonctionnelle. Vous apprendrez à la faire répondre à deux types fondamentaux de requêtes HTTP : GET et POST. C'est la compétence de base indispensable pour construire n'importe quelle interaction dans une application web Java.
1. De Servlet à HttpServlet
Dans la leçon précédente, nous avons parlé de l'interface javax.servlet.Servlet. En pratique, pour le développement web, on utilise presque toujours une classe qui nous simplifie la vie : javax.servlet.http.HttpServlet.
HttpServlet est une classe abstraite qui hérite de GenericServlet (qui elle-même implémente Servlet) et qui est spécialisée pour le protocole HTTP. Son principal avantage est que sa méthode service() analyse automatiquement la méthode de la requête HTTP (GET, POST, PUT, etc.) et appelle une méthode correspondante :
- Une requête
GETest redirigée vers la méthodedoGet(). - Une requête
POSTest redirigée vers la méthodedoPost(). - Et ainsi de suite pour
doPut(),doDelete(), etc.
Cela nous évite d'avoir à écrire ce code de "routage" nous-mêmes. Notre travail consiste donc à redéfinir doGet() et/ou doPost() pour y placer notre logique métier.
Développons en Java - Les servlets
Ce document explique clairement comment HttpServlet distribue les requêtes.
Lisez la section intitulée "L'analyse de la requête". Elle confirme que la méthode service() de HttpServlet se charge d'appeler doGet() ou doPost(), nous n'avons donc généralement pas besoin de redéfinir service() nous-mêmes.
2. Gérer les requêtes GET et POST
Votre expérience en développement web avec PHP et JavaScript vous a déjà familiarisé avec les requêtes GET et POST. Le principe est exactement le même en Java.

La méthode doGet()
Elle est typiquement utilisée pour :
- Afficher une page web.
- Récupérer des données sans modifier l'état du serveur (par exemple, afficher les détails d'un produit).
- Les requêtes où les paramètres peuvent être mis en signet ou partagés via une URL.
Sa signature est :
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Logique pour traiter une requête GET
}
La méthode doPost()
Elle est utilisée pour :
- Soumettre des données de formulaire (création d'un utilisateur, envoi d'un message).
- Modifier l'état sur le serveur (mettre à jour un profil, supprimer un article).
- Envoyer des données sensibles ou volumineuses qui ne doivent pas apparaître dans l'URL.
Sa signature est :
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// Logique pour traiter une requête POST
}
Les deux méthodes reçoivent les mêmes objets request et response que nous avons vus dans le cycle de vie, mais spécialisés pour HTTP (HttpServletRequest et HttpServletResponse).
3. Créer votre première Servlet : Étape par Étape
Créons une servlet simple qui dit "Bonjour" à un utilisateur.
Étape 1 : Écrire la classe Java
La classe doit hériter de HttpServlet et redéfinir au moins une méthode do...().
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/bonjour")
public class BonjourServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. Lire un paramètre de la requête (optionnel)
String nom = request.getParameter("nom");
if (nom == null || nom.trim().isEmpty()) {
nom = "Monde";
}
// 2. Définir le type de contenu de la réponse
response.setContentType("text/html");
response.setCharacterEncoding("UTF-8");
// 3. Obtenir le flux de sortie pour écrire la réponse
PrintWriter out = response.getWriter();
// 4. Écrire le code HTML de la réponse
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Bonjour</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Bonjour, " + nom + "!</h1>");
out.println("</body>");
out.println("</html>");
}
}
Points clés du code :
@WebServlet("/bonjour"): C'est une annotation qui indique au conteneur (Tomcat) que cette servlet doit être appelée lorsque le client accède à l'URL/bonjourde votre application. C'est la manière moderne et recommandée de "mapper" une URL à une servlet.request.getParameter("nom"): Cette méthode récupère la valeur d'un paramètre passé dans la requête. Pour une requête GET, il sera dans l'URL (ex:/bonjour?nom=Pierre).response.setContentType("text/html"): Indique au navigateur qu'il va recevoir du code HTML. C'est essentiel pour qu'il interprète correctement la réponse.response.getWriter(): Récupère un objetPrintWriterqui permet d'écrire du texte (notre HTML) dans le corps de la réponse HTTP.
Les Servlets — Documentation Java / Java EE 1.0 - David Gayerie
Ce guide concis de David Gayerie est une excellente référence qui résume parfaitement la structure d'une servlet, ses méthodes et sa configuration.
Lisez les sections "Structure d'une servlet HTTP", l'exemple de code qui suit, et "Configuration du déploiement d’une servlet". Faites bien attention à l'explication de l'annotation @WebServlet. Vous remarquerez que le code est très similaire à notre exemple ci-dessus.
Étape 2 : Gérer la soumission d'un formulaire avec doPost
Maintenant, voyons comment traiter une requête POST provenant d'un formulaire HTML.
Imaginons un fichier index.html à la racine de notre projet web :
<!DOCTYPE html>
<html>
<head>
<title>Formulaire de salutation</title>
<meta charset="UTF-8">
</head>
<body>
<h2>Qui devons-nous saluer ?</h2>
<form method="post" action="bonjour">
<label for="nom">Nom :</label>
<input type="text" id="nom" name="nom">
<button type="submit">Envoyer</button>
</form>
</body>
</html>
Notez bien : method="post" et action="bonjour" (qui correspond à notre @WebServlet).
Pour que notre BonjourServlet puisse traiter ce formulaire, nous devons implémenter la méthode doPost().
// Dans la classe BonjourServlet...
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// La logique est la même que pour GET : on lit le paramètre et on génère une réponse.
// Pour éviter de dupliquer le code, on peut simplement appeler la méthode doGet().
doGet(request, response);
}
Cette pratique, où doPost appelle doGet lorsque le traitement est identique, est très courante pour des cas simples.
Lorsque l'utilisateur remplit le formulaire et clique sur "Envoyer", le navigateur envoie une requête POST à l'URL /bonjour. Tomcat la transmet à la méthode doPost() de notre servlet. Cette dernière appelle doGet(), qui lit le paramètre nom (maintenant issu du corps de la requête POST) et génère la même page de salutation.
La vidéo suivante montre un exemple concret de la gestion des requêtes GET et POST dans un projet, en utilisant l'approche MVC où la servlet agit en tant que contrôleur.
Mohamed Youssfi Application Java Entreprise Edition JEE Servlet JSP JSTL MVC Sessions
Le professeur Youssfi développe ici une petite application de jeu. Observez comment les différentes requêtes sont gérées. Bien que l'exemple utilise web.xml et Eclipse, les principes de doGet et doPost sont universels.
La requête GET initiale : Regardez comment doGet est utilisé pour afficher la première vue. Il ne génère pas de HTML directement, mais utilise un RequestDispatcher pour faire un "forward" vers une page JSP. C'est une technique plus avancée que nous verrons bientôt, mais le principe est de gérer l'affichage. Forward vers la vue. La requête POST du formulaire : Observez comment doPost est déclenchée par la soumission du formulaire, lit les données avec request.getParameter(), et appelle la couche métier pour traiter l'information. Traitement de doPost.
Conclusion
Félicitations ! Vous avez franchi une étape décisive en créant votre première servlet capable d'interagir avec l'utilisateur via le protocole HTTP.
Points clés à retenir :
- On crée une servlet HTTP en héritant de la classe
javax.servlet.http.HttpServlet. - L'annotation
@WebServlet("/url")est la méthode standard pour mapper votre servlet à une URL. - On redéfinit
doGet()pour répondre aux requêtes GET (accès direct à une URL, liens hypertextes). - On redéfinit
doPost()pour répondre aux requêtes POST (typiquement, la soumission de formulaires). - L'objet
HttpServletRequestpermet de lire les données envoyées par le client, notamment avecrequest.getParameter("nomDuParametre"). - L'objet
HttpServletResponsepermet de construire la réponse, en définissant son type (setContentType) et en y écrivant du contenu (getWriter()).
Vous avez peut-être remarqué qu'écrire du HTML directement dans le code Java avec out.println() est fastidieux et difficile à maintenir. C'est l'un des problèmes que nous aborderons dans les leçons à venir.
Dans notre prochaine leçon, nous allons nous attaquer à un autre concept fondamental : la gestion de l'état. Notre servlet actuelle est "sans état" : elle oublie tout de l'utilisateur après chaque requête. Nous introduirons HttpSession pour permettre à notre application de se souvenir d'un utilisateur d'une requête à l'autre, ce qui est indispensable pour créer des fonctionnalités comme les paniers d'achat ou les sessions de connexion.