Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()

73

Nach meinem bisherigen Verständnis können wir bei unserer Controller-Anforderungszuordnungsmethode den Parameter RedirectAttributes angeben und ihn mit Attributen füllen, wenn die Anforderung umgeleitet wird.

Beispiel :

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

   // ...

   return "redirect:/somewhere";
}

Die Umleitungsattribute sind dann auf der Zielseite verfügbar, auf die sie umleiten.

Die RedirectAttributes- Klasse verfügt jedoch über zwei Methoden:

Ich habe die Spring-Dokumentation schon eine Weile gelesen, aber ich bin ein bisschen verloren. Was ist der grundlegende Unterschied zwischen diesen beiden und wie soll ich mich für einen entscheiden?

Gerrytan
quelle

Antworten:

101

Hier ist der Unterschied :

  • addFlashAttribute()speichert die Attribute tatsächlich in einer Flashmap (die intern in den Benutzern verwaltet sessionund entfernt wird, sobald die nächste umgeleitete Anforderung erfüllt ist)

  • addAttribute()Konstruiert im Wesentlichen Anforderungsparameter aus Ihren Attributen und leitet mit den Anforderungsparametern zur gewünschten Seite weiter.

Der Vorteil von addFlashAttribute()wird also sein, dass Sie so ziemlich jedes Objekt in Ihrem Flash-Attribut speichern können (da es überhaupt nicht in Anforderungsparameter serialisiert, sondern als Objekt verwaltet wird), während mit, addAttribute()da das hinzugefügte Objekt in ein normales Objekt umgewandelt wird Anforderungsparameter, Sie sind ziemlich auf die Objekttypen wie Stringoder Grundelemente beschränkt .

Biju Kunjummen
quelle
8
Hallo. Ich habe eine Frage: Hat RedirectAttributes Auswirkungen auf das SessionAttribute?
Muthu
Ist es möglich, das Überschreiben von Umleitungsattributen durch Abfrageparameter zu verweigern? Ist diese Funktion standardmäßig implementiert?
Vdenotaris
Warum hat die addAttribute-Methode eine Signatur (String, Object)?
gstackoverflow
Gute Erklärung: Wenn Sie 'addAttribute' verwenden, finden Sie den Parameter unter der Adresse des Browsers.
Nathan
17

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. Wenn Sie also die Modellobjektwerte freigeben möchten, müssen Sie dies im ersten Controller angeben

addFlashAttribute("modelkey", "modelvalue");

Das Modell des zweiten Controllers enthält nun das obige Schlüsselwertpaar.

Zweite Frage ? Was ist der Unterschied zwischen addAttributeund addFlashAttributein der RedirectAttributesKlasse ?

addAttributeÜbergibt die Werte als Anforderungsparameter anstelle des Modells. Wenn Sie also einige mit hinzufügen, können addAttributeSie über auf diese Werte zugreifenrequest.getParameter

Hier ist der Code. Ich habe 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";
}
JavaLearner
quelle
7

Javadoc-Beschreibung: "Eine FlashMap bietet eine Möglichkeit für eine Anforderung, Attribute zu speichern, die zur Verwendung in einer anderen bestimmt sind. Dies wird am häufigsten benötigt, wenn von einer URL zu einer anderen umgeleitet wird - z. B. das Post / Redirect / Get-Muster. Eine FlashMap wird vor dem gespeichert Weiterleitung (normalerweise in der Sitzung) und wird nach der Umleitung verfügbar gemacht und sofort entfernt. "

scb
quelle