• 20 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

Ce cours est en vidéo.

Vous pouvez obtenir un certificat de réussite à l'issue de ce cours.

J'ai tout compris !

Mis à jour le 12/10/2018

Utilisez votre formulaire

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Notre formulaire est mis en place. Si vous essayez de l'utiliser, vous arrivez sur une page blanche en validant. Mais attention votre URL a changé :

http://localhost:8080/bill?fullname=Juste+Leblanc
&address=19+rue+Germain+Pilon&deliveryMode=express
&deliveryInfo=Paris&products=1%3A2%0D%0A2%3A1

Des paramètres se sont ajoutés. Il nous reste à coder le comportement de displayBill. J'ai préféré consacrer un chapitre entier à ce sujet pour bien vous expliquer chaque ligne.

Le découpage des paramètres

Si votre utilisateur va sur l'adresse  http://localhost:8080/bill?param1=v1&voiture=bleu , la valeur de  req.getQueryString()  sera  param1=v1&voiture=bleu . Nous allons découper cette chaîne de caractères pour ajouter les paramètres dans une  Map. Nous allons créer une méthode dédiée pour pouvoir tester celle-ci facilement :

public Map<String, String> splitParameters(String queryString)

Voici les tests :

package com.cursan.homeshop.web;

import org.junit.Test;

import java.util.Map;

import static org.junit.Assert.*;

public class BillServletTest {

    @Test
    public void Given_twoParams_When_splitParans_Then_fillMapCorrectly() {
        BillServlet billServlet = new BillServlet();
        Map<String, String> params = billServlet.splitParameters("p1=v1&p2=v2");
        assertEquals(2, params.size());
        assertEquals("v1", params.get("p1"));
        assertEquals("v2", params.get("p2"));
    }
    @Test
    public void Given_OneEmptyParamsAndOneGoodParams_When_splitParans_Then_fillMapCorrectly() {
        BillServlet billServlet = new BillServlet();
        Map<String, String> params = billServlet.splitParameters("p1=&p2=v2");
        assertEquals(1, params.size());
        assertEquals("v2", params.get("p2"));
    }
    @Test
    public void Given_NoParams_When_splitParans_Then_fillMapCorrectly() {
        BillServlet billServlet = new BillServlet();
        Map<String, String> params = billServlet.splitParameters("test");
        assertEquals(0, params.size());
    }
}

Voici la méthode :

public Map<String, String> splitParameters(String queryString) {
    String[] brutParams = queryString.split("&");
    Map<String, String> params = new HashMap<>();
    for (String brutParam : brutParams) {
        String[] keyAndValue = brutParam.split("=");
        if (keyAndValue.length == 2)
            params.put(keyAndValue[0], keyAndValue[1]);
    }
    return params;
}
  • On découpe  queryString  à chaque  &  ;

  • Pour chaque bloc, on split sur  =  ;

  • S'il y a 2 champs (clé et valeur), on les ajoute à la  Map.

Le client et la livraison

On va maintenant  se charger de  displayBill . On commence par utiliser la méthode que l'on vient de créer :

Map<String, String> params = splitParameters(req.getQueryString());

On crée une variable de type  Customer  que l'on remplit avec les bons champs.

Customer customer = new Customer(params.get("fullname"), params.get("address"));

On procède de même pour une variable de type  Delivery .

Delivery delivery = null;
switch (params.get("deliveryMode")) {
    case "direct" :
        delivery = new DirectDelivery();
        break;
    case "express" :
        delivery = new ExpressDelivery(params.get("deliveryInfo"));
        break;
    case "relay" :
        delivery = new RelayDelivery(Integer.parseInt(params.get("deliveryInfo")));
        break;
    case "takeAway" :
        delivery = new TakeAwayDelivery();
        break;
}

La facture

On peut maintenant créer notre facture.

Bill bill = new Bill(customer, delivery);

On va récupérer chaque produit et sa quantité associée. Petit détail, en HTTP, quand les paramètres sont transmis, les caractères spéciaux sont transformés. Ainsi :

  • le retour à la ligne devient  %0D%0A  ;

  • : devient  %3A .

String[] productsParams = params.get("products").split("%0D%0A");
for (String productLine : productsParams) {
    String[] productAndQuantity = productLine.split("%3A");
    Product product = products.get(Integer.parseInt(productAndQuantity[0]));
    Integer quantity = Integer.parseInt(productAndQuantity[1]);
    bill.addProduct(product, quantity);
}

 Il reste à générer notre facture. Nous avons de nouveau créé un  Writer  dédié :

bill.generate(new Writer() {
    @Override
    public void start() {
    }
    @Override
    public void writeLine(String line) {
        try {
            resp.getWriter().println("<br/>" + line);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
        public void stop() {
    }
});

Ce qui nous donne :

private void displayBill(HttpServletRequest req, HttpServletResponse resp) {
    Map<String, String> params = splitParameters(req.getQueryString());
    Customer customer = new Customer(params.get("fullname"), params.get("address"));
    Delivery delivery = null;
    switch (params.get("deliveryMode")) {
        case "direct" :
            delivery = new DirectDelivery();
            break;
        case "express" :
            delivery = new ExpressDelivery(params.get("deliveryInfo"));
            break;
        case "relay" :
            delivery = new RelayDelivery(Integer.parseInt(params.get("deliveryInfo")));
            break;
        case "takeAway" :
            delivery = new TakeAwayDelivery();
            break;
    }
    Bill bill = new Bill(customer, delivery);
    String[] productsParams = params.get("products").split("%0D%0A");
    for (String productLine : productsParams) {
        String[] productAndQuantity = productLine.split("%3A");
        Product product = products.get(Integer.parseInt(productAndQuantity[0]));
        Integer quantity = Integer.parseInt(productAndQuantity[1]);
        bill.addProduct(product, quantity);
    }
    bill.generate(new Writer() {
        @Override
        public void start() {
        }
        @Override
        public void writeLine(String line) {
            try {
                resp.getWriter().println("<br/>" + line);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        @Override
        public void stop() {
        }
    });
}

Je vous laisse vous amuser avec votre formulaire et observer le résultat :) !

On vient de terminer cette partie. Vous comprenez maintenant mieux la mécanique d'un site web et comment mettre en place votre propre site web en Java.

Pour la dernière partie de ce cours, il est important d'avoir déjà des connaissances en base de données. Si vous êtes débutant avec ce sujet ou que vous souhaitez vous rafraîchir la mémoire, un cours est disponible sur OpenClassrooms.

Exemple de certificat de réussite
Exemple de certificat de réussite