Onderzoek naar de formulier-tagbibliotheek van SpringMVC

1. Overzicht

In het eerste artikel van deze serie hebben we het gebruik van de formulier-tagbibliotheek geïntroduceerd en hoe je gegevens aan een controller kunt binden.

In dit artikel bespreken we de verschillende tags die Spring MVC biedt om ons te helpen formulieren maken en valideren.

2. Het invoer Label

We gaan aan de slag met de invoer label. Deze tag geeft een HTML weer invoer tag met de afhankelijke waarde en type = 'tekst' standaard:

Vanaf Spring 3.1 kunt u andere HTML5-specifieke typen gebruiken, zoals e-mail, datum en andere. Als we bijvoorbeeld een e-mailveld willen maken, kunnen we type = 'e-mail':

Evenzo kunnen we gebruiken om een ​​datumveld te maken type = 'datum', die een datumkiezer zal weergeven in veel browsers die compatibel zijn met HTML5:

3. Het wachtwoord Label

Deze tag geeft een HTML weer invoer tag met type = 'wachtwoord' met behulp van de gebonden waarde. Deze HTML-invoer maskeert de waarde die in het veld is getypt:

4. Het textarea Label

Deze tag geeft een HTML weer textarea:

We kunnen het aantal specificeren rijen en kolommen op dezelfde manier als een HTML textarea.

5. Het selectievakje en selectievakjes Label

De selectievakje tag geeft een HTML weer invoer tag met type = 'checkbox'. De formulier-tagbibliotheek van Spring MVC biedt verschillende benaderingen voor het selectievakje tag die aan al onze selectievakje behoeften:

Het bovenstaande voorbeeld genereert een klassieke single selectievakje, met een boolean waarde. Als we de gebonden waarde instellen op waar, is dit selectievakje standaard aangevinkt.

In het volgende voorbeeld worden meerdere selectievakjes gegenereerd. In dit geval is het selectievakje waarden zijn hard-coded binnen de JSP-pagina:

Vogels kijken: Astronomie: Snowboarden: 

Hier is de gebonden waarde van het type array of java.util.Collection:

String [] hobby's;

Het doel van de selectievakjes tag wordt gebruikt om meerdere selectievakjes weer te geven, waarbij de selectievakjes tijdens runtime worden gegenereerd:

Om de waarden te genereren die we doorgeven in een Array, een Lijst of een Kaart met de beschikbare opties in het items eigendom. We kunnen onze waarden binnen de controller initialiseren:

Lijst favouriteLanguageItem = nieuwe ArrayList (); favouriteLanguageItem.add ("Java"); favouriteLanguageItem.add ("C ++"); favouriteLanguageItem.add ("Perl");

Meestal is de gebonden eigenschap een verzameling, zodat deze meerdere waarden kan bevatten die door de gebruiker zijn geselecteerd:

List favouriteLanguage;

6. Het Radio knop en Radio knoppen Label

Deze tag geeft een HTML weer invoer tag met type = 'radio':

Man vrouw: 

Een typisch gebruikspatroon omvat meerdere taginstances met verschillende waarden die aan dezelfde eigenschap zijn gebonden:

privé String-seks;

Net als de selectievakjes tag, de Radio knoppen tag geeft meerdere HTML weer invoer tags met type = 'radio':

In dit geval willen we de beschikbare opties misschien doorgeven als een Array, een Lijst of een Kaart met de beschikbare opties in het items eigendom:

Lijst jobItem = nieuwe ArrayList (); jobItem.add ("Fulltime"); jobItem.add ("Parttime");

7. Het selecteer Label

Deze tag geeft een HTML weer selecteer element:

Om de waarden te genereren die we doorgeven in een Array, een Lijst of een Kaart met de beschikbare opties in het items eigendom. Nogmaals, we kunnen onze waarden binnen de controller initialiseren:

Kaart countryItems = nieuwe LinkedHashMap (); countryItems.put ("US", "Verenigde Staten"); countryItems.put ("IT", "Italië"); countryItems.put ("UK", "Verenigd Koninkrijk"); countryItems.put ("FR", "Frankrijk");

De select-tag ondersteunt ook het gebruik van geneste keuze en opties tags.

Terwijl de keuze tag geeft een enkele HTML weer keuze, de opties tag geeft een lijst met HTML weer keuze tags.

De opties tag heeft een Array, een Lijst of een Kaart met de beschikbare opties in het items eigenschap, net als de selecteer label:

Als we meerdere items tegelijk moeten selecteren, kunnen we een meervoudige keuzelijst maken. Om dit type lijst weer te geven, voegt u gewoon de multiple = "true" attribuut in het selecteer label.

Hier is het gebonden eigendom een array of een java.util.Collection:

Lijst fruit;

8. Het verborgen Label

Deze tag geeft een HTML weer invoer tag met type = 'verborgen' met behulp van de gebonden waarde:

9. Het Fouten Label

Veldfoutmeldingen worden gegenereerd door validators die aan de controller zijn gekoppeld. We kunnen de foutcode gebruiken om die veldfoutmeldingen weer te geven:

Hierdoor worden fouten weergegeven voor het veld dat is opgegeven in het pad eigendom. De foutmeldingen worden weergegeven in een span tag standaard, met .fouten toegevoegd aan de pad waarde als de ID kaart, en optioneel een CSS-klasse uit de cssClass eigenschap, die kan worden gebruikt om de uitvoer op te maken:

Naam is vereist!

De foutmeldingen omsluiten met een ander element in plaats van de standaard span tag, kunnen we het voorkeurselement specificeren binnen de element attribuut:

Dit geeft de foutmeldingen weer binnen een div element:

 Naam is vereist! 

Behalve dat we de mogelijkheid hebben om fouten voor een specifiek invoerelement weer te geven, kunnen we de volledige lijst met fouten (ongeacht het veld) voor een bepaalde pagina weergeven. Dit wordt bereikt door het gebruik van het jokerteken *:

9.1. De validator

Om fouten voor een bepaald veld weer te geven, moeten we een validator definiëren:

public class PersonValidator implementeert Validator {@Override public boolean supports (Class clazz) {return Person.class.isAssignableFrom (clazz); } @Override public void validate (Object obj, fouten fouten) {ValidationUtils.rejectIfEmptyOrWhitespace (fouten, "naam", "vereist.name"); }}

In dit geval, als het veld naam leeg is, retourneert de validator het foutbericht geïdentificeerd door required.name uit de resourcebundel.

De resourcebundel is gedefinieerd in het voorjaar XML configuratiebestand als volgt:

Of in een pure Java-configuratiestijl:

@Bean openbare MessageSource messageSource () {ResourceBundleMessageSource messageSource = nieuwe ResourceBundleMessageSource (); messageSource.setBasenames ("berichten"); terug messageSource; }

Het foutbericht wordt gedefinieerd in het messages.properties het dossier:

required.name = Naam is vereist!

Om deze validatie toe te passen, moeten we een verwijzing naar de validator in onze controller opnemen en de methode aanroepen valideren in de controllermethode die wordt aangeroepen wanneer de gebruiker het formulier indient:

@RequestMapping (value = "/ addPerson", method = RequestMethod.POST) public String indienen (@ModelAttribute ("person") Persoon persoon, BindingResult resultaat, ModelMap modelMap) {validator.validate (persoon, resultaat); if (result.hasErrors ()) {retourneer "personForm"; } modelMap.addAttribute ("persoon", persoon); retourneer "personView"; }

9.2. JSR 303 Bean-validatie

Vanaf voorjaar 3 kunnen we gebruiken JSR 303 (via de @Geldig annotatie) voor bean-validatie. Hiervoor hebben we een JSR303 validator framework op het klassenpad. We zullen de Slaapstandvalidator (de referentie-implementatie). Hieronder volgt de afhankelijkheid die we in de POM moeten opnemen:

 org.hibernate hibernate-validator 5.1.1.Final 

Om Spring MVC JSR 303-validatie te laten ondersteunen via het @Geldig annotatie, moeten we het volgende inschakelen in ons Spring-configuratiebestand:

Of gebruik de bijbehorende annotatie @EnableWebMvc in een Java-configuratie:

@EnableWebMvc @Configuration openbare klasse ClientWebConfigJava implementeert WebMvcConfigurer {// Alle webconfiguratie komt hier}

Vervolgens moeten we de controllermethode die we willen valideren annoteren met de @Geldig annotatie:

@RequestMapping (value = "/ addPerson", method = RequestMethod.POST) public String submit (@Valid @ModelAttribute ("person") Person person, BindingResult resultaat, ModelMap modelMap) {if (result.hasErrors ()) {return " personForm "; } modelMap.addAttribute ("persoon", persoon); retourneer "personView"; }

Nu kunnen we de eigenschap van de entiteit annoteren om deze te valideren met Hibernate validator-annotatie:

@NotEmpty privé String-wachtwoord;

Standaard wordt deze annotatie weergegeven "Mag niet leeg zijn" als we het invoerveld voor het wachtwoord leeg laten.

We kunnen het standaardfoutbericht negeren door een eigenschap te maken in de resourcebundel die is gedefinieerd in het validatievoorbeeld. De sleutel van het bericht volgt de regel AnnotationName.entity.fieldname:

NotEmpty.person.password = Wachtwoord is vereist!

10. Conclusie

In deze tutorial hebben we de verschillende tags onderzocht die Spring biedt voor het werken met formulieren.

We hebben ook gekeken naar de tag voor het weergeven van validatiefouten en de configuratie die nodig is om aangepaste foutmeldingen weer te geven.

Alle bovenstaande voorbeelden zijn te vinden in een GitHub-project. Dit is een op Eclipse gebaseerd project, dus het zou gemakkelijk moeten kunnen worden geïmporteerd en uitgevoerd zoals het is.

Als het project lokaal wordt uitgevoerd, is het formuliervoorbeeld beschikbaar op:

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