servlet informationen

  • Hi Zusammen,

    ich hätte eine Frage - keines Javaprofis wie man gleich sehen wird. ;) Ich hab folgendes Konstrukt:

    Gibt es irgendeine Möglichkeit in der Funktion XYZ auf den Request (damit die Sessiondaten usw.) des Servlets zuzugreifen, das ursprünglich (aber nicht direkt) das ObjektB aufgerufen hat? Oder muss ich dazu immer den Request weitergeben? D.h.

    Code
    ...
    ObjectA a = new ObjectA(req);
    ...
    ObjectB b = new ObjectB(req);
    ...

    Wenn ich nämlich nicht zwei Klassen hab, sondern 50 mit einer Tiefe größeren Tiefe, dann wird das weitergeben ziemlich mühsam.

    Grüße, Maciek.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • so wie du es hier machst, musst du es immer übergeben

    etwas anderes wäre es wenn dein ObjectB von ObjectA abgeleitet ist und ObjectA von deiner Servletklasse abgeleitet ist, dann kannst du immer darauf zugreifen, wenn du den Request als Instanzvariable abspeicherst (Instanzvariable als protected deklarieren oder eine getMethode schreiben)

    Four stages of acceptance:
    1.) this is worthless nonsense
    2.) this is interesting, but perverse, point of view
    3.) this is true, but quite unimportant
    4.) I alwas said so
    J.B.S. Haldane

  • Zitat von KeinWunder

    so wie du es hier machst, musst du es immer übergeben

    etwas anderes wäre es wenn dein ObjectB von ObjectA abgeleitet ist und ObjectA von deiner Servletklasse abgeleitet ist, dann kannst du immer darauf zugreifen, wenn du den Request als Instanzvariable abspeicherst (Instanzvariable als protected deklarieren oder eine getMethode schreiben)


    mit der Lösung würde ich aber nur die Weitergabe von Parametern durch die Vererbung umgehen. Gibt es in Java keine Möglichkeit, das Objekt zu finden, das ursprünglich den Aufruf durchgeführt hat?

    Die Kette schaut ja so aus:
    Servlet -> ObjectA -> ObjectB

    Gibt es keine Möglichkeit diese Kette ausgehend vom ObjectB umzukehren? Ich hab in der Zwischenzeit folgendes Beispiel gefunden:

    Das liefert allerdings nur den Namen der Klasse zurück, was mich in dem Fall nicht wirklich glücklich macht.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • ich kenn eigentlich nichts dergleichen, auch nicht mit Reflection

    Four stages of acceptance:
    1.) this is worthless nonsense
    2.) this is interesting, but perverse, point of view
    3.) this is true, but quite unimportant
    4.) I alwas said so
    J.B.S. Haldane

  • Zitat von maciek

    Gibt es in Java keine Möglichkeit, das Objekt zu finden, das ursprünglich den Aufruf durchgeführt hat?

    Nein, denn das wuerde dem gedanken der modularitaet wiedersprechen: Du willst ja, das Objekte unabhaengig arbeiten, damit du sie ihn verschiedenen kontexten verwenden kannst. Wenn du den erzeuger doch merken willst, musst du das schon explizit machen:

    Noch als anmerkung: wenn du variablen wie ein request object ueber mehrere ebenen hinweg benoetigst, ist das meistens ein zeichen fuer einen fehler im design.

  • Zitat von a9bejo

    Nein, denn das wuerde dem gedanken der modularitaet wiedersprechen: Du willst ja, das Objekte unabhaengig arbeiten, damit du sie ihn verschiedenen kontexten verwenden kannst. Wenn du den erzeuger doch merken willst, musst du das schon explizit machen:


    ich hab mittlerweile eine andere Möglichkeit gefunden, wie man "globale" Variablen "dynamisch" definieren kann. Und zwar definiere ich mir in einer Klasse eine Variable als

    Code
    private static Test test;


    setze sie das erste Mal im doPost vom Servlet. Wenn ich dann im ObjectB eine weitere Instanz mache

    Code
    ... 
    Test test = new Test();
    value = Test->GetTest();


    hab ich den Wert, den ich im Servlet gesetzt habe. Falls Ihr Euch fragt, wozu ich diese Gehirnakrobatik aufführe: Ich möchte im ObjectB auf die Sessiondaten zugreifen können. Für die brauch in den Request und den krieg ich nur im Servlet.

    Zitat von a9bejo


    Noch als anmerkung: wenn du variablen wie ein request object ueber mehrere ebenen hinweg benoetigst, ist das meistens ein zeichen fuer einen fehler im design.


    das Design ist leider nicht von mir. Ich versuche gerade krampfhaft das Konfusum das mir mein Vorgänger in der Firma überlassen hat zu verstehen und möglicherweise umzuändern.

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Du hast einen schweren Denkfehler drinnen, wenn ich das richtig verstanden habe.
    Sobald 2 requests gleichzeitig eintreffen (eventuell von 2 verschiedenen Sessions) werden die Session-Daten gemixed, da Du eine static Variable zur Speicherung verwendest. Sämtliche requests greifen bei Dir auf dieselbe Variable zu.

  • Zitat von Usher

    Du hast einen schweren Denkfehler drinnen, wenn ich das richtig verstanden habe.
    Sobald 2 requests gleichzeitig eintreffen (eventuell von 2 verschiedenen Sessions) werden die Session-Daten gemixed, da Du eine static Variable zur Speicherung verwendest. Sämtliche requests greifen bei Dir auf dieselbe Variable zu.


    eben nicht. Die SessionIDs sind verschieden! Ich kann das zwar nicht 100% begründen, aber ich hab das einerseits über den Browser und andererseits über den JBuilder getestet: Ich kriege zwei verschiedene sessionIDs, die aber beim Reload der Seite jeweils gleich bleiben. :)

    *** Make it idiot proof, and someone will build a better idiot. ***

  • a) du rufst setTest() auf (und setzt damit den Wert einer statischen Variable)
    b) mit getTest() fragst Du diesen Wert innerhalb desselben Requests ab.

    Solange ein User einen Request, der nächste User dennächsten Request macht, geht das gut. Aber nicht, wenn die requests gleichzeitig eintreffen. (siehe mein obiges Posting).

  • Zitat von Usher

    a) du rufst setTest() auf (und setzt damit den Wert einer statischen Variable)
    b) mit getTest() fragst Du diesen Wert innerhalb desselben Requests ab.

    Solange ein User einen Request, der nächste User dennächsten Request macht, geht das gut. Aber nicht, wenn die requests gleichzeitig eintreffen. (siehe mein obiges Posting).


    erm ... soweit ich das richtig verstanden habe, wird bei einem Servlet pro Request ein Thread gestartet, richtig? D.h. Du meinst, die Sessions könnten durcheinanderkommen wenn

    1) UserA schickt Request ab -> sessionA
    2) UserB schickt Request ab -> sessionB
    3) UserA fordert an -> sessionB
    4) UserB fordert an -> sessionB

    richtig? Das wäre wirklich nicht optimal. Wie kann man das umgehen? Bzw. wie würdest Du es implementieren, dass ein Objekt, das kein Servlet ist, auf die Sessiondaten zugreifen kann?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • wie der Application Container das genau handhabt, weiß ich nicht - irgendwo wird sicherlich entweder ein vorher gestartetet Thread benutzt oder neu gestartet - ist aber unbedeutend.
    Relevant ist, dass dasselbe Servlet-Objekt beide Requests abarbeiten wird. Die Request-Objekte sind verschieden - das Servlet-Objekt gleich.

    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 würde das Session-Objekt ganz normal an das Objekt, das damit hantieren soll, als Parameter übergeben. Problem gelöst.

  • Zitat von Usher

    Ich würde das Session-Objekt ganz normal an das Objekt, das damit hantieren soll, als Parameter übergeben. Problem gelöst.


    aber genau das will ich vermeiden, denn da stimm ich mit a9bejo überein:

    Zitat von a9bejo

    Noch als anmerkung: wenn du variablen wie ein request object ueber mehrere ebenen hinweg benoetigst, ist das meistens ein zeichen fuer einen fehler im design.


    ich hab dann 50 Objekte, die verschiedenen Verkettungen von dem Servlet aufgerufen werden. Sagen wir dass 10 die Sessioninformationen wirklich benötigen ... die anderen 40 reichen sie nur für die 10 weiter. Das kann kein (zufriedenstellend) gutes Design sein, oder?

    Andere Frage: Was würde passieren wenn ich versuchen würde doGet und doPost synchronized zu machen? Oder geht dieser Gedanke völlig in die falsche Richtung?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Zitat von maciek


    Andere Frage: Was würde passieren wenn ich versuchen würde doGet und doPost synchronized zu machen? Oder geht dieser Gedanke völlig in die falsche Richtung?



    dann kann dein Servlet nur einen Request auf einmal abarbeiten
    ich glaub nicht, dass das eine gute Lösung für eine Webapplikation ist

    Four stages of acceptance:
    1.) this is worthless nonsense
    2.) this is interesting, but perverse, point of view
    3.) this is true, but quite unimportant
    4.) I alwas said so
    J.B.S. Haldane

  • Zitat von KeinWunder

    dann kann dein Servlet nur einen Request auf einmal abarbeiten
    ich glaub nicht, dass das eine gute Lösung für eine Webapplikation ist


    wahrscheinlich ist das wirklich nicht die beste. Allerdings kann ich mir nicht vorstellen, dass a) ich der erste bin, der so ein Problem hat und b) es nicht irgendwie eine sinnvolle Lösung für dieses Problem gibt. :rolleyes:

    Und wir sind uns glaub ich einig, dass weder die Lösung mit der ständigen Weitergabe des ServletRequest noch die andere mit der static-Variable optimale Lösungen sind, oder?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Zitat von Usher

    tja, das ist eine Frage des Designs, wie jemand schon zuvor richtig geschrieben hat.
    Da gibt's dieses "berühmte" Buch mit den 20 oder 25 wichtigsten Design-Patterns...ist sicher ein passendes dabei.
    Man müsste aber wie's aussieht, das ganze refactoren.


    ich hab mich ein bissi auf die Suche gemacht und folgenden Artikel gefunden. Das ist die Rede von einem "Request Accessor". Allerdings scheint der auch nicht die optimale Lösung zu sein ...

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Zitat von laborg

    Was genau willst du eigentlich machen? Bis jetzt kennen wir ja nicht das Problem sondern nur deinen ersten Versuch der Problemlösung...


    in der "Architektur", die vor mir liegt, gib es ein Servlet und ca. 50 Klassen, die in einem wirren Netzwerk vom Servlet aufgerufen werden um die Seiten aufzubauen. Dabei gibt es eine "interne Session" ("Blackboard"). Das Blackboard-Objekt wird immer weiter gegeben, damit auch das ObjektXY in der Tiefe 2-z auf die im Blackboard gespeicherten Informationen (Session, Requestparameter, usw.) zugreifen kann.

    Jetzt soll ich mit diesem Wirrwar, das mir wie gesagt von meinem Vorgänger überlassen wurde, weiterarbeiten. Ich hab mit Java-Webapplikationen nicht die größte Erfahrung, aber ich würde wohl sagen, dass ich mich mit PHP-Webapplikationen doch sehr gut auskenne. Ich sehe, dass diese Struktur nicht gut sein kann, und ich würde einige Ideen haben, wie man das ändern könnte, nur weiss ich nicht, wie man das in Java umsetzen kann.

    Am besten würde ich dieses Blackboard an sich wegschmeissen und durch eine schlauere Sessionverwaltung ersetzen. Allerdings will ich meine "Sessionverwaltung" nicht in der gleichen Weise immer weitergeben ...

    Hat diese Erklärung geholfen?

    *** Make it idiot proof, and someone will build a better idiot. ***

  • Zitat von maciek

    Hat diese Erklärung geholfen?

    Jo, aber leider kenn ich kein Design Pattern das gewachsenen Spaghetti-Code in eine saubere Struktur bringt. Zahlt sich eine Komplettüberarbeitung aus?

  • Zitat von laborg

    Jo, aber leider kenn ich kein Design Pattern das gewachsenen Spaghetti-Code in eine saubere Struktur bringt. Zahlt sich eine Komplettüberarbeitung aus?


    naja ... wenn sie stufenweise möglich wäre ... was würdest Du vorschlagen?

    *** Make it idiot proof, and someone will build a better idiot. ***

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!