Aan de slag met formulieren in Spring MVC

1. Overzicht

In dit artikel bespreken we Spring-formulieren en gegevensbinding aan een controller. We zullen ook een van de belangrijkste annotaties in Lente MVC d.w.z. @ModelAttribute.

Spring MVC is natuurlijk een complex onderwerp met veel dingen die je moet begrijpen om het volledig tot zijn recht te laten komen, dus graaf hier zeker dieper in het framework.

2. Het model

Laten we eerst definiëren een eenvoudige entiteit dat we gaan weergeven en binden aan het formulier:

openbare klasse Werknemer {privé Stringnaam; privé lange id; privé String contactNumber; // standaard getters en setters}

Dit zal ons object zijn dat de vorm ondersteunt.

3. Het uitzicht

Volgende - laten we definiëren de feitelijke vorm, en natuurlijk het HTML-bestand dat het bevat. We gaan een pagina gebruiken waarop een nieuwe medewerker wordt aangemaakt / geregistreerd:

Welkom, voer de werknemersgegevens in

Naam
ID kaart
Contact nummer

Merk allereerst op dat we een tagbibliotheek opnemen in onze JSP-pagina - het het formulier taglib - om te helpen bij het definiëren van ons formulier.

Volgende - het tag speelt hierbij een belangrijke rol; het lijkt erg op de reguliere HTLM tag maar de modelAttribute attribuut is de sleutel die een naam specificeert van het modelobject dat dit formulier ondersteunt:

Dit komt overeen met de @ModelAttribute later in de controller.

Volgende - elk invoerveld gebruikt weer een andere handige tag uit de Spring Form-taglib - vorm: voorvoegsel. Elk van deze velden specificeert een pad attribuut - dit moet overeenkomen met een getter / setter van het modelattribuut (in dit geval de klasse Employee). Wanneer de pagina is geladen, worden de invoervelden gevuld door Spring, die de getter van elk veld oproept dat aan een invoerveld is gebonden. Wanneer het formulier is verzonden, worden de setters gebeld om de waarden van het formulier in het object op te slaan.

Eindelijk - wanneer het formulier is verzonden, wordt de POST-handler in de controller aangeroepen en wordt het formulier automatisch aan het werknemer argument dat we passeerden.

4. De verantwoordelijke

Laten we nu eens kijken de controller dat gaat de achterkant afhandelen:

@Controller openbare klasse EmployeeController {@RequestMapping (value = "/ employee", method = RequestMethod.GET) openbare ModelAndView showForm () {retourneer nieuw ModelAndView ("employeeHome", "employee", nieuwe werknemer ()); } @RequestMapping (value = "/ addEmployee", method = RequestMethod.POST) public String indienen (@Valid @ModelAttribute ("employee") Medewerker medewerker, BindingResult-resultaat, ModelMap-model) {if (result.hasErrors ()) {return "fout"; } model.addAttribute ("naam", werknemer.getNaam ()); model.addAttribute ("contactNumber", employee.getContactNumber ()); model.addAttribute ("id", employee.getId ()); retourneer "employeeView"; }}

De controller definieert twee eenvoudige bewerkingen: de GET voor het weergeven van gegevens in het formulier en de POST voor de aanmaakbewerking via het verzenden van formulieren.

Merk ook op dat als het object met de naam "werknemer" niet aan het model wordt toegevoegd, Spring zou klagen wanneer we toegang proberen te krijgen tot de JSP, omdat de JSP wordt ingesteld om het formulier te binden aan het kenmerk "werknemer" -model:

java.lang.IllegalStateException: Noch BindingResult, noch gewoon doelobject voor bean-naam 'werknemer' beschikbaar als verzoekattribuut op o.s.w.s.s.BindStatus. (BindStatus.java:141) 

Om toegang te krijgen tot ons formulier-ondersteuningsobject, moeten we het injecteren via de @ModelAttribute annotatie.

Een @ModelAttribute op een methode-argument geeft aan dat het argument uit het model zal worden opgehaald. Indien niet aanwezig in het model, wordt het argument eerst geïnstantieerd en vervolgens aan het model toegevoegd.

5. Omgaan met bindfouten

Spring MVC genereert standaard een uitzondering wanneer er fouten optreden tijdens het binden van aanvragen. Dit is meestal niet wat we willen, in plaats daarvan moeten we deze fouten aan de gebruiker presenteren. We gaan een BindingResult door er een toe te voegen als argument aan onze controllermethode:

public String submit (@Valid @ModelAttribute ("employee") Medewerker medewerker, BindingResult resultaat, ModelMap model)

De BindingResult argument moet direct na ons formulierondersteuningsobject worden geplaatst - het is een van de zeldzame gevallen waarin de volgorde van de methode-argumenten ertoe doet. Anders komen we de volgende uitzondering tegen:

java.lang.IllegalStateException: Fouten / BindingResult-argument gedeclareerd zonder voorafgaand modelkenmerk. Controleer de handtekening van uw handlermethode!

Nu - een uitzondering wordt niet langer gegooid; in plaats daarvan worden fouten geregistreerd op het BindingResult dat wordt doorgegeven aan de indienen methode. Op dit punt kunnen we deze fouten op verschillende manieren afhandelen - de bewerking kan bijvoorbeeld worden geannuleerd:

@RequestMapping (value = "/ addEmployee", method = RequestMethod.POST) public String submit (@Valid @ModelAttribute ("employee") Medewerker medewerker, BindingResult resultaat, ModelMap model) {if (result.hasErrors ()) {return " fout"; } // Doe iets terug "employeeView"; }

Merk op hoe, in het geval het resultaat fouten bevat, we een andere weergave aan de gebruiker retourneren om deze fouten correct weer te geven. Laten we die mening eens bekijken - error.jsp:

Voer de juiste gegevens in

Probeer het opnieuw

6. Weergeven van een werknemer

Ten slotte kunnen we, naast het aanmaken van een nieuwe werknemer, er ook gewoon een weergeven - hier is de Quick View-code daarvoor:

Ingediende werknemersinformatie

Naam :$ {naam}
ID KAART :$ {id}
Contact nummer :$ {contactNumber}

De JSP-pagina gebruikt eenvoudig EL-expressies om waarden van eigenschappen van het Employee-object in het model weer te geven.

7. Testen van de applicatie

De eenvoudige applicatie kan worden geïmplementeerd - bijvoorbeeld op een Tomcat-server - en is lokaal toegankelijk:

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

Dit is de weergave met het hoofdformulier - vóór de verzendbewerking:

Spring MVC-formuliervoorbeeld - Verzenden

Na het indienen worden de gegevens weergegeven:

Spring MVC Form-voorbeeld - Bekijken

En dat is het - een werkend voorbeeld van een eenvoudig formulier met Spring MVC, met validatie.

De implementatie van deze Spring MVC-zelfstudie is te vinden in het GitHub-project - dit is een op Maven gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.

Tot slot, zoals ik al aan het begin van het artikel zei, moet je zeker dieper ingaan op Spring MVC.