2013-01-22 9 views
49

Mein bisheriges Verständnis ist auf unserer Controller-Anfrage-Mapping-Methode können wir RedirectAttributes Parameter angeben und füllen Sie es mit Attributen für wenn die Anfrage umgeleitet wird.Spring RedirectAttributes: addAttribute() vs addFlashAttribute()

Beispiel:

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

    // ... 

    return "redirect:/somewhere"; 
} 

Die Umleitungs-Attribute werden dann auf der Zielseite vorhanden sein, wo es zu Umleitungen.

jedoch RedirectAttributes Klasse verfügt über zwei Methoden:

schon seit einer Weile Frühling Dokumentation zu lesen, aber ich bin ein wenig verloren. Was ist die grundlegende Unterschied zwischen diesen beiden, und wie soll ich wählen, welche zu verwenden? Hier

Antwort

74

ist der Unterschied:

  • addFlashAttribute() tatsächlich speichert die Attribute in einem flashmap (die intern in dem Benutzer gehalten wird session und entfernt sobald die nächste umgeleiteten Anforderung erfüllt wird)

  • addAttribute() im Wesentlichen konstruiert Anfrage Parameter aus Ihre Attribute und leitet auf die gewünschte Seite mit der Anfrage Parameter um.

So ist der Vorteil von addFlashAttribute() wird sein, dass Sie in Ihrem Flash-Attribute so ziemlich jedes Objekt speichern können (da es nicht in Anforderung serialisiert wird überhaupt params, sondern als Objekt gehalten wird), während mit addAttribute() da das Objekt, das Sie hinzufügen, in einen normalen Anfrageparameter transformiert wird, sind Sie ziemlich auf die Objekttypen wie String oder Primitive beschränkt.

+5

Hallo. Ich habe eine Frage ist RedirectAttributes beeinflusst das SessionAttribute? – muthu

+0

Kann die Überschreibung von Umleitungsattributen über Abfrageparameter verweigert werden? Ist diese Funktion als Standard implementiert? – vdenotaris

+0

Warum hat die addAttribute-Methode eine Signatur (String, Object)? – gstackoverflow

5

Javadoc description: „A FlashMap bietet eine Möglichkeit für eine Anforderung Attribute in einer anderen Verwendung vorgesehen speichern Dies wird am häufigsten benötigt, wenn von einer URL in einer anderen Umleitung -.. ZB die Post/Redirect/Get Muster A FlashMap ist vor der Weiterleitung gespeichert (normalerweise in der Sitzung) und nach der Weiterleitung verfügbar gemacht und sofort entfernt wird. "

9

Angenommen, Sie haben 2 Controller.Wenn Sie von einem Controller zu einem anderen Controller umleiten, sind die Werte im Modellobjekt im anderen Controller nicht verfügbar.Also, wenn Sie das Modell Objektwert dann muss man sagen, in ersten Controller

addFlashAttribute("modelkey", "modelvalue"); 

Dann zweite Controller Modell enthält nun das oben genannte Schlüssel-Wert Paar ..

Zweite Frage teilen mögen? Was ist der Unterschied zwischen addAttribute und addFlashAttribute in RedirectAttributes Klasse

addAttribute werden die Werte als requestparameters statt Modell übergeben, so dass, wenn Sie etwas mit addAttribute hinzufügen können Sie diese Werte von den request.getParameter

Hier gelangen die code.I haben verwendet, um herauszufinden, was los ist:

@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<String> reqEnum = request.getParameterNames(); 
    while (reqEnum.hasMoreElements()) { 
     String s = reqEnum.nextElement(); 
     System.out.println(s); 
     System.out.println("==" + request.getParameter(s)); 
    } 

    return "controller2output"; 
}