Exploration de la bibliothèque de balises de formulaire de SpringMVC

Exploration de la bibliothèque de balises de formulaire de SpringMVC

1. Vue d'ensemble

Dans lesfirst article de cette série, nous avons présenté l'utilisation de la bibliothèque de balises de formulaire et comment lier des données à un contrôleur.

Dans cet article, nous aborderons les différentes balises que Spring MVC fournit pour nous aider àcreate and validate forms.

2. La baliseinput

Nous allons commencer avec la baliseinput. Cette balise rend une balise HTMLinput en utilisant la valeur liée ettype='text' par défaut:

À partir de Spring 3.1, vous pouvez utiliser d'autres types spécifiques à HTML5, tels que courrier électronique, date et autres. [.hps]#For example,if we wanted tocreate an emailfield,we can utilise type='email': #

[.hps]#Similarly,to createa date field, [#result_box]#we can use type='date', which will render a date picker in many browsers compatible with HTML5: ##

3. La balisepassword

Cette balise rend une balise HTMLinput avectype='password' en utilisant la valeur liée. Cette entrée HTML masque la valeur saisie dans le champ:

4. La balisetextarea

Cette balise rend un HTMLtextarea:

Nous pouvons spécifier le nombre derows etcolumns de la même manière que nous le ferions pour un HTMLtextarea.

5. Les balisescheckbox etcheckboxes

La balisecheckbox rend une balise HTMLinput avectype='checkbox'. La bibliothèque de balises de formulaire de Spring MVC fournit différentes approches de la balisecheckbox qui devraient répondre à tous nos besoinscheckbox:

L'exemple ci-dessus génère un simplecheckbox classique, avec une valeurboolean. Si nous définissons la valeur liée àtrue, cette case sera cochée par défaut.

L'exemple suivant génère plusieurs cases à cocher. Dans ce cas, les valeurscheckbox sont codées en dur dans la page JSP:

Bird watching: 
Astronomy: 
Snowboarding: 

Ici, la valeur liée est de typearray oujava.util.Collection:

String[] hobbies;

Le but de la balisecheckboxes est utilisé pour rendre plusieurs cases à cocher, où les valeurs de case à cocher sont générées lors de l'exécution:

Pour générer les valeurs on passe dans unArray, unList ou unMap contenant les options disponibles dans la propriétéitems. Nous pouvons initialiser nos valeurs dans le contrôleur:

List favouriteLanguageItem = new ArrayList();
favouriteLanguageItem.add("Java");
favouriteLanguageItem.add("C++");
favouriteLanguageItem.add("Perl");

Généralement, la propriété liée est une collection et peut donc contenir plusieurs valeurs sélectionnées par l'utilisateur:

List favouriteLanguage;

6. Les balisesradiobutton etradiobuttons

Cette balise rend une balise HTMLinput avectype='radio':

Male: 
Female: 

Un modèle d'utilisation typique impliquera plusieurs instances de balises avec différentes valeurs liées à la même propriété:

private String sex;

Tout comme la balisecheckboxes, la baliseradiobuttons rend plusieurs balises HTMLinput avectype='radio':

Dans ce cas, nous pourrions vouloir passer les options disponibles sous la forme d'unArray, d'unList ou d'unMap contenant les options disponibles dans la propriétéitems:

List jobItem = new ArrayList();
jobItem.add("Full time");
jobItem.add("Part time");

7. La baliseselect

Cette balise rend un élément HTMLselect:

Pour générer les valeurs on passe dans unArray, unList ou unMap contenant les options disponibles dans la propriétéitems. [.hps]#Once again #, nous pouvons initialiser nos valeurs à l'intérieur du contrôleur:

Map countryItems = new LinkedHashMap();
countryItems.put("US", "United States");
countryItems.put("IT", "Italy");
countryItems.put("UK", "United Kingdom");
countryItems.put("FR", "France");

La balise select prend également en charge l'utilisation des balises imbriquéesoption etoptions.

Alors que la baliseoption restitue un seul HTMLoption, la baliseoptions rend une liste de balises HTMLoption.

Le tagoptions prend unArray, unList ou unMap contenant les options disponibles dans la propriétéitems, tout comme le tagselect :


    
    

[.hps]#Whenwe have theneedto selectseveral items at once, on peutcreate amultiple listbox. # Pour rendre ce type de list, ajoutez simplement l'attributmultiple=”true” dans la baliseselect.

Ici, la propriété liée est unarray ou unjava.util.Collection:

List fruit;

8. La balisehidden

Cette balise rend une balise HTMLinput avectype='hidden' en utilisant la valeur liée:

9. La baliseErrors

Les messages d'erreur sur le terrain sont générés par les validateurs associés au contrôleur. Nous pouvons utiliser la balise Errors pour afficher ces messages d'erreur de champ:

Cela affichera les erreurs pour le champ spécifié dans la propriétépath. Les messages d'erreur sont rendus dans une balisespan par défaut, avec.errors ajouté à la valeurpath commeid, et éventuellement une classe CSS ducssClass, qui peut être utilisée pour styliser la sortie:

Name is required!

Pour encadrer les messages d'erreur avec un élément différent au lieu de la balise par défautspan, nous pouvons spécifier l'élément préféré dans l'attributelement:

Cela rend les messages d'erreur dans un élémentdiv:

Name is required!

In addition to having [.hps]the capacité à afficher les erreurs[.hps] pour a specific input element, nous pouvons afficher la liste complète des erreurs (quel que soit le champ) pour une page donnée. Ceci est réalisé par l'utilisation du caractère générique*:

9.1. Le validateur

Pour afficher les erreurs pour un champ donné, nous devons définir un validateur:

public class PersonValidator implements Validator {

    @Override
    public boolean supports(Class clazz) {
        return Person.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object obj, Errors errors) {
        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "required.name");
    }
}

Dans ce cas, si le champname est vide, le validateur renvoie le message d'erreur identifié parrequired.name du bundle de ressources.

Le bundle de ressources est défini dans le fichier de configuration de SpringXMLcomme suit:


     

Ou dans un style de configuration Java pur:

@Bean
public MessageSource messageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasenames("messages");
    return messageSource;
}

Le message d'erreur est défini dans le fichiermessages.properties:

required.name = Name is required!

Pour appliquer cette validation, nous devons inclure une référence au validateur dans notre contrôleur et appeler la méthodevalidate dans la méthode du contrôleur qui est appelée lorsque l'utilisateur soumet le formulaire:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    validator.validate(person, result);

    if (result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

9.2. Validation du bean JSR 303

À partir du printemps 3, nous pouvons utiliserJSR 303 (via l'annotation@Valid) pour la validation du bean. Pour ce faire, nous avons besoin d'unJSR303 validator framework sur le chemin de classe. Nous utiliserons lesHibernate Validator (l'implémentation de référence). Voici la dépendance que nous devons inclure dans le POM:


    org.hibernate
    hibernate-validator
    5.1.1.Final

Pour que Spring MVC prenne en charge la validation JSR 303 via l'annotation@Valid, nous devons activer ce qui suit dans notre fichier de configuration Spring:

Ou utilisez l'annotation correspondante@EnableWebMvc dans une configuration Java:

@EnableWebMvc
@Configuration
public class ClientWebConfigJava implements WebMvcConfigurer {
    // All web configuration will go here
}

Ensuite, nous devons annoter la méthode du contrôleur[.hps]#thatwe want tovalidate # avec l'annotation@Valid:

@RequestMapping(value = "/addPerson", method = RequestMethod.POST)
public String submit(
  @Valid @ModelAttribute("person") Person person,
  BindingResult result,
  ModelMap modelMap) {

    if(result.hasErrors()) {
        return "personForm";
    }

    modelMap.addAttribute("person", person);
    return "personView";
}

Nous pouvons maintenant annoter la propriété de l'entité pour la valider avec l'annotation du validateur Hibernate:

@NotEmpty
private String password;

Par défaut, cette annotation affichera“may not be empty” si nous laissons le champ de saisie du mot de passe vide.

Nous pouvons remplacer le message d'erreur par défaut en créant une propriété dans le groupe de ressources défini dans l'exemple du validateur. La clé du message suit la règleAnnotationName.entity.fieldname:

NotEmpty.person.password = Password is required!

10. Conclusion

Dans ce didacticiel, nous avons exploré les différentes balises fournies par Spring pour l'utilisation des formulaires.

Nous avons également examiné l'étiquette pour l'affichage des erreurs de validation et la configuration nécessaire pour afficher des messages d'erreur personnalisés.

Tous les exemples ci-dessus peuvent être trouvés dans unGitHub project. Ceci est un projet basé sur Eclipse, il devrait donc être facile à importer et à exécuter tel quel.

Lorsque le projet s'exécute localement, vous pouvez accéder à l'exemple de formulaire à l'adresse suivante: