Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()

La mia comprensione finora è sul nostro metodo di mapping delle richieste del controllore, possiamo specificare il parametro RedirectAttributes e popolarlo con gli attributi per quando la richiesta viene reindirizzata.

Esempio :

@RequestMapping(value="/hello", method=GET) public String hello(RedirectAttributes redirAttr) { // should I use redirAttr.addAttribute() or redirAttr.addFlashAttribute() here ? // ... return "redirect:/somewhere"; } 

Gli attributi di reindirizzamento saranno quindi disponibili nella pagina di destinazione a cui viene reindirizzato.

Tuttavia la class RedirectAttributes ha due metodi:

  • addAttribute()
  • addFlashAttribute()

Ho letto la documentazione di Spring per un po ‘ma sono un po’ persa. Qual è la differenza fondamentale tra questi due e come dovrei scegliere quale usare?

Ecco la differenza :

  • addFlashAttribute() memorizza effettivamente gli attributi in una flashmap (che viene mantenuta internamente nella session degli utenti e rimossa una volta soddisfatta la prossima richiesta reindirizzata)

  • addAttribute() costruisce essenzialmente i parametri di richiesta dagli attributi e reindirizza alla pagina desiderata con i parametri di richiesta.

Quindi il vantaggio di addFlashAttribute() sarà che puoi memorizzare praticamente qualsiasi object nel tuo attributo flash (dato che non è serializzato in alcun parametro di richiesta, ma mantenuto come object), mentre con addAttribute() dall’object che tu aggiungi viene trasformato in un parametro di richiesta normale, sei piuttosto limitato ai tipi di object come String o primitivi.

Supponiamo di avere 2 controller. Se si effettua il reindirizzamento da un controller a un altro controller, i valori nell’object modello non saranno disponibili nell’altro controller. Quindi se vuoi condividere i valori degli oggetti del modello devi dire nel primo controller

 addFlashAttribute("modelkey", "modelvalue"); 

Quindi il modello del secondo controllore contiene ora la coppia di valori chiave sopra ..

Seconda domanda? Qual è la differenza tra addAttribute e addFlashAttribute nella class RedirectAttributes

addAttribute passerà i valori come requestparameters invece di model, quindi quando aggiungi alcuni usando addAttribute puoi accedere a quei valori da request.getParameter

Ecco il codice. Ho usato per scoprire cosa sta succedendo:

 @RequestMapping(value = "/rm1", method = RequestMethod.POST) public String rm1(Model model,RedirectAttributes rm) { System.out.println("Entered rm1 method "); rm.addFlashAttribute("modelkey", "modelvalue"); rm.addAttribute("nonflash", "nonflashvalue"); model.addAttribute("modelkey", "modelvalue"); return "redirect:/rm2.htm"; } @RequestMapping(value = "/rm2", method = RequestMethod.GET) public String rm2(Model model,HttpServletRequest request) { System.out.println("Entered rm2 method "); Map md = model.asMap(); for (Object modelKey : md.keySet()) { Object modelValue = md.get(modelKey); System.out.println(modelKey + " -- " + modelValue); } System.out.println("=== Request data ==="); java.util.Enumeration reqEnum = request.getParameterNames(); while (reqEnum.hasMoreElements()) { String s = reqEnum.nextElement(); System.out.println(s); System.out.println("==" + request.getParameter(s)); } return "controller2output"; } 

Descrizione Javadoc: “FlashMap fornisce un modo per una richiesta di memorizzare gli attributi destinati all’uso in un altro, che è più comunemente necessario quando si reindirizza da un URL a un altro, ad esempio il modello Post / Redirect / Get. Una FlashMap viene salvata prima del redirect (tipicamente nella sessione) e viene reso disponibile dopo il reindirizzamento e rimosso immediatamente. ”