Skip to content

Controllers

Les controlleurs Web MVC

Dans une application web Java avec Spring, plusieurs configurations se feront à l'aide d'annotations. Dans le cas des controleurs, différentes annotations seront utilisées pour les différentes routes et pour le controleur en tant que tel.

Créer un controleur

Bonnes habitudes

Pour garder une architecture de code propre, créez un nouveau package nommé models dans le package principal de l'application.

Dans une application web Spring, un controleur est une classe qui contiendra les diffétentes méthodes liées aux différentes requêtes HTTP et aux différentes URL disponibles dans l'application. On crée donc une classe qu'on annotera avec @Controller.

@Controller
public class HomeController {
    // Méthodes du controleur
}

Méthodes d'action du controleur

Chaque méthode du controleur qui doit retourner une vue aura basoin d'une annotation pour indiquer l'URL à laquelle accéder. Ces méthodes devron également avoir un type de retour String et on retournera le nom de la page à afficher.

Par exemple:

@GetMapping("/home")
public String home() {
    return "home";
}

La méthode ci-dessus porte l'annotation @GetMapping("/home"). Ceci nous indique que:

  • L'URL pour appeler cette méthode est http://localhost:8080/{contexte}/home
  • @GetMapping nous indique que cette méthode répondra à une requête HTTP GET
  • return "home"; indique qu'on retournera la page JSPhome.jsp`

À l'aide des différentes annotations, il nous sera possible d'avoir plusieurs URL identiques, qui répondront à des méthodes HTTP différentes. Par exemple:

@GetMapping("/ajouter-produit")
public String ajouter() {
    return "form-produit";
}

@PostMapping("/ajouter-produit")
public String ajoutProduit() {
    // Traitement de l'ajout du produit
    return "produits";
}

Dans l'exemple ci-dessus, nous avons deux méthodes correspondant à l'URL se terminant par /ajouter-produit, cependant l'une d'entre elle répond à la requête HTTP GET et l'autre la requête HTTP POST.

URL de base pour un controleur

Il est possible d'assigner un chemin de base à un controleur en utilisant l'annotation @RequestMapping sur la classe. Prenons l'exemple suivant:

@Controller
@RequestMapping("/home")
public class HomeController {

    @GetMapping("/accueil")
    public String home() {
        return "home";
    }

    @GetMapping("/info")
    public String information() {
        return "infos";
    }

}

Dans cet exemple, pour atteindre les différentes méthodes du controleur, il faudra utiliser /home devant le reste de l'URL des méthodes. Ainsi les URL disponibles seraient

http://localhost:8080/{contexte}/home/accueil
http://localhost:8080/{contexte}/home/info

Paramètres des méthodes d'action

Tout comme les servlets, les méthodes d'action peuvent recevoir différents paramètres. Voici ceux qu'on retrouvera fréquemment:

  • HttpServletRequest : La requête
  • HttpServletResponse : Le réponse
  • HttpSession : La session de l'utilisateur qui fait la requête
  • Un paramètre annoté avec @RequestParam : Paramètre provenant de la requête ou queryString.
  • Un paramètre annoté @PathVariable : Paramètre de l'URL
  • Model : L'objet de type Model pourra remplacer l'objet request pour transmettre de l'information aux pages.
  • Paramètre annoté @ModelAttribute : Permet de récupérer des objets complexes provenant d'un formulaire.

Récupérer les paramètres

Prenons comme exemple une application de gestion de produits. Considérons qu'on ait une page pour afficher tous les détails d'un produit et qu'on veuille y accéder avec une URL comprenant l'Id du produit, par exemple:

http://localhost:8080/produits/1

On pourra configurer la méthode d'action du contrôleur de la façon suivante:

@GetMapping("/produits/{idProduit}")
public String afficherProduit(@PathVariable("idProduit") int id) {
    // Récupérer le produit de la source de données
    return "afficher-produit";
}

Notez que le nom du paramètre dans l'annotation @PathVariable correspond au nom du paramètre dans les accolades dans l'URL.

Pour les paramètres venant de la chaîne de requête (queryString) on utilisera plutôt l'annotatin @RequestParam. Prenons par exemple l'URL suivante:

http://localhost:8080/produits?couleur=rouge&taxable=false

On pourra déclarer la méthode d'action de la façon suivante

@GetMapping("/produits")
public String afficherProduit(@RequestParam("couleur") String couleur, @RequestParam("taxable") boolean taxable) {
    // Récupérer les produits correspondant de la source de données
    return "liste-produit";
}