Erkunden der Formular-Tag-Bibliothek von SpringMVC

1. Übersicht

Im ersten Artikel dieser Reihe haben wir die Verwendung der Formular-Tag-Bibliothek und das Binden von Daten an einen Controller vorgestellt.

In diesem Artikel werden die verschiedenen Tags behandelt, die Spring MVC zur Erstellung und Validierung von Formularen bereitstellt .

2. Das Eingabe- Tag

Wir werden mit dem Eingabe- Tag beginnen. Dieses Tag rendert standardmäßig ein HTML- Eingabe- Tag mit dem gebundenen Wert und type = 'text' :

Ab Spring 3.1 können Sie andere HTML5-spezifische Typen wie E-Mail, Datum und andere verwenden. Wenn wir beispielsweise ein E-Mail-Feld erstellen möchten, können wir type = 'email' verwenden:

In ähnlicher Weise können wir zum Erstellen eines Datumsfelds type = 'date' verwenden , wodurch in vielen mit HTML5 kompatiblen Browsern eine Datumsauswahl gerendert wird:

3. Das Passwort- Tag

Dieses Tag rendert ein HTML- Eingabe- Tag mit dem Typ = 'Passwort' unter Verwendung des gebundenen Werts. Diese HTML-Eingabe maskiert den in das Feld eingegebenen Wert:

4. Das Textarea- Tag

Dieses Tag rendert einen HTML- Textbereich :

Wir können die Anzahl der Zeilen und Spalten wie in einem HTML- Textbereich angeben .

5. Das Kontrollkästchen und die Kontrollkästchen Tag

Das Checkbox- Tag rendert ein HTML- Eingabe- Tag mit dem Typ = 'checkbox' . Die Formular-Tag-Bibliothek von Spring MVC bietet verschiedene Ansätze für das Checkbox- Tag, die alle Anforderungen unserer Checkbox erfüllen sollten:

Im obigen Beispiel wird ein klassisches einzelnes Kontrollkästchen mit einem booleschen Wert generiert . Wenn wir den gebundenen Wert auf true setzen , wird dieses Kontrollkästchen standardmäßig aktiviert.

Das folgende Beispiel generiert mehrere Kontrollkästchen . In diesem Fall sind die Kontrollkästchenwerte auf der JSP-Seite fest codiert:

Bird watching:  Astronomy:  Snowboarding: 

Hier ist der gebundene Wert vom Typ array oder java.util.Collection :

String[] hobbies;

Der Zweck des Kontrollkästchen- Tags wird zum Rendern mehrerer Kontrollkästchen verwendet, wobei die Kontrollkästchenwerte zur Laufzeit generiert werden:

Um die Werte zu generieren, übergeben wir sie in einem Array , einer Liste oder einer Karte, die die verfügbaren Optionen in der Eigenschaft items enthalten . Wir können unsere Werte innerhalb des Controllers initialisieren:

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

In der Regel ist die gebundene Eigenschaft eine Sammlung, sodass sie mehrere vom Benutzer ausgewählte Werte enthalten kann:

List favouriteLanguage;

6. Das Radiobutton- und Radiobuttons- Tag

Dieses Tag rendert ein HTML- Eingabe- Tag mit dem Typ = 'radio':

Male:  Female: 

Ein typisches Verwendungsmuster umfasst mehrere Tag-Instanzen mit unterschiedlichen Werten, die an dieselbe Eigenschaft gebunden sind:

private String sex;

Genau wie das Kontrollkästchen- Tag rendert das Radiobuttons- Tag mehrere HTML- Eingabe- Tags mit dem Typ = 'radio' :

In diesem Fall möchten wir die verfügbaren Optionen möglicherweise als Array , Liste oder Map übergeben, die die verfügbaren Optionen in der Eigenschaft items enthalten :

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

7. Das ausgewählte Tag

Dieses Tag rendert ein HTML- Auswahlelement :

Um die Werte zu generieren, übergeben wir sie in einem Array , einer Liste oder einer Karte, die die verfügbaren Optionen in der Eigenschaft items enthalten . Wieder können wir unsere Werte innerhalb des Controllers initialisieren:

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

Das Select-Tag unterstützt auch die Verwendung von verschachtelten Options- und Options- Tags.

Während das Options- Tag eine einzelne HTML- Option rendert, rendert das Options- Tag eine Liste von HTML- Options- Tags.

Das Options- Tag verwendet ein Array , eine Liste oder eine Karte, die die verfügbaren Optionen in der items -Eigenschaft enthält, genau wie das select- Tag:

Wenn mehrere Elemente gleichzeitig ausgewählt werden müssen, können wir ein Listenfeld mit mehreren Listen erstellen. Um diese Art von Liste zu rendern, fügen Sie einfach das Attribut multiple = "true" in das Auswahl- Tag ein.

Hier ist die gebundene Eigenschaft ein Array oder eine java.util.Collection :

List fruit;

8. Das versteckte Tag

Dieses Tag rendert ein HTML- Eingabetag mit dem Typ = 'hidden' unter Verwendung des gebundenen Werts:

9. Das Fehler- Tag

Feldfehlermeldungen werden von Validatoren generiert, die der Steuerung zugeordnet sind. Wir können The Errors Tag verwenden, um diese Feldfehlermeldungen zu rendern:

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.

Wir haben uns auch das Tag für die Anzeige von Validierungsfehlern und die Konfiguration angesehen, die zum Anzeigen benutzerdefinierter Fehlermeldungen erforderlich ist.

Alle obigen Beispiele finden Sie in einem GitHub-Projekt. Dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.

Wenn das Projekt lokal ausgeführt wird, kann auf das Formularbeispiel zugegriffen werden unter:

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