Re: AJAX & XMLHttpRequests: Pushen von Daten von Servlets in Clients (Browser)
- From: Martin Honnen <mahotrash@xxxxxxxx>
- Date: Wed, 10 Aug 2005 15:17:43 +0200
a.nauerz@xxxxxx wrote:
http://localhost:9080/AJADemo_1/AJADemoServlet?action=time
liefert als Response einfach z.B. den String "13:19:22:44".
Dann habe ich eine HTML Seite geschrieben die mittels XMLHTTPRequest auf diese URL zugreift.
Nun begannen die Probleme, denn mein Gedanke war eigentlich dass das XMLHttpRequest Ding eine Art "polling" macht und immer wieder diese URL invoked und falls sich die Response geändert hat (was sie hier hätte weil die Uhrzeit sich ja ändert) ein Update ausführt und sich somit ständig im Browser die Anzeige ändert - ohne Refresh. Nunja, dem ist aber wohl nicht so, denn ich bekam einmal die Anzeige der Uhrzeit und dann keine Änderung mehr.
Vielleicht hast du ja etwas falsch gemacht, aber ohne das du uns den JavaScript-Code zeigst und erzaehlst, mit welchem Browser was genau nicht geklappt hat, welche Fehlermeldungen du bekommen hast, koennen wir nur raten.
Es ist mit XMLHttpRequest sicher moeglich, immer wieder Daten nachzuladen.
Nach etwas Googlen kam ich dann auf die Idee dass das wohl irgendwie vom Servlet aus reingepushed werden muß (die sich ständig updatenden Daten), also habe ich mein Servlet derart umgeschrieben, dass es Mulitpart Messages als Response zurückgibt (diesmal mit dem Countdown statt der Uhrzeit, was aber eher unwichtig ist).
Versuche ich aber nun die benannte HTML Seite mit dem XMLHttpRequest Handling auf dieses neue Servlet zu jagen stürzt einfach mein IE ab -
Meines Wissens unterstuetzt MSXML, was ja in IE benutzt wird, multipart messages nicht, nur Mozilla unterstuetzt das, aber erst in neueren Versionen.
Ach, da kommt ja noch Script, dann vergiss meine obige Nachfrage erst mal.
req.onreadystatechange = processRequest;
req.open("GET", url, false);
Das sollte schon mal req.open("GET", url, true); sein (true fuer asynchrone Anforderung), sonst blockierst du den Browser. Dann ist es besser, onreadystatechange nach dem open()-Aufruf zu setzen: req.open("GET", url, true); req.onreadystatechange = processRequest; manche MSXML-Versionen moegen es lieber so herum.
function processRequest()
{
if (req.readyState == 0)
{
document.write("State 0<br>");
Mit document.write zu arbeiten, ist nicht sinnvoll, damit ueberschreibst du das aktuelle Dokument im Browser.
Du musst halt lernen, per DOM-Manipulation nur Teile des Dokumentes zu manipulieren, dann kannst du sicher auch die per Polling erfragten Daten anzeigen.
Z.b. also
<div id="results"></div>
statisch als Platzhalter ins Dokument einbauen und dann z.b. per
function htmlElement (tagName, text) {
var element = document.createElement(tagName);
element.appendChild(document.createTextNode(text));
}und
function processRequest () {
var resultDiv = document.getElementById('results');
resultDiv.appendChild(htmlElement('p', 'readyState is: ' + req.readyState));
if (req.readyState == 4) {
resultDiv.appendChild(htmlElement('p', 'responseText is: ' + req.responseText));
}
}
die Resultate zum Debuggen ausgeben.
<a href="/" onclick="test();">START<a>
Das ist auch keine gute Idee, besser ist <a href="#" onclick="test(); return false;">Start</a> sonst folgt der Browser dem Link, oder einfach ein Button <input type="button" value="Start" onclick="test();">
Im Moment glaube ich, dass dein Miserfolg eher an mangelnden Kenntnissen der client-seitigen Benutzung von JavaScript liegt als an XMLHttpRequest.
--
Martin Honnen http://JavaScript.FAQTs.com/ .
- Follow-Ups:
- Prev by Date: Wie fülle ich ein DropDown per Javascript
- Next by Date: Re: AJAX & XMLHttpRequests: Pushen von Daten von Servlets in Clients (Browser)
- Previous by thread: Wie fülle ich ein DropDown per Javascript
- Next by thread: Re: AJAX & XMLHttpRequests: Pushen von Daten von Servlets in Clients (Browser)
- Index(es):
Relevant Pages
|