Skript: EWA - Fachbereich Informatik

Transcription

Skript: EWA - Fachbereich Informatik
Entwicklung webbasierter Anwendungen
WS 2007/08
c Dr.
Ute Blechschmidt-Trapp
Darmstadt, 4. Oktober 2007
Version 2.0
Inhaltsverzeichnis
1 Installationshinweise
6
2 Einleitung
7
3 Webengineering
3.1
10
Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
10
3.1.1
Besonderheiten von Webanwendungen
. . . . . . . . . . . . . . . . . . .
10
3.1.2
Kategorien von Webanwendungen . . . . . . . . . . . . . . . . . . . . . .
13
3.2
Planung
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
14
3.3
Internationalisierung und Lokalisierung . . . . . . . . . . . . . . . . . . . . . . .
21
3.3.1
Internationalisierung
3.3.2
Lokalisierung
3.4
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
Usability - Bedienbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.4.1
Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.4.2
Ärgerliche Eigenschaften einer Seite . . . . . . . . . . . . . . . . . . . . .
24
3.5
Navigation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
25
3.6
Barrierefreiheit
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3.6.1
Zielgruppe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
3.6.2
Analyse guter Seiten
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
3.6.3
Tests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
3.7
4 Grundlagen
4.1
4.2
4.3
34
Historie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Protokolle
34
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.2.1
TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
4.2.2
HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
36
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
38
5 HTML und Co
39
5.1
SGML
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.2
HTML Hyper Text Markup Language . . . . . . . . . . . . . . . . . . . . . . . .
39
5.2.1
Documententyp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
5.2.2
XHTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
5.3
5.4
Maÿnahmen für Barrierefreiheit
. . . . . . . . . . . . . . . . . . . . . . . . . . .
45
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
46
5.3.1
Blinde Menschen
5.3.2
Flash, JavaScript und Ajax
. . . . . . . . . . . . . . . . . . . . . . . . .
47
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
47
6 CSS
48
6.1
Versionen
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
6.2
Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
2
Inhaltsverzeichnis
6.2.1
Einbinden eines Styles
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
6.2.2
Selektoren und Grundsyntax . . . . . . . . . . . . . . . . . . . . . . . . .
50
6.2.3
Referenz und Validierung . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
6.2.4
Layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
6.3
Vorgehensweise zur Umsetzung eines Layouts . . . . . . . . . . . . . . . . . . . .
53
6.4
CSS und Barrierefreiheit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
54
6.5
Tipps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
55
6.5.1
Einheiten
55
6.5.2
Problem: Gleichlange Spalten
. . . . . . . . . . . . . . . . . . . . . . . .
55
6.5.3
Hintergrund . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
6.6
Struktur einer CSS Datei . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
6.7
Druckansicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
6.8
Testen
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
6.9
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
58
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 PHP
7.1
7.2
59
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
7.1.1
Allgemein
Konguration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
7.1.2
Einbinden von PHP Befehlen
. . . . . . . . . . . . . . . . . . . . . . . .
59
7.1.3
Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
7.1.4
Coding Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
7.2.1
PHP - die Sprache
Sprachbesonderheiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
61
7.2.2
Variablen und Konstanten
. . . . . . . . . . . . . . . . . . . . . . . . . .
61
7.2.3
Einbinden (include) von Dateien . . . . . . . . . . . . . . . . . . . . . . .
62
7.2.4
Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
7.2.5
Stringmwandlung in HTML-Code . . . . . . . . . . . . . . . . . . . . . .
64
7.2.6
Anzeigen der Systeminformationen
. . . . . . . . . . . . . . . . . . . . .
64
7.2.7
Dateiverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.2.8
File Upload
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.2.9
Zufall
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.2.10 Kontrollstrukturen und Schleifen
. . . . . . . . . . . . . . . . . . . . . .
7.2.11 Abbrechen und Fortsetzen von Anweisungssequenzen
66
. . . . . . . . . . . . . . . . . . . . .
66
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
7.2.12 Ausnahmen und Fehlerbehandlung
7.2.13 Klassen
7.2.14 Iteratoren
7.3
3
65
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.2.15 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
Formularverarbeitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.3.1
Get versus Post . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.3.2
Globale Arrays
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.3.3
Angrie
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
7.3.4
Validierung
7.3.5
Sicherheit
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
72
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
7.4
Datenbanken
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
7.5
Automatisches Testen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
7.6
URL Manipulation
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
7.7
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
78
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
Inhaltsverzeichnis
8 JavaScript - ECMAScript
8.1
8.2
Einführung
80
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.1.1
Besonderheiten
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
8.1.2
Befehle, Schleifen, Kommentare, . . . . . . . . . . . . . . . . . . . . . . . .
81
8.1.3
Ein- und Ausgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
8.1.4
try, catch und Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . .
82
8.1.5
Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
8.1.6
Arrays . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
8.1.7
OO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
8.1.8
Sicherheit
84
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
8.2.1
Validierung von Formularen
Ein erster Versuch
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
8.2.2
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
8.2.3
Ein zweiter Versuch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
8.3
Ajax: Asynchrones JavaScript und XML
. . . . . . . . . . . . . . . . . . . . . .
87
8.4
Tipps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
8.5
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
9 Cookies und Sessions
9.1
Cookies
89
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
9.1.1
Cookies serverseitig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
9.1.2
Cookies clientseitig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
9.2
Alternativen zu Cookies
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
9.3
Sessions
9.4
Sicherheit
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
9.5
Links zum Thema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
92
10 Authentizierung
93
10.1 HTTP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
10.2 LDAP
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
10.3 Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
10.4 Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
A Anhang
94
A.1
HTML-Attribute
A.2
Formularereignisse
A.3
Reguläre Ausdrücke . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Listings
4
80
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
Inhaltsverzeichnis
Zusammenfassung
Die Vorlesung behandelt die Grundlagen von Webprojekten mit Fokus auf PHP, einer weit
verbreiteten, serverseitigen Entwicklungssprache. Das vorliegende Skript ist ein Arbeitsskript.
Sie nden Fragen und Aufgaben im Skript, mit denen Sie Ihr Wissen testen können und Ihre
Kenntnisse über die reinen Vorlesungsinhalte hinaus erweitern können. Am Ende eines jeden
Kapitels nden Sie Links zum jeweiligen Thema.
Anstelle einer geschlechtsneutralen Sprache werden männliche und weibliche Formen im
Wechsel verwendet, selbstverständlich sind damit immer beide Geschlechter gemeint.
Falls Sie Anregungen oder Korrekturvorschläge haben, mailen Sie mir diese bitte zu:
[email protected].
Lösungsvorschläge zu den Aufgaben können Sie mir ebenfalls mailen, ein
Feedback garantiere ich Ihnen.
Viel Spaÿ,
Ute Blechschmidt-Trapp
5
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
1 Installationshinweise
Besorgen Sie sich folgende Software, sofern Sie nicht nur im Multimedia-Labor arbeiten möchten:
•
•
Webserver xampp
Entwicklungsumgebung elipse: Folgen Sie den Download- und Installationsanweisungen
unter Getting Started with Eclipse PHP Development Tools (PDT) .
•
Automatische Dokumentation des Quellcodes: PHPDoc. Installationsanweisungen können
Sie unter Using PHPEclipse : Installation : Installing the phpDocumentor nachschlagen.
•
•
Gutes Modellierungstool für Datenbanken: DB-Designer.
UML-Modellierungswerkzeug mit automatischer Erzeugung von PHP-Code: ArgoUML.
Konguration des Webservers: Synchronisieren Sie das Dokumentenverzeichnis des Webservers mit der Ablage Ihrer Projektdateien. Dazu müssen Sie die Datei http.conf unter xampp/apache/conf wie folgt abändern:
DocumentRoot "D:\EWA"
und etwas weiter unten
<Directory "D:\VideoOne">
mit
AllowOverride All
Erstellen Sie dann eine Datei .htaccess (Windows lässt Sie diese nicht einfach erstellen, sie
müssen entweder eine aus einem anderen Verzeichnis kopieren oder über die Dos-Shell eine
anlegen) und schreiben Sie in diese beispielsweise (vergessen Sie nicht .; zu Beginn):
php_value include_path ".;D:/EWA/classes"
6
2 Einleitung
Abbildung 2.1: Webanwendung
In dieser Veranstaltung geht es um Webanwendungen. Bei Webanwendungen gibt es immer
einen Client und einen Server und die beiden Programme unterhalten sich über ein TCP/IPbasiertes Protokoll, meist HTTP. Anhand einer einfachen Suchabfrage möchte ich die wesentlichen Begrie und Technologien dieser Veranstaltung, wie sie in Abbildung 2.1 gruppiert sind,
einführen.
Wenn Sie für Ihr Studium Material suchen, werden Sie eine Suchmaschine nutzen. Sie starten
also Ihren Browser und geben in die Adressleiste beispielsweise www.google.de ein. Der Browser
baut über das Protokoll HTTP eine Verbindung zum Computer mit dem Namen www.google.de
auf. Auf diesem Computer läuft ein Programm, ein Webserver (z.B. Apache oder IIS), der diese
Anfrage entgegennimmt und verarbeitet. Der Webserver führt hierzu ein anderes Skript oder ein
anderes Programm, das beispielsweise in PHP geschrieben ist, aus. Dieses Programm führt die
eigentliche Suche durch und erzeugt HTML-Code. HTML ist eine Auszeichnungssprache, die
Daten mit den sie beschreibenden Eigenschaften (Auszeichnung) enthält. Der Browser erhält
diesen HTML-Code als ASCII Code und zeigt die Daten an. Wie die Daten dargestellt werden
(groÿ, klein, schwarz, weiÿ, neben- oder übereinander), deniert ein Verweis auf eine CSS-Datei.
Dieser Verweis ist in dem übermittelten HTML-Code enthalten und wird vom Browser ebenfalls
vom Webserver angefordert.
Einige Webanwendungen verwenden auch Programme, die innerhalb des Browsers ausgeführt
werden. Die übermittelte HTML-Seite kann z.B. einen Verweis auf eine JavaScript-Datei enthalten. Diese wird vom Browser nachgeladen und der Programmcode wird auf dem Client bei
Eintreten eines Ereignisses, wie z.B. das Laden der Seite oder das Klicken einen Knopfes ausgeführt. Auf diese Weise lässt sich ein einfacher Taschenrechner umsetzen. Die Funktionen werden
in JavaScript codiert und der Browser führt den Code aus. JavaScript kann dazu verwendet
werden, Eingabefehler direkt zu melden, ohne dass eine Verbindung zum Webserver hergestellt
werden muss. Mit JavaScript lässt sich auch die Darstellung von HTML-Code verändern, Daten können versteckt werden. Es ist auch möglich, neue Daten in den HTML-Code einzufügen.
Wesentlich ist, JavaScript wird vom Browser ausgeführt.
7
2 Einleitung
Abbildung 2.2: Prinzipieller Ablauf einer Ajax-Anwendung im Vergleich zu einer klassischen
Webanwendung
Neuere Browser stellen JavaScript ein Objekt zur Verfügung, das sogar die Kommunikation zwischen JavaScript und dem Webserver ermöglicht, diese Anwendungen laufen unter dem
Stichwort Ajax oder Web 2.0. Auf diese Weise können neue Anfragen an den Webserver gestellt
werden, der Daten zurückliefert, die von JavaScript an entsprechender Stelle im HTML-Code
eingefügt und vom Browser angezeigt werden. Es ist also nicht notwendig, eine ganze Seite
anzufordern, sondern es kann beispielsweise der Wert einer einzelnen Zelle einer Tabellenkalkulation angefordert werden. Auf diese Weise verwischt der Unterschied zwischen eher behäbigen
Web- und direkt agierenden Desktopanwendungen. Abbildung 2.2 zeigt den Ablauf einer AjaxAnwendung im Vergleich zu einer klassischen Webanwendung.
Die bisher eingeführten Begrie sind das Basisvokabular von Webanwendungen:
XML
eXtensible Markup Language, standardisierte erweiterbare Auszeichnungssprache zur
strukturierten Beschreibung von Informationen in Dokumenten.
HTML
HyperText Markup Language, hierarchische klar festgelegte und nicht erweiterbare
Auszeichnungssprache für Hypertexte.
XHTML
eXtensible HyperText Markup Language, verbindet die Vorteile von HTML mit
denen von XML (siehe hierzu auch ).
CSS
Cascading Style Sheets, deniert das Aussehen, die Formatierung einer Website.
HTTP
HyperText Transfer Protocol.
SOAP
Simple Object Access Protocol , Basis für Webservices.
8
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
2 Einleitung
JavaScript
Scriptsprache, die im Webbrowser ausgeführt wird - serverseitiges JavaScript stirbt
aus. Zusätzliche Scriptsprachen für den Internet Explorer: VBScript, JScript.
Flash, Quicktime, Silverlight
Webbrowser
Verbreitete Plugins, die Animationen interpretieren/ausführen.
Meist Apache oder IIS, Server, der auf Port 80 lauscht und HTTP-Anfragen
beantwortet
Client
Meist ein Webbrowser, der HTML für Menschen lesbar anzeigt, diese Daten anhand
CSS Anweisungen formatiert, Plugins, Applets und JavaScript ausführt.
PHP
mächtige Skriptsprache, die auf dem Server ausgeführt wird und dynamische Webseiten
erstellt. Alternativen sind z.B. Asp.Net, Java Server Pages, Java, Ruby oder Perl.
Frameworks
Für jede server- und clientseitige Programmiersprache gibt es zahlreiche Frame-
works, die die Entwicklung vereinfachen, wie z. B.
Java-Umfeld Javer Server Faces, Struts, Spring oder Grails.
PHP Zend, Symfony oder Cake
Ruby Ruby on Rails
JavaScript jQuery, Prototype oder Dojo.
9
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3 Webengineering
3.1 Motivation
Beispiel 3.1
Aus einer Web-Filmdatenbank sollen Benutzer Informationen über Filme und
die daran beteiligten Personen abrufen können (siehe z.B. www.imdb.org). Dabei enthalten Filmeinträge unter anderem Details zum Filmgenre und der Besetzung, Zitate und Verweise auf
Trailer und den Soundtrack. An Filmen beteiligte Personen sind die Regisseurin, die Produzentin, die Drehbuchautorin, die Komponistin und die Schauspieler. Die Filmdatenbankbenutzerinnen sollen Informationen auf Auührungsorte und Zeiten abrufen können. Registrierte
Benutzer (identiziert durch eine Email-Adresse und ein Passwort) sollen Kommentare zu Filmen eintragen können, Filme und andere Kommentare bewerten, Filmlisten zusammenstellen
und online Karten für Filmvorführungen bestellen. Registrierten Benutzern werden personalisierte Filmempfehlungen und -nachrichten angeboten. Ausführliche Dokumente nden Sie unter
Übung Webengineering LTU München
Wenn Sie an einem Webprojekt mitarbeiten, wird dies üblicherweise keine einfache Homepagebastelei sein, sondern Sie werden eine umfangreiche anspruchsvolle Anwendung entwickeln
oder fehlende Elemente in ein vorhandenes System, wie z.B. ein Content-Management System
einbauen. In jedem Falle, steht zu Beginn eines jeden Webprojekts wie zu Beginn eines jeden
Softwareprojekts eine Spezikation und Planung des gesamten Projekts inklusive Einführung
und Wartung. Es würde den Rahmen dieser Veranstaltung sprengen, alle Einzelheiten des Webengineerings zu diskutieren, aber aufbauend auf Ihren Kenntnissen des Softwareengineerings
möchte ich hier auf Besonderheiten von webbasierten Systemen eingehen, Unterschiede zwischen
einzelnen Systemen betrachten und einige Entwicklungsmethoden vorstellen. Welche Methode
Sie bei welchem Problem anwenden, wird von Ihren Vorlieben, der Umgebung, in der Sie entwickeln (Team, bisherigen Vorgehensweisen, . . . ) und natürlich von der Aufgabenstellung selbst
abhängen.
3.1.1 Besonderheiten von Webanwendungen
Vielleicht sind Sie versucht, folgenden Aussagen zuzustimmen
•
Für eine Webanwendung erstelle ich nur einige HTML-Seiten, am besten mit Frontpage
oder Dreamweaver, fertig.
•
So eine Webanwendung habe ich doch ruck zuck zusammengestrickt, etwas HTML und
das war's, wozu brauche ich eine umfangreiche Planung?
•
Im Web geht es nur um Inhalt und Design, echte Anwendungen gibt es so nicht.
Wenn dem so ist, wie kann es dann zu solchen Pannen kommen:
FAZ 25.02.2005:
Virtuelle Stellenbörse der Bundesagentur für Arbeit nutzlos und teuer -
Unternehmen weichen auf andere Vermittlungsstellen aus.
heise online 13.12.2005:
Computersystem der Börse Tokio erneut im Zwielicht (Ansstelle
einer Aktie für 610.000 Yen (4200 Euro) bot er 610.000 Aktien für jeweils 1 Yen an.)
10
3.1 Motivation
heise online 02.06.2006:
Die Bundesregierung schätzt den Schaden, der durch die fehlerhaft
von der Firma T-Systems programmierte (webbasierten) Software A2LL bei der Bearbeitung
des Arbeitslosengeld II (ALG II) entstanden ist, auf 28 Millionen Euro.
FOCUS 16.1.07:
Polizei-Protokolle stehen im Internet. Das Polizeipräsidium Südhessen hat
versehentlich Einsatzprotokolle mit Namen und Daten kontrollierter Bürger online gestellt.
Ein Polizeibeamter hatte versehentlich auf den falschen Knopf gedrückt und somit waren die
Protokolle nicht wie geplant im Intranet, sondern im Internet publiziert.
Fazit
Natürlich behaupte ich nicht, dass diese Groÿprojekte ohne ordentliche Planung durch-
geführt wurden. Aber sie machen deutlich, dass Webanwendungen komplex und ihre Probleme
vielfältig sind.
Auf die Besonderheiten von webbasierten Anwendungen werden wir nun eingehen, was ist
bei Webanwendungen wichtig? Welchen Problemen müssen Sie sich bei nahezu jeder Webanwendung stellen?
Anforderungsanalyse
Ein Hauptproblem besteht darin, dass die Funktionalität zu keinem Zeitpunkt eindeutig spezizierbar ist. Es gibt wenige Konstanten im System. Aber, sowohl Inhalte als auch Strukturen
und Dienste können hinzugkommen oder wegfallen. Neue Benutzergruppen mit unterschiedlichen Rechten und Sichten können hinzukommen. Eine Webanwendung ist selten fertig. Dennoch
sind Kernfunktionen zu denieren und zu implementieren, die Struktur ist eben so oen zu halten, dass Veränderungen möglich sind.
Benutzerinnen
Bei ebay sind mehrere Millionen Benutzer online, in anderen Anwendungen vielleicht nur fünf.
Die Benutzer sind in der Regel unbekannt und können vor Benutzung der Applikation kein Training erhalten, die Benutzung muss intuitiv sein. Egal wieviele Benutzer das System nutzen, eine
einigermaÿen erfolgreiche Seite hat viele verschiedene Benutzer. Verschiedene Benutzergruppen
können sich im Design und der Sprache auswirken. Umfasst meine Zielgruppe alte und junge
Leute, so muss dies berücksichtigt werden. Alte Leute können in der Regel nicht so gut auf
kleine Links klicken, tun sich mit kleinen Schriften, kontrastarmen Farben, etc. schwer. Junge
Leute stehen oft auf neue Technologien, einer coolen Sprache, kontrastreiche Farben, etc. Aber
es gibt auch Benutzergruppen mit verschiedenen Rechten: Einige können bestimmte Inhalte
editieren, bekommen bestimmte Inhalte/Dienste angezeigt, die anderen versteckt bleiben.
Online
Alles was Sie entwickeln und freischalten, ist direkt bei allen zu sehen, auch Fehler gehen online.
Sieht eine Benutzerin zu viele Fehlermeldungen, ist der Dienst oft nicht verfügbar, wird sie die
Seite vermutlich nicht mehr besuchen. Sie kann auch nicht darüber informiert werden, dass
ein Fehler behoben ist, da sie in der Regel anonym ist. Dauert das Laden einer Seite zu lang,
verabschieden sich ebenfalls viele Besucher umgehend.
11
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.1 Motivation
Verschiedene und neue Technologien
Allein in dieser Vorlesung werden Sie vier verschiedene Syntaxen kennenlernen (HTML, CSS,
JavaScript, PHP). Aber es gibt noch viele weitere Sprachen Asp.Net, Java Server Pages, Java,
Ruby oder Perl, darauf aufbauende Architekturen und Frameworks und weitere Technologien
wie z.B. Webservices. Es ist sicher deutlich einfacher, eine Anwendung mit nur einer Entwicklungsumgebung und einer Sprache zu entwickeln, als Syntax und Funktionalität verschiedener
Sprachen ideal zu nutzen. W3C und die Endgerätehersteller schlafen nicht. Auch wenn wir viele
Technologien gerne früher hätten, gibt es neue Standards und neue Endgeräte am laufenden
Band. Die Applikation wird eventuell nicht nur über einen Browser der neuen Generation mit
1280x1024 Punkten Auösung betrachtet, sonder von alten Browsern mit geringerer Auösung
oder von ganz anderen Geräten wie UMTS Handys, PDAs oder von Screenreadern vorgelesen. Das Web ist erst 25 Jahre alt und hat sich schon sehr stark verändert. Es ist aus dem
Leben vieler nicht mehr wegzudenken und mit diesem Bedarfsmotor wird auch die Technik
vorangetrieben.
Interdisziplinär
Eine normale Desktopanwendung wird üblicherweise aus einem Team von Softwarearchitekten
und -entwicklern, Testern, einer Dokumentationsabteilung, die auch Übersetzungsdienste leistet, und eventuell Datenbankspezialisten entwickelt. Bei der Spezikation oder auch Einführung
vor Ort kommen häug Berater zum Einsatz, die über ein ausgeprägtes Domänenwissen verfügen. Usability-Experten denieren Richtlinien für Dialoge, Designer denieren die Corporate
Identity. Im Web kommen zusätzlich Multimedia-Experten, IT-Spezialisten für Netzwerk und
Webserver, Experten für Informationsgewinnung, auch KI-Leute und Autoren (international)
für den Inhalt dazu. Usability ist auch nicht einmalig zu denieren, sondern eine Expertin sollte
das Team vervollständigen. Diese sollte auch über didaktische Fähigkeiten verfügen oder brauchen wir dafür noch jemanden? Viele Köche verderben bekanntlich den Brei, aber für eine gute
Seite wird man nicht darauf verzichten können. Unterschiedliche Disziplinen bringen oft Kommunikationsprobleme und unterschiedliche Werkzeuge mit sich, die dennoch zusammenspielen
müssen.
International
Die Anwendung wird vielleicht von verschiedenen Nationalitäten und Kulturen benutzt. Dies
kann bedeutet, dass Texte nicht nur übersetzt, sondern Inhalte und Layout gegebenenfalls auch
kulturell anzupassen sind. Die Seite ist 24/7 im Einsatz, Updates sind gut zu planen.
Sicherheit und Privatsphäre
Sicherheit, Bezahlen über das Netz? Die Kreditkarteninformationen preisgeben? Wer hat hier
keine Hemmschwelle? Kann ich dem Anbieter vertrauen. Mittlerweile nden viele Zahlungsvorgänge über das Netz statt und Sicherheit ist dabei ein groÿes Thema. Privatsphäre: Wer kennt
nicht die Einträge Lieschen Müller, Hauptstr. 7, 10000 Berlin. Auch die E-Mail-Adresse wird
ungern herausgegeben, da die Angst vor zusätzlichen Spam-Mails leider berechtigt ist. Auf der
anderen Seite sind Unternehmen daran interessiert, ihre Kunden zu kennen Stichwort Customer Relationship Management CRM (Kundenbeziehungsmanagement) um ihre Produkte
und das zugehörige Marketing anzupassen. Nutzer möchten dagegen lieber nicht zuviel von sich
12
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.1 Motivation
Preis geben und eine gute Anwendung fragt auch nur die tatsächlich notwendigen Informationen
ab.
Kurze Entwicklungszeiten
Webprojekte haben häug nur eine Laufzeit von drei bis sechs Monaten. Die Entwicklung von
umfangreichen Seiten wird oft unterschätzt, der Konkurrenzdruck ist groÿ.
Dokumentenorientiert
Klassischerweise bestehen Websites aus Dokumenten, viele Anwendungen sind daher dokumentenorientiert. Es gibt natürlich auch andere Anwendungen, die Ajax oder Webdienste nutzen
und die Tendenz zu desktopähnlichen Anwendungen ist da. Dennoch besteht die Groÿzahl von
Webpräsentation aus dem Transferieren von HTML-Dokumenten, insbesondere Content Management Systeme basieren darauf. Es sind immer ganze Dokumente an den Client zu senden. Die
Dokumente enthalten unterschiedliche Medien, wie Texte, Bilder, Videos, Tabellen oder Animationen. Eine didaktische Aufbereitung sowie die Berücksichtigung von Usability-Kriterien
sind wichtig. Es ist insbesondere auf die Aktualität der Dokumente zu achten. Eine Website
besteht schnell aus einigen Hundert oder gar Tausend Dokumenten. Die Implementation einer
guten Navigation ist eine groÿe Herausforderung. Wie können bei einer so groÿen Anzahl von
Dokumenten sehr unterschiedliche Nutzer (unterschiedliches Vorwissen, Denkstrukturen, Interessen und Ziele) mit möglichst wenigen Klicks zum Ziel geführt werden? Die Benutzer können
sehr unterschiedliche Wege gehen, um auf eine bestimmte Seite zu gelangen, sie stoÿen auf Ihre
Seite auch nicht notwendigerweise über die Startseite (vielleicht wurden sie über eine Suchmaschine oder einen Link eines anderen Anbieters auf Sie aufmerksam, vielleicht sogar nur über
den Cache einer Suchmaschine und damit über eine ältere Version). Auch kann die Applikation
jederzeit verlassen werden. Da keine dauerhafte Verbindung zwischen Webclient und Webserver
besteht, bekommt dies die Applikation nicht mit.
Personalisierung
Insbesondere angemeldete Benutzer freuen sich über eine personalisierte Erscheinung und individuellen Inhalt, eine auf sie zugeschnittene Navigation. Das kann die eigene Aufgabenliste,
neue Artikel der angegebenen Themenliste, etc sein.
3.1.2 Kategorien von Webanwendungen
Es gibt nicht DIE Anwendung, sondern mit den technischen Möglichkeiten, haben sich auch
die Anwendungen verändert. Man unterscheidet die folgenden Kategorien.
Dokumentenzentriert:
Interaktiv:
statische Seiten, Beispiel: Firmenpräsentation.
HTML-Seiten mit Formularen und serverseitigem CGI, Beispiel: Fahrplanauskunft.
Transaktional:
mit schreibendem Zugri auf eine Datenbank, Beispiel: Online-Banking.
Workowbasiert:
Häug unter Verwendung von Webservices, Beispiele: Versorgungsketten-
management, Chat, Wiki.
Portalorientiert:
Zugri auf unterschiedliche Subsysteme durch Single Sign On, Beispiele:
Entwickler-, Mitarbeiter-, Geschäftskunden-, Lieferanten-, Endkundenportale.
13
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Ubiquitär:
Personalisierte, ortsabhängige, endgeräteabhängig Anwendungen, Beispiele: Sind
im Kommen.
Semantisches Web:
Durch geeignete Ontologien verbesserte individuelle Wissensdarstellung,
Wissensmanagement, Beispiele: Sind im Kommen.
Web 2.0:
oder auch Web 3.0 mit Ajax & Co, Beispiele: YouTube oder Google Docs & Spreads-
heets.
Es handelt sich nicht um eine strenge Klassizierung, d.h. es gibt beispielsweise Anwendungen, die dokumentenzentriert und transaktional sind. Bevor man eine Webapplikation entwickelt, sollte man sich überlegen, um welche Art von Anwendung es sich handelt und diese mit
den entsprechenden Technologien angehen.
Aufgabe 3.1
Was versteht man unter einem Portal? Was sind besondere Eigenschaften eines
Portals? Erforschen Sie unterschiedliche Portaltypen und charaktierisieren Sie diese.
Aufgabe 3.2
•
•
•
Beschreiben Sie Ihre Anforderungen an Sicherheit und Privatsphäre für
Online-Banking
Online-Belegsystem der Hochschule
Videothek
Aufgabe 3.3
Finden Sie personalisierte Seiten und beschreiben Sie worin die Personalisierung
besteht.
Aufgabe 3.4
Identizieren Sie typische Benutzergruppen der Hochschulseite und charakterie-
sieren Sie diese bzgl. typischer Aufgaben, Rechte etc.
3.2 Planung
Viele Webprojekte werden als einmaliges Projekt bearbeitet. Die Entwicklung erfolgt ad hoc,
der Code ist quick and dirty. Wiederverwendung beschränkt sich auf Copy&Paste. Die Dokumentation beschränkt sich auf Kommentare im Code. Entwurfsentscheidungen sind oft nicht
nachvollziehbar.
Auf den ersten Blick scheint dieses Vorgehen kostengünstig. Sie führen jedoch oft zu schweren
und damit kostenintensiven Problemen bei Betrieb und Wartung: Nachträgliche Änderungen
wirken sich oft an mehreren Stellen aus. Fehler sind nur aufwändig zu nden. Zuverlässigkeit
und Skalierbarkeit sind nicht ausreichend gewährleistet.
Denition 3.1
Web Engineering ist die Anwendung systematischer und quantizierbarer An-
sätze (Konzepte, Methoden, Techniken, Werkzeuge), um Anforderungsbeschreibung, Entwurf,
Implementierung, Test, Betrieb und Wartung qualitativ hochwertiger Webanwendungen kosteneektiv durchführen zu können. Web Engineering bedeutet auch die wissenschaftliche Disziplin,
die sich mit der Erforschung dieser Ansätze beschäftigt.
Ein methodisches Vorgehen führt zu weniger Fehlern im Code, einer besseren Wartbarkeit,
Dokumentation und häug zu wiederverwendbaren Komponenten (wie z.B. für Login, Navigation, Datenbankzugri, Formularvalidierung).
Sie kennen ein methodischen Vorgehen aus der klassischen Softwareentwicklung, nutzen Sie
Ihre Kenntnisse auch für Webanwendungen. Lesen Sie in diesem Abschnitt, was Sie bei Webanwendungen zusätzlich beachten sollten.
Prinzipiell lassen sich folgende Phasen unterscheiden:
14
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Phase 1:
Strategie und Konzept⇒ Strategische Positionierung der Webaktivität und Priori-
sierung von Konzepten.
Phase 2:
Anforderungsanalyse
⇒
Spezikation
der
Funktionalität,
abzubildenden
Ge-
schäftsprozesse, zu integrierenden Drittsysteme, Priorisierung von Anforderungen
Phase 3:
Entwurf
⇒
Architektur, Datenmodell, Hypertext, Klassendiagramm, Navigation,
Layout
Phase 4:
Phase 5:
Implementierung
(Test)Betrieb
⇒
⇒
Prototyp oder Endsystem
Wartung, Weiterentwicklung, Qualitätssicherung
Diese Phasen werden zum Teil, notfalls auch alle, mehrfach durchlaufen. Folgendes Vorgehen
empehlt sich, auch bei kleineren Projekten: Fangen Sie mit einem Brainstorming nach Auftragseingang an oder auch direkt mit dem Auftraggeber. Diese Ideen gruppieren Sie, machen Sie
sich an eine erste Priorisierung. Anschlieÿend dokumentieren Sie Ihre Gedanken zu folgenden
Fragen:
•
Welche Ziele werden mit der Anwendung verfolgt? Betrachten Sie Seiten mit ähnlichen
Inhalten, übernehmen Sie gute Ideen. Finden Sie Mängel. Beschreiben Sie den Mehrwert
Ihrer Seite.
•
Welchen Nutzen soll die Webanwendung im Vergleich zu bisherigen Anwendungen haben?
Wozu machen wir das? Woran müssen wir uns am Ende messen lassen?
•
Welche Geschäftsprozesse gibt es momentan (sichten Sie alle zur Verfügung stehenden
Dokumente), welche sollen integriert, welche ersetzt werden? Suchen Sie hierzu immer
wieder das Gespräch mit Mitarbeitern, die aktive Teilnehmer dieser Geschäftsprozesse
sind, sie sind ihre eigentlichen Kunden.
•
Was sind die möglichen Benutzer(gruppen)? Versuchen Sie diese zu charakterisieren (Alter, Erfahrung, technisches Verständnis , Aufgaben, Rechte, Sprache, Kultur, . . . ). Warum
kommen die Benutzer auf Ihre Seite?
•
Welcher Inhalt und welche Funktionen werden von welchen Benutzern benötigt? Woher
kommt der Inhalt?
•
•
•
Wer soll den Inhalt pegen? Welche Werkzeuge/Kenntnisse haben die Autoren?
Welche Marketingstrategien gibt es? Wie sieht das Corporate Identity aus?
Gibt es rechtliche Grundlagen/Einschränkungen (z.B. Impressum, Datenschutz, Copyright, . . . )?
•
Welche Anforderungen in Bezug auf Inhalt, Navigation, Systemumgebung, Benutzerinteraktion und Transaktionen gibt es?
•
Gliedern Sie den Inhalt, wieviele Gliederungsebenen brauchen Sie? Gibt es Querverweise
oder parallele Hierarchien, dies ist sinnvoll, um den Denkstrukturen und Interessen der
unterschiedlichen Benutzergruppen zu begegnen. Berücksichtigen Sie dabei das Hinzufügen neuer Gliederungspunkte auf jeder Ebene.
•
Welche Navigationsstrukturen wollen Sie anbieten (guided tour, Index, Sitemap, alternative Sichtweisen auf die gesamte Seite)?
•
•
•
Überlegen Sie sich Szenarien zur Benutzung der Seite.
Wie sehen mögliche Testfälle aus, was ist Qualität?
Welche Schnittstellen zu anderen System sind zu berücksichtigen (lesender/schreibender
Zugri )?
•
15
Welche Risiken sind zu erwarten?
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
•
•
Wie sieht es mit der Skalierbarkeit aus?
Auf welchen Servern soll die Applikation laufen?
Zusätzlich sind Verfügbarkeit, Zuverlässigkeit, Usability, Bedienbarkeit, Verständlichkeit, Erlernbarkeit, Performance, Änderbarkeit und Übertragbarkeit zu berücksichtigen.
Dokumentieren Sie Ihre Ergebnisse mit Hilfe von Anwendungsfällen und Aktivitätsdiagrammen. Leiten Sie aus dieser Analyse und den damit verbundenen Anforderungen Ihre Architektur inklusive der Subsysteme, ein Datenmodell, ein Klassendiagramm, ein Hypertext/Navigationsmodell und ein Präsentationsmodell ab.
Planen Sie verschiedene Iterationen. Testen Sie Bibliotheken automatisch und Prototypen
mit möglichen Benutzern. Lassen Sie das Feedback der Benutzer in weitere Anforderungen etc.
einieÿen, überarbeiten Sie die bisher erstellten Dokumente gegebenenfalls. Implementieren Sie
Methoden zur Qualitätssicherung. Verwenden Sie ein System zur Versionsverwaltung.
Abbildung 3.1: Dimensionen einer Webanwendung
Sie sollten bei der Planung in verschiedenen Dimensionen denken (siehe Abbildung 3.1):
1. Dimension Hypermedia-Ebenen: Inhalt, Hypertext (Verknüpfungen), Darstellung (Sichtweisen)
2. Dimension Entwicklungsphasen: Analyse, Design, Implementation
3. Dimension Aspekte: Struktur, Verhalten
Was bedeutet das beispielsweise in der xz-Ebene?
•
•
(Darstellung, Struktur): Zusammensetzung der Benutzerelemente,
(Darstellung, Verhalten): Reaktionen zu Eingabe, Ereignisse oder sonstiger Interaktion
und Synchronisation zwischen Benutzerelementen.
•
•
•
•
16
(Hypertext, Struktur): Logische Zusammensetzung der Seiten und Navigationsstruktur,
(Hypertext, Verhalten): Laufzeitverhalten des Hypertextes.
(Inhalt, Struktur): Domänenabhängige Datenstruktur,
(Inhalt, Verhalten): Domänenabhängige Applikationslogik.
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Abbildung 3.2: Entwicklungswerkzeuge nach ihren Methoden und in zeitlicher Abfolge (Quelle:
Nora Koch, Uni München)
Für gröÿere Projekte oder einfach nur, wenn Sie damit Geld verdienen wollen, sollten Sie
Modellierungswerkzeuge und Methoden gezielt einsetzen. Bei der Modellierung von Webanwendungen gibt es viele Werkzeuge. Abbildung 3.2 stellt diese im Überblick dar. Je nachdem,
welche Art von Anwendung Sie planen, sollten Sie sich für das eine oder andere Werkzeug entscheiden. Workowbasierte Anwendungen erfordern eine andere Herangehensweise als Portale.
Wenn Sie schon Erfahrung in UML haben, ist es sicher sinnvoll, eine darauf basierende Methode
wie beispielsweise UWE UWE oder webML zu wählen. Während auch klassische UML Werkzeuge mit Anwendungsfall- und Aktivitätsdiagrammen zur Spezikation der Anforderungen
genutzt werden können, ist die Darstellung der Navigationsstrukturen und Präsentationsmodelle schwierig. Diese werden daher in UWE ergänzt. Neben den OO geprägten Modellierungen
(UWE, OOHDM, OOH) gibt es auch Modelle, die von der Hypermediaentwicklung (WSDM,
HDM) oder der datenorientierten Sichtweise (webML, HERA) abgeleitet wurden. Abbildung
3.3 zeigt Ihnen exemplarisch die einzelnen Entwicklungsphasen in WebML und WSDM.
Nutzen der Webmodellierung
Generell dient die Webmodellierung zur Reduktion der Kom-
plexität, Dokumentation der Entwurfsentscheidungen (oft gibt es Alternativen und am Ende
weiÿ niemand mehr, warum man sich so entschieden hat), Vereinfachte, lesbare und visuelle
Darstellung (Bilder sagen oft mehr), Grundlage zur Kommunikation im Projekt (zwischen den
vielen verschiedenen Teammitgliedern, aber auch immer wieder mit dem Kunden), Trennung
der Aspekte Inhalt, Geschäftslogik, Hypertext und Präsentation.
Zu Beispiel 3.1 können Sie unter Übung Webengineering LTU München Musterlösungen
bezüglich des Webengineerings herunterladen. Daraus sind die folgenden Graphiken extrahiert,
die meiner Meinung nach, Ablauf, Navigation und Datensicht sehr gut illustrieren.
Aufgabe 3.5
Nennen Sie drei Gründe, die für eine iterative Entwicklung von webbasierten
Anwendungen sprechen.
17
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Abbildung 3.3: Entwicklungsphasen in WebML und WSDM
Aufgabe 3.6
Schreiben Sie eine Spezikation und einen Entwurf für die Aufgabenstellung aus
Beispiel 3.1.
18
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Abbildung 3.4: Ablauf: Ticketkauf
Abbildung 3.5: Datensicht: Filmdatenbank
19
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.2 Planung
Abbildung 3.6: Navigation: Startseite
Abbildung 3.7: Navigation: Filme kommentieren
20
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.3 Internationalisierung und Lokalisierung
3.3 Internationalisierung und Lokalisierung
Im vergangenen Abschnitt haben Sie sich mit Fragen des Web Engineerings allgemein beschäftigt. Die folgenden Unterkapitel diskutieren ausgewählte Fragestellungen der Webentwicklung,
die auch schon in der Planungsphase zu berücksichtigen sind. Los geht es mit der Möglichkeit,
für internationale Benutzer zu entwickeln.
3.3.1 Internationalisierung
Ziel der Inernationalisierung ist es, eine Website so zu gestalten, dass verschiedene Sprachen und
kulturelle Einüsse ohne zusätzlichen Programmieraufwand eingebaut werden können. Stellen
Sie sich hierzu vor, Sie müssten die Seite einer groÿen deutschen Firma für den chinesischen
Markt frei schalten. Die wortwörtliche Übersetzung des Inhaltes wäre vermutlich schnell erledigt, aber Sie müssen auch unterschiedliche Datums- und Zeitformate, Maÿeinheiten, Währungen, Zahlungs- und Liefermethoden, Rechtsvorschriften, Zeichencodierung (Unterstützen
Datenbank und Formulare Unicode, passt die Zeichengröÿe zum Design vgl. hierzu Abbildung 3.8 wird noch richtig sortiert?), Schreibrichtung (z.B. rechts nach links im arabischen
Raum), . . . berücksichtigen. Neben diesen technischen Aufgaben warten auf Sie auch kulturelle
Besonderheiten, wie die Bedeutung von Farben, Bilder oder ethnische Grundsätze, das ganze
Marketing muss anpassbar sein. Ihre Implementation sollte möglichst exibel sein. Isolieren Sie
alle sprachlichen und kulturspezischen Elemente Ihrer Seite.
Hinweis: In der Literatur wird für Internationalisierung auch häug die Abkürzung I18N
verwendet.
Abbildung 3.8: Internationalisierung: Problem Länge des Übersetzungstextes
3.3.2 Lokalisierung
Lokalisierung bezieht sich auf die Angleichung eines Produkts, einer Anwendung oder eines
Dokuments, um der Sprache, den kulturellen oder anderen Anforderungen eines bestimmten
Zielmarktes (ein lokaler Schauplatz) zu entsprechen. Die Internationalisierung stellt die technischen Möglichkeiten zur Lokalisation bereit. Noch einmal, mit Lokalisierung ist nicht die
einfache Übersetzung in eine andere Sprache gemeint, sondern die Seite sollte der Benutzerin
den Eindruck vermitteln, sie sei für ihr Land entwickelt. Märkte und Bedürfnisse sind Bestandteile einer Kultur, so wie die Marketingstrategien an verschiedene Kulturen angepasst werden,
sollte dies auch mit der Website passieren.
Aufgabe 3.7
Vergleichen Sie die Seiten von IBM für USA www.ibm.com/us/en und Deutsch-
land www.ibm.com/de/de. Wird auf kulturelle Unterschiede eingegangen?
21
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.4 Usability - Bedienbarkeit
3.4 Usability - Bedienbarkeit
Wie bereits in Abschnitt 3.1.1 erwähnt, ist die Benutzeroberäche für jede Webanwendung individuell zu gestalten. Dennoch gibt es allgemeine Elemente, die auf jeder Seite mehr oder weniger
vertreten sind. Um diese momentan verbreiteten und akzeptierten Dokumentenelemente geht
es. Es ist sinnvoll, sich an einem verbreiteten Layout zu orientieren, da sich die Benutzerinnen
so leichter zurecht nden. Es folgt eine benutzerzentrierte Sichtweise.
Viele Internetbenutzer suchen entweder nach Information wo nde ich einen guten kosten-
losen HTML-Editor? oder müssen eine Aufgabe erledigen (Banküberweisung, Kauf ). Wie in
einem groÿen Kaufhaus werden Sie entweder der vorhandenen Ausschilderung (Navigation) folgen oder einen Mitarbeiter fragen (Suchfunktion). Ihre Website sollte beiden Benutzertypen
gerecht werden.
Eine Website muss intuitiv bedienbar sein, Benutzer müssen auf einen Blick den Wert Ihrer
Seite erkennen, denn oft landen sie auf Ihrer Seite über eine Suchmaschine und innerhalb von
Sekunden entscheidet sich, ob die Benutzerin bei Ihnen bleibt oder den nächsten Suchtreer
verfolgt. Ihre Seite sollte ansprechend, klar strukturiert sein und Besucher müssen auf einen
Blick erkennen, was Ihre Seite bietet. Die Benutzerin sollte nicht lange denken oder zögern
müssen. Links sollten klar erkennbar sein, besuchte Links sollten markiert sein. Verzichten Sie
auf Blabla in Ihren Seiten, kürzen Sie Ihre Texte, bis nichts mehr weg darf. Denn Lesen am
Bildschirm ermüdet deutlich mehr und ist bis zu 25% langsamer, als das Lesen eines Buches
oder einer Zeitschrift.
Aufgabe 3.8
Analysieren Sie zehn Seiten Ihrer Wahl, was nden Sie an den Seiten gut, was
schlecht?
Viele Leser scannen Seiten: Sie lesen sie nicht von oben nach unten durch, sondern sind auf
der Suche nach passendem Inhalt oder einem geeigneten Link. Ein klares Seitenlayout hilft der
Orientierung auf Ihrer Seite. Sorgen Sie dafür, dass folgende Elemente beim Scannen erkannt
werden:
Logo und Kurzbeschreibung
Logo
und
aussagekräftiger
Spruch,
der
prägnant
den
(Mehr)wert Ihrer Seite beschreibt.
Hilfsmittel
Kleine Helfer, die oft gebraucht werden, aber nicht in die inhaltliche Hierarchie
einsortiert werden sollen, z.B. Warenkorb, mein Konto oder das Impressum.
Hauptnavigation Die Hauptnavigation Ihrer Seite.
Zweitnavigation und/oder lokale Navigation Die Zweit- und gegebenenfalls Drittnavigation, welche Informationen kann ich von der aktuellen Seite erreichen?
Seitentitel
Der Titel der aktuell angezeigten Seite, der so auch in der Navigationshierarchie
zu nden ist. Dieser sollte klar erkennbar sein.
Wo bin ich?
Durch aufgeklappte Menüs oder Tabs oder auch die zunehmend verbreitetere
Breadcrumb Zeile (Hauptmenue > Untermenue > Knoten).
Suche Eine Suchfunktion.
Textuelle Darstellung des Menues
Diese bendet sich oft am Seitenende, also unten.
Abbildung 3.9 zeigt die angegebenen Elemente, wie sie typischerweise auf Seiten zu nden
sind. Oft bendet sich die Hauptnavigation auch mit der Zweitnavigation zusammen auf der
linken Seite.
22
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.4 Usability - Bedienbarkeit
Abbildung 3.9: Typische Elemente einer Seite zur besseren Orientierung
Aufgabe 3.9
Analysieren Sie Ihre in Aufgabe 3.8 betrachteten Seiten noch einmal mit Blick
auf auf die eben genannte Liste. Vergleichen Sie Ihre Beobachtungen mit der diesbezüglich gut
gestalteten Seite von amazon.com.
3.4.1 Tests
Wenn Sie eine erste Version Ihres Internetauftritts haben aufgrund der iterativen Entwicklung
sollte das auch schon zu Projektbeginn der Fall sein dann suchen Sie sich Testpersonen
oder professionelle Tester. Mit einem Screenrekorder können Sie die Aktionen der Testpersonen
sowie deren Kommentare aufnehmen. Wenn möglich, suchen Sie sich typische Benutzer. Aber
Ihr Bekanntenkreis ndet es vielleicht auch mal lustig, Ihre Seite zu testen. Gehen Sie dabei
wie folgt vor (im Praktikum können Sie etwas abkürzen, aber schlieÿen Sie sich auch hier mit
anderen Gruppen kurz und fordern Sie Feedback ein):
1. Erklären Sie kurz den Zweck des Testens und dass die Testperson nichts falsch machen
kann. Fordern Sie die Testperson auf, ihre Gedanken generell laut zu formulieren, so dass
Sie jedes Zögern zu interpretieren wissen.
2. Weisen Sie darauf hin, dass die Session aufgenommen wird und von wem das Material
angesehen wird.
3. Stellen Sie einige Fragen, wofür das Internet verwendet wird.
4. Starten Sie Ihre Seite, fragen Sie nach dem ersten Eindruck. Reagieren Sie auf etwaige
Fragezeichen aufgrund der Mimik der Testperson, fragen Sie nach, was ist unklar?
5. Fragen Sie, was die Benutzerin zuerst klicken würde.
6. Versuchen Sie mit der Testperson eine echte Aufgabenstellung zu nden, beispielsweise
die Suche nach einem Buch, zu einem bestimmten Gebiet.
7. Lassen Sie die Testperson Ihre Aufgabe erledigen bis sie erfüllt ist oder genervt aufgibt.
Versuchen Sie weitere Aufgaben zu nden.
Werten Sie insbesondere die Fragezeichen aus und korrigieren Sie Ihre Darstellung entsprechend. Die Tests werden die echten Schwachstellen Ihrer Seite oenbaren. Wiederholen Sie die
Tests während Ihrer Entwicklungsiterationen.
23
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.4 Usability - Bedienbarkeit
3.4.2 Ärgerliche Eigenschaften einer Seite
Unter Consumers' Pet Peeves about Commercial Web Sites wird regelmäÿig eine Umfrage
publiziert, was die Benutzer am meisten ärgert und dazu veranlasst, die jeweilige Seite nicht
mehr zu besuchen.
1. Neue Fenster mit Werbung (Pop-up ads): 93,1%.
2. Installation von Zusatzsoftware zum Betrachten der Seite: 89%.
3. Fehlerhafte Verweise:86.0%.
4. Zugang ausschlieÿlich für registrierte Benutzer:83%.
5. Langsam zu ladende Seiten:83.0%.
6. Veralteter Inhalt:82.4%.
7. Verwirrende Navigation:84%.
8. Ineziente Suchfunktion:80.3%.
9. Kontakt über Webformular ausschlieÿlich:75%.
10. Zurück des Browsers deaktiviert:76%.
11. Überladene Seiten, unnötige Splashs etc.:69%.
24
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.5 Navigation
3.5 Navigation
Die Navigation einer Seite ist essentiell. Gut strukturierte Seiten mit klaren Links führen die
Benutzerin an ihr Ziel. Bevor Sie die ersten Seiten erstellen, sollten Vernetzung der Seiten klar
sein. Abbildung 3.10 zeigt, wie Inhalte prinzipiell angeordnet sein können.
Abbildung 3.10: Typische Informationsstrukturen
Auistung
Unverknüpfte Informationsobjekte gleicher Ebene. Diese nden Sie beispielweise in
Form einer Hotlist, einer Linkliste oder beim Index.
Sequenz Folge von verknüpften Informationen, z.B. bei einem Bestelldialog.
Monohierarchie Hierarchische Verknüpfung mit genau einem Pfad zu einem Objekt. Es gibt
keine Zyklen. Häuge Darstellung mit 2, 3 oder mehr Ebenen, als Repräsentation des
gesamten Hypernetzes oder auch nur der Sitemap.
Polyhierarchie
Netz
Im Unterschied zur Monohierarchie kann es verschiedene Pfade zu einem Ob-
jekt geben. Diese Struktur kommt häug vor.
Zusammenhängender, gerichteter Graph mit beliebigen Zyklen. Diese Struktur ist eher
selten.
Sie haben mehrere Möglichkeiten, die Inhalte einer Seite abzulegen. Sie können eine Datenbank, eine XML-Datei oder auch das Dateisystem verwenden. Insbesondere bei der Datenbank
und XML-Datei müssen Sie sich natürlich über das Schema Gedanken machen. Dies sollte auch
die Umsetzung eines geschlossenen Bereichs beinhalten.
Hierarchische Navigationsstrukturen werden in relationale Datenbanken üblicherweise rekursiv dargestellt. Eine wesentlich ezientere Methode bieten verschachtelte Bäume, sogenannte
nested sets, die ich nun kurz einführen möchte, da diese Datenhaltung in der Veranstaltung
Datenbanken üblicherweise nicht gelehrt wird. Diese verschachtelten Bäume sind deutlich effektiver als ein rekursives Datenmodell, WENN vorwiegend lesend zugegrien wird und die
Baumstruktur sich nicht ständig ändert. Gedanklich müssen Sie von der üblichen Baumstruktur in ein Megendiagramm umschalten, siehe Abbildung 3.11.
Jeder Knoten erhält neben seines Namens oder einer anderen Identikation noch die Einträge
links und rechts. Diese beiden zusätzlichen Werte denieren das ineinander Enthaltensein. Sie
nummerieren dabei wie folgt: Der Wurzelknoten A erhält für links die 1, der nächste enthaltene
Knoten, also B für links die nächste Zahl, also die 2, der nächste enthaltene ist C, also für
links die 3, der nächste enthaltene ist D, also für links die 4. D enthält keinen weiteren Knoten
25
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.5 Navigation
Abbildung 3.11: Analogon verschachtelte Bäume: Mengen
und erhält für rechts die nächste Zahl, also die 5. C ist damit abgeschlossen und erhält für
rechts die nächste Zahl, also die 6 usw. Auf diese Weise ergibt sich ein vorgegebener Pfad wie
in Abbildung 3.12 veranschaulicht.
Abbildung 3.12: Verschachtelte Bäume: Vorgegebener Pfad
Durch diese Art der Nummerierung ergeben sich folgende Regelmäÿigkeiten:
•
Wurzel links = 1
•
Wurzel rechts / 2 = Anzahl der Knoten im Baum
•
Blatt rechts - Blatt links = 1
•
Für alle Knoten auÿer der Wurzel gilt: (Knoten rechts - Knoten links - 1) / 2 = Anzahl
der Kind-Knoten
•
26
Alle links- und rechts-Werte sind eindeutig
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.5 Navigation
Tabelle 3.1 zeigt eine Datenbanktabelle zu folgender Navigation einer Website.
•
EWA
HTML
JavaScript
PHP
∗
∗
Einführung
Aufgaben
·
·
∗
einfach
schwer
Links
CSS
∗
∗
Syntax
Beispiele
Id
Titel
links
rechts
100
EWA
1
24
101
HTML
2
3
102
JavaScript
4
5
103
PHP
6
17
104
Einführung
7
8
105
Aufgaben
9
14
106
einfach
10
11
107
schwer
12
13
108
Links
15
16
109
CSS
18
23
110
Syntax
19
20
111
Beispiele
21
22
Tabelle 3.1: Datenbanktabelle MenuNested
Abbildung 3.13 zeigt SQL und Ergebnis zur Erzeugung einer Breadcrumb für den Eintrag
Einführung (Id=104). Anmerkung: Die Ids im Beispiel wurden bewusst groÿ gewählt, um
keine nicht gewünschte Assoziation zu den Einträgen links und rechts aufkommen zu lassen.
Abbildung 3.13: SQL und Ergebnis für eine Breadcrumb Einführung Oder den ganzen Baum mit Ebenen zeigt Abbildung 3.14
27
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.5 Navigation
Abbildung 3.14: SQL und Ergebnis für ein Menu mit Ebenen
Im Netz und auch bei Pear gibt es Klassen zur Verwaltung von Nested Sets, wie Knoten
eingefügt, gelöscht oder verschoben werden können. Insbesondere für Menüs empehlt es sich,
die Ebene als zusätzliche Tabellenspalte aufzunehmen, denn dadurch erleichtern sich weitere
Menüabfragen.
Abbildung 3.15 zeigt SQL und Ergebnis für das direkte (aufzuklappende) Untermenu des
Eintrags PHP (Id = 103).
Abbildung 3.15: SQL und Ergebnis für das Untermenu von PHP Aufgabe 3.10
Stellen Sie folgende Navigationsstruktur rekursiv und unter Verwendung von
verschachtelten Bäumen dar:
•
Start
PHP
∗
∗
28
Einführung
Bücher
CSS
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.5 Navigation
∗
∗
29
Links
Codebeispiele
HTML
JavaScript
•
Impressum
•
Kontakt
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.6 Barrierefreiheit
3.6 Barrierefreiheit
Auch die Barrierefreiheit einer Webanwendung ist direkt bei der Planung zu berücksichtigen.
Stufen im Web? Ja, auch im Web gibt es Hürden, unnötige Hürden. In diesem Abschnitt
erfahren Sie, welche Hürden es gibt und was diese für einzelne Benutzergruppen bedeuten. Die
daraus abzuleitenden technischen Maÿnahmen werden in Abschnitt 5.3 diskutiert.
Abbildung 3.16: Fehlende Barrierefreiheit im Bau.
Für viele behinderte Menschen erönet sich mit dem Internet eine neue Welt. Sie können neue
Kontakte knüpfen, ersparen sich viele Wege zu Behörden und Banken und können einfacher
an täglich aktuelle Informationen gelangen. Ihre Lebensqualität hat sich durch das Internet
verbessert. Es liegt nun an uns Entwicklern, ihnen möglichst viele Seiten zugänglich zu machen
und Barrieren zu beseitigen. Nutzen Sie die Möglichkeit, das Leben anderer besser zu machen.
Seien Sie diesbezüglich nicht so ignorant, wie manche Architekten (siehe Abbildung 3.16).
Durch Berücksichtigung einiger Maÿnahmen, erweitern wir die potentielle Zielgruppe und die
damit zur Verfügung stehende Kaufkraft erheblich. Klare Strukturen machen eine Seite nicht
nur leichter bedienbar, sondern auch besser wartbar.
Seit 2001 gibt es ein Gesetz, das für Einrichtungen des öentlichen Rechts vorschreibt, die
Internet- und Intranet-Angebote grundsätzlich barrierefrei zu gestalten.
Denition 3.2
Barrierefreies Internet bezeichnet Internet-Angebote, die von allen unabhän-
gig von ihren körperlichen und/oder technischen Möglichkeiten uneingeschränkt genutzt werden
können.
3.6.1 Zielgruppe
Initiert wurde das barrierefreie Internet von Behindertenverbänden. Die Richtlinien sollen blinden, seh-, hör-, oder körperbehindert Menschen die Nutzung des Internets erleichtern. Aber
auch alte Menschen, Menschen mit einem Gipsarm, Menschen mit Koordinationsstörungen wie
durch MS verursacht, Menschen mit Lernstörungen, Migranten mit Deutsch als zweiter Sprache
protieren von wohlgestalteten, barrierearmen Seiten. Von den Maÿnahmen protiern eigentlich alle. Manche wundern sich, warum gehörlose Menschen Probleme mit dem Internet haben
können. Für Gehörlose ist die Gebärdensprache ihre Muttersprache. Die Gebärdensprache hat
ihre eigene Syntax, ihre eigenen Worte. Sie ist nicht eins zu eins in jede Sprache zu übersetzen
und nicht jede Sprache ist eins zu eins in die Gebärdensprache zu übersetzen, insbesondere
30
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.6 Barrierefreiheit
neuere Begrie bereiten Probleme. Eine einfache Sprache hilft ihnen, den Inhalt einer Seite zu
verstehen. Hier noch mal einige mögliche Beeinträchtigungen und ihre Folgen im Überblick:
Sehbehinderte Menschen
Mögliche Probleme: Unzureichende Kontraste, nicht skalierbare
Schrift/ Schriftgraken, unzureichende Darstellung bei geringer Auösung.
Blinde Menschen
Mögliche Probleme: Mangelhafte Bildbeschreibungen, schlechte Benennung
von Frames, unzureichende Linkbezeichnung, falsche Überschriften, Nichtbedienbarkeit
von Navigation durch Tastatur.
Stark hörgeschädigte und gehörlose Menschen
Mögliche Probleme: Audiodateien, schwer
verständliche Texte.
Manuell-motorisch eingeschränkte Menschen
Mögliche Probleme: Unzugänglichkeit von
Hyperlinks und Nichtbedienbarkeit von Navigation für Tastatur-Nutzer.
Menschen mit kognitiven Einschränkungen
Mögliche Probleme: Schwere Sprache, überla-
dene Seiten.
Menschen mit lichtinduzierter Epilepsie
Mögliche Probleme: Flackernder Inhalt, besonders
gefährlich sind 15 - 35 Hz.
3.6.2 Analyse guter Seiten
Die folgende Aufgabe sollen Ihnen helfen, zu einem eigenen guten Template für Ihre Seiten zu
kommen. Versuchen Sie sich ein gutes HTML-Gerüst, ein gutes Formular und eine gute Tabelle
zu erarbeiten.
3.6.3 Tests
Für Tests können Sie einige automatische Testwerkzeuge (siehe Linkliste in 3.7) verwenden, die
überprüfen, ob jedes Bild eine Beschreibung hat etc., eben das, was automatisch zu testen ist.
Dies kann und sollte jedoch nur ein Minimaltest sein.
Damit Sie ein Gefühl für Ihre Seite bekommen und bevor Sie jemand anderes auf Ihre Seite
lassen, empfehle ich folgende Tests:
•
Schauen Sie sich die Seite ohne Style an, passt die Reihenfolge? Sind Links und Überschriften klar erkennbar?
•
Legen Sie die Maus beiseite und bedienen Sie die Seite ausschlieÿlich über die Tastatur,
wieviele Tabs brauchen Sie wofür? Ist alles erreichbar?
Wenn Sie über das entsprechende Budget verfügen ist es natürlich sinnvoll, Testpersonen mit
verschiedenen Behinderungen hinzuzuziehen.
Aufgabe 3.11
•
Bedienen Sie die folgenden Seiten nur mit der Tastatur:
https://banking.postbank.de Erönen Sie ein Demokonto und erstellen Sie eine Überweisung.
•
•
•
•
•
www.wai-austria.at
http://www.einfach-fuer-alle.de
www.barrierefreies-webdesign.de
www.w3.org/
Finden Sie auf der Seite des Fachbereichs die E-Mail-Adresse des Dekans heraus (der
Name sei Ihnen unbekannt).
31
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.6 Barrierefreiheit
•
Hier noch ein Negativbeispiel: www.mediamarkt.de. Versuchen Sie diese Seite ohne Maus
zu bedienen. Schauen Sie sich auch hier den Quellcode an, was fällt Ihnen auf ?
•
Installieren Sie sich die Demoversion von Jaws (siehe Linkliste in Abschnitt 3.7) und
geben Sie eine Suche bei ebay ein, versuchen Sie nun von Treer zu Treer zu navigieren.
Welche Seite gefällt Ihnen in Bezug auf Design, Struktur, Bedienbarkeit mit der Tastatur und
Gesamteindruck am besten? Welche am zweitbesten? Schauen Sie sich den Quellcode dieser
Seiten an und leiten Sie sich daraus ein eigenes HTML-Gerüst ab.
32
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
3.7 Links zum Thema
3.7 Links zum Thema
•
Web Engineering
•
Vorlesungsunterlagen
Buch Web Engineering - Systematische Entwicklung von Web-Anwendungen
webML: Einführung, Beispiele, etc.
WSDM: Publikationen
VisualWade: Vom Design Modell nach OO-H zu PHP Code
Lokalisierung und Internationalisierung
Lokalisierung vs. Internationalisierung (W3C)
W3C I18N Topic Index
Secrets of Web Site Globalization
A daily blog that focuses on the day-to-day challenges and best practices of web
globalization
•
Navigation
•
Steve Krug Don't make me think
Research-Based Web Design & Usability Guidelines
Software Usability Research Laboratory
Jakob Nielsen's Website
Website Engineering - Hinweise zur Gestaltung: Projekt BESTWEBSITE
Barrierefreiheit
33
Baumstruktur, Nested Set Navigation, Download
Usability
•
Nested Sets - Hierarchische Strukturen und Bäume in MySQL
BITV Verordnung zur Schaung barrierefreier Informationstechnik nach dem Behindertengleichstellungsgesetz
Barrierefreies Webdesign: Einfach für Alle - eine Initiative der Aktion Mensch.
Barrierefreies Webdesign - ein behindertengerechtes Internet gestalten
Automatische Testwerkzeuge: Bobby, Barrierender, A-Prompt
Screenreader: Jaws, WindowsEyes, IBM Home Page Reader, WebFormator, Blindows, Virgio,
Testen einer URL bezüglich Farbenblindheit, Colorblind Web Page Filter, Auswahl
guter Farbkombinationen
sehr gute Seite einer blinden Frau
Wie blinde Menschen Internetseiten lesen können
Komplexe barrierefreie Tabellen
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
4 Grundlagen
Bevor wir mit der Implementierung beginnen, sollten Sie sich noch kurz bewusst machen, womit
Sie es eigentlich zu tun haben und, was hinter den Kulissen passiert. Gerade die Jüngeren unter
Ihnen, kennen das Web als selbstverständlichen Bestandteil Ihres Lebens, wie das Telefon oder
den MP3-Player. Man braucht noch nicht sehr alt zu sein, um sich an die Zeit vor dem Web zu
erinnern, sehen Sie selbst.
4.1 Historie
Mitten im kalten Krieg, vor langer Zeit, schossen die Russen ihre erste Sputnik Rakete ins
All. Daraufhin bekamen die Amerikaner kalte Füÿe und die Militärs gründeten 1958 die Arbeitsgruppe ARPA (Advanced Research Projects Agancy). Geld steht und stand dem Militär in
nahezu unbegrenzten Mitteln zur Verfügung, so auch ARPA. Die Leute, die ARPA vorantreiben
sollten, kamen allerdings aus der reinen Forschung und waren nicht immer so zu kontrollieren,
wie es den Generälen lieb gewesen wäre. Damals gab es wenige Computer und noch weniger mit
einer brauchbaren Rechenleistung. Die Amerikaner entwickelten mit vereinten Kräften bis 1983
an der Netzwerktechnologie auf der Basis von Ethernet (1972 von Xerox) und TCP/IP. 1986
konnte man sich endlich vom Militär trennen und es gab ein rein ziviles Netz. Auf der anderen
Seite, in einem unabhängigen Bergdorf hatten sich Berge von Wissen angehäuft. Alte wissenschaftliche Arbeiten wiederzunden und ein System in dieses Chaos zu bringen, hatte sich Tim
Berners-Lee zum Ziel gesetzt. In Cern wurde das Hypertextsystem und der Uniform Resource Locator (URL) entwickelt und 1991 ins Internet gestellt. Damit war das World Wide Web
geboren. Die weitere Entwicklung können Sie unter W3C Technical Reports and Publications
nachlesen.
34
4.2 Protokolle
4.2 Protokolle
Was passiert, wenn Sie mit Ihrem Browser eine Seite aufrufen? Wie funktioniert die Kommunikation mit Ihrem PC und dem aufgerufenen Webserver? Einen kurzen Einblick hinter die
Kulissen suchen wir in diesem Abschnitt.
Abbildung 4.1: Osi-Modell mit Protokollen
4.2.1 TCP/IP
Abbildung 4.1 stellt die einzelnen Protokolle und Schichten bei der Kommunikation zweier
Rechner dar. Da Rechner an sich nur Nullen und Einsen verstehen, braucht es eine Infrastruktur, wie sich Computer am besten unterhalten können. Nach dem OSI-Referenzmodell (engl.
Open Systems Interconnection Reference Model) gibt es sieben Schichten. Wir konzentrieren
uns dabei auf die fürs Web wesentlichen oberen fünf Schichten IP, TCP und HTTP bzw. HTTPS. Das Internet Protokoll IP ist für die Adressierung zuständig (Stichwort IP-Adresse). Das
Transmission Control Protocol (TCP) ist eine Vereinbarung (Protokoll) darüber, auf welche
Art und Weise Daten zwischen Computern ausgetauscht werden sollen. TCP ist eine Ende-zuEnde-Verbindung, welche die Übertragung der Informationen in beide Richtungen zu gleicher
Zeit zulässt. Jede TCP-Verbindung wird eindeutig durch zwei Endpunkte identiziert. Ein
Endpunkt stellt ein geordnetes Paar (auch Socket genannt) bestehend aus IP-Adresse und Port
(WWW ist auf Port 80) dar. TCP zerlegt die zu übermittelnden Daten in Pakete und setzt
sie am Zielrechner auch wieder zusammen, Fehlerkontrollen sind dabei eingebaut - gehen Pakete verloren, werden sie erneut geschickt. HTTP ist ein Anwendungsprotokoll, das auf TCP
aufsetzt.
35
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
4.2 Protokolle
4.2.2 HTTP
HTTP 1.0 ist ein zustandsloses Anfrage/Antwort-Protokoll (engl.: request, response). Der Client, meist ein Browser, sendet eine Anfrage an einen Webserver unter Angabe einer URL (Uniform Resource Locator). Die URL deniert das zu verwendende Schema bzw. Protokoll, Server,
Pfad, Parameter, etc. Der Server antwortet mit einer Statuszeile, in der die Protokoll-Version,
ein Statuscode über Erfolg oder Miÿerfolg der Anfrage sowie weitere Informationen, z.B. die
angeforderte Hypertextseite, stehen. Danach wird die Verbindung beendet. HTTP ist nicht an
HTML gebunden, sondern kann zum allgemeinen Austausch von Daten verwendet werden.
HTTP ist ein Kommunikationsschema, um Websites (oder Bilder oder prinzipiell jede andere
beliebige Datei) von einem entfernten Computer auf den eigenen zu übertragen. Wenn auf
einer Website der Link zum URL www.example.net/infotext.html aktiviert wird, so wird an
den Computer mit dem Hostnamen www.example.net die Anfrage gerichtet, die Ressource
/infotext.html zurückzusenden.
Der Name www.example.net wird dabei zuerst über das DNS-Protokoll in eine IP-Adresse
umgesetzt. Zur Übertragung wird über das TCP-Protokoll auf den Standard-Port 80 des HTTPServers eine HTTP-GET-Anforderung gesendet:
GET /infotext.html HTTP/1.1 Host: www.example.net
Zusätzliche Informationen wie Angaben über den Browser, zur gewünschten Sprache etc. können über den Header (Kopfzeile) in jeder HTTP-Kommunikation übertragen werden. Sobald der
Header mit einer Leerzeile abgeschlossen wird, sendet dann der Computer, der einen Webserver
(an Port 80) betreibt, seinerseits eine HTTP-Antwort zurück. Diese besteht aus den HeaderInformationen des Servers, einer Leerzeile und dem tatsächlichen Inhalt der Nachricht, d.h.
dem Inhalt der infotext.html-Datei. Übertragen werden normalerweise Dateien in Seitenbeschreibungssprachen wie (X)HTML und alle ihre Ergänzungen, z. B. Bilder, Stylesheets (CSS),
Skripte (JavaScript) usw., die meistens von einem Browser in einer lesbaren Darstellung miteinander verbunden werden. Prinzipiell kann jede Datei in jedem beliebigen Format übertragen
werden, wobei die Datei auch dynamisch generiert werden kann und nicht auf dem Server als
physische Datei vorhanden sein muss (z. B. bei Anwendung mit PHP). Abbildung 4.2 zeigt den
Aufbau einer HTTP Antwort.
Abbildung 4.2: HTTP Transaktion
Der Server sendet eine Fehlermeldung zurück, wenn die Information aus irgendeinem Grund
nicht gesendet werden kann. Der genaue Ablauf dieses Vorgangs (Anfrage und Antwort) ist in
der HTTP-Spezikation festgelegt.
36
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
4.2 Protokolle
Derzeit werden zwei Protokollversionen, HTTP/1.0 und HTTP/1.1 verwendet.
Bei HTTP/1.0 wird vor jeder Anfrage eine neue TCP-Verbindung aufgebaut und nach Übertragung der Antwort wieder geschlossen. Sind in ein HTML-Dokument beispielsweise zehn Bilder eingebettet, so werden insgesamt elf TCP-Verbindungen benötigt, um die Seite auf einem
grakfähigen Browser aufzubauen.
In der Version 1.1 können mehrere Anfragen und Antworten pro TCP-Verbindung gesendet
werden. Für das HTML-Dokument mit zehn Bildern wird so nur eine TCP-Verbindung benötigt.
Zusätzlich können bei HTTP/1.1 abgebrochene Übertragungen fortgesetzt werden.
Mit HTTP/1.1 ist es neben dem Abholen von Daten auch möglich, Daten zum Server zu
übertragen. Mithilfe der PUT-Methode können so Webdesigner ihre Seiten direkt über den
Webserver per WebDAV publizieren, und mit der DELETE-Methode ist es ihnen möglich,
Daten vom Server zu löschen.
Normalerweise kann die Information, die über HTTP übertragen wird, auf allen Rechnern
und Routern, die im Netzwerk durchlaufen werden, gelesen werden. Über HTTPS (Hyper Text
Transfer Protocol Secure) kann die Übertragung verschlüsselt erfolgen. Die Verschlüsselung
erfolgt mit Triple DES.
Zur Adressierung im Intenet werden URLs verwendet, Uniform Resource Locator. Der
Aufbau einer URL mit HTTP hat die Form:
http://Server/Pfad?Parameter#Link
Neben
http gibt es die Protokolle ftp, gopher, mailto, news, nntp, telnet, le und prospero. Bei
der Angabe von Parametern ist insbesondere auf folgende reservierte Zeichen zu achten:
! * ' ( ) ; : @ & = + $ , / ? % # [ ]
Frage 4.1
Welche der folgenden URLs sind gültig?
a)
http://www.fbi.fh-darmstadt.de/
b)
www.bla.de
c)
http://www.at-mix.de:80/triple_des.htm
d)
ftp://cnn.example.com&[email protected]/top_story.htm Was passiert hier eigentlich?
e)
news:comp.os.linux.hardware ja mailto:[email protected]
Frage 4.2
TCP . . .
a) ist eine Kommunikation in eine Richtung.
b) funktioniert in beide Richtungen.
c) zerlegt die Daten in Pakete und setzt sie wieder zusammen.
d) zerlegt die URL in Nummern und stellt so die Verbindung zum Zielrechner her.
e) geht immer über Port 80.
Aufgabe 4.1
Führen Sie auf der Kommandozeile folgende Befehle aus:
telnet www.yahoo.com 80
GET / HTTP/1.1 Host: www.yahoo.com
Zweimal enter eingeben liefert den Header und die Seite, nur den Header erhält man mit telnet
www.yahoo.com 80 HEAD / HTTP/1.0 zweimal Enter.
37
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
4.3 Links zum Thema
4.3 Links zum Thema
•
•
38
OSI-Modell.
Hypertext Transfer Protocol
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5 HTML und Co
ML steht für Markup Language und bedeutet Auszeichnungssprache. Durch Auszeichnung wird
ein Text mit zusätzlicher (semantischer) Bedeutung versehen. Auszeichnungssprachen gab es
schon lange bevor HTML, die heute bekannteste Auszeichnungssprache, populär wurde.
5.1 SGML
SGML (engl. Standard Generalized Markup Language, dt. Normierte Verallgemeinerte Auszeichnungssprache) ist eine Metasprache, mit deren Hilfe man verschiedene Auszeichnungssprachen (engl. markup languages) für Dokumente denieren kann. SGML ist ein ISO-Standard:
ISO 8879:1986 Information Processing Text and Oce Systems Standard Generalized Markup
Language (SGML) (Quelle: Wikipedia: SGML). SGML ist eine Obermenge von HTML. Ziel
von SGML war es, eine plattform- und anwendungsunabhängige Dokumentenform zu schaen.
In SGML ist eigentlich alles möglich, Sie müssen ihr Markup nur durch eine Dokumenttypdenition (DTD) denieren.
5.2 HTML Hyper Text Markup Language
HTML ist eine Sprache, die vom Browser verstanden und umgesetzt wird. Auf Basis des HTTPs
erhält der Client, der Browser im Body den eigentlichen darzustellenden Inhalt zurück. Im
Folgenden werden wir mit einer wirklich einfachen Seite anfangen und diese sukzessive um
wesentliche Elemente erweitern.
Listing 5.1: HTML - Einfachste Seite
<html>
<body> Inhalt </body>
</html>
Jede Seite fängt mit einem önenden html-Tag an, muss ein body-Tag enthalten und beide
wieder schlieÿen. Die Verschachtelung ist wie beim Klammerrechnen. Es können beliebig viele
Tags ineinander geschachtelt werden, das Schlieÿen erfolgt von innen nach auÿen.
Aufgabe 5.1
Korrigieren Sie folgenden HTML-Code
Listing 5.2: HTML - Fehlerhafte Seite
<html><body><p><h1>Überschrift 1<h2>Überschrift 2</h1></p></h2>
Inhalt</body></html>
Zur Strukturierung werden die Tags h1, h2, h3, h4 verwendet, h steht dabei für header,
d.h. Überschrift. Um bei einer HTML-Datei auch zusätzliche nicht anzuzeigende Informationen
einbinden zu können, gibt es einen Kopfteil. Der Titel wird im Browser angezeigt. Und der
Hypertext wird schlieÿlich durch Verweise auf andere Seiten oder Stellen im Dokument realisiert.
Hier ein einfaches Dokument:
39
5.2 HTML Hyper Text Markup Language
Listing 5.3: HTML - mit Link
<html>
<head><title>EWA Unterlagen</title></head>
<body>
<p>
<a id="oben"></a>
Vorlesung <a href="skript.pdf">Skript</a>
...
</p>
<a href="#oben">nach oben</a>
</body>
</html>
Tipp: Schreiben Sie alle Tags klein, dann fällt Ihnen die Umstellung auf XHTML leichter.
Sie werden in vielen Seiten anstelle
id="oben"
auch
name="oben"
zur Markierung des Ankers
im Text nden. Beides ist bei XHTML 1.0 zulässig, ab XHTML 1.1 wird name nicht mehr
unterstützt. Daher machen Sie es sich am besten zur Angewohnheit, immer das Attribut id
zu verwenden, bei Formularen, Links etc. kurzum bei allem, auf das Sie zugreifen möchten
per JavaScript, Links oder CSS. ABER, wenn Sie Formulare durch PHP weiter verarbeiten
möchten, dann benötigen Sie auch das Name-Attribut.
Fazit: versehen Sie alle Felder, die Sie
an anderer Stelle noch brauchen mit den Attributen Name und Id.
5.2.1 Documententyp
Es gibt nicht nur ein HTML, sondern verschiedene von W3C (World Wide Web Consortium)
denierte, gültige und verbreitete Sprachen, z.B. HTML 4.01 Strict, HTML 4.01 Transitional,
XHTML 1.0 Strict. Die maschinenlesbare syntaktische Denition dieser Sprachen ist die Document Type Denition (DTD), die Sie mit dem Doctype angeben. Mit der Angabe des Doctypes
in Ihrem HTML-Code teilen Sie dem Browser mit, welcher Denition das Dokument folgt.
Ziel ist es, eine browserübergreifende konforme Darstellung zu erhalten. Ohne Doctype kann
es passieren, dass der Browser Vermutungen anstellt und das Dokument eben anders darstellt.
Neuere Browser setzen die Standards nahezu vollständig um. Neben dem Doctype, können Sie
bei XML noch einen Prolog verwenden:
<?xml version="1.0?encoding="utf-8"?>
Leider
führt diese Angabe beim IE6 und anderen dazu, dass sie in den Quirk-Modus, d.h. den alten
Modus umschalten und die eigentliche Doctype-Angabe gar nicht mehr umsetzen. Hiermit ist
(noch) vorsichtig umzugehen.
Wie sieht nun eine korrekte Doctype Deklaration aus? Meine Empfehlung, verwenden Sie
Listing 5.4: HTML - Doctype
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
Hiermit teilen Sie dem Browser oder allgemein dem Client folgende Informationen mit:
•
•
•
•
•
•
40
<!DOCTYPE HTML PUBLIC Es folgt ein Dokument vom Typ HTML.
"+// Der Herausgeber ist ISO-zertiziert.
"-// Der Herausgeber ist nicht ISO-zertiziert.
"W3C// Der Herausgeber, hier könnte auch Microsoft oder IBM stehen.
DTD XHTML 1.0 Strict Es handelt sich um XHTML in der Ausführung 1.0
//EN" Die Sprache der DTD (nicht des XHTML-Dokuments) ist Englisch.
c Dr.
Strict.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.2 HTML Hyper Text Markup Language
• "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" Hier ist die DTD hinterlegt
und kann vom Client gegebenenfalls nachgeladen werden.
Wie welcher Browser auf welchen Doctype reagiert nden Sie unter Doctype Switching Wann schaltet welcher Browser in welchen Modus. Eine Liste empfohlener Doctypes nden Sie
unter: W3C: Recommended DTDs to use in your Web document.
Frage 5.1
Wer ist für Standards im Web zuständig?
a) Netscape
b) Microsoft
c) World Wide Web Consortium
Frage 5.2
Welchen Nutzen hat die Angabe eines Doctypes?
a) Der Client bekommt eine Information, welche Attribute, Tags und Befehle zulässig sind.
b) Nur so ist das Dokument gültig und wird vom Browser angezeigt.
c) CSS ist sonst nicht verwendbar.
d) Die eindeutige Angabe der verwendeten Sprache erlaubt eine einheitliche Darstellung in
verschiedenen Browsern.
Frage 5.1
Was ist ein Doctype, wofür wird er eingesetzt und was bewirkt das Denieren eines
Doctypes?
5.2.2 XHTML
Neuere Webanwendungen verwenden XHTML als Beschreibungssprache. Diese gibt es seit 2000
als Standard. Die Verwendung von XHTML hat folgende Vorteile: XHTML ist strenger, Fehler
werden direkt angezeigt und nicht irgendwie vom Browser behoben. Der Code ist konsistent und
kann somit von Suchmaschinen besser verarbeitet werden. Viele Programme unterstützen die
Erstellung und Navigation von XML Strukturen direkt. Es ist einfach mit
C#
oder Java XML
zu erstellen oder auch in eigene Programme einzulesen und weiterzuverarbeiten. XHTML kann
einfach von anderen Applikationen importiert werden. Die Übersetzung von einer DTD in die
andere ist automatisierbar. XHTML kann erweitert werden, beispielsweise mit mathematischen
oder multidimensionalen Strukturen. Gegebenenfalls können Sie eine eigene DTD denieren.
Obwohl XHTML 1.1. der aktuelle Standard ist, empfehle ich momentan noch XHTML 1.0
strict zu verwenden, da XHTML 1.1 nicht mehr abwärtskompatibel ist und nicht von allen
gängigen Browsern korrekt dargestellt wird.
Frage 5.2
Ist es nicht besser, eine weniger pingelige Syntax wie HTML 4.0 transitional anstelle
von XHTML 1.0 strict zu verwenden? Nehmen Sie dazu Stellung.
41
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.2 HTML Hyper Text Markup Language
Unterschiede zu HTML
Um ein HTML-Dokument, selbst HTML 4, in ein XHTML-Dokument zu überführen, müssen
Sie folgende Tags und Attribute anpassen:
•
•
•
Alle Tags und Attribute sind klein zu schreiben.
<img ... />, <br />, <li>...</li>
Es
gibt
keine
leeren
Attribute:
<hr noshade="noshade" />,
<input type="radio" checked="checked" />
• Script- und Styledenitionen gehören in den Header und sind durch [CDATA einzuschlieAlle Tags sind zu schlieÿen: img, br und li werden zu
ÿen:
<script type="text/javascript"> <!-- // /*<![CDATA[*/
document.writeln("<strong>Inhalt </strong>");
/*<]]>*/ //--> </script>
Wesentliche Tags von XHTML 1.0 strict
Im Folgenden Dokument nden Sie die wesentlichen zulässigen XHTML-Tags. Tabellen und
Formulare folgen separat in den Listings 5.7 und 5.6.
Listing 5.5: HTML - wesentliche Tags
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Alle wesentlichen XHTML-Tags in einem Dokument
</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<link rel="stylesheet" type="text/css" href="basis.css" />
</head>
<body>
<h1><a id="oben" name="oben">Dies ist die 1. Überschrift</a></h1>
<h2>Häufige, wichtige Tags</h2>
<h3>Nutzen Sie die Überschriften zur Gliederung des Inhalts</h3>
<h4>Es geht noch bis h6, aber braucht man das?</h4>
<div id="tags">ganz wichtig, begegnet uns bei CSS ständig
Zeilenumbruch: </div>
<p>Paragraph</p>
Nummerierte Liste
<ol>
<li>Tee</li>
<li>Kaffee</li>
</ol>
Aufzählungszeichen
<ul>
<li>Tee</li>
<li>Kaffee</li>
</ul>
Definitionen
<dl>
<dt>Vorlesung</dt>
42
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.2 HTML Hyper Text Markup Language
<dd>Unterhaltsame Veranstaltung.</dd>
<dt>Mensa</dt>
<dd>Kalorienlieferant.</dd>
</dl>
Eine horizontale Linie
<hr />
<h3>Noch eine Überschrift</h3>
<h2>Seltenere Tags</h2>
<object type="application/x-mplayer2" width="300" height="300">
<param name="autostart" value="false" />
<param name="showcontrols" value="true" />
<param name="filename" value="hunde.mpg" />
</object>
<a href="hunde.mpg">Hundevideo</a>
<sub>subscript</sub>
<sup>superscript</sup>
<code>Nur für Informatiker häufig ;-)</code>
<pre>Vorformatierter Text mit Leerräumen und
Zeilenumbrüchen</pre>
<abbr title="United Nations">UN</abbr>
<acronym title="World Wide Web">WWW</acronym>
<address>
Donald Duck<br />
Box 555<br />
Disneyland
</address>
<bdo dir="rtl">Wie wäre es mit Hebräisch?</bdo>
<h3>Zitate</h3>
<blockquote cite="http://www.duerrenmatt.de">
<p>
Ergreife die Feder nur, wenn du müde bist<br />
und keine Frage nach dem Stil dich berührt.<br /> <br />
- Dürrenmatt</p></blockquote>
<cite>Zitat</cite>
<q>Kurzzitat</q>
<h3>Bilder und Maps</h3>
<img src ="planets.gif" width="145" height="126"
alt="Planets" usemap ="#planetmap" />
<map id ="planetmap" name="planetmap">
<area shape="rect" coords="0,0,82,16" href="sun.htm" alt="Sun" />
<area shape="circle" coords="9,5,3" href="mars.htm" alt="Mars" />
</map>
<a href="#oben">nach oben</a>
</body>
</html>
Frage 5.3
Womit wird die eigentliche Überschrift im Body eines Dokuments gekennzeichnet?
a)
<heading>
b)
<head>
c)
<h1>
d)
<h6>
e)
<title>
43
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.2 HTML Hyper Text Markup Language
Frage 5.3
Was ist der Unterschied zwischen
<title>
und
Frage 5.4
Was ist der Unterschied zwischen
<ol>
<ul>?
Aufgabe 5.2
und
<h1>?
Wann sollten Sie was einsetzen?
Erstellen Sie eine chinesische Seite. Achten Sie auf einen geeigneten Zeichen-
satz, Schreibrichtung und das Language-Attribut im HTML-Tag.
Formulare in XHTML 1.0 strict
Listing 5.6: HTML - Formulare
<form method="get" action="TuEs.php">
<fieldset>
<legend>Persönliche Daten</legend>
<label for="name">Name</label>
<input type="text" id="name" size="10" />
<label for="vorname">Vorname</label>
<input type="text" id="vorname" size="10" />
</fieldset>
<fieldset>
<legend>Vorlesung</legend>
<label for="vorlesung">Vorlesung</label>
<select id="vorlesung" >
<optgroup label="Anwendungsentwicklung">
<option value="Herr">EWA</option>
<option value="Frau">GUI</option>
</optgroup>
<optgroup label="Datenbanken">
<option value ="Frau Dr">Datenbanken 1</option>
<option value ="audi">Datenbanken 2</option>
</optgroup>
</select><br />
<textarea rows="2" cols="20">
Kommentar
</textarea>
</fieldset>
<p>
<button type="submit">senden</button>
</p>
</form>
Formulare, ihre konsistente Darstellung und Validierung spielen in nahezu jedem Webprojekt
eine Rolle. Daher wird auch an einem Standard gearbeitet (XForms), der die Erstellung von
Formularen vereinfacht. Lesen Sie hierzu unter Orbeon: XFORMS weiter.
Tabellen in XHTML 1.0 strict
Listing 5.7: HTML - Tabellen
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="de" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>
Tabelle mit Überschriften
</title>
44
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.3 Maÿnahmen für Barrierefreiheit
</head>
<body>
<table border="1"
summary="This table charts the number of
cups of coffee consumed by each senator,
the type of coffee (decaf or regular),
and whether taken with sugar." >
<caption>Cups of coffee consumed by each senator</caption>
<tr>
<th id="header1">Name</th>
<th id="header2">Cups</th>
<th id="header3" abbr="Type">Type of Coffee</th>
<th id="header4">Sugar?</th>
</tr>
<tr>
<td headers="header1">T. Sexton</td>
<td headers="header2">10</td>
<td headers="header3">Espresso</td>
<td headers="header4">No</td>
</tr>
<tr>
<td headers="header1">J. Dinnen</td>
<td headers="header2">5</td>
<td headers="header3">Decaf</td>
<td headers="header4">Yes</td>
</tr>
</table>
</body>
</html>
Aufgabe 5.3
Stellen Sie Ihren Stundenplan in Form einer einfachen Tabelle dar, die auch von
Screenreadern gut umgesetzt werden kann.
5.3 Maÿnahmen für Barrierefreiheit
Berücksichtigen Sie bei der Entwicklung Ihrer Seiten folgende Hinweise, führen Sie anschlieÿend
die in Abschnitt 3.6.3 erwähnten Tests durch und setzen Sie die Ergebnisse geeignet um.
•
Bilder und Co: Stellen Sie alternative Texte für Graken und Bilder über das alt-Attribut
zur Verfügung.
•
Links: Der Text sollte selbsterklärend sein, auch innerhalb einer extrahierten Linkliste.
Vermeiden Sie Links wie mehr oder hier klicken, vermeiden Sie gleiche Texte für verschiedene Ziele. Idealerweise fängt jeder Link mit einem Schlüsselwort an, so dass sich blinde
Leute schnell und gut orientieren können.
•
Style: Strikte Trennung zwischen Inhalt und Layout, konsequente Verwendung eines verlinkten Stylesheets.
•
Markup: Verwenden Sie Überschriften, nutzen Sie HTML als semantische Sprache, kennzeichnen Sie Sprachwechsel, heben Sie die Bedeutung von Textabschnitten mit strong
oder emph hervor.
•
Tabellen: Geben Sie Tabellenzusammenfassungen und Spaltenüberschriften an. Die Tabelle sollte Zeile für Zeile lesbar sein.
45
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.3 Maÿnahmen für Barrierefreiheit
•
Formulare: Verwenden Sie Labels für Ihre Eingabefelder, beschriften sie diese möglichst
genau: Nachname anstelle von Name, denn um mit Tab rückwärts zu kommen benötigt
man die Shift- und die Tabtaste, also 2 Tasten. Diese Bedienung fällt manchen Benutzern
schwer. Gewährleisten Sie, dass teilweise ausgefüllte Formulare ihre Werte behalten, falls
die Benutzerin einem Link auf der aktuellen Seite folgt (um beispielweise die BLZ einer
Bank innerhalb eines Überweisungsformulars zu suchen) und dann wieder zum Formular
zurückkehrt. Beschriften Sie alle Schaltächen, andernfalls könnten Benutzer zu Recht
Hemmungen haben, das Formular abzuschicken und damit beispielsweise eine Überweisung zu tätigen. Geben Sie Feedback, auch wenn ein Formular erfolgreich verarbeitet
wurde.
•
Geräteunabhängigkeit: Gewährleisten Sie die Bedienung der Seite mausunabhängig (siehe
hierzu auch Abschnitt 5.3.1).
•
•
Schreiben Sie einfach: Vermeiden Sie verschachtelte Sätze.
Navigationselemente: Stellen Sie eine Sitemap zur Veranschaulichung der Struktur Ihrer
Website sowie ein Breadcrumb auf jeder Seite zur Verfügung. Breadcrumbs zeigen an,
auf welcher Seite man sich aktuell bendet und wie diese Seite in die Hierarchie der
Applikation eingebunden ist. Stellen Sie ein Suche zur Verfügung und markieren Sie die
Treer als Überschriften.
•
Verwenden Sie als Accesskeys ausschlieÿlich die Ziern 0 - 9, da andere Tastaturkürzel
meist auch den Browser selbst bedienen. Denieren Sie diese einheitlich auf jeder Seite.
•
Skalierbarkeit: Wählen Sie ein skalierbares Layout. Falls Sie Icons oder Imagemaps für
Links verwenden, so werden diese nicht mitvergröÿert. Hiervon ist abzuraten.
•
Validieren Sie Ihe Seiten nach XHTML strict und nutzen Sie automatische Testwerkzeuge.
5.3.1 Blinde Menschen
In Deutschland leben ca. 145.000 blinde Menschen. Davon sind viele im Internet. Blinde Menschen nutzen einen Screenreader oder eine Braille-Zeile und die Tastatur zur Navigation. Da
auch sie nicht grenzenlos Zeit haben, lassen sie sich nicht alles vorlesen, sondern scannen die
Seite wie sehende Menschen. Vorgelesen wir auch nicht jeder Tag, sondern nur das semantische
Markup: Links, Listen, Paragraphen, Überschriften u.ä. werden entsprechend angesagt. Eine
Linkliste (es gibt auch eine Überschriftenliste) listet ihnen alle Links einer Seite auf, in dieser
Liste können sie suchen oder sich Link für Link vorlesen lassen. Hilfreich ist es, wenn ein Link
mit einem Schlagwort beginnt, so können sie gleich weiter zum nächsten Link springen, falls
der aktuelle Link nicht ihrem Interesse entspricht. Falls Sie bei einer Liste Graken als Aufzählungszeichen einsetzen, dann verwenden Sie als alt-Tag nur ein Leerzeichen, alt-Tags wie
Dekoratives Bild das einen Punkt darstellt.
machen Blinde wahnsinnig, denn dieser Tag wird
jedesmal mit vorgelesen. Noch besser: verwenden Sie auch hierfür CSS. Grundsätzlich sollte
der Hauptinhalt rasch mit einer Sprungmarke, die ganz vorne im Quelltext steht, erreichbar
sein. Gleiches gilt für die Navigation, sofern sie nicht am Anfang steht. Kennzeichnen Sie einen
Sprachwechsel innerhalb Ihres Dokuments mit dem lang-Attribut, nur so hat der Reader die
Möglichkeit, den Text korrekt vorzulesen. Wenn Sie mehrere Links, die nicht in einer Liste
dargestellt sind, voneinander trennen wollen, dann nutzen Sie hierfür einen Punkt oder Mittelpunkt, der gebräuchliche senkrechte Strich wird auch als solcher vorgelesen und ist eben in
deutsch langsamer zu lesen.
Frage 5.5
Was steht wirklich in BITV, der Verordnung zur Schaung barrierefreier Informati-
onstechnik nach dem Behindertengleichstellungsgesetz? BITV Arbeiten Sie die Verodnung durch
46
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
5.4 Links zum Thema
und notieren Sie sich eine Kurzliste, die Sie beachten möchten.
5.3.2 Flash, JavaScript und Ajax
JavaScript Screenreader ignorieren
JavaScript nicht, insbesondere bei Formularelementen
werden mögliche Ereignisse angesagt und diese können über die Tastatur ausgelöst werden.
Bei Links funktioniert das nicht notwendigerweise. Generell sollten Sie sich auf mausunabhängige Ereignisse konzentrieren, d.h. reagieren Sie auf onfocus
Ajax
oder onblur.
Noch ist es leider so, dass Screenreader mit der automatischen Erneuerung von Teilen ei-
ner Seite nicht geeignet umgehen können. Dabei stellt sich auch die Frage, was denn idealerweise
passieren sollte, wenn sich oberhalb der aktuellen Lesemarke der Inhalt ändert. Üblicherweise
fängt der Screenreader dann an, die Seite wieder von vorne neu zu lesen. Überlegen Sie sich
daher gut, ob Sie Ajax wirklich brauchen und wofür. Überüssig ist es sicher, eine Uhr in die
Seite zu integrieren und die Anzeige sekündlich per Ajax zu aktualisieren. Mehr dazu können
Sie unter AJAX and Screenreaders: When Can it Work? nachlesen.
Flash
Die Richtlinien sind von 1999 und damals war Flash für Blinde nicht bedienbar. Mitt-
lerweile wurden sowohl die Screenreader als auch Flash selbst weiterentwickelt und es gibt wohl
auch hier Maÿnahmen, die den Einsatz von Flash barrierearm gestalten können, siehe hierzu
auch Niqui Merret Flash and Accessibility.
5.4 Links zum Thema
•
•
•
•
•
47
Buch: Professionelle Websites (kostenloser Download)
SELFHTML: Für alles rund ums Web eine gute Adresse
DTD - Document Type Declaration - Das richtige Doctype.
Alle Attribute in XHTML 1.0 Strict.
Anleitung für saubere Strukturierung mit HTML
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6 CSS
Abbildung 6.1: Übliche Layouts von Websites.
Sie wissen nun, wie Sie Inhalte in HTML darstellen. Die Formatierung ist Thema dieses
Kapitels. Abbildung 6.1 zeigt drei verschieden gestylte Seiten bei gleichem HTML. Lassen Sie
sich von der Mächtigkeit von CSS bei Zengarden beeindrucken.
Cascading
1 Style Sheets (CSS) ermöglichen die optische Gestaltung, d.h. die Formatierung
einer HTML-Seite. Mit der Einführung von CSS ist es möglich, Inhalt und Layout von Webanwendungen konsequent voneinander zu entkoppeln. Eine einzelne Datei, das Style Sheet
denierte, wo welcher Inhalt wie zu sehen ist: Farben, Hintergrundbilder, Fonts, Positionierung, eben alles, was mit dem, was wir sehen zusammenhängt. Vor einigen Jahren fand man oft
noch Befehle innerhalb des HTML, die Schriftgröÿe, Farbe, etc. denierte. Auch heute gibt es
noch Seiten, die diese Trennung nicht verfolgen. Welche Gründe sprechen für die Verwendung
von CSS?
•
Die Dateigröÿe ist deutich kleiner und damit können die Seiten schneller geladen werden
viele Quellen berichten von einer Reduktion um 50
•
%.
Konsequente Einhaltung eines einheitlichen Styles, Corporate Identity (CI) ist ohne viel
Disziplin möglich.
•
Insbesondere nachträgliche Designänderungen (auch kleinere) können für alle Seiten einheitlich, schnell und leicht umgesetzt werden. Damit verkürzt sich die Entwicklungszeit
insgesamt.
•
Durch die Verwendung von CSS erhält HTML eine rein semantische Bedeutung: <p>
steht für einen Paragraphen und nicht für einen vertikalen Abstand. h1 und Co strukturieren den Dokumenteninhalt hierarchisch. Die Isolierung optischer Denitionen macht
die Seiten für Blinde zugänglich. Zusätzlich ist die Indizierung und Katalogisierung von
rein semantischen Seiten besser automatisierbar.
•
•
Es ist einfach, wirklich einfach, eine Druckansicht ohne Navigation etc. zu erstellen.
Die konsequente Verwendung von CSS macht die Seite zukunftsfähig, d.h. auch in der
nächsten Browsergeneration könnte die Seite noch wie heute aussehen natürlich nicht
notwendigerweise ;-)
1 Cascading
bedeutet, dass mehrere Formate in einem einzelnen Dokument verwendet werden können. Der
Browser richtet sich nach einer bestimmten Reihenfolge, die als Kaskade bezeichnet wird.
48
6.1 Versionen
Und was spricht gegen CSS?
•
Mit Tabellen lassen sich alle Designvorstellungen für alle Browser leichter umsetzen. Mit
CSS ist es eine groÿe Bastelei, bis eine Seite wirklich so aussieht, wie sie die Designerin
will.
•
Dann muss ich auch noch CSS lernen.
Der erste Punkt ist nicht ganz von der Hand zu weisen, aber etwas Bastelei zu Projektbeginn ist
sicher nicht zu vergleichen mit dem Aufwand, viele hundert Seiten nachträglich auf ein anderes
Aussehen umzubiegen. Denken Sie nur einmal an die vielen Übernahmen von IT-Firmen. Mit
CSS lässt sich das Aussehen einer Seite schnell an den neuen Besitzer und dessen CI anpassen. Der zweite Punkt ist meiner Meinung nach zu ignorieren. Schlieÿlich sollte man sich als
Entwickler daran gewöhnt haben, viele Sprachen und Syntaxen kennenzulernen.
Aufgabe 6.1
Recherchieren Sie die Nachteile von Layouts, die auf Tabellen basieren.
Aufgabe 6.2
Recherchieren Sie die Nachteile von Frames.
6.1 Versionen
CSS 1 gibt es seit 1996. Seit Mai 1998 ist CSS 2.0 empfohlen. CSS 2.1 gibt es als Arbeitsentwurf und unterscheidet sich nicht wesentlich von CSS 2.0. Aber, wenn Implementierungen in
modernen Browsern ganzheitlich vom Standard abweichen, wird der Standard angepasst, man
staune ;-)
Seit 2001 arbeitet man an CSS 3.0, auf Mehrspaltigkeit, Formatierung von Hypertextverhalten (Popups, auf- und zuklappbare Listen, Fuÿnoten), und neue Text- und Hintergrundeekte
darf man momentan nur hoen, denn eine Empfehlung wird es vielleicht demnächst, vielleicht
aber auch erst 2010 geben. Und bis die Browser wirklich mitziehen kann es auch noch dauern.
Wir werden uns im Folgenden an die Spezikation CSS 2.1 halten. Obwohl es nur ein Arbeitsentwurf ist, wird daran schon lange gearbeitet und man steht kurz vor der endgültigen
Empfehlung. Ich möchte mich nicht mit zu alten Versionen beschäftigen. Ob Ihr Style am Ende
funktioniert, müssen Sie ausprobieren. Ich habe kein Problem damit, wenn Sie nach Standard
codieren und es dann nicht in jedem Browser gleich aussieht. Wie auch bei HTML gibt es einen
Validator und diesen Test müssen Sie bestehen.
6.2 Syntax
6.2.1 Einbinden eines Styles
In HTML binden Sie eine Style Datei mit dem link-Tag ein:
Listing 6.1: HTML - Einbinden einer CSS Datei
...
<head>
...
<link rel="stylesheet" type="text/css" href="styles.css"
media="mediatype" />
...
</head>
49
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.2 Syntax
Für das Attribut media können Sie screen, tty (Klienten mit festem Zeichengitter wie Terminals
oder PDAs mit eingeschränkten Darstellungsmöglichkeiten), tv (Fernsehen, d.h. geringere Auflösung und Farben, beschränkte Scrollmöglichkeiten), projection, handheld (kleiner Bildschirm,
begrenzte Bandbreite), print (Druckansicht), braille (Braillezeile), aural (Vorlesegeräte) und all
angeben.
Auf den Print-Style werden wir im Abschnitt 6.7 eingehen.
Frage 6.1
Wie binden Sie Ihre CSS-Datei mystyle.css korrekt in XHTML 1.0 strict ein?
a)
<link rel="stylesheet" type="text/css" href="mystyle.css" media="screen" />
b)
<style src="mystyle.css" />
c)
<stylesheet>mystyle.css</stylesheet>
d)
<link rel="stylesheet" type="text/css" href="mystyle.css">
e)
<cssfile rel="stylesheet" href="mystyle.css" media="screen" />
6.2.2 Selektoren und Grundsyntax
Die Syntax selbst ist sehr einfach:
Listing 6.2: CSS - Syntax Selektor
Selektor {
Eigenschaft-A: Wert-A;
Eigenschaft-B: Wert-B;
}
/∗ Kommentar ∗/
Über den Selektor geben Sie an, auf was sich die Style-Denition bezieht. Ein Stylesheet darf
beliebig viele solcher Regeln enthalten. Selektoren können die folgende Form haben.
Selektor
Bedeutung
*
Selektiert jedes Element
E
Selektiert jedes Element vom Typ E
E F
Selektiert jedes Element F, das ein Nachfahre von
Element E ist
E > F
Selektiert jedes Element F, das ein Kind von E ist
E:rst-child
Selektiert ein Element E, wenn es das erste Kind
des direkten Vorfahren ist
E[foo]
Selektiert
jedes
Element
E,
bei
dem
das
foo-
Attribut gesetzt ist (unabhängig vom Wert)
E[foo=bar]
Selektiert
jedes
Element
E,
bei
dem
das
foo-
Attribut mit dem Wert bar gesetzt ist
.c
Selektiert jedes Element der Klasse c
E.c
Selektiert alle Elemente E der Klasse c
#myid
Selektiert jedes Element mit der ID myid.
E#myid
Selektiert das Element E mit der ID myid.
Tabelle 6.1: CSS Selektoren
50
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.2 Syntax
Frage 6.2
Welche Syntax ist korrekt?
a)
body:color=black
b)
body {color: black}
c)
{body;color:black}
d)
{body:color=black(body}
e)
body>style:{background-color=black;}
6.2.3 Referenz und Validierung
Mit CSS können Sie nahezu alles denieren, die Bedeutung der meisten Eigenschaften ist selbsterklärend, die genaue Denition können Sie der Vollreferenz zu CSS 2.1 entnehmen oder auch
direkt unter W3C Spezikation CSS 2.1 nachsehen.
Wie bei HTML gibt es auch einen Validator für CSS, unter Options können Sie einstellen,
nach welcher Version Sie validieren möchten: CSS Validator
Eigenschaften
Die Möglichkeiten sind vielfältig und viele Eigenschaften selbsterklärend, jedenfalls kann man
eine Ahnung bekommen, was welcher Befehl machen könnte und der Rest ist Ausprobieren und
Recherchieren:
background, background-attachment, background-color, background-image,
background-position, background-repeat, border, border-collapse,
border-color, border-spacing, border-style,
border-[top|right|bottom|left], border-[top|right|bottom|left]-color,
border-[top|right|bottom|left]-style,
border-[top|right|bottom|left]-width, border-width, bottom, caption-side,
clear, clip, color, content, counter-increment, counter-reset, cursor,
direction, display, empty-cells, float, font, font-family, font-size,
font-size-adjust, font-stretch, font-style, font-variant, font-weight,
height, left, letter-spacing, line-height, list-style, list-style-image,
list-style-position, list-style-type, margin,
margin-[top|right|bottom|left], marker-offset, max-height, max-width,
min-height, min-width, orphans, outline, outline-color, outline-style,
outline-width, overflow, padding, padding-[top|right|bottom|left],
page-break-after, page-break-before, page-break-inside, position,
quotes, right, table-layout, text-align, text-decoration, text-indent,
text-shadow, text-transform, top, unicode-bidi, vertical-align, visibility,
white-space, width, windows, word-spacing, z-index.
Regeln
Es ist möglich, einen Style auf mehrere Dateien aufzuteilen (import). Das eingebundene CSS
erbt den Zeichensatz des HTML-Dokuments. Es ist jedoch auch möglich, einen eigenen Zeichensatz zu setzen.
51
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.2 Syntax
Listing 6.3: CSS - Regeln, insbesondere import
@import "mystyle.css";
@import url("mystyle.css");
@charset "ISO-8859-1";
6.2.4 Layout
Betrachten Sie zunächst ein einfaches Beispiel.
Listing 6.4: HTML - Grundgerüst für CSS Anweisungen
<h1>CSS Beispiel</h1>
<div id="links">Links gefloateter Text</div>
<p class="daneben">Ein Text mit einem schönen Rahmen</p>
Sie haben nun folgende Möglichkeiten zur Formatierung: Sie können body, h1 und p generell
formatieren und zusätzlich das Aussehen der Klasse daneben und des Blocks links
bestimmen
Sie könnten auch nur die p Tags, die auf ein h1 Tag folgen formatieren (vgl. Tabelle 6.1):
Listing 6.5: CSS - Einfaches Beispiel
body {
line-height:1.3em;
}
h1 {
font-size: 1.5em;
color:red;
}
.daneben {
background-color: yellow;
}
div#links {
float: left;
width: 20%;
background-color: gray;
}
Haben Sie eine Idee, wie die Seite aussehen könnte? Gehen wir die Denitionen nacheinander durch: Zunächst wird der Zeilenabstand zur besseren Lesbarkeit allgemein erhöht (body,
line-height).
Die Überschrift
h1
wird in rot und in der 1,5 fachen Gröÿe des Buchstabens m
der eingestellten Schriftgröÿe des Browsers dargestellt. HTML wird im Browser nacheinander
dargestellt, als nächstes ist der Block
div links
zu betrachten: Es entsteht ein links ieÿender
Bereich der Breite 20% mit einem grauen Hintergrund. Zum Schluss betrachten wir den Paragraphen der Klasse daneben: Dieser hat einen gelben Hintergrund. Haben Sie nun ein Bild vor
Augen? Geben Sie die Dateien einmal ein und schauen Sie sich das Ergebnis in verschiedenen
Browsern an. Erzeugen Sie sich mit einem Blindtextgenerator (diesen Begri einfach in eine
Suchmaschine eingeben) zusätzlichen Text und füllen Sie diesen in den Paragraphen und das
Div ein. Wie schaut es nun aus? Entfernen Sie oat oder width, spielen Sie mit dem Style! So
bekommen Sie ein Gefühl für die Denitionen und wie sie sich gegenseitig beeinussen: z.B.
funktioniert oat ohne width nicht.
Vor CSS wurde das Layout einer Seite häug über Tabellen deniert, viele Seiten bestehen
aus einem Kopf, zwei oder drei Spalten und einem Footer. Um diese Boxen denieren zu können,
52
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.3 Vorgehensweise zur Umsetzung eines Layouts
Abbildung 6.2: Übliche Layouts von Websites.
stellt CSS ein Boxmodell zur Verfügung. Im Wesentlichen deniert man eine Box, deren Innenabstand (padding) des Inhalts zum Rahmen (border) der Box, den Auÿenabstand (margin) zu
anderen Elementen der HTML-Seite, den Rahmen selbst, ihre Gröÿe, Hintergrundfarbe, ihre
Position und ob der Text ieÿen soll.
Aufgabe 6.3
Veranschaulichen Sie die Eigenschaften padding, margin, width und height gra-
phisch.
Positionierung
Ohne CSS versucht der Browser die Elemente in der Reihenfolge, wie sie im HTML stehen, anzuordnen: Erstes Element oben links, dann nach rechts auüllen bis der Browserrand erreicht
ist und ab in die nächste Zeile. Um dieses Fluss zu steuern können Sie die Positionierungseigenschaften von CSS nutzen. Mit top und left kann die Position der Box deniert werden, zusätzlich
kann man noch angeben, wie diese Positionierung zu verstehen ist (Standard ist
static!).
static: Positionierung ohne Style.
absolute: obere linke Ecke in Relation zum Elternelement, scrollt mit.
xed: ähnlich wie absolut, nur in Relation zum Fenster, d.h. beim Scrollen bleibt es genau, wo
es ist.
relative:
Orientiert sich an static und verschiebt das Element relativ dazu.
Am häugsten werden Sie vermutlich absolute verwenden und in seltenen Fällen auch xed.
Aufgabe 6.4
Versuchen Sie die Beispiele, wie sie in Abbildung 6.2 zu sehen sind, umzusetzen.
6.3 Vorgehensweise zur Umsetzung eines Layouts
Wenn Sie von einem Designer oder aufgrund einer vorgegebenen Corporate Identity (CI) ein
Layout mit CSS umsetzen müssen, dann empehlt sich folgende Vorgehensweise:
1. Container erkennen und benennen (identizieren)
2. Markup erstellen, Doctype hinzufügen
3. Markup validieren !!!
4. Positionierungsmethoden auswählen
53
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.4 CSS und Barrierefreiheit
Abbildung 6.3: Container mit Flusseigenschaften
5. Boxen durch Farben kennzeichnen, um Ihre Gröÿe und Ausrichtung besser erkennen zu
können
6. Inhalt (Blindtext) hinzufügen
7. Markup im Kontainer inkl. Gestaltung
8. Druckstyle
Abbildung 6.3 zeigt ein Boxenmodell mit ersten Flusseigenschaften.
Dieses Grundmodell können Sie schrittweise verfeinern und validieren, bis Sie das gewünschte
Aussehen erhalten.
Aufgabe 6.5
Wenden Sie das eben eingeführte Schema auf die Fachbereichsseite an. Verglei-
chen Sie (anschlieÿend!) Ihr Ergebnis mit dem Stylesheet des Fachbereichs. Erstellen Sie eine
Druckansicht.
6.4 CSS und Barrierefreiheit
Einige Screenreader lesen mit
display:none formatieren Text nicht vor. Wenn Sie extra Links
etc. für Screenreader einbauen wollen, die aber sonst nicht sichtbar sein sollen, dann positionieren Sie diese auÿerhalb des sichtbaren Bereichs mit
Listing 6.6: CSS - Alternative zu display:none
.abseits {
position: absolute;
left: -1000px;
top: -1000px;
width:0px;
height: 0px;
overflow:hidden;
display:inline;
}
54
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.5 Tipps
Abbildung 6.4: Designproblem: Gleich lange Spalten
6.5 Tipps
6.5.1 Einheiten
Box : Egal, für welche Einheiten Sie sich entscheiden (%, px oder em), versuchen Sie diese nicht
innerhalb einer Eigenschaftsklasse zu mischen: Wenn Sie die Breite innerhalb eines Selektors
mit
% angegeben haben, dann sollten Sie auch für alle anderen Boxen % verwenden. Probieren
Sie die verschiedenen Einheiten aus. Wie verhält sich welche Einheit, wenn Sie die Fenstergröÿe
variieren. Was passiert, wenn Sie mit unterschiedlichen Einheiten arbeiten?
Schriftgröÿe
: Versuchen Sie die Schriftgröÿe in em anzugeben, damit wird die Schrift relativ
zur Browsereinstellung angegeben, diese kann dann sogar mit STRG und Mausrad verändert
werden.
6.5.2 Problem: Gleichlange Spalten
An folgendem Problem lassen sich die vielfältigen Herangehensweisen und auch die momentanen
Hürden von CSS gut veranschaulichen. Stellen Sie sich eines der Layouts von Abbildung 6.2
vor. Sie werden schnell das CSS für die Spalten codiert haben. Wenn Sie nun unterschiedlich
viel Text in die Spalten packen, dürfte Ihr Layout vermutlich wie in Abbildung 6.4 unter b)
aussehen. Wie können Sie gleich groÿe Spalten erhalten?
Einfachste Lösung: Ignorieren
Sie veruchen den Graphiker und machen technische Schwierigkeiten geltend. D.h. Sie setzen
die Designvorgabe nicht um. Sie verweisen auf die kommende Version CSS 3.0, die sicher 2010
kommen wird.
Einfache Lösung: Hintergrundbild
Sie arbeiten mit festen Breiten und absoluter Positionierung. Mit einem Bildverarbeitungsprogramm erstellen Sie eine Zeile Ihres Layouts (wie ein Bildausschnitt aus Abbildung 6.2 der Höhe
10 px o.ä.). Für den Selektor body geben Sie dieses Bild als Hintergrundbild an und lassen es
mit background-repeat und repeat-y wiederholen. Nachteil: Verändern der Fenstergröÿe kommt
nicht gut.
55
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.5 Tipps
Noch eine einfache Lösung: Groÿe Mindesthöhe
Setze Sie das Attribut height der Seitenblöcke auf einen maximalen Wert, z.B. 1000px, und
die Hintergrundfarbe des Bodys mit der Hintergrundfarbe des Inhalts gleich. So wird bei kürzerem Inhalt der Hintergrund mitgeführt und bei kleiner Navigation und langem Inhalt der
Hintergrund zum groÿen Teil mitgeführt.
Alternative Lösung: Fixed und mitscrollen
Sie können sich natürlich auch dafür entscheiden, die Navigation mit xed immer mitzuscrollen.
Aufwändigere Lösung: Verwendung eines Kontainers
Bei alistapart nden Sie eine aufwändigere Lösung. Der Trick besteht in der Verwendung eines
Kontainers, der die Farben und Breiten der zugehörigen Spalten über die Ränder deniert.
Schauen Sie sich den Code einfach mal in Ruhe an.
Listing 6.7: CSS - Mehrspaltiges Layout
#container{
background-color:white;
float:left;
width:70%;
/∗ Farbe und Breite der linken Spalte: ∗/
border-left:150px solid silver;
/∗ Farbe und Breite der rechten Spalte: ∗/
border-right:200px solid red;
display:inline; /∗ braucht IE ∗/
}
#linkeSpalte{
float:left;
width:150px;
margin-left:-150px;
position:relative;
}
#center{
float:left;
width:100%;
margin-right:-100%;
}
#rechteSpalte{
float:right;
width:200px;
margin-right:-200px;
position:relative;
}
/∗ zugehöriger HTML−Code:
<div id="container">
<div id="center">...</div>
<div id="linkeSpalte">...</div>
<div id="rechteSpalte">...</div>
</div>
∗/
56
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.6 Struktur einer CSS Datei
Fazit
Sie sehen, es gibt für alles auch eine CSS Lösung UND diese wird unter CSS 3.0 einfacher aussehen! Halten Sie sich, sofern Sie keine strengen Vorgaben haben, nicht zu lange an bestimmten
Designvorstellungen auf, sondern versuchen Sie die Seite gut bedienbar und funktional zu gestalten.
6.5.3 Hintergrund
Während der Entwurfsphase ist es sinnvoll, für jede Box/Denition eine Hintergrundfarbe zu
vergeben, so sehen Sie unmittelbar, wo welcher Bereich ist. Wenn Sie eine Hintergrundfarbe denieren, dann denieren Sie bitte auch eine passende Vordergrundfarbe dazu und umgekehrt.
Warum?
6.6 Struktur einer CSS Datei
Die Vorlesung soll Sie auch für die Mitarbeit in Groÿprojekten t machen. Ab einer gewissen
Projektgröÿe sind Standards einfach wichtig. Obwohl Sie in dieser Vorlesung kein wirklich groÿes
CSS denieren werden, ist es ratsam, sich auch bei kleineren Projekten eine feste Struktur
vorzugeben. So wundert man sich später nicht, wenn irgendeine Denition nicht greift, weil sie
später beispielsweise doch noch mal überschrieben wird. Zunächst ein Wort zu Kommentaren:
Kommentieren Sie Ihre CSS Datei ausreichend. Halten Sie fest, wo Sie Probleme hatten und
warum Sie sich für diese Denitionen entschieden haben. Dies kann zum Teil im Dateikopf
passieren, sollte aber auch im Code selbst passieren. Fangen Sie jede Datei mit einem Kopf wie
folgt an, persönliche Neigungen können natürlich eingearbeitet werden.
Listing 6.8: CSS - kommentierter Kopf
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Datei: styles . css
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Verantwortlich: [email protected]
Media: screen
Gliederung:
1.0 Schriften ...
Änderungen:
01.01.2007 Utr: added position absolute to ...
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
Die Organisation und Strukturierung von CSS Dateien beschreibt zwei empfohlene Vorgehensweisen, eine inhaltlich/funktionell orientierte Struktur und eine layoutorientierte Struktur.
Entscheiden Sie selbst.
Listing 6.9: CSS - Dateistruktur
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Dateistruktur inhaltlich / funktionell
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
1.0 Schriften
1.1 Titel
1.2 Paragraphen
1.3 Text
2.0 Farben
57
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
6.7 Druckansicht
3.0 Tabellen
4.0 Formulare
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
/∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
Dateistruktur layoutorientiert
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗
1.0 Layoutstruktur
2.0 Header
2.1 Head
2.2 unsichtbare Links wie "zum Inhalt"
3.0 Inhalt
3.1 Hauptinhalt
3.2 eventuelle Kommentare, übliche rechte Seite
4.0 Navigation
4.1 Hauptnavigation
4.2 Seitennavigation
6.0 Footer
∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗∗/
Sie können auch alle Denitionen alphabetisch sortieren.
6.7 Druckansicht
Um eine Seite zu drucken, sind zwei Dinge wichtig:
•
•
Verstecken Sie die Navigation, Header etc. mit display:none.
Verwenden Sie bei der Styleinkludierung media=print .
Aufgabe 6.6
Es gibt auch noch weitere Optionen bzgl. Seitenlänge und Seitenumbruch. Arbei-
ten Sie die Beschreibung der Seitenorientierte Eigenschaften durch und erstellen Sie eine gute
Druckansicht Ihrer Praktikumsseite.
6.8 Testen
Sie sollten Ihre Applikation in Hinblick auf unterschiedliche Auösung, Clients und Browser
testen. Die aktuellen Zahlen, was wie verbreitet ist, können Sie Browser Statistiken entnehmen.
6.9 Links zum Thema
•
•
•
•
•
•
•
•
53 CSS Tipps.
Zengarden (vielfältiges Design bei gleichem HTML-Code).
W3C: Tabellenloses Layout,
The Style Works: Viele Tipps, Referenz, Links zu CSS Anleitungen, etc.
W3C CSS2.1 ozielle Referenz
CSS Validator
Deutschsprachige Einführung
Herangehensweise an ein mehrspaltiges Layout und generell eine gute Adresse für barrierefreie Seiten
•
•
58
Schrittweise Anleitung für ein einfaches mehrspaltiges Layout
W3C: Gute Links zu CSS
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7 PHP
Sie wissen nun, wie Sie eine HTML-Seite erstellen und diese schön formatieren, wunderbar.
Fertig sind wir damit noch lange nicht, denn einerseits müssen Sie in jeder Seite den Header,
die Navigation und den Footer einbauen. Angenehmer ist es, diese Teile in einer Datei zu
speichern bzw. das Menü am Besten dynamisch zu erzeugen. Es fehlt auch die Kommunikation
mit der Benutzerin. Wie war das mit der Abgabe von Bewertungen? Diesen Problemen werden
Sie mit der serverseitigen Scriptsprache PHP begegnen.
7.1 Allgemein
7.1.1 Konguration
Neben den Hinweisen, wie sie in Abschnitt 1 beschrieben sind, sind weitere Einstellungen sinnvoll. Die Konguration für eine einzelne Website erfolgt in der Datei .htaccess des jeweiligen
Verzeichnisses der Applikation. Üblicherweise verwendet man die Erweiterung .php, dies lässt
sich jedoch auch ändern:
ErrorDocument 404 /fehlerseite404.html
Options +Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
AddType application/x-httpd-php .htm .html
Hinweis: Apache empehlt, nicht alle html Dateien zu parsen, da dies wenig performant
ist. Um möglichen Angreifern die Verwendung von PHP nicht auf dem Präsentierteller zu
servieren, wird jedoch die Endung .html empfohlen. Dieses Ziel kann jedoch auch mit einer
anderen Methode erreicht werden: Verwenden Sie das Modul mod_rewrite, das in Abschnitt
7.6 kurz eingeführt wird.
Einstellungen für PHP werden in der verwendeten php.ini vorgenommen. Achtung: Bei
XAMPP ist die verwendete ini unter
xampp\apache\bin. Damit die Änderungen wirksam wer-
den, müssen Sie den Apache neu starten. Ohne eigenen Webserver, d.h. bei Verwenden eines
Providers, haben Sie üblicherweise keinen Zugri auf die php.ini. Viele Ini-Parameter lassen
sich jedoch auch in der Datei .htaccess denieren (siehe Abschnitt 1).
Kongurationen, die den Server betreen, können in der http.conf vorgenommen werden,
z.B. können Sie das Startverzeichnis Ihres Servers mit DocumentRoot verlegen, Details: Apache
Kernfunktionen.
7.1.2 Einbinden von PHP Befehlen
Es werden vier Arten zum Einbetten von PHP Befehlen unterstützt:
Listing 7.1: HTML - Einbinden von PHP
<html>
<body>
<? echo 'Short Tags - häufig', aber unter 5.2.0 deaktiviert ?>
59
7.1 Allgemein
<br />
<?php echo 'Long Tags - empfohlen' ?>
<br />
<%= 'ASP Tags - benötigen setting in php.ini' %>
<br />
<script language="php">
echo 'Really Long Tags - selten';
</script>
<br />
</body>
</html>
Halten Sie sich an die empfohlene Variante.
7.1.3 Kommentare
Listing 7.2: PHP - Kommentare
<?php
/∗ für lange Kommentare ∗/
// Einzeiler
# auch ein Einzeiler , aber nicht empfohlen
?>
Kommentieren Sie ausreichend und verwenden Sie gleich Kommentare,
die von phpDoc umgesetzt werden können: http://phpdoc.org/
/∗∗
∗ Beschreibung der Funktion
∗ @param bool $access
∗ @return string
∗/
7.1.4 Coding Standards
Ein Coding Standard regelt, wie der Source Code eines Programms aussehen sollte. Er gibt Hinweise zur Dokumentation im Code, regelt die Benennung von Variablen und Klassen und hilft
so, dass andere Programmierer, schneller in den Code einsteigen können und beispielsweise bei
einer Urlaubsvertretung Fehler beseitigen können. Sie haben sicher auch schon Programmcode
gesehen, über den Sie länger brüten mussten, bis Sie überhaupt den Sinn und Zweck erfasst
haben. Durch ausreichende Dokumentation und klarer Benennung wird dies erleichtert, sie erkennen auf den ersten Blick, ob die Variable privat oder public deklariert wurde, ohne im Code
nach oben springen und die zugehörige Denition suchen zu müssen. Weitere Argumente für
die Verwendung eines Codings Standards nden Sie beispielweise unter PHP Coding Standard
oder googeln Sie den Begri.
Bei der Bennennung von Variablen und Klassen hat sich neben der ungarischen Notation,
die sukzessive verdrängt wird, folgende Schreibweise herauskristallisiert:
Pascal case:
Erster Buchstabe und alle weitere Wörter fangen mit einem Groÿbuchstaben an,
z.B. PascalCase.
Camel case:
Erster Buchstabe wird klein geschrieben, alle weiteren Wörter fangen mit einem
Groÿbuchstaben an, z.B. camelCase.
Upper case:
Underscore:
60
Alles wird groÿ geschrieben, z.B. GLOBAL, IO.
Einzelne Wörter werden durch ein _ getrennt, z.B. user_id.
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
Verwenden Sie einen coding standard, z.B.
•
·
pear Coding Standard
Klassen fangen mit einem Groÿbuchstaben an und einzelne Packages werden durch _
getrennt, z.B. HTML_Upload_Error.
•
Methoden camelCase, der Paketname wird mit _ vorangestellt, z.B.
bzw. mit Paket
buildSomeWidget()
XML_RPC_serializeData(). Auf diese Weise können Sie für sich Namens-
räume einführen, die es in PHP eigentlich nicht gibt.
•
•
_sort(), _initTree().
geschrieben, z.B. MAX_FILE_SIZE.
Private Variablen und Methoden fangen mit einem _ an, z.B.
Konstanten werden in Groÿbuchstaben und mit _
Oder den von Microsoft:
•
•
•
•
•
Klassen, Interfaces, Methoden, public Variablen, also alles Öentliche: Pascal case.
Parameter, lokale Variablen, d.h. alles Private Camel case.
Klassen fangen mit einem Nomen an, z.B. FileStream.
Interfaces fangen mit einem I an, z.B. IServiceProvider.
Methoden und Funktionen fangen mit einem Verb an, z.B.
RemoveAll().
7.2 PHP - die Sprache
7.2.1 Sprachbesonderheiten
PHP ist ein Mix aus verschiedenen Sprachen, daher hier einige Besonderheiten, die zu beachten
sind.
Stringverkettung erfolgt mit einem Punkt (.) und nicht mit + oder &
Zugri auf Klassenmethoden und -Member mit -> und nicht mit
einem Punkt (Bsp:
$file->getFileName());
Zugri auf statische Methoden erfolgt mit ::, z.B. DB::errorMessage().
Vergleich Neben einem normalen Vergleich == gibt es auch einen typisierten Vergleich (===).
7.2.2 Variablen und Konstanten
•
Variablen beginnen immer mit einem $, danach folgt ein Buchstabe oder _, erst danach
sind Zahlen erlaubt.
•
•
•
•
•
•
Kein fester Typ für eine Variable.
Variablen brauchen nicht deklariert zu werden.
Typ der Variablen wird von letzter Zuweisung bestimmt.
Konstanten:
define("Name",Wert) Konstanten werden ohne $ über Namen angesprochen
Datentypen: Boolean, Integer, Double, String, Array, Object
DatentypenTyp-Casting für die Basisdatentypen möglich:
$ganz=(int) "12.45";,
d.h.
ein Casting auf Unterklassen etc. ist nicht möglich.
Tests, welcher Datentyp gerade verwendet wird:
is_bool(); is_int(), is_null(). Da Vaisset() getestet werden, ob die Variable
riablen nicht initialisiert werden müssen, kann mit
gesetzt wurde.
61
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
Listing 7.3: PHP - Variablen, Strings und Arrays
<?php
$a = 'can'; $b = 'forms';
$str1 = 'Let\'s use literals.'; // Single−quoted
$str2 = "\nEmbeded vars {$a} come in many $b.\n"; // Double−quoted
$str3 = <<<HEREDOC
we even support Perl like syntax.
HEREDOC;
?>
echo $str1.nl2br($str2).nl2br($str3);
/∗ Arrays einfache und assoziative ∗/
$zahlen = array(1,2,3,4);
$mitglieder = array(
"John" => 5,
"Daniel" => 3,
"Julie" => 2
);
echo $mitglieder["Julie"];
7.2.3 Einbinden (include) von Dateien
Die Anweisungen
include
oder auch
require
binden die angegebene Datei ein und werten
diese aus. Diese beiden Konstrukte sind an sich gleichwertig mit der einen Ausnahme: der
include erzeugt ein Warning während require in einem Fatal Error
require_once bindet eine Datei ein und wertet diese zur Laufzeit des
Verhalten ist ähnlich der Anweisung require mit dem einzigen Unterschied,
Umgang mit Fehlern:
endet. Die Anweisung
Skripts aus. Das
dass einmal eingebundener Code aus einer Datei nicht noch einmal eingebunden wird.
Listing 7.4: PHP - include und require
include 'vars.php';
require 'prepend.php';
7.2.4 Arrays
implode
-
Stringdarstellung
implode(string glue, array pieces)
eines
Arrays
Die
Funktion
gibt einen String mit einer String-Repräsentation
aller Array-Elemente in der gleichen Reihenfolge wie in dem Array zurück, bei dem die
einzelnen Array-Elemente mit dem im Parameter glue angegebenen String verbunden werden.
Listing 7.5: PHP - implode
$array = array('lastname', 'email', 'phone');
$comma_separated = implode(",", $array);
echo $comma_separated; // lastname,email,phone
explode
-
Einen
String
in
ein
Array
verwandeln
explode(string delimiter, string string [, int limit])
Die
Funktion
gibt ein Array aus Strings
zurück, die jeweils Teil von string sind. Die Abtrennung erfolgt dabei an der mit delimiter
angegebenen Zeichenkette (ein oder mehrere Zeichen). Ist der Parameter limit angegeben,
62
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
werden maximal limit Teile zurück gegeben. Das letzte Element enthält dann den kompletten
Rest von string.
Listing 7.6: PHP - explode
$pizza = "Teil1 Teil2 Teil3 Teil4 Teil5 Teil6";
$teile = explode(" ", $pizza);
echo $teile[0]; // Teil1
echo $teile[1]; // Teil2
merge - Arrays verbinden
array_merge(array1 array2 \ldots )
fügt die Elemente von
einem oder mehreren Arrays zusammen, indem die Werte des einen an das Ende des anderen
angehängt werden. Das daraus resultierende Array wird zurückgegeben. Haben die angegebenen
Arrays die selben String-Schlüssel, dann wird der hintere Wert dieses Schlüssels den vorhergehenden überschreiben. Haben die Arrays den gleichen numerischen Schlüssel, dann wird der
hintere Wert den vorhergehenden nicht überschreiben, sondern angehängt. Falls nur ein Array
angegeben und dieses numerisch indiziert ist, wird das Array fortlaufend neu nummeriert.
63
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
Listing 7.7: PHP - array Anwendungsbeispiel
$kleineseinmaleins=array(
array(0,0,0,0,0,0,0,0,0,0),
array(0,1,2,3,4,5,6,7,8,0),
array(0,2,4,6,8,10,12,14,16,18)
);
$fortsetzung=array(
array(0,3,6,9,12,15,18,21,24,27),
array(0,4,8,12,16,20,24,28,32,36),
array(0,5,10,15,20,25,30,35,40,45)
);
$kleineseinmaleins=array_merge($kleineseinmaleins, $fortsetzung);
echo $kleineseinmaleins[5][5]; // 25
bool sort ( array &array [, int sort_flags] )
/∗ Diese Funktion sortiert ein Array. Die Elemente werden
aufsteigend vom niedrigsten zum höchsten Wert sortiert. ∗/
$fruits = array("Zitrone", "Orange", "Banane", "Apfel");
sort($fruits);
foreach ($fruits as $key => $val) {
echo "fruits[" . $key . "] = " . $val . "<br>";}
7.2.5 Stringmwandlung in HTML-Code
get_html_translation_table([int table [, int quote_style]]) gibt die UmwandlungsTabelle zurück, die intern in den Funktionen htmlspecialchars() und htmlentities() verwendet wird.
Listing 7.8: PHP - Translation Table
$trans = get_html_translation_table(HTML_ENTITIES);
$str = "Hallo & <Frau> & Krämer";
$encoded = strtr($str, $trans);
echo $encoded; // Hallo &amp; &lt;Frau&gt; &amp; Kr&auml;mer
7.2.6 Anzeigen der Systeminformationen
Nutzen Sie die Funktion
phpinfo(),
um einzelne Settings zu überprüfen.
7.2.7 Dateiverarbeitung
fopen(string filename, string mode, ...) bindet eine benannte Resource, welche mittels
lename speziziert wurde, an einen Stream. Hat lename die Form schema://... wird angenommen, dass es sich hier um eine URL handelt und PHP sucht nach einem Protokollhandler
(auch als Wrapper bekannt) für dieses Schema. Sind keine Wrapper für dieses Protokoll registriert, gibt PHP als Hilfe zum Verfolgen potentieller Probleme in Ihrem Skript einen Hinweis
aus und setzt dann weiter fort, obwohl lename eine reguläre Datei speziziert. Beispiel:
Listing 7.9: PHP - Dateibearbeitung
$file = fopen("sample.txt", "r");
while (!feof($file)) {
echo fgets($file), "<BR>";
}
64
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
/∗ Datei über URL lesen ∗/
$file = fopen("http://www.php.net/file.txt", "r");
In eine Datei schreiben
file_put_contents("agent.log", $HTTP_USER_AGENT, FILE_APPEND);
BESSER:
if ($fh = fopen($filename, "r")) {
# Processing
fclose($fh);
}
7.2.8 File Upload
Die Funktion
mit
filename
move_uploaded_file(string filename, string destination)
prüft, ob die
bezeichnete Datei eine gültige Upload-Datei ist (d.h., dass sie mittels PHPs
HTTP POST Upload-Mechanismus upgeloaded wurde). Ist die Datei gültig, wird sie zum in
destination
bezeichneten Dateinamen verschoben.
Listing 7.10: PHP - Dateiupload
$uploaddir = '/var/www/uploads/';
if (move_uploaded_file($_FILES['userfile']['tmp_name'],
$uploaddir . $_FILES['userfile']['name'])) {
print "File is valid, and was successfully uploaded.";
} else {
print "Possible file upload attack! Details:\n";
print_r($_FILES);
}
Eine gute Anleitung, wie Sie auf dem Client mit Hilfe von Javascript den Fortschritt des
Uploads anzeigen können, nden Sie unter Tracking le upload progress.
7.2.9 Zufall
Wie üblich wird ein fester Generator verwendet, der initialisiert werden kann, um nicht immer
wieder die gleiche Abfolge von Zahlen zu erhalten. Hier ein kleines Beispiel, das die Systemzeit
bei der Initialisierung verwendet:
Listing 7.11: PHP - Zufall
for ($i = 1; $i <= 10; $i++) {
srand((double)microtime() * 100000);
$zufall = rand(1, 100);
echo $zufall . "<br>";
}
7.2.10 Kontrollstrukturen und Schleifen
Es gibt die üblichen Strukturen if, switch, while, etc. Die Syntax wird an den Beispielen deutlich.
Listing 7.12: PHP - Kontrollstrukturen und Schleifen
if (($a > 10) && ($a < 100)) {
print "a ist zwischen 10 und 100";
65
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
} elseif (($a < 0) || ($a > 1000)) {
print "a darf weder negativ noch über 1000 sein";
} else {
print "das will ich nicht"
}
$i = 1;
while ($i <= 10) {
echo $i++;
/∗ es wird erst $i ausgegeben, bevor der Wert
erhöht wird (Post−Inkrement) ∗/
}
$i = 0;
do {
echo $i;
} while ($i>0);
for ($i = 1; $i <= 10; $i++) {
echo $i;
}
$arr = array("eins", "zwei", "drei");
foreach ($arr as $value) {
echo "Wert: $value<br />\n";
}
switch ($i) {
case 0:
echo "i ist
break;
case 1:
echo "i ist
break;
case 2:
echo "i ist
break;
default:
echo "i ist
}
gleich 0";
gleich 1";
gleich 2";
weder 0, 1 noch 2";
7.2.11 Abbrechen und Fortsetzen von Anweisungssequenzen
break bricht die Ausführung der aktuellen for, foreach, while, do..while Schleife oder einer
switch Anweisungssequenz ab. Einem break kann optional ein numerisches Argument angehängt werden, das die Anzahl der abzubrechenden Befehlssequenzen enthält. continue wird
innerhalb von Schleifen verwendet. Die Schleife wird an der aktuellen Stelle abgebrochen und es
wird der nächste Durchlauf begonnen. Anmerkung: Beachten Sie, dass in PHP die switch Anweisung als Schleifenstruktur zum Zweck von
continue
angesehen wird. Bei
continue
können
Sie ein optionales numerisches Argument mitgeben, das angibt, wie viele Ebenen von enhaltenen
Schleifen übersprungen werden sollen.
7.2.12 Ausnahmen und Fehlerbehandlung
PHP 5 hat eine Ausnahmebehandlung ähnlich der anderer Programmiersprachen. Details: PHP
Ausnahmebehandlung
66
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
Listing 7.13: PHP - try/catch
class AlwaysException extends Exception {}
try {
$error = 'Werfe immer diesen Fehler';
throw new AlwaysException($error);
//Einer Ausnahme folgender Code wird nicht ausgeführt
echo 'Keine Ausführung';
} catch (AlwaysException $e) {
echo 'Ausnahme gefangen: ', $e->getMessage(), "\n";
}
Sie kennen diese Möglichkeit, Fehler zu verarbeiten, aus anderen Programmiersprachen. In
PHP nden Sie häug Code, der diese Art der Fehlerverarbeitung nicht nutzt und stattdessen
hardcodedFehlermeldungen enthält. Denken Sie an die Probleme der Internationalisierung
(siehe Abschnitt 3.3.1) und Wiederverwertbarkeit und nutzen Sie die Möglichkeit, Ausnahmen
zu werfen.
Es ist auch möglich, benutzerdenierte Funktionen zur Fehlerbehandlung zu denieren. Siehe
dazu set_error_handler.
Listing 7.14: PHP - Konguration Fehlerbehandlung
// Fehlermeldungen ganz abschalten
error_reporting(0);
// Einfache Laufzeitfehler melden
error_reporting(E_ERROR | E_WARNING | E_PARSE);
7.2.13 Klassen
Mit PHP 5 gibt es die gängigen OO Strukturen.
•
Sie haben Klassen, von denen Sie erben können. Sie können nur von einer Klasse erben.
•
Sie haben Interfaces, die Sie implementieren können. Sie können mehrere Interfaces implementieren.
•
Sie haben nale und abstrakte Klassen.
•
Die Sichtbarkeit von Eigenschaften und Methoden können Sie mit private, public und
protected deklarieren.
•
Type HInts: Sie können für Methodenparameter eine Klasse oder ein Interface denieren.
•
Sie haben statische Methoden und Eigenschaften.
•
Sie haben Konstanten.
•
Sie haben Konstruktoren und Destruktoren.
•
Methoden können nicht überladen werden.
Da Sie bereits objektorientierte Programmierung in einer anderen Sprache beherrschen, brauche ich die Begrie nicht näher zu erläutern. Sie müssen sich nur an die Syntax von PHP
gewöhnen, die anhand folgender Beispiele veranschaulicht wird.
67
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
Listing 7.15: PHP - Objektorientiert
class Math {
const PI = 3.14159265;
static public function factorial($number) {
if ($number ===1) {
return 1;
}
return self::factorial($number-1) * $number;
}
}
$factorial = Math::factorial(5);
interface Vehicle {
public function
public function
public function
public function
}
startEngine();
moveForward($miled);
stopEnginge();
getMilage();
class Car implements Vehicle {
public $manufacturer;
public $color;
pubic $milage;
protected $engineStarted = false;
public function __construct($manufacturer, $color, $milage = 0) {
$this->manufacturer = $manufacturer;
$this->color = $color;
$this->milage = $milage;
}
public function startEngine() {
$this->engineStarted = true;
}
public function __toString() {
$string = "Instanz der Klasse Car\n";
$string .= " Hersteller: {$this->manufacturer}\n";
...
return $string;
}
... andere Methoden, die von Vehicle gefordert werden und noch andere ...
}
abstract class AutomaticCar extends Car {
...
}
final class Convertible extends Car {
protected $roofOpen = false;
public function openRoof() {
$this->roofOpen = true;
}
... analog closeRoof ...
}
class Customer {
protected $id;
protected $name;
... Methoden ...
68
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
}
class RentalCompany {
public function rentVehicle(Vehicle $vehicle, Customer $customer) {
...
}
}
Achtung: Mit der Pseudovariablen
selwort
self
$this
wird das aktuelle Objekt rferenziert. Das Schlüs-
wird zur Laufzeit durch den Namen der Klasse ersetzt. Das Schlüsselwort Parent
referenziert die Elternklasse.
Aufgabe 7.1
Überlegen Sie sich ein gutes OO-Design für eine Navigation. Die Seiten sol-
len hierarchisch in einem Array hinterlegt werden oder auch aus einer XML Datei eingelesen
werden.
7.2.14 Iteratoren
Mit Iteratoren können Sie einfach über eine Liste navigieren. Über welche Elemente Sie navigieren möchten, können Sie denieren, mal ist es ein Array, mal die öentlichen Eigenschaften
eines Objekts oder oder. Für die Iteration sind die Interfaces Iterator und IteratorAggregate relevant. PHP bietet für Arrays und Verzeichnisse geeignete Klassen an, die das Interface Iterator
bereits implementieren. Die Konzepte selbst sollten Ihnen wiederum aus anderen OO-Sprachen
vertraut sein. Lesen Sie weiter bei Iterators in PHP5.
Listing 7.16: PHP - Interface Iterator
interface Iterator {
public function current();
public function key();
public function next();
public function rewind();
public function valid();
}
class Book implements Iterator {
public $publisher;
public $title;
... weitere Eigenschaften wie ISBN, ...
private iteratorProperties = array( 'publisher', 'title', ...);
private $position = 0;
... Konstruktor und andere Methoden ...
public function next() {
$this->position++;
}
public function key() {
return $this->iteratorProperties[$this->position];
... weitere Methoden der Schnittstelle Iterator ...
}
$phpBook = new Book("O Reilly", "PHP Design Patterns");
foreach ($phpBook as $key => $value) {
echo "$key: $value \n";
}
Listing 7.17: PHP - Iteratoren für Arrays und Verzeichnisse
69
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.2 PHP - die Sprache
$phpBook = array('publisher'=>'O Reilly', 'title'=>'PHP Design Patterns', ...);
$bookIterator = new ArrayIterator($phpBook);
foreach($bookIterator as $key => $value) {
echo "$key: $value \n";
}
$dir = new DirectoryIterator(".");
echo "Anzahl der Dateien: ";
foreach($dir as $file) {
//ignore . and ..
}
if (!$file->isDot()) {
echo "File: {$file->getFileName()} \n";
echo "Type: {$file->getType()} \n";
if($file->isFile()) {
echo "Size: {$file->getSize()} kb \n";
}
}
Listing 7.18: PHP - Interface IteratorAggregate
interface IteratorAggregate {
public function getIterator();
}
class Book implements IteratorAggregate {
public $publisher;
public $title;
... weitere Eigenschaften wie ISBN, ...
private iteratorProperties = array( 'publisher', 'title', ...);
private $position = 0;
... Konstruktor und andere Methoden ...
public function getIterator() {
$properties = array();
foreach ($this->iteratorProperties as $property) {
$properties[$property] = $this->$property;
}
return new ArrayIterator($properties);
}
$phpBook = new Book("O Reilly", "PHP Design Patterns");
$iterator = $phpBook->getIterator();
foreach ($iterator as $key => $value) {
echo "$key: $value \n";
}
7.2.15 XML
Es gibt mittlerweile eine sehr gute Unterstüzung für XML.
Listing 7.19: PHP - XML-Unterstützung
$dom = domdocument::load('menu.xml');
$domxsl = domDocument::load('menu.xsl');
$proc = new xsltProcessor;
$proc->importStyleSheet($domxsl);
echo $proc->transformToXML($dom);
Beachten Sie auch die Funktion
70
xml_parse_into_struct();
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.3 Formularverarbeitung
7.3 Formularverarbeitung
7.3.1 Get versus Post
Formulare können mit der Methode Get oder Post versendet werden (Attribut
form).
•
Wenn Sie
method="get"
method
im Tag
wählen (diese Angabe ist nicht zwingend erforderlich, da get
als Default-Einstellung deniert ist), hängt der Browser die Formulardaten als Parameter
an die Aufrufadresse an. Beachten Sie, dass die Anzahl der übergebenen Zeichen je nach
Browser auf ca. 2000 limitiert sein kann. Die Anfrage, die beim Server eintrit, sieht dann
so aus:
•
Wenn
action?field1=value1&field2=value2...
Sie method="post" wählen, überträgt der Web-Browser
die Formulardaten mit
einer speziellen Post-Anfrage an den Web-Server (post = verschicken). Dabei wird wie
bei einer normalen Get-Anfrage die betreende Datei angefordert - einziger Unterschied:
Statt an die URL (action?...) werden die Daten hier, durch eine Leerzeile getrennt, an
den Header angehängt. Bei CGI-Programmen stellt der Webserver dann die Parameter
über den Standardeingabekanal zur Verfügung.
Eine ausführliche Beschreibung nden Sie unter Selfhtml Formulare oder HTTP: RequestMethoden.
7.3.2 Globale Arrays
Enthält ein Formular Felder, die mit dem Name-Attribut versehen sind (ACHTUNG: Nur
das Attribut id reicht leider nicht. Sie müssen also ihre Formularelemente immer mit dem
Id-Attribut zur Vorverarbeitung mit Javascript und mit dem name-Attribut zur Weiterverar-
$_POST[]
$_GET[] je nach verwendete Methode des Formulars zur Verfügung. Auch Parameter, die
beitung mit PHP versehen.), so stehen diese in den globalen assoziativen Arrays
bzw.
sie zum Beispiel im Rahmen einer Navigation an die URL angefügt haben, stehen Ihnen mit
$_GET[]
zur Verfügung.
Immer, wenn Ihre Applikation Daten entgegennimmt und in irgendeiner Form verarbeitet,
bieten sich Angrismöglichkeiten. Auf zwei typische Angrisarten gehen wir im folgenden Abschnitt ein.
7.3.3 Angrie
SQL-Injection
Mit SQL-Injection bezeichnet man Angrie mit den Zielen:
•
Zugri auf Daten, für die keine Berechtigung vorhanden ist zu erhalten.
•
Daten in der Datenbank zu verändern.
•
Root Status zu erhalten.
•
Eine Shell auf dem Datenbankserver zu errichten.
Diese Ziele versucht man durch geschickte Parameterübergabe bei Formularen zu erreichen.
Gehen Sie davon aus, dass die Anwendung eigentlich einen Aufruf der Art
id=1
erwarte -
beachten Sie, dass + einem Leerzeichen entspricht:
71
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.3 Formularverarbeitung
•
Kommentarzeichen /* in SQL nutzen und damit eventuelle weitere Überprüfungen abschalten:
•
id=1+/*
Mehrere SQL-Befehle durch Semikolon abtrennen und damit eigene Befehle einschleuÿen:
id=2;UPDATE+USER+SET+TYPE="admin";GO+EXEC+cmdshell('format+C')+-id=1+or+1=+1;
•
Durch Oder-Verknüpfungen die Logik abändern:
•
Mit Union Daten ausspähen (hierzu wird ein Vorwissen benötigt, das beispielsweise durch
zu detaillierte Fehlermeldungen erworben werden kann: Anzahl Spalten der eigentlich
auszulesenden Tabelle):
id=42+UNION+SELECT+login,+password,+'x'+FROM+user
Cross Site Scripting (XSS)
Beim XSS versucht der Angreifer Code einzuschleuÿen und die Anwendung so zu seinem Nutzen
zu verändern.
Typischer Ablauf:
1. Der Angreifer platziert einen Eintrag mit einem Link und JS in einem Forum.
2. Das Opfer klickt auf diesen Link und landet beispielsweise bei einer Bank. Das im Link
eingebettete JS lädt ein Login-Formular nach.
3. Das Opfer gibt die Login-Daten ein und diese werden an den Angreifer geschickt.
Angrismöglichkeiten können Sie bei XSS (Cross Site Scripting) Cheat Sheet nachlesen.
7.3.4 Validierung
Bevor Sie die Daten eines Formulars weiterverarbeiten, sollten Sie immer die Gültigkeit der
übergebenen Parameter überprüfen, nur so können Sie Ihre Anwendung vor etwaigen Angrien
schützen. Sie bauen also keine Datenbankverbindung auf, bevor sie die Daten validiert haben.
Dies können Sie im einfachsten Fall mit den folgenden Funktionen tun:
• is_set()
testet, ob eine Variable gesetzt ist.
• strip_tags()
entfernt HTML-Tags aus einem String.
• htmlspecialchars()
wandelt Sonderzeichen in HTML um.
tun oder zuverlässiger d Zusätzliche Sicherheit erreichen Sie durch die Verwendung von Filtern,
auf die wir im Folgenden eingehen werden.
Ohne Filter
Vor PHP 5.2.0 nutzte man hauptsächlich die folgende Notation:
Frage 7.1
<?php
$_POST['age'] ?>
Was gefällt Ihnen an folgenden Scripten nicht?
• include($_GET['filename']);
• mysql_query("INSERT INTO table (field_one) VALUES ({$_POST['var1']})";
72
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.3 Formularverarbeitung
Mit Filter
Seit Version 5.2 gibt es eine sehr gute Möglichkeit, Formulare einigermaÿen sicher mit
Filtern zu bearbeiten:
Listing 7.20: HTML - einfaches Formularbeispiel für PHP Filter
<form action="form1.php" method="post" >
Enter your age: <input name="age" size="2">
<input type="submit" name="submit" value="Go">
</form>
Die passende PHP-Datei zur Verarbeitung:
Listing 7.21: PHP - Formularvalidierung mit Filtern (einfach)
if (!filter_has_var(INPUT_POST, 'submit')) {
echo "na na na";
}
$age = filter_input(INPUT_POST, 'age', FILTER_VALIDATE_INT);
if (is_null($age)) {
echo "The 'age' field is required.<br />";
} elseif ($age === FALSE) {
echo "Please enter a valid age.<br />";
} else {
echo "Welcome.<br/>";
}
Noch ein etwas aufwändigeres Formular:
Listing 7.22: HTML - umfangreiches Formularbeispiel für PHP Filter
<form action="form2.php" method="post" >
Name: <input name="name" size="50"><br />
E-Mail: <input name="email" size="50"><br />
Homepage: <input name="homepage" size="50"><br />
Age: <input name="age" size="4"><br />
Income: <input name="income" size="50"><br />
Your two favourite languages:
<select name="favourites[]" size="6" multiple>
<option value="perl">perl</option>
<option value="c">C</option>
<option value="java">Java</option>
<option value="php">PHP</option>
</select><br />
<input type="submit" name="submit" value="Go">
</form>
Und die Verarbeitung mit Filtern:
Listing 7.23: PHP - Formularvalidierung mit Filtern (umfangreich)
$defs = array(
'name'=>array('filter'=>FILTER_SANITIZE_STRING,
'flags' => FILTER_FLAG_ENCODE_HIGH),
'email'=>FILTER_VALIDATE_EMAIL,
'homepage'=>array('filter'=>FILTER_VALIDATE_URL,
'flags' => FILTER_FLAG_SCHEME_REQUIRED),
'age'=>array( 'filter' => FILTER_VALIDATE_INT,
'options'=> array('min_range'=>7, 'max_range'=>77)),
73
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.4 Datenbanken
'income'=> FILTER_VALIDATE_FLOAT,
'favourites'=> array(
'filter' => FILTER_SANITIZE_STRING,
'flags' => FILTER_REQUIRE_ARRAY
),
);
$input = filter_input_array(INPUT_POST, $defs);
if ($input['age'] === FALSE) {
exit("You must be between 7 and 77 years old.");
}
Aufgabe 7.2
Im Code wird nur das Feld age geprüft. Schreiben Sie die If-Bedingungen für die
anderen Felder. Lesen Sie hierzu auch: Filtering Data with PHP.
7.3.5 Sicherheit
Sie können als zusätzliche Sicherheit in versteckten Feldern eine Sicherheitsvariable ablegen:
Listing 7.24: PHP - Formulare mit Sicherheitsvariablen
$id =
$salt
$hash
print
"grosse Zufallszahl darf nicht manipuliert werden";
= "und noch ein Geheimnis dazu";
= md5($salt.$id);
'<input type="hidden" name="sid" value="'.$hash.'" />';
//Variable eines Requests prüfen:
$id = "grosse Zufallszahl darf nicht manipuliert werden";
$salt = "und noch ein Geheimnis dazu";
$hash = md5($salt.$id);
$sid = validateInput($_REQUEST['sid']);
//Achtung validateInput() hier nur angedeutet
if ($hash == $sid) {
}
else {
}
// weiter
print 'Daten manipuliert.';
exit(1);
7.4 Datenbanken
Mit PHP ist es einfach möglich, Datenbankabfragen auszuführen:
Listing 7.25: PHP - Zu einfacher Datenbankzugri
// variablen initialisieren
$dbhost='localhost';
$dbusername='root';
$dbuserpass='root';
$dbname='test_php';
// Verbindung herstellen
$link_id = mysql_connect ($dbhost, $dbusername, $dbuserpass);
// Datenbank auswählen
if (!mysql_select_db($dbname)) die(mysql_error());
//insert ausführen
74
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.4 Datenbanken
$query = "INSERT INTO table_logins VALUES($_POST['user'], $_POST['pwd'])";
if (mysql_query($query)){
echo "Vielen Dank für Ihre Anmeldung.";
} else {
echo "Ihre Anmeldung konnte leider nicht erfolgreich durchgeführt werden.";
}
// Verbindung schlieÿen
mysql_close($link_id);
Was gefällt Ihnen an obigem Skript nicht? Hier nur einige Kritikpunkte meinerseits:
•
NEGATIV: Die Zugangsdaten müssen bei jedem DB-Zugri neu angegeben werden, d.h.
ein Ändern des Datenbanknamens führt zu Änderungen an vielen Dateien.
•
NEGATIV: Auf die Datenbank wird mit root zugegrien, damit hat jeder potentielle
Angreifer alle Rechte.
•
NEGATIV: Kann keine Verbindung zur Datenbank hergestellt werden, so endet die Bearbeitung und die komplette Fehlermeldung mit allen Hinweisen zur Datenbank wird mit
mysql_error
ausgegeben. Fehlermeldungen sollten für die Entwicklerin irgendwo mitge-
schrieben werden, aber die Benutzerin darf keine Systeminformationen sehen.
•
NEGATIV: Die Eingabedaten wurden vor Zugri auf die Datenbank nicht validiert.
•
NEGATIV: Es wurde zuvor nicht überprüft, ob der Datensatz in der Tabelle bereits
vorhanden ist.
•
POSITIV: Im Erfolgsfall wird ein einfaches Feedback gegeben.
•
POSITIV: Kann der Datensatz nicht hinzugefügt werden - nachdem die Datenbankverbindung erfolgreich hergestellt wurde - so wird ebenfalls ein einfaches Feedback ausgegeben.
•
NEGATIV: Die Feedbacktexte sind hardcoded eingefügt und nicht über Konstanten/Variablen internationalisert.
Um die Datenbankengine später wechseln zu können, sollten Sie auf eine Abstraktion oder ein
vorhandenes Klassengerüst zurückgreifen. In PHP hat sich hier PDO oder das Pear-Paket DB
ausgebreitet. Wer auch im Microsoftumfeld entwickelt, sollte sich mit ADODB beschäftigen.
Alle Pakete unterstützen sogenannte prepared statements , die die Sicherheit einer Anwendung erheblich erhöhen. Ein Prepared Statement ist eine sogenannte vorbereitete Anweisung
für ein Datenbanksystem. Im Gegensatz zu gewöhnlichen Statements enthält es noch keine
Parameterwerte. Anstatt dessen werden dem Datenbanksystem Platzhalter übergeben. Mittels
Prepared Statements können SQL-Injections eektiv verhindert werden, da das Datenbanksystem die Gültigkeit von Parametern prüft, bevor diese verarbeitet werden. Soll ein Statement mit unterschiedlichen Parametern mehrere Male (z. B. innerhalb einer Schleife) auf dem
Datenbanksystem ausgeführt werden, erreicht man mit Prepared Statements einen deutlichen
Geschwindigkeitsvorteil, da das Statement schon vorübersetzt im Datenbanksystem vorliegt
und nur noch mit den neuen Parametern ausgeführt werden muss. Aber selbst bei einmaligem
Zugri ist ein Prepared Statement nicht langsamer.
Da PDO in PHP-Kreisen favorisiert ist, in C geschrieben und somit schnell ist, stelle ich im
Folgenden ein PDO-Beispiel vor. Die Vorgehensweise, Prepared Statements zu verwenden, ist
in den anderen erwähnten Paketen jedoch ähnlich.
75
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.4 Datenbanken
Listing 7.26: PHP - Datenbankzugri
//Validierung ist vorangegangen!
try {
//Verbindung herstellen
$dbh = new PDO('mysql:host=localhost;dbname=test', 'ute', 'pwd');
//Insert −Abfrage vorbereiten
$stmt1 = $dbh->prepare("INSERT INTO CART (UserId, ProductId, Quantity) VALUES (:userid, :product
//Parameter an Variablen binden
$stmt1->bindParam(':userid', $userId);
$stmt1->bindParam(':productid', $productId);
$stmt1->bindParam(':quantity', $quantity);
//einen Datensatz einfügen
$userId = 1;$productId=1;$quantity=3;
$stmt1->execute();
//noch einen Datensatz für den gleichen Kunden einfügen
$productId=4;$quantity=1;
$stmt1->execute();
//eine Select −Abfrage vorbereiten
//bindParam lieÿe sich auch hier verwenden
}
$stmt2 = $dbh->prepare("SELECT ProductId, Quantity FROM CART where UserId = ?");
if ($stmt2->execute(array($_GET['userid']))) {
$stmt2->bindColumn('ProductId', $productId);
$stmt2->bindColumn('Quantity', $quantity);
while ($stmt2->fetch(PDO_FETCH_BOUND)) {
echo "ProductId: $productId ";
echo "Quantity: $quantity\n";
}
}
//Verbindung schlieÿen
$dbh = null;
} catch (PDOException $e) {
echo $lang['PDOERROR'];
error_log($e->getMessage());
}
// prinzipieller Aufbau mehrerer Transaktionen:
try {
$dbh->beginTransaction();
$dbh->query('UPDATE ...');
$dbh->query('INSERT ...');
$dbh->commit();
} catch (PDOException $e) {
$dbh->rollBack();
}
Kombinieren Sie diesen Ansatz mit Ihrem Wissen über gutes OO-Design und Sie schreiben
gute Software. Im PHP-Umfeld hat sich im Zusammenhang mit Datenbanken auch ein guter
Codegenerator etabliert: Propel. Propel nimmt ihnen die Arbeit ab, Objekte auf relationale
Tabellen abzubilden.
Aufgabe 7.3
Denieren Sie sich eine Schnittstelle für die Verbindung zur Datenbank und im-
plementieren Sie diese. Ihre Basisdatenbankklasse sollte im Konstruktor den Servernamen etc.
entgegennehmen und als Methode die Verbindung herstellen sowie eine Abfrage ausführen. Überlegen Sie sich ein gutes Design für Ihre Basisklasse. Nutzen Sie Ihre Kenntnisse aus anderen
76
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.5 Automatisches Testen
Vorlesungen, zeigen Sie Best Practice!
Aufgabe 7.4
Erstellen Sie eine Login-Klasse, die über die Datenbank abklärt, ob user/pwd
gültig sind, sowie das Hinzufügen und Löschen neuer Benutzer unterstützt.
Aufgabe 7.5
Versuchen
Sie
von
einem
Webformular
Zeichen
auÿerhalb
des
ASCII-
Zeichensatzes in eine Datenbank zu schreiben. Beschreiben Sie kurz, wobei hier Probleme auftreten könnten und was Sie wie testen können.
Aufgabe 7.6
Erstellen Sie ein Login-Formular (Benutzername ist eine E-Mailadresse). Verar-
beiten Sie die Login-Frage durch geeignete PHP-Skripte und Klassen: Validieren Sie die Eingabe
zunächst über einen geeigneten Filter und überprüfen Sie die Authentizität gegen eine geeignete
Tabelle, die Sie in MySQL anlegen.
7.5 Automatisches Testen
PHPUnit stellt die Standardlösung für Unit Tests in PHP dar. Eine ausführliche Anleitung
nden Sie unter PHPUnit - kurz & gut. Folgendes Grundgerüst für Tests ist Professionelle
Softwareentwicklung mit PHP 5 entnommen:
Listing 7.27: PHP - Automatischer Test
//zu testende Klasse:project/MyClass.php
// Testfall für MyClass: project/tests/MyClass.php
require_once 'PHPUnit2/Framework/TestCase.php';
require_once 'project/MyClass.php';
class Project_Tests_MyClass
extends PHPUnit2_Framework_TestCase {
public function testMethod() {
$t = new Project_MyClass();
//es gibt viele Methoden, was erwartet wird ...
}
}
$this->assertEquals(0, $t->testMethod());
// ...
//Tests zusammenführen
if (!defined('PHPUnit2_MAIN_METHOD')) {
define(
'PHPUnit2_MAIN_METHOD',
'Project_Tests_AllTests::main'
);
}
require_once 'PHPUnit2/Framework/TestSuite.php';
require_once 'PHPUnit2/TextUI/TestRunner.php';
require_once 'project/tests/MyClass.php';
class Projekt_Tests_AllTests {
public static function main() {
PHPUnit2_TextUI_TestRunner::run(self::suite());
}
public static function suite() {
$suite = new PHPUnit2_Framework_TestSuite(
'project'
77
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.6 URL Manipulation
);
$suite->addTestSuite('project_tests_pachage_MyClass');
//weitere hinzufügen
}
}
return $suite;
if (PHPUnit2_MAIN_METHOD ==
'Projekt_Tests_Paket_AllTests::main') {
Projekt_Tests_Paket_AllTests::main();
}
7.6 URL Manipulation
Sie haben sich eine gute Navigation für Ihre Seite überlegt. Um den jeweiligen Inhalt an die
dafür vorgesehene Stelle Ihrer HTML-Seite zu bekommen, werden häug Links mit Parametern
verwendet, z.B. http://www.darmstadt.de/produkt.cfm?ID=499. Damit wird vermutlich die
Seite mit der Id 499 aus der Datenbank geholt. Falls Sie eine mehrsprachige Seite haben,
könnten Sie als zweiten Parameter die Sprache übergeben. Und ab zwei Parametern streiken
die Suchmaschinen, jedenfalls kann man dann nicht mehr davon ausgehen, dass Suchmaschinen
den Links dann noch folgen und diese indizieren. Falls Sie gerne echte HTML-Dateinamen im
Pfad stehen haben möchten, können Sie sich des Moduls mod_rewrite bedienen. Betrachten
Sie hierzu folgendes einfaches Beispiel: In die Datei .htaccess schreiben Sie:
RewriteEngine on
RewriteRule ^seite_([0-9]+)_(d|e).html$ seite.php?id=$1&l=$2 [L]
Sie aktivieren das Modul und denieren anschlieÿend die Regel, dass alle Anfragen der Art
seite_12_d.html auf seite.php?id=12&l=d gemapped werden müssen. Das abschlieÿende L
kennzeichnet, dass keine weiteren Regeln folgen werden. Dieses Regelsystem lässt sich nämlich
auch verschachtelt denieren. Sie können in Ihrer Datenbank bzw. Ihrer XML Datei Inhalte mit
einer Seite hinterlegen, die Navigation dynamisch erzeugen und scheinbar auf HTML-Dateien
verweisen, während in Wirklichkeit eine PHP-Seite mit einem oder mehreren Parametern aufgerufen wird.
7.7 Links zum Thema
•
•
•
•
•
•
•
•
•
•
78
Präsentationen
Dokumentation, Downloads, die Quelle schlechthin
Tutorials und Einführungen
Praxisbuch online
Professionelle Softwareentwicklung mit PHP 5
Automatische Dokumentation Ihres Codes
pear Coding Standard
Ausnahmebehandlung
Eigener Error-Handler
Iteratoren
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
7.7 Links zum Thema
•
•
•
•
•
•
•
•
79
Filter
PHP Security Guide
Validating User Input with the Strategy Pattern
DB Full-Text Search Functions
Viele Beispiele
php architect
Gute Vorträge rund um PHP
Weitere gute Vorträge
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8 JavaScript - ECMAScript
JavaScript (JS) ist eine Script-Sprache, die auf dem Client läuft und dort interpretiert wird.
Sie kann von der Benutzerin deaktiviert werden. Daher sollten Sie sich im Vorfeld überlegen,
ob und wofür Sie JavaScript einsetzen wollen. Üblicherweise werden Formulare mit JavaScript
vorvalidiert, bevor sie an den Server geschickt werden, so dass die Benutzerin ohne zusätzliche Wartezeit das Formular richtig ausfüllen kann. Natürlich muss auf der Serverseite aus
Sicherheitsgründen auch eine Validierung durchgeführt werden. Warum?
8.1 Einführung
JavaScript ist eine objektbasierte Sprache, die unter dem Namen ECMAScript durch Ecma
International standardisiert wurde. JavaScript läuft auf dem Client und ist somit vom Server
an den Client zu senden. Sie können Scriptelemente direkt im HTML-Code einbetten. Empfehlenswert ist jedoch die Auslagerung in eine separate Datei und ihre Einbindung im Tag Head
der HTML-Datei:
Listing 8.1: HTML - Einbinden von Javascript
<script type="text/javascript" src="../js/common.js"></script>
<script language="JavaScript">
<!−−
// alternativ kann Code auch so eingebunden werden
//−−>
</script>
Damit stehen der Seite die in common.js denierten Funktionen etc. zur Verfügung. Im
HTML-Code wird deniert, wann welche Scriptteile ausgeführt werden. Üblicherweise sind dies
Maus- oder Tastaturereignisse, aber auch Fensterereignisse. Eine Auswahl der Ereignisse nden
Sie in Tabelle A.3 im Anhang. Sie werden unterschiedliche Möglichkeiten nden, wie JavaScript
an ein Ereignis gekoppelt wird:
•
•
im HTML:
<a href="" onclick="hello();">
in JavaScript selbst, browserunabhängig:
document.getElementById('mydiv').onclick = hello;
•
in JavaScript selbst, browserabhängig:
document.getElementById('mydiv').addEventListener('click',hello,false);
MSIE: attachEvent('onclick', hello);
Von der ersten Möglichkeit ist abzuraten. Warum?
8.1.1 Besonderheiten
Variablen JS ist keine typisierte Sprache. Sie sind weder gezwungen Variablen zu deklarieren
noch zu initialisieren. Variablen stehen Ihnen einfach zur Verfügung. Dies hat leider auch den
Nachteil, dass es oft schwer ist, Fehler zu nden. Installieren Sie am besten einen Debugger in
Ihrem Browser.
80
8.1 Einführung
Groÿ- und Kleinschreibung
Bei Methoden und Variablen wird zwischen Groÿ- und Klein-
schreibung unterschieden.
Semikolon
Wie bei vielen Programmiersprachen, schlieÿt das ; einen Befehl ab. Das Zeilenen-
de beendet einen Befehl ebenfalls, so dass ein Semikolon nicht mehr zwingend erforderlich ist.
Aber da Sie sicher durch viele Programmiersprachen an das Semikolon gewöhnt sind, ist es
sinnvoll, dies beizubehalten.
Objekte
Die Denition von Objekten und ihren Methoden und Eigenschaften ist anders als
in Java oder vielen anderen Sprachen, siehe Abschnitt 8.1.7.
8.1.2 Befehle, Schleifen, Kommentare, . . .
Dem folgenden Beispiel können Sie die Notation für übliche Befehle entnehmen.
Listing 8.2: JS - Grundlagen
/∗ dies ist ein Kommentar ∗/
//dies ist ein einzeiliger Kommentar
var x; //deniert eine Variable x
var a,b,c=4; //deniert die Variablen a,b,c mit c=4
if (x > 57)
{
a=0;
b=0;
c=57;
}
document.write("<p> a=" + a + " b=" + b + " c=" + c + "</p>");
var i;
var sq = new Array();
for (i=1;i<25;i++)
{
sq[i]=i*i;
}
document.write("<p> Quadrat von 5: " + sq[5] + "</p>");
var Result;
for (Attribute in window) //nach in folgt ein Objekt, hier window
{
Result=Result + "window." + String(Attribute)+"\n";
}
document.write("<p>" + Result + "</p>");
var answer;
switch (i)
{
case 1:
answer="first";
break;
case 2:
answer="second";
break;
default:
answer="too much";
}
81
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.1 Einführung
document.write("<p> nach switch: " + answer + "</p>");
i = 1;
answer = "";
while (i<9)
{
a = i*i;
answer = answer + a + " ";
i++;
}
document.write("<p> nach while: " + answer + "</p>");
i = 1;
answer = "";
do
{
a = i*i;
answer = answer + a + " ";
i++;
}
while (i<9);
document.write("<p> nach do-while: " + answer + "</p>");
8.1.3 Ein- und Ausgabe
Listing 8.3: JS - Ein- und Ausgabe
x=prompt("Bitte geben Sie eine Zahl von 0 bis 10 ein:", "1");
alert("Sie haben eine " + x + " eingegeben.);
ok=confirm("Bitte bestätigen");
document.write("Hello World!")
8.1.4 try, catch und Fehlerbehandlung
In den aktuellen Browserversionen wird die übliche try-catch-nally Syntax unterstützt. Zusätzlich gibt es die Möglichkeit, mit
throw ""
einen Fehler zu werfen. Sie können sogar eine
eigene Fehlerbehandlung schreiben:
Listing 8.4: JS - Fehlerbehandlung
onerror=handleErr;
var txt="";
function handleErr(msg,url,l)
{
txt+="Error: " + msg + "\n";
txt+="URL: " + url + "\n";
txt+="Line: " + l;
alert(txt);
return true;
}
8.1.5 Strings
Strings werden über + zusammengefügt. Zusätzlich haben Sie die Methoden
82
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.1 Einführung
•
•
•
•
length: Gibt die Länge des Strings wieder.
toLowerCase(): Gibt den String komplett kleingeschrieben wieder.
toUpperCase(): Gibt den String komplett groÿgeschrieben wieder.
split(Trennzeichen): Zerlegt den String an jedem Vorkommen des Trennzeichens. Zurückgegeben wird ein Array aus Teilstrings.
•
indexOf(andererString): Gibt die Position des ersten Vorkommens des angegebenen
Strings wieder. Wird dieser nicht darin gefunden, so gibt die Methode -1 zurück.
•
lastIndexOf(andererString) Gibt die Position des letzten Vorkommens des angegebenen
Strings wieder. Wird dieser nicht darin gefunden, so gibt die Methode -1 zurück.
8.1.6 Arrays
Ein Array wird mit
new Array()
deniert. Dann können Sie mit eckigen Klammern auf die
Elemente zugreifen und haben folgende Methoden zur Verfügung:
•
•
•
•
•
•
•
length Anzahl der Elemente zurückgeben.
concat(anderesArray) Zwei Arrays verbinden.
join(Trennzeichen) Array in Zeichenkette umwandeln.
pop() Letztes Element aus Array löschen.
push(neuerWert) Ein neues Element an das Ende des Array anhängen.
reverse() Reihenfolge der Elemente umkehren.
sort(VergleichsFunction) Elemente sortieren.
8.1.7 OO
JavaScript kennt keine Typen und somit gibt es auch keine echten Klassen. Es ist möglich,
sogenannte Prototypen oder Templates zu nutzen. Über new Object() bekommt man ein Objekt.
Jedes Objekt kann zur Laufzeit um beliebige Methoden und Attribute erweitert werden. Es
braucht nicht notwendigerweise eine im Code festgelegte Denition einer Klasse. Es ist aber auch
möglich, ein Template zu denieren. Von OO im eigentlichen Sinne würde ich nicht sprechen.
Sehen Sie selbst:
Listing 8.5: JS - objektbasiert
function testStudi()
{
var ute = new studi("ute", "12345");
ute.sayHello();
}
function studi(name, matrikelnummer)
{
this.name=name;
this.matrikelnummer = matrikelnummer;
this.sayHello = sayHello
}
83
function sayHello()
{
alert("hello " + this.name)
}
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.2 Validierung von Formularen
sayHello() könnte auch auÿerhalb von studi sein. Dann wäre sie allgemein
this.name würde leer sein. Achtung: Es ndet keinerlei Überprüfung statt.
Wenn Sie new studi("ute", "122", 2) schreiben, so haben Sie immer noch einen studi auf
den Sie die Methode sayHello anwenden können. Es wird kein Fehler ausgegeben.
Die Funktion
zugänglich, aber
Es ist sogar möglich, Vererbung zu implementieren. Dazu benötigen Sie das Schlüsselwort
prototype.
Damit können auch nachträglich allen Objekten eines Templates Methoden oder
Eigenschaften hinzugefügt werden.
Generell gilt, es ist möglich, in JavaScript objektbasiert zu programmieren. Aber Sie müssen
sich sehr disziplinieren, damit keine unangenehmen Überraschungen auftreten.
8.1.8 Sicherheit
•
JavaScript kann vom Browser aus weder auf das lokale Dateisystem schreiben noch davon
lesen.
•
•
JavaScript kann innerhalb des Webbrowsers keine anderen Programme ausführen.
JavaScript kann innerhalb des Webbrowsers nur eine Verbindung zum aktuellen Webserver
herstellen oder Mails verschicken. Es ist nicht möglich, mit JavaScript eine Verbindung
zu einem ganz anderen Rechner herzustellen, um dort Dateien hochzuladen etc.
8.2 Validierung von Formularen
Gegeben seien folgende Eingabefelder eines Formulars:
Listing 8.6: HTML - Eingabefelder
<input type="text" value="" id="name">
<input type="text" value="" id="email">
<input type="text" value="" id="plz">
8.2.1 Ein erster Versuch
Aufgabe 8.1
Überprüfen Sie mit JavaScript, ob die Felder ausgefüllt sind. In diesem ersten
Versuch dürfen Sie alert-Boxen für die Fehlermeldung verwenden.
Aufgabe 8.2
Zur Überprüfung der Eingabe, werde das Script mit
a)
<input type="button" onclick="checkform()" value="send" />
b)
<form action="index.php" onsubmit="return checkform(this)">
aufgerufen. Testen Sie die unterschiedlichen Aufrufmöglichkeiten mit ein- bzw. ausgeschaltetem
JavaScript.
8.2.2 Reguläre Ausdrücke
Reguläre Ausdrücke sind eine einfache und mächtige Möglichkeit, Eingaben auf viele Regeln zu
überprüfen. Anstelle vieler if-Anweisungen verwenden Sie eine gültige Beschreibung und testen
Sie, ob die Eingabe der darin beschriebenen Syntax genügt. Die üblichen Denitionsmöglichkeiten für reguläre Ausdrücke in JavaScript werden in Tabelle A.4 im Anhang aufgeführt.
Folgendes Script überprüft, ob die Postleitzahl genau 5 Ziern hat:
84
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.2 Validierung von Formularen
Listing 8.7: JS - Validierung der PLZ, Fehlerausgabe mit DOM
function testPLZ() {
var feldPLZ = document.getElementById("plz");
var plz;
var rePLZ = /\d{5}/;
var ok;
if (feldPLZ)
plz = feldPLZ.value;
else
ok = false; //Feld mit id plz fehlt!
ok = false;
ok = rePLZ.test(plz);
return ok;
}
8.2.3 Ein zweiter Versuch
Viele alert-Fenster stören. Besser ist es, die Fehler zu sammeln und zusammengefasst auszugeben. Dabei kann man entweder neben jedes fehlerhafte Feld eine Meldung ausgeben, oder alle
Fehler z.B. am Formularanfang ausgeben. Dabei kann man entweder über das DOM-Modell
direkt Knoten als Fehlermeldungen einfügen oder mit innerHTML den Fehler in einen dafür
vorgesehenen Bereich schreiben.
Diskutieren Sie die Unterschiede zwischen dem DOM- und dem innerHTML-Ansatz anhand
folgender Scripten:
Listing 8.8: JS - Validierung
function validate() {
var validForm=true;
var x = document.forms[0].elements;
for (var i=0;i<x.length;i++) {
removeError(x[i]);
if (!x[i].value)
{
validForm = false;
writeError(x[i],'This field is required');
}
}
return validForm;
}
function writeError(obj, message) {
var sp = document.createElement('span');
sp.className = 'error';
sp.id = "error_" + obj.name;
sp.appendChild(document.createTextNode(message));
obj.parentNode.appendChild(sp);
}
function removeError(obj)
{
var err=document.getElementById("error_" + obj.name);
if(err)
err.parentNode.removeChild(err);
}
85
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.2 Validierung von Formularen
Die Funktion
writeError
könnte auch ohne Hinzufügen von Knoten auskommen. An einer
geeigneten Stelle im HTML fügt man
<div id="error"></div> für die Fehlerbenachrichtigung
ein. Dieser Knoten könnte entsprechend formatiert werden oder auch nur ein span-Tag sein.
Listing 8.9: JS - Ausgabe von Fehlermeldungen mit innerHTML
function writeError(obj, message) {
var err = document.getElementById("error");
err.innerHTML = err.innerHTML + message + "<br />";
}
function removeError()
{
//muss nur einmalig zu Beginn von validate aufgerufen werden
var err = document.getElementById("error");
err.innerHTML = "";
}
Laut Benchmark - W3C DOM vs. innerHTML ist innerHTML schneller als DOM, aber DOM
dürfte zukunftweisend sein.
Egal wie Sie sich entscheiden, Sie sollten Ihre Methode so weit verbessern, dass auch Screenreader schnell zur ersten oder gesamten Fehlermeldung navigieren, indem Sie den Fokus darauf
setzen.
Aufgabe 8.3
Betrachten Sie folgenden Code und beschreiben Sie, was in jeder Zeile passiert:
Listing 8.10: JS - Ausgabe von Fehlermeldungen mit innerHTML und Fokus
function validate() {
var validForm=true;
var err = document.getElementById("error");
var x = document.forms[0].elements;
var labelText;
err.innerHTML = "";
for (var i=0;i<x.length;i++) {
//fetch label of given eld
labelText = getLabelTextForId(x[i].id);
//see if eld is required , e.g. test for ∗
if(labelText.indexOf("*") != -1)
{
if (!x[i].value)
{
validForm = false;
err.innerHTML = err.innerHTML + "<a href=\"#"
+ x[i].id + "\">Bitte füllen Sie das Feld "
+ labelText + " korrekt aus.</a><br />";
}
}
}
86
}
if (!validForm)
{
err.innerHTML = "<a id=\"errorMessage\" name=\"errorMessage\">
Das Skript kann so nicht übermittelt werden.</a><br />" +
err.innerHTML;
document.getElementById("errorMessage").focus();
}
return validForm;
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.3 Ajax: Asynchrones JavaScript und XML
function getLabelTextForId(id) {
var label, labels = document.getElementsByTagName('label');
for (var i = 0; (label = labels[i]); i++) {
if (label.htmlFor == id) {
return label.innerHTML;
}
}
return id;
}
Aufgabe 8.4
Entwickeln Sie eine möglichst generische Validierungsfunktion bzw. ein geeigne-
tes Objekt, das Sie einfach in Ihr Skript einbinden können. Welche Methoden und Eigenschaften
benötigen Sie?
Aufgabe 8.5
Stellen Sie eine Funktion zur Verfügung, die alle Wörter der aktuellen Seite
eines gegebenen Wortes hervorhebt, z.B. das Wort PHP gelb unterlegt.
Aufgabe 8.6
Erzeugen Sie eine Funktion, die eine Tabelle Ihrer Seite auf Klick der jeweiligen
Spalte sortiert.
Aufgabe 8.7
Stellen Sie zwei Funktionen zum Kodieren und Dekodieren einer E-Mail-Adresse
zur Verfügung, so dass die E-Mail-Adressen Ihrer Seite nicht einfach eingesammelt werden
können, die Links aber dennoch funktionieren.
8.3 Ajax: Asynchrones JavaScript und XML
Mit der AJAX-Technologie lassen sich über JavaScript auch nur Teile einer Website aktualisieren. Üblicherweise werden im Hintergrund Verbindungen zum Server hergestellt und nur
einzelne Informationen abgerufen. Die Netzlast ist dadurch deutlich geringer.
Über das Objekt XMLHttpRequest kann JavaScript direkt mit dem Webserver kommunizieren und so neue Inhalte in die Seite einfügen, ohne dass die gesamte Seite neu geladen werden
muss. Die Basis ist wie gesagt das Objekt XMLHttpRequest, DOM zum Einfügen der Inhalte,
die in XML übermittelt werden. Es ist also nicht mehr notwendig, ein Formular mit get oder
post zu übermitteln, um eingabeabhängige Inhalte anzuzeigen. Gleichzeitig möchte ich an dieser Stelle darauf hinweisen, dass Screenreader noch sehr groÿe Probleme mit dieser Technologie
haben. AJAX ist zwar mittlerweise sehr verbreitet, das zugrundeliegende Objekt ist jedoch
(noch) browserabhängig. Das Skript 8.11 zeigt Ihnen, wie sie ein passendes Objekt erzeugen
können.
Listing 8.11: JS - Erzeugen eines XMLHttpRequest Objekts
function GetXmlHttpObject()
{
var xmlHttp=null;
try
{
// Firefox , Opera 8.0+, Safari
xmlHttp=new XMLHttpRequest();
}
catch (e)
{
// Internet Explorer
87
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
8.4 Tipps
}
try
{
xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
}
catch (e)
{
xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
}
}
return xmlHttp;
Skript
??
zeigt, wie JavaScript nach Erzeugen des XMLHttpRequest-Objekts eine Anfrage
an den Server stellen kann. Dies ist sozusagen Hello Worldin Ajax.
Listing 8.12: JS - Ajax-Anfrage
xmlHttp.onreadystatechange=function()
{
if(xmlHttp.readyState==4) //Anfrage beendet
{
//fügt neuen Inhalt an entsprechender Stelle ein
updateAjaxContent(xmlHttp.responseText);
}
}
xmlHttp.open("GET","ajax.php",true);
xmlHttp.send(null);
Im bisher entwickelten Beispiel wird die Antwort des Webservers als einfacher Text über die
responseText ausgegeben. Komplexere Inhalte werden üblicherweise in XML überdann müssen Sie auf die Eigenschaft responseXML zugreifen. Komplexere JavaScript-
Eigenschaft
mittelt,
bzw. Ajax-Anwendungen nutzen häug eines der verbreiterten Frameworks wie Sajax, Sarissa
oder Prototype. Eine ausführliche Darstellung und Anleitung nden Sie unter JavaScript und
AJAX. Einen Überblick und damit eine gute Einführung bietet, wie so häug, auch Wikipedia.
8.4 Tipps
Richtige JavaScript Version
: Nicht alle Browser unterstützen die notwendige JavaScript
Version. Ein guter Test für die aufgeführte Mächtigkeit ist
Listing 8.13: JS - Teste auf geeignete JS Version
if(document.getElementById && document.createTextNode)
{
[...]
}
8.5 Links zum Thema
•
•
•
88
W3Schools: Eine gute Adresse zum Lernen
Prototype JavaScript Framework
Codebeispiele
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
9 Cookies und Sessions
Im letzten Kapitel haben Sie die Mächtigkeit von PHP erfahren. Gerade für interaktive Anwendungen werden Sie Sesssions und/oder Cookies benötigen. Bei HTTP gehen Informationen aus
früheren Anforderungen verloren (zustandsloses Protokoll). Viele Applikation, wie beispielsweise Warenkörbe, basieren jedoch darauf, dass Benutzerinformationen auf verschiedenen Seiten
zur Verfügung stehen.
Bei einer Session wird die Information auf dem Server gehalten, bei Cookies auf dem Client.
Sessions verwenden jedoch häug Cookies, um die SessionId, also die Zuodnung eines jeweiligen
Clients zu seinen Daten, zu gewährleisten.
9.1 Cookies
Cookies sind Variable-Wert Paare, die als Teil des HTML-Headers übertragen werden. Cookies
können auch per JavaScript gesetzt und gelesen werden. Cookies sind an eine Domäne gebunden
und können für einen längeren Zeitraum oder auch nur für die Dauer einer Session, also so lange,
wie der Browser geönet ist, vorgehalten werden.
9.1.1 Cookies serverseitig
Cookies können vom Server als Teil des HTML-Headers an den Client übertragen werden, dies
kann mit PHP erfolgen.
Listing 9.1: PHP - Cookies
//testen auf cookies
$test_temp = isset($_COOKIE['test_temp']) ?
'supports' : 'does not support';
$test_persist = isset($_COOKIE['test_persist']) ?
'supports' : 'does not support';
//objekte in cookies
//schreiben
setcookie('cookiedata', serialize($cookiedata)
//lesen
$formdata = $_COOKIE['cookiedata'];
if ($formdata != '') {
return unserialize($formdata);
9.1.2 Cookies clientseitig
Cookies können auch mit JavaScript gesetzt und gelesen werden.
Listing 9.2: JS - Cookies schreiben
function WriteCookie(bezeichner, wert, dauer)
{
var jetzt, auszeit;
jetzt = new Date();
89
9.2 Alternativen zu Cookies
}
auszeit = new Date(jetzt.getTime() + dauer * 86400000);
document.cookie = Bezeichner + "=" + Wert + ";expires=" +
auszeit.toGMTString() + ";";
Cookies können eigentlich nicht gelöscht werden, aber expires kann auf einen Wert in der Vergangenheit gesetzt werden, was einem Löschen gleich kommt. document.cookie enthält die Cookies der aktuellen Seite in der Form bezeichner=wert;bezeichner=wert;. . . , also mit Semikolon
voneinander getrennt. Den Wert eines einzelnen Bezeichners kann man durch folgenden Code
erhalten.
Listing 9.3: JS - Cookies lesen
function LeseCookie()
{
var wert, wertStart, wertEnde;
wert = "";
if(document.cookie)
{
wertStart = document.cookie.indexOf("=") + 1;
wertEnde = document.cookie.indexOf(";");
if (wertEnde == -1)
wertEnde = document.cookie.length;
wert=document.cookie.substring(wertStart,wertEnde);
}
return wert;
}
Frage 9.1
Was sind Cookies und wie werden sie übermittelt?
Frage 9.2
Wofür würden Sie Cookies verwenden?
9.2 Alternativen zu Cookies
Neben den üblichen Cookies sind weitere Möglichkeiten zur Speicherung von clientseitigen Daten verbreitet: Flash-Cookies, DOM Storage für Mozilla-basierende Browser und userData für
den Internetexplorer. Da die Installation von Flash sehr verbreitet ist, kann man über das Objekt SharedObjekt Daten auf dem Client speichern. Listings hierzu nden Sie unter Listings
mit SharedObjekt und DOM Storage
9.3 Sessions
Bei Sessions werden die Daten auf dem Server gehalten. Für die Zuordnung, welcher Client zu
welchen Daten gehört, wird eine SessionId verwendet. Diese SessionId kann entweder als Teil der
URL oder als Cookie übermittelt werden. Üblicherweise werden Cookies verwendet. Die URL
hat den Nachteil, dass eine Benutzerin evtl. die URL als Link zu einer Freundin sendet und
so bei geöneter Session beide auf einen Datenbestand zugreifen oder der Link bei beendeter
Session nicht funktioniert. Der Zugri über Cookies funktioniert natürlich nur, wenn diese nicht
deaktiviert wurden nach aktuellen Statistiken sind dies jedoch nur noch 1% aller Benutzer.
Im Folgenden gehen wir daher von der Cookie-Methode aus.
90
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
9.4 Sicherheit
Beim Starten einer Session wird ein Cookie auf dem Client gesetzt, der als Wert die SessionId
enthält. Da ein Cookie im HTML-Header übermittelt wird, muss jedes Starten einer Session
am Anfang einer HTML-Response stehen, folgender Code ist fehlerhaft:
Listing 9.4: PHP - Session starten (fehlerhaft)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?php
session_start(); //SO NICHT !!!
?>
Denn hier wird erst der Doctype übermittelt, als Teil des HTML und dann soll noch etwas vom
Header übermittel werden, session_start, muss wirklich das erste sein, das im Script steht!
In eine Session können Sie dann Werte ablegen, z.B.
Listing 9.5: PHP - Session Werte ablegen
session_start();
$_SESSION['test'] = 'test';
Dies können auch serialisierte Objekte sein. Verwenden Sie dazu die Funktionen serialize und
unserialize.
9.4 Sicherheit
Um sich besser gegen Attacken zu schützen, können Sie folgenden Code verwenden.
Listing 9.6: PHP - Session mit zusätzlicher Sicherheit
session_name('eigene-SessionID');
session_id('');
session_start();
session_id('eigener zufälliger Wert');
Um eine Session etwas zu schützen, können Sie weitere Informationen abgleichen:
Listing 9.7: PHP - Session mit MD5
session_start();
$_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
//und später
if (md5($_SERVER['HTTP_USER_AGENT'])!=$_SESSION['HTTP_USER_AGENT']){
/∗ so nicht ∗/
}
exit;
Mit md5 können Sie eine Verschlüsselung erreichen.
Die sicherste Form des Session Managements erreicht man durch ein Dialogtracking. Dabei ist
der oben eingeführte SessionCode nicht statisch, sondern wird bei jedem Zugri neu vergeben.
Wir bezeichnen jenen SessionCode als Token. Die Anwendung baut in jeden Dialogschritt (d.h.
jeden Link in einer Seite) das diesen Dialogschritt eindeutig kennzeichnende Token ein. Erhält
sie einen Request, prüft sie, ob das Token für diesen Aufruf gültig ist und streicht es aus der
Liste der gültigen Token. Ein erneuter Aufruf dieses Links (Replay durch den Angreifer) ist
damit nicht mehr möglich. Auch ist es nicht möglich, eine Aktion ohne Token aufzurufen. Die
Kenntnis der SessionID und eines auf dem Übertragungsweg ausgespähten Tokens ist damit
91
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
9.5 Links zum Thema
nicht mehr ausreichend, um in die Session einzudringen. Man muss gleichzeitig auch das Token
von mindestens einem unverbrauchten (d.h. noch nicht aufgerufenen) Link besitzen.
Frage 9.3
Warum muss session_start aufgerufen werden, bevor Doctype-Angaben oder anderer
HTML-Code übermittelt wird?
Frage 9.4
Welche Anwendungsszenarien fallen Ihnen zu Sessions ein?
9.5 Links zum Thema
•
•
•
92
XSS: Wie Hacker mit XSS an fremde Sessions dran kommen
Sessions und Cookies mit PHP
Alternative zu Cookies: Listings mit SharedObjekt und DOM Storage
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
10 Authentizierung
In vielen Applikationen wollen Sie bestimmten Benutzerinnen bestimmte Rechte geben. Dazu
benötigen Sie irgendeine Art der Identikation, der Authentizierung.
10.1 HTTP
HTTP unterstützt die Authentizierung durch Benutzername und Passwort. Hierzu muss der
Webserver entsprechend konguriert werden (Datei .htaccess):
<Diretory "C:\intern">
AuthType Basic
AuthName Kunde
AuthUserFile "C:\kunde.txt"
Require valid-user
</Directory>
Die Datei mit den Passwörtern hat folgende Form:
Trapp:12345
Mayer:myspecial
Achtung: Bei
AuthType Basic werden Benutzername und Passwort unverschlüsselt übertragen.
AuthType Digest verwenden. Bei dieser Methode werden verschlüsselte
Alternativ können Sie
Passwörter angefordert. Diese Methode wird aber nicht von allen Browsern unterstützt.
Mit PHP als Modul kann die HTTP-Authentizierung verwendet werden. Sie können sich
mit der Funktion
php_info()
anzeigen lassen, ob Ihr PHP als Modul läuft. Codebeispiele und
eine gute Erläuterung nden Sie unter HTTP-Authentizierung mit PHP
Frage 10.1
Welche Vor-/Nachteile hat die HTTP-Authentizierung?
10.2 LDAP
In gröÿeren Unternehmen wird zur Benutzerverwaltung häug das Lightweight Directory Access Protocol (LDAP) eingesetzt. PHP unterstützt LDAP, Ihnen stehen folgende Funktionen
zur Verfügung:
ldap_close.
ldap_connect, ldap_bind, ldap_error, ldap_search, ldap_get_entries und
Eine Anleitung mit Listings nden Sie unter: LDAP Listings
10.3 Windows
Falls Sie PHP über den IIS ausführen lassen, dann können Sie Ihre Website über den IIS mit
der üblichen Windows-Authentizierung schützen.
10.4 Session
Sie können Ihre Benutzerinformationen auch in einer Datenbank, XML-Datei o.ä. ablegen und
den Login-Status über Sessions umsetzen.
93
A Anhang
A.1 HTML-Attribute
Die folgenden Tabellen listen zulässige Attribute in XHTML 1.0 strict auf (Quelle: XHTMLReferenz der Attribute). Dabei stehen die erlaubten Datentypen der Attribute für:
•
•
•
•
Zahl: Ganzzahl oder 0
Länge: Ganzzahl für Pixel-Angaben, Ganzzahl und
%-Zeichen für Prozent-Angaben
CDATA: Textstring (character data) aus beliebigen Zeichen.
<, &, >
und
"
müssen als
Entities kodiert werden
•
IDREF: darf nur Buchstaben, Ziern und den _ (Unterstrich) enthalten und muss mit
einem Buchstaben beginnen
Attribut
verwendbar in
erlaubte
Funktion
Werte und
Datentypen
abbr
td, th
CDATA
Hinweistext für die Zuordnung
der
Zelle,
die
bei
Sprachausgabe vor dem Zelleninhalt genannt wird
accept
form, input
CDATA
erlaubtevMIME-Typen
für
das Hochladen von Dateien
accept-charset
form
accesskey
a,varea,
button,
CDATA
unterstützte Zeichensätze
CDATA
Zeichen
input, label, le-
als Hotkey für den Hyper-
gend, textarea
action
form
align
col,
(Tastatureingabe)
link / Button / Element
CDATA
URI
für
die
Verarbeitung
der Formulardaten
colgroup,
left,
cen-
tbody, td, tfoot,
ter,
right,
th, thead, tr
justify,
Horizontale Ausrichtung
char
alt
area, img, input
CDATA
Kurzbeschreibung / Alternativtext: wird beim Überfahren mit der Maus angezeigt / wenn das Element
nicht geladen ist
archive
object
CDATA
Liste
von
Archivdateien
(mit Kommas abgetrennt)
für das Objekt
94
A.1 HTML-Attribute
axis
td, th
CDATA
Liste von Kategorien, zu der
die Zelle gehört, wird bei
Sprachausgabe genannt
border
table
Zahl
Rahmen
um
Tabellenele-
mente, Breite in Pixel
cellpadding
table
Länge
Innenabstand zwischen Zellenrand
und
Zelleninhalt,
Pixel oder Prozent
cellspacing
table
Länge
Abstand zwischen den Zellen, Pixel oder Prozent
char
col,
colgroup,
CDATA
tbody, td, tfoot,
Zeichen, an dem mit align
ausgerichtet wird
th, thead, tr
charo
col,
colgroup,
CDATA
tbody, td, tfoot,
char
th, thead, tr
charset
Position des mit align und
festgelegten
Ausrich-
tungszeichens
a, link, script
CDATA
Zeichensatz des Verweisziels
/ Verknüpfung / Quelldatei
checked
input
checked
type="radio" oder
type="checkbox" wird das
bei
Element
als
ausgewählt
gekennzeichnet
cite
blockquote,
del,
CDATA
ins, q
URI der Zitatquelle / Begründung nach RFC 2396
classid
object
CDATA
codebase
object
CDATA
URI (nach RFC 2396) oder
Bezeichnung für das Objekt
Basis-URI für Angaben zu
classid, data und archive
codetype
object
CDATA
MIME-Type des Quelltextes der Datenquelle
cols
textarea
Zahl
Anzahl Zeichen pro Zeile
colspan
td, th
Zahl
Anzahl
der
Spalten,
über
die sich die Zelle spannt
content
meta
CDATA
Wert
die
für
mit
die
Eigenschaft,
name
oder
http-
equiv deniert wurde
coords
a, area
CDATA
Begrenzung
von
Bereichen
Image
in
aktiven
Maps
durch Koordinaten.
data
object
CDATA
URI der Datenquelle nach
RFC 2396
datad
button, div, input,
95
object,
CDATA
se-
Name eines Datenfeldes des
aktuellen
Datensatzes
der
lect, span, table,
mit datasrc denierten Da-
textarea
tenquelle
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.1 HTML-Attribute
dataformatas
button, div, in-
plaintext,
Verfahren
put,
html
rung von Daten aus datad
object,
se-
lect, span, table,
der
Interpretie-
und datasrc
textarea
datasrc
button, div, input,
object,
CDATA
se-
URI der Datenquelle nach
RFC 2396
lect, span, table,
textarea
datetime
del, ins
CDATA
Datum und Uhrzeit der Änderung
declare
object
declare
Objekt wird geladen, aber
nicht initialisiert (z.B. abgespielt)
defer
script
defer
verhindert, dass ein Script
Inhalte im Dokumentfenster
erzeugen kann
dir
bdo
disabled
button,
input,
optgroup,
tion,
ltr, rtl
Schreibrichtung
disabled
kann nicht betätigt / be-
op-
nutzt / ausgewählt werden
select,
textarea
enctype
form
CDATA
MIME-Typ,
mit
dem
das
Formular übertragen wird
event
script
CDATA
führt das Script abhänging
davon aus, ob ein bestimmtes Ereignis eingetreten ist
for
label
IDREF
ID des Elements, zu dem
das Label gehört
for
script
IDREF
ID des Elements, für die das
Script gelten soll
frame
table
void,
ve,
abo-
below,
Anzeige
bestimmter
Rah-
men der Tabelle
hsides, lhs,
rhs,
vsi-
des,
box,
border
headers
td, th
IDREF
Liste
von
Zeilen-
ID-Namen
oder
von
Spaltenüber-
schriften, zu denen die Zelle
gehört, wird bei Sprachausgabe genannt
height
img, object
Zahl
Höhe in Pixel
href
a, area, link
CDATA
Verweisziel (Hyperlink)
href
base
CDATA
Basis-URI für Verweise aus
hreang
a, link
CDATA
dem Dokument
Landessprache des Verweisziels
96
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.1 HTML-Attribute
http-equiv
meta
CDATA
bestimmte
für
Eigenschaft
Metainformationen
(HTTP-Kopfdaten),
vom
Browser
die
interpretiert
werden
ismap
img
ismap
serverseitige Image-Map
ismap
input
ismap
bei
type="image",
nutzt
eine
be-
serverseitige
Image-Map
label
optgroup, option
CDATA
Text
für
Eintrag
/
eine
Gruppe von Einträgen in einer Auswahlliste
longdesc
img
CDATA
URI,
an
dem
eine
Lang-
beschreibung der Grak zu
nden ist
maxlength
input
Zahl
Anzahl erlaubter Zeichen
media
link, style
CDATA
Ausgabemedium
(default:
screen)
method
form
get, post
Verfahren
der
Bereitstel-
lung der Fomulardaten auf
dem Server
multiple
select
multiple
mehrere Einträge in einer
Auswahlliste
können
mar-
kiert werden
name
a, map, param
CDATA
Ankername für das Element
name
button,
CDATA
Name des Elements
CDATA
bestimmte Eigenschaft für
/ Map
form,
img,
input,
object,
name,
textarea
name
meta
Metainformationen
nohref
area
nohref
aktiver
Bereich
in
einer
Image Map, der kein Verweisziel hat
prole
head
CDATA
URI für Metainformationen
readonly
textarea
readonly
Wert kann nicht verändert
werden (nur Lesen)
rel
a, link
CDATA
Verweisziel
als
Vorwärts-
verknüpfung rev
a, link
CDATA
rows
textarea
Zahl
Anzahl sichtbarer Zeilen
rowspan
td, th
Zahl
Anzahl der Zeilen, über die
Verweisziel als Rückwärtsverknüpfung sich die Zelle spannt
97
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.1 HTML-Attribute
rules
table
none,
Anzeige bestimmter Gitter-
groups,
netzlinien innerhalb der Ta-
rows,
belle
cols,
all
schema
meta
CDATA
scope
td, th
row,
Schema für den Wert der Eigenschaft
col,
Angabe
der
Zeilen
rowgroup,
Spalten,
für
colgroup
Überschriftencharakter hat,
die
die
und
Zelle
wird bei Sprachausgabe genannt
selected
option
selected
markiert Eintrag als ausge-
shape
a, area
rect, circle,
Form der aktiven Bereiche
poly,
in Image Maps
wählt
default
size
input
Zahl
Anzeigebreite in Zeichen
size
select
Zahl
Anzahl
span
col, colgroup
Zahl
src
img,
CDATA
Quelldatei von Grak
CDATA
bestimmt
der
gleichzeitig
sichtbaren Einträge
Anzahl der Spalten, für die
die Angaben gelten
input
type="image"
src
script
einen
URI,
die
den Script-Code enthält
standby
object
CDATA
Meldungstext, der während
Laden
zeigt
des
Objekts
wird
(von
ange-
aktuellen
Browsern nicht unterstützt)
summary
table
CDATA
Text,
den
le
der
Sehbehinderten
Inhalt
nennt,
der
Tabel-
wenn
Browser
Sprachausgabe unterstützt
tabindex
a, area, button,
Zahl
Tabulatorreihenfolge
input, object, se-
von
Hyperlinks
lect, textarea
target
a,
area,
link
form,
CDATA
_blank,
,
Fenstername
für
das
Ver-
weisziel / Ausgabe
_parent,
_self,
_top
target
base
CDATA
Default Zielfenster für Verweise aus dem Dokument
type
button
button,
Typ des Button
submit,
reset
98
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.1 HTML-Attribute
type
input
text, pass-
Typ des Formularelements
word,
checkbox,
radio,
submit,
reset,
le,
hidden,
image,
button
type
link, script, style
CDATA
MIME-Typ
des
Verknüp-
fungsziels / der Script-Datei
/ der Style-Sprache
type
object
CDATA
MIME-Type der Datenquelle
type
param
usemap
img,
CDATA
MIME-Type des Wertes bei
valuetype="ref"
input
CDATA
URI / Name des zugeordne-
type="image",
ten map-Elements (Image-
object
Map), dem Wert für Name
wird das # vorangestellt
valign
value
col,
colgroup,
top, midd-
tbody, td, tfoot,
le, bottom,
th, thead, tr
(baseline)
button,
CDATA
input,
option
Vertikale Ausrichtung
Beschriftung / Wert, der gesendet wird
value
param
CDATA
Initialisierungswert
valuetype
param
data,
Vorgehen der Interpretation
width
col,
colgroup,
ref,
object
des Initialisierungswertes
Zahl
Breite in Pixel
Länge
Anzeigebreite in Pixel oder
img, object
width
table
Prozent
Tabelle A.1: HTML-Attribute für übliche Tags
Attribut
Funktion
verwendbar in
Ausnahmen
class
Stylesheet-Klasse
alle
base,
html,
param,
head,
meta,
script,
style, title
id
individueller
Name,
alle
w.o.
alle
w.o.
alle
w.o.
ID (bei älteren Browsern zusätzlich name
verwenden)
style
deniert
Angaben
CSS(Inline-
Style)
title
99
Titel
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.3 Reguläre Ausdrücke
dir
Schreibrichtung
der
alle
base, br, frame,
im Element verwende-
frameset,
ten Landessprache
iframe,
hr,
param,
script
lang
Landessprache im Ele-
alle
w.o.
ment
Tabelle A.2: HTML Universelle Attribute
A.2 Formularereignisse
Event-Handler, Formulare
onblur
Verlassen eines Bereiches (Fens-
area,
ter,
label, select, textarea
Formular-Element,
aktiver
button,
input,
Bereich in Image Map)
onfocus
Aktivieren eines Bereiches (Fens-
area,
ter,
label, select, textarea
Formular-Element,
aktiver
button,
input,
Bereich in Image Map)
onload
Beim Laden der Datei
body
onunload
Beim Verlassen der Datei
body
onreset
Beim Zurücksetzen des Formulars
form
onsubmit
Beim Absenden des Formulars
form
onchange
Nach Änderung des Elementes
input, select, textarea
onselect
Beim Auswählen des Elementes
input, textarea
Tabelle A.3: Mögliche Ereignisse zur Ausführung von JavaScript (Auswahl)
A.3 Reguläre Ausdrücke
Bestandteil
Beispiel
/aus/
^
/^aus/
Beschreibung
ndet aus, und zwar in aus, Haus, auserlesen
und Banause.
ndet aus am Anfang des zu durchsuchenden
Wertes, also in aus und auserlesen, sofern das
die ersten Wörter im Wert sind.
$
/aus$/
ndet aus am Ende des zu durchsuchenden
Wertes, also in aus und Haus, sofern das die
letzten Wörter im Wert sind.
*
/aus*/
ndet au, aus, auss und aussssss, also das
letzte Zeichen vor dem Stern 0 oder beliebig
oft hintereinander wiederholt.
+
/aus+/
ndet auss und aussssss, also das letzte Zeichen vor dem Plus-Zeichen mindestens einmal oder beliebig oft hintereinander wiederholt.
.
/.aus/
ndet Haus und Maus, also ein beliebiges Zeichen an einer bestimmten Stelle.
100
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
A.3 Reguläre Ausdrücke
.+
/.+aus/
ndet Haus und Kehraus, also eine beliebige
Zeichenfolge an einer bestimmten Stelle. Zusammensetzung aus beliebiges Zeichen und
beliebig viele davon, jedoch mindestens eines.
\b
/\baus\b/
ndet aus als einzelnes Wort.
\b bedeutet ei-
ne Wortgrenze.
\B
/\Baus\B/
ndet aus nur innerhalb von Wörtern, z.B. in
hausen oder Totalausfall.
\B
bedeutet keine
Wortgrenze.
\d
/\d.+\B/
ndet eine beliebige ganze Zahl.
\d bedeutet
eine Zier (0 bis 9)
\D
\f
\n
\r
\t
\v
\s
\S
/\D.+/
/\f/
/\n/
/\r/
/\t/
/\v/
/\s/
/\S.+/
ndet -fach in 3-fach, also keine Zier.
ndet ein Seitenvorschubzeichen.
ndet ein Zeilenvorschub-Zeichen.
ndet ein Wagenrücklaufzeichen.
ndet ein Tabulator-Zeichen.
ndet ein vertikales Tabulator-Zeichen.
ndet
jede
\f\n\t\v
Art
von
white
space,
also
und Leerzeichen.
ndet ein beliebiges einzelnes Zeichen, das
kein white space ist, also kein
\f\n\t\v
und
kein Leerzeichen.
\w
/\w.+/
ndet alle alphanumerischen Zeichen und
den Unterstrich (typische Bedingung etwa
für programmiersprachengerechte selbstvergebene Namen).
\W
/\W/
ndet ein Zeichen, das nicht alphanumerisch
und auch kein Unterstrich ist (typisch zum
Suchen nach illegalen Zeichen bei programmiersprachengerechten selbstvergebenen Namen).
()
/(aus)/
ndet aus und merkt es sich intern. Bis zu
9 solcher Klammern (Merkplätze) sind in einem regulären Ausdruck erlaubt.
/.../g
/aus/g
ndet aus so oft wie es in dem gesamten
zu durchsuchenden Bereich vorkommt. Die
Fundstellen werden intern in einem Array gespeichert.
/.../i
/aus/i
ndet aus, Aus und AUS, also unabhängig
von Groÿ-/Kleinschreibung.
/.../gi
/aus/gi
ndet aus, so oft wie es in dem gesamten zu
durchsuchenden Bereich vorkommt (g) und
unabhängig von Groÿ-/Kleinschreibung (i).
Tabelle A.4: Bestandteile regulärer Ausdrücke, Quelle: validome.org
101
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08
Listings
5.1
HTML - Einfachste Seite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.2
HTML - Fehlerhafte Seite
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
5.3
HTML - mit Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
5.4
HTML - Doctype . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
5.5
HTML - wesentliche Tags
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
42
5.6
HTML - Formulare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
5.7
HTML - Tabellen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
6.1
HTML - Einbinden einer CSS Datei . . . . . . . . . . . . . . . . . . . . . . . . .
49
6.2
CSS - Syntax Selektor
50
6.3
CSS - Regeln, insbesondere import
6.4
HTML - Grundgerüst für CSS Anweisungen
6.5
CSS - Einfaches Beispiel
6.6
6.7
CSS - Mehrspaltiges Layout
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
56
6.8
CSS - kommentierter Kopf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
6.9
CSS - Dateistruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57
7.1
HTML - Einbinden von PHP
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
59
7.2
PHP - Kommentare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
60
7.3
PHP - Variablen, Strings und Arrays
. . . . . . . . . . . . . . . . . . . . . . . .
62
7.4
PHP - include und require . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
7.5
PHP - implode
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
62
7.6
PHP - explode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
63
7.7
PHP - array Anwendungsbeispiel
. . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.8
PHP - Translation Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.9
PHP - Dateibearbeitung
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
52
. . . . . . . . . . . . . . . . . . . .
52
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
CSS - Alternative zu display:none . . . . . . . . . . . . . . . . . . . . . . . . . .
54
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
64
7.10 PHP - Dateiupload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.11 PHP - Zufall . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
65
7.12 PHP - Kontrollstrukturen und Schleifen . . . . . . . . . . . . . . . . . . . . . . .
65
7.13 PHP - try/catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
67
7.14 PHP - Konguration Fehlerbehandlung . . . . . . . . . . . . . . . . . . . . . . .
67
7.15 PHP - Objektorientiert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
68
7.16 PHP - Interface Iterator
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
69
7.17 PHP - Iteratoren für Arrays und Verzeichnisse . . . . . . . . . . . . . . . . . . .
69
7.18 PHP - Interface IteratorAggregate . . . . . . . . . . . . . . . . . . . . . . . . . .
70
7.19 PHP - XML-Unterstützung
70
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7.20 HTML - einfaches Formularbeispiel für PHP Filter
. . . . . . . . . . . . . . . .
73
7.21 PHP - Formularvalidierung mit Filtern (einfach) . . . . . . . . . . . . . . . . . .
73
7.22 HTML - umfangreiches Formularbeispiel für PHP Filter . . . . . . . . . . . . . .
73
7.23 PHP - Formularvalidierung mit Filtern (umfangreich) . . . . . . . . . . . . . . .
73
7.24 PHP - Formulare mit Sicherheitsvariablen
. . . . . . . . . . . . . . . . . . . . .
74
7.25 PHP - Zu einfacher Datenbankzugri . . . . . . . . . . . . . . . . . . . . . . . .
74
7.26 PHP - Datenbankzugri
76
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
102
Listings
103
7.27 PHP - Automatischer Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
77
8.1
HTML - Einbinden von Javascript . . . . . . . . . . . . . . . . . . . . . . . . . .
80
8.2
JS - Grundlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
81
8.3
JS - Ein- und Ausgabe
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
8.4
JS - Fehlerbehandlung
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
8.5
JS - objektbasiert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
83
8.6
HTML - Eingabefelder
84
8.7
JS - Validierung der PLZ, Fehlerausgabe mit DOM
. . . . . . . . . . . . . . . .
85
8.8
JS - Validierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
85
8.9
JS - Ausgabe von Fehlermeldungen mit innerHTML . . . . . . . . . . . . . . . .
86
8.10 JS - Ausgabe von Fehlermeldungen mit innerHTML und Fokus . . . . . . . . . .
86
8.11 JS - Erzeugen eines XMLHttpRequest Objekts . . . . . . . . . . . . . . . . . . .
87
8.12 JS - Ajax-Anfrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
8.13 JS - Teste auf geeignete JS Version
. . . . . . . . . . . . . . . . . . . . . . . . .
88
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.1
PHP - Cookies
9.2
JS - Cookies schreiben
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
89
9.3
JS - Cookies lesen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
90
9.4
PHP - Session starten (fehlerhaft) . . . . . . . . . . . . . . . . . . . . . . . . . .
91
9.5
PHP - Session Werte ablegen
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
91
9.6
PHP - Session mit zusätzlicher Sicherheit . . . . . . . . . . . . . . . . . . . . . .
91
9.7
PHP - Session mit MD5
91
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
c Dr.
Ute Blechschmidt-Trapp, EWA WS 2007/08