2 Stimmen

Ist das Setzen von Objekten in der Sitzung, die bereits existieren, in einer Java-Webanwendung sinnvoll?

In unserer Java-Webanwendung, die Struts 1 verwendet, haben wir eine Menge Code, der im Wesentlichen dies tut:

HttpSession session = httpServletRequest.getSession();
MyObject myObject = session.getAttribute(MY_OBJECT_KEY);

//code that mutates myObject - setting properties or whatever

session.setAttribute(MY_OBJECT_KEY, myObject);

Meine Frage: Ist die letzte Zeile, session.setAttribute(..), notwendig? Sie erscheint mir sinnlos - 'myObject' und 'session.getAttribute(..)' beziehen sich doch auf dieselbe Stelle im Speicher, oder? Es sollte also nicht erforderlich sein, das Attribut in der Sitzung neu zu setzen? Gibt es etwas, was ich nicht weiß? Das Objekt implementiert nicht HttpSessionBindingListener, die in der Dokumentation erwähnt wird.

Ich habe das Gefühl, dass ich das noch einmal überprüfen muss, weil das überall in dieser Anwendung gemacht wird, und ich möchte auf keinen Fall etwas kaputt machen, nur weil ich den Code bereinige. Danke

1voto

hvgotcodes Punkte 114342

Es kommt darauf an, was Sie mit "mutieren" meinen. Wenn "mutieren" in diesem Zusammenhang bedeutet, dass Sie Eigenschaften geändert haben, aber nicht die Instanz, dann nein, Sie müssen nicht setAttribute am Ende.

myObject es un Referenz auf das zugrunde liegende Objekt. Die Sitzung hat ihren eigenen Verweis. Beide verweisen auf dasselbe zugrundeliegende Objekt, so dass Sie die Eigenschaften derselben Instanz ändern würden.

Wenn Sie nun

myObject = new MYObject();

DANN müssen Sie das neue Objekt an die Sitzung übergeben. In diesem Fall ist Ihre Referenz myObject verweist nun auf eine andere Instanz als die Referenz der Sitzung.

Hinweis: Warum nicht einen Einheitstest schreiben und ihn testen?

0voto

svaratech Punkte 241

@emulcahy, Ich weiß, dies ist ein alter Beitrag. Ich bin gerade darüber gestolpert, als ich über Servlet-Listener recherchiert habe. Haben Sie den Grund für diese "überflüssigen" setAttribute herausgefunden?

Ich frage mich, ob sie hinzugefügt wurden, um Ereignisse in Servlet-Listenern auszulösen. Sie sollten prüfen, ob es Objekte gibt, die HttpSessionAttributeListener oder HttpSessionBindingListener implementieren. Sie können verwendet werden, um Informationen in diesen Sitzungsvariablen zu protokollieren. Nur ein Gedanke. Wenn Sie Ihr Problem bereits gelöst haben, ignorieren Sie bitte diese Nachricht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X