Joachim: AJAX

Hallo und guten Tag,

beim Versuch, ein fortlaufendes Protokoll von einem Server in einer HTML Page darzustellen, stosse ich auf ein kleines Problem.

Die Idee war, mittels Ajax von einem Servlet die nächsten, neu aufgelaufenen Protokollzeilen auszulesen und dann in einem Textfeld auszugeben (es muss kein Textfeld sein, aber der ausgegebene Text sollte scrollbar sein).

Die Grundidee ist natürlich, dass das Servlet alle X Millisekunden aufgerufen und so der Fortlauf des Protokolles dargestellt wird.

Der Code:

  
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">  
<html>  
<head>  
<title>AJAX Test Version 1.0.15 vom 14.10.2008</title>  
<!-- link rel="stylesheet" href="css/famacweb.css" type="text/css" -->  
  
<script type="text/javascript" language="JavaScript">  
// ---------------------------------------------------------------------  
var http_request = null;  
var xUrl         = 'http://192.168.1.1/mylibrary/getprotokollzeilen';  
// ---------------------------------------------------------------------  
function initHttpRequest(){  
    try {  
        if (typeof XMLHttpRequest != 'undefined') {  
            http_request = new XMLHttpRequest();  
        }  
        if (!http_request) {  
            // Internet Explorer 6 and older  
            try {  
                http_request = new ActiveXObject("Msxml2.XMLHTTP");  
            } catch(e) {  
                try {  
                    http_request = new ActiveXObject("Microsoft.XMLHTTP");  
                } catch(e) {  
                    alert("initHttpRequest: Exception:" + e);  
                    http_request = null;  
                }  
            }  
        }  
    } catch(e){  
        alert("initDisplay: XMLHttpRequest: Exception:" + e);  
        http_request = null;  
    }  
    return(http_request != null);  
}  
// ---------------------------------------------------------------------  
function refreshDisplay(){  
    var xText = http_request.responseText;  
    var obj   = document.getElementById("displayfeld");  
    var s     = obj.value + xText;  
//  alert("refreshDisplay: s = " + s);  
    obj.value = s;  
}  
// ---------------------------------------------------------------------  
function initDisplay(){  
    if (!http_request){  
        if (! initHttpRequest())  
           return(false);  
    }  
    try {  
        http_request.open('POST', xUrl, true);  
    } catch(e){  
        alert("initDisplay: http_request.open: Exception:" + e);  
        return (false);  
    }  
    http_request.onreadystatechange = function() {  
        if (http_request.readyState == 4) {  
            refreshDisplay();  
        }  
    }  
    http_request.send(null);  
    return(true);  
}  
// ---------------------------------------------------------------------  
function getUpdate(){  
    initDisplay();  
}  
// ---------------------------------------------------------------------  
function getUpdates(){  
    for (i=0;i<100;i++)  
        getUpdate();  
}  
// ---------------------------------------------------------------------  
</script>  
</head>  
  
<body>  
<form name="protform" id="protform" >  
<textarea name="displayfeld" id="displayfeld" cols="80" rows="22" wrap="off" readonly></textarea>  
<p>  
<input type="button" value="   Clear   " onclick="getUpdate();">  
</form>  
</body>  
  
</html>  

"getprotokollzeilen" ist natürlich das Servlet, dass in einem String die Zeilen seit seinem letzten Aufruf liefert. Zu Testzwecken liefert es jedesmal genau EINE Zeile.

Benutze ich nun 'onclick="getUpdate();' im Button, muss ich für jede Zeile einzeln klicken und erhalte:
Zeile 968
Zeile 969
Zeile 970
Zeile 971

was soweit OJ ist. Benutze ich nun 'onclick="getUpdates();', dass 100 Zeilen ausgeben soll, erhalte ich:
Zeile 973
Zeile 975
Zeile 977
Zeile 979
pro Klick, nicht aber die nächsten (100) Zeilen.

Anscheinend fehlt ein Refersh der Form; sobald ich 'getUpdate()' nutze und immer wieder klicke, kommen die Folgezeilen korrekt.

Hat jemand einen Hinweis für mich?

Grüße,

Joachim

  1. Hallo Joachim,

    Ich hab zwar keine Ahnung von Servlets, aber eines ist klar: Die Funktion

      
    function getUpdates(){  
        for (i=0;i<100;i++)  
            getUpdate();  
    }  
    
    

    updated genau 100x und dann ist schluss! Schau dir für eine Lösung doch mal die Funktionen http://de.selfhtml.org/javascript/objekte/window.htm#set_interval@title=setInterval() und http://de.selfhtml.org/javascript/objekte/window.htm#set_timeout@title=setTimeout() an.

    Lg Niko

    1. Hallo Niko,

      ich hab jetzt mal versuchsweise das setInterval() und clearInterval() als Loop eingebaut und es KLAPPT! Anscheinend wird dabei die Form upgedated.

      Herzlichen Dank!!!

      Joachim