Hallo zusammen!
Ich habe folgendes Problem:
Ich habe ein Servet, das Informationen stückweise erhält (also ca. eine Minute lang alle 2 Sekunden weitere 100 Daten).
Jetzt soll das ganze in einer HTML-Tabelle dargestellt werden. Nun sieht es so aus, dass erst diese eine Minute gewartet wird, bis alle Daten da sind und das dann alles zusammen raus zum Browser geht. Ich möchte aber, dass der Benutzer schon nach 2 Sekunden die ersten 100 Datensätze sieht, 2 Sekunden später dann die nächsten (also insgesamt 200) usw.
Die Tabelle soll sich also schrittweise aufbauen.
Laufen muss das in Netscape >=6, MSIE >=5, Mozilla und Opera >=6
Nun habe ich mir schon mehrere Möglichkeiten ausgedacht:
SERVER PUSH:
Mit multipart/x-Mixed-Replace würde es wohl gehen, aber eben nicht überall. Außerdem würde die Seite dann auch jedesmal neu aufgebaut. Ich muss das Dokument ja auch nicht jedesmal überschreiben, sondern ein anhängen würde ja ausreichen. Also fällt das schon weg.
Ich habe aber auch multipart/mixed gefunden, kann damit aber nichts anfangen. Kann mir jemand etwas darüber sagen?
CLIENT PULL:
Unschön, weil ich a) nicht weiß, wann Daten kommen (die 2 Sekunden im Beispiel sind nicht konstant) und b) die Seite nicht jedesmal neu laden will.
CLIENT PULL mit Trick:
Jetzt habe ich mir überlegt, in einem versteckten Frame bzw. IFrame die neusten Daten per Client Pull zu holen und dann diese per DHTML dynamisch an die Tabelle zu fügen. Dies finde ich nicht besonders elegant und außerdem ist es fraglich, ob das auch wirklich überall klappt. Gerade bei Opera und DHTML brallen zwei Welten aufeinander...
AUSGABE UNGEPUFFERT RAUSSCHRIEBEN:
Dazu habe ich ein kleines Demo, das aber irgendwie nicht das tut, was es soll:
----------------------------
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Countdown2 extends HttpServlet {
public void doGet(
HttpServletRequest req,
HttpServletResponse res
)
throws
ServletException,
IOException
{
res.setBufferSize(0);
ServletOutputStream out = res.getOutputStream();
for (int i = 10; i > 0; i--) {
out.println(i + "...");
out.flush();
res.flushBuffer();
try { Thread.sleep(1000); } catch (InterruptedException e) { }
}
out.println("P E N G");
}
}
----------------------------
Das Servlet soll im Sekundentakt von 10 auf 1 runterzählen und schließlich auch "PENG" ausgeben.
Gedacht ist es so, dass erst "1" da steht, dann "1 2", dann "1 2 3", ...
Tatsächlich dauert es aber erst 10 Sekunden und dann kommt die komplette Ausgabe.
Kann ich das Servlet nicht anweisen, seine Ausgaben DIREKT rauszuschreiben?
Wäre schön, wenn mir jemand weiterhelfen, Antworten oder sonstige Tipps geben könnte.