Esplorazione della libreria di tag del modulo di SpringMVC

1. Panoramica

Nel primo articolo di questa serie abbiamo introdotto l'uso della libreria di tag del form e come associare i dati a un controller.

In questo articolo, tratteremo i vari tag forniti da Spring MVC per aiutarci a creare e convalidare i moduli .

2. Il tag di input

Inizieremo con il tag di input . Questo tag esegue il rendering di un tag di input HTML utilizzando il valore associato e type = 'text' per impostazione predefinita:

A partire da Spring 3.1 puoi utilizzare altri tipi specifici di HTML5, come e-mail, data e altri. Ad esempio, se volessimo creare un campo email, possiamo usare type = 'email':

Allo stesso modo, per creare un campo data, possiamo usare type = 'date' , che renderà un selettore di date in molti browser compatibili con HTML5:

3. Il tag della password

Questo tag restituisce un tag di input HTML con type = 'password' utilizzando il valore associato. Questo input HTML maschera il valore digitato nel campo:

4. Il tag textarea

Questo tag rende un HTML textarea :

Possiamo specificare il numero di righe e colonne nello stesso modo in cui faremmo una textarea HTML .

5. La casella di controllo e le caselle di controllo Tag

Il tag checkbox restituisce un tag di input HTML con type = 'checkbox' . La libreria di tag form di Spring MVC offre diversi approcci al tag della casella di controllo che dovrebbe soddisfare tutte le nostre esigenze di casella di controllo :

L'esempio sopra genera una classica casella di controllo singola , con un valore booleano . Se impostiamo il valore limite su true , questa casella di controllo sarà selezionata per impostazione predefinita.

L'esempio seguente genera più caselle di controllo . In questo caso, i valori della casella di controllo sono hardcoded all'interno della pagina JSP:

Bird watching:  Astronomy:  Snowboarding: 

Qui, il valore associato è di tipo array o java.util.Collection :

String[] hobbies;

Lo scopo del tag checkboxes viene utilizzato per eseguire il rendering di più caselle di controllo, in cui i valori delle caselle di controllo vengono generati in fase di esecuzione:

Per generare i valori passiamo in un Array , un List o una Map contenente le opzioni disponibili nella proprietà items . Possiamo inizializzare i nostri valori all'interno del controller:

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

In genere la proprietà associata è una raccolta, quindi può contenere più valori selezionati dall'utente:

List favouriteLanguage;

6. Il radiobutton e il radiobutton Tag

Questo tag restituisce un tag di input HTML con type = 'radio':

Male:  Female: 

Un modello di utilizzo tipico coinvolgerà più istanze di tag con valori diversi associati alla stessa proprietà:

private String sex;

Proprio come il tag checkboxes , il tag radiobuttons rende più tag di input HTML con type = 'radio' :

In questo caso, potremmo voler passare le opzioni disponibili come Array , List o Map contenente le opzioni disponibili nella proprietà items :

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

7. Il tag di selezione

Questo tag rende un elemento di selezione HTML :

Per generare i valori passiamo in un Array , un List o una Map contenente le opzioni disponibili nella proprietà items . Ancora una volta, possiamo inizializzare i nostri valori all'interno del controller:

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

Il tag select supporta anche l'uso di opzioni nidificate e tag di opzioni .

Mentre il tag di opzione esegue il rendering di una singola opzione HTML , il tag di opzioni restituisce un elenco di tag di opzione HTML .

Il tag options accetta un array , un elenco o una mappa contenente le opzioni disponibili nella proprietà items , proprio come il tag select :

Quando abbiamo la necessità di selezionare più elementi contemporaneamente, possiamo creare una casella di riepilogo multipla. Per visualizzare questo tipo di elenco, aggiungi l' attributo multiple = "true" nel tag select .

Qui la proprietà bound è un array o java.util.Collection :

List fruit;

8. Il tag nascosto

Questo tag restituisce un tag di input HTML con type = 'hidden' utilizzando il valore associato:

9. Il tag degli errori

I messaggi di errore di campo vengono generati dai validatori associati al controller. Possiamo utilizzare il tag degli errori per visualizzare i messaggi di errore del campo:

This will display errors for the field specified in the path property. The error messages are rendered within a span tag by default, with .errors appended to the path value as the id, and optionally a CSS class from the cssClass property, which can be used to style the output:

Name is required!

To enclose the error messages with a different element instead of the default span tag, we can specify the preferred element inside the element attribute:

This renders the error messages within a div element:

 Name is required! 

I n addition to having the capability to show errors for a specific input element , we can display the entire list of errors (regardless of field) for a given page. This is achieved by the use of the wildcard *:

9.1. The Validator

To display errors for a given field we need to define a validator:

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"); } }

In this case, if the field name is empty, the validator returns the error message identified by required.name from the resource bundle.

The resource bundle is defined in the Spring XML configuration file as follows:

Or in a pure Java configuration style:

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

The error message is defined inside the messages.properties file:

required.name = Name is required!

To apply this validation, we need to include a reference to the validator in our controller and call the method validate in the controller method which is called when user submits the form:

@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. JSR 303 Bean Validation

Starting from Spring 3, we can use JSR 303 (via the @Valid annotation) for bean validation. To do this we need a JSR303 validator framework on the classpath. We will use the Hibernate Validator (the reference implementation). Following is the dependency that we need to include in the POM:

 org.hibernate hibernate-validator 5.1.1.Final 

To make Spring MVC support JSR 303 validation via the @Valid annotation, we need to enable the following in our Spring configuration file:

Or use the corresponding annotation @EnableWebMvc in a Java configuration:

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

Next, we need to annotate the controller method that we want to validate with the @Valid annotation:

@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"; }

Now we can annotate the entity's property to validate it with Hibernate validator annotation:

@NotEmpty private String password;

By default, this annotation will display “may not be empty” if we leave the password input field empty.

We can override the default error message by creating a property in the resource bundle defined in the validator example. The key of the message follows the rule AnnotationName.entity.fieldname:

NotEmpty.person.password = Password is required!

10. Conclusion

In this tutorial we explored the various tags that Spring provides for working with forms.

Abbiamo anche esaminato il tag per la visualizzazione degli errori di convalida e la configurazione necessaria per visualizzare i messaggi di errore personalizzati.

Tutti gli esempi sopra possono essere trovati in un progetto GitHub. Questo è un progetto basato su Eclipse, quindi dovrebbe essere facile da importare ed eseguire così com'è.

Quando il progetto viene eseguito in locale, è possibile accedere al modulo di esempio all'indirizzo:

// localhost: 8080 / spring-mvc-xml / person