framework-web:spring:controllers

Spring MVC controller

Avec Spring MVC, un contrôleur comporte l'annotation @Controller. Il reçoit les requêtes Http en réponses aux RequestMappings définis grâce aux annotations et fournit une réponse Http


@Controller
public class HelloController {

	@GetMapping("/hello")
	public @ResponseBody String index() {
		return "Hello world!";
	}
}

Les annotations @RequestMapping et dérivées permettent de définir le routage :

@Controller
@RequestMapping("/persons")
class PersonController {

    @GetMapping("/{id}")
    public Person getPerson(@PathVariable Long id) {
        // ...
    }

    @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void add(@RequestBody Person person) {
        // ...
    }
}

Url définies :

  • GET: /persons/1 ⇒ Affiche la personne d'id 1
  • POST: /persons ⇒ Ajoute la personne passée en paramètre

Injection de dépendance :

Certains objets, en fonction de leur type, ou grâce aux annotations, peuvent-être directement passés à une méthode de contrôleur.

Exemple : récupération de la requête HttpServletRequest

    @GetMapping("/{id}")
    public Person getPerson(@PathVariable Long id, HttpServletRequest request) {
        // ...
    }

Sans passage par une vue, la chaîne retournée constitue le response body.

	@RequestMapping
	public @ResponseBody String index() {
		return "Hello World!";
	}

Par défaut, le String retourné correspond à un nom de vue (dans ce cas main/index.html à partir du dossier des templates défini dans application.properties):

	@RequestMapping
	public String index() {
		return "main/index";
	}

Passage de variables à la vue

Il est possible d'injecter une instance de la classe ModelMap ou Model :

	@getMapping
	public String messageAction(ModelMap model) {
		model.put("message","Ceci est un message");
		return "main/index";
	}

Il est également possible de charger une vue et de lui passer des variables depuis une instance de ModelAndView :

	@RequestMapping
	public ModelAndView index() {
		ModelAndView mv=new ModelAndView("main/index");
		mv.addObject("Title","Titre de la page");
		return mv;
	}

voir Return values

Une action d'un contrôleur peut éventuellement rediriger vers une autre action, après avoir effectué ses propres traitements, avec éventuel passage de paramètres de type flash :

	@RequestMapping
	public RedirectView submitAction(@RequestParam String value, RedirectAttributes attrs) {
		//Traitements
		attrs.addFlashAttribute("message","Formulaire envoyé...");
		return new RedirectView("/");
	}

La vue associée à la route / pourra accéder à la variable message et l'afficher.

Ressources

  • framework-web/spring/controllers.txt
  • Dernière modification : il y a 14 mois
  • de jcheron