Útmutató a Flash-attribútumokhoz egy tavaszi webalkalmazásban

1. Áttekintés

A webalkalmazások gyakran a felhasználói beviteltől függenek, hogy megfeleljenek több használati esetüknek. Ennek eredményeként az űrlap elküldése erősen használt mechanizmus az ilyen alkalmazások adatainak összegyűjtésére és feldolgozására.

Ebben az oktatóanyagban megtanuljuk, hogyan A tavaszi flash attribútumok segíthetnek az űrlapküldési munkafolyamatban biztonságosan és megbízhatóan.

2. Flash attribútumok alapjai

Mielőtt kényelmesen használhatnánk a flash attribútumokat, ki kell alakítanunk az űrlapküldési munkafolyamat és néhány kulcsfontosságú koncepció megértését.

2.1. Post / Redirect / Get Pattern

A webes űrlap tervezésének naiv módja az lenne, ha egyetlen HTTP POST kérést használna, amely gondoskodik a beküldésről és visszaigazolást ad vissza a válaszával. Az ilyen kialakítás azonban felveti a POST-kérelmek duplikált feldolgozásának kockázatát, arra az esetre, ha a felhasználó frissítené az oldalt.

A duplikált feldolgozás kérdésének enyhítése érdekében létrehozhatjuk a munkafolyamatot összekapcsolt kérések sorozataként, meghatározott sorrendben - nevezetesen: POST, REDIRECT és GET. Röviden, ezt Post / Redirect / Get (PRG) mintának hívjuk az űrlap elküldéséhez.

A POST kérés beérkezésekor a szerver feldolgozza azt, majd GET kérés átadására átadja a vezérlést. Ezt követően megjelenik a megerősítő oldal a GET kérés válasza alapján. Ideális esetben, még akkor sem, ha az utolsó GET kérést többször megkísérlik, nem lehetnek káros mellékhatások.

2.2. A Flash-attribútumok életciklusa

Az űrlap elküldésének a PRG mintával történő kitöltéséhez át kell irányítanunk az eredeti POST kéréstől a végső GET kérésig információkat.

Sajnos egyikünket sem használhatjuk RequestAttributes sem a SessionAttributes. Ez azért van, mert az előbbiek nem élik túl a különböző vezérlők közötti átirányítást, míg az utóbbiak az űrlap benyújtása után is az egész munkamenetig tartanak.

De nem kell aggódnunk, mivel a Spring webes keretrendszere olyan flash attribútumokat tartalmaz, amelyek megoldják ezt a problémát.

Lássuk a RedirectAttributes felület, amely segíthet a Flash-attribútumok használatában a projektünkben:

RedirectAttributes addFlashAttribute (String attribútumNév, @Nullable Object attribútumérték); RedirectAttributes addFlashAttribute (Object attributeValue); GetFlashAttributes () leképezése;

A Flash attribútumok rövid életűek. Mint ilyenek, ezeket ideiglenesen tárolják valamilyen mögöttes tárolóban, közvetlenül az átirányítás előtt. Az átirányítást követően rendelkezésre állnak a későbbi kérelemhez, és akkor eltűnnek.

2.3. FlashMap Adatszerkezet

A Spring egy absztrakt adatstruktúrát ad FlashMap a flash attribútumok kulcs-érték párokként történő tárolásához.

Vessünk egy pillantást a FlashMap osztály:

public final class FlashMap kiterjeszti a HashMap megvalósítja az összehasonlítható {@Nullable private String targetRequestPath; private final MultiValueMap targetRequestParams = new LinkedMultiValueMap (4); privát hosszú lejárati idő = -1; }

Észrevehetjük, hogy a FlashMap osztály örökli viselkedését a HashMap osztály. Mint ilyen, a FlashMap példány tárolhatja az attribútumok kulcs-érték leképezését. Ezenkívül megköthetünk egy FlashMap példányt csak egy adott átirányítási URL használhatja.

Továbbá minden kérésnek kettő van FlashMap példányok, nevezetesen az Input FlashMap és kimenet FlashMap, amelyek fontos szerepet játszanak a PRG mintázatában:

  • Kimenet FlashMap a POST kérelemben ideiglenesen elmenti a flash attribútumokat, és elküldi őket az átirányítás után a következő GET kérésre
  • Bemenet FlashMap használja a végső GET kérésben az írásvédett flash attribútumok eléréséhez, amelyeket az előző POST kérelem küldött az átirányítás előtt

2.4. FlashMapManager és RequestContextUtils

Ahogy a neve is sugallja, használhatjuk FlashMapManager kezelni a FlashMap példányok.

Először nézzük meg ennek a stratégiai felületnek a meghatározását:

nyilvános felület FlashMapManager {@Nullable FlashMap retrieveAndUpdate (HttpServletRequest kérés, HttpServletResponse válasz); void saveOutputFlashMap (FlashMap flashMap, HttpServletRequest kérés, HttpServletResponse válasz); }

Egyszerűen fogalmazva, ezt mondhatjuk FlashMapManager lehetővé teszi számunkra az olvasást, a frissítést és a mentést FlashMap példányok valamilyen mögöttes tárolóban.

Ezután ismerkedjünk meg néhányal statikus módszerek a RequestContextUtils absztrakt hasznossági osztály.

Annak érdekében, hogy a hangsúly az oktatóanyag körén belül maradjon, lefedettségünket a flash attribútumok szempontjából releváns módszerekre korlátozzuk:

nyilvános statikus térkép getInputFlashMap (HttpServletRequest kérés); nyilvános statikus FlashMap getOutputFlashMap (HttpServletRequest kérés); nyilvános statikus FlashMapManager getFlashMapManager (HttpServletRequest kérés); public static void saveOutputFlashMap (Karakterlánc helye, HttpServletRequest kérés, HttpServletResponse válasz);

Ezeket a módszereket használhatjuk az input / output lekérésére FlashMap példányok, kap a FlashMapManager kéréshez, és mentse a FlashMap példa.

3. Az űrlap benyújtásának használati esete

Mostanra megalapoztuk a flash-attribútumok körüli különböző fogalmak alapértelmezését. Tehát lépjünk tovább, és használjuk őket egy versverseny internetes alkalmazásában.

A versverseny alkalmazásunknak egyszerű felhasználási lehetősége van, hogy különböző költőktől származó versbejegyzéseket fogadunk el egy űrlap benyújtásával. Ezenkívül egy versenypályázat tartalmazza a vershez szükséges információkat, például címet, testet és a szerző nevét.

3.1. Thymeleaf konfiguráció

Majd használjuk Thymeleaf, amely egy Java sablonmotor dinamikus weboldalak létrehozásához egyszerű HTML-sablonokon keresztül.

Először hozzá kell adnunk a tavaszi-bakancs-indító-timeleaf függőség a projektünktől pom.xml:

 org.springframework.boot spring-boot-starter-thymeleaf 2.2.1. KÖZLEMÉNY 

Ezután meghatározhatunk néhány Thymeleaf-specifikus tulajdonságot aalkalmazás. tulajdonságok fájl található a src / main / resources Könyvtár:

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

Miután meghatároztuk ezeket a tulajdonságokat, most létrehozhatjuk az összes nézetünket a / src / main / resources / templates Könyvtár. Viszont Tavasz hozzáfűzi a .html utótag a vezérlőnkben megnevezett összes nézethez.

3.2. Domain modell

Legközelebb, menjünk definiálja a domain modellünket a Vers osztály:

public class Vers: {private String title; magánhúr-szerző; privát húr test; }

Hozzáadhatjuk a isValidPoem () statikus módszer a mi Vers osztály segít ellenőrizni, hogy a mezők nem engedélyeznek-e üres karakterláncokat:

public static boolean isValidPoem (Versvers) {return vers! = null && Strings.isNotBlank (poem.getAuthor ()) && Strings.isNotBlank (poem.getBody ()) && Strings.isNotBlank (poem.getTitle ()); }

3.3. Űrlap létrehozása

Most készen állunk a beküldési űrlap létrehozására. Azért, szükségünk van egy végpontra / vers / beküldés amely kiszolgál egy GET kérést az űrlap megjelenítéséhez a felhasználónak:

@GetMapping ("/ vers / benyújtás") public String submuget (modellmodell) {model.addAttribute ("vers", új vers ()); return "beküldés"; }

Itt egy modellt használtunk konténerként a felhasználó által megadott versspecifikus adatok tárolására. Sőt, a submitGet metódus a Beküldés Kilátás.

Ezenkívül a POST űrlapot össze akarjuk kötni a modell attribútummal vers:

3.4. Feladás / átirányítás / beküldési folyamat beolvasása

Most engedélyezzük a POST műveletet az űrlaphoz. Ehhez létrehozzuk a / vers / beküldés végpont a Vers benyújtása vezérlő a POST kérés kiszolgálására:

@PostMapping ("/ vers / beküldés") public RedirectView submitPost (HttpServletRequest kérés, @ModelAttribute Vers, RedirectAttributes redirectAttributes) {if (Poem.isValidPoem (vers)) {redirectAttributes.addFlashAttribute ("vers") return new RedirectView ("/ vers / siker", igaz); } else {return new RedirectView ("/ vers / beküldés", igaz); }}

Ezt észrevehetjük ha a benyújtás sikeres, akkor az ellenőrzési transzferek a / vers / siker végpont. Az átirányítás megkezdése előtt felvettük a vers adatait flash attribútumként.

Most meg kell jelenítenünk egy megerősítő oldalt a felhasználó számára, ezért valósítsuk meg a / vers / siker a GET kérést kiszolgáló végpont:

@GetMapping ("/ vers / siker") public String getSuccess (HttpServletRequest kérés) {Map inputFlashMap = RequestContextUtils.getInputFlashMap (kérelem); if (inputFlashMap! = null) {Versvers = (Vers) inputFlashMap.get ("vers"); visszatér a "siker"; } else {return "redirect: / vers / beküldés"; }}

Fontos itt megjegyezni, hogy mi érvényesíteni kell a FlashMap mielőtt úgy döntünk, hogy átirányítunk a sikeroldalra.

Végül használjuk a flash attribútumot vers a sikeroldalunkon a felhasználó által beküldött vers címének megjelenítéséhez:

Kattintson ide további beküldéshez.

4. Következtetés

Ebben az oktatóanyagban megtanultunk néhány fogalmat a Post / Redirect / Get pattern és a flash attribútumok körül. Flash-attribútumokat is láttunk működés közben, egyszerű űrlapküldéssel a Spring Boot webalkalmazásban.

Mint mindig, az oktatóanyag teljes forráskódja elérhető a GitHubon.