Daten SOFORT anezeigen
Thomy
- html
Hallo!
Gibt es eine Möglichkeit (Metatag?!), den Browser anzuweisen, Daten _sofort_ zu zeigen und nicht erst zwischenzuspeichern?
Kleines Beispiel:
Das folgende Servlet (könnte auch PHP, ASP, Perl oder sonstwas sein. Das ist egal), zählt sekündlich einen Zähler hoch.
Im Browser soll jetzt auch jede Sekunde eine Zahl mehr angezeigt werden. Das muss nicht wirklich jede Sekunde passieren, mir ist nur wichtig, dass schon man was angezeigt wird, bevor alle Daten da sind.
Also nochmal kurz und bündig: Es soll nach und nach eine Liste aufgebaut werden.
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Zaehler extends HttpServlet {
public void doGet(
HttpServletRequest req,
HttpServletResponse res
)
throws
ServletException,
IOException
{
res.setBufferSize(0);
ServletOutputStream out = res.getOutputStream();
out.println("<html>");
out.println("<head></head><body><table><colgroup><col width="320"></colgroup>");
for (int i = 1; i < 1000; i++) {
out.println("<tr><td>" + i + "</td></tr>");
res.flushBuffer();
out.flush();
res.flushBuffer();
try { Thread.sleep(1000); } catch (InterruptedException e) { }
}
out.println("Fertig");
}
}
Gibt es eine Möglichkeit (Metatag?!), den Browser anzuweisen, Daten _sofort_ zu zeigen und nicht erst zwischenzuspeichern?
Das machen eigentlich alle Browser standardmäßig - wenn man sie denn lässt. Ein Browser hat aber keine Chance, etwas anzuzeigen, wenn die Daten so verpackt werden, daß ihre Position zwingend von späteren Daten mitbestimmt wird.
Das ist zum Beispiel der Fall, wenn diese Daten in eine Tabelle gepackt werden (sehr beliebt: die komplette Seite nur zwecks Layout in <table>s verschachteln). Die Breite der Spalten hängt von der maximal benötigten Breite _aller_ Zellen ab. Solange also nicht alle Zellen übertragen sind, kann der Browser auch nicht die Größe der Tabelle berechnen und somit selbige auch nicht anzeigen.
Es gibt die Möglichkeit, einer Tabelle ein festes Layout aufzuzwingen (table-layout:fixed o.ä.), aber dann hast Du das Problem, daß einige Daten unter Umständen nicht in die Zellen passen.
Bastel' mal eine Seite, die aus einfachem HTML besteht (sie darf auch gerne mit CSS hübsch bunt gemacht werden), dann zeigen die Browser sie auch nach und nach an.
Nicht unerwähnt sollten allerdings weitere "Blockierer" wie mod_gzip, der Cache des Webservers oder Proxies bleiben. Mit Ausnahme letzterer kannst Du gegen die aber nichts unternehmen - sie spielen aber in der Regel auch keine große Rolle bei diesem Problem.
Gruß,
soenk.e
Hi Sönke,
Nicht unerwähnt sollten allerdings weitere "Blockierer" wie mod_gzip,
der Cache des Webservers oder Proxies bleiben. Mit Ausnahme letzterer
kannst Du gegen die aber nichts unternehmen - sie spielen aber in der
Regel auch keine große Rolle bei diesem Problem.
ich verstehe nicht recht, wie mod_gzip ein "Blockierer" sein soll.
(Abgesehen davon, daß die komprimierte Übertragung _plus_ Auspacken
normalerweise schneller ist als die unkomprimierte, sonst würde der
Einsatz von mod_gzip dem Besucher ja nichts nützen.)
Entweder wird die Ausgabe clientseitig erzeugt (Java-Applet, JavaScript-
Code), dann ist mod_gzip aus dem Spiel - oder sie wird serverseitig mit
Push-Technologie erzeugt, dann ist mod_gzip auch aus dem Spiel (weil
solche Daten grundsätzlich nicht komprimierbar sind).
Also?
Viele Grüße
Michael
Nicht unerwähnt sollten allerdings weitere "Blockierer" wie mod_gzip,
der Cache des Webservers oder Proxies bleiben. Mit Ausnahme letzterer
kannst Du gegen die aber nichts unternehmen - sie spielen aber in der
Regel auch keine große Rolle bei diesem Problem.
ich verstehe nicht recht, wie mod_gzip ein "Blockierer" sein soll.
Ich bin bis jetzt immer davon ausgegangen, daß mod_gzip erst alle Daten in sich reinfressen muß, bevor es mit der Arbeit anfangen und etwas ausgeben kann.
Unter diesen Umständen wird ein Skript, daß meinetwegen zwei Minuten lang arbeitet und ständig Statusmeldungen ausgibt, solange nichts von sich hören lassen, bis es seine Ausgabe abgeschlossen hat und mod_gzip die Daten einpacken und verschicken kann - also die kompletten zwei Minuten lang.
Ohne mod_gzip dürften die Ausgaben hingegen Zeile für Zeile im Webbrowser ankommen.
Daher "Blockierer". Sollte meine Annahme falsch sein, bitte ich vielmals um Verzeihung :) Aber wie ich ja auch schon schrieb: "sie spielen in der Regel auch keine große Rolle bei diesem Problem".
Gruß,
soenk.e
HI Sönke,
ich verstehe nicht recht, wie mod_gzip ein "Blockierer" sein soll.
Ich bin bis jetzt immer davon ausgegangen, daß mod_gzip erst alle Daten
in sich reinfressen muß, bevor es mit der Arbeit anfangen und etwas
ausgeben kann.
Ja, das ist auch so. (Es muß das sogar tun, um überhaupt SSI komprimieren
zu können, was ansonsten "chunked" Daten liefert - deshalb kann man dieses "dechunking" in der mod_gzip-Konfiguration optional aktivieren.)
Unter diesen Umständen wird ein Skript, daß meinetwegen zwei Minuten
lang arbeitet und ständig Statusmeldungen ausgibt,
Genau das meinte ich mit "push-Technologie, welche Komprimierung von
vorn herein ausschließt". Aber wer hat schon solche Seiten?
Ohne mod_gzip dürften die Ausgaben hingegen Zeile für Zeile im
Webbrowser ankommen.
Yep. mod_gzip ist für "pushed" Daten ebenso unbrauchbar wie für
streaming media.
"sie spielen in der Regel auch keine große Rolle bei diesem Problem".
Full ACK.
Viele Grüße
Michael
Ich bin bis jetzt immer davon ausgegangen, daß mod_gzip erst alle Daten
in sich reinfressen muß, bevor es mit der Arbeit anfangen und etwas
ausgeben kann.
Ja, das ist auch so.
Unter diesen Umständen wird ein Skript, daß meinetwegen zwei Minuten
lang arbeitet und ständig Statusmeldungen ausgibt,
Genau das meinte ich mit "push-Technologie, welche Komprimierung von
vorn herein ausschließt". Aber wer hat schon solche Seiten?
Ich :) Ok, natürlich tritt sowas selten bis garnicht auf, und wenn, dann in speziellen Anwendungen, also für einzelne Nutzer. Aber da es in der Ausgangsfrage eben um inkrementelles Anzeigen ging, dachte ich, sollte dieser Umstand zumindest nicht unerwähnt bleiben.
Hauptgrund ist und bleibt aber immer <table>.
Gruß,
soenk.e
PS: Deine mod_gzip-Anleitung ist ein Segen :)
Hi Sönke,
PS: Deine mod_gzip-Anleitung ist ein Segen :)
Falls sie irgend eine Frage offen läßt - immer her damit.
Ohne Korrekturleser wird sie nicht besser ...
Viele Grüße
Michael