Gids voor Flash-attributen in een Spring-webapplicatie

1. Overzicht

Webapplicaties zijn vaak afhankelijk van de input van de gebruiker om aan verschillende van hun gebruikssituaties te voldoen. Als gevolg hiervan is het indienen van formulieren een veelgebruikt mechanisme om gegevens voor dergelijke apps te verzamelen en te verwerken.

In deze tutorial leren we hoe De flash-attributen van Spring kunnen ons helpen met de workflow voor het indienen van formulieren veilig en betrouwbaar.

2. Basisprincipes van Flash-kenmerken

Voordat we gemakkelijk flash-attributen kunnen gebruiken, moeten we een behoorlijk niveau van begrip hebben van de workflow voor het indienen van formulieren en een paar belangrijke gerelateerde concepten.

2.1. Plaats / redirect / haal patroon op

Een naïeve manier om een ​​webformulier te ontwikkelen, zou zijn om een ​​enkel HTTP POST-verzoek te gebruiken dat zorgt voor de verzending en een bevestiging teruggeeft door middel van het antwoord. Een dergelijk ontwerp stelt echter het risico bloot van dubbele verwerking van POST-verzoeken, voor het geval de gebruiker uiteindelijk de pagina vernieuwt.

Om het probleem van dubbele verwerking te verminderen, kunnen we de workflow creëren als een reeks onderling verbonden verzoeken in een specifieke volgorde, namelijk POST, REDIRECT en GET. In het kort noemen we dit het Post / Redirect / Get (PRG) -patroon voor het indienen van formulieren.

Bij ontvangst van het POST-verzoek verwerkt de server het en draagt ​​vervolgens de controle over om een ​​GET-verzoek te doen. Vervolgens wordt de bevestigingspagina weergegeven op basis van het antwoord op het GET-verzoek. Idealiter, zelfs als het laatste GET-verzoek meer dan eens wordt geprobeerd, zouden er geen nadelige bijwerkingen moeten zijn.

2.2. Levenscyclus van Flash-attributen

Om de formulierinzending met het PRG-patroon te voltooien, moeten we informatie overzetten van het eerste POST-verzoek naar het laatste GET-verzoek na omleiding.

Helaas kunnen we de RequestAttributes noch de SessionAttributes. Dat komt omdat de eerste een omleiding tussen verschillende controllers niet zal overleven, terwijl de laatste de hele sessie zal duren, zelfs nadat het indienen van het formulier is voltooid.

Maar we hoeven ons geen zorgen te maken, want het webraamwerk van Spring biedt flash-attributen die dit exacte probleem kunnen oplossen.

Laten we eens kijken naar de methoden in het RedirectAttributes interface die ons kan helpen om flash-attributen in ons project te gebruiken:

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

Flash-attributen zijn van korte duur. Als zodanig worden deze tijdelijk opgeslagen in een onderliggende opslag, net voor de omleiding. Ze blijven beschikbaar voor het volgende verzoek na omleiding en zijn dan verdwenen.

2.3. FlashMap Data structuur

Spring biedt een abstracte datastructuur genaamd FlashMap voor het opslaan van de flash-attributen als sleutel / waarde-paren.

Laten we eens kijken naar de definitie van de FlashMap klasse:

openbare laatste klasse FlashMap breidt uit HashMap implementeert vergelijkbare {@Nullable private String targetRequestPath; private finale MultiValueMap targetRequestParams = nieuwe LinkedMultiValueMap (4); privé lange expirationTime = -1; }

We kunnen opmerken dat de FlashMap klasse erft zijn gedrag van de Hash kaart klasse. Als zodanig is een FlashMap instantie kan een sleutelwaarde-toewijzing van de attributen opslaan. We kunnen ook een FlashMap instantie die alleen wordt gebruikt door een specifieke omleidings-URL.

Bovendien heeft elk verzoek er twee FlashMap instanties, namelijk Input FlashMap en uitvoer FlashMap, die een belangrijke rol spelen in het PRG-patroon:

  • Uitvoer FlashMap wordt gebruikt in het POST-verzoek om de flash-attributen tijdelijk op te slaan en ze naar het volgende GET-verzoek na de omleiding te sturen
  • Invoer FlashMap wordt gebruikt in het laatste GET-verzoek om toegang te krijgen tot de alleen-lezen flash-attributen die zijn verzonden door het vorige POST-verzoek vóór de omleiding

2.4. FlashMapManager en RequestContextUtils

Zoals de naam doet vermoeden, kunnen we gebruiken FlashMapManager om de FlashMap gevallen.

Laten we eerst eens kijken naar de definitie van deze strategie-interface:

openbare interface FlashMapManager {@Nullable FlashMap retrieveAndUpdate (HttpServletRequest-verzoek, HttpServletResponse-antwoord); void saveOutputFlashMap (FlashMap flashMap, HttpServletRequest-verzoek, HttpServletResponse-antwoord); }

Simpel gezegd kunnen we dat zeggen FlashMapManager stelt ons in staat om te lezen, updaten en opslaan FlashMap instanties in een onderliggende opslag.

Laten we er vervolgens een paar leren kennen statische methoden die beschikbaar zijn in de RequestContextUtils abstracte utiliteitsklasse.

Om onze focus binnen het bereik van deze tutorial te houden, beperken we onze dekking tot de methoden die relevant zijn voor flash-attributen:

openbare statische kaart getInputFlashMap (verzoek HttpServletRequest); openbare statische FlashMap getOutputFlashMap (verzoek HttpServletRequest); openbare statische FlashMapManager getFlashMapManager (verzoek HttpServletRequest); openbare statische ongeldige saveOutputFlashMap (String-locatie, HttpServletRequest-verzoek, HttpServletResponse-antwoord);

We kunnen deze methoden gebruiken om de invoer / uitvoer op te halen FlashMap instanties, haalt u het FlashMapManager voor een verzoek en bewaar een FlashMap voorbeeld.

3. Gebruiksscenario voor het indienen van formulieren

We hebben inmiddels een basiskennis opgebouwd van verschillende concepten rond flitsattributen. Laten we dus verder gaan en ze gebruiken in een webtoepassing voor poëziewedstrijden.

Onze poëziewedstrijd-app heeft een eenvoudig gebruik van het accepteren van gedichtinzendingen van verschillende dichters door het indienen van een formulier. Bovendien bevat een wedstrijdinzending de nodige informatie met betrekking tot een gedicht, zoals een titel, een tekst en de naam van de auteur.

3.1. Thymeleaf-configuratie

We zullen gebruiken Thymeleaf, een Java-sjabloonengine voor het maken van dynamische webpagina's via eenvoudige HTML-sjablonen.

Eerst moeten we de spring-boot-starter-thymeleaf afhankelijkheid van ons project pom.xml:

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

Vervolgens kunnen we enkele van de Thymeleaf-specifieke eigenschappen definiëren in onze application.properties bestand in het src / main / resources directory:

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

Nadat we deze eigenschappen hebben gedefinieerd, kunnen we nu al onze weergaven maken onder de / src / main / resources / templates directory. Spring voegt op zijn beurt de .html achtervoegsel voor alle weergaven die binnen onze controller worden genoemd.

3.2. Domeinmodel

Volgende, laten we definieer ons domeinmodel in een Gedicht klasse:

openbare klasse Gedicht {privé String-titel; private String-auteur; privé String lichaam; }

Verder kunnen we de isValidPoem () statische methode in onze Gedicht class om ons te helpen valideren dat de velden geen lege strings toestaan:

openbare statische boolean isValidPoem (gedicht gedicht) {terug gedicht! = null && Strings.isNotBlank (poem.getAuthor ()) && Strings.isNotBlank (poem.getBody ()) && Strings.isNotBlank (poem.getTitle ()); }

3.3. Formulier maken

Nu zijn we klaar om ons inzendingsformulier te maken. Daarom, we hebben een eindpunt nodig / gedicht / indienen dat zal een GET-verzoek dienen om het formulier te tonen aan de gebruiker:

@GetMapping ("/ poem / submit") public String submitGet (Modelmodel) {model.addAttribute ("gedicht", nieuw gedicht ()); retourneer "verzenden"; }

Hier hebben we een model als een container gebruikt om de gedichtspecifieke gegevens die door de gebruiker zijn verstrekt, te bewaren. Bovendien is de submitGet methode retourneert een weergave die wordt bediend door de indienen visie.

Bovendien willen we het POST-formulier binden met het modelattribuut gedicht:

3.4. Inzendingsstroom plaatsen / omleiden / ophalen

Laten we nu de POST-actie voor het formulier inschakelen. Om dat te doen, maken we het / gedicht / indienen eindpunt in het Gedicht: indiening controller om het POST-verzoek te dienen:

@PostMapping ("/ poem / submit") public RedirectView submitPost (HttpServletRequest request, @ModelAttribute Poem poem, RedirectAttributes redirectAttributes) {if (Poem.isValidPoem (gedicht)) {redirectAttributes.addFlashAttribute ("poem", poem); retourneer nieuwe RedirectView ("/ gedicht / succes", waar); } else {retourneer nieuwe RedirectView ("/ gedicht / indienen", waar); }}

Dat merken we als de indiening succesvol is, wordt de controle overgedragen aan het / gedicht / succes eindpunt. We hebben ook de gedichtgegevens toegevoegd als een flash-attribuut voordat de omleiding werd gestart.

Nu moeten we een bevestigingspagina aan de gebruiker laten zien, dus laten we de functionaliteit voor het / gedicht / succes eindpunt dat het GET-verzoek zal dienen:

@GetMapping ("/ gedicht / succes") openbare String getSuccess (verzoek HttpServletRequest) {Map inputFlashMap = RequestContextUtils.getInputFlashMap (verzoek); if (inputFlashMap! = null) {Gedicht gedicht = (Gedicht) inputFlashMap.get ("gedicht"); "succes" teruggeven; } else {retourneer "redirect: / gedicht / indienen"; }}

Het is belangrijk op te merken dat we moeten de FlashMap voordat we besluiten om door te verwijzen naar de succespagina.

Laten we tot slot het flash-attribuut gebruiken gedicht op onze succespagina om de titel van het door de gebruiker ingediende gedicht te tonen:

Klik hier om meer in te dienen.

4. Conclusie

In deze zelfstudie hebben we een paar concepten geleerd over de kenmerken Post / Redirect / Get-patroon en flash. En we zagen ook flash-attributen in actie met een eenvoudige formulierinzending in een Spring Boot-webtoepassing.

Zoals altijd is de volledige broncode voor de tutorial beschikbaar op GitHub.