AJAX: Text aus Servlet nachladen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • AJAX: Text aus Servlet nachladen

    Hi!

    Ich fange gerade ein bißchen mit AJAX an. Habe basierend auf http://developer.mozilla.org/de/docs/AJAX:Getting_Started ein kleines Testprojekt erstellt. Um es an meine Anforderungen anzupassen habe ich das ganze jedoch mit Servlets gemacht. Ich habe ein Servlet mit der Javascript Funktion und einem leeren Div-Container mit der ID "div". Die Javascript Funktion wird alle 5 Sekunden aufgerufen und holt den HTML-Code des anderen Servlets. Das andere Servlet hat lediglich den typischen HTML Aufbau mit dem Text <p>Ich bin ein Test</p>.

    Das Problem, dass sich mir nun stellt ist, dass er sich zwar den HTML-Code des anderen Servlets komplett holt, ich es aber nicht hinbekomme nur den Teil im <p>-Tag herauszuschneiden und in den Div-Container mit der ID "div" zu schreiben.

    Die Funktion, die das tun soll sieht zur Zeit so aus:
    "function alertInhalt() {\n" +
    "if (http_request.readyState == 4) {\n" +
    "if (http_request.status == 200) {\n" +
    "var text = http_request.responseText;\n" +
    to be continued...

    Hab es schon mit diesem Vorschlag versucht:
    var xmldoc = http_request.responseXML;
    var root_node = xmldoc.getElementsByTagName('root').item(0);
    alert(root_node.firstChild.data);

    Natürlich für meinen Fall mit responseText etc. angepasst. Das hat allerdings nicht funktioniert. Und die anderen Dinge, die ich noch habe finden können kann ich jetzt nicht mehr rekonstruieren, aber offensichtliche waren auch diese falsch. ^^

    Gibt es noch Lösungsvorschläge für mich?

    Vielen Dank im Voraus!
    Gruß Rantan
  • So, jetzt gehts weiter...

    Es handelt sich im Prinzip um die gleichen Servlets aber etwas verändert. Das erste Servlet ist immernoch dafür da einen Inhalt anzuzeigen, der sich ändert. Das zweite Servlet besteht jetzt aus einem Textfeld und einem Button, um einen String einzugeben. Der String soll dann dynamisch im ersten Servlet angezeigt werden. Ich hab mir das so vorgestellt, dass man den String eingibt und dieser von einer Javascript-Funktion in einer Variablen gespeichert wird. Das klappt auch soweit. Ich weiß jetzt nur nicht, wie ich per AJAX etc. abfragen kann, ob sich der Inhalt der Variablen geändert hat. Beziehungsweise wie ich die überhaupt übergeben kann. Im Prinzip soll das andere Servlet nach der Änderung auch benachrichtig werden, dass sich was geändert hat. Dann wird der neue Inhalt geholt und der alte ersetzt.

    Irgendwelche Ideen?

    Gruß Rantan
  • Hi,
    dafür gibts bei JavaScript die EventHandler:
    http://de.selfhtml.org/javascript/sprache/eventhandler.htm

    Theoretisch könntest du nach jedem Tastendruck deine Daten rübersenden.
    Am einfachsten machst du es mit einem Formular

    Quellcode

    1. <form onsubmit="ajaxtest(this.foo.value); return false">
    2. <input type="text" name="foo" />
    3. <input type="submit" />
    4. </form>
  • Hi!
    Und wieder stoße ich an eine Grenze, die es zu überschreiten gilt. Ich habe mein Projekt jetzt folgendermaßen erweitert.

    Ich habe:
    1. Eine View in Form meines HelloServlets.
    2. Einen Controller in Form meines RequestServlets.
    3. Ein Model in Form eines Singleton/DataServlets.

    Über das RequestServlet bin ich in der Lage einen String zu ändern, welcher im Singleton gespeichert wird. Das DataServlet besteht nur aus dem String, den es vom Singleton bekommt. Das HelloServlet führt alle 5 Sekunden einen Request aus und erhält als Antwort den String und zeigt ihn an.

    Nun möchte ich nicht mehr, dass alle 5 Sekunden ein Request ausgeführt wird, sondern dass ein Request abgesetzt und dann "gehalten" wird, bis sich etwas ändert oder ein Timeout einsetzt. Hierzu habe ich gesehen, dass der Jetty, den ich nutze, die Continuations zur Verfügung stellt. Allerdings werde ich aus der Jetty-Dokumentation nicht wirklich schlau. Hat schon jemand Erfahrung damit und kann mir ein paar Dinge erklären?

    Gruß Rantan
  • Wo ziehst du denn in deinem Beispiel die Grenze zwischen JavaScript und Java?

    Wir reden doch immer noch von AJAX, oder? Bei reinem Java machst du das mit einem Observer und gut ist. Mit einer reinen Browser Anwendung kannst du aber eben keine Antworten abwarten, weil du selbst keine offenen Ports hast.

    Und mit JavaScript bleibt dir nichts anderes übrig als in schnellen Intervallen nachzufragen obs was neues gibt. Um das Datenvolumen zu minimieren kannst du ja einen leeren String als "Nein" handhaben,

    Siehe hier: [coderwiki]HowTos/Ajax-Server-zu-Client-Kommunikation[/coderwiki]

    Falls du irgendwelche AJAX Frameworks nutzt: JQUERY und Scriptaculous haben beide Observer Methoden. Die Funktionen aber auf die selbe Art (also indem sie sekündlich nachfragen).
  • Soooooo, das sieht schon ganz gut aus. Ich habe meine 3 Servlets und mein AJAX-Kram läuft super. Das ganze läuft bisher aufm Jetty. Da gibt es ja die Möglichkeit mit den Continuations, um einen Request "hängen" zu lassen, um den Traffic zu reduzieren. Das funktioniert auch super. Der Request wird erzeugt und wartet auf eine Änderung bis ein Timeout abläuft. Danach wird ein neuer erzeugt. Allerdings lässt der Jetty nicht mehr als 8 parallele Verbindungen zu, obwohl er das eigtl können sollte. Aber das ist eine andere Geschichte. Meine nächste Aufgabe besteht darin das ganze auf dem JBoss zum Laufen zu kriegen. Das war ja soweit auch nicht schwierig. Aber der JBoss ist in Bezug auf ganz normales AJAX nicht sonderlich gut dokumentiert. Gibt es beim JBoss so etwas ähnliches wie die Continuations vom Jetty oder zumindest etwas, was das gleiche Ergebnis liefert?

    Gruß Rantan