Vorlesung Informatik 1 Hochschule Esslingen Studiengang Wirtschaftsinformatik Exkurs: Webpages Dr. rer. nat. Andreas Rau http://www.hs-esslingen.de/~rau [email protected] © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #1 Hintergrund Eine wesentliche Voraussetzung zum Erlernen einer Programmiersprache ist viel Übung. Dafür braucht man Zeit, Wissen und Motivation. Zeit kann/muss man sich nehmen. Wissen ist jedoch am Anfang noch wenig vorhanden, und da man mit dem wenigen Wissen auch nur wenig anfangen kann ist auch die Motivation eher gering. Die Erstellung von Webseiten ermöglicht über die Themen Markup, Styling und Scripting einen schnellen und unkomplizierten Einstieg in die Welt der Programmierung und erlaubt gleichzeitig die sofortige Anwendung für kleine Projekte die einen sofortigen Nutzen und damit Spass und Motivation bringen, z.B. eine eigene Homepage. Gleichzeitig werden viele Themen gestreift, die im weiteren Verlauf der Vorlesung noch vertieft werden, z.B. Struktur von Daten und Layouts, Trennung von Inhalt und Darstellung, Variablen, Funktionen, ... Auch der Umgang mit (englischsprachigen) Hilfeseiten und anderen Online Resourcen kann damit frühzeitig geübt werden. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #2 Einordnung von Webtechnologien Netzwerk Server Client © Andreas Rau, 15.10.10 Webserver zur Auslieferung von Webseiten Datenspeicherung als Datei oder Datenbank Seiten statisch oder dynamisch generiert PHP, JSP+Servlets, ASP, CGI für Funktionen Datentransfer über verschiedene Protokolle TCP/IP mit Transportsicherung aber ohne Zustand Webbrowser zur Anzeige von Webseiten Keine Datenspeicherung (außer Cookies) HTML, XML, XSLT zur Seitenbeschreibung JavaScript und Applets für Funktionen D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #3 HTML Hypertext Markup Language © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #4 Protokolle und Dateitypen Im Internet gibt es nicht nur Webseiten! Der Zugriff auf beliebige Ressourcen im Internet erfolgt allgemein mit Hilfe von sog. URLs (Uniform Resource Locator). Aufbau einer URL: <protocol>://<server>/<resource-path> Dabei ist <protocol> zu verstehen als ein Dienst und legt u.a. die Kodierung von Anfrage an einen solchen fest. Hinter <server> verbirgt sich meist schlicht die IP-Adresse eines Rechners und <resource-path> ist im einfachsten Fall tatsächlich ein (relativer) Pfad zu einer Datei unterhalb eines speziellen Verzeichnisses des entsprechenden Dienstes. Beispiele: http://www.hs-esslingen.de/~rau/index.html ftp://ftp.mydomain.de/video.mpg jdbc://www.mydomain.de/database1 svn://www.myproject.de/repository Darüberhinaus werden ähnlich wie unter Windows verschiedene Dateitypen unterschieden. Dies geschieht aber nicht über Dateiendungen sondern sog. Mime-Types (die sich jedoch wieder Dateiendungen zuordnen lassen, Beispiel .jpg => image/jpeg). Dies ist u.a. deshalb nötig, weil ein <resource-path> u.U. gar keine Dateiendung hat! © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #5 HTML(1) Ziel und Einordnung von HTML HTML ist keine Programmiersprache im engeren Beschreibungssprache (Markup Language) für (Web)seiten. Sinn sondern eine HTML = Hypertext Markup Language Ziel von HTML ist also nicht die Beschreibung eines Ablaufs wie bei einer "echten" Programmiersprache, sondern die Beschreibung der Struktur einer Webseite. Dazu wird der eigentliche Inhalt dieser Seite durch Markierungen (Tags) ergänzt bzw. annotiert. Da die Markierungen nicht die eigentliche Information sondern eine einer Beschreibung der eigentlichen Information darstellen, werden Sie als Meta-Information bezeichnet. Sachverhalt–(Beschreibung)-->Information--(Beschreibung)-->Meta-Information Derartige Meta-Informationen werden auch in vielen anderen Bereichen der Informatik verwendet, z.B. zur Beschreibung von Datenstrukturen (Datenmodelle in UML) oder von Klassen und Objekten (Reflection in Java). HTML basiert auf der allgemeineren Sprache SGML und wird zusammen mit anderen Web-Sprachen wie CSS, XML und XSLT vom W3C standardisiert und weiterentwickelt. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #6 HTML(2) Aufbau von HTML HTML besteht im wesentlichen aus zwei Bestandteilen: Tags und Attributen. Diese sind immer nach dem gleichen Schema aufgebaut. <TagName AttributeName="AttributeValue"> Obwohl keine Programmiersprache ist HTML dennoch eine "Computersprache" und schreibt daher eine strikte Syntax vor. Ihr einheitlicher Aufbau vereinfacht sowohl die Anwendung als auch die maschinelle Verarbeitung der Sprache. Tags treten (bis auf wenige Ausnahmen) stets in Paaren auf: Es gibt ein öffnendes und ein schließendes Tag, z.B. <Fett an> und <Fett aus>. Außerdem ist es möglich, Tags zu verschachteln. <Fett an>fett<Kursiv an>fett und kursiv<Kursiv aus><Fett aus> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #7 HTML(3) Anwendung von HTML Bei der Anwendung von Markup-Sprachen wie HTML unterscheidet man zwischen sog. prozeduralem Markup und semantischem Markup: Prozedurales Markup Direkte Beschreibung der Formatierung Beispiel: <Fett an>Text der fett sein soll<Fett aus> Semantisches Markup Beschreibung der Bedeutung und Formatierung gemäß separater Beschreibung Beispiel: <Wichtig an>Wichtiger Text<Wichtig aus>, Wichtig { Fett } Über das Für und Wieder dieser beiden Vorgehensweisen werden im Internet regelrechte Glaubenskriege geführt. Letztendlich hat sich jedoch das semantische Markup als flexiblere Lösung durchgesetzt, ist jedoch nicht immer vollständig durchzuhalten. Der Vorteil von semantischem Markup liegt daran, dass man zunächst die Struktur eines Dokuments beschreiben und dieses dann auf verschiedenen Ausgabegeräten (User Agents) und in unterschiedlichen Formen darstellen kann (z.B. für Behinderte). In der Praxis erfolgt die Beschreibung der Strukur in HTML und die des Formats mit CSS. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #8 HTML(4) Vergleich von HTML und Java HTML hat viele Eigenschaften einer Programmiersprache wie Java, die einen Einstieg in die Welt der "Programmierung" mit Hilfe von HTML sinnvoll machen. Syntax Sowohl HTML als auch Java haben eine definierte Syntax. Jedoch wird der Frust bei Verletzung der Syntax dadurch gemildert, dass die meisten Browser sehr tolerant sind und immer "irgendwas" anzeigen (fehlende Beschreibung vs. fehlende Anweisung). Verschachtelung Sowohl in HTML als auch in Java kommen verschachtelte Strukturen vor. Der Umgang damit kann in HTML spielerisch geübt werden. Layouts und GUIs Das Layout einer Seite hat viele Eigenschaften einer grafischen Oberfläche. Layout mit Tabellen (obwohl verpönt) ist vergleichbar zu LayoutManagern in Java (z.B. GridLayout). Die Anwendung von HTML führt schnell zu Ergebnissen(=Erfolgserlebnissen) und ermöglicht so "lernen mit Spaß". Daneben gibt es aber auch tatsächliche Berührungspunkte der beiden Sprachen: JavaDoc Kommentare (später) erlauben HTML und es ist möglich Java-Programme als sog. Applets in Webseiten einzubinden. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #9 HTML(5) Konkrete HTML Tags Das genaue Format der Tags ist wie folgt (man beachte den "/" im Ende-Tag) Begin-Tag: End-Tag: <TAG-NAME PARAM1="VALUE" PARAM2="VALUE> </TAG-NAME> Der Rahmen eines HTML Dokuments wird durch die folgenden Tags gebildet: <HTML> <HEAD> <TITLE>Der Seitentitel für Kopfzeile des Browsers</TITLE> </HEAD> <BODY> Der eigentliche Inhalt der Seite für das Browserfenster. </BODY> </HTML> Hier gibt es zu jedem Begin-Tag ein End-Tag! Im Bereich des <HEAD> Tags können noch weitere Meta-Informationen wie Stichworte für Suchmaschinen oder Verweise auf Stylesheets stehen. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #10 HTML(6) Beispiele für "gute" Tags zur logischen Beschreibung des Seiteninhalts Überschriften Absätze Hervorhebungen Tabellen Bilder Listen Anker Hyperlink © Andreas Rau, 15.10.10 <H1>Text</H1> ... <H6>Text</H6> <P>Text</P> <EM>Text</EM>, <STRONG>Text</STRONG> <TABLE BORDER="1" WIDTH="100%"> <TR> <TH>Text</TH> <TD>Text</TD> </TR> ...weitere Zeilen </TABLE> <IMG SRC="Bild.gif" ALT="Beschreibung"> <UL> <LI>Text ...weitere Elemente </UL> <A NAME="LABEL"></A> <A HREF="URL#LABEL" TARGET="Fenstername">Text</A> D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #11 HTML(7) Beispiele für "schlechte" Tags zur Formatierung des Seiteninhalts Fettdruck (bold) Kursiv (italic) Unterstrichen Schriftart Ausrichtung Zeilenumbruch <B>Text</B> <I>Text</I> <U>Text</U> <FONT>Text</FONT> <DIV ALIGN="MIDDLE">Text</DIV> <BR> Detaillierte Informationen zu HTML und den einzelnen Tags finden sich im Internet unter http://www.w3.org/markup und http://selfhtml.teamone.de © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #12 Pfade (absolut vs relativ) Bei Hyperlinks (<A>-Tag) bzw. Bildern (<IMG>-Tag) muss der Ort für das Zieldokument bzw. die Bilddatei angegeben werden. Dies ist entweder absolut (gilt immer) oder relativ zum Ort des aktuellen Dokuments (gilt nur ab hier) möglich. Beispiel aus der realen Welt Frage: „Wo wohnt Herr Maier?“ Absoluter Pfad: "Erde, Deutschland, 75312 Musterstadt, Hauptstraße 3, 2. Stock, links" Relativer Pfad: "Dieser Straße folgen, an der ersten Ampel links, ..." Beispiel mit Dateien anhand folgender Struktur: ~user/.public_html/welcome.html /bild1.jpg /images/bild2.jpg /uebungen/index.html /bild3.jpg Links von index.html aus (absolut / relativ): http://www.hs-esslingen.de/~user/bild1.jpg ../bild1.jpg http://www.hs-esslingen.de/~user/images/bild2.jpg ../images/bild2.jpg http://www.hs-esslingen.de/~user/uebungen/bild3.jpg bild3.jpg Innerhalb eines Projekts sind relative Links sind kürzer und nicht vom Speicherort sondern nur von der Struktur des Projekts abhängig, d.h. sie funktionieren auf der lokalen Festplatte ebenso wie auf einem beliebigen Webserver (sind also zu bevorzugen). © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #13 CSS Cascading Style Sheets © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #14 Cascading Style Sheets (CSS) Ziel und Einordnung von Stylesheets Mit Stylesheets ist es möglich, den Inhalt eines Dokuments von seiner Formatierung zu trennen. Dazu können jedem Tag verschiedene Stil-Attribute zugeordnet werden. Dieses Prinzip wird uns später unter dem Namen Model-View-Controller wieder begegnen. Die einfachste Form der Zuordnung erfolgt anhand des Tag-Typs h1 { background-color: #ff0000 } wirkt auf <h1>Text</h1> Eine genauere Klassifizierung ist über das HTML Attribut class möglich p.abstract { text-style: italic } wirkt auf <p class="abstract">Text</p> Schließlich können einzelne Elemente über das HTML Attribut id referenziert werden div#header { border: 1 solid black } wirkt auf <div id="header">Text</div> Die allgemeine Form einer simplen Styledefinition lautet also TagName[#ID][.ClassName] { PropertyName: PropertyValue } oder etwas allgemeiner Pattern { PropertyName: PropertyValue } Dabei steht Pattern für ein Muster das auf ein oder mehrere Tags passt (oder auch nicht). © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #15 Cascading Style Sheets (CSS) Komplexere Styledefinitionen beziehen sich auf mehrere Tags, enthalten mehrere Eigenschaften oder nutzen die Schränken die betroffenen Tags durch Beschreibung der Verschachtelung weiter ein (Kaskadierung, daher Cascading Style Sheets) Mehrere Tags, z.B. alle Überschriften in blau (Textfarbe) h1, h2, h3 { color: #0000ff; } Mehrere Eigenschaften, z.B. Absätze in Arial 12 (Schriftart und Größe) p { font-family: Arial; font-size: 12pt; } Angabe der Verschachtelung, z.B. alle Links in numerierten Listen fett (Schriftgewicht) ol li a { font-weight: bold; } Diese Möglichkeiten tragen zu Reduzierung von Schreibarbeit und Redundanz und erlauben gleichzeitig eine noch spezifischere Beschreibung der Darstellung. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #16 Cascading Style Sheets (CSS) Die Verbindung zwischen HTML-Tags und Styledefinitionen kann entweder über ein externes Stylesheet geschehen (gut für einheitliches Aussehen einer ganzen Website) oder direkt im HTML Dokument geschehen (in Ausnahmefällen). Das folgende Beispiel illustriert alle diese Möglichkeiten. <HTML> <HEAD> <!-- Verweis auf externes Stylesheet für mehrere Seiten --> <LINK REL="stylesheet" TYPE="text/css" HREF="style.css" TITLE="default"> <!-- Eingebettetes Stylesheet für diese eine Seite --> <STYLE TYPE="text/css"> P { text-align: right; background-color: #0000ff } </STYLE> </HEAD> <BODY STYLE="background-color: #ff0000"> <!-- Style direkt am Tag --> <P>Das ist ein rechtsbündiger Absatz mit blauem Hintergrund </BODY> </HTML> Genaue Informationen zu den einzelnen Eigenschaften finden sich beim W3C unter http://www.w3.org/style/css bzw. (wieder) bei http://selfhtml.teamone.de. Einen Eindruck von der Mächtigkeit von CSS vermittelt die Seite http://www.csszengarden.com © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #17 Cascading Style Sheets (CSS) Bei der Anwendung eines Stylesheets werden die Styledefinitionen wie folgt kombiniert: Alle Styledefinition die ein Tag betreffen werden zusammengefasst ● Treten dabei Wiedersprüche auf gilt die Angabe mit dem spezifischeren Muster ● Spezifischer ist (a) näher am Tag (b) parent tag (c) tag.id d) tag.class e) nur tag ● Eigenschaften eines Tags, für die im Stylesheet keine explizite Angabe vorhanden ist, werden entweder von umgebenden Tags geerbt oder durch die Default Werte des Browsers festgelegt. Beispiel <html> <head> <style type="text/css"> body { background-color: red; } p { font-size: 12pt; font-weight: bold; } </style> p-Style </head> <body> <p style="font-weight: normal">Schwarzer 12pt Normaltext auf rotem Grund</p> </body> </html> Default-Style Style-Attribut © Andreas Rau, 15.10.10 body-Style (Erbschaft) D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #18 Farbcodes in HTML bzw. CSS Farben werden in HTML und CSS durch Codes angegeben, welche die Anteile für die Grundfarben ROT, GRÜN und BLAU (RGB) angeben (additive Farbmischung). Dabei stehen je 2 Ziffern für jede Farbe; gezählt wird jeweils 0, 1, 2, ..., 9, a, b, c, d, e, f. <html> <body> <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: <span style="background-color: </body> </html> © Andreas Rau, 15.10.10 #800080">&nbsp;&nbsp;&nbsp;</span> #800000">&nbsp;&nbsp;&nbsp;</span> #804000">&nbsp;&nbsp;&nbsp;</span> #808000">&nbsp;&nbsp;&nbsp;</span> #408000">&nbsp;&nbsp;&nbsp;</span> #008000">&nbsp;&nbsp;&nbsp;</span> #008040">&nbsp;&nbsp;&nbsp;</span> #008080">&nbsp;&nbsp;&nbsp;</span> #004080">&nbsp;&nbsp;&nbsp;</span> #000080">&nbsp;&nbsp;&nbsp;</span> D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #19 Cascading Stylesheets (CSS) - Einordnung Bestandteile einer Webseite Style CSS, HTML / "schlechte Tags" Struktur HTML / "gute" Tags Text ASCii / normaler Text © Andreas Rau, 15.10.10 Meta-Meta-Ebene Beschreibung des Aussehens für Elemente der Meta-Ebene Meta-Ebene Beschreibung der Struktur der Inhaltsebene Inhaltsebene Beschreibung des Inhalts der Seite D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #20 Cascading Style Sheets (CSS) - Priorisierung Important User Style Lokale Regeln mit !IMPORTANT Style Attribute Definition via <... style=""> an einem Tag Internes Stylesheet Sonderwünsche des Anwenders Übersteuerung jeglicher Formatierungen Kleine Ausnahmen Beschreibung der Struktur der Inhaltsebene Grosse Ausnahmen Definition via <style> innerhalb der webseite Abweichende/zusätzliche Formatierung auf besonderen Seiten Externes Stylesheet Definition in Datei, Einbindung via <link> Default User Style Lokale Regeln ohne !IMPORTANT Default Browser Style Browserkonfiguration © Andreas Rau, 15.10.10 Corporate Identity Einheitliches Aussehen für alle Seiten einer Domäne Vorschlag des Anwenders Nur für Seiten ohne eigene Vorgaben Historisches Aussehen Große Schriftarten, Wenig Farbe D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #21 Cascading Style Sheets (CSS) - Anwendung Stylesheets sind nicht nur hilfreich bei der Gestaltung von Webseiten. Sie können auch verwendet werden, um Webseiten durch den Anwender anzupassen. Zu diesem Zweck erlauben alle modernen Browser die Definition von sog. Custom-Stylesheets (Firefox mit der Erweiterung „stylish“ sogar spezifisch pro Website). In diesen Stylesheets kann mit Hilfe von !IMPORTANT-Regeln der Stil der Webseite überschrieben werden, z.B. um die Lesbarkeit zu verbessern oder Werbung auszublenden ;-) Beispiel: Datei: custom.css /* alle bilder ausblenden */ img { display: none !important; } /* werbung auf heise.de ausblenden */ div.bcadv { display: none !important; } © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #22 Javascript (hat nix mit Java zu tun!!!) © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #23 JavaScript Ziel und Einordnung von JavaScript Obwohl es der Name vermuten ließe hat JavaScript nichts aber auch gar nichts mit Java zu tun! Obwohl es Ähnlichkeiten zwischen beiden Sprachen gibt, z.B. bei der Schreibweise von Kontrollstrukturen, unterscheiden sie sich in vielen elementaren Aspekten wie der Typisierung oder dem Objektmodell und haben sich historisch unabhängig voneinander entwickelt: Javascript bei der Firma Netscape, Java bei Sun Microsystems (Javasoft). Während Java mittlerweile bald in Version 6.0 vorliegt wurde die Sprache JavaScript zwischenzeitlich unter dem Namen ECMA Script standardisiert. Einsatzbereich für Javascript ist die "Anreicherung von Webseiten", z.B. mit Prüfungen für Formulareingaben oder einfachen Animationen. Letztere Anwendung wird auch mit dem Stichwort dynamisches HTML (kurz DHTML) bezeichnet. Damit gemeint ist die Veränderung von Darstellung und ggf. auch Inhalt einer Webseite durch den eingebetteten JavaScript Code. Man kann jedoch auch komplexe Applikationen mit Hilfe von JavaScript entwickeln. Was die praktische Programmierung mit JavaScript etwas erschwert ist die Tatsache, daß (1) JavaScript in mehreren Versionen existiert, (2) verschiedene Browserhersteller den Zugriff auf die Seitenelemente unterschiedlich implementiert haben und (3) Debugging nur eingeschränkt möglich ist. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #24 JavaScript Mit JavaScript kann man ● Funktionen im Webbrowser ausführen (auf dem Client) ● Auf Elemente einer Webseite zugreifen bzw. diese verändern ● Neue Browserfenster und Hinweisfenster öffnen Mit JavaScript kann man nicht ● Funktionen im Webserver (auf dem Server) ausführen ● Daten auf dem Webserver speichern ● Auf die Festplatte des Rechners zugreifen ● Andere Applikationen starten Grund für diese Einschränkungen ist, dass (fremder und potentiell bösartiger) JavaScript Code erst auf dem lokalen Rechner ausgeführt wird und dieser geschützt werden soll. Zur Ausführung von Funktionen und Datenspeicherung auf einem Server sind serverseitige Technologien wie CGI, PHP, ASP, JSP notwendig. Hosting Angebote die diese Funktionalität beinhalten sind i.d.R. teuerer als reines HTML Hosting da mehr Rechenleistung und Speicherplatz verbraucht wird. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #25 JavaScript Die Einbettung von JavaScript in eine Webseite kann wie bei Stylesheets entweder direkt oder indirekt erfolgen. Letzteres ist empfehlenswert zur Auslagerung oder Wiederverwendung von umfangreichen Funktionen. Direkte Einbettung (an beliebiger Stelle) <script type="text/javascript"> <!-Scriptbefehle // --> </script> HTML Kommentar, nötig damit in alten Browsern ohne Script-Unterstützung der Programmcode nicht als Text auf der Webseite erscheint. Indirekte Einbettung (im Kopfteil der HTML Seite) <script type="text/javascript" src="myscript.js"></script> Außerdem können Javascript Anweisungen direkt in Links oder als sog. EventHandler (Ereignisbehandler) verwendet werden <a href="javascript:myTriggerFunction()"></a> <body onLoad="myLoadFunction()"> <div onClick="myClickFunction()"> © Andreas Rau, 15.10.10 Weitere Event-Handler sind in SelfHTML unter Javascript/DOM..Sprachelement..EventHandler aufgelistet und mit Beispiel erklärt. D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #26 JavaScript Die Interpretation von Webseiten bzw. des enthaltenen Javascript-Codes erfolgt von oben nach unten (wie das folgende Beispiel zeigt). <html> <body> Schritt 1 <script type="text/javascript"> alert( "Schritt 1"); </script> Schritt 2 <script type="text/javascript"> alert( "Schritt 2"); </script> Schritt 3 <script type="text/javascript"> alert( "Schritt 3"); </script> </body> </html> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #27 JavaScript Variablen in JavaScript sind untypisiert, d.h. arbeiten mit verschiedenen Arten von Werten var value; value = 1; // eine Zahl value = "Eins"; // eine Buchstabenfolge Ergebnis und Parameter von Funktionen in JavaScript sind ebenfalls nicht typisiert function addieren(a, b) { // Platzhalter für zwei Werte return a+b; // Berechnung mit Platzhaltern & Rückgabe } Die meisten Operatoren in JavaScript verhalten sich je nach Wert "wie man es erwartet" value = 2 + 2; // ergibt 4 value = "Eins" + "Zwei" + "Drei"; // ergibt "EinsZweiDrei" Mit Hilfe der oben definierten Funktion läßt sich das übrigends auch so schreiben value = addiere(2, 2); // Berechnung mit a=2, b=2 value = addiere("Eins", "Zwei"); // Berechnung mit a="Eins", b="Zwei" JavaScript Code kann theoretisch überall in einer Webseite stehen, üblich ist jedoch die Definition im Header. Anweisungen, die außerhalb von Funktionen stehen, werden sofort beim Überlesen ausgeführt, können aber nur auf bereits gelesene Teile zugreifen. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #28 Beispiele Eine einfache HTML Datei mit einem echten Klassiker ;-) <html> <body> <script type="text/javascript"> document.writeln( "Hello, World!"); </script> </body> </html> Die Anweisung document.writeln( "Hello, World!"); schreibt das Ergebnis direkt nach dem </script>-Tag in die Seite. Es wird auch genauso angezeigt (wenn Javascript an ist, sonst sieht man nix). Betrachtet man jedoch den Quellcode im Browser, sieht man wieder nur das Skript (it's magic!). Für Firefox gibt es ein Plugin (savegenpage) mit dem man sich den generierten Quelltext anschauen kann... © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #29 Beispiele Die folgende Datei betreibt, äh, „Kundenbindung“ <html> <body> Sie sehen gerade <script type="text/javascript"> document.writeln( document.location); </script> <a href="javascript:springe( 'http://www.spiegel.de')">Springen</a> <script type="text/javascript"> function springe( url) { alert( "Jetzt geht's zu " + url); // Standard: Hinweisfenster if ( confirm( "Wollen Sie wirklich hier weg?")) { // Standard: Rückfrage document.location = url; } else { alert( "Eine gute Entscheidung!"); } } </script> </body> </html> Man kann also offenbar auf die aktuelle Datei/Seite lesend und schreibend zugreifen, und den einen oder anderen Standard-Dialog gibt es auch. Wie praktisch! © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #30 Beispiele Die folgende Datei enthält eine Berechnung (Notepad + Browser = Taschenrechner!) <html> <body> <script type="text/javascript"> var a = 10; var b = 3; document.writeln( a + b); // neben + gibt es gibt auch noch - * / </script> </body> </html> Versuchen sie mal die anderen Operatoren im Kommentar (wofür stehen denn die wohl?). Langweilig, das kennen wir ja schon aus der Schulmathematik! Aber wie sieht's denn mit dem Operator % aus? Was macht der? Einfach mal probieren... © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #31 Beispiele Die folgende Datei verknüpft einige Zeichen(ketten) <html> <body> <script type="text/javascript"> var a = "1"; // 1 var b = '2'; // 2 var c = 'Drei'; document.writeln( a+b+c); // (a+b)+c </script> </body> </html> Versuchen Sie doch mal, bei den Zahlen die Anführungszeichen zu entfernen oder die „Berechnung“ (das Plus macht ja offensichtlich was anderes...) unterschiedlich zu klammern. Wie deuten Sie die Ergebnisse? Ist das nicht alles sehr wundersam? Oder wunderbar ;-) ? © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #32 Beispiele Die folgende Datei betreibt etwas Logik <html> <body> <script type="text/javascript"> var a = 5; var b = 10; document.writeln( a<b); // neben < gibt es auch noch > == != >= <= </script> </body> </html> Die Operanden „<“ und „>“ sind ja klar, und „<=“ bzw. „>=“ wohl den Unzulänglichkeiten der Anzeige zuzuschreiben. Aber „==“ ist ja wohl doppelt gemoppelt – oder gibt's da einen Grund? Der Operator „!=“ ist dann was? Da kommt man um ein Experiment nicht rum... © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #33 JavaScript Es ist möglich, mit JavaScript auf die (sichtbaren) Elemente einer HTML Seite zuzugreifen und diese zu manipulieren. Die Seite wird dabei als Sammlung von Elementen betrachtet, die gemäß einer vorgegebenen (Baum)Struktur angeordnet sind. Diese Baumstruktur nennt man DOM (Document Object Model). Solche einfachen Baumstrukturen sind sehr praktisch und finden sich an vielen Stellen in der Informatik. Sie werden uns unter anderem bei der Vererbung von Eigenschaften zwischen Klassen und beim Aufbau von grafischen Benutzeroberflächen wieder begegnen. Im ersten Fall spricht man von einer logisch-inhaltlichen Vererbungsbeziehung (ist-ein), im zweiten Fall von einer physikalischen Kompositionsbeziehung (besteht aus). Beispiel: Ein Auto ist-ein Fahrzeug Eine Webseite besteht aus Head und Body, Body aus Überschriften und Absätzen, ... Neben der Navigation durch die Baumstruktur ist auch ein direkter Zugriff auf Elemente über deren Namen bzw. ID möglich. Dazu gibt es in Javascript zwei Funktionen var element = document.getElementById( <ID>); // eindeutig var elements = document.getElementsByName( <Name>); // mehrdeutig © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #34 Seiten als Baumstruktur (Beispiel) <html> <head> <title>Beispielseite</title> </head> <body> <h1>Titel</h1> <p>bla bla bla bla bla <ul> <li>Punkt 1 <li>Punkt 2 <li>Punkt 3 </ul> </body> </html> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #35 Seiten als Baumstruktur (Beispiel) html body head title h1 p „Beispielseite“ „Titel“ „Bla Bla ...“ © Andreas Rau, 15.10.10 ul li li li „Punkt 1“ „Punkt 2“ „Punkt 3“ D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #36 Beispiele In der folgenden Datei treibt man es ziemlich bunt ;-) <html> <style type="text/css"> div#text { background-color: blue; } </style> <body> <div id="text"> Das ist ein Beispieltext </div> <a href="javascript:rot()">rot</a> <script type="text/javascript"> function rot() { var element = document.getElementById( "text"); element.style.backgroundColor = "red"; } </script> </body> </html> Die Variable element repräsentiert also einen Teil der Seite der (Stil-)Eigenschaften besitzt, die man per Zuweisung manipulieren kann – mit sofortiger Wirkung! © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #37 Beispiele In der folgenden Datei macht man große Sprünge... <html> <style type="text/css"> div#text { position: absolute; bottom: 0px; } </style> <body> <div id="text"> Das ist ein Beispieltext </div> <a href="javascript:anheben()">anheben</a> <script type="text/javascript"> function anheben() { var element = document.getElementById( "text"); element.style.bottom = "100px"; } </script> </body> </html> Naja, wenn es mit einer Eigenschaft geht, dann wohl auch mit den anderen... © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #38 Beispiele In der folgenden Datei gibt es eine grosse (auf)klappe <html> <body> <script type="text/javascript"> function aufklappen( id) { var element = document.getElementById( id); element.style.display = "block"; } </script> <a href="javascript:aufklappen( 'haupt')">Haupt</a> <div id="haupt" style="display: none"> <a href="">Unter 1</a> <a href="">Unter 2</a> <a href="">Unter 3</a> </div> </body> </html> Dynamische Menüs sind also gar nicht so schwierig... Frage: Wie erreicht man, dass das Element bei erneutem Anklicken wieder zuklappt? © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #39 Beispiele Inhalte von HTML Formularen werden i.d.R. auf dem Server ausgewertet, man kann aber (zunächst) auch mit Javascript arbeiten (z.B. um Eingaben zu prüfen). <html> <body> <form action="javascript:act()"> <input id="feld1" name="vorname" value=""></input> <input type="submit" value="weiter"></input> <div id="text"></div> <script type="text/javascript"> function act() { var feld = document.getElementById( "feld1"); var name = feld.value; var text = document.getElementById( "text"); text.innerHTML = "Diese Seite ist " + name + " gewidmet"; } </script> </form> </body> </html> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #40 Beispiele Zum Abschluss noch ein praktisches Beispiel zum interaktiven Rechnen. <html> <body> <form action="javascript:act()"> <input id="feld1" name="wert1" value=""></input> <input id="feld2" name="wert2" value=""></input> <input type="submit" value="weiter"></input> <div id="text"></div> <script type="text/javascript"> function act() { var feld1 = document.getElementById( "feld1"); var feld2 = document.getElementById( "feld2"); var wert1 = feld1.value; var wert2 = feld2.value; var ergebnis = parseInt(wert1)+parseInt(wert2); // parseInt=Text deuten var text = document.getElementById( "text"); text.innerHTML = "Das Ergbnis ist " + ergebnis; } </script> </form> </body> </html> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #41 Einschub: DocTypes Betrachtet man den Quellcode von HTML-Seiten aus einem Editor oder im Web, sieht man vor dem Tag <html> oftmals eine kryptische Zeile wie z.B. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> Dabei handelt es sich um eine sog. Dokumenttyp-Deklaration. Diese dient dazu, dem Browser anzuzeigen, nach welchen Regeln ein Dokument interpretiert werden soll. Die Endung ".html" bzw. das Tag <html> reichen dafür nicht aus, da im Laufe der Weiterentwicklung von HTML verschiedene „Geschmacksrichtungen“ definiert wurden die durch sog. Dokumenttyp-Definitionen (DTD) beschrieben werden. Moderne Browser enthalten einen sog. DOCTYPE-Switch, um zwischen diese jeweils richtig anzuzeigen. In der Datei "loose.dtd" wird also definiert, welche Elemente ein Dokument dieses Typs enthalten darf, welche Elemente verschachtelt werden dürfen, welche Attribute zu einem Element gehören und ob deren Angabe Pflicht ist oder freiwillig usw. Dieser Aufwand erscheint zunächst übertrieben ist aber notwendig, um den Aufbau der Sprache eindeutig festzulegen, und bildet die Grundlage für die allgemeine Verwendbarkeit der dadurch gebildeten Dokumente. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #42 SVG Scalable Vector Graphics © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #43 Skalierbare Vektorgrafiken (SVG) Vektorgrafiken sind nicht aus Pixeln sondern aus geometrischen Elementen zusammengesetzt. Daher werden Sie beim Vergrößern auch nicht pixelig. Es gibt sowohl für Pixelgrafiken als auch für Vektorgrafiken verschiedene Formate und zug. Programme (Open-Source: GIMP und Inkscape, Kommerziell: Photoshop und Corel Draw). Die Beschreibung einer SVG geschieht mit Hilfe von Zeichenbefehlen die, richtig, in spitzen Klammern geschrieben werden – Spitze, was man damit alles machen kann ;-) Beim Lesen der Datei werden die Befehle der Reihe nach vom Browser(pluggin) abgearbeitet. Daher können Elemente, die später gezeichnet werden vorher gezeichnete Elemente verdecken (Reihenfolge ergibt z-Koordinate). Größere Bilder werden aus diesen primitiven Elementen zusammengesetzt. Da sich die Primitive leicht skalieren lassen, gilt dasselbe auch für das resultierende Gesamtbild. SVG war gedacht, um im Web Grafiken leicht und in hoher Qualität anzeigen und ggf. auch animieren(!) zu können. Leider hält sich die Unterstützung durch aktuelle Browser immer noch sehr in Grenzen (Firefox ja, IE nur mit Plugin). Hintergrund ist die hohe Verbreitung konkurrierender Technologien wie JavaFX, Silverlight und v.a. Adobe Flash. © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #44 Skalierbare Vektorgrafiken (SVG) Das Koordinatensystem für x und y steht auf dem Kopf: Der Ursprung ist oben links statt unten links wie in Mathe. Vermutlich wegen dem Zeilenstrahl in der guten alten Bildröhre. X Y Nachfolgend noch ein Beispiel, Details in der Wikipedia unter "SVG" bzw. auf selfsvg.info © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #45 Skalierbare Vektorgrafiken (SVG) Beispieldatei "beispiel.svg" <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" version="1.1" baseProfile="full" width="300%" height="300%"> <!-- Kreise mit Mittelpunkt und Radius --> <!-- Text mit Bezugspunkt unten links --> <!-- Linie mit Start- und Endpunkt --> <text x="30" y="50" style="font-size: 24pt">Spitze Klammern finde ich...</text> <circle cx="50" cy="100" r="20" style="stroke: black; stroke-width: 3; fill: red"/> <text x="100" y="110" style="font-size: 24pt; font-weight: bold; stroke: black; fill: red">doof</text> <circle cx="50" cy="150" r="20" style="stroke: black; stroke-width: 3; fill: yellow"/> <text x="100" y="160" style="font-size: 24pt; font-weight: bold; stroke: black; fill: yellow">naja</text> <circle cx="50" cy="200" r="20" style="stroke: black; stroke-width: 3; fill: green"/> <text x="100" y="210" style="font-size: 24pt; font-weight: bold; stroke: black; fill: green">cool</text> <line x1="30" y1="180" x2="70" y2="220" style="stroke: black"/> <line x1="30" y1="220" x2="70" y2="180" style="stroke: black"/> <rect x="250" y="80" width="90" height="90" style="fill: red; opacity: 0.5"/> <rect x="300" y="130" width="90" height="90" style="fill: blue; opacity: 0.5"/> </svg> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #46 Skalierbare Vektorgrafiken (SVG) Angezeigte Grafik (Maßstab 1:1 aus dem Firefox) x-Achse y-Achse PS: Wenn Sie anderer Meinung sind, können Sie ja die Beispieldatei entsprechend abändern... © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #47 Skalierbare Vektorgrafiken (SVG) Eine (etwas schräge) Anwendung von SVG als Funktionsplotter =D$2-RUNDEN(B5*D$1;0) 50 =RUNDEN(A5*C$1;0)+C$2 0 50 Multiplikator 300 Offset =SIN(A5) X Y=F(X) Xscaled Yscaled 0 0,25 0,5 0,75 1 1,25 1,5 1,75 2 2,25 2,5 2,75 3 3,25 3,5 3,75 4 4,25 4,5 4,75 5 5,25 5,5 5,75 6 6,25 0 0,25 0,48 0,68 0,84 0,95 1 0,98 0,91 0,78 0,6 0,38 0,14 -0,11 -0,35 -0,57 -0,76 -0,89 -0,98 -1 -0,96 -0,86 -0,71 -0,51 -0,28 -0,03 0 13 25 38 50 63 75 88 100 113 125 138 150 163 175 188 200 213 225 238 250 263 275 288 300 313 300 288 276 266 258 253 250 251 255 261 270 281 293 305 318 329 338 345 349 350 348 343 335 325 314 302 © Andreas Rau, 15.10.10 ="<line x1="""&C5&""" y1="""&D5&""" x2="""&C6&""" y2="""&D6&""" style=""stroke: black""/>" SVG Kommando <line x1="0" y1="300" x2="13" y2="288" style="stroke: black"/> <line x1="13" y1="288" x2="25" y2="276" style="stroke: black"/> <line x1="25" y1="276" x2="38" y2="266" style="stroke: black"/> <line x1="38" y1="266" x2="50" y2="258" style="stroke: black"/> <line x1="50" y1="258" x2="63" y2="253" style="stroke: black"/> <line x1="63" y1="253" x2="75" y2="250" style="stroke: black"/> <line x1="75" y1="250" x2="88" y2="251" style="stroke: black"/> <line x1="88" y1="251" x2="100" y2="255" style="stroke: black"/> <line x1="100" y1="255" x2="113" y2="261" style="stroke: black"/> <line x1="113" y1="261" x2="125" y2="270" style="stroke: black"/> <line x1="125" y1="270" x2="138" y2="281" style="stroke: black"/> <line x1="138" y1="281" x2="150" y2="293" style="stroke: black"/> <line x1="150" y1="293" x2="163" y2="305" style="stroke: black"/> <line x1="163" y1="305" x2="175" y2="318" style="stroke: black"/> <line x1="175" y1="318" x2="188" y2="329" style="stroke: black"/> <line x1="188" y1="329" x2="200" y2="338" style="stroke: black"/> <line x1="200" y1="338" x2="213" y2="345" style="stroke: black"/> <line x1="213" y1="345" x2="225" y2="349" style="stroke: black"/> <line x1="225" y1="349" x2="238" y2="350" style="stroke: black"/> <line x1="238" y1="350" x2="250" y2="348" style="stroke: black"/> <line x1="250" y1="348" x2="263" y2="343" style="stroke: black"/> <line x1="263" y1="343" x2="275" y2="335" style="stroke: black"/> <line x1="275" y1="335" x2="288" y2="325" style="stroke: black"/> <line x1="288" y1="325" x2="300" y2="314" style="stroke: black"/> <line x1="300" y1="314" x2="313" y2="302" style="stroke: black"/> D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #48 Skalierbare Vektorgrafiken (SVG) <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" version="1.1" baseProfile="full" width="300%" height="300%"> <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line <line x1="0" y1="300" x2="13" y2="288" style="stroke: black"/> x1="13" y1="288" x2="25" y2="276" style="stroke: black"/> x1="25" y1="276" x2="38" y2="266" style="stroke: black"/> x1="38" y1="266" x2="50" y2="258" style="stroke: black"/> x1="50" y1="258" x2="63" y2="253" style="stroke: black"/> x1="63" y1="253" x2="75" y2="250" style="stroke: black"/> x1="75" y1="250" x2="88" y2="251" style="stroke: black"/> x1="88" y1="251" x2="100" y2="255" style="stroke: black"/> x1="100" y1="255" x2="113" y2="261" style="stroke: black"/> x1="113" y1="261" x2="125" y2="270" style="stroke: black"/> x1="125" y1="270" x2="138" y2="281" style="stroke: black"/> x1="138" y1="281" x2="150" y2="293" style="stroke: black"/> x1="150" y1="293" x2="163" y2="305" style="stroke: black"/> x1="163" y1="305" x2="175" y2="318" style="stroke: black"/> x1="175" y1="318" x2="188" y2="329" style="stroke: black"/> x1="188" y1="329" x2="200" y2="338" style="stroke: black"/> x1="200" y1="338" x2="213" y2="345" style="stroke: black"/> x1="213" y1="345" x2="225" y2="349" style="stroke: black"/> x1="225" y1="349" x2="238" y2="350" style="stroke: black"/> x1="238" y1="350" x2="250" y2="348" style="stroke: black"/> x1="250" y1="348" x2="263" y2="343" style="stroke: black"/> x1="263" y1="343" x2="275" y2="335" style="stroke: black"/> x1="275" y1="335" x2="288" y2="325" style="stroke: black"/> x1="288" y1="325" x2="300" y2="314" style="stroke: black"/> x1="300" y1="314" x2="313" y2="302" style="stroke: black"/> </svg> © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #49 Ausblick Wo das herkommt ist noch mehr © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #50 Ausblick Die bis hier angesprochenen Technologien beinhalten eine Vielfalt von Konzepten, die uns in der einen oder anderen Form später wieder begegnen werden. Sie bieten darüber hinaus ein weites Feld von Möglichkeiten für weitere Experimente – zumindest bis zu dem Zeitpunkt, bis die Java Programmierung in Fahrt kommt. Obwohl nicht im engeren Sinne prüfungsrelevant, ist der bisher behandelte Stoff als Einladung zum Experimentieren und spielerischen Lernen zu verstehen. Arbeiten Sie mit den vorgestellten Elementen, entwickeln Sie weitere Ideen und nutzen Sie die Ressourcen im Internet, z.B. bei http://www.w3schools.com/, um mehr herauszufinden. Geben Sie sich nicht schon zufrieden, wenn es läuft sondern erst, wenn Sie verstanden haben warum! Die Zeit, die Sie am Anfang investieren um die Grundkonzepte zu verstehen zahlt sich langfristig doppelt aus (Think: intellektueller Zinseszins-Effekt!) © Andreas Rau, 15.10.10 D:\home\ar\fhte\vorlesungen\informatik1\folien\informatik1-theorie-webpages.odp #51