Kom godt i gang med formularer i foråret MVC

1. Oversigt

I denne artikel vil vi diskutere forårsformularer og databinding til en controller. Vi vil også se på en af ​​de vigtigste kommentarer i Forår MVC dvs. @ModelAttribute.

Selvfølgelig er Spring MVC et komplekst emne med masser af ting, du skal forstå for at bruge det til sit fulde potentiale, så gå helt sikkert dybere ned i rammen her.

2. Modellen

Først - lad os definere en simpel enhed at vi skal vise og binde til formularen:

offentlig klassemedarbejder {privat strengnavn; privat lang id; private String contactNumber; // standard getters og setter}

Dette vil være vores form-backing objekt.

3. Udsigten

Næste - lad os definere den faktiske formog selvfølgelig HTML-filen, der indeholder den. Vi bruger en side, hvor en ny medarbejder oprettes / registreres:

Velkommen, indtast medarbejderoplysningerne

Navn
Id
Kontakt nummer

Først - bemærk, at vi inkluderer et tagbibliotek på vores JSP-side - the form taglib - for at hjælpe med at definere vores formular.

Næste - den tag spiller en vigtig rolle her; det ligner meget den almindelige HTLM tag men modelAttribute attribut er nøglen, der angiver et navn på det modelobjekt, der bakker denne formular:

Dette svarer til @ModelAttribute senere i controlleren.

Dernæst - hvert inputfelt bruger endnu et nyttigt tag fra Spring Form taglib - form: præfiks. Hvert af disse felter specificerer -en sti attribut - dette skal svare til en getter / setter af modelattributten (i dette tilfælde medarbejderklassen). Når siden er indlæst, udfyldes inputfelterne af Spring, som kalder getterne for hvert felt bundet til et inputfelt. Når formularen sendes, kaldes setterne for at gemme formularens værdier til objektet.

Endelig - hvornår formularen indsendes, kaldes POST-handleren i controlleren, og formularen er automatisk bundet til medarbejder argument, som vi passerede ind.

4. Controlleren

Lad os nu se på controlleren der skal håndtere bagenden:

@Controller offentlig klasse EmployeeController {@RequestMapping (værdi = "/ medarbejder", metode = RequestMethod.GET) offentlig ModelAndView showForm () {returner ny ModelAndView ("medarbejderHome", "medarbejder", ny medarbejder ()); } @RequestMapping (værdi = "/ addEmployee", metode = RequestMethod.POST) offentlig strengindsendelse (@Valid @ModelAttribute ("medarbejder") Medarbejdermedarbejder, BindingResult-resultat, ModelMap-model) {if (result.hasErrors ()) {return "fejl"; } model.addAttribute ("navn", medarbejder.getnavn ()); model.addAttribute ("contactNumber", medarbejder.getContactNumber ()); model.addAttribute ("id", medarbejder.getId ()); returner "medarbejdervisning"; }}

Controlleren definerer to enkle operationer - GET til visning af data i formularen og POST til oprettelsesoperationen via formularens indsendelse.

Bemærk også, at hvis objektet kaldet "medarbejder" ikke føjes til modellen, vil Spring klage, når vi prøver at få adgang til JSP, fordi JSP vil blive indstillet til at binde formularen til "medarbejder" -modelattributten:

java.lang.IllegalStateException: Hverken BindingResult eller almindeligt målobjekt til bønnenavn 'medarbejder' tilgængelig som anmodningsattribut på o.s.w.s.s.BindStatus. (BindStatus.java:141) 

For at få adgang til vores formularbaggrundsobjekt skal vi indsprøjte det via @ModelAttribute kommentar.

En @ModelAttribute på et metodeargument angiver, at argumentet vil blive hentet fra modellen. Hvis det ikke er til stede i modellen, vil argumentet blive instantieret først og derefter tilføjet til modellen.

5. Håndtering af bindingsfejl

Som standard kaster Spring MVC en undtagelse, når der opstår fejl under anmodning om binding. Dette er normalt ikke det, vi ønsker, i stedet skal vi præsentere disse fejl for brugeren. Vi skal bruge en Bindende resultat ved at tilføje en som et argument til vores controller-metode:

offentlig streng indsende (@Valid @ModelAttribute ("medarbejder") Medarbejdermedarbejder, BindingResult-resultat, ModelMap-model)

Det Bindende resultat argument skal placeres lige efter vores formstøtteobjekt - det er et af de sjældne tilfælde, hvor rækkefølgen af ​​metodeargumenterne betyder noget. Ellers støder vi på følgende undtagelse:

java.lang.IllegalStateException: Errors / BindingResult-argument erklæret uden foregående modelattribut. Tjek din håndteringsmetodesignatur!

Nu - en undtagelse kastes ikke længere; i stedet registreres fejl på Bindende resultat der sendes til Indsend metode. På dette tidspunkt kan vi håndtere disse fejl på forskellige måder - for eksempel kan operationen annulleres:

@RequestMapping (værdi = "/ addEmployee", metode = RequestMethod.POST) offentlig streng indsende (@Valid @ModelAttribute ("medarbejder") Medarbejdermedarbejder, BindingResult-resultat, ModelMap-model) {if (result.hasErrors ()) {return " fejl"; } // Do Something returnerer "medarbejdervisning"; }

Bemærk hvordan, hvis resultatet indeholder fejl, returnerer vi en anden visning til brugeren for at få vist disse fejl korrekt. Lad os se på den opfattelse - fejl.jsp:

Indtast de korrekte detaljer

Prøve igen

6. Visning af en medarbejder

Endelig kan vi udover at oprette en ny medarbejder også blot vise en - her er koden til hurtig visning for det:

Indsendt medarbejderinformation

Navn:$ {navn}
ID:$ {id}
Kontakt nummer :$ {contactNumber}

JSP-siden bruger simpelthen EL-udtryk til at vise værdier for egenskaber for medarbejderobjektet i modellen.

7. Test af applikationen

Den enkle applikation kan implementeres - for eksempel på en Tomcat-server - og fås lokalt:

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

Dette er visningen, der indeholder hovedformularen - inden indsendelsen:

Spring MVC Form eksempel - Send

Efter indsendelsen vises dataene:

Spring MVC Form eksempel - Vis

Og det er det - et fungerende eksempel på en simpel form med Spring MVC med validering.

Implementeringen af ​​denne Spring MVC-tutorial kan findes i GitHub-projektet - dette er et Maven-baseret projekt, så det skal være let at importere og køre som det er.

Endelig, som jeg sagde lige i begyndelsen af ​​artiklen, skal du helt sikkert grave dybere ned i Spring MVC.


$config[zx-auto] not found$config[zx-overlay] not found