kennst du das Buch Refactoring von Martin Fowler?
http://www.amazon.de/exec/obidos/AS…3373574-9602464
darin gibt es einen Katalog wie man das Design verbessern kann
immer in kleinsten Schritten, bis man zum gewünschten Ergebnis kommt
diesen Ansatz find ich ziemlich gut
servlet informationen
-
-
Zitat von KeinWunder
kennst du das Buch Refactoring von Martin Fowler?
http://www.amazon.de/exec/obidos/AS…3373574-9602464
darin gibt es einen Katalog wie man das Design verbessern kann
immer in kleinsten Schritten, bis man zum gewünschten Ergebnis kommt
diesen Ansatz find ich ziemlich gut
hmmm ... nope, kenn ich nicht. Hört sich aber ganz interessant an. Sind da auch ansätze für servletbasierte Architekturen drinnen? Ich werd mal schauen, ob das in der Firma vielleicht in der Bibliothek verfügbar ist. Ansonst können wir das vielleicht bestellen ... das Buch kriegt man nicht zufällig auch als Onlineausgabe? -
is eher allgemein gehalten, also nix spezielles für Servlet-basierte Anwendungen, aber ich denke es wird dir trotzdem weiter helfen
E-Book hab ich gefunden:
http://files.nixp.ru/books/programm…ting%20Code.pdf -
Zitat von KeinWunder
is eher allgemein gehalten, also nix spezielles für Servlet-basierte Anwendungen, aber ich denke es wird dir trotzdem weiter helfen
E-Book hab ich gefunden:
http://files.nixp.ru/books/programm…ting%20Code.pdf
danke. Ich werd morgen mal genauer reinschauen. -
Zitat von Usher
Wenn jetzt also während eines Requests (d.h. UserA fordert eine Seite an, und bekommt sie geliefert) ein anderer Request ebenfalls eintrifft (zeitgleich fordert UserB eine Seite an), kann folgendes passieren:
1) UserA speichert Session-Daten (oder Request-Daten, was auch immer) in statischer Variable
2) UserB speichert Session-Daten in derselben statischen Variable (Wert wird überschrieben)
3) noch während des Requests von UserA wird der Wert der stat. Var. irgendwo im Programm ausgelesen (d.h. UserA sieht die Session von UserB)
4) UserB sieht ebenfalls UserB's Session
Punkt 3 = fatal.
ich hab versucht mich in den letzten paar Tagen noch weiter mit dem Problem, dass sich die Servlet-Threads gegenseitig die Informationen überschreiben, auseinander zu setzen.Auf der Suche nach einem eindeutigen key für jeden Servlet-Request, bin ich auf die Idee gekommen, dass ja jedes Servlet in einem eigenen Thread abgearbeitet wird. Eigener Thread = Name (ID) des Threads.
Und so funktioniert's:
-) Servlet ruft den SessionHandler auf[INDENT]-) key wird anhand der ID (Name) des Threads generiert, der das Servlet ausführt[/INDENT]
-) Servlet setzt request für seinen key
-) die Postparameter werden verarbeitet
[INDENT]-) ein beliebiges Objekt erstellt neuen SessionHandler
[INDENT]-) key ist gleich, da Objekt im gleichen Thread läuft wie das Servlet[/INDENT]
-) das Objekt holt sich request (Session)[/INDENT]
-) nach der Abarbeitung der Postparameter löscht das Servlet seinen gespeicherten Request
[INDENT]-) der Request wird ja nicht mehr gebraucht
-) damit ist eine Art garbage collection gegeben[/INDENT]Aufpassen muss man natürlich, dass die Objekte, die diese Funktionalität nutzen direkt im Servlet-Thread laufen.
Was haltet Ihr davon? Anbei ist der Code des SessionHandlers:
Java
Alles anzeigenimport java.util.*; import java.lang.*; import javax.servlet.http.*; public class SessionHandler { private static HashMap sessions = new HashMap(); private String key; public SessionHandler() { /* * get the Name of the currently executing thread */ try { Thread thisThread = Thread.currentThread(); key = thisThread.getName(); } catch (Exception e) { e.printStackTrace(); } } /** * store the request for the client * @param request HttpServletRequest */ public void setRequest(HttpServletRequest request) { /* * check whether the key already exists */ if (sessions.containsKey(key)) { printDebug("renewing", "request"); System.out.println("[sessionHandler] ERROR: can not overwrite key: "+ key); } else { printDebug("adding", "request"); } sessions.put(key, request); } /** * removes the thread which calls this method from the session vars */ public void removeRequest() { printDebug("removing", "request"); sessions.remove(key); } /** * returns the IP address of the client of the current user * @return String */ public String getClientAddress() { String ipAddress = ""; if (sessions.containsKey(key)) { HttpServletRequest request = (HttpServletRequest) sessions.get(key); ipAddress = request.getRemoteAddr(); printDebug("returning", "ipAddress: "+ipAddress); } else { System.out.println("[sessionHandler] ERROR: key "+ key + " not found to return ipAddress."); } return ipAddress; } /** * return the active session for the current user * @return HttpSession */ public HttpSession getSession() { if (sessions.containsKey(key)) { printDebug("returning", "session"); HttpServletRequest request = (HttpServletRequest) sessions.get(key); return request.getSession(true); } else { System.out.println("[sessionHandler] ERROR: key "+ key + " not found to return session."); } return null; } private void printDebug(String action, String what) { System.out.println("[sessionHandler] " + action + " " + what + " for key: "+ key); } }
-
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!