Sprievodca atribútmi Flash v jarnej webovej aplikácii

1. Prehľad

Webové aplikácie často závisia od vstupu používateľa, aby splnili niekoľko svojich prípadov použitia. Vo výsledku je odosielanie formulárov veľmi využívaným mechanizmom na zhromažďovanie a spracovanie údajov pre tieto aplikácie.

V tomto tutoriále sa dozvieme ako Jarné atribúty flash nám môžu pomôcť s pracovným tokom odosielania formulárov bezpečne a spoľahlivo.

2. Základy atribútov Flash

Predtým, ako budeme môcť pohodlne používať atribúty flash, je potrebné vybudovať si slušnú úroveň porozumenia pre pracovný tok odosielania formulárov a niekoľko kľúčových súvisiacich konceptov.

2.1. Odoslať / presmerovať / získať vzor

Naivným spôsobom, ako vytvoriť webový formulár, by bolo použiť jednu požiadavku HTTP POST, ktorá sa postará o odoslanie a vráti odpoveď prostredníctvom svojej odpovede. Takýto dizajn však vystavuje riziku duplicitného spracovania požiadaviek POST v prípade, že používateľ skončí s obnovovaním stránky.

Aby sme zmiernili problém duplicitného spracovania, môžeme vytvoriť pracovný tok ako postupnosť vzájomne prepojených požiadaviek v konkrétnom poradí - konkrétne POST, REDIRECT a GET. V skratke tomu hovoríme vzor Post / Redirect / Get (PRG) pre odoslanie formulára.

Po prijatí požiadavky POST ju server spracuje a potom prevedie riadenie, aby vytvoril požiadavku GET. Následne sa na základe odpovede na požiadavku GET zobrazí potvrdzovacia stránka. V ideálnom prípade, aj keď sa o poslednú požiadavku GET pokúsite viackrát, nemali by sa vyskytnúť žiadne nepriaznivé vedľajšie účinky.

2.2. Životný cyklus atribútov Flash

Na dokončenie odoslania formulára pomocou vzoru PRG budeme musieť po presmerovaní preniesť informácie z pôvodnej žiadosti POST do konečnej žiadosti GET.

Bohužiaľ nemôžeme použiť Atribúty požiadavky ani Atribúty relácie. Je to preto, že prvý z nich neprežije presmerovanie medzi rôznymi radičmi, zatiaľ čo druhý bude trvať celú reláciu aj po ukončení odosielania formulárov.

Nemusíme sa však báť, pretože webový rámec spoločnosti Spring poskytuje atribúty flash, ktoré môžu vyriešiť tento presný problém.

Pozrime sa na metódy v RedirectAttributes rozhranie, ktoré nám môže pomôcť použiť atribúty flash v našom projekte:

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

Atribúty Flash sú krátkodobé. Preto sú dočasne uložené v nejakom podkladovom úložisku, tesne pred presmerovaním. Po presmerovaní zostanú k dispozícii pre následnú žiadosť a potom sú preč.

2.3. FlashMap Dátová štruktúra

Jar poskytuje abstraktnú dátovú štruktúru s názvom FlashMap na ukladanie atribútov flash ako párov kľúč - hodnota.

Poďme sa pozrieť na definíciu FlashMap trieda:

public final class FlashMap extends HashMap implements Comparable {@Nullable private String targetRequestPath; súkromná konečná MultiValueMap targetRequestParams = nová LinkedMultiValueMap (4); private long expirationTime = -1; }

Môžeme si všimnúť, že FlashMap trieda dedí svoje správanie od HashMap trieda. Ako taký, a FlashMap inštancia môže uložiť mapovanie atribútov kľúč - hodnota. Tiež môžeme uviazať a FlashMap inštanciu použiť iba konkrétna adresa URL presmerovania.

Ďalej má každá žiadosť dve FlashMap inštancie, menovite Input FlashMap a výstup FlashMap, ktoré hrajú dôležitú úlohu vo vzore PRG:

  • Výkon FlashMap sa používa v požiadavke POST na dočasné uloženie atribútov flash a ich odoslanie na ďalšiu požiadavku GET po presmerovaní
  • Vstup FlashMap sa používa v konečnej požiadavke GET na prístup k atribútom flash iba na čítanie, ktoré boli odoslané predchádzajúcou požiadavkou POST pred presmerovaním

2.4. FlashMapManager a RequestContextUtils

Ako už názov napovedá, môžeme použiť FlashMapManager spravovať FlashMap inštancie.

Najprv sa pozrime na definíciu tohto strategického rozhrania:

verejné rozhranie FlashMapManager {@Nullable FlashMap retrieveAndUpdate (požiadavka HttpServletRequest, odpoveď HttpServletResponse); void saveOutputFlashMap (FlashMap flashMap, požiadavka HttpServletRequest, odpoveď HttpServletResponse); }

Zjednodušene sa to dá povedať FlashMapManager nám umožňuje čítať, aktualizovať a ukladať FlashMap inštancie v niektorých základných úložiskách.

Ďalej sa oboznámime s niekoľkými statické metódy dostupné v ESA RequestContextUtils abstraktná úžitková trieda.

Aby sme udržali naše zameranie v rozsahu tohto tutoriálu, obmedzíme naše pokrytie na metódy, ktoré sú relevantné pre atribúty flash:

verejná statická mapa getInputFlashMap (požiadavka HttpServletRequest); public static FlashMap getOutputFlashMap (požiadavka HttpServletRequest); public static FlashMapManager getFlashMapManager (požiadavka HttpServletRequest); public static void saveOutputFlashMap (umiestnenie reťazca, požiadavka HttpServletRequest, odpoveď HttpServletResponse);

Tieto metódy môžeme použiť na získanie vstupu / výstupu FlashMap inštancie, získajte FlashMapManager na požiadanie a uložte a FlashMap inštancia.

3. Prípad použitia odoslania formulára

Teraz sme dosiahli základné pochopenie rôznych konceptov okolo atribútov flash. Poďme teda ďalej a využime ich vo webovej aplikácii súťaže v poézii.

Naša aplikácia v súťaži poézie má jednoduchý prípad použitia na príjem básní od rôznych básnikov prostredníctvom zaslania formulára. Ďalej bude mať súťažný príspevok potrebné informácie týkajúce sa básne, ako napríklad názov, telo a meno autora.

3.1. Konfigurácia Thymeleaf

Budeme používať Thymeleaf, čo je šablónový modul Java na vytváranie dynamických webových stránok prostredníctvom jednoduchých šablón HTML.

Najprv musíme pridať spring-boot-starter-thymeleaf závislosť od nášho projektu pom.xml:

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

Ďalej môžeme definovať niektoré vlastnosti špecifické pre Thymeleaf v našom application.properties súbor nachádzajúci sa v src / main / resources adresár:

spring.thymeleaf.cache = false spring.thymeleaf.enabled = true spring.thymeleaf.prefix = cesta k triede: / templates / spring.thymeleaf.suffix = .html

Po definovaní týchto vlastností môžeme teraz vytvoriť všetky naše zobrazenia pod / src / main / resources / templates adresár. Jar zase pripojí .html koncovka pre všetky zobrazenia pomenované v našom ovládači.

3.2. Doménový model

Ďalej, poďme definovať náš doménový model v Báseň trieda:

public class Poem {private String title; súkromný autor reťazcov; súkromné ​​strunové telo; }

Ďalej môžeme pridať isValidPoem () statická metóda v našom Báseň trieda, ktorá nám pomôže overiť, či polia neumožňujú prázdne reťazce:

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

3.3. Vytvorte formulár

Teraz sme pripravení vytvoriť formulár na odoslanie. Pre to, potrebujeme koncový bod / báseň / odovzdať , ktorá obslúži žiadosť GET na zobrazenie formulára používateľovi:

@GetMapping ("/ báseň / odovzdať") verejné String submitGet (modelový model) {model.addAttribute ("báseň", nová báseň ()); vrátiť „predložiť“; }

Tu sme použili model ako kontajner na uchovávanie údajov špecifických pre báseň poskytnutých používateľom. Okrem toho submitGet metóda vracia pohľad obsluhovaný Predložiť vyhliadka.

Ďalej chceme viazať formulár POST s atribútom model báseň:

3.4. Prispievanie / presmerovanie / získanie toku podaní

Teraz povoľme akciu POST pre formulár. Aby sme to dosiahli, vytvoríme / báseň / odovzdať koncový bod v Báseň Podanie radič slúžiť požiadavke POST:

@PostMapping ("/ poem / submit") public RedirectView submitPost (požiadavka HttpServletRequest, @ModelAttribute báseň básne, RedirectAttributes redirectAttributes) {if (Poem.isValidPoem (báseň)) {redirectAttributes.addFlashAttribute ("poem", poem vrátiť nový RedirectView ("/ báseň / úspech", pravda); } else {vrátiť nový RedirectView ("/ báseň / odoslať", pravda); }}

Môžeme si to všimnúť ak je odoslanie úspešné, potom sa kontrolné prevody do / báseň / úspech koncový bod. Pred spustením presmerovania sme tiež pridali údaje o básni ako atribút flash.

Teraz musíme používateľovi zobraziť stránku s potvrdením, takže poďme implementovať funkcie pre / báseň / úspech koncový bod, ktorý bude slúžiť požiadavke GET:

@GetMapping ("/ báseň / úspech") public String getSuccess (požiadavka HttpServletRequest) {Map inputFlashMap = RequestContextUtils.getInputFlashMap (požiadavka); if (inputFlashMap! = null) {Báseň báseň = (Báseň) inputFlashMap.get ("báseň"); návrat "úspech"; } else {return "redirect: / poem / submit"; }}

Je dôležité si tu uvedomiť, že my je potrebné potvrdiť FlashMap než sa rozhodneme presmerovať na stránku s úspechom.

Na záver použijeme atribút flash báseň na našej stránke úspechu, aby sa zobrazil názov básne vloženej používateľom:

Kliknutím sem odošlete ďalšie.

4. Záver

V tomto tutoriáli sme sa naučili niekoľko konceptov okolo vzoru Post / Redirect / Get a flash atribútov. A tiež sme videli atribúty flash v akcii s jednoduchým odoslaním formulára do webovej aplikácie Spring Boot.

Kompletný zdrojový kód tutoriálu je ako vždy k dispozícii na GitHub.


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