Komme i gang med skjemaer i vår MVC

1. Oversikt

I denne artikkelen vil vi diskutere vårskjemaer og bindende data til en kontroller. Vi vil også se på en av hovedkommentarene i Vår MVC dvs. @ModelAttribute.

Selvfølgelig er Spring MVC et komplekst tema med mange ting du trenger å forstå for å bruke det til sitt fulle potensiale, så definitivt grave dypere inn i rammeverket her.

2. Modellen

Først - la oss definere en enkel enhet som vi skal vise og binde til skjemaet:

offentlig klasse Ansatt {privat strengnavn; privat lang id; privat streng kontaktNummer; // standard getters og setters}

Dette vil være vårt formstøtteobjekt.

3. Utsikten

Neste - la oss definere selve formen, og selvfølgelig HTML-filen som inneholder den. Vi skal bruke en side der en ny ansatt blir opprettet / registrert:

Velkommen, skriv inn medarbeideropplysningene

Navn
Id
Kontakt nummer

Først - legg merke til at vi inkluderer et tagbibliotek på vår JSP-side - the skjema taglib - for å hjelpe til med å definere skjemaet vårt.

Neste - den tag spiller en viktig rolle her; det ligner på vanlig HTLM tag men modellattributt attributt er nøkkelen som spesifiserer et navn på modellobjektet som støtter dette skjemaet:

Dette vil tilsvare @ModelAttribute senere i kontrolleren.

Neste - hvert inndatafelt bruker enda en nyttig tag fra Spring Form taglib - form: prefiks. Hvert av disse feltene spesifiserer en sti Egenskap - dette må tilsvare en getter / setter av modellattributtet (i dette tilfellet medarbeiderklassen). Når siden er lastet, fylles inndatafeltet av Spring, som kaller getter for hvert felt bundet til et inndatafelt. Når skjemaet sendes inn, kalles setterne for å lagre skjemaets verdier til objektet.

Endelig - når skjemaet sendes inn, blir POST-håndtereren i kontrolleren påkalt og skjemaet blir automatisk bundet til ansatt argument som vi passerte inn.

4. Kontrolleren

La oss nå se på kontrolleren som kommer til å håndtere bakenden:

@Controller offentlig klasse EmployeeController {@RequestMapping (verdi = "/ ansatt", metode = RequestMethod.GET) offentlig ModelAndView showForm () {returner ny ModelAndView ("medarbeiderHjem", "ansatt", ny ansatt ()); } @RequestMapping (verdi = "/ addMedarbeider", metode = RequestMethod.POST) offentlig strenginnsending (@Valid @ModelAttribute ("ansatt") Ansattmedarbeider, BindingResult-resultat, ModelMap-modell) {if (result.hasErrors ()) {retur "feil"; } modell.addAttribute ("navn", ansatt.getnavn ()); model.addAttribute ("contactNumber", medarbeider.getContactNumber ()); model.addAttribute ("id", medarbeider.getId ()); returner "medarbeidervisning"; }}

Kontrolleren definerer to enkle operasjoner - GET for å vise data i skjemaet, og POST for å opprette operasjonen, via skjemaets sende.

Vær også oppmerksom på at hvis objektet kalt "ansatt" ikke blir lagt til modellen, vil Spring klage når vi prøver å få tilgang til JSP fordi JSP vil bli satt opp for å binde skjemaet til "ansatt" modellattributt:

java.lang.IllegalStateException: Verken BindingResult eller vanlig målobjekt for bønnenavn 'ansatt' tilgjengelig som forespørselsattributt på o.s.w.s.s.BindStatus. (BindStatus.java:141) 

For å få tilgang til skjemaet vårt, må vi injisere det via @ModelAttribute kommentar.

An @ModelAttribute på et metodeargument angir at argumentet vil bli hentet fra modellen. Hvis det ikke er tilstede i modellen, vil argumentet bli instantiert først og deretter lagt til i modellen.

5. Håndtering av bindingsfeil

Som standard kaster Spring MVC et unntak når det oppstår feil under forespørsel. Dette er vanligvis ikke det vi vil, i stedet bør vi presentere disse feilene for brukeren. Vi skal bruke en Bindende resultat ved å legge til en som et argument til vår kontrollermetode:

offentlig streng sende (@Valid @ModelAttribute ("ansatt") Ansatt ansatt, BindingResult resultat, ModelMap modell)

De Bindende resultat argumentet må plasseres rett etter vårt skjema-støtteobjekt - det er en av de sjeldne tilfellene hvor rekkefølgen på metodeargumentene betyr noe. Ellers får vi følgende unntak:

java.lang.IllegalStateException: Errors / BindingResult argument erklært uten foregående modellattributt. Sjekk handlers metode signatur!

Nå - et unntak kastes ikke lenger; i stedet blir feil registrert på Bindende resultat som sendes til sende inn metode. På dette tidspunktet kan vi håndtere disse feilene på en rekke måter - for eksempel kan operasjonen avbrytes:

@RequestMapping (verdi = "/ addEmployee", metode = RequestMethod.POST) offentlig strenginnsendelse (@Valid @ModelAttribute ("ansatt") Ansattmedarbeider, BindingResult-resultat, ModelMap-modell) {if (result.hasErrors ()) {return feil"; } // Do Something returnerer "medarbeidervisning"; }

Legg merke til hvordan, i tilfelle resultatet inneholder feil, returnerer vi en annen visning til brukeren for å vise disse feilene riktig. La oss ta en titt på den visningen - feil.jsp:

Vennligst skriv inn de riktige detaljene

Prøv på nytt

6. Å vise en ansatt

Til slutt, i tillegg til å opprette en ny ansatt, kan vi også bare vise en - her er koden for hurtigvisning for det:

Innlevert informasjon om ansatte

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

JSP-siden bruker ganske enkelt EL-uttrykk for å vise verdier for egenskaper til ansattobjektet i modellen.

7. Testing av applikasjonen

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

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

Dette er visningen som inneholder hovedskjemaet - før innsendingen:

Spring MVC Form eksempel - Send inn

Etter innsending vises dataene:

Spring MVC Form eksempel - Vis

Og det er det - et arbeidseksempel på en enkel form med Spring MVC, med validering.

Implementeringen av denne våren MVC-opplæringen finner du i GitHub-prosjektet - dette er et Maven-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.

Til slutt, som jeg sa rett i begynnelsen av artikkelen, bør du definitivt grave dypere inn i Spring MVC.