Ernst: Einfache Frage zu HTML-Seite (mit iframe) und Servlet

Hallo allerseits,

Folgendes einfache Programm funktioniert einwandfrei (es wird laufend eine Website aktualisiert, man merkt im Browser, dass laufend "Traffic" ist), doch verstehe ich nicht warum.

a)
Von einem Webbrowser aus rufe ich über die Eingabe (habe Tomcat auf dem gleichen Rechner laufen):
http://localhost:8080/aktualisieren1/basic.html
die Datei basic.html auf, die folgendem Inhalt hat:
----------------------------------------------------------
<html>
<head>
<body>
Dies ist ein Fenster, in dem etwas gezeigt wird <p>
<iframe src="/aktualisieren1/ServletAktual1" name="chatbox">
</iframe>
</body>
</head>
</html>
----------------------------------------------------------

b)
Das Servlet ServletAktual1 hat folgenden Inhalt:
----------------------------------------------------------
package packaktual;
import java.io.*;
import java.net.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class ServletAktual1 extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

out.println("<html>");
out.println("<head>");
out.println("<title>ServletAktual1</title>");
out.println("<meta http-equiv="refresh" content="0; URL=">");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet MyServlet at " + request.getContextPath () + "</h1>");
out.println("</body>");
out.println("</html>");

out.close();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

public String getServletInfo() {
return "Short description";
}
}
----------------------------------------------------------

  1. Problem und Frage:
    Die Zeile in basic.html
    <iframe src="/aktualisieren1/ServletAktual1" name="chatbox">
    veranlasst, dass in einen iframe, also einem Unterfenster der Website der HTML-Code ausgegeben wird, der durch Ausführung des Programms ServletAktual1 an den Browser gesendet wird.
    Also wird auch u.a. durch
    out.println("<meta http-equiv="refresh" content="0; URL=">");
    die Zeile
    <meta http-equiv=refresh content=0; URL=>
    in iframe reinkopiert.
    Diese wird durch den Browser ausgeführt, was wiederum bedeutet, dass die durch URL=
    angegebene Website, d.h. deren HTML-Text ausgeführt wird.
    Da aber nach URL= nichts kommt, gehe ich davon aus, dass dies bedeutet, dass der HTML-Text der aktuellen Website ausgeführt werden soll.
    Aber was ist die aktuelle Website??
    Ist es die Seite basic.html, oder nur das iframe davon (aber welche IP-Adresse hat iframe)?
    Gibt es dazu eine Regelung und wie funktioniert diese?

mfg
Ernst

  1. Hi,

    Also wird auch u.a. durch
    out.println("<meta http-equiv="refresh" content="0; URL=">");
    die Zeile
    <meta http-equiv=refresh content=0; URL=>
    in iframe reinkopiert.

    Nein. Die Zeile wird anders aussehen. Die " verschwinden nicht einfach.

    Diese wird durch den Browser ausgeführt, was wiederum bedeutet, dass die durch URL=
    angegebene Website, d.h. deren HTML-Text ausgeführt wird.
    Da aber nach URL= nichts kommt, gehe ich davon aus, dass dies bedeutet, dass der HTML-Text der aktuellen Website ausgeführt werden soll.
    Aber was ist die aktuelle Website??

    Jedes HTML-Dokument ist unabhängig vom anderen. Daran ändert sich auch nichts, wenn ein Dokument in einem iframe eingesperrt wird.

    Ob eine leere URL erlaubt ist, weiß ich nicht.
    Wenn eine leere URL hier erlaubt ist und als aktuelles Dokument interpretiert, ist es das Dokument, das das meta-Element enthält, also das, welches vom Servlet erzeugt wurde.
    http (siehe http-equiv) kennt keine Frames ...

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.

      Also wird auch u.a. durch
      out.println("<meta http-equiv="refresh" content="0; URL=">");
      die Zeile
      <meta http-equiv=refresh content=0; URL=>
      in iframe reinkopiert.

      Nein. Die Zeile wird anders aussehen. Die " verschwinden nicht einfach.

      Stimmt, ich habe ein paar " vergessen.

      Diese wird durch den Browser ausgeführt, was wiederum bedeutet, dass die durch URL=
      angegebene Website, d.h. deren HTML-Text ausgeführt wird.
      Da aber nach URL= nichts kommt, gehe ich davon aus, dass dies bedeutet, dass der HTML-Text der aktuellen Website ausgeführt werden soll.
      Aber was ist die aktuelle Website??

      Jedes HTML-Dokument ist unabhängig vom anderen. Daran ändert sich auch nichts, wenn ein Dokument in einem iframe eingesperrt wird.

      »»
      Das Servlet veruracht, dass folgender HTML-Text an den Browser gesendet wird:
      <html>
      <head>
      <title>ServletAktual1</title>
      <meta http-equiv="refresh" content="0; URL=">
      </head>
      <body>
      <h1>Servlet MyServlet at "  und der Pfad: request.getContextPath ()
      </h1>
      </body>
      </html>

      Dieser Text wird vom Browser interpretert und die Interpretation im _iframe_ ausgegeben.
      UML= verursacht, dass dieser Text (Selbstbezüglichkeit) immer wieder in das iframe geschrieben wird.

      Ob eine leere URL erlaubt ist, weiß ich nicht.
      Wenn eine leere URL hier erlaubt ist und als aktuelles Dokument interpretiert, ist es das Dokument, das das meta-Element enthält, also das, welches vom Servlet erzeugt wurde.

      Ja, das meine ich bei 2)

      http (siehe http-equiv) kennt keine Frames ...

      Was meinst du damit?
      Das verstehe ich nicht.

      mfg
      Ernst

  2. Hi,

    Da aber nach URL= nichts kommt, gehe ich davon aus, dass dies bedeutet, dass der HTML-Text der aktuellen Website ausgeführt werden soll.

    HTML wird nicht "ausgefuehrt".

    Aber was ist die aktuelle Website??

    Die aktuelle *Ressource*.

    Ist es die Seite basic.html, oder nur das iframe davon

    Du hast ein Dokument geladen, und dieses enthaelt die Anweisung an den HTML darstellenden Client, nach angegebener Zeit die Adresse "" anzufordern.
    Das macht er ebenso, wie wenn du bspw. als action-Attribut eines Formulars auch nur eine "leere" Adresse angibst - er interpretiert es als Verweis auf die aktuelle Ressource.
    Ob diese Ressource dabei in einem Iframe dargestell wird oder nicht, ist volkommen unerheblich.

    (aber welche IP-Adresse hat iframe)?

    Wieso soll ein Iframe eine IP-Adresse haben?

    MfG ChrisB

    --
    „This is the author's opinion, not necessarily that of Starbucks.“
    1. Da aber nach URL= nichts kommt, gehe ich davon aus, dass dies bedeutet, dass der HTML-Text der aktuellen Website ausgeführt werden soll.

      HTML wird nicht "ausgefuehrt".

      was dann?
      interpretiert, d.h. die durch HTML beschriebene Seite auf dem Bildschirm ausgegeben?

      Aber was ist die aktuelle Website??

      Die aktuelle *Ressource*.

      was kann eine *Ressource* alles sein?
      Welche verschiedenen *Ressourcen* gibt es ?

      mfg
      Ernst

      1. Hi,

        was kann eine *Ressource* alles sein?

        Alles, was du ueber HTTP abrufst, ist eine Ressource.

        Welche verschiedenen *Ressourcen* gibt es ?

        Alle Moeglichen.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
    2. Du hast ein Dokument geladen, und dieses enthaelt die Anweisung an den HTML darstellenden Client, nach angegebener Zeit die Adresse "" anzufordern.
      Das macht er ebenso, wie wenn du bspw. als action-Attribut eines Formulars auch nur eine "leere" Adresse angibst - er interpretiert es als Verweis auf die aktuelle Ressource.

      Was ist dann ganz konkret die _aktuelle Ressource_ ?
      Was wird vom Server konkret angefordert?
      Das Servlet oder was?
      Kannst du mit diese Anforderung nennen?

      mfg
      Ernst

      1. Hi,

        Was ist dann ganz konkret die _aktuelle Ressource_ ?

        Die Adresse des angezeigten Dokumentes (im Falle von HTML-Dokumenten).

        Was wird vom Server konkret angefordert?

        Der Client fordert an, der Server liefert aus.

        Das Servlet oder was?

        Der Client fordert eine Ressource an.
        Der Server schaut sich diese Anforderung an, ob er unter dieser Adresse irgendwelche Daten zum ausliefern hat, und wenn ja, liefert er sie an den Client aus.

        Kannst du mit diese Anforderung nennen?

        Nein. Ich verstehe immer noch nicht, worauf du eigentlich hinaus willst.

        Mir scheint, du machst einen eigentlich recht simplen Sachverhalt unnoetig kompliziert.

        MfG ChrisB

        --
        „This is the author's opinion, not necessarily that of Starbucks.“
        1. Kannst du mit diese Anforderung nennen?

          Nein. Ich verstehe immer noch nicht, worauf du eigentlich hinaus willst.

          Mir scheint, du machst einen eigentlich recht simplen Sachverhalt unnoetig kompliziert.

          Die aktuelle Anforderung bei URL= ist:
          ServletAktual1

          Ich habe mir das so vorgestellt:

          http://localhost:8080/aktualisieren1/basic.html
          wird vom Anwender in den Browser in die Eingabezeile eingegeben

          1. Dies veranlasst beim Server einen Request, der die Zusendung des
            HTML-Texts von basic.html an den Client bewirkt, der diesen dann als
            Bildschirmseite dargestellt.

          Zusätzlich verlangt der HTML-Text noch, dass beim Server der Request
          ServletAktual1 erzeugt wird.
          Dieser Request veranlasst beim Server die Zusendung des HTML-Texts,
          der beim Ablauf des ServletAktual1-Programms erzeugt wird.
          Der Browser stellt die zum HTML-Text zugehörige Bildschirmseite in dem
          iframe dar.

          Zusätzlich verlangt die in diesem HTML-Text sich befindliche Zeile:
          <meta http-equiv="refresh" content="0; URL=">
          beim Server nach 0 Sekunden einen Request der aktuellen Ressource
          (=ServletAktual1).

          Dieser Request veranlasst beim Server die Zusendung des HTML-Texts,
          der beim Ablauf des ServletAktual1-Programms erzeugt wird.
          Der Browser stellt die zum HTML-Text zugehörige Bildschirmseite in dem
          iframe dar.

          Weiter mit 4)
          --> Endlosschleife

          Ist diese Beschreibung richtig?

          mfg
          Ernst

          1. Hi,

            http://localhost:8080/aktualisieren1/basic.html
            wird vom Anwender in den Browser in die Eingabezeile eingegeben

            1. Dies veranlasst beim Server einen Request, der die Zusendung des
              HTML-Texts von basic.html an den Client bewirkt, der diesen dann als
              Bildschirmseite dargestellt.

            Der Client stelle den Request an den Server, ja.
            Und dieser Antwortet mit einer Response, vom Typ text/html.

            Zusätzlich verlangt der HTML-Text noch, dass beim Server der Request
            ServletAktual1 erzeugt wird.

            Da im HTML-Code ein Iframe enthalten ist, stellt der Client einen weiteren Request mit der dort angegebenen Adresse, ja.
            Weiter wie oben.

            Ist diese Beschreibung richtig?

            Von den komischen Formulierungen wie "dies veranlasst beim Server einen Request" abgesehen, ja.

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. Da im HTML-Code ein Iframe enthalten ist, stellt der Client einen weiteren Request mit der dort angegebenen Adresse, ja.
              Weiter wie oben.

              Ist diese Beschreibung richtig?

              Von den komischen Formulierungen wie "dies veranlasst beim Server einen Request" abgesehen, ja.

              ok.

              Nochmals zum Verständnis:
              out.println("<meta http-equiv="refresh" content="0; URL=/aktualisieren1/ServletAktual1">");
              und
              out.println("<meta http-equiv="refresh" content="0; URL=">");
              machen in diesem Zusammenhang genaus dasselbe, weil ja URL= sich auf die _aktuelle_ Ressource bezieht und ServletAktual1 die aktuelle Ressource ist.

              Um den Traffic zwischen Client und Server zu beobachten, habe ich
              in server.xml folgende Zeile aufgenommen:
              <Valve className="org.apache.catalina.valves.RequestDumperValve" />

              Fall:
              Ich habe im ServletAktual1 folgende Zeile:
              out.println("<meta http-equiv="refresh" content="0; URL=/aktualisieren1/ServletAktual1">");
              Dann bekomme ich in einem log-File u.a. _permanent_ die Ausgabe:
              INFO: REQUEST URI       =/aktualisieren1/ServletAktual1
              Das ist auch klar, weil das Servlet permanent aufgerufen wird.

              Fall:
              Ich habe im ServletAktual1 folgende Zeile:
              out.println("<meta http-equiv="refresh" content="0; URL=">");
              Dann bekomme ich in einem log-File u.a. _permanent_ die Ausgabe:
              INFO: REQUEST URI       =/aktualisieren1/ServletAktual1
              INFO: REQUEST URI       =/aktualisieren1/basic.html
              Es werden also _permamnent_ zwei URL vom Server verlangt.
              Warum wird aber basic.html _permanent_ aufgerufen?
              Das ist mir nicht klar!

              mfg
              Ernst