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!";
}
}
Request
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
- voir Request mapping
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) {
// ...
}
- voir Methods arguments
Response
Affichage direct
Sans passage par une vue, la chaîne retournée constitue le response body.
@RequestMapping
public @ResponseBody String index() {
return "Hello World!";
}
Appel d'une vue
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
Redirections
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.