Spring MVC and the @ModelAttribute Annotation

1. Oversigt

En af de vigtigste Spring-MVC-kommentarer er @ModelAttribute-kommentaren.

Det @ModelAttribute er en kommentar, der binder en metodeparameter eller metoden returnerer værdi til en navngivet modelattribut og derefter udsætter den for en webvisning.

I det følgende eksempel demonstrerer vi brugbarheden og funktionaliteten af ​​kommentaren gennem et fælles koncept: en formular indsendt fra en virksomheds medarbejder.

2. Den @ModelAttribute i dybde

Som det indledende afsnit afslørede, @ModelAttribute kan bruges enten som en metodeparameter eller på metodeniveau.

2.1 På metodeniveau

Når kommentaren bruges på metodeniveau, angiver det, at formålet med denne metode er at tilføje en eller flere modelattributter. Sådanne metoder understøtter de samme argumenttyper som @RequestMapping-metoder, men de kan ikke kortlægges direkte til anmodninger.

Lad os se på et hurtigt eksempel her for at begynde at forstå, hvordan dette fungerer:

@ModelAttribute public void addAttributes (Model model) {model.addAttribute ("msg", "Velkommen til Holland!"); } 

I eksemplet viser vi en metode, der tilføjer en navngivet attribut msg til alle models defineret i controllerklassen.

Selvfølgelig ser vi dette i aktion senere i artiklen.

Generelt foretager Spring-MVC altid et opkald først til denne metode, inden den kalder nogen anmodningshåndteringsmetoder. Det er, @ModelAttribute metoder påberåbes, før controllermetoderne kommenteres med @RequestMapping påberåbes. Logikken bag sekvensen er, at modelobjektet skal oprettes, inden nogen behandling starter inde i controller-metoderne.

Det er også vigtigt, at du kommenterer den respektive klasse som @ControllerAdvice. Således kan du tilføje værdier i Model som vil blive identificeret som global. Dette betyder faktisk, at der for hver anmodning findes en standardværdi for hver metode i svardelen.

2.2 Som metodeargument

Når det bruges som et metodeargument, angiver det, at argumentet skal hentes fra modellen. Når den ikke er til stede, skal den først instantieres og derefter føjes til modellen, og når den er til stede i modellen, skal argumenterne udfyldes fra alle anmodningsparametre, der har matchende navne.

I kodestykket, der følger medarbejder modelattribut er udfyldt med data fra en formular, der sendes til tilføj medarbejder slutpunkt. Spring MVC gør dette bag kulisserne, inden de påberåber sig metoden til indsendelse:

@RequestMapping (værdi = "/ addEmployee", metode = RequestMethod.POST) offentlig streng indsende (@ModelAttribute ("medarbejder") Medarbejdermedarbejder) {// Kode, der bruger medarbejderobjektet returnerer "medarbejdervisning"; }

Senere i denne artikel vil vi se et komplet eksempel på, hvordan du bruger medarbejder modsætter sig at udfylde medarbejdervisning skabelon.

Så det binder formdataene med en bønne. Controlleren kommenteret med @RequestMapping kan have brugerdefinerede klasseargumenter annoteret med @ModelAttribute.

Dette er hvad der almindeligvis er kendt som databinding i Spring-MVC, en fælles mekanisme, der sparer dig for at skulle analysere hvert formularfelt individuelt.

3. Formulareksempel

I dette afsnit vil vi give det eksempel, der henvises til i oversigtssektionen: en meget grundlæggende form, der beder en bruger (medarbejder i en virksomhed, i vores specifikke eksempel) om at indtaste nogle personlige oplysninger (specifikt navn og id). Når indsendelsen er afsluttet og uden nogen fejl, forventer brugeren at se de tidligere indsendte data, der vises på en anden skærm.

3.1 Udsigten

Lad os først oprette en simpel formular med id- og navnefelter:

 Navn Id 

3.2 Controlleren

Her er controller-klassen, hvor logikken til ovennævnte visning implementeres:

@Controller @ControllerAdvice offentlig klasse EmployeeController {privat kort medarbejderkort = nyt HashMap (); @RequestMapping (værdi = "/ addEmployee", metode = RequestMethod.POST) offentlig strengindsendelse (@ModelAttribute ("medarbejder") Medarbejdermedarbejder, BindingResult-resultat, ModelMap-model) {if (result.hasErrors ()) {return "fejl" ; } model.addAttribute ("navn", medarbejder.getnavn ()); model.addAttribute ("id", medarbejder.getId ()); medarbejderMap.put (medarbejder.getId (), medarbejder); returner "medarbejdervisning"; } @ModelAttribute public void addAttributes (Model model) {model.addAttribute ("msg", "Velkommen til Holland!"); }}

I Indsend() metode vi har en Medarbejder objekt bundet til vores Udsigt. Kan du se styrken ved denne kommentar? Du kan kortlægge dine formularfelter til en objektmodel så enkelt som det. I metoden henter vi værdier fra formularen og indstiller dem til ModelMap.

I sidste ende vender vi tilbage medarbejdervisning, hvilket betyder, at den respektive JSP-fil kaldes som en Udsigt repræsentant.

Desuden er der også en addAttributter () metode. Dens formål er at tilføje værdier i Model som vil blive identificeret globalt. Det vil sige, at en standardværdi returneres som svar for hver anmodning til hver controller-metode. Vi er også nødt til at kommentere den specifikke klasse som @ControllerAdvice.

3.3 Modellen

Som nævnt før, Model objektet er meget forenklet og indeholder alt, hvad der kræves af attributterne "front-end". Lad os nu se på et eksempel:

@XmlRootElement offentlig klasse medarbejder {privat lang id; privat strengnavn; offentlig ansat (lang id, strengnavn) {this.id = id; dette.navn = navn; } // standard getters og setters fjernet}

3.4 Pak ind

Det @ControllerAdvice assisterer en controller og især @ModelAttribute metoder, der gælder for alle @RequestMapping metoder. Selvfølgelig vores addAttributter () Metoden vil være den allerførste til at køre inden resten af ​​programmet @RequestMapping metoder.

Med det i tankerne og efter begge Indsend() og addAttributter () køres, kunne vi bare henvise til dem i Udsigt vendte tilbage fra Controller klasse ved at nævne deres fornavn i en dollariseret krøllet-seler-duo, som for eksempel $ {navn}.

3.5 Visning af resultater

Lad os nu udskrive det, vi modtog fra formularen:

$ {msg}

Navn: $ {name} ID: $ {id}

4. Konklusion

I denne vejledning undersøgte vi brugen af @ModelAttribute kommentar til både metodeargumenter og brugssager på metodeniveau.

Implementeringen af ​​denne enkle vejledning kan findes i github-projektet.