Veiledning til Flash-attributter i en vårnettapplikasjon

1. Oversikt

Nettapplikasjoner er ofte avhengige av brukerinngang for å møte flere av brukssakene sine. Som et resultat er skjemainnsending en mye brukt mekanisme for å samle inn og behandle data for slike apper.

I denne opplæringen lærer vi hvordan Vårens flashattributter kan hjelpe oss med arbeidsflyten for skjemainnlevering sikkert og pålitelig.

2. Grunnleggende om Flash-attributter

Før vi komfortabelt kan bruke flash-attributter, må vi bygge opp et anstendig nivå av forståelse av arbeidsflyten for skjemainnlevering og noen få nøkkelrelaterte konsepter.

2.1. Legg ut / omdiriger / få mønster

En naiv måte å konstruere et webskjema på ville være å bruke en enkelt HTTP POST-forespørsel som tar seg av innsendingen og gir tilbake en bekreftelse gjennom svaret. Imidlertid utsetter en slik design risikoen for duplikatbehandling av POST-forespørsler, i tilfelle brukeren ender med å oppdatere siden.

For å redusere problemet med duplikatbehandling kan vi opprette arbeidsflyten som en sekvens av sammenkoblede forespørsler i en bestemt rekkefølge - nemlig POST, REDIRECT og GET. Kort sagt, vi kaller dette Post / Redirect / Get (PRG) mønster for innsending av skjema.

Ved mottak av POST-forespørselen behandler serveren den og overfører deretter kontroll for å komme med en GET-forespørsel. Deretter vises bekreftelsessiden basert på svaret fra GET-forespørselen. Ideelt sett, selv om den siste GET-forespørselen blir forsøkt mer enn en gang, bør det ikke være noen negative bivirkninger.

2.2. Livssyklus for Flash-attributter

For å fullføre skjemainnsendingen ved hjelp av PRG-mønsteret, må vi overføre informasjon fra den første POST-forespørselen til den endelige GET-forespørselen etter omdirigering.

Dessverre kan vi verken bruke RequestAttributes ei heller SessionAttributter. Det er fordi førstnevnte ikke vil overleve en omdirigering på tvers av forskjellige kontrollere, mens sistnevnte varer i hele økten, selv etter at skjemainnleveringen er over.

Men vi trenger ikke bekymre oss, da Spring's web framework gir flash-attributter som kan løse dette nøyaktige problemet.

La oss se metodene i RedirectAttributter grensesnitt som kan hjelpe oss med å bruke flash-attributter i prosjektet vårt:

RedirectAttributes addFlashAttribute (String attributeName, @Nullable Object attributeValue); RedirectAttributes addFlashAttribute (Object attributeValue); Kart getFlashAttributes ();

Flash-attributter er kortvarige. Som sådan lagres disse midlertidig i noe underliggende lagring, rett før omdirigering. De forblir tilgjengelige for den påfølgende forespørselen etter omdirigering, og så er de borte.

2.3. FlashMap Data struktur

Våren gir en abstrakt datastruktur kalt FlashMap for lagring av blitzattributtene som nøkkelverdipar.

La oss ta en titt på definisjonen av FlashMap klasse:

offentlig endelig klasse FlashMap utvider HashMap implementerer sammenlignbar {@ullbar privat streng targetRequestPath; privat endelig MultiValueMap targetRequestParams = ny LinkedMultiValueMap (4); privat lang utløpstid = -1; }

Vi kan merke at FlashMap klasse arver sin oppførsel fra HashMap klasse. Som sådan, a FlashMap forekomst kan lagre en nøkkelverdikartlegging av attributtene. Vi kan også knytte en FlashMap forekomst som bare skal brukes av en spesifikk viderekoblings-URL.

Videre har hver forespørsel to FlashMap tilfeller, nemlig Input FlashMap og utgang FlashMap, som spiller en viktig rolle i PRG-mønsteret:

  • Produksjon FlashMap brukes i POST-forespørselen for å lagre flash-attributtene midlertidig og sende dem til neste GET-forespørsel etter omdirigering
  • Inngang FlashMap brukes i den siste GET-forespørselen for å få tilgang til de skrivebeskyttede flashattributtene som ble sendt av forrige POST-forespørsel før omdirigering

2.4. FlashMapManager og RequestContextUtils

Som navnet antyder, kan vi bruke FlashMapManager å administrere FlashMap tilfeller.

La oss først ta en titt på definisjonen av dette strategigrensesnittet:

offentlig grensesnitt FlashMapManager {@Nullable FlashMap retrieveAndUpdate (HttpServletRequest request, HttpServletResponse response); void saveOutputFlashMap (FlashMap flashMap, HttpServletRequest request, HttpServletResponse response); }

Enkelt sagt, vi kan si det FlashMapManager lar oss lese, oppdatere og lagre FlashMap forekomster i noe underliggende lagring.

La oss deretter gjøre oss kjent med noen få statiske metoder tilgjengelig i RequestContextUtils abstrakt nytteklasse.

For å holde fokus innenfor rammen av denne opplæringen, begrenser vi dekningen til metodene som er relevante for flash-attributter:

offentlig statisk kart getInputFlashMap (HttpServletRequest forespørsel); offentlig statisk FlashMap getOutputFlashMap (HttpServletRequest forespørsel); offentlig statisk FlashMapManager getFlashMapManager (HttpServletRequest forespørsel); offentlig statisk tomrom saveOutputFlashMap (strengplassering, HttpServletRequest-forespørsel, HttpServletResponse-svar);

Vi kan bruke disse metodene for å hente inn / ut FlashMap tilfeller, få FlashMapManager for en forespørsel, og lagre en FlashMap forekomst.

3. Brukssak for skjemainnsending

Nå har vi etablert en grunnleggende forståelse av forskjellige konsepter rundt flash-attributter. Så la oss gå videre og bruke dem i en poesi-konkurranses webapplikasjon.

Appen vår for poesikonkurranse har et enkelt brukstilfelle for å akseptere diktoppføringer fra forskjellige diktere gjennom innsending av et skjema. Videre vil en konkurranseoppføring ha den nødvendige informasjonen knyttet til et dikt, for eksempel en tittel, et legeme og forfatterens navn.

3.1. Thymeleaf-konfigurasjon

Vi bruker Thymeleaf, som er en Java-malmotor for å lage dynamiske websider gjennom enkle HTML-maler.

Først må vi legge til spring-boot-starter-thymeleaf avhengighet til prosjektet vårt pom.xml:

 org.springframework.boot spring-boot-starter-thymeleaf 2.2.1.RELEASE 

Deretter kan vi definere noen av de Thymeleaf-spesifikke egenskapene i vår application.properties filen ligger i src / main / resources katalog:

spring.thymeleaf.cache = false spring.thymeleaf.enabled = true spring.thymeleaf.prefix = classpath: / templates / spring.thymeleaf.suffix = .html

Etter å ha definert disse egenskapene, kan vi nå lage alle våre synspunkter under / src / hoved / ressurser / maler katalog. På sin side vil Spring legge til .html suffiks til alle visningene som er nevnt inne i kontrolleren vår.

3.2. Domenemodell

La oss gjøre det neste definere domenemodellen vår i en Dikt klasse:

offentlig klasse Dikt {privat Stringtittel; privat strengforfatter; privat streng kroppen; }

Videre kan vi legge til isValidPoem () statisk metode i vår Dikt klasse for å hjelpe oss med å validere at feltene ikke tillater tomme strenger:

offentlig statisk boolsk isValidPoem (Diktdikt) {returdikt! = null && Strings.isNotBlank (dikt.getAuthor ()) && Strings.isNotBlank (dikt.getBody ()) && Strings.isNotBlank (dikt.getTitle ()); }

3.3. Opprett skjema

Nå er vi klare til å lage skjemaet for innlevering. For det, vi trenger et endepunkt / dikt / sende inn som vil tjene en GET-forespørsel om å vise skjemaet til brukeren:

@GetMapping ("/ dikt / sende") offentlig String submitGet (modellmodell) {modell.addAttribute ("dikt", nytt dikt ()); returner "send inn"; }

Her har vi brukt en modell som en beholder for å holde de dikt-spesifikke dataene som er gitt av brukeren. Videre, den sendGet metoden returnerer en visning servert av sende inn utsikt.

I tillegg vil vi binde POST-skjemaet med modellattributtet dikt:

3.4. Post / omdirigering / Få innsendingsflyt

La oss nå aktivere POST-handlingen for skjemaet. For å gjøre det, oppretter vi / dikt / sende inn endepunkt i PoemSubmission kontrolleren for å betjene POST-forespørselen:

@PostMapping ("/ dikt / sende") offentlig RedirectView submitPost (HttpServletRequest forespørsel, @ModelAttribute Diktdikt, RedirectAttributter redirectAttributter) {hvis (Poem.isValidPoem (dikt)) {redirectAttributes.addFlashAttribute ("dikt", dikt); returner ny RedirectView ("/ dikt / suksess", sant); } annet {returner ny RedirectView ("/ dikt / send inn", sant); }}

Det kan vi merke Hvis innsendingen er vellykket, så kontroller overføringer til / dikt / suksess endepunkt. Vi la også til diktdataene som et flash-attributt før vi startet viderekoblingen.

Nå må vi vise en bekreftelsesside til brukeren, så la oss implementere funksjonaliteten for / dikt / suksess endepunkt som vil tjene GET-forespørselen:

@GetMapping ("/ dikt / suksess") offentlig streng getSuccess (HttpServletRequest forespørsel) {Map inputFlashMap = RequestContextUtils.getInputFlashMap (forespørsel); hvis (inputFlashMap! = null) {Diktdikt = (Dikt) inputFlashMap.get ("dikt"); returnere "suksess"; } annet {return "redirect: / dikt / send inn"; }}

Det er viktig å merke seg her at vi trenger å validere FlashMap før vi bestemmer oss for å omdirigere til suksesssiden.

Til slutt, la oss bruke flash-attributtet dikt inne på vår suksessside for å vise tittelen på diktet sendt av brukeren:

Klikk her for å sende inn flere.

4. Konklusjon

I denne opplæringen lærte vi noen få konsepter rundt innlegg / omdirigering / få mønster og flash-attributter. Og vi så også flash-attributter i aksjon med en enkel skjemainnlevering i en Spring Boot-webapplikasjon.

Som alltid er den komplette kildekoden for opplæringen tilgjengelig på GitHub.


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