WEBVTT

00:10.040 --> 00:11.080
So, schönen Tag.

00:11.160 --> 00:14.140
Ich begrüße Sie zur Fortsetzung der Vorlesung Angewandte Informatik 2.

00:14.780 --> 00:21.300
Letztes Mal haben wir uns mit einigen Themen beschäftigt.

00:21.300 --> 00:23.720
Ich muss kurz das Mikro ein bisschen runterstellen, ich glaube das ist

00:23.720 --> 00:24.460
etwas zu laut.

00:27.200 --> 00:32.180
Letztes Mal haben wir uns mit einigen Themen noch beschäftigt, die mit

00:32.180 --> 00:33.360
XML zu tun hatten.

00:33.360 --> 00:39.800
Mit XSL, mit der Präsentation von Dokumenten, die in XML beschrieben

00:39.800 --> 00:40.180
sind.

00:40.420 --> 00:45.900
Ich hatte Ihnen einiges erzählt zu der XSLT, zur Transformation von

00:45.900 --> 00:51.060
XML -Dokumenten in andere Dokumente, andere baumartig strukturierte

00:51.060 --> 00:56.200
Objekte und hatte Ihnen auch kurz skizziert, wie man daraus

00:56.200 --> 00:57.680
Präsentationen erstellen kann.

00:57.680 --> 01:03.560
Entweder indem man direkt HTML oder XHTML Dokumente erzeugt oder indem

01:03.560 --> 01:12.260
man aus dem, was dort als Struktur entstanden ist, sogenannte

01:12.260 --> 01:17.100
Formatting Objects erstellt und dann genau angibt, was oder wie diese

01:17.100 --> 01:18.820
Formatting Objects darzustellen sind.

01:19.860 --> 01:25.480
Wir sind dann in das Kapitel 3 eingestiegen und haben uns mit Client

01:25.480 --> 01:27.020
-Server -Technologien beschäftigt.

01:27.020 --> 01:34.220
Insbesondere mit serverlastigen Implementationen und wir werden uns

01:34.220 --> 01:41.920
auch noch eine andere Client-lastige Art anschauen, die mit JavaScript

01:41.920 --> 01:42.960
möglich ist.

01:43.500 --> 01:49.620
Das Wesentliche dabei ist, dass Sie feststellen, wie man es eigentlich

01:49.620 --> 01:54.300
erreichen kann, dass ein Web-Auftritt nicht nur statisch über solche

01:54.300 --> 01:58.520
HTML oder XHTML Dokumente erzeugt wird, die man irgendwann einmal

01:58.520 --> 02:01.680
geschrieben hat, sondern dass solche Dokumente dynamisch erzeugt

02:01.680 --> 02:01.980
werden.

02:02.500 --> 02:09.720
Das geht eben nur durch entsprechende Programme, wie Servlets, Active

02:09.720 --> 02:11.220
Server Pages und Ähnliches.

02:11.860 --> 02:16.180
Grundlage ist das Hypertext Transfer-Protokoll, das ja erst das World

02:16.180 --> 02:17.440
Wide Web ermöglicht hat.

02:17.440 --> 02:20.360
Ich hatte Ihnen ganz kurz gesagt, wie das aufgebaut ist.

02:20.500 --> 02:22.340
Darauf kommen wir noch an ein paar Stellen zurück.

02:23.460 --> 02:31.140
Wir hatten uns dann ganz kurz angesehen, dass es Verfahren gibt, mit

02:31.140 --> 02:35.840
denen man die Auslieferung von Dokumenten im World Wide Web

02:35.840 --> 02:40.080
beschleunigen kann, effizienter machen kann, dadurch, dass man

02:40.080 --> 02:44.000
Dokumente an vielen Stellen verfügbar macht oder abrufbar macht, aber

02:44.000 --> 02:47.820
auf eine Art und Weise, die der normale Anwender gar nicht sieht.

02:49.200 --> 02:52.980
Ich hatte Ihnen dann angefangen, etwas über das Common Gateway

02:52.980 --> 02:57.400
Interface zu erzählen, die Grundlage dafür, dass man überhaupt

02:57.400 --> 03:04.520
zwischen Client und Server in Bezug auf Webseiten kommunizieren kann,

03:04.700 --> 03:08.000
Informationen austauschen kann, Skripte anstoßen kann und so weiter.

03:09.260 --> 03:12.800
Wir hatten uns dann ein Beispiel angeschaut, bei dem man dieses

03:12.800 --> 03:18.500
übliche Hello World Beispiel einmal ausgeführt hat, beziehungsweise

03:18.500 --> 03:19.460
ein ähnliches.

03:19.660 --> 03:22.660
Hier wird nicht Hello World gemacht, sondern Hello und dann irgendein

03:22.660 --> 03:24.580
Name, der eingegeben wird.

03:25.340 --> 03:29.620
Das Interessante dabei war, dieses war die letzte Folie, da gehe ich

03:29.620 --> 03:31.620
jetzt wieder rauf.

03:32.620 --> 03:41.840
Hier sehen wir eine Möglichkeit, wie man Informationen aus einer HTML

03:41.840 --> 03:47.940
-Seite abruft vom Server, beziehungsweise wie man etwas beim Server

03:47.940 --> 03:48.620
anstößt.

03:49.560 --> 03:55.620
Wir haben hier folgende Möglichkeiten angedeutet auf dieser Folie.

03:56.740 --> 04:02.060
Ein Form-Element innerhalb von HTML, das es erlaubt, eine Aktion

04:02.060 --> 04:03.820
anzustoßen auf dem Server.

04:03.940 --> 04:07.340
Die Aktion bezieht sich auf ein Skript, in diesem Fall ein Perl

04:07.340 --> 04:10.700
-Skript, ein kleines Perl-Programm, das auf dem Server liegt.

04:11.520 --> 04:20.080
Und die Methode für diesen Aufruf soll ein GET sein, also das zugrunde

04:20.080 --> 04:21.500
liegende Protokoll ist HTTP.

04:22.260 --> 04:30.180
Die GET-Methode wird verwendet und es wird dann im HTML-Dokument

04:30.180 --> 04:36.040
hingeschrieben, Name, daneben ein Eingabefeld, das ist dieses Input

04:36.040 --> 04:50.160
-Type Text und der Name dieses Feldes, das Attribut Name bekommt hier

04:50.160 --> 04:52.180
den Wert Name.

04:53.360 --> 05:02.860
Dann wird ein weiteres Feld hier, also es ist so, ich kann hier ein

05:02.860 --> 05:07.520
Attribut erstellen oder eine Variable erstellen, das ist das, was hier

05:07.520 --> 05:09.900
durch Name gleich Name gemacht wird.

05:10.280 --> 05:13.540
Wir sehen das hier unten in dem, was daraus erzeugt wird.

05:13.540 --> 05:18.740
Es wird eine Variable erzeugt, die an das Skript Hallo.pl

05:18.740 --> 05:23.580
weitergegeben werden soll und der Wert, der dort angegeben wird,

05:23.800 --> 05:31.220
dieses Wort Michael, das wird halt eingegeben in dieses Input-Feld.

05:31.220 --> 05:36.860
Das heißt, der Name dieses Feldes wird in diesem Fall das kleine Name,

05:37.660 --> 05:42.260
der Name einer Variablen und der Wert der Variablen ist der Text, der

05:42.260 --> 05:43.380
dort eingegeben wird.

05:43.940 --> 05:47.880
Und daneben gibt es noch ein weiteres Feld, das aber kein Eingabefeld

05:47.880 --> 05:50.580
ist, in das Sie Text eingeben können, sondern hier haben Sie ein

05:50.580 --> 05:55.100
Submit -Feld, das heißt, sobald dieses Feld aktiviert wird, dadurch,

05:55.240 --> 05:59.680
dass Sie mit der Maus darauf klicken, wird die Aktion angestoßen,

06:00.020 --> 06:03.300
diesen Inhalt an den Webserver zu übertragen.

06:03.400 --> 06:09.360
Das heißt, es wird ein Aufruf an den Webserver erzeugt, der diese Form

06:09.360 --> 06:11.360
hat, die hier unten angegeben ist.

06:12.180 --> 06:18.260
Dann steht hier die URI, die übertragen wird, es wird das Skript

06:18.260 --> 06:22.420
aufgerufen, wie es in der Form der Aktion dort angegeben ist und

06:22.420 --> 06:26.880
daneben der Parameter für diesen Aufruf und dahinter, wie üblich, die

06:26.880 --> 06:29.220
Angabe des Protokolls, das eingesetzt wird.

06:30.180 --> 06:33.240
Ich hatte letztes Mal schon darauf hingewiesen, GET bezieht sich

06:33.240 --> 06:37.860
darauf, oder ist die Methode, bei der die Information für den Aufruf

06:37.860 --> 06:44.900
vollständig in dieser URI, hier vorne in dem CGI-Bin, Hallo PL, Name

06:44.900 --> 06:49.480
gleich Michael, das ist die Information, die gebraucht wird, sowohl

06:49.480 --> 06:52.940
das Programm wird angestoßen, als auch der Parameter wird hier in

06:52.940 --> 06:54.040
dieser Zeile übergeben.

06:54.040 --> 07:01.540
Und genau diesen Aufruf sehen Sie in der URL-Zeile Ihres Browsers,

07:01.660 --> 07:11.140
wenn Sie auf den Submit-Button in der HTML-Seite raufklicken, dann

07:11.140 --> 07:16.500
wird entsprechend dieser HTTP-Aufruf erzeugt und Sie können das in der

07:16.500 --> 07:21.980
URL -Zeile genau sehen, dass diese Seite aufgerufen wurde.

07:22.600 --> 07:27.740
Es gibt halt eine Alternative dazu, das ist nicht GET zu verwenden,

07:27.880 --> 07:28.600
sondern POST.

07:29.160 --> 07:36.860
Wenn Sie POST verwenden, dann wird die Information, die gleiche

07:36.860 --> 07:39.260
Information wie vorher, auf andere Art und Weise übertragen.

07:39.400 --> 07:43.980
In diesem Fall wird also nicht der Query-String, so als URL mit Aufruf

07:43.980 --> 07:49.200
des Programms und anschließend die Parameter, Namen und Werte erzeugt,

07:49.200 --> 07:53.780
sondern die Information, die übertragen wird, die Dateninformation,

07:54.520 --> 08:01.720
die folgt in dem Rumpfteil des HTTP-Requests direkt hinter dem Header.

08:02.320 --> 08:07.500
Das heißt, wir haben hier den Header, bei dem jetzt als erstes nicht

08:07.500 --> 08:08.860
GET steht, sondern POST.

08:08.860 --> 08:13.740
Und es steht jetzt nur der Aufruf des Programms dort, also dieses

08:13.740 --> 08:17.940
Scripts hallo.pl und der Protokollname.

08:18.000 --> 08:21.740
Dahinter können noch ein paar mehr Informationen folgen, die jetzt

08:21.740 --> 08:22.640
irrelevant sind.

08:23.180 --> 08:28.600
Aber zu dem Header gehört auch noch, dass hier Content-Length gleich

08:28.600 --> 08:34.260
12 steht, nämlich die Länge des Datenteils, die Länge des Rumpfes ist

08:34.260 --> 08:37.180
gerade 12 Byte.

08:37.180 --> 08:45.960
Und dieser Datenteil enthält halt die Daten, die vom Programm hallo.pl

08:45.960 --> 08:50.500
gelesen werden müssen oder verwendet werden müssen, um richtig

08:50.500 --> 08:51.320
ausgeführt zu werden.

08:51.400 --> 08:54.100
Wir hatten ja gesehen, was das hallo.pl machen soll.

08:54.220 --> 08:55.920
Das war ja vorher schon angegeben worden.

08:56.040 --> 09:01.960
Das soll halt hallo, in dem Fall Michael, schreiben, beziehungsweise

09:01.960 --> 09:04.520
den Wert der variablen Name.

09:05.740 --> 09:10.100
Und das Wichtige ist, in diesem Fall natürlich haben wir hier eine

09:10.100 --> 09:16.180
Länge 12 Byte, aber im Prinzip kann dieser Datenteil beliebig groß

09:16.180 --> 09:16.500
sein.

09:17.200 --> 09:25.560
Das, was Sie über eine Zeile in der UR11 bei einem Query Screen

09:25.560 --> 09:28.480
übertragen können, ist in der Größe begrenzt.

09:28.540 --> 09:30.040
Da können Sie nicht beliebig viel reinschreiben.

09:30.820 --> 09:35.580
Außerdem ist alles, was Sie bei der Get-Methode machen, im Prinzip für

09:35.580 --> 09:36.620
den Benutzer sichtbar.

09:37.320 --> 09:42.200
Wenn Sie das über Post machen, dann ist erstmal diese Begrenzung nicht

09:42.200 --> 09:42.440
da.

09:42.540 --> 09:47.580
Sie können ja beliebig viel reinschreiben in diese Body, dieses HTTP

09:47.580 --> 09:48.360
-Requests.

09:48.940 --> 09:53.500
Und das, was Sie schicken ist, oder was geschickt wird durch diesen

09:53.500 --> 09:58.700
Fondsaufruf, das, was geschickt wird, ist für den Benutzer nicht

09:58.700 --> 09:59.260
sichtbar.

09:59.260 --> 10:03.600
Weil es ja nicht in der Browserzeile zu sehen ist.

10:04.180 --> 10:06.380
Das ist durchaus ein sinnvoller Unterschied.

10:07.060 --> 10:09.740
Nicht, dass man irgendwas vereinblichen will vor dem Benutzer.

10:10.020 --> 10:13.020
Nur was bringt es dem Benutzer, wenn er da einen ewig langen String in

10:13.020 --> 10:14.080
seinem Fenster sieht?

10:14.520 --> 10:20.920
Es ist viel sinnvoller, das zu beschränken und die Inhalte halt in den

10:20.920 --> 10:23.820
Rumpf dieses HTTP-Requests zu verschicken.

10:25.200 --> 10:29.920
Welche Methode der Datenübermittlung man macht, kann man in dem

10:29.920 --> 10:33.620
Programm, also in dem hallo.pl, abfragen.

10:34.620 --> 10:38.740
Je nachdem, was dort gemacht wird, werden die Informationen ja anders

10:38.740 --> 10:41.060
übertragen, muss das Programm anders darauf reagieren.

10:41.500 --> 10:45.220
Also hier ist nochmal dieses CGI-Beispiel oder dieses Perl-Beispiel

10:45.220 --> 10:45.820
angegeben.

10:45.820 --> 10:51.320
Wir haben jetzt aber als erstes eine Variable Request Method.

10:53.680 --> 10:58.720
Und da wird also als erstes abgefragt, wie die Request-Methode ist.

10:58.860 --> 11:01.160
Das heißt, es wird eine Umgebungsvariable abgefragt.

11:01.320 --> 11:04.660
In der Umgebungsvariable werden alle möglichen Parameter dieses HTTP

11:04.660 --> 11:06.080
-Aufrufs abgespeichert.

11:06.660 --> 11:10.300
Und in der Umgebungsvariable Request Method, die hier angegeben ist,

11:10.740 --> 11:12.600
da kann man halt den Wert rausholen.

11:12.680 --> 11:14.180
Der Wert ist entweder Get oder Post.

11:14.180 --> 11:17.320
Und jetzt kann man den Wert abfragen.

11:17.840 --> 11:26.200
Wenn der also gerade Get ist, dann steht die Information für diesen

11:26.200 --> 11:29.460
Aufruf in dem Query-String drin.

11:29.940 --> 11:33.400
Das heißt, dann kann der Wert aus dem Query-String, aus der

11:33.400 --> 11:36.480
Umgebungsvariable Query-String, direkt rausgeholt werden.

11:36.920 --> 11:39.800
Das wäre dann Form-Info-Gleich-Env-Query-String.

11:42.820 --> 11:46.720
Andernfalls wäre das halt die Methode Post.

11:47.560 --> 11:52.740
Und dann ist es wichtig zu sehen, wie lang ist denn der Inhalt dieses

11:52.740 --> 11:53.440
Rumpfes.

11:53.820 --> 11:57.000
Das heißt, wie viele Bytes müssen jetzt von dem Programm gelesen

11:57.000 --> 11:57.480
werden.

11:58.180 --> 12:00.720
Deswegen Wert der variablen Content-Length.

12:01.430 --> 12:11.560
Und dann wird aus dem Input-Strom gelesen, also das Programm, hallo

12:11.560 --> 12:12.200
.pl.

12:12.600 --> 12:21.400
Das kann ja lesen aus Standard-In und liest dort diese Bytes, die in

12:21.400 --> 12:25.640
der umgebungsvariablen Content-Length standen und weist den Wert zu,

12:25.720 --> 12:29.800
der dort gelesen wurde, der lokalen Variablen Form-Info.

12:31.520 --> 12:37.700
Und dann kann man daran gehen, die Form-Info, genau wie wir das in dem

12:37.700 --> 12:40.880
Programm voriges Mal schon gesehen haben, zu verwenden.

12:41.140 --> 12:45.760
Man weiß, das ist in diesem Fall eine Variable und ein Name.

12:46.820 --> 12:54.220
Und das wird also hier entsprechend aufgeteilt anhand dieses Zeichens

12:54.220 --> 12:54.740
gleich.

12:55.060 --> 12:58.780
Wie gesagt, hatte ich letztes Mal schon angedeutet, irgendwo steht in

12:58.780 --> 13:00.540
der Form-Info ein Gleichheitszeichen.

13:00.780 --> 13:03.920
Der linke Teil ist der Variablen-Name, der rechte Teil der Wert.

13:04.400 --> 13:05.880
Wird zumindest so interpretiert.

13:05.880 --> 13:10.820
Und wenn also dieser als Variablen-Name interpretierte Teil gerade

13:10.820 --> 13:17.360
Name ist, dann wird halt Hallo und der Wert dieser Variablen

13:17.360 --> 13:21.120
ausgegeben, nämlich der Wert, der hier auf der rechten Seite gestanden

13:21.120 --> 13:21.440
hat.

13:21.940 --> 13:26.280
Und wenn das nicht so eine Variable ist, wird diese gesamte Form-Info

13:26.280 --> 13:28.280
ausgegeben mit einem Fragezeichen dahinter.

13:29.140 --> 13:32.360
Also, nur, dass man nochmal sieht, was man hier machen kann.

13:32.360 --> 13:33.700
Ein sehr einfaches Beispiel.

13:34.200 --> 13:37.620
Sie werden sicherlich in konkreten Anwendungen das wesentlich

13:37.620 --> 13:39.360
komplizierter machen.

13:39.500 --> 13:42.200
Nur solche komplizierteren Beispiele passen nicht auf eine Folie.

13:43.620 --> 13:47.900
Das ist eine Methode, dass Sie ein Programm wie ein Perl-Script zum

13:47.900 --> 13:55.300
Beispiel verwenden, um Inhalte, die der Benutzer übertragen hat, zu

13:55.300 --> 13:59.700
verwenden und daraus eine entsprechende Antwort zu erzeugen.

14:00.880 --> 14:05.300
Das heißt, dadurch habe ich abhängig von dem, was der Benutzer

14:05.300 --> 14:10.820
eingegeben hat, Informationen erzeugt, die auf dem Browser angezeigt

14:10.820 --> 14:11.180
werden.

14:11.840 --> 14:14.720
Es gibt dafür noch eine ganze Reihe weiterer Möglichkeiten.

14:14.960 --> 14:19.080
Eine Möglichkeit sind die sogenannten Server-Side-Includes.

14:20.600 --> 14:23.600
Ich habe Ihnen hier zwei Links angegeben, wo Sie dazu alles Mögliche

14:23.600 --> 14:24.500
nachlesen können.

14:25.020 --> 14:28.120
Aber ich kann Ihnen das Wesentliche auch kurz, ein paar Punkte dazu

14:28.120 --> 14:28.840
kurz nennen.

14:28.840 --> 14:31.180
Was sind Server-Side-Includes?

14:31.220 --> 14:33.120
Sie haben ein HTML-Dokument.

14:33.680 --> 14:35.720
Also hier steht irgendwie HTML.

14:36.920 --> 14:39.840
Und dann gibt es sogenannte Server-Side-Includes.

14:39.960 --> 14:42.940
Das heißt, Sie haben hier irgendwo ein Tag.

14:43.060 --> 14:48.540
Da steht dann hier dieses spitze Klammer, Ausrufezeichen, zwei Striche

14:48.540 --> 14:50.720
und ein Nummernzeichen.

14:51.720 --> 15:00.380
Und alles, was dahinter steht, wird jetzt von dem HTTP-Protokoll

15:00.380 --> 15:06.400
interpretiert, als etwas, was der Server auswerten muss.

15:06.980 --> 15:12.020
Der Server schickt ja die HTML-Seite in dem HTTP-Response an den

15:12.020 --> 15:15.860
Client, der diesen HTTP-Request rausgeschickt hatte.

15:15.860 --> 15:20.240
Und beim Rausschicken wird zunächst mal diese Seite, die geschickt

15:20.240 --> 15:22.140
werden soll, durchgesehen.

15:22.780 --> 15:27.300
Und dann steht hier solch ein Teil drin, irgendwie beendet mit zwei

15:27.300 --> 15:31.200
Strichen und einem spitzen Klammer, so wie das hier steht.

15:32.780 --> 15:39.320
Und das, was dort drin steht, wie gesagt, muss vom Server ausgewertet

15:39.320 --> 15:39.660
werden.

15:39.940 --> 15:41.040
Server -Side-Includes.

15:41.060 --> 15:44.140
Das heißt, der Server soll Informationen dort reinschreiben.

15:45.400 --> 15:48.440
Was für Informationen könnten das sein?

15:49.300 --> 15:50.400
Also hier ist ein Beispiel.

15:52.840 --> 15:57.740
Sie haben hier ein dynamisches, sogenanntes dynamisches HTML mit SSI.

15:57.960 --> 16:02.060
Also dynamisch, weil Sie halt jedes Mal, wenn Sie diese Seite

16:02.060 --> 16:04.860
aufrufen, andere Ergebnisse kriegen.

16:06.480 --> 16:08.000
Was soll gemacht werden?

16:08.120 --> 16:12.880
Es soll Datum, Uhrzeit auf dem Server-Rechner ausgegeben werden.

16:14.020 --> 16:17.580
Das können Sie natürlich nicht auf einer statischen Seite explizit

16:17.580 --> 16:18.040
hinschreiben.

16:18.160 --> 16:20.500
Das muss ja aktuell immer dort eingebettet werden.

16:20.600 --> 16:23.100
Damit das gemacht wird, brauchen Sie halt eine entsprechende

16:23.100 --> 16:25.480
Möglichkeit.

16:26.220 --> 16:34.980
Das wird hier über dieses Server-Side-Include gemacht.

16:34.980 --> 16:40.360
Also hier wird einfach ein Echo-Befehl ausgeführt auf einer Variablen.

16:40.460 --> 16:45.860
Und dieser Variablen, die hier ausgewertet wird, ist eine Variable auf

16:45.860 --> 16:46.740
Server -Seite.

16:47.160 --> 16:52.980
DateLocal ist also das aktuelle Datum auf der Server-Seite.

16:53.540 --> 16:56.460
Und wenn Sie dieses aufrufen, dann wird also zunächst mal stehen,

16:56.520 --> 16:58.040
Datum, Uhrzeit auf dem Server-Rechner.

16:58.120 --> 17:01.920
Im Doppelpunkt dahinter steht das Datumsformat mit Datum, Uhrzeit.

17:01.920 --> 17:05.720
Und unten drunter steht noch etwas, Ihr www-Browser.

17:06.260 --> 17:08.120
Und dann wird hier noch eine Variable angegeben.

17:08.680 --> 17:11.840
Bar http-useragent.

17:12.300 --> 17:17.800
http-useragent ist ein Parameter, der bei dem HTTP-Request automatisch

17:17.800 --> 17:18.620
übertragen wird.

17:18.800 --> 17:21.100
Das fügt der Browser automatisch ein.

17:22.020 --> 17:28.960
Und das heißt, hier kann der Server abfragen, was ist eigentlich der

17:28.960 --> 17:32.520
Browser, der von dem anfragenden Benutzer verwendet wird, der auf dem

17:32.520 --> 17:35.240
Client gerade läuft, aus dem diese Frage erzeugt wurde.

17:35.500 --> 17:38.920
Und kann also auf der Seite schreiben, Ihr www-Browser, meinetwegen

17:38.920 --> 17:41.500
Firefox oder Internet Explorer oder was immer.

17:42.700 --> 17:46.680
Und dann wird in diesem Beispiel ein Perl-Skript ausgeführt.

17:47.300 --> 17:49.820
Hier steht also dieser übliche Dummy-Name.

17:50.380 --> 17:53.260
Irgendetwas, was immer gerade ausgeführt werden soll.

17:53.940 --> 17:55.960
Also Sie können da beliebig viel machen.

17:56.120 --> 17:58.960
Und auch so etwas ist also ein Server-Site-Include.

17:59.420 --> 18:01.080
Auch hier muss der Server etwas machen.

18:02.060 --> 18:05.260
Das ist also ein exec-Befehl an den Server.

18:05.260 --> 18:10.480
Und dieser exec-Befehl soll also ein CGI-Skript anstoßen.

18:11.560 --> 18:13.780
Und das CGI-Skript ist dieses blafaser.pl.

18:13.900 --> 18:17.700
Das heißt, Sie haben hier eine Reihe von Möglichkeiten, Seiten

18:17.700 --> 18:20.600
entsprechend dynamisch mit Inhalt zu füllen.

18:21.720 --> 18:26.720
Und das genauere dazu finden Sie auf den URL-Seiten.

18:26.720 --> 18:35.960
Hier sind nochmal die einzelnen Befehle aufgeführt.

18:36.100 --> 18:38.300
Das eine, was Sie gesehen haben gerade eben, war das Echo.

18:39.640 --> 18:47.560
Sie schreiben einfach das, was als Wert einer Variablen ermittelt

18:47.560 --> 18:49.800
wird, als Text an die Stelle.

18:50.340 --> 18:53.340
Das andere ist ein exec, dass Sie ein Skript ausführen.

18:53.340 --> 18:57.060
Entweder ein CGI-Skript oder irgendein anderes Programm.

18:57.220 --> 18:59.660
Sie können also eine Kommandozeile dort hinschreiben.

19:00.600 --> 19:06.140
Oder es wird hier eine Fehlermeldung gemacht oder ein

19:06.140 --> 19:10.500
Dateigrößenformat oder was immer wird hier angegeben.

19:11.100 --> 19:15.840
Also die Konfiguration wird hier etwas konfiguriert.

19:18.480 --> 19:22.760
Dann kann es sein, dass Sie die Feilgröße angeben wollen.

19:22.860 --> 19:26.040
F-Size bedeutet also, dass Sie dann hinter F-Size schreiben müssen.

19:26.140 --> 19:28.480
Feil gleich und entsprechend den Namen der Datei.

19:28.900 --> 19:31.440
Dann wird die Dateigröße dort angegeben.

19:31.980 --> 19:36.060
Oder Sie wollen den Zeitstempel der Datei haben.

19:36.160 --> 19:39.160
Das heißt, Sie wollen den Zeitpunkt der letzten Modifikation angeben.

19:39.900 --> 19:42.620
So etwas finden Sie auf vielen Webseiten.

19:42.620 --> 19:46.820
Sie können am Ende unten reinschreiben, Zeitpunkt der letzten

19:46.820 --> 19:47.360
Änderung.

19:47.520 --> 19:50.960
Das wird also ganz einfach über ein Server-Site include realisiert.

19:51.840 --> 19:54.020
Das wird vom Server automatisch ausgeführt.

19:54.480 --> 19:58.640
Und damit hat man dann diesen Zeitstempel der Datei dort explizit mit

19:58.640 --> 19:59.660
reingeschrieben.

20:00.100 --> 20:05.760
Oder include, da könnte man irgendwas reinschreiben, also ein Bild

20:05.760 --> 20:06.360
oder was immer.

20:07.360 --> 20:10.240
Nur, dass Sie sehen, es gibt dort eine Reihe verschiedener

20:10.240 --> 20:16.040
Möglichkeiten, solche Inhalte auf Server-Seite zu erzeugen und beim

20:16.040 --> 20:23.340
Aufruf einer HTTP-Seite bei Erzeugung der HTTP-Response in diese HTML

20:23.340 --> 20:25.400
-Seite mit einzufügen.

20:26.940 --> 20:28.620
Das ist aber nicht das Einzige.

20:28.760 --> 20:30.360
Es gibt dafür noch mehr Möglichkeiten.

20:31.040 --> 20:35.120
Es gibt sogenannte Java-Servlets und Java-Server-Pages.

20:35.120 --> 20:43.220
Das ist etwas, was von Sun entwickelt wurde und auf Java basiert und

20:43.220 --> 20:48.380
im Prinzip die Möglichkeiten von CGI-Skripten und Server-Site-Includes

20:49.400 --> 20:51.460
über Java zur Verfügung stellt.

20:51.620 --> 20:55.200
Es gibt ja immer so die verschiedenen Standards, die entwickelt

20:55.200 --> 20:55.680
werden.

20:56.460 --> 21:00.700
Es gibt halt die Java-basierten Dinge und halt andere Dinge, die etwas

21:00.700 --> 21:02.520
allgemeiner verwendbar sind.

21:04.100 --> 21:09.940
Der Vorteil hierbei ist, dass man halt auf die Möglichkeiten von Java

21:09.940 --> 21:11.560
-Programmen hier zurückgreifen kann.

21:12.280 --> 21:18.440
Java-Programme sind ja in gewissen Grenzen plattformunabhängig und

21:18.440 --> 21:19.760
deswegen gut portierbar.

21:21.160 --> 21:25.940
Sie kennen alle die Vorteile von Java, dass es halt objektorientiert

21:25.940 --> 21:30.180
ist, was bei diesen anderen nicht unbedingt in dem Fall immer

21:30.180 --> 21:31.140
gewährleistet sein muss.

21:31.140 --> 21:37.140
Sie haben eine effizientere Ausführung, weil bei CGI-Skripten ist es

21:37.140 --> 21:40.420
so, dass wir bei jedem Aufruf eines CGI-Skripts einen neuen Prozess

21:40.420 --> 21:40.980
starten.

21:41.440 --> 21:42.660
Das ist zeitaufwendig.

21:43.140 --> 21:50.360
Bei Java-Server-Pages, insbesondere bei Java-Servlets, ist es so, dass

21:50.360 --> 21:55.200
diese Servlets einmal gestartet werden und dann können sie durch

21:55.200 --> 22:00.920
mehrere aufeinanderfolgende Aufrufe angesprochen werden und müssen

22:00.920 --> 22:03.380
nicht immer wieder als neuer Prozess gestartet werden.

22:04.340 --> 22:08.140
Was Sie brauchen, wenn Sie so ein Servlet machen, ist ein entsprechend

22:08.140 --> 22:11.020
servletfähiger Web-Server.

22:12.280 --> 22:16.600
Ein Standard-Web-Server, auf dem also solche Java-Servlets ausgeführt

22:16.600 --> 22:24.000
werden können, ist der Apache Tomcat, den Sie als eine Ergänzung eines

22:24.000 --> 22:26.160
Apache -Web-Servers installieren können.

22:26.160 --> 22:31.160
Und darauf kann man solche Java-Servlets ausführen.

22:34.500 --> 22:40.060
Ich habe noch ein paar kleinere Beispiele, ich will aber, wie immer,

22:40.680 --> 22:42.060
Ihnen nicht zu viel erzählen darüber.

22:42.960 --> 22:46.840
Java-Servlets können also folgendes machen.

22:47.060 --> 22:50.360
Schauen wir uns an, was dieses Beispiel hier alles enthält.

22:50.360 --> 22:54.300
Wir haben eine Package, in der alles Mögliche drinstehen soll und

22:54.300 --> 22:59.100
entsprechend die ganzen APIs, die gebraucht werden innerhalb dieses

22:59.100 --> 23:00.340
Java -Programms.

23:01.240 --> 23:10.260
Und dieses Servlet ist also ein Objekt, das erbt von der Klasse HTTP

23:10.260 --> 23:11.080
Servlet.

23:12.080 --> 23:17.760
Und in diesem Fall haben wir also eine Methode doGet.

23:18.720 --> 23:27.340
Diese Methode doGet soll also ein HTTP-Request erzeugen.

23:27.460 --> 23:29.120
Wir haben hier Request und Response drin.

23:34.520 --> 23:41.620
Der Inhalt dieser Methode sieht so aus, dass wir bei der Response als

23:41.620 --> 23:44.580
Inhalt Text plain reinschreiben.

23:44.820 --> 23:48.040
Sie erinnern sich vielleicht, das hatten wir gesehen bei dem einen

23:48.040 --> 23:52.100
kleinen Beispiel über HTTP-Responses, dass man angeben muss, von

23:52.100 --> 23:58.540
welcher Art der Inhalt ist, den man hier abliefert.

23:58.540 --> 24:00.340
Als Antwort auf ein Request.

24:02.100 --> 24:05.480
Und hier wird also etwas geschrieben.

24:06.520 --> 24:12.820
Da muss also erstmal ein Response über ein Get-Writer, ein Output

24:12.820 --> 24:14.180
-Stream, aufgemacht werden.

24:14.460 --> 24:17.560
Und da kann ich halt mit dem üblichen Printline hier Hello World

24:17.560 --> 24:17.920
schreiben.

24:18.300 --> 24:21.000
Also das ist ein einfaches Servlet, um Hello World zu schreiben.

24:21.120 --> 24:23.640
Sicherlich nicht das typische Beispiel für ein Servlet, weil das

24:23.640 --> 24:24.560
völlig statisch ist.

24:24.560 --> 24:29.320
Aber es soll nur andeuten, welcher Art hier etwas getan werden kann.

24:30.340 --> 24:35.920
Und aufrufen kann man es halt, wenn man entsprechend die Domain kennt,

24:36.080 --> 24:40.380
auf der dieses Servlet steht, dann wird man dort halt in dem

24:40.380 --> 24:45.420
Verzeichnis Servlets entsprechend diese Klasse, dieses Objekt

24:45.420 --> 24:50.520
aufrufen, eben dieses Servlet, das dieses Hello World schreiben soll.

24:54.720 --> 24:59.520
Sie können, das ist hier nicht geschehen, also diese Bemerkung hier

24:59.520 --> 25:03.580
unten, die Variable Request, kann dazu verwendet werden, um eingehende

25:03.580 --> 25:06.860
Daten auszulesen.

25:07.120 --> 25:12.660
Das ist klar, mit dem HTTP-Request werden eine ganze Reihe Inhalte

25:12.660 --> 25:15.400
mitgeliefert, Informationen mitgeliefert, auf die ich vorher schon

25:15.400 --> 25:16.200
hingewiesen habe.

25:17.080 --> 25:20.080
Und die kann man natürlich innerhalb dieses Servlets verwenden.

25:20.340 --> 25:24.200
Das ist hier nicht geschehen, sondern hier wird nur diese Response

25:24.200 --> 25:25.800
erzeugt.

25:25.900 --> 25:29.160
Da wird gar nichts verwendet, weil ich ja nur einen statischen Text

25:29.160 --> 25:30.280
reinschreibe.

25:30.760 --> 25:34.840
Und man kann natürlich alles mögliche in diese Response reinschreiben,

25:34.940 --> 25:39.020
mit den Möglichkeiten, die man in Java-Programmen zur Verfügung hat.

25:39.020 --> 25:44.080
Und natürlich die Möglichkeiten, die in dieser API für Servlets

25:44.080 --> 25:44.940
vorgesehen sind.

25:46.660 --> 25:52.900
Hier habe ich jetzt genau das Request mitverwendet.

25:53.060 --> 25:57.540
Hier haben wir wieder so eine Methode, doGet, wobei wir auch wieder

25:57.540 --> 26:04.760
hier Request und Response als Variablen drin haben und wie vorher

26:04.760 --> 26:07.440
Response, SetContentType, Text, Plain.

26:07.440 --> 26:15.420
Und beim Schreiben verwenden wir die Request-Variable und verwenden

26:15.420 --> 26:18.520
dort den Parameter, also GetParameterName.

26:18.680 --> 26:24.640
Das heißt, wir gehen davon aus, dass wir in der Parameterliste eine

26:24.640 --> 26:27.100
Variable mit Namen Name haben.

26:27.800 --> 26:33.320
Und wenn also im QueryString dieser Parameter auftaucht, wird der

26:33.320 --> 26:35.300
entsprechende Wert ausgegeben.

26:35.300 --> 26:40.260
Das heißt, das, was wir vorher schon gesehen hatten, wenn in einem

26:40.260 --> 26:45.600
String oder in dem QueryString diese Parameterliste mit dem

26:45.600 --> 26:51.380
entsprechenden Wert steht, dann wird dieser entsprechende Name hier

26:51.380 --> 26:53.620
hinter dem Hallo ausgegeben.

26:54.160 --> 26:58.720
Also immer wieder das gleiche Beispiel, nur dieses Beispiel gibt eben

26:58.720 --> 27:04.340
wieder die Interaktion, die man natürlich gerade über solche Servlets

27:04.340 --> 27:05.080
darstellen will.

27:05.340 --> 27:08.260
Das Hello World Beispiel ist eigentlich nicht sinnvoll, weil wir dort

27:08.260 --> 27:09.840
ja nur eine statische Seite erzeugen.

27:11.440 --> 27:16.060
Noch ein Beispiel, hier wollen wir ein bisschen mehr machen.

27:17.400 --> 27:20.980
Es ist ja so, dass wir bei solchen Queries in der Regel nicht nur

27:20.980 --> 27:24.160
einen Parameter reinschreiben werden, sondern eine ganze Reihe.

27:24.160 --> 27:31.080
Also wenn Sie sich irgendwelche Queries anschauen, ist klar, man kann

27:31.080 --> 27:33.840
eine beliebige Anzahl von Parametern reinschreiben.

27:34.000 --> 27:36.360
Und dazu gibt es halt Standardmethoden.

27:37.060 --> 27:40.180
Also ich kann mir zum Beispiel den Request anschauen.

27:40.980 --> 27:44.520
Und in dem Request gibt es jetzt in diesem QueryString eine Reihe von

27:44.520 --> 27:47.380
Parametern, eine Reihe von Variablen.

27:47.380 --> 27:52.820
Und jetzt werden einfach alle Parameternamen hier extrahiert.

27:53.820 --> 27:59.220
Und das wird eine Liste, All Names, eine Aufzählung.

28:00.320 --> 28:05.280
Und jetzt kann ich in dieser Aufzählung der Parameternamen, die ich

28:05.280 --> 28:09.020
gerade herausgezogen habe, natürlich etwas machen.

28:09.020 --> 28:15.080
Ich kann also diese in üblicher Art und Weise verwenden, dass ich über

28:15.080 --> 28:20.800
alle Elemente dieser Enumeration iteriere und einfach jetzt etwas

28:20.800 --> 28:22.200
schreibe.

28:22.380 --> 28:26.420
Also ich möchte in diesem Beispiel etwas machen.

28:26.520 --> 28:30.420
Ich möchte die Parameternamen und die Werte alle aufschreiben.

28:30.420 --> 28:39.720
Also hier wird von All Names, das ist das was hier die Enumeration

28:39.720 --> 28:42.060
war, wird das nächste Element rausgeholt.

28:43.180 --> 28:50.700
Und es wird der Wert als String dargestellt und wird entsprechend

28:50.700 --> 28:54.440
gedruckt auf dem Ausgabestrom.

28:55.680 --> 28:58.340
Und dahinter wird halt eine neue Zeile geschrieben.

28:58.340 --> 29:10.340
Und dann wird wieder ein String erzeugt, ein String Array erzeugt.

29:11.200 --> 29:15.000
Es wird also ein String Array erzeugt, weil es manchmal auch sein

29:15.000 --> 29:19.140
kann, dass man mehrere Werte hinter einen solchen Parameter schreibt.

29:22.180 --> 29:24.440
Also getParameterValues für thisName.

29:24.580 --> 29:29.700
Da wird also der Name des Parameters hingegeben als Parameter für

29:29.700 --> 29:31.100
diesen Aufruf.

29:31.800 --> 29:34.880
Und es werden alle Werte, die dort stehen, im Weiteren verwendet.

29:34.940 --> 29:38.240
Wir haben jetzt hier wieder einen solchen String.

29:39.300 --> 29:41.260
allValues hat eine bestimmte Länge.

29:45.120 --> 29:51.300
Wenn dieser Wert oder dieses Array die Länge 1 hat, ist es der

29:51.300 --> 29:53.520
Standardfall, wir haben nur einen Wert angegeben.

29:54.280 --> 30:01.420
Für den Fall wird dieser Wert genommen, thisValue gleich allValues

30:01.420 --> 30:04.620
Null, also das was an dieser ersten Position steht.

30:05.540 --> 30:13.820
Und jetzt kann es natürlich sein, dass dieser Wert die Länge 0 hat.

30:14.140 --> 30:21.280
Es wäre ein leerer String als einziges Argument für diesen Namen.

30:21.420 --> 30:24.880
Das heißt, das ist ein Parameter, für den überhaupt kein Wert

30:24.880 --> 30:25.820
abgeliefert wurde.

30:29.740 --> 30:35.860
Also wenn der Wert die Länge 0 hat, wird einfach hingeschrieben in die

30:35.860 --> 30:37.300
Ausgabe leer.

30:38.760 --> 30:43.420
Andernfalls, wenn die Länge nicht 0 ist, wenn also tatsächlich

30:43.420 --> 30:47.140
mindestens ein Zeichen gestanden hat, dann wird genau der Wert

30:47.140 --> 30:49.100
thisValue herausgeschrieben.

30:50.100 --> 31:02.120
Wenn jetzt die Länge nicht 1 war, dann wird einfach für alle Werte,

31:02.260 --> 31:09.480
die dort stehen in diesem Array, der entsprechende Wert ausgegeben.

31:09.480 --> 31:15.240
Also da wird jeweils hingeschrieben ein I, der Wert der Laufvariablen

31:15.240 --> 31:15.600
I.

31:16.060 --> 31:18.340
Dahinter wird ein Punkt und eine Klammer zugeschrieben.

31:19.140 --> 31:22.840
Und dann wird der entsprechende Parameterwert dort reingeschrieben.

31:22.920 --> 31:26.240
Das heißt, wir haben dann irgendeinen Parameterwert in der Ausgabe

31:26.240 --> 31:26.640
stehen.

31:26.820 --> 31:31.500
Also hier bei dem Beispiel wäre das vielleicht unser Name gewesen oder

31:31.500 --> 31:31.880
was immer.

31:31.880 --> 31:37.300
Und darunter würde dann stehen, da ich mit I gleich 0 anfange, würde

31:37.300 --> 31:42.500
ich hier stehen haben 0 Punkt Klammer zu, 1 Punkt Klammer zu und

31:42.500 --> 31:47.400
entsprechend jeweils die Werte bis zu dem letzten Wert, der dort

31:47.400 --> 31:48.340
gelesen wurde.

31:48.920 --> 31:52.580
Das ist entsprechend ganz einfach die Liste der Werte zu diesem einen

31:52.580 --> 31:53.080
Parameter.

31:53.820 --> 31:58.960
Und dann wäre das das, was dieses Servlet erzeugen soll.

32:01.060 --> 32:04.580
So, das also als weiteres Beispiel.

32:05.240 --> 32:16.760
Jetzt haben wir auch bei den SSEs und bei den Perl Scripts haben wir

32:16.760 --> 32:21.520
gesehen, da kann man Umgebungsvariablen verwenden, man kann Query

32:21.520 --> 32:22.400
Springs verwenden.

32:23.060 --> 32:29.420
Die CGI-Umgebungsvariablen können auch in den Servlets abgerufen

32:29.420 --> 32:31.080
werden durch entsprechende Methoden.

32:31.220 --> 32:35.940
Sie können also den Inhalt der Umgebungsvariablen auch im Java Servlet

32:35.940 --> 32:42.440
auslesen, indem Sie diese Methode GetQueryString aufrufen.

32:42.920 --> 32:47.400
Dann wird halt gerade diese Umgebungsvariable QueryString, wobei das

32:47.400 --> 32:50.900
hier, da fehlt das Unterstreichen, diese Variable wird dort

32:50.900 --> 32:55.820
ausgelesen, genauso GetRemoteUser würde den Wert dieser

32:55.820 --> 33:03.080
Umgebungsvariablen auslesen, PathInfo und so weiter, da würden alle

33:03.080 --> 33:08.300
diese möglichen Umgebungsvariablen von CGI, also von diesem Common

33:08.300 --> 33:12.040
Gateway Interface, hier über Methoden zur Verfügung stehen.

33:13.020 --> 33:17.680
Und als weiteres, ein Punkt, den wir bisher noch nicht angesprochen

33:17.680 --> 33:21.320
haben, auf den wir gleich kommen werden, Sie können innerhalb dieser

33:21.320 --> 33:23.880
Servlets auch Cookies erzeugen.

33:24.120 --> 33:26.620
Was Cookies sind, werde ich gleich noch genauer sagen.

33:27.360 --> 33:33.200
Sie können also hier drin ein Cookie erzeugen, in dem zum Beispiel

33:33.200 --> 33:36.020
User drinsteht und 123.

33:36.020 --> 33:38.580
Also diese beiden Werte würden dort drinstehen.

33:39.000 --> 33:42.040
Eine Variable, User und dahinter der Wert 123.

33:42.920 --> 33:51.920
Und Sie würden bei der Antwort an den anfragenden Client in der HTTP

33:51.920 --> 34:00.660
-Response ein Cookie anfügen, das also lokal auf dem Client

34:00.660 --> 34:05.000
gespeichert werden soll und diese Information, also hier User 123,

34:05.980 --> 34:06.720
enthalten soll.

34:08.900 --> 34:11.720
Warum schreibe ich irgendetwas bei den Benutzern rein?

34:11.940 --> 34:17.120
Also Sie wissen alle, Sie können bei Ihrem Browser oder im Browser

34:17.120 --> 34:18.900
werden Cookies gespeichert.

34:19.540 --> 34:21.140
Man kann das unterbinden.

34:22.080 --> 34:23.780
Warum verwendet man solche Cookies?

34:23.980 --> 34:28.640
Einfach, um es dem Server zu ermöglichen, bestimmte Informationen

34:28.640 --> 34:31.540
abzulegen, lokal beim Client.

34:31.540 --> 34:40.660
Die dann beim nächsten Aufruf der gleichen URL wieder im HTTP-Request

34:40.660 --> 34:41.980
mitgeschickt werden.

34:42.940 --> 34:50.360
Und das heißt, wenn das nächste Mal die gleiche URL vom Client

34:50.360 --> 34:55.700
abgesandt wird, dann wird die Cookie-Information mitgeliefert und der

34:55.700 --> 35:00.180
Server kann diese Cookie-Information auswerten und weiß irgendetwas

35:00.180 --> 35:03.260
über den Benutzer oder was immer er sich gemerkt hat in diesem Cookie,

35:03.480 --> 35:05.580
über den letzten Besuch auf dieser Seite.

35:07.580 --> 35:09.660
Gut, das also ganz kurz.

35:09.740 --> 35:12.400
Sie haben also eine ganze Reihe von Möglichkeiten in diesen Java

35:12.400 --> 35:12.900
-Servlets.

35:13.900 --> 35:19.500
Und Sie können hier auch, das waren also jetzt die ganzen Servlet

35:19.500 --> 35:24.720
-Möglichkeiten, in Java-Server-Pages, also Java-Server-Pages sind im

35:24.720 --> 35:31.940
Prinzip, Java-Server-Pages sind Seiten, die haben die Endung JSP, sind

35:31.940 --> 35:40.760
aber im Prinzip HTML-Seiten, in denen Sie sogenannte Scriptlets drin

35:40.760 --> 35:44.220
haben, da können Sie also diese, im Prinzip werden dort Servlets

35:44.220 --> 35:52.050
erzeugt, da können Sie also dann über diese Art von Tags in einem HTML

35:52.050 --> 35:59.690
-Dokument Servlets im Prinzip anstoßen und ganz ähnlich zu den Server

35:59.690 --> 36:07.430
-Site -Includes können Sie hier über Java-ähnliche Strukturen oder

36:07.430 --> 36:12.670
sprachliche Formulierungen auf Server-Seite Aktionen anstoßen.

36:15.330 --> 36:22.230
Diese JSPs, also diese werden beim Aufruf zu Servlets umgeformt und

36:22.230 --> 36:29.430
dieses Servlet liefert dann die gesamte Seite als Ergebnis, wertet

36:29.430 --> 36:37.450
dabei diese eingesprengelten Scriptlets, wie es hier angegeben ist,

36:37.570 --> 36:42.770
aus und erzeugt entsprechend die Informationen, die dort angestoßen

36:42.770 --> 36:43.050
werden.

36:44.970 --> 36:47.950
Und auch hier steht wieder etwas, dass einige Variablen als

36:47.950 --> 36:54.550
vordefiniert verwendet werden, aber wenn man solch eine Java-Server

36:54.550 --> 36:57.850
-Page schreiben muss, ist es klar, das habe ich Ihnen oft genug

36:57.850 --> 37:00.750
gesagt, müssen Sie auf die entsprechenden Dokumentationen gehen und

37:00.750 --> 37:04.510
sehen, was Sie dort alles an Variablen zur Verfügung haben.

37:04.910 --> 37:09.330
Das sind hier nur so einige der Standard-Dinge, auf die man zugreifen

37:09.330 --> 37:09.670
kann.

37:17.470 --> 37:24.890
Dieses Beispiel hier, eine Seite, auf der dieses Scriptlet drin ist,

37:25.210 --> 37:32.610
würde also umgeformt werden zu einem Servlet, bei dem unter anderem so

37:32.610 --> 37:39.170
eine Anweisung drinsteht, dass z.B.

37:39.510 --> 37:44.650
der Client Hostname, da wird dann der Remote Host entsprechend

37:44.650 --> 37:45.990
aufgeschrieben.

37:50.040 --> 37:53.880
Das, was hier steht, ist also genau das, was jetzt im letzten Beispiel

37:53.880 --> 37:58.540
steht, hier wurde eine JSP-Expression, also so eine Java-Server-Page

37:58.540 --> 38:06.080
-Expression eingesetzt und dass diese Art von Instruktionen an Ort und

38:06.080 --> 38:08.860
Stelle ausgewertet wird, habe ich Ihnen schon deutlich gesagt.

38:10.140 --> 38:14.100
Es ist etwas, was genau den Server-Side-Includes entspricht

38:17.640 --> 38:22.680
und man kann auf diese Art und Weise dynamische Seiten erzeugen.

38:23.680 --> 38:27.920
Hier nochmal zwei Beispiele.

38:28.500 --> 38:32.480
Hier wird eine Variable definiert.

38:32.640 --> 38:42.380
In diesem Fall haben wir eine solche Java-Server-Page-Expression oder

38:42.380 --> 38:43.080
so einen Ausdruck.

38:43.680 --> 38:47.040
Da wird eine Variable deklariert, eine Variable AccessCount und

38:47.040 --> 38:48.160
initialisiert auf 0.

38:48.160 --> 38:55.400
Und Sie wollen praktisch beim Aufruf der Seite als Wert angeben, wie

38:55.400 --> 38:57.420
oft auf die Seite schon zugegriffen wurde.

38:59.340 --> 39:03.440
Und zwar Anzahl der Zugriffe seit Reboot.

39:03.620 --> 39:10.000
Dann wird hier entsprechend bei einem konkreten Aufruf der Seite, beim

39:10.000 --> 39:16.120
Zugriff auf die Seite, der AccessCount um 1 erhöht und ausgegeben.

39:18.560 --> 39:19.880
Anderes Beispiel.

39:20.500 --> 39:23.560
Sie können zufallsmäßig irgendetwas erzeugen.

39:23.840 --> 39:28.820
Sie wollen hier zufällig Kopf oder Zahl angeben.

39:28.960 --> 39:33.280
Können Sie also durch Aufruf einer Funktion Math.random einen

39:33.280 --> 39:37.100
Zufallswert erzeugen und entsprechend den Wert Kopf oder Zahl

39:37.100 --> 39:38.160
schreiben.

39:39.080 --> 39:44.180
Also nur nochmal als Beispiel dafür, was man mit solchen Server-Side

39:44.180 --> 39:46.740
-Includes oder in diesem Fall eben nicht Server-Side-Includes, sondern

39:46.740 --> 39:49.260
Java -Server-Pages alles machen kann.

39:51.560 --> 39:58.300
Sie können die Möglichkeiten von Java hier ziemlich weitgehend

39:58.300 --> 39:58.920
ausnutzen.

39:59.640 --> 40:03.120
Insbesondere können Sie auch Java Beans erzeugen.

40:05.160 --> 40:09.080
Ich gehe hier nicht auf die Java Beans jetzt genauer ein.

40:09.080 --> 40:18.860
Beans hat eine Möglichkeit, wie man Programme als aktive Objekte

40:18.860 --> 40:23.060
innerhalb von Java-Umgebungen verwenden kann.

40:23.280 --> 40:24.700
Was wird hier gemacht?

40:24.860 --> 40:34.300
Hier wird ein Bean aufgerufen innerhalb einer Java-Server-Page.

40:36.780 --> 40:43.640
Und dieses Bean bekommt also einen Namen, Quad.

40:45.200 --> 40:50.240
Und der Inhalt steht innerhalb, also der Name dieses Programms, dieser

40:50.240 --> 40:55.360
Bean, oder das Programm ist abgelegt, unter HAL.quadrat.

40:55.440 --> 41:00.520
Sie erinnern sich, HAL, das war vorher ein Package, in dem alle

41:00.520 --> 41:02.400
möglichen Klassen abgelegt wurden.

41:03.400 --> 41:18.120
Und jetzt wird hier Bezug genommen auf Methoden, die jetzt verwendet

41:18.120 --> 41:20.660
werden sollen in dieser Java-Server-Page.

41:20.660 --> 41:27.820
Es steht hier SetProperty, das heißt, es wird auf eine Set-Methode

41:27.820 --> 41:31.920
zugegriffen in dieser Bean.quad.

41:32.680 --> 41:41.380
Die Property ist Zahl, also es wird aufgerufen, eine Methode, SetZahl.

41:42.320 --> 41:47.740
Und als Wert wird der Wert von Value reingegeben, im Prinzip wird hier

41:47.740 --> 41:49.040
16 reingegeben.

41:49.040 --> 41:54.420
Das ist also der Wert, der als Argument für diesen Aufruf gegeben

41:54.420 --> 41:55.040
werden soll.

41:55.600 --> 42:01.400
Und dann steht hier ein GetProperty, da wird auf eine Methode

42:01.400 --> 42:04.900
zugegriffen, in diesem Bean, Quad, wiederum.

42:05.920 --> 42:14.660
Property ist Quadzahl, also wird hier GetQuadZahl aufgerufen, das wird

42:14.660 --> 42:16.380
ohne Parameter aufgerufen.

42:17.780 --> 42:20.840
Wir wissen gar nicht, was das für Methoden sind, stehen nämlich auf

42:20.840 --> 42:21.700
der nächsten Folie.

42:21.840 --> 42:28.400
Hier steht in der Methode, also in diesem Java-Bean, steht folgendes

42:28.400 --> 42:28.620
drin.

42:28.700 --> 42:33.780
Wir haben die Klasse Quadrat, das wäre Halbpunkt Quadrat, was wir

42:33.780 --> 42:34.640
aufgerufen haben.

42:35.220 --> 42:41.140
Und da drin steht also jetzt die Methode SetZahl, da wird als

42:41.140 --> 42:42.980
Parameter eine Zahl erwartet.

42:42.980 --> 42:50.400
Und das Ergebnis ist also dieser Wert des Parameters.

42:51.400 --> 42:55.200
Und es gibt eine Methode GetQuadZahl ohne Parameter.

42:55.760 --> 42:59.940
Und die liefert zurück einen String, eine Zeichenkette, und zwar

42:59.940 --> 43:03.980
liefert die zurück gerade Zahl mal Zahl.

43:04.880 --> 43:11.320
Wobei das hier in dem Fall ein Parameter ist, der hier oben angegeben

43:11.320 --> 43:11.620
wurde.

43:11.620 --> 43:16.260
Also es ist ein bisschen kompliziert, soll nur ein bisschen andeuten,

43:16.860 --> 43:22.820
wie vielfältig die Dinge sind, die man mit solchen Java Server Pages

43:22.820 --> 43:23.440
machen kann.

43:24.460 --> 43:28.080
Dieses Bean liefert, wie man hier sieht, dadurch, dass ich zunächst

43:28.080 --> 43:32.620
mal einen Wert erzeugt habe, das SetZahl gemacht habe, zum Wert 16 auf

43:32.620 --> 43:33.420
der vorigen Seite.

43:39.120 --> 43:50.240
Hier hatten wir SetZahl 16 aufgerufen über diese Aktion und haben dann

43:50.240 --> 43:56.920
über diese Aktion über GetQuadZahl den Wert im Prinzip geholt.

43:56.920 --> 44:02.060
Und GetQuadZahl liefert eben gerade den quadrierten Wert, der vorher

44:02.060 --> 44:06.520
da aufgerufen wurde, würde also entsprechend 16 zum Quadrat abliefern.

44:07.960 --> 44:10.060
Eine etwas skurrile Anwendung.

44:10.140 --> 44:12.140
Ich hätte auch irgendeine andere Anwendung hier hinschreiben können.

44:12.540 --> 44:16.740
Aber es sollte einfach nur andeuten, dass man hier etwas mehr machen

44:16.740 --> 44:19.520
kann, als das mit diesen ServerSideIncludes möglich war.

44:21.460 --> 44:23.440
Kurzer Vergleich.

44:24.540 --> 44:28.280
Was sind die Vorteile von Java Servlets gegenüber CGI?

44:29.000 --> 44:38.180
Ich habe hier eine Plattformunabhängigkeit über diese ganze Java

44:38.180 --> 44:39.080
Umgebung.

44:39.080 --> 44:45.920
Ein Punkt ist, dass ich etwas effizienter arbeiten kann, da bei

44:45.920 --> 44:49.780
Aufrufen des selben Skripts nicht immer wieder ein neuer Prozess mit

44:49.780 --> 44:52.640
neuem Adressraum gestartet wird, sondern jeweils nur ein neuer Thread

44:52.640 --> 44:54.060
erzeugt wird.

44:54.540 --> 45:00.400
Und ich habe dadurch also die Möglichkeit auf dem gleichen Adressraum

45:00.400 --> 45:04.120
immer wieder zuzugreifen und kann dadurch persistente Daten verwenden.

45:05.000 --> 45:07.480
Und natürlich habe ich hier das Objektmodell.

45:07.640 --> 45:12.400
Perl ist allerdings auch eine objektorientierte Sprache, insofern ist

45:12.400 --> 45:14.600
der Vorteil gegenüber Perl nicht so sehr groß.

45:14.860 --> 45:19.500
Aber ich habe halt die ganzen Programmiermöglichkeiten von Java zur

45:19.500 --> 45:26.580
Verfügung und das ist schon ein Vorteil gegenüber den Dingen, die ich

45:26.580 --> 45:28.540
mit den ServerSideIncludes machen kann.

45:28.540 --> 45:33.540
Aber es gibt gute Anwendungen in beiden Richtungen.

45:33.620 --> 45:36.760
Man muss sehen, was man in der konkreten Anwendungsumgebung einsetzen

45:36.760 --> 45:37.000
will.

45:38.360 --> 45:45.220
Auf Microsoft-Seite gibt es dann die Active Server Pages und auch die

45:45.220 --> 45:51.920
sind wieder etwas, was den anderen Standards entgegengesetzt wird.

45:51.920 --> 45:57.100
Active Server Pages basieren immer auf dem Microsoft Internet

45:57.100 --> 45:58.100
Information Server.

45:58.360 --> 46:00.740
Wenn man den nicht verwendet, kann man Active Server Pages nicht

46:00.740 --> 46:02.220
sinnvoll einsetzen.

46:02.780 --> 46:07.000
Also wenn Sie Active Server Page Technologie verwenden wollen, müssen

46:07.000 --> 46:10.020
Sie den Microsoft Internet Information Server verwenden.

46:11.320 --> 46:16.120
Und Sie können mit diesen Active Server Pages auch wieder eine ganze

46:16.120 --> 46:18.260
Reihe von Aktionen auf dem Server starten.

46:18.260 --> 46:22.600
Sie haben hier Möglichkeiten zur Verfügung, zum Beispiel auf das

46:22.600 --> 46:25.160
Component Object Modell zuzugreifen.

46:25.740 --> 46:30.320
Das heißt, Sie können auf eine Reihe von Objekten zugreifen, die Ihnen

46:30.320 --> 46:32.900
alle möglichen Methoden und Anwendungen liefern.

46:33.620 --> 46:38.720
Das ist sowas in eingeschränkter Form eine Art Broker, um Dienste

46:38.720 --> 46:39.400
anzubieten.

46:39.400 --> 46:42.640
Etwas, was wir später noch kennenlernen werden und in dem Namen CORBA,

46:43.360 --> 46:46.760
den Component Object Request Broker, der aber ein wesentlich

46:46.760 --> 46:50.900
allgemeiner ist als diese Möglichkeiten hier mit den Active Server

46:50.900 --> 46:51.420
Pages.

46:53.180 --> 46:58.080
Und das, was man hier machen kann, ist ein bisschen vergleichbar mit

46:58.080 --> 47:03.760
den Java Server Pages und Servlets, bietet ein paar andere

47:03.760 --> 47:04.460
Möglichkeiten.

47:04.460 --> 47:06.480
Ich glaube aber, ich brauche wirklich auf die Einzelheiten hier nicht

47:06.480 --> 47:07.140
einzugehen.

47:07.760 --> 47:11.620
Sie haben gesehen, dass es viele Möglichkeiten gibt, HTML Seiten

47:11.620 --> 47:15.500
dynamisch zu gestalten, dadurch, dass ich dort Inhalte einbaue.

47:19.620 --> 47:22.720
Inzwischen wird man immer mehr auf noch etwas andere Technologien

47:22.720 --> 47:24.940
eingehen oder ausweichen.

47:24.940 --> 47:31.260
Ich werde darauf aber auch noch kommen, hier steht das .NET und das

47:31.260 --> 47:36.440
wird also alles weiterentwickelt, wobei ich hier wirklich nicht viel

47:36.440 --> 47:40.420
mehr machen möchte außer diesem kleinen Beispiel.

47:40.420 --> 47:46.640
Hier haben wir also ein kleines Beispiel drin, ein Language Virtual

47:46.640 --> 47:47.780
Basic Script.

47:49.460 --> 47:53.000
Und hier wird eine Seite erzeugt, die folgendes macht.

47:53.000 --> 48:00.020
In dem Titel steht einfach nur Beispiel und in dem Rumpf dieser Seite

48:00.020 --> 48:09.200
wird im Prinzip abgefragt, ob die aktuelle Stunde größer ist als 18

48:09.200 --> 48:10.400
oder kleiner als 6.

48:10.400 --> 48:16.600
Das heißt, wenn Sie diese Seite aufrufen und lokal bin ich zwischen 18

48:16.600 --> 48:22.280
und vor 6 Uhr, dann steht auf der Seite, es ist Nacht und ansonsten

48:22.280 --> 48:23.320
steht dort, es ist Tag.

48:25.020 --> 48:29.420
Also etwas, was auf Serverseite natürlich nur abgerufen wird.

48:29.420 --> 48:33.360
Wenn solche Skripte zur Verfügung stehen an verschiedenen Stellen,

48:33.460 --> 48:36.440
können Sie sehen, ist bei dem Server gerade Nacht oder Tag.

48:36.880 --> 48:40.640
Was immer das für einen Sinn macht.

48:41.160 --> 48:47.420
Ich hatte gerade eben PHP erwähnt, auch etwas, was bei dynamischen

48:47.420 --> 48:49.460
Webseiten ganz wichtig ist.

48:49.460 --> 48:54.820
PHP ist vor allen Dingen wichtig, weil Sie mit PHP eine gute

48:54.820 --> 48:57.280
Möglichkeit haben, um auf Datenbanken zuzugreifen.

48:58.280 --> 49:03.960
Und die Vielfalt von Daten, die in Webseiten eingebaut werden können,

49:04.100 --> 49:06.540
wird eben häufig in Datenbanken verwaltet.

49:07.420 --> 49:10.240
Dazu finden Sie dicke Bücher über PHP.

49:12.100 --> 49:17.860
Ich kann also nur Ihnen, wie immer, kurze Sachen hier angeben.

49:17.860 --> 49:23.280
Das hier, was hier steht, ist eine völlig untypische Art, PHP zu

49:23.280 --> 49:23.740
verwenden.

49:23.840 --> 49:25.620
Hier wird nämlich wieder nur Hello World geschrieben.

49:26.300 --> 49:30.500
Sie sehen hier nur, wie so ein PHP-Aufruf in einer HTML-Seite

49:30.500 --> 49:31.060
aussieht.

49:31.560 --> 49:35.280
Sie haben hier, ähnlich wie diese Server-Site-Includes, einfach so

49:35.280 --> 49:39.300
einen Teil als Tag eingefügt.

49:39.680 --> 49:42.020
In diesem Fall mit Fragezeichen PHP.

49:42.780 --> 49:46.940
Und dann wird hier halt irgendetwas geschrieben.

49:46.940 --> 49:49.380
Also erstmal in einer Variablen zugewiesen.

49:50.080 --> 49:54.680
Und dann wird das über ein Echo in die Ausgabe übernommen.

49:55.360 --> 49:58.300
Ganz einfaches Beispiel.

49:59.420 --> 50:02.500
Das Wesentliche ist die Unterstützung von Datenbanken.

50:04.720 --> 50:08.140
Insbesondere wird MySQL verwendet.

50:08.480 --> 50:11.700
Eine einfache Query-Sprache.

50:12.420 --> 50:14.520
Wer von Ihnen hat schon mal MySQL verwendet?

50:14.520 --> 50:18.500
Einige von Ihnen, insofern kennen Sie das, aber nur wenige.

50:19.920 --> 50:24.580
Ist eine einfache Möglichkeit, Datenbanken zu implementieren.

50:25.580 --> 50:32.320
Und ich mache jetzt einfach ein kurzes Beispiel dafür, wie man mit PHP

50:32.320 --> 50:36.000
auf eine MySQL-Datenbank zugreifen kann.

50:36.500 --> 50:40.740
Wir nehmen hier an, dass wir so eine MySQL-Datenbank haben, in der

50:40.740 --> 50:48.720
eine Tabelle existiert mit fünf Feldern, ein Identifikator eines

50:48.720 --> 50:53.420
Assistenten, also eines Assis, ein Vorname, ein Nachname, eine Adresse

50:53.420 --> 50:58.560
und eine E-Mail-Adresse und entsprechenden Einträgen.

51:00.760 --> 51:07.320
Und jetzt wird in diesem PHP-Skript, das jetzt gleich kommt, der 0.,

51:07.320 --> 51:11.120
also der erste Eintrag, der Tabelle abgefragt.

51:11.220 --> 51:12.660
Schauen wir uns an, wie das gemacht wird.

51:12.820 --> 51:20.500
Wir haben diese PHP-Anfrage und es wird zunächst mal auf eine

51:20.500 --> 51:22.880
Datenbank zugegriffen.

51:23.940 --> 51:32.480
Auf dem localhost wird anonym zugegriffen, auf eine Datenbank D1.

51:37.880 --> 51:40.520
Das $DB wird als eine Variable.

51:40.620 --> 51:44.380
Der Variablen wird dieser Wert hier zugewiesen.

51:45.400 --> 51:51.020
Es wird also verbunden mit dem localhost, Benutzer anonym, und es wird

51:51.020 --> 51:55.900
jetzt auf die Datenbank D1 zugegriffen und hier als Variable dieses DB

51:55.900 --> 51:56.860
übergeben.

51:57.780 --> 52:01.120
Das heißt, das Connect wird hier bei diesem Aufruf der Datenbank

52:01.120 --> 52:01.680
gemacht.

52:01.680 --> 52:10.460
Dann wird ein Variable $result erzeugt, die als Wert gerade bekommen

52:10.460 --> 52:12.280
soll das Ergebnis dieses Queries.

52:12.940 --> 52:23.020
Und dieses Query ist halt ein Select, den ersten Eintrag, also Select

52:23.020 --> 52:31.980
die Einträge aus der Tabelle Assis in dieser hier immer noch diese

52:31.980 --> 52:46.160
Verbindung $DB dahinter und jetzt wird gedruckt der Vorname und es

52:46.160 --> 52:53.320
wird ausgedruckt der Vorname, danach wird etwas formatiert, also

52:53.320 --> 52:59.860
dieses %s//n geschrieben mit den üblichen Bedeutungen und es wird das

52:59.860 --> 53:11.720
Ergebnis des SQL-Aufrufes hier abgeliefert, nämlich von dem 0.

53:11.860 --> 53:18.200
Eintrag der Eintrag-Vorname und das wird halt entsprechend dann dort

53:18.200 --> 53:21.600
als nächstes geschrieben und entsprechend wird der Eintrag zu dem

53:21.600 --> 53:25.840
Attribut -Nachname abgeliefert, zum Attribut-Adresse, zum Attribut-E

53:25.840 --> 53:25.980
-Mail.

53:25.980 --> 53:30.780
Ein sehr einfaches Beispiel für eine solche Anfrage, das heißt wir

53:30.780 --> 53:35.400
haben einmal eine Query und können dann das Ergebnis zu einer Anfrage

53:35.400 --> 53:40.580
an die Datenbank, das in der Variablen $result angegeben ist, das

53:40.580 --> 53:45.340
können wir weiter analysieren und können also über dieses MySQL-Result

53:45.340 --> 53:50.580
aus der Variablen oder aus diesem Ergebnis des Aufrufs die

53:50.580 --> 53:52.340
entsprechenden Parameter rausholen.

53:56.860 --> 54:00.660
Das ist also ein einfaches Beispiel für so ein PHP-Skript.

54:01.040 --> 54:06.320
Hier könnte man natürlich auch alle Einträge ausgeben, nicht nur den

54:06.320 --> 54:06.520
0.

54:06.620 --> 54:14.520
Eintrag, dann würde man entsprechend weitere Befehle verwenden, hätte

54:14.520 --> 54:20.900
hier diese Art des PHP-Skripts drin.

54:23.540 --> 54:28.640
Ich will das im Einzelnen gar nicht erläutern.

54:29.000 --> 54:31.260
Ich habe genug dazu gesagt.

54:31.360 --> 54:35.480
Wenn Sie PHP einsetzen, müssen Sie sich sowieso das Skript genauer

54:35.480 --> 54:35.920
angucken.

54:36.440 --> 54:40.100
Das Wesentliche ist halt, dass Sie Anfragen auf die Datenbank

54:40.100 --> 54:45.400
schreiben können und die entsprechend dann aus dem Ergebnis, das

54:45.400 --> 54:48.780
$result war das Ergebnis der Anfrage, können Sie halt auf

54:48.780 --> 54:52.820
unterschiedliche Art und Weise die Inhalte rausziehen.

54:59.490 --> 55:05.710
Also hier steht nochmal, was man halt dort machen kann, wenn Sie eine

55:05.710 --> 55:14.670
PHP, so einen SQL-Query, wenn Sie das mit einem Query-String aufrufen,

55:14.750 --> 55:19.310
Sie haben einen Aufruf zu einer PHP-Datei in der URL Ihres Browsers,

55:19.310 --> 55:23.110
machen Sie einen Query-String, greifen dort auf einen PHP-Skript zu

55:24.050 --> 55:34.110
oder auf eine PHP-Datei mit dem entsprechenden Query-String, der die

55:34.110 --> 55:39.450
Variablen dort auflistet, dann werden halt durch PHP die

55:39.450 --> 55:43.610
entsprechenden Variablen Wertpfade erzeugt und wenn Sie jetzt einen

55:43.610 --> 55:53.450
neuen Assi in die Datenbank eintragen wollen, dann muss man das

55:53.450 --> 55:55.610
natürlich in irgendeiner Art und Weise machen, z.B.

55:55.770 --> 56:03.150
über eine HTML-Datei, über die Sie die Daten eingeben wollen.

56:03.510 --> 56:06.710
Dafür gibt es die Möglichkeit der HTML-Forms, das haben wir bereits

56:06.710 --> 56:12.590
ein paar Mal gesehen und man kann dann über dieses HTML-Form, den man

56:12.590 --> 56:17.290
dann daraus einen PHP-Aufruf macht, die Daten in die Datenbank

56:17.290 --> 56:17.810
übernehmen.

56:17.810 --> 56:21.690
Und hier ist das dargestellt, wir haben hier als Form eine Methode

56:21.690 --> 56:30.930
post, greifen zu auf die Datenbank hier php3 und schreiben dort in die

56:30.930 --> 56:35.390
Form -Definition rein, dass dort Vorname stehen soll, daneben wird ein

56:35.390 --> 56:40.770
Text eingegeben, das kennen Sie schon und der Name des Parameters, der

56:40.770 --> 56:45.490
hier verwendet werden soll, ist vor, dahinter steht dann halt

56:45.490 --> 56:51.070
Nachname, hier wird als Parameter dieses Nach verwendet, dann haben

56:51.070 --> 56:55.150
Sie hier dieses Adresse, die Mail-Adresse und schließlich noch ein

56:55.150 --> 56:59.830
Submit -Knopf, der in diesem Fall tatsächlich Knopf heißen soll und

56:59.830 --> 57:04.850
wenn man darauf klickt, werden diese Werte an die Datenbank übertragen

57:04.850 --> 57:13.590
mit diesen Werten für die entsprechenden variablen Namen.

57:15.010 --> 57:20.150
Gut, das zeigt so ein bisschen, wie man das machen kann.

57:20.190 --> 57:27.950
Hier ist dann der Aufruf angegeben, der erzeugt wird, der Query

57:27.950 --> 57:28.390
String.

57:30.150 --> 57:39.890
Hier sind einfach irgendwelche Dummy-Werte angegeben und jetzt müssen

57:39.890 --> 57:49.850
natürlich diese Werte eingefügt werden und jetzt wird also was

57:49.850 --> 57:50.210
gemacht.

57:50.390 --> 57:57.230
Wir fügen jetzt in die Datenbank tatsächlich den Wert ein.

57:57.230 --> 58:06.910
Also Insert into Assis, das ist der SQL-Aufruf.

58:07.650 --> 58:13.470
In die Tabelle Assis soll etwas eingefügt werden, nämlich gerade in

58:13.470 --> 58:18.610
die entsprechenden Attribute, zugleich zu den Attributen Vorname,

58:18.730 --> 58:19.990
Nachname, Adresse und E-Mail.

58:19.990 --> 58:28.590
Etwas, was übergeben wurde, diesem PHP-Skript, über die Werte der

58:28.590 --> 58:33.370
Parameter vor, nach, Adresse und Mail.

58:34.750 --> 58:43.790
Und dann kann man danach ein Query machen, kann das entsprechend hier

58:43.790 --> 58:45.410
aufrufen.

58:45.410 --> 58:51.110
Das ist entsprechend dann der Aufruf dieses Queries.

58:51.910 --> 58:53.990
Dadurch füge ich dann entsprechend diesen Wert ein.

58:54.230 --> 58:57.230
Hier wird das ja nur einer Variablen zugewiesen, hier wird dann

58:57.230 --> 58:59.270
tatsächlich dieser Query erzeugt.

59:00.670 --> 59:05.490
Also Sie haben hier auf die Art und Weise, wie Sie bei Datenbanken

59:05.490 --> 59:10.930
normalerweise auch Zugriffe machen können, auf Datenbankinhalte über

59:10.930 --> 59:16.950
diese einfache Query-Sprache, können Sie direkt in PHP solche Anfragen

59:16.950 --> 59:23.030
formulieren und damit Datenbankinhalte in HTML-Seiten integrieren oder

59:23.030 --> 59:24.730
auch Werte in Datenbanken eintragen.

59:26.710 --> 59:32.310
Das, was wir hier jetzt mehrfach gesehen haben über Servlets, über

59:32.310 --> 59:38.550
Java -Server-Pages, über CGI-Skripte, SSIs und so weiter, hat alles zu

59:38.550 --> 59:41.590
tun mit dem Thema dynamische Webseiten.

59:41.590 --> 59:46.350
Hätte ich auch vorne hinschreiben können als Überschrift über das

59:46.350 --> 59:47.750
ganze Kapitel.

59:48.470 --> 59:52.970
Es geht darum, dass man Inhalte von Webseiten an die aktuellen

59:52.970 --> 59:55.830
Rahmenbedingungen eines HTTP-Aufrufs anpasst.

59:56.910 --> 01:00:00.890
Ich möchte etwas personalisieren, also anpassen an den Benutzer.

01:00:01.930 --> 01:00:03.990
Ich habe unterschiedliche Browser zur Verfügung.

01:00:05.370 --> 01:00:08.610
Unterschiedliche Browser haben unterschiedliche Arten, Informationen

01:00:08.610 --> 01:00:09.410
darzustellen.

01:00:09.410 --> 01:00:13.250
Deswegen ist es sinnvoll, solche Informationen zu verwenden bei der

01:00:13.250 --> 01:00:15.550
Präsentation von Webseiten.

01:00:16.590 --> 01:00:21.950
Es kann sein, dass ich etwas weiß über die Eigenschaften eines

01:00:21.950 --> 01:00:25.830
Benutzers, entweder über Cookies weitergegeben oder auf andere Art und

01:00:25.830 --> 01:00:26.170
Weise.

01:00:26.930 --> 01:00:29.850
Ich weiß vielleicht etwas über Datum und Ort der Anfrage.

01:00:31.070 --> 01:00:34.490
Ich weiß, ob das ein Student oder ein Mitarbeiter oder ein Professor

01:00:34.490 --> 01:00:37.270
ist bei einer Anfrage auf irgendetwas in der Universität.

01:00:37.270 --> 01:00:41.150
Und beim Server weiß man natürlich auch etwas über die lokalen

01:00:41.150 --> 01:00:45.530
Informationen, das, was aktuell in Datenbanken drinsteht.

01:00:46.410 --> 01:00:50.850
Und das, was hier eben im Wesentlichen gemacht wird, ist, dass ich

01:00:50.850 --> 01:00:58.450
eine Webseite personalisiere, wobei Personalisieren sich tatsächlich

01:00:58.450 --> 01:01:02.090
beziehen kann auf einen Menschen, aber auch auf alle Randbedingungen,

01:01:02.330 --> 01:01:06.190
die beim Aufruf gerade existieren.

01:01:09.010 --> 01:01:14.550
Wenn ich personalisieren will, muss ich die lokalen Informationen auch

01:01:14.550 --> 01:01:15.770
irgendwo zur Verfügung haben.

01:01:16.370 --> 01:01:18.890
Und dafür gibt es halt unterschiedliche Möglichkeiten.

01:01:19.070 --> 01:01:23.030
Das eine waren diese Umgebungsprofile oder Umgebungsvariablen.

01:01:23.630 --> 01:01:26.470
Dann gibt es Cookies und es gibt tatsächlich auch noch sogenannte

01:01:26.470 --> 01:01:28.150
Profile, die auch abgespeichert werden.

01:01:29.190 --> 01:01:31.870
Ich wollte noch eine kurze Bemerkung zu dynamischen Webseiten machen.

01:01:31.870 --> 01:01:34.830
Manchmal finden Sie unter dem Begriff dynamische Webseiten auch

01:01:34.830 --> 01:01:38.950
einfach nur die Darstellung, dass Sie eine Seite haben, auf der

01:01:38.950 --> 01:01:40.950
irgendetwas sich bewegt.

01:01:41.670 --> 01:01:44.650
Wenn wir also eine Webseite, auf der meinetwegen irgendetwas blinkt,

01:01:44.770 --> 01:01:45.950
bereits eine dynamische Seite.

01:01:46.570 --> 01:01:47.890
Das ist hier aber nicht gemeint.

01:01:48.590 --> 01:01:52.310
Oder wenn Sie meinetwegen irgendeinen, Sie können ja Inhalte auch

01:01:52.310 --> 01:01:57.490
animieren, Sie können sich irgendetwas irgendwie bewegen lassen auf

01:01:57.490 --> 01:01:58.210
einer Webseite.

01:01:58.210 --> 01:02:01.450
Das wird von einigen, wird manchmal in der Literatur als dynamische

01:02:01.450 --> 01:02:04.030
Webseite bezeichnet, ist aber nicht das, was wir hier meinen.

01:02:04.410 --> 01:02:08.750
Wir meinen hiermit dynamisch, dass sich die Inhalte anpassen an das,

01:02:09.230 --> 01:02:13.730
was lokal bei dem Aufruf an Informationen zur Verfügung steht.

01:02:14.970 --> 01:02:17.510
Und jetzt schauen wir uns an eine Möglichkeit, eine

01:02:17.510 --> 01:02:19.310
Standardmöglichkeit, das sind die Cookies.

01:02:21.910 --> 01:02:29.070
Cookies sind also kleine Informationseinheiten, die dazu dienen,

01:02:29.910 --> 01:02:35.930
Informationen mitzugeben mit einem HTTP-Request.

01:02:36.790 --> 01:02:45.770
Das HTTP-Protokoll ist in dem Sinne zustandslos, dass zunächst einmal

01:02:45.770 --> 01:02:51.090
jeder Aufruf einer URL im Prinzip zum gleichen Ergebnis führt,

01:02:51.190 --> 01:02:55.530
beziehungsweise es gibt keine Möglichkeit, Informationen aus früheren

01:02:55.530 --> 01:02:56.550
Aufrufen zu verwenden.

01:02:57.190 --> 01:03:00.950
Wir können nicht irgendwelche Informationen aus früheren Aufrufen, die

01:03:00.950 --> 01:03:04.670
in irgendeiner früheren Response gewesen sind, so direkt dort wieder

01:03:04.670 --> 01:03:05.350
reinschreiben.

01:03:05.830 --> 01:03:09.350
Es sei denn, Sie haben da drin irgendeine URL sich aus einer HTML

01:03:09.350 --> 01:03:12.950
-Seite rausgeholt und dann als nächsten HTTP-Aufruf gemacht.

01:03:13.010 --> 01:03:13.870
Das ist aber nicht gemeint.

01:03:15.350 --> 01:03:17.850
Also zunächst einmal ist das HTTP-Protokoll zustandslos.

01:03:18.690 --> 01:03:25.070
Die Cookies sind eine Möglichkeit, wie man Informationen über einen

01:03:25.070 --> 01:03:31.130
HTTP -Zugriff verbinden kann mit einer URL einer HTML-Seite.

01:03:31.930 --> 01:03:40.270
Und das funktioniert so, dass Sie also ein HTTP-Request schicken vom

01:03:40.270 --> 01:03:41.850
Client zum Server.

01:03:42.050 --> 01:03:47.250
Schicken Sie jetzt ein HTTP-Request, da wird also ein Request

01:03:47.250 --> 01:03:54.970
geschickt und dazu wird ein Cookie mitgeschickt, der vorher mit dieser

01:03:54.970 --> 01:03:57.830
URL verbunden wurde.

01:03:59.890 --> 01:04:07.530
Also mit einem HTTP-Aufruf, mit einem Request, werden die zu dieser

01:04:07.530 --> 01:04:15.030
URI gehörenden Cookies mitgeschickt und dadurch hat der Server die

01:04:15.030 --> 01:04:17.830
Möglichkeit, diese Informationen auszuwerten.

01:04:20.630 --> 01:04:25.950
Das heißt, ich kann damit gewisse Daten auf dem Rechner des Anwenders

01:04:25.950 --> 01:04:29.750
speichern und beim nächsten Aufruf wieder auslesen.

01:04:31.330 --> 01:04:34.750
Dadurch ist es möglich, wenn Sie auf eine Webseite gehen, dass Sie

01:04:34.750 --> 01:04:39.410
sofort erkannt werden als ein bestimmter Benutzer, der schon früher

01:04:39.410 --> 01:04:40.630
mal dort gewesen ist.

01:04:40.990 --> 01:04:42.870
Das funktioniert also über Cookies.

01:04:44.070 --> 01:04:49.190
Und auf diese Art und Weise hat man also eine Möglichkeit, auf Daten

01:04:49.190 --> 01:04:57.130
zu reagieren, die beim Client gespeichert wurden, aus früheren

01:04:57.130 --> 01:04:57.590
Aufrufen.

01:04:59.290 --> 01:05:06.310
Das Ganze wird also in den entsprechenden Verzeichnissen vom Browser

01:05:06.310 --> 01:05:11.550
verwaltet und das wird von den Browsern unterschiedlich gemacht.

01:05:11.690 --> 01:05:15.150
Jeder Browser erlaubt die Verwendung von Cookies, es sei denn, der

01:05:15.150 --> 01:05:17.610
Benutzer hat sie explizit deaktiviert.

01:05:19.190 --> 01:05:21.990
So, jetzt kurzes Beispiel dazu.

01:05:22.930 --> 01:05:23.810
Was ist ein Cookie?

01:05:24.730 --> 01:05:35.430
Ich habe eine HTML-Seite und in der HTML-Seite steht jetzt ein Script

01:05:35.430 --> 01:05:35.690
drin.

01:05:35.790 --> 01:05:38.090
Das ist also ein JavaScript.

01:05:40.090 --> 01:05:41.810
Darauf war ich gar nicht eingegangen.

01:05:41.810 --> 01:05:45.190
JavaScript ist also auch sowas ähnliches wie diese ganzen anderen

01:05:45.190 --> 01:05:47.490
Server -Site-Includes usw.

01:05:48.010 --> 01:05:51.890
Aber hier JavaScript ist etwas, was auf der Anwender-Seite ausgeführt

01:05:51.890 --> 01:05:52.230
wird.

01:05:52.870 --> 01:05:55.350
Auf der Client-Seite, nicht auf der Server-Seite.

01:05:56.570 --> 01:06:00.970
Und jetzt wird also hier ein JavaScript ausgeführt.

01:06:01.130 --> 01:06:05.670
Und hier wird zugegriffen auf eine zunächst mal definierte Variable

01:06:05.670 --> 01:06:07.230
gespeichert.

01:06:07.230 --> 01:06:12.330
Und der wird zugewiesen, der wird zu Beginn nichts gespeichert.

01:06:13.290 --> 01:06:14.370
Ein String.

01:06:16.010 --> 01:06:24.710
Und jetzt wird abgefragt, ob ein Cookie für dieses Dokument existiert.

01:06:25.610 --> 01:06:31.610
if document.cookie heißt, ist ein Cookie für dieses Dokument

01:06:31.610 --> 01:06:34.230
vorhanden.

01:06:35.150 --> 01:06:39.710
Wenn das vorhanden ist, dann wird der Wert dieses Cookies, document

01:06:39.710 --> 01:06:42.390
.cookie, wird der Variablen gespeichert zugewiesen.

01:06:42.530 --> 01:06:46.130
Wird also dieser Anfangswert, nichts gespeichert, überschrieben durch

01:06:46.130 --> 01:06:47.310
den Wert dieses Cookies.

01:06:49.570 --> 01:06:52.230
Ansonsten wird ein Cookie neu erzeugt.

01:06:52.310 --> 01:06:54.190
Dann steht also hier document.cookie.

01:06:54.870 --> 01:06:56.950
Erhält dann einen neuen Wert.

01:06:57.250 --> 01:07:01.290
Da wird einfach reingeschrieben eine Zeichenfolge Zeitstempel gleich.

01:07:01.290 --> 01:07:08.370
Und dahinter wird reingeschrieben das Datum der letzten Modifikation

01:07:08.370 --> 01:07:09.830
dieses Dokuments.

01:07:11.290 --> 01:07:15.850
Und dann soll außerdem noch ein Alert gemacht werden.

01:07:15.990 --> 01:07:19.270
Also es soll ein Hinweis gegeben werden.

01:07:19.270 --> 01:07:25.270
Und in diesem Alert, das sehen wir gleich, was da passiert, wird

01:07:25.270 --> 01:07:34.590
document.lastmodified, das was hier vorne gerade stand, nochmal

01:07:34.590 --> 01:07:35.210
hingeschrieben.

01:07:36.190 --> 01:07:38.170
Also der Wert dieser Variablen.

01:07:38.450 --> 01:07:42.450
Und dazu wird noch ein Bindestrich geschrieben und der Wert dieser

01:07:42.450 --> 01:07:43.630
Variablen gespeichert.

01:07:44.350 --> 01:07:49.410
Abhängig davon, ob jetzt vorher schon ein Cookie vorhanden war oder

01:07:49.410 --> 01:07:54.910
nicht, wird dort also jetzt entweder nichts gespeichert stehen, oder

01:07:54.910 --> 01:07:59.390
das, was dort vorher drin war, müsste also eigentlich drinstehen.

01:07:59.630 --> 01:08:01.910
Zeitstempel gleich und irgendein Wert.

01:08:02.930 --> 01:08:04.650
Und das ist das Ende dieses Skriptes.

01:08:05.270 --> 01:08:13.970
Und dann auch schon das Ende des Kopfes unserer HTML-Datei.

01:08:14.110 --> 01:08:15.630
Im Body steht gar nichts weiter drin.

01:08:15.750 --> 01:08:17.350
Das ist das Ganze, was wir hier machen wollen.

01:08:19.230 --> 01:08:23.970
Und hier ist nochmal angegeben, wenn wir so einen Cookie lesen wollen,

01:08:24.050 --> 01:08:26.530
brauchen wir nur den Wert einer Variablen zuzuweisen.

01:08:27.050 --> 01:08:30.430
Und wir schreiben einfach entsprechend dem Wert der Variablen document

01:08:30.430 --> 01:08:31.690
.cookie einen Wert zuweisen.

01:08:32.390 --> 01:08:34.850
Jetzt muss ich mal sehen, ob es funktioniert, wenn ich das jetzt

01:08:34.850 --> 01:08:35.410
aufrufe.

01:08:36.190 --> 01:08:37.290
Ich hoffe, dass es funktioniert.

01:08:37.410 --> 01:08:41.690
Wenn ich jetzt hier auf Ansicht gehe, müsste eigentlich jetzt...

01:08:42.270 --> 01:08:45.230
Sie wissen, dass ich mehrfach Schwierigkeiten hatte, HTML-Seiten

01:08:45.230 --> 01:08:50.390
aufzurufen, weil häufig die Aufrufe nicht funktioniert haben.

01:08:51.150 --> 01:08:52.470
Irgendwas ist hier gerade eben passiert.

01:08:54.730 --> 01:08:57.610
Gehen wir auf...genau...hier rauf.

01:08:57.610 --> 01:09:01.810
Aha, hier habe ich ja einen völlig anderen Wert stehen.

01:09:03.710 --> 01:09:14.170
Sie sehen, offensichtlich gibt es hier ein Cookie, das sich auf diesen

01:09:14.170 --> 01:09:14.970
Pfad bezieht.

01:09:15.050 --> 01:09:16.470
Ich habe hier einen bestimmten Pfad aufgerufen.

01:09:17.290 --> 01:09:19.150
Und da steht jetzt Zähler gleich 12.

01:09:20.290 --> 01:09:22.850
Jetzt muss ich aber erst mal Folgendes machen, damit das jetzt alles

01:09:22.850 --> 01:09:23.810
richtig funktioniert.

01:09:23.810 --> 01:09:29.910
Gehe ich mal hier auf Extras, gehe auf Einstellungen und lösche

01:09:29.910 --> 01:09:30.810
erstmal alle Cookies.

01:09:32.810 --> 01:09:36.210
So, jetzt können wir wieder zurückgehen zu unserer Präsentation.

01:09:37.290 --> 01:09:42.450
Jetzt gehe ich nochmal hier rauf und Sie sehen, da jetzt kein Cookie

01:09:42.450 --> 01:09:46.670
vorhanden war, wird jetzt...hier steht nichts weiter drin.

01:09:49.110 --> 01:09:55.610
Es wird nur ein Alert erzeugt und da steht drin ein Datum Last

01:09:55.610 --> 01:09:56.170
Modified.

01:09:56.290 --> 01:09:59.590
Das ist Last Modified bezogen auf das Dokument, das ich aufgerufen

01:09:59.590 --> 01:09:59.990
habe.

01:10:00.670 --> 01:10:05.150
Sie sehen, das Dokument habe ich vor einem Jahr das letzte Mal

01:10:05.150 --> 01:10:05.750
modifiziert.

01:10:05.870 --> 01:10:10.470
Ich habe jetzt gar nicht reingeguckt in das Dokument, also diese HTML

01:10:10.470 --> 01:10:12.150
-Seite nicht noch einmal modifiziert.

01:10:12.710 --> 01:10:16.290
Deswegen ist das die letzte Modifikation vor einem Jahr gewesen.

01:10:16.290 --> 01:10:21.910
Und es steht daneben nichts gespeichert, weil dieses Cookie noch nicht

01:10:21.910 --> 01:10:22.610
vorhanden war.

01:10:23.290 --> 01:10:25.450
Jetzt wird aber dieses Cookie erzeugt.

01:10:25.810 --> 01:10:32.730
Und wenn ich jetzt wieder hingehe in mein Dokument, also jetzt dieses

01:10:32.730 --> 01:10:39.350
Dokument nochmal aufrufe, wieder darauf klicke, dann sehen Sie, habe

01:10:39.350 --> 01:10:41.590
ich jetzt ein Cookie da drin gehabt.

01:10:42.170 --> 01:10:45.670
Da steht wieder hier vorne der Zeitstempel der letzten Modifikation.

01:10:45.670 --> 01:10:49.070
Aber rechts daneben steht der Inhalt des Cookies, den wir gerade

01:10:49.070 --> 01:10:52.670
vorher erzeugt haben durch den vorherigen Aufruf, nämlich Zeitstempel

01:10:52.670 --> 01:10:56.210
gleich und da steht der gleiche Wert nochmal wie links.

01:10:57.430 --> 01:10:59.430
Ich habe ja das Dokument nicht verändert, ich habe es ja nur

01:10:59.430 --> 01:10:59.950
aufgerufen.

01:11:00.970 --> 01:11:05.730
Also so entsteht hier solch ein Cookie.

01:11:08.290 --> 01:11:13.710
Jetzt werde ich sicherheitshalber nochmal die Cookies löschen, weil

01:11:13.710 --> 01:11:15.390
ich ja noch mehr Beispiele Ihnen zeigen will.

01:11:17.450 --> 01:11:19.350
Und schauen wir mal weiter.

01:11:21.010 --> 01:11:29.450
Bei Cookies ist es so, die werden abgelegt auf dem Client-Rechner und

01:11:29.450 --> 01:11:33.330
dabei spielt natürlich eine Rolle, wie lange ist das, was dort steht,

01:11:33.450 --> 01:11:34.030
eigentlich relevant.

01:11:35.550 --> 01:11:39.250
Es könnte sein, dass Information, die man dort ablegen will, für einen

01:11:39.250 --> 01:11:42.390
größeren Zeitraum interessant ist, kann aber auch sein, dass man sagt,

01:11:42.490 --> 01:11:46.390
naja, also das, was da steht, will ich nur ein paar Minuten oder

01:11:46.390 --> 01:11:50.050
vielleicht auch nur ein paar Tage aufbewahren.

01:11:50.830 --> 01:11:54.310
Schauen Sie sich an, die Cookies, die auf Ihrem Rechner gespeichert

01:11:54.310 --> 01:11:58.550
sind, da finden Sie immer irgendwelche Angaben darüber, wie lange die

01:11:58.550 --> 01:11:59.510
existieren.

01:11:59.510 --> 01:12:07.510
Und Sie finden dann, Sie können angeben, über die Variable expires

01:12:07.510 --> 01:12:10.130
gleich können Sie angeben das Verfallsdatum.

01:12:11.310 --> 01:12:15.170
Also hier, Sie können in das Cookie reinschreiben, expires gleich und

01:12:15.170 --> 01:12:21.030
daneben ein explizites Datum reinschreiben, dann wird zu diesem Datum

01:12:21.030 --> 01:12:25.450
dieser Cookie aus dem Verzeichnis gelöscht, ist dann nicht mehr

01:12:25.450 --> 01:12:25.870
gültig.

01:12:28.010 --> 01:12:31.690
Und wenn also der Verfallszeitpunkt erreicht ist, wird dieser Cookie

01:12:31.690 --> 01:12:32.790
automatisch gelöscht.

01:12:33.850 --> 01:12:36.610
Wenn Sie sich anschauen, was für Verfallszeitpunkte standardmäßig

01:12:36.610 --> 01:12:38.350
drinstehen, sind die in der Regel sehr groß.

01:12:38.630 --> 01:12:42.950
Also viele Anwendungen schreiben Cookies rein, die irgendwie ein Jahr

01:12:42.950 --> 01:12:47.610
oder auch ein paar Jahre Verfallsdatum später haben.

01:12:48.550 --> 01:12:52.050
So, hier wird wieder etwas gemacht.

01:12:52.150 --> 01:12:53.310
Was soll hier gemacht werden?

01:12:53.430 --> 01:12:55.590
Wir wollen das Ablaufdatum irgendwie reinschreiben.

01:12:56.130 --> 01:13:02.850
Also hier wird wieder ein JavaScript erzeugt und es wird eine Variable

01:13:02.850 --> 01:13:04.330
Ablauf definiert.

01:13:04.330 --> 01:13:12.270
Und in dieser Variable Ablauf wird jetzt eine Variable, die vom Typ

01:13:12.270 --> 01:13:15.030
Datum ist, wird das Datum aufgerufen.

01:13:17.170 --> 01:13:21.230
Also es wird das aktuelle Datum erzeugt, geht in die Variable Ablauf

01:13:21.230 --> 01:13:23.330
rein, das war die Initialisierung.

01:13:23.330 --> 01:13:29.270
Und ich möchte gerne in drei Minuten, also drei Minuten lang soll

01:13:29.270 --> 01:13:34.550
dieses Cookie gültig sein, deswegen nehme ich den Wert, den ich bei

01:13:34.550 --> 01:13:41.330
Ablauf gerade bekommen habe, daraus die Zeit und addiere drei Minuten.

01:13:42.070 --> 01:13:47.010
Das muss entsprechend dieser Form gemacht werden, weil ich halt in

01:13:47.010 --> 01:13:49.150
tausendstel Sekunden das Ganze angebe.

01:13:50.810 --> 01:13:54.870
Und entsprechend muss ich den Wert darauf schreiben, drei mal sechzig

01:13:54.870 --> 01:13:58.310
Sekunden mal tausend Millisekunden.

01:13:59.870 --> 01:14:05.450
Gut, und dann setze ich entsprechend bei Ablauf, also diese Variable

01:14:05.450 --> 01:14:11.730
setTime in drei Minuten und wird also dieser Wert entsprechend neu

01:14:11.730 --> 01:14:20.690
gesetzt und schreibe jetzt in diese Variable expires, den Wert rein,

01:14:20.810 --> 01:14:27.570
der Variable Ablauf und in der Form green, which meantime

01:14:27.570 --> 01:14:34.290
entsprechendes Format, um Zeiten anzugeben und schreibe entsprechend

01:14:34.290 --> 01:14:35.690
meinen Cookie.

01:14:37.130 --> 01:14:43.490
So, das ist das ganze Cookie, wobei noch ein Alert gemacht wird mit

01:14:43.490 --> 01:14:47.530
Verfallsdatum, wird also angezeigt, was dort geschrieben wird und dann

01:14:47.530 --> 01:14:48.590
schauen wir uns das wieder an.

01:14:48.890 --> 01:14:52.290
Dazu muss ich wieder meinen Stift ändern, mal sehen, was hier

01:14:52.290 --> 01:14:52.870
passiert.

01:14:53.710 --> 01:14:57.910
Sie sehen, jetzt habe ich das aufgerufen, die Zeit stimmt nicht ganz.

01:14:57.910 --> 01:15:02.470
Es steht hier drin, Verfallsdatum Donnerstag, 29.

01:15:02.850 --> 01:15:06.610
Juni 2006, 13.17.09.

01:15:08.570 --> 01:15:14.130
Es stehen noch ein paar weitere Informationen da drin, die aus dem

01:15:14.130 --> 01:15:16.530
Skript kommen, das ich tatsächlich aufgerufen habe.

01:15:16.630 --> 01:15:20.870
Ich habe Ihnen auf der Folie nicht alles angegeben, was in das Cookie

01:15:20.870 --> 01:15:21.810
reingeschrieben wird.

01:15:22.130 --> 01:15:25.930
In der konkreten Datei wird noch ein bisschen mehr gemacht.

01:15:26.730 --> 01:15:33.750
Das heißt, hier steht jetzt folgendes, Cookie-Inhalt nachher, Uhrzeit

01:15:33.750 --> 01:15:34.990
gleich Donnerstag, 29.

01:15:35.270 --> 01:15:37.630
Juni 2006, 12.47.

01:15:37.710 --> 01:15:38.750
Das stimmt ziemlich genau.

01:15:40.090 --> 01:15:44.790
Und hier wird also nicht 3 Minuten das weitergemacht, sondern 30

01:15:44.790 --> 01:15:48.150
Minuten weitergezählt.

01:15:48.550 --> 01:15:50.210
Also entsprechend auf 13.17.

01:15:50.430 --> 01:15:52.870
ist hier das Verfallsdatum eingestellt.

01:15:52.870 --> 01:15:58.870
Also wird hier durch das Skript dieses Verfallsdatum erzeugt.

01:16:00.090 --> 01:16:02.630
Ich habe ja nicht das auf der Folie aufgerufen, sondern entsprechend

01:16:02.630 --> 01:16:05.970
die Datei, die ich in meinem Rechner hier vorher abgelegt hatte.

01:16:08.330 --> 01:16:11.990
So, gut, jetzt gehen wir wieder zurück zu unserer Präsentation.

01:16:14.890 --> 01:16:17.590
Wir hatten also jetzt gesehen, dass man Cookies mit

01:16:17.590 --> 01:16:19.750
Verfallszeitpunkten versehen kann.

01:16:19.750 --> 01:16:25.410
Jetzt möchte ich gerne über ein Cookie in der Lage sein,

01:16:25.610 --> 01:16:31.210
festzustellen, wie oft ein bestimmter Nutzer auf eine Seite

01:16:31.210 --> 01:16:32.110
zugegriffen hat.

01:16:33.330 --> 01:16:39.210
Sie hatten vorher gesehen ein Beispiel, wo über ein Servlet es möglich

01:16:39.210 --> 01:16:45.490
war, festzustellen, wie oft auf eine bestimmte Seite zugegriffen

01:16:45.490 --> 01:16:45.810
wurde.

01:16:46.910 --> 01:16:49.910
Nicht nur von einem Benutzer, sondern von beliebigen Benutzern.

01:16:50.490 --> 01:16:54.090
Hier haben wir über ein Cookie die Möglichkeit festzustellen, wie oft

01:16:54.090 --> 01:16:56.030
ein bestimmter Benutzer bzw.

01:16:56.430 --> 01:17:00.990
ein Rechner oder ein Browser eine Seite aufgerufen hat.

01:17:01.890 --> 01:17:08.470
Das kann man mit einem Cookie zählen, in dem in dem HTML-Code etwas

01:17:08.470 --> 01:17:09.230
drinstehen muss.

01:17:09.230 --> 01:17:16.890
Hier wird also zunächst mal eine Funktion deklariert und Sie sehen,

01:17:17.570 --> 01:17:25.230
hier wird ein Document Cookie, wenn das schon vorhanden ist, wird

01:17:25.230 --> 01:17:28.510
entsprechend ein Wert geholt.

01:17:28.730 --> 01:17:34.290
Und zwar wird hinter dem Gleichheitszeichen, man kann hier innerhalb

01:17:34.290 --> 01:17:40.830
eines Cookies navigieren, bestimmte Teile dort ansprechen.

01:17:41.350 --> 01:17:45.870
Hier wird also geschaut, was hinter diesem Gleichheitszeichen steht.

01:17:46.090 --> 01:17:51.970
Das wird um 1 erhöht, das heißt hier wird etwas draufgezählt.

01:17:53.010 --> 01:17:55.130
Wert Start ist also...

01:17:55.130 --> 01:17:57.850
Also, was wird hier gemacht?

01:17:57.930 --> 01:17:59.710
Ich habe meinen Cookie, das ist eine Folge von Zeichen.

01:18:00.570 --> 01:18:03.110
Und ich will jetzt irgendeinen Wert dort auslesen.

01:18:03.110 --> 01:18:05.490
Der Wert Start ist irgendeine Position.

01:18:06.230 --> 01:18:08.590
Das ist die Position des Gleichheitszeichens.

01:18:10.190 --> 01:18:14.230
Und ich gehe um eine Position weiter, also auf das Zeichen danach,

01:18:14.570 --> 01:18:15.230
plus 1.

01:18:15.690 --> 01:18:17.190
Das andere ist Wert Ende.

01:18:18.270 --> 01:18:21.470
Das heißt, da wird geguckt, irgendwo steht hier ein Semikolon.

01:18:22.550 --> 01:18:26.030
Und das Semikolon soll gerade das Ende des Wertes andeuten.

01:18:26.850 --> 01:18:30.130
Das heißt, ich suche nach einem solchen Teil in dem Cookie, nach dem

01:18:30.130 --> 01:18:31.350
ersten Gleichheitszeichen.

01:18:31.350 --> 01:18:35.330
Und das ist der Beginn meines Wertes, den ich lesen will.

01:18:35.630 --> 01:18:39.650
Und ich gehe so lange weiter, bis ich ein Semikolon gefunden habe.

01:18:39.990 --> 01:18:42.090
Das ist das Ende dieses Wertes.

01:18:43.750 --> 01:18:49.630
Wenn dieses Semikolon gar nicht vorhanden ist, dann heißt das, da

01:18:49.630 --> 01:18:51.990
stand kein Semikolon mehr drin.

01:18:53.050 --> 01:18:58.570
Semikola werden verwendet, um Werte zu trennen in so einem Cookie.

01:18:58.570 --> 01:19:01.030
Also ist das der letzte Wert gewesen.

01:19:01.650 --> 01:19:06.350
Dann ist das Wert Ende gerade definiert durch die Länge meines

01:19:06.350 --> 01:19:06.790
Cookies.

01:19:07.170 --> 01:19:10.710
Das ist die rechteste Position meines Cookies.

01:19:11.470 --> 01:19:16.310
Und dann hole ich aus dem Cookie einen Teilstring raus, nämlich genau

01:19:16.310 --> 01:19:19.970
diesen Teilstring, der hier angegeben ist, von Wert Start bis Wert

01:19:19.970 --> 01:19:20.230
Ende.

01:19:21.250 --> 01:19:25.050
Und der Wert wird zurückgegeben, und das ist der Wert, der von der

01:19:25.050 --> 01:19:26.930
Methode Wert holen rausgegeben wird.

01:19:26.930 --> 01:19:30.970
Das heißt, Wert holen soll einen bestimmten Teilbereich meines Cookies

01:19:30.970 --> 01:19:32.170
auslesen.

01:19:32.990 --> 01:19:39.250
Und dann kann ich mit dem Wert alles Mögliche machen.

01:19:39.470 --> 01:19:44.690
Und hier wird folgendes gemacht, dass der Wert neu gesetzt werden

01:19:44.690 --> 01:19:45.090
soll.

01:19:46.190 --> 01:19:52.130
Also hier haben wir alle möglichen Sachen wieder drin stehen.

01:19:52.770 --> 01:19:55.250
Hier wird eine Auszeit definiert.

01:20:02.370 --> 01:20:13.810
In dem Cookie wird hinter den Wert eines Bezeichners gleicherzeitig

01:20:13.810 --> 01:20:14.290
geschrieben.

01:20:14.510 --> 01:20:19.330
Es wird ein Wert daneben geschrieben, der Wert, der hier steht.

01:20:19.330 --> 01:20:24.370
Und es wird anschließend auch noch ein Verfallsdatum hingeschrieben.

01:20:25.110 --> 01:20:32.210
Das ist hier in dem Fall Semikolon, dann Expires gleich.

01:20:32.430 --> 01:20:37.170
Und dann steht hier Auszeit...

01:20:38.510 --> 01:20:42.650
Was hier in Anführungszeichen steht, ist immer gerade, da haben wir

01:20:42.650 --> 01:20:47.490
das Anführungszeichen, Semikolon, Expires gleich, ist ein solcher

01:20:47.490 --> 01:20:49.130
String.

01:20:49.330 --> 01:20:53.970
Und dann steht dahinter als nächstes, da wird eine Zeit angegeben,

01:20:54.150 --> 01:20:58.290
Auszeit.tgmdString.

01:21:01.290 --> 01:21:06.230
Und anschließend wird hier noch nach dieser ganzen Verfallszeit das

01:21:06.230 --> 01:21:07.950
gemacht, was ich eigentlich zeigen wollte.

01:21:08.110 --> 01:21:10.050
Das mit der Verfallszeit hätte ich rausstreichen können.

01:21:10.790 --> 01:21:13.510
Was ich Ihnen zeigen wollte, ist eigentlich dieser Zähler.

01:21:13.510 --> 01:21:15.390
Ich will den Zählerstand hier rausholen.

01:21:16.570 --> 01:21:19.330
Und der Zähler ist zunächst mal 0.

01:21:21.970 --> 01:21:27.970
Und dann schaut man sich an, ob das Cookie bereits vorhanden ist.

01:21:28.130 --> 01:21:30.070
Hier wird also das gemacht, was ich Ihnen eigentlich zeigen wollte,

01:21:30.170 --> 01:21:31.770
die Anzahl persönlicher Seitenbesuche.

01:21:33.090 --> 01:21:39.270
Falls dieser Cookie bereits vorhanden ist, wird der Wert von Zähler in

01:21:39.270 --> 01:21:40.870
diesem Cookie um 1 erhöht.

01:21:40.870 --> 01:21:50.310
Und dann wird der Wert dieses Zählers gesetzt mit der entsprechenden

01:21:50.310 --> 01:21:55.190
Verfallszeit, die man sich vorher rausgeholt hat.

01:21:56.290 --> 01:22:01.890
Und wenn das Cookie noch nicht vorhanden war, wird der Zähler auf 1

01:22:01.890 --> 01:22:05.690
gesetzt und auch hier entsprechend in das Cookie der Wert

01:22:05.690 --> 01:22:06.290
reingeschrieben.

01:22:08.230 --> 01:22:11.510
Also, wir haben hier einmal eine Verfallszeit erzeugt.

01:22:12.330 --> 01:22:16.570
Das war auf der vorigen Folie zu sehen.

01:22:17.350 --> 01:22:19.950
Und jetzt wird dieser Zählerwert hier erhöht.

01:22:24.330 --> 01:22:30.330
Das waren jetzt Funktionen, Zählerstand und die Funktion Wert holen

01:22:30.330 --> 01:22:31.490
und die Funktion Wert setzen.

01:22:31.610 --> 01:22:33.030
Drei Funktionen brauchten wir.

01:22:33.750 --> 01:22:35.770
Und jetzt wird endlich etwas gemacht.

01:22:35.990 --> 01:22:37.470
Hier steht jetzt Ende vom Head.

01:22:37.690 --> 01:22:42.190
Da sind die Cookie-Definitionen hier soweit erstmal beendet.

01:22:42.270 --> 01:22:46.230
Und jetzt wird der Body erzeugt, der Rumpf erzeugt, unsere HTML-Seite.

01:22:47.110 --> 01:22:50.350
Und da steht jetzt eine Seite, die etwas über sie weiß.

01:22:51.670 --> 01:22:53.950
Hier wird wieder ein JavaScript aufgerufen.

01:22:53.950 --> 01:23:00.490
In einer Variablen X wird jetzt die Funktion Zählerstand aufgerufen.

01:23:01.230 --> 01:23:04.290
Das heißt, da wird auf Cookie zugegriffen, der aktuelle Zählerstand

01:23:04.290 --> 01:23:05.130
ausgelesen.

01:23:05.610 --> 01:23:10.490
Und dann wird entsprechend geschrieben in das Dokument, dies ist Ihr

01:23:10.490 --> 01:23:15.230
entsprechend X-ter Besuch, weil das X der Zählerstand ist.

01:23:17.150 --> 01:23:20.370
Und dann soll da noch stehen, benutzen Sie doch mal die Reload

01:23:20.370 --> 01:23:21.630
-Funktion Ihres Browsers.

01:23:22.190 --> 01:23:26.710
Und das Ganze kann man sich jetzt angucken, was dort passiert.

01:23:26.970 --> 01:23:28.450
Ich hoffe, dass das jetzt funktioniert.

01:23:29.530 --> 01:23:30.030
Ansicht.

01:23:30.930 --> 01:23:34.330
Sehen Sie, das funktioniert nicht richtig, weil nämlich der Cookie,

01:23:34.450 --> 01:23:37.170
der hier vorher drin stand, nicht funktioniert.

01:23:37.870 --> 01:23:40.830
Wenn da Not a Number steht, dann ist das natürlich nicht in Ordnung.

01:23:41.450 --> 01:23:45.030
Das versuche ich jetzt zu reparieren, indem ich die Cookies lösche.

01:23:45.850 --> 01:23:47.490
Also das Ding ist nicht perfekt.

01:23:48.270 --> 01:23:51.630
Ich mache ein Reload und Sie sehen, dies ist der erste Besuch auf

01:23:51.630 --> 01:23:52.090
dieser Seite.

01:23:52.230 --> 01:23:53.310
Ich hatte die Cookies gelöscht.

01:23:54.370 --> 01:23:56.130
Jetzt ist das der erste Besuch auf der Seite.

01:23:56.950 --> 01:23:59.910
Und jetzt mache ich noch mal Reload und Sie sehen, das ist der zweite

01:23:59.910 --> 01:24:00.390
Besuch.

01:24:01.610 --> 01:24:04.070
Und ich gehe noch mal darauf, das ist der dritte Besuch, vierter

01:24:04.070 --> 01:24:06.030
Besuch, fünfter, sechster und so weiter.

01:24:06.130 --> 01:24:12.450
Ich kann hier beliebig hochzählen, kann also das Wiederladen dieser

01:24:12.450 --> 01:24:15.750
Seite auf die Art und Weise hier dokumentieren.

01:24:15.750 --> 01:24:18.810
Nur, dass Sie sehen, der Unterschied zu dem, was wir vorher gemacht

01:24:18.810 --> 01:24:24.410
haben, war, da waren das Informationen über Dinge, die auf Server

01:24:24.410 --> 01:24:26.010
-Seite abgelegt waren.

01:24:26.690 --> 01:24:33.650
Auf Server-Seite stand etwas über die dort gerade aktuelle Zeit und

01:24:33.650 --> 01:24:33.940
ähnliches.

01:24:35.050 --> 01:24:38.370
Hier wird etwas auf Client-Seite gemacht und in diesem Fall über

01:24:38.370 --> 01:24:42.570
Cookies, verbunden mit einer URL, werden Informationen abgelegt und

01:24:42.570 --> 01:24:44.870
beim nächsten Aufruf wiederverwendet.

01:24:45.750 --> 01:24:49.730
Auf die Art und Weise können wir also hier dynamisch Informationen

01:24:49.730 --> 01:24:50.090
erzeugen.

01:24:52.070 --> 01:24:58.750
Gut, ich glaube, das reicht als Informationen über diese einfachen

01:24:58.750 --> 01:24:59.030
Cookies.

01:24:59.130 --> 01:25:00.190
Ein paar Bemerkungen dazu.

01:25:01.570 --> 01:25:04.770
Wir haben also jetzt Zugriffsinformationen auf HTML-Seiten

01:25:04.770 --> 01:25:05.770
gespeichert.

01:25:06.350 --> 01:25:10.850
Wir haben also zugegriffen auf der HTML-Seite und die Informationen

01:25:10.850 --> 01:25:13.770
sind lokal abgelegt worden in einem Cookie.

01:25:13.770 --> 01:25:17.470
Lokal auf Client-Seite, nicht auf Server-Seite.

01:25:18.370 --> 01:25:22.450
Also der Server kann nicht auf irgendwelche weiteren Dinge zugreifen,

01:25:22.770 --> 01:25:27.330
sondern es wird durch das HTTP-Protokoll einfach mit dem Request diese

01:25:27.330 --> 01:25:28.750
Informationen mitgeliefert.

01:25:29.150 --> 01:25:34.050
Und wer das nicht möchte, kann das einfach deaktivieren und dann

01:25:34.050 --> 01:25:37.730
werden keine Cookies mitgeliefert oder abgespeichert.

01:25:38.590 --> 01:25:43.530
Man kann explizit festlegen, bei welcher URL der Cookie mitgeschickt

01:25:43.530 --> 01:25:46.310
werden soll und man kann, wie gesagt, den Cookie ausschalten.

01:25:47.270 --> 01:25:50.290
Es gibt darüber hinaus noch eine Reihe anderer Möglichkeiten der

01:25:50.290 --> 01:25:51.250
Personalisierung.

01:25:52.890 --> 01:25:56.810
Natürlich werden Cookies von einigen Leuten abgeschaltet, deswegen

01:25:56.810 --> 01:25:59.610
wäre das dumm, wenn man nur das über Cookies machen würde.

01:26:00.290 --> 01:26:03.770
Eine andere Möglichkeit ist, Profile zu verwenden und wie man das

01:26:03.770 --> 01:26:05.610
macht, werde ich Ihnen dann nächstes Mal erzählen.

01:26:06.290 --> 01:26:08.530
Das ist ein ganz kritischer Bereich.

01:26:09.390 --> 01:26:13.030
Sobald ich Profile verwende, geht es um persönliche Daten.

01:26:13.150 --> 01:26:16.090
Auch das, was ich gerade eben beschrieben habe, die Cookies, das sind

01:26:16.090 --> 01:26:17.670
ja eigentlich persönliche Informationen.

01:26:18.270 --> 01:26:21.530
Und sobald es um persönliche Informationen geht, haben wir Probleme

01:26:21.530 --> 01:26:24.930
mit dem Datenschutz und müssen sehen, wie man eigentlich dafür sorgt,

01:26:25.030 --> 01:26:29.770
dass der Benutzer einerseits personalisierte Informationen bekommt,

01:26:29.910 --> 01:26:34.350
andererseits aber den Zugriff auf seine persönlichen Daten nicht aus

01:26:34.350 --> 01:26:34.930
der Hand gibt.

01:26:34.930 --> 01:26:36.650
Und das werde ich Ihnen nächstes Mal erzählen.

01:26:36.850 --> 01:26:37.490
Vielen Dank für heute.

