Vejledning til Flash-attributter i en forårswebapplikation

1. Oversigt

Webapplikationer er ofte afhængige af brugerinput for at imødekomme flere af deres brugssager. Som et resultat er formularindsendelse en meget anvendt mekanisme til at indsamle og behandle data til sådanne apps.

I denne vejledning lærer vi hvordan Spring's flash-attributter kan hjælpe os med arbejdsformen for indsendelse af formular sikkert og pålideligt.

2. Grundlæggende om Flash-attributter

Inden vi komfortabelt kan bruge flashattributter, er vi nødt til at opbygge et anstændigt niveau af forståelse af workflowet til formularindsendelse og et par nøglerelaterede begreber.

2.1. Send / omdiriger / hent mønster

En naiv måde at konstruere en webformular på ville være at bruge en enkelt HTTP POST-anmodning, der tager sig af indsendelse og giver tilbage en bekræftelse gennem sit svar. Imidlertid udsætter et sådant design risikoen for dobbeltbehandling af POST-anmodninger, hvis brugeren ender med at opdatere siden.

For at afbøde spørgsmålet om duplikatbehandling kan vi oprette arbejdsgangen som en sekvens af sammenkoblede anmodninger i en bestemt rækkefølge - nemlig POST, REDIRECT og GET. Kort sagt, vi kalder dette mønsteret Post / Redirect / Get (PRG) til indsendelse af formular.

Ved modtagelse af POST-anmodningen behandler serveren den og overfører derefter kontrol for at foretage en GET-anmodning. Efterfølgende vises bekræftelsessiden baseret på svaret fra GET-anmodningen. Ideelt set, selvom den sidste GET-anmodning bliver forsøgt mere end én gang, bør der ikke være nogen negative bivirkninger.

2.2. Livscyklus for Flash-attributter

For at udfylde formularindsendelsen ved hjælp af PRG-mønsteret skal vi overføre oplysninger fra den oprindelige POST-anmodning til den endelige GET-anmodning efter omdirigering.

Desværre kan vi hverken bruge RequestAttributter ej heller SessionAttributter. Det skyldes, at førstnævnte ikke overlever en omdirigering på tværs af forskellige controllere, mens sidstnævnte varer i hele sessionen, selv efter at formularindsendelsen er afsluttet.

Men vi behøver ikke bekymre os, da Spring's web framework giver flash-attributter, der kan løse dette nøjagtige problem.

Lad os se metoderne i RedirectAttributter interface, der kan hjælpe os med at bruge flashattributter i vores projekt:

RedirectAttributter addFlashAttribute (String attributeName, @Nullable Object attributeValue); RedirectAttributter addFlashAttribute (Object attributeValue); Kort getFlashAttributter ();

Flash-attributter er kortvarige. Som sådan lagres disse midlertidigt i noget underliggende lager lige før omdirigering. De forbliver tilgængelige for den efterfølgende anmodning efter omdirigering, og så er de væk.

2.3. FlashMap Datastruktur

Spring giver en abstrakt datastruktur kaldet FlashMap til lagring af flashattributter som nøgleværdipar.

Lad os se på definitionen af FlashMap klasse:

offentlig endelig klasse FlashMap udvider HashMap implementerer sammenlignelig {@Nullable private String targetRequestPath; privat endelig MultiValueMap targetRequestParams = ny LinkedMultiValueMap (4); privat lang udløbstid = -1; }

Vi kan bemærke, at FlashMap klasse arver sin adfærd fra HashMap klasse. Som sådan, a FlashMap eksempel kan gemme en nøgleværdikortlægning af attributterne. Vi kan også binde en FlashMap forekomst, der kun skal bruges af en bestemt omdirigerings-URL.

Desuden har hver anmodning to FlashMap forekomster, nemlig Input FlashMap og output FlashMap, som spiller en vigtig rolle i PRG-mønsteret:

  • Produktion FlashMap bruges i POST-anmodningen til midlertidigt at gemme flashattributterne og sende dem til den næste GET-anmodning efter omdirigering
  • Indgang FlashMap bruges i den sidste GET-anmodning for at få adgang til de skrivebeskyttede flashattributter, der blev sendt af den tidligere POST-anmodning før omdirigering

2.4. FlashMapManager og RequestContextUtils

Som navnet antyder, kan vi bruge FlashMapManager at styre FlashMap tilfælde.

Lad os først se på definitionen af ​​denne strategi-grænseflade:

offentlig grænseflade FlashMapManager {@Nullable FlashMap retrieveAndUpdate (HttpServletRequest anmodning, HttpServletResponse svar); ugyldig saveOutputFlashMap (FlashMap flashMap, HttpServletRequest anmodning, HttpServletResponse svar); }

Kort sagt kan vi sige det FlashMapManager giver os mulighed for at læse, opdatere og gemme FlashMap forekomster i noget underliggende lager.

Lad os derefter gøre os bekendt med nogle få statiske metoder tilgængelige i RequestContextUtils abstrakt hjælpeklasse.

For at holde vores fokus inden for omfanget af denne vejledning begrænser vi vores dækning til de metoder, der er relevante for flash-attributter:

offentlig statisk kort getInputFlashMap (HttpServletRequest anmodning); offentlig statisk FlashMap getOutputFlashMap (HttpServletRequest anmodning); offentlig statisk FlashMapManager getFlashMapManager (HttpServletRequest anmodning); offentlig statisk ugyldig saveOutputFlashMap (strengplacering, HttpServletRequest-anmodning, HttpServletResponse-svar);

Vi kan bruge disse metoder til at hente input / output FlashMap tilfælde, få FlashMapManager for en anmodning, og gem en FlashMap eksempel.

3. Brugssag for formularindsendelse

Nu har vi etableret en grundlæggende forståelse af forskellige begreber omkring flash-attributter. Så lad os bevæge os videre og bruge dem i en digtekonkurrenceweb-applikation.

Vores poesikonkurrence-app har et simpelt brugstilfælde til at acceptere digteposter fra forskellige digtere gennem indsendelse af en formular. Desuden vil en konkurrencebidrag have de nødvendige oplysninger relateret til et digt, såsom en titel, en krop og forfatterens navn.

3.1. Thymeleaf-konfiguration

Vi bruger Thymeleaf, som er en Java-skabelonmotor til oprettelse af dynamiske websider gennem enkle HTML-skabeloner.

Først skal vi tilføje spring-boot-starter-thymeleaf afhængighed af vores projekt pom.xml:

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

Dernæst kan vi definere nogle af de Thymeleaf-specifikke egenskaber i vores application.properties fil placeret i src / main / ressourcer vejviser:

spring.thymeleaf.cache = falsk spring.thymeleaf.enabled = sand spring.thymeleaf.prefix = classpath: / skabeloner / spring.thymeleaf.suffix = .html

Efter at have defineret disse egenskaber, kan vi nu oprette alle vores synspunkter under / src / main / ressourcer / skabeloner vejviser. Til gengæld vil Spring tilføje .html suffiks til alle de synspunkter, der er nævnt inde i vores controller.

3.2. Domæne Model

Næste, lad os definere vores domænemodel i en Digt klasse:

offentlig klasse Digt {privat streng titel; privat strengforfatter; private String organ; }

Yderligere kan vi tilføje isValidPoem () statisk metode i vores Digt klasse for at hjælpe os med at validere, at felterne ikke tillader tomme strenge:

offentlig statisk boolsk isValidPoem (Digtdigt) {returdigt! = null && Strings.isNotBlank (gedig.getAuthor ()) && Strings.isNotBlank (gedig.getBody ()) && Strings.isNotBlank (gedig.getTitle ()); }

3.3. Opret formular

Nu er vi klar til at oprette vores indsendelsesformular. For det, vi har brug for et slutpunkt / digt / indsende der vil tjene en GET-anmodning om at vise formularen til brugeren:

@GetMapping ("/ digt / indsende") offentlig String submitGet (Modelmodel) {model.addAttribute ("digt", nyt Digt ()); returner "indsend"; }

Her har vi brugt en model som en container til at indeholde de digt-specifikke data leveret af brugeren. Desuden er sendGet metoden returnerer en visning, der betjenes af Indsend udsigt.

Derudover ønsker vi at binde POST-formularen med modelattributten digt:

3.4. Send / omdiriger / Få indsendelsesflow

Lad os nu aktivere POST-handlingen for formularen. For at gøre det opretter vi / digt / indsende slutpunkt i PoemSubmission controller til at betjene POST-anmodningen:

@PostMapping ("/ digt / indsende") offentlig RedirectView submitPost (HttpServletRequest anmodning, @ModelAttribute Digt digt, RedirectAttributter redirectAttributter) {hvis (Poem.isValidPoem (digt)) {redirectAttributes.addFlashAttribute ("digt", digt); returner ny RedirectView ("/ digt / succes", sandt); } ellers {returner ny RedirectView ("/ digt / indsend", sandt); }}

Det kan vi bemærke Hvis indsendelsen er vellykket, så kontroller overførsler til / digt / succes slutpunkt. Vi tilføjede også digtdataene som en flashattribut, inden vi startede omdirigering.

Nu skal vi vise en bekræftelsesside til brugeren, så lad os implementere funktionaliteten til / digt / succes slutpunkt, der tjener GET-anmodningen:

@GetMapping ("/ digt / succes") offentlig streng getSuccess (HttpServletRequest anmodning) {Map inputFlashMap = RequestContextUtils.getInputFlashMap (anmodning); hvis (inputFlashMap! = null) {Digtdigt = (Digt) inputFlashMap.get ("digt"); returnere "succes"; } andet {returner "omdirigering: / digt / indsend"; }}

Det er vigtigt at bemærke her, at vi skal validere FlashMap inden vi beslutter at omdirigere til succes siden.

Lad os endelig bruge flashattributten digt inde på vores successide for at vise titlen på det digt, der er indsendt af brugeren:

Klik her for at indsende mere.

4. Konklusion

I denne tutorial lærte vi et par begreber omkring attributterne Post / Redirect / Get-mønster og flash. Og vi så også flashattributter i aktion med en simpel formularindsendelse i en Spring Boot-webapplikation.

Som altid er den komplette kildekode til vejledningen tilgængelig på GitHub.


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