# JSP: Collection im Servlet überwachen (mit AJAX)?



## Novanic (28. Jul 2007)

Hallo Leute,

ich habe folgendes Problem, zu dem mir keine richtig gute Lösung einfällt. Hoffentlich fällt euch was schönes ein. 

Also ich habe in meinem Servlet eine Collection und möchte auf der JSP-Seite etwas verändern, wenn die Collection des Servlets sich verändert. Hat jemand eine Idee wie sich das elegant lösen lässt?

Mir würde jetzt nur die Lösung einfallen:

1. JSP-Seite ruft Servlet per AJAX auf
2. Servlet wartet solange bis sich etwas in der Collection ändert
3. Servlet liefert die Antwort zurück

Das erscheint mir aber nicht ganz schick, da das Servlet bei dieser Lösung immer warten muss...
Gibts da nicht einen besseren Lösungsweg? 

Danke schonmal.

Gruß Nova


----------



## WeirdAl (28. Jul 2007)

Hi,
das Servlet warten zu lassen wäre keine gute Idee. Was machst Du wenn 3-4 User gleichzeitig die Information haben wollen?

Wie genau soll das ablaufen? Nutzer A fügt der Liste etwas hinzu und Nutzer B soll darüber informiert werden? Falls dies so ist geht das nur afaik über Ajax, da dein Servlet so gesehen nur auf ein request mit einer response Antworten kann/darf. Es wäre sicher schick, wenn man dies via Observer Pattern realisieren könnte, aber unaufgefordert "responses" vom Servlet -> JSP zu schicken ist so viel ich weiß nicht möglich.

Evtl könntest Du das so realisieren, das Du eine Ajax Anfrage mit Timestamp Parameter machst und auf Servlet Seite den Timestamp vergleichst und nur bei einer Änderung die neue Collection überträgst. Nur weiss ich nicht, wie "performant" es ist jede Sekunde diesen Ajax request an das Servlet zu schicken.

Soweit mal
Alex


----------



## Novanic (28. Jul 2007)

Ja genau, so soll das laufen.

Ein anschauliches Beispiel:

Serverseitig ist eine Collection namens "Speisen"

UserA:
  1. Klickt auf einen Button auf der JSP-Seite (heißt "Küche") und sendet somit den String "Kuchen" an ein Servlet.
  2. Das Servlet fügt das Wort "Kuchen" der Collection "Speisen" hinzu.

Soweit funktioniert auch alles. Nun kommt das was ich erreichen möchte. 

Die Seite auf der sich UserB befindet, soll aktualisiert werden, nachdem die Collection von UserA (wie oben beschrieben) geändert wurde.

Optimal wäre es wenn ich eine Anfrage schicken oder einen Listener eintragen könnte. Und dann nachdem irgendwann mal was in der Collection geändert wurde, eine Javascript-Funktion (sozusagen eine Event-Methode) auf der gleichen Seite (von UserB) aufgerufen wird.

Hat jemand eine Idee wie man das mit AJAX in Kombination mit Servlets realisieren kann?

Danke schonmal im Voraus, ist ganz dringend! 

Gruß Nova


----------



## Guest (28. Jul 2007)

hallo,

also wenns ganz dringend ist  würd ich die sache einfach mit einem javascript timer machen und alle paar sekunden eine neue abfrage senden.

schau dir sonst mal das an:
http://weblogs.java.net/blog/jfarcand/archive/2006/07/the_grizzly_com.html

viel spass


----------



## Guest (29. Jul 2007)

Ja, so läuft es ja momentan, aber so kanns nicht bleiben.
Ist das Intervall zu klein, verursacht es zu viel Last auf dem Server (bei vielen Usern) und ist das Intervall zu groß, wird der User zu spät benachrichtigt...

Es gibt doch auch das Observer-Pattern für AJAX oder nicht? Ich habe leider noch nichts brauchbares gefunden, bei dem es auch versucht wurde auf Servlets zu übertragen.

Kann mir jemand helfen?

Danke schonmal. 

Gruß Nova


----------



## WeirdAl (29. Jul 2007)

Huhu,
Das klassische Observer Pattern wirst Du auch nicht mit Servlets realisieren können. Dazu müssten sich JSPs and das Observer Servlet anmelden und das Servlet müsste sobald sich Änderungen ergeben alle angemeldeten JSPs benachrichtigen. 

Das Problem ist dabei, das ein Servlet nur auf Requests reagiert und nicht einfach so mal per Response irgendwann Seiten aktualisiert, was bei dem Observer Pattern nötig wäre. Mit Ajax musst du das ja über HttpRequest per GET oder POST auch erst ein Request an das Servlet schicken um dann die einzelnen Komponenten der Seite zu aktualisieren.

Eine Möglichkeit wäre evtl. die Änderung über ein Flag im Application Scope bekannt zu geben. Dazu muss aber gegeben sein, dass deine Collection für dein ganzes Projekt gilt und nicht nur ein Teil der Nutzer sehen sollen. Das hätte den Vorteil das Du nicht jedesmal das Servlet selbst "belästigen" musst, sondern erstmal nur überprüfst, ob sich überhaupt was geändert hat.

Cu
Alex


----------

