Premiers pas avec les formulaires dans Spring MVC

1. Vue d'ensemble

Dans cet article, nous aborderons les formulaires Spring et la liaison de données à un contrôleur. Nous allons également jeter un œil à l'une des principales annotations de Spring MVC, à savoir @ModelAttribute .

Bien sûr, Spring MVC est un sujet complexe avec beaucoup de choses que vous devez comprendre pour l'utiliser à son plein potentiel, alors approfondissez certainement le cadre ici.

2. Le modèle

Tout d'abord, définissons une entité simple que nous allons afficher et lier au formulaire:

public class Employee { private String name; private long id; private String contactNumber; // standard getters and setters }

Ce sera notre objet de support de formulaire.

3. La vue

Ensuite, définissons le formulaire réel , et bien sûr, le fichier HTML qui le contient. Nous allons utiliser une page où un nouvel employé est créé / enregistré:

Welcome, Enter The Employee Details

Name
Id
Contact Number

Tout d'abord, notez que nous incluons une bibliothèque de balises dans notre page JSP - le formulaire taglib - pour vous aider à définir notre formulaire.

Suivant - le le tag joue ici un rôle important; c'est très similaire au HTLM normalmais l' attribut modelAttribute est la clé qui spécifie un nom de l'objet modèle qui soutient ce formulaire:

Cela correspondra à @ModelAttribute plus tard dans le contrôleur.

Ensuite - chaque champ de saisie utilise encore une autre balise utile du taglib Spring Form - form: prefix . Chacun de ces champs spécifie un attribut de chemin - celui-ci doit correspondre à un getter / setter de l'attribut de modèle (dans ce cas, la classe Employee). Lorsque la page est chargée, les champs d'entrée sont remplis par Spring, qui appelle le getter de chaque champ lié à un champ d'entrée. Lorsque le formulaire est soumis, les setters sont appelés à enregistrer les valeurs du formulaire dans l'objet.

Enfin - lorsque le formulaire est soumis , le gestionnaire POST dans le contrôleur est appelé et le formulaire est automatiquement lié à l' argument employé que nous avons transmis.

4. Le contrôleur

Maintenant, regardons le contrôleur qui va gérer le back-end:

@Controller public class EmployeeController { @RequestMapping(value = "/employee", method = RequestMethod.GET) public ModelAndView showForm() { return new ModelAndView("employeeHome", "employee", new Employee()); } @RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } model.addAttribute("name", employee.getName()); model.addAttribute("contactNumber", employee.getContactNumber()); model.addAttribute("id", employee.getId()); return "employeeView"; } }

Le contrôleur définit deux opérations simples: le GET pour afficher les données dans le formulaire et le POST pour l'opération de création, via la soumission du formulaire.

Notez également que si l'objet appelé «employé» n'est pas ajouté au modèle, Spring se plaindra lorsque nous essaierons d'accéder à la JSP car la JSP sera configurée pour lier le formulaire à l'attribut de modèle «employé»:

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'employee' available as request attribute at o.s.w.s.s.BindStatus.(BindStatus.java:141) 

Pour accéder à notre objet de support de formulaire, nous devons l'injecter via l' annotation @ModelAttribute .

Un @ModelAttribute argument on a method indique que l'argument sera extrait du modèle. S'il n'est pas présent dans le modèle, l'argument sera d'abord instancié, puis ajouté au modèle.

5. Gestion des erreurs de liaison

Par défaut, Spring MVC lève une exception lorsque des erreurs se produisent lors de la liaison de demande. Ce n'est généralement pas ce que nous voulons, mais nous devrions plutôt présenter ces erreurs à l'utilisateur. Nous allons utiliser un BindingResult en en ajoutant un comme argument à notre méthode de contrôleur:

public String submit( @Valid @ModelAttribute("employee") Employee employee, BindingResult result, ModelMap model)

L' argument BindingResult doit être positionné juste après notre objet de support de formulaire - c'est l'un des rares cas où l'ordre des arguments de la méthode est important. Sinon, nous rencontrerons l'exception suivante:

java.lang.IllegalStateException: Errors/BindingResult argument declared without preceding model attribute. Check your handler method signature!

Maintenant - une exception n'est plus levée; à la place, les erreurs seront enregistrées sur le BindingResult qui est passé à la soumettre méthode. À ce stade, nous pouvons gérer ces erreurs de différentes manières - par exemple, l'opération peut être annulée:

@RequestMapping(value = "/addEmployee", method = RequestMethod.POST) public String submit(@Valid @ModelAttribute("employee")Employee employee, BindingResult result, ModelMap model) { if (result.hasErrors()) { return "error"; } //Do Something return "employeeView"; }

Remarquez comment, dans le cas où le résultat contient des erreurs, nous renvoyons une autre vue à l'utilisateur afin d'afficher correctement ces erreurs. Jetons un coup d'œil à cette vue - error.jsp :

Please enter the correct details

Retry

6. Affichage d'un employé

Enfin, en plus de créer un nouvel employé, nous pouvons également simplement en afficher un - voici le code de visualisation rapide pour cela:

Submitted Employee Information

Name : ${name}
ID : ${id}
Contact Number : ${contactNumber}

La page JSP utilise simplement des expressions EL pour afficher les valeurs des propriétés de l'objet Employee dans le modèle.

7. Test de l'application

L'application simple peut être déployée - par exemple sur un serveur Tomcat - et accessible localement:

// localhost: 8080 / spring-mvc-xml / employé

Voici la vue contenant le formulaire principal - avant l'opération de soumission:

Exemple de formulaire Spring MVC - Soumettre

Après l'envoi, les données s'affichent:

Exemple de formulaire Spring MVC - Vue

Et c'est tout - un exemple fonctionnel d'un formulaire simple avec Spring MVC, avec validation .

L'implémentation de ce tutoriel Spring MVC peut être trouvée dans le projet GitHub - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.

Enfin, comme je le disais au début de l'article, vous devriez certainement approfondir Spring MVC.