Frage

I statische Klassen in Servlet machen, sind diese Klassen-Controller für Web-Seiten. Anfragen werden an Steuerungen durch die Steuerung URLs umgeleitet, die in statischen HashMap sind, dass alle Controller enthält. Gibt es posibilities dass Benutzer / session realted Sachen mit anderen Nutzern Sitzungen messsed bis bekommen? Ich werde sparen natürlich alle sitzungsbezogene Daten zu Http und Anforderung, Antwort und Http Objekte werden gegeben, um die Steuerung, wenn Controller-Request-Handler aufgerufen wird.

UPDATE:

Hier ist Beispiel:

public class MainControllerServlet extends HttpServlet {
static HashMap<String, ControllerAbstract> controllers = new HashMap<String, ControllerAbstract>();

    public MainControllerServlet()
    {
        controllers.put("url", new Controller());
    }

}

ControllerAbstract:

public abstract class ControllerAbstract {
    private String url;
    private HashMap<String, ControllerAbstract> children = new HashMap<String, ControllerAbstract>();

    public abstract void handleRequest(HttpServletRequest request, HttpServletResponse response, SessionBean session, String type) throws Exception;

}
War es hilfreich?

Lösung

Es sieht aus dem Code wie Sie eine statische hashmap verwenden, nicht statische Klassen, so dass Sie die Karte zwischen allen Benutzern zu teilen. Es gibt ein paar Probleme, die ich mit diesem sehen -

  • Ihre Karte ist nicht Thread sicher, was bei Konflikten zwischen Objekterstellung und dem Abruf ein Problem sein könnte. die möglichen Austausch / Threadingprobleme gegeben, wo sonst werden Sie Objekte in die Karte setzen?
  • Ihre ControllerAbstract Objekte haben Zustand, und Sie können in eine Situation kommen, wo mehrere Anforderungen den gleichen Controller verwenden. Zum Beispiel fügt alle Anforderungen an die Kinder hashmap in ihren eigenen ControllerAbstract Objekte? Sie könnten mehrere Anfragen haben die gleiche ControllerAbstract mit - z.B. wenn Anfrage 1 will hinzufügen oder löschen, um es ControllerAbstract.children Karte während Anfrage 2 Referenzierung das gleiche Objekt entscheidet, dass es durch die Kinder zu durchlaufen braucht es eine ConcurrentModificationException erhalten.
  • Servlets Konstruktion wird vom Container verwaltet. Wenn Sie vorhaben, die URL zu haben, hart zu codieren, um es in der Servlet-Konstruktor hat vorhanden ist, ist es nur ein konstanter String? Wenn ja, wäre es nicht einfacher, nur um es zu erklären, als eine Konstante im ControllerAbstract Objekt? Wenn nicht, wo kommt es her? Auf jeden Fall, was Ihr tut die Karte von Controllern zu verändern, wenn der Behälter entscheidet es ein neues Servlet erstellen muss.

Andere Tipps

Sie meinen Statische Referenzen? es gibt nicht so etwas wie statische Klassen, es sei denn, sie innere Klassen sind, aber sie nicht statisches Verhalten haben. Wenn Sie statische Referenzen als Controller verwenden, müssen Sie kümmern sich um alle atributes in diesen Controllern.

Statische innere Klassen sind eine Alternative zu normalen Klassen in einem anderen Paket. So müssen Sie sich keine Sorgen über sie mit Ihrem Servletklassen verwechselt zu werden.

Da Sie die .handleRequest() Methoden als Folge der Servlet-Anrufe aufrufen, müssen Sie stellen Sie sicher, , dass die Umsetzung Ihrer Controller ist einspringenden . D. h deren Ausführung sollten Sie als Argumente übergeben nicht verwenden variable Speicher außer dem Stapel und die Objekte.

Das heißt, ich würde entscheiden außerhalb des Pakets der Controller in ihrem eigenen Paket zu setzen, die Ihre Servlets enthalten. Sie können dann eine Manager-Klasse hinzufügen, die besitzt und initialisiert die Karte und verarbeitet Anrufe von Servlets (abstrahiert die Details der Implementierung.)

Soweit ich eine statische Klasse erinnern kann nichts anderes als eine verschachtelte Klasse ist. Also ich sehe nicht, warum es als eine normale öffentliche Klasse anders sein sollte.

Static innere Klassen verhalten sich genau wie normale Klassen, sie haben nur einen zusätzlichen Spielraum. Das heißt, wenn Sie Zustand zwischen den Klassen teilen sich durch Verwendung von statischen Variablen in der äußeren Klasse dann zu Problemen führen könnte. Vorausgesetzt, dass Sie gesagt haben, dass Sie nur die Http Objekt verwenden Anrufungen passieren Daten zwischen dann wird dies kein Problem für Sie sein.

Was Sie tun, sieht ok für mich. So stellen Sie sicher, dass Sie nicht speichern alles in Membervariablen in der Controller-Implementierungen. Ich bin auch nur vorausgesetzt, Sie Objekte in die Controller-Karte bei Servlet instantiieren Zeit setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top