Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 51

Servlets: Gestion des requêtes GET et POST

Recommended resources

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 GET est redirigée vers la méthode doGet().
  • Une requête POST est redirigée vers la méthode doPost().
  • 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.

Ce diagramme rappelle que les données d'une requête GET sont visibles dans l'URL (query parameters), tandis que pour une requête POST, elles sont envoyées dans le corps de la requête, ce qui les rend invisibles dans l'URL.

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 /bonjour de 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 objet PrintWriter qui 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 HttpServletRequest permet de lire les données envoyées par le client, notamment avec request.getParameter("nomDuParametre").
  • L'objet HttpServletResponse permet 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.