Vermeiden von multiplen Threads bei refresh

Status
Nicht offen für weitere Antworten.

aldi15

Mitglied
Hallo miteinander,
ich habe folgendes Problem: in einer JSP-Seite deklariere (und initialisiere) ich eine sessionweite Variable auf die ich auch von anderen JSPs aus Zugriff habe mit:
Code:
session.setAttribute("MyClient", new ClientMainClass(SessionID));
Wenn ich nun irgendeine Aktion starte wie zB. ein Formular auslesen (request abschicken) etc. wird die ganze Seite refreshed. Damit wird leider diese Anweisung neu ausgeführt und ein neues Objekt erzeugt. Dies führt zu multiplen Objekten und damit zu multiplen Threads, die sich im Laufe der Anwendung gegenseitig in die Quere kommen (lesen und schreiben eine Datei gleichzeitig). In einem normalen Javaprogramm hätte ich die Variable wahrscheinlich als final deklariert, dann wäre es egal, wie oft der Code ausgeführt wird, aber hier? Wie kann ich es schaffen, daß beim Starten einer neuen Session nur einmal ein Objekt erzeugt wird und danach nicht mehr (auch nicht bei einem refresh)?
Danke und bis dann
Albrecht
 
M

maki

Gast
Frage doch ab, ob das Attribut schon da ist, bevordu es nochmal setzt.

Die SessionID manual zu setzen und zu verwenden birgt Risiken und verursacht Aufwand, was passiert zB. bei einem Timeout???

Abgesehen davon bekommst du die Session über das request Objekt:

Code:
request.getSession();
bzw.
Code:
request.getSession(boolean);

Ich hab manchmal das Gefühl, Leute lesen sich nicht in die Themen ein sondern probieren einfach mal wild darauf los...

Nachtrag: Sehe gerade dass du die Session nicht in ein Attribut setzt, mein Fehler, nix für ungut ;)
Ansonsten solltest du trotzdem abfragen ob das Attribut schon gesetzt ist bevor du es setzt.
 
G

Guest

Gast
Gar nichts passiert bei einem Timeout, denn ich setzte die SessionID nicht manuell (es ist nicht immer alles so, wie es auf den ersten Blick scheint :wink: ). Ich benutze hier nur die Session als unique identifier, und verwende sie weiter als Dateiname. Ich hätte mir auch sonstwie einen GUID beschaffen können, aber das schien mir der einfachste Weg. ClientMainClass ist hier nur eine normale java-Klasse kein Servlet.
Zu deiner Antwort: Ich habe mir das auch schon überlegt. In einem normalen Programm hätte ich abgefragt, ob das Objekt Null ist. Aber ich kann hier doch nicht mit session.getAttribute vorab ein Objekt abfragen, das ich erst danach mit session.setAttribute anlege? das müsste einen Laufzeitfehler geben oder?
Gruß und Danke
Albrecht
 
M

maki

Gast
Zu deiner Antwort: Ich habe mir das auch schon überlegt. In einem normalen Programm hätte ich abgefragt, ob das Objekt Null ist. Aber ich kann hier doch nicht mit session.getAttribute vorab ein Objekt abfragen, das ich erst danach mit session.setAttribute anlege? das müsste einen Laufzeitfehler geben oder?
Doch das geht ;)
 

aldi15

Mitglied
Tatsächlich :D
Es scheint mir zwar nicht ganz logisch (weswegen ich es auch nicht vorab ausprobiert hab :wink: ) aber es geht! Super. Jetzt läuft alles stabil.
Danke
Albrecht
 
M

maki

Gast
Es scheint mir zwar nicht ganz logisch
Es ist logisch :)

session.getAttribute(key) sieht nach, ob es das Attribut schon gibt, wenn nicht, bekommst du null zurück, so wie bei einer Hashmap auch ;)
 

aldi15

Mitglied
:idea: Ja, jetzt ist es mir auch klar. Session besitzt als implizites Objekt die Map, in der eben alle mögl. Attribute eingetragen werden können und die sind lediglich Strings und damit abfragbar. Das heißt dann noch nicht, dass auch ein Objekt mit dem Namen erstellt sein muss. Aber wenn ein sessionweites Objekt erstellt wird, wird es eben auch durch die Methode sesson.setAttribute in die Map eingetragen.
Danke + bis dann
Albrecht
 
M

maki

Gast
Richtig.

Für die anderen "Scopes" (application, request, page) trifft dasselbe zu.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben