6

Ich versuche, Spring MVC vor kurzem zu lernen. Es scheint, dass ich die Funktionen von @ModelAttribute Annotation und HttpSession nicht gut verstanden habe.Spring MVC - Unterschied zwischen HttpSession.setAttribute und model.addObject

ShoppingCart und Anzahl sind die Sitzungsattribute.

Das Problem ist in der DeleteFromCart-Methode. Ich bekomme die Anzahl von Sitzung, neu zuweisen es und überschreiben es in Sitzung. Aber ich kann nicht den aktualisierten Wert von count auf Jsp sehen. Das aktualisierte shoppingCart-Objekt kann jedoch aktualisiert angezeigt werden, obwohl ich das Sitzungsobjekt nicht überschreibe (da das Objekt dasselbe Objekt ist, das bereits in Sitzung ist).

Aber warum ist die Zählung nicht aktualisiert, obwohl ich es mit session.setAttribute überschreibe? Wenn ich dem Modell das neue count-Objekt hinzufüge (model.addObject ("count", count)), kann ich den aktualisierten Wert von count sehen. Warum liefert session.setAttribute nicht das gleiche Ergebnis?

Antwort

10

Zunächst muss @SessionAttribute nicht die http-Sitzung verwenden. Es verwendet eine SessionAttributeStore, die alles als Hintergrundspeicher haben kann. Nur die Standardimplementierung verwendet die http-Sitzung.

Der Grund, warum Ihr Code nicht wie erwartet funktioniert, liegt darin, wie @SessionAttribute funktioniert.

Bevor eine Controller-Methode aufgerufen wird, in @SessionAttributes aufgeführt alles, in Ihrem Fall {"warenkorb", "count"} wird aus der Sitzung gelesen und zu dem Modell hinzugefügt.

Nachdem die Methode zurückgegeben wurde, wird die Sitzung mit allem aktualisiert, was dem Modell innerhalb der Methode hinzugefügt wurde.

.addObject("count", count) 

-> Anzahl wird dem Modell und anschließend zu der Sitzung hinzugefügt.

session.setAttribute("count", count) 

-> Anzahl wird zur Sitzung hinzugefügt, aber nicht zum Modell. Es wird dem Modell vor dem nächsten Aufruf einer beliebigen Controller-Methode hinzugefügt. Aber bis jetzt hat das Modell noch das alte count. Und das Modell wird zu der Anfrage hinzugefügt. Und wenn ein Attribut im Anforderungsumfang gefunden werden kann, interessiert sich das JSP nicht dafür, was in der Sitzung ist.

Wenn Sie @SessionAttributes und @ModelAttribute (oder Spring MVC im Allgemeinen) verwenden dann vermeiden HttpSession oder HttpRequest verwenden. Sogar HttpResponse ist von begrenzter Verwendung. Umarmen Sie die Schönheit von Spring MVC stattdessen :)

+0

Also im Grunde genommen; Bevor eine Controller-Methode aufgerufen wird, aktualisiert die Sitzung das Modell. Nach der Methode aktualisiert das Modell die Sitzung. Der einzige Moment, in dem das gleiche Attribut, das sowohl in Session als auch in Model enthalten ist, verschiedene Werte haben kann, ist in der Controller-Methode. Vielen Dank. – akcasoy

2

model.addObject setzt das Objekt in den Anforderungsbereich, während HTTPsession.setAttribute es in den Sitzungsbereich versetzt. Und da Variablen auf jsp in der nächsten Reihenfolge aufgelöst werden: Seitenumfang -> Anfragebereich -> Sitzungsumfang -> Anwendungsumfang, bekommen Sie, was Sie bekommen.

+0

Aber ich habe beide Attribute als Sitzungsattribute oben mit @SessionAttributes ({"warenkorb", "count"}) definiert. Wenn ich die Attributanzahl mit session.setAttribute ("count", count) überschreibe, sollte es nicht das Attribut mit dem Sitzungsumfang ändern? vielleicht hätte ich die frage nicht als "den unterschied zwischen setAttribute und addObject" schreiben sollen, sondern den unterschied zwischen 2 sitzungsobjekten in der deleteFromBasket-methode, die beide auf unterschiedliche weise resultieren (warenkorb ist update, count ist immer noch das alte count-objekt) . – akcasoy

+0

Fuh, endlich gelöst .. Ändern Sie Ihre Methodensignatur in 'public ModelAndView deleteFromBasket (@PathVariable Integer Position, @ModelAttribute (" warenkorb ") Liste warenkorb, @ModelAttribute (" count ") Ganzzahl, ModelMap modelMap)' und to setze das Attribut in der Sitzung do: 'modelMap.addAttribute (" count ", --count);' – Patison

+0

ja, und ich habe diese Seite nicht aktualisiert :) – Patison

0

Java-Methode Parameter werden von Werten übergeben. Sie können diesem Parameterkandidaten alles zuweisen, was Sie in der Methode wünschen, aber es wird keinen Effekt außerhalb davon haben.Wenn man die Methode mit der Kopie des Parameters in Betracht zieht

Verwandte Themen