Thomy: Daten SOFORT anezeigen

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");

}
}

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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 :)

            1. 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