-Tags nicht weit kommen. Dann ist es besser, mit Tabellen zu arbeiten, um die verschiedenen Elemente auf Ihrer Seite auszurichten. Da Sie den Zellen einer Tabelle exakte Breiten in Pixel zuweisen können, haben Sie vollständige Kontrolle über Ihr Layout. Abb. 2.11 zeigt eine 2x2-Tabelle, die ich meiner Seite hinzugefügt habe. Zwei Zellen sind mit Text gefüllt, die anderen mit Abbildungen. Obwohl dieses Layout sehr einfach ist, können Sie es nur mithilfe von Tabellen umsetzen (oder mit Ebenen, aber so weit sind wir noch nicht).
Abbildung 2.11: Zur Umsetzung von komplexeren Layouts benötigen Sie Tabellen.
Wenn Sie die einzelnen Elemente einer Seite mit Tabellen positionieren, empfiehlt es sich, Tabellen und Zellen feste Breiten zuzuweisen, um eine vollständige Kontrolle über das Layout zu bekommen. Ferner müssen Sie die Werte für Rahmen, Zellraum und Zellauffüllung im Eigenschafteninspektor auf »0« setzen. Nur so erreichen Sie, dass der Inhalt Ihrer Tabelle dort angezeigt wird, wo er sein soll – ohne störende Spalten oder gegen einander versetzt. Achten Sie darauf, dass die addierten Breiten der einzelnen Zellen der Gesamtbreite der Tabelle entsprechen. Stimmen diese Werte nicht überein, kann es sein, dass die Tabelle im Browser falsch dargestellt wird.
89
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Zellen verbinden und Tabellen verschachteln Die Breiten untereinander liegender Zellen in einer HTML-Tabelle müssen in jeder Zeile gleich sein, ebenso kann eine Zeile natürlich nur eine Höhe haben. Nun könnte man vielleicht meinen, das stelle eine Einschränkung bei der Positionierung von Inhalten dar, dem ist aber nicht so. In jede Zelle können Sie eine weitere Tabelle einfügen und so den Zellraum nochmals feiner unterteilen. Außerdem können Sie mehrere Zellen zu einer verschmelzen oder eine Zelle in mehrere aufteilen. Um Zellen zu verbinden, klicken Sie mit gedrückter Strg-Taste (Windows) bzw. Befehl-Taste (Mac) in die Zellen, die Sie verbinden möchten. (Die Zellen müssen in derselben Zeile bzw. Spalte liegen.) Über das Menü MODIFIZIEREN > TABELLE > ZELLEN VERBINDEN verschmelzen Sie die ausgewählten Zellen zu einer einzigen. Im Menü MODIFIZIEREN > TABELLE finden Sie nicht wenige Befehle, um das Layout von Tabellen zu verändern. Nachfolgend eine Übersicht, welche Auswirkungen die Anwendung dieser Operationen auf eine Zelle hat: 쐽
ZELLE TEILEN – Dieser Befehl erzeugt in der markierten Zelle weitere Zellen. Das Programm fragt Sie, in wie viele Spalten oder Zeilen Sie die Zelle teilen wollen.
쐽
ZEILEN ODER SPALTEN EINFÜGEN – Dieser Befehl fügt vor der markierten Zelle eine neue Zelle oder Spalte ein. Sie werden gefragt, ob Sie eine Zeile oder Spalte einfügen wollen, wie viele Zeilen oder Spalten Sie einfügen wollen und ob Sie vor oder nach der Auswahl eingesetzt werden sollen.
쐽
ZEILE/SPALTE LÖSCHEN – Entfernt die markierte Zeile bzw. Spalte.
쐽
ZEILENRAUM/SPALTENRAUM VERGRÖSSERN – Dieser Befehl vergrößert den Zeilenraum bzw. Spaltenraum einer Zelle. Die markierte Zelle wird mit der Zelle rechts bzw. unter ihr verbunden, was Einfluss hat auf den Inhalt dieser Zelle. Es ist nicht nötig, für diesen Befehl zwei Zellen auszuwählen. Ganz im Gegenteil wird er dann nicht funktionieren.
쐽
ZEILENRAUM/SPALTENRAUM VERKLEINERN – Wenn sich eine Zelle über mehrere Zeilen oder Spalten erstreckt, wird sie mit diesem Befehl wieder auf ihre ursprüngliche Größe gebracht.
Die Verwendung verschachtelter Tabellen und der verschiedenen Modi der Zellteilung bzw. -verschmelzung gibt Ihnen ein sehr flexibles Gestaltungsinstrument an die Hand, das Ihnen die exakte Umsetzung auch sehr aufwändiger Layouts erlaubt.
Kompromisse bei der Layoutkontrolle Sie haben jetzt zwei ganz unterschiedliche Layouttechniken kennen gelernt, die eine sehr locker und variabel, die andere ganz präzise. Nun möchte ich Sie mit einer Methode bekannt machen, die zwar Tabellen verwendet, aber auf eine Art und Weise, dass sie sich den unterschiedlichen Bildschirmgrößen flexibel anpassen.
90
Tabellen
Wenn Sie Tabellen bzw. Zellen feste Breiten und Höhen (in Pixel) zuweisen, haben Sie als Designer die perfekte Kontrolle über Ihr Layout. Sind die Layoutvorgaben jedoch nicht so streng, genügt es, dass Sie Tabellen bzw. Zellen relative Breiten (in Prozentwerten) zuweisen. Damit halten Sie Bild und Text in der gewünschten Anordnung zusammen, aber die Zellen können sich flexibel an die jeweilige Größe des Browserfensters anpassen. So können Sie Seitenelemente zwar nicht pixelgenau positionieren, haben aber trotzdem weit gehende Kontrolle über die Gestaltung Ihrer Seite. Die meisten Designs lassen sich sehr gut mit Tabellen relativer Breite umsetzen, außer Sie verwenden Grafiken, die Sie in mehrere Slices aufgeteilt haben, die exakt positioniert werden müssen. Sie können sogar noch einen Schritt weitergehen und überhaupt keine Breiten oder Höhen zuweisen. Dann wird der Tabelleninhalt je nach Fenstergröße umbrochen. Wie schon gesagt, ist der Grundgedanke von HTML ja der, Dokumente auf den unterschiedlichsten Plattformen verfügbar zu machen. Dieser Anforderung werden Sie am besten gerecht, wenn Sie die Kontrolle über das Layout dem Browser des Anwenders überlassen. Haben Sie Tabellen bzw. Zellen schon feste Werte zugewiesen, können Sie diese festen Breiten über den Befehl im Menü MODIFIZIEREN > TABELLE > BREITE IN PROZENT KONVERTIEREN in relative Breiten umwandeln. Umgekehrt können Sie auf demselben Weg relative Breiten in Pixel konvertieren. Über den Befehl im Menü MODIFIZIEREN > TABELLE > ZELLHÖHEN/ZELLBREITEN LÖSCHEN können Sie sämtliche Höhen- bzw. Breitenzuweisungen rückgängig machen. Diese Befehle stehen nur dann zur Verfügung, wenn Sie die ganze Tabelle ausgewählt haben. Bevor Sie sich daran machen, im Rahmen von größeren Projekten aufwändige Layouts mithilfe von Tabellen umzusetzen, sollten Sie zuvor ein bisschen mit Tabellen experimentieren. Tabellen sind ein höchst nützliches Gestaltungswerkzeug, haben allerdings so ihre Tücken, die man kennen sollte, um ihnen wirksam zu begegnen. Ein Beispiel: Sie setzen Grafiken oder Teile einer zerschnittenen Grafik in eine Tabelle ein. Statt nun die Grafiken nahtlos aneinander zu fügen, sehen Sie in der Vorschau zwischen den Bildteilen einen Spalt, durch den der Hintergrund durchscheint. Wenn das der Fall ist, müssen Sie die HTML-Quelle öffnen und den Code überprüfen. Der Grund für diese fehlerhafte Anzeige kann darin liegen, dass UltraDev ohne ersichtlichen Grund zwischen den -Tags und den -Tags einen Leerschritt eingefügt hat. Diesen Leerschritt müssen Sie dann von Hand löschen.
91
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Der Tabellen-Layoutmodus UltraDev 4.0 kommt mit einem neuen Layoutmodus, der die Umsetzung komplexer Layouts mit der Tabellentechnik wesentlich einfacher macht. Normalerweise würden Sie die Größe von Zellen durch Teilen oder Verbinden von Hand zu ändern, um sie an das Format von Bild oder Text anzupassen. Im Layoutmodus definieren Sie einfach die Bereiche, die Inhalt aufnehmen sollen, ohne sich über Breiten- oder Höhenangaben Gedanken machen zu müssen. Um in den Tabellen-Layoutmodus umzuschalten, klicken Sie unten in der Objektpalette auf das rechte Icon. In diesem Modus stehen Ihnen zwei neue Werkzeuge zur Verfügung (auszuwählen unter LAYOUT: LAYOUTZELLE ZEICHNEN und LAYOUTTABELLE ZEICHNEN). Stellen Sie sich den Tabellenmodus wie ein Skizzenblatt vor, das Sie nach Belieben frei unterteilen können. Im Tabellen-Layoutmodus klicken Sie in die Arbeitsfläche und ziehen ein leeres Eingabefeld auf. Abb. 2.12 zeigt eine leere Layouttabelle.
Abbildung 2.12: Ziehen Sie im Tabellen-Layoutmodus ein Eingabefeld an der Stelle auf, an der Sie Inhalt einfügen möchten.
In dieser Layouttabelle können Sie Layoutzellen frei platzieren, so wie Sie vorher die Tabelle platziert haben. Diese Zelle können Sie pixelgenau an einer beliebigen Stelle der Arbeitsoberfläche positionieren. In Abb. 2.13 sehen Sie die Layouttabelle, der einige Layoutzellen hinzugefügt wurden. Sie können diese Layoutzellen innerhalb der Layouttabelle beliebig verschieben und skalieren. Klicken Sie auf die Ecke einer Zelle und verschieben Sie sie mit gedrückter Maustaste an eine andere Position. Wenn Sie die Begrenzungslinie einer Zelle einmal anklicken, wird sie markiert und es erscheinen Anfasser, mit denen Sie die Zelle nach Bedarf vergrößern oder verkleinern können.
92
Menüleisten und Buttons
Abbildung 2.13: Durch Einfügen einer Layoutzelle in die Layouttabelle können Sie Inhalt beliebig platzieren.
Dabei sollten wir nicht vergessen, dass im Tabellen-Layoutmodus tatsächlich bloß eine Tabellenstruktur erzeugt wird, die auf der Größe und Position der Zellen basiert, die wir in diesem Modus eingefügt haben. Sie können jederzeit in die normale Dokumentansicht zurückschalten, indem Sie im Feld ANSICHT der Objektpalette auf die linke Schaltfläche (Standardansicht) klicken. Der Tabellen-Layoutmodus ist wirklich ein tolles Werkzeug, um Layouts exakt umsetzen, vor allem, wenn man mit Tracing-Bildern arbeitet.
2.5
Menüleisten und Buttons
Nachdem wir auf unserer Seite einen »Containerbereich« zur Aufnahme von Bild- und Textelementen definiert haben, brauchen wir noch ein Menü, um die übrigen Seiten unserer Site ansteuern zu können. Es gibt nun mehrere Möglichkeiten, eine Navigationsstruktur umzusetzen. Für welche dieser Möglichkeiten Sie sich entscheiden, ist letztlich Geschmacksache, wobei allerdings die Ladezeit der Seiten ein wichtiges Entscheidungskriterium darstellt.
Linklisten Die häufigste Form der Navigation ist die Linkliste. Textlinks laden sehr schnell, sind leicht zu erstellen und zu pflegen. In Tag 1 haben Sie gelernt, wie Sie einen Textlink zu einem anderen Dokument erzeugen können. Die Erstellung einer Linkliste funktioniert nicht anders, allerdings können Sie das Verfahren etwas rationalisieren. Tippen Sie
93
Die WYSIWYG-Layoutwerkzeuge von UltraDev
zunächst in der Dokumentansicht die einzelnen Menüpunkte untereinander in der Reihenfolge ein, wie sie später angezeigt werden sollen. Geben Sie einen Begriff ein und springen Sie mit Shift + Enter in die nächste Zeile. Wenn Sie nur Enter drücken, wird im HTML-Code ein -Tag eingefügt und Sie erhalten eine Leerzeile zwischen den einzelnen Menüpunkten. Natürlich können Sie zur Formatierung der Linkliste auch eine Tabelle verwenden. Wenn Ihre Menüstruktur fertig angelegt ist, wählen Sie die einzelnen Punkte der Reihe nach aus und klicken Sie sie mit der rechten Maustaste (Windows) bzw. mit gedrückter Control-Taste (Mac) an. Es erscheint ein Kontextmenü, in dem Sie den Befehl LINK ERSTELLEN auswählen. Das Fenster DATEI AUSWÄHLEN, das sich nun öffnet, dürfte Ihnen mittlerweile bekannt vorkommen. Um Links wieder zu löschen oder sich die Datei anzusehen, auf die verlinkt wird, rufen Sie im selben Kontextmenü den Befehl HYPERLINK ENTFERNEN auf bzw. den Befehl VERKNÜPFTE SEITE ÖFFNEN (sofern die verknüpfte Seite im lokalen Ordner der Site liegt). Dieselben Befehle können Sie auch über das Menü MODIFIZIEREN aufrufen. Wann immer es geht, sollten Sie Textlinks verwenden. Wenn Sie keine Linkliste als Hauptsteuerung verwenden, dann sollten Sie zumindest im Kopf- bzw. Fußbereich der Seiten die Hauptsteuerung in verkleinerter Form nochmals als Linkliste anbieten. Anwender, die keine grafischen Browser verwenden oder sehbehindert sind, werden es Ihnen danken.
Grafiken und Imagemaps Sie können alternativ auch Grafiken verwenden, um ein Navigationssystem innerhalb Ihrer Site einzurichten. Je einfacher diese Buttons gehalten sind, desto schneller laden sie. Mithilfe eines Grafikprogramms lassen sich problemlos separate Buttons für die einzelnen Menüpunkt erzeugen. Sie brauchen diese Buttons dann nur noch auf der Seite zu platzieren und mit den entsprechenden Dateien zu verlinken. Es dauert jedoch länger, diese einzelnen Buttons zu laden, als eine einzige Grafik, die all diese Menüpunkte enthält. Wenn Sie Ihr Menü als eine einzige Grafik anlegen, können Sie mithilfe so genannter Imagemaps innerhalb dieser Grafik »sensitive« Bereiche definieren, die als Link auf andere Dokumente der Website dienen. Wenn Sie eine Imagemap definieren, wird im HTMLCode für diese Grafik eine Art »Landkarte« angelegt, d.h., die Grafik wird mit einem Koordinatenraster überzogen. Wenn der Anwender nun in diese Grafik klickt, werden die zugehörigen Koordinaten abgefragt und der Browser ruft die Datei ab, die mit diesen Werten verlinkt ist. Um eine Imagemap zu erzeugen, müssen wir natürlich erst einmal eine Grafik auf unserer Seite platzieren. Imagemaps können Sie übrigens mit jeder beliebigen Grafik definieren. Abb. 2.14 zeigt die Menüleiste, die ich auf meiner Seite eingesetzt habe. Es handelt sich
94
Menüleisten und Buttons
um eine einzige Grafik, die die einzelnen Menüpunkte enthält. Diese einzelnen Menüpunkte möchte ich als Link definieren, um die (noch zu erstellenden) Unterseiten meiner Website anzusteuern.
Abbildung 2.14: Grafiken lassen sich problemlos für Navigationszwecke verwenden.
Wenn Sie die Grafik eingefügt haben, müssen Sie den Eigenschafteninspektor aufrufen. In der unteren Hälfte der Palette sehen Sie einige interessante Werkzeuge, die nur angezeigt werden, wenn Sie Grafiken editieren. Abb. 2.15 zeigt, wie die Palette aussieht, wenn eine Grafik ausgewählt wurde. Uns geht es im Moment speziell um die Funktionen, die links unten in der Palette angeboten werden. Abbildung 2.15: Die Werkzeuge zur Erzeugung von Imagemaps finden Sie links unten im Eigenschafteninspektor.
95
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Hier sind die Werkzeuge versammelt, die wir zur Erzeugung von Imagemaps benötigen. In das Feld MAP geben Sie den Namen ein, den Ihre Imagemap erhalten soll. Sie können jeder Grafik auf einer Seite eine eigene Imagemap zuweisen, doch müssen diese Maps eindeutig benannt werden, d.h., Sie können einen Namen nur einmal vergeben. Wenn Sie keinen Namen vergeben, erledigt dies das Programm für Sie. Unter dem Eingabefeld für den Namen finden Sie von links nach rechts vier Werkzeuge: das Auswahlwerkzeug sowie die Werkzeuge zur Erstellung von rechteckigen, ovalen und mehreckigen Hotspots. Diese Werkzeuge funktionieren ähnlich wie die Zeichenwerkzeuge eines Grafikprogramms. Wählen Sie nun eines dieser drei Werkzeuge, klicken in die ausgewählte Grafik und ziehen die entsprechende Form auf. Die so erzeugte Form ist ein so genannter Hotspot, d.h. der Bereich, dem der Link zu einem anderen Dokument zugewiesen wird. Es macht nichts, wenn die Form nicht gleich auf Anhieb sitzt, Sie können sie später immer noch korrigieren. Wie Sie sich denken können, eignet sich das Rechteckwerkzeug am besten für rechteckige Hotspots, das Ovalwerkzeug für ovale und das Polygonwerkzeug für unregelmäßige Hotspots. Der fertige Hotspot wird in blau-grüner Tönung angezeigt. Haben Sie einen Hotspot gesetzt, können Sie seine Form noch genauer anpassen. Hierzu klicken Sie auf das Pfeilwerkzeug und markieren den Hotspot, den Sie bearbeiten wollen. Über die Kontrollpunkte der Kontur können Sie das Objekt skalieren. Über die Pfeiltasten können Sie die Auswahl pixelweise verschieben und somit exakt positionieren. Zum Schluss müssen Sie den Hotspot noch mit der Datei verlinken, die geöffnet werden soll, wenn man darauf klickt. Hierzu wählen Sie mit dem Pfeilwerkzeug aus und markieren den betreffenden Hotspot. Der Eigenschafteninspektor zeigt daraufhin sämtliche Attribute dieses Hotspots. Nun setzen Sie einen Link und geben nötigenfalls ein Ziel an – genauso wie bei jedem anderen Link, den Sie erstellen. Zusätzlich können Sie noch ein -Tag setzen, was sich auch empfiehlt, um die Site auch für Anwender mit reinen Textbrowsern navigierbar zu machen. Wenn Sie sehr viele Hotspots gesetzt haben, können Sie sie über Menü ANSICHT > VISUELLE HILFSMITTEL > IMAGEMAPS ausblenden, denn über kurz oder lang wirken die vielen bunten Flecken störend.
Menüs mit Rollover-Bildern Imagemaps sind eine wunderbare Sache, doch beherrschen sie ein wichtiges Feature nicht, das heute im Internet allgegenwärtig ist: dem Anwender Feed-back geben. Wenn man auf einen Textlink klickt, wird dessen Farbe verändert. Manche Browser verändern auch die Farbe eines Links, wenn der Anwender den Mauszeiger darüber bewegt. Imagemaps dagegen sind statische Bilder, die sich nicht mit der Mausposition ändern.
96
Menüleisten und Buttons
Nur die halbe Wahrheit ... Es stimmt zwar, dass sich Imagemaps nicht automatisch ändern, wenn der Anwender die Maus darüber bewegt, doch kann man per JavaScript das aktuelle Bild austauschen oder über dem Bild eine Ebene mit Informationen einblenden lassen und so dem Anwender Feed-back geben. Doch hieße das mit Kanonen auf Spatzen schießen, denn der gleiche Effekt lässt sich mit anderen Mitteln weit einfacher erreichen.
HTML sieht keine Möglichkeit vor, Grafiken in Abhängigkeit von Aktionen des Anwenders zu verändern. In diese Lücke springt JavaScript. Mit JavaScript lassen sich Funktionen programmieren, die mit HTML nicht möglich sind, wie eben das Austauschen von Grafiken. Diese Programme werden in den HTML-Code einer Seite eingebaut. Gerade für Rollover-Menüs mit dem Wechsel zwischen ein- bzw. ausgeschalteten und aktivierten Buttons bietet sich der Einsatz von Javascript an. Im Folgenden zu reinen Anschauungszwecken der JavaScript-Code, den UltraDev für einen solchen Rollover-Effekt erzeugt: function MM_swapImgRestore() { //v3.0 var i,x,a=document.MM_sr; for(i=0;a&&i0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i
Ich glaube nicht, dass ich auf großen Widerspruch stoße, wenn ich behaupte, dass es wenig Spaß macht, obigen Code jedes Mal wieder abzutippen, wenn man Bilder per Rollover austauschen will. Erst recht nicht, wenn es sich um mehrere Bilder pro Seite handelt. Zum Glück erstellt UltraDev die nötigen Skripte von allein. Das Einzige, was Sie selbst machen müssen, ist die Erstellung der erforderlichen Buttons für die verschiedenen RolloverZustände. Meistens verwendet man zwei Grafiken, eine für den aktiven und eine für den passiven Zustand. Das Einzige, worauf Sie bei der Erstellung von Buttons achten müssen, ist, dass die Buttons gleich groß sein müssen. Wenn einer der Buttons auch nur um ein
97
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Pixel größer ist, haben Sie keinen sauberen Rollover-Effekt, und die Buttons springen. Das sieht man öfter als man meint, vor allem, wenn die Sites von Leuten gemacht werden, die keine Erfahrung im Umgang mit Grafiksoftware haben. Der einfachste Weg zu professionellen Buttons ist die Verwendung von Grafikprogrammen wie Fireworks von Macromedia. Abb. 2.16 zeigt einen ON- bzw. OFF-Button.
Abbildung 2.16: Buttons müssen gleich groß sein und in beiden Schaltzuständen gleich aussehen.
Wenn Sie die nötigen Grafiken erstellt haben, ist die Erzeugung eines Rollover-Links nur noch ein Kinderspiel. Hierzu klicken Sie in der Objektpalette entweder auf das Icon ROLLOVER-BILD EINFÜGEN oder Sie wählen Menü EINFÜGEN INTERAKTIVE BILDER > ROLLOVER-BILD. Es öffnet sich das Fenster ROLLOVER-BILD EINFÜGEN (siehe Abb. 2.17). Wählen Sie die Grafiken für den On- bzw. Off-Zustand aus sowie die URL, die angefordert werden soll, wenn der Link angeklickt wird.
Abbildung 2.17: Geben Sie in diesem Fenster die Grafiken für den On- und OffZustand ein sowie die URL, auf die verlinkt wird.
In diesem Fenster gibt es ferner ein Kontrollfeld ROLLOVER-BILD VORAUSLADEN, das in der Defaulteinstellung angewählt ist. Diese Option bedarf der Erklärung. Da Sie ja für jeden Rollover-Effekt mindestens zwei Grafiken brauchen, dauert es natürlich auch doppelt solange, bis alle Bilder einer Seite geladen sind. Wenn eine Seite sehr viele Rollover-Bilder verwendet, kann sich die Wartezeit entsprechend aufsummieren. Nun gibt es zwei Optionen, wie man diese Rollover-Bilder laden lassen kann: alle auf einmal oder dann, wenn sie benötigt werden. Wenn alle Grafiken zusammen mit der Seite geladen werden, liegen die Bilder schon im Cache bereit, wenn die Seite zum ersten Mal aufgerufen wird.
98
Menüleisten und Buttons
Die andere Option, die Bilder erst im Bedarfsfall nachzuladen, bewirkt zwar, dass die Seite selbst schneller geladen wird. Die Rollover-Bilder werden nämlich erst in dem Moment vom Server geholt, da sie durch eine Benutzeraktion angefordert werden. Es werden zuerst also nur die Bilder für den Off-Zustand geladen. Erst dann, wenn der Anwender die Maus über einen Button bewegt, werden die ON-Buttons nachgeladen. Das hört sich im ersten Augenblick ganz vernünftig an, ist aber nicht unproblematisch. Wenn man nur die Buttons lädt, die für den passiven Zustand gebraucht werden, könnte das zur Folge haben, dass Rollover-Effekte nicht zuverlässig angezeigt werden. Hat der Anwender einen langsamen Zugang, könnte es unter Umständen einige Sekunden dauern, bis die On-Buttons geladen sind – womit Rollover-Menüs ihren Sinn verloren haben. Wenn Sie Bilder nicht generell vorausladen lassen wollen, sollten Sie diese Option nur bei solchen Bildern abwählen, die aller Voraussicht nach nur selten benötigt werden. Der einzig sichere Weg, funktionierende Rollover-Menüs anzubieten, ist jedoch, alle Bilder vorausladen zu lassen. Der JavaScript-Code zum Vorausladen von Bildern wird direkt in das -Tag des Dokumentes geschrieben. Wenn Sie einzelne Bilder nicht vorausladen lassen wollen, können Sie dieses Tag direkt editieren:
Sie können auch über die Palette VERHALTEN bestimmen, welche Bilder vorausgeladen werden und welche nicht. Wie das geht, lernen Sie in Tag 4, »Websites in Bewegung – clientseitige Verhaltensweisen«. Wenn Sie Rollover-Buttons auf Ihrer Seite verwenden, dann vermutlich mehr als nur einen, denn gewöhnlich werden Sie ja eine komplette Menüstruktur aufbauen. Nun könnten Sie dieses Menü zwar mit Tabellen und der Funktion ROLLOVER-BILD EINFÜGEN erzeugen, wogegen auch nichts einzuwenden ist. Weit bequemer geht es aber mit dem Befehl NAVIGATIONSLEISTE von UltraDev. Hier sind alle Optionen in einem Fenster vereint, um horizontale oder vertikale Menüs zu erzeugen.
Navigationsleisten mit Rollover Die Funktion ROLLOVER-BILD EINFÜGEN, die Sie gerade kennen gelernt haben, lässt sich gut mit Tabellen kombinieren, um eine Navigationsleiste zu erzeugen – schneller geht es wie gesagt mit dem Befehl NAVIGATIONSLEISTE, der diese Arbeitsschritte zusammenfasst. Die in Abb. 2.18 gezeigte Dialogbox rufen Sie über die Schaltfläche NAVIGATIONSLEISTE EINFÜGEN der Objektpalette oder über das Menü EINFÜGEN > INTERAKTIVE BILDER > NAVIGATIONSLEISTE auf.
99
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Abbildung 2.18: Navigationsleiste gefällig? Über dieses Fenster können Sie komfortable Rollover-Menüs erzeugen.
Um ein neues Rollover-Bild hinzuzufügen, klicken Sie auf das Plussymbol (+), um es wieder zu entfernen, auf das Minussymbol (-). Die Reihenfolge der Buttons verändern Sie mit den Auf- und Ab-Pfeilen. Wenn Sie einen Button hinzufügen, können Sie ihm einen Namen zuweisen, um ihn eindeutig zu identifizieren (Feld ELEMENTNAME). Außerdem können Sie verschiedene Schaltzustände definieren, was mit dem Befehl ROLLOVER-BILD EINFÜGEN nicht möglich ist. 쐽
UP-BILD – Der Normalzustand eines Bildes, der angezeigt wird, wenn keine Aktion ausgeführt wird.
쐽
OVER-BILD – Dieses Bild wird angezeigt, wenn die Maus darüber bewegt wird.
쐽
DOWN-BILD – Dieses Bild wird gezeigt, wenn es mit der Maus angeklickt wird.
쐽
OVER BEI DOWN-BILD – Dieses Bild wird angezeigt, nachdem auf ein Bild geklickt wurde und anschließend der Zeiger über das Bild bewegt wird.
Die übrigen Optionen sind mehr oder weniger selbsterklärend: Die URL, die aufgerufen werden soll, wenn der betreffende Button angeklickt wird; ob die Bilder vorausgeladen werden sollen oder nicht; ob die Navigationsleiste horizontal oder vertikal eingefügt werden soll; ob Tabellen verwendet werden sollen (Standardeinstellung) oder nicht. Die Verwendung von Tabellen bietet die größte Gestaltungsfreiheit beim Layout des Menüs.
100
Ebenen
Probleme mit JavaScript Die Werkzeuge, die UltraDev zur Erzeugung von JavaScript-Elementen anbietet, sind erstklassig. Der erzeuge Code ist verglichen mit dem anderer Editoren sehr sauber und funktioniert zuverlässig. Das einzige Problem besteht darin, dass UltraDev konzipiert wurde, um HTML-Elemente mithilfe des Eigenschafteninspektors in der WYSIWYG-Ansicht zu bearbeiten. JavaScript-Code wird in das HTML-Dokument eingefügt und kann mit der Palette VERHALTEN (siehe Tag 4) bearbeitet werden. Leider funktioniert das nicht so leicht wie mit dem Eigenschafteninspektor. Sie können sich im Eigenschafteninspektor die Attribute eines Rollover-Bildes oder der Tabelle, die eine Navigationsleiste enthält, anzeigen lassen. Sie können diese Werte auch bearbeiten, aber Sie haben keine Zugriffsmöglichkeit auf den dahinter liegenden JavaScript-Code. Betrachten Sie das aber nicht als Mangel von UltraDev, sondern als Folge der Konzeption des Programms. Wie Sie später noch sehen werden, können Sie den Funktionsumfang von UltraDev durch Hinzufügen neuer Verhaltensweisen erweitern. Diese Erweiterungen werden in die Oberfläche des Programms integriert, erlauben aber nur das Einfügen von HTML- oder anderen Tags sowie JavaScript-Code in das Dokument. Es gibt jedoch keine Funktion, die es ermöglicht, diese HTML-Tags oder den JavaScript-Code als Objekt über den Eigenschafteninspektor anzuzeigen. Aber lassen Sie sich deswegen keine grauen Haare wachsen. Die Bequemlichkeit, die diese vordefinierten JavaScript-Funktionen bieten, wiegen bei weiten die Einschränkung auf, sich diesen Code nicht als mit einem Element verbundenes Objekt anzeigen lassen zu können.
2.6
Ebenen
Wenn Sie bis hierher mitgearbeitet haben, sollten Sie Layouts problemlos mit der Tabellentechnik umsetzen und die erstellten Seiten mit einer Menüsteuerung verbinden können. Nun sind Tabellen zwar eine gute Möglichkeit, konsistente Layouts zu erstellen, leider sind sie aber etwas umständlich in der Handhabung. Bei komplizierteren Layouts erzeugt das Programm eine sehr komplexe Tabellenstruktur, die von Hand nur noch sehr schwer zu editieren ist. Sich durch mehrfach verschachtelte Tabellen zu arbeiten wird schnell zum Albtraum. Um die mit der Tabellentechnik verbundenen Schwierigkeiten zu umgehen, führte Netscape zur exakten Positionierung von Elementen die Layer-Technik ein. Das -Tag ist eine Art schwebender »Container«, der HTML-Elemente aufnehmen und frei auf der Seite positioniert werden kann.
101
Die WYSIWYG-Layoutwerkzeuge von UltraDev
An und für sich eine gute Idee, nur war Netscape damit leider etwas zu weit vorgeprescht. Das -Tag entsprach nicht den HTML-Spezifikationen und nur der NetscapeBrowser konnte es darstellen. Von einer Website eine Version für den Netscape Navigator und eine weitere Version für den Rest der Welt zu erstellen, erwies sich als wenig praktikabel, und so konnte sich das -Tag nie so richtig durchsetzen. Zum Glück wurden die HTML-Spezifikationen um Tags ergänzt, die in Verbindung mit Stylesheets eine ähnliche Funktionalität bieten wie das -Tag. Somit können Webdesigner nun mit größerer Sicherheit als zuvor plattform- bzw. Browser-kompatible Webseiten entwickeln. Um nun keine übertriebenen Hoffnungen aufkommen zu lassen, soll ein Nachteil der Layer-Technik nicht verschwiegen werden: Nur Browser der neueren Generation können Sie korrekt darstellen. In älteren Browsern wird sich die Darstellung kaum mit dem decken, was Sie beabsichtigt hatten. Wenn Sie sich allerdings für den Einsatz von Layern entscheiden, werden Sie mit dieser Entscheidung nur die wenigsten Anwender vor den Kopf stoßen. Laut den Abrufstatistiken mehrerer Websites, in die ich Einblick habe, verwenden weniger als 2 % der Besucher eine ältere Browser-Version als 4.0.
Exaktes Positionieren mit Ebenen Wissen Sie noch, wie Sie zu Anfang dieser Lektion Elemente mit Tabellen und der Zuweisung von festen Höhen und Breiten positioniert haben? Ziemlich umständlich, finden Sie nicht? Mit Ebenen erreichen Sie dasselbe Ziel weitaus schneller und viel unproblematischer. Bitte blättern Sie zurück und sehen Sie sich Abb. 2.11 noch einmal an. Hier haben wir eine Tabelle mit zwei Spalten verwendet, wobei eine der Spalten eine weitere 2x2Tabelle enthielt, in die wir Bild und Text eingesetzt haben. Was wäre nun, wenn Sie die eine Abbildung etwas breiter machen wollten, sodass sie etwas über den Rand der Zelle hinausragt, die Breite der unteren Zelle aber unverändert lassen wollen? Mit Tabellen und den Mitteln von HTML könnten Sie über dieser Aufgabe etwas ins Grübeln kommen, da Sie die Zellen entweder teilen oder weitere Tabellen einfügen müssten. Mit Ebenen ist das Ganze jedoch kein Problem. Sehen Sie sich bitte einmal Abb. 2.19 an. Wie Sie sehen, deckt sich die Darstellung kaum mit dem, was mit einem normalen Tabellenlayout möglich wäre. Die Bilder liegen nicht bündig am Tabellenrand, und auch der Textfluss folgt nicht einem erkennbaren Muster von Zeilen oder Spalten. Und wenn man näher hinsieht, merkt man, dass sich die Abbildungen auf der Seite überlappen. Hier wurde nicht mit speziell bearbeiteten Grafiken oder sonstigen Tricks gearbeitet – diese Seite ist nur ein Beispiel dafür, welche Gestaltungsfreiheit und Flexibilität mit Ebenen möglich wird.
102
Ebenen
Abbildung 2.19: Ebenen ermöglichen die Umsetzung von komplexen Layouts mit geringem Aufwand.
Um eine Ebene auf einer Seite einzufügen, klicken Sie auf das Icon EBENE ZEICHNEN in der Objektpalette. Klicken Sie dann in die Arbeitsfläche und ziehen ein Rechteck in der gewünschten Größe auf. Die Größe eines Layers können Sie nachträglich jederzeit verändern.
Ebenen auswählen Wenn Sie eine Ebene einfügen, werden in der Dokumentansicht zwei Dinge angezeigt: die rechteckige Begrenzung, die den Inhalt der Ebene aufnimmt, sowie ein Icon, das die Ebene als solche symbolisiert. Um Inhalt in eine Ebene einzusetzen, klicken Sie in den Ebenenrahmen, und tippen Sie Text ein oder setzen andere Elemente mithilfe der Objektpalette ein. Links oben am Ebenenrahmen befindet sich ein kleines Quadrat. Dieser Anfasser dient dazu, die Ebene selbst (nicht deren Inhalt) auszuwählen. Die ausgewählte Ebene können Sie skalieren und mit den Pfeiltasten bzw. mit gedrückter Maustaste beliebig verschieben. Sie können eine Ebene auch durch Klick auf das gelbe Ebenen-Icon auswählen. Das ist eine sehr nützliche Funktion, um Ebenen zu markieren, denn da sich Ebenen überlappen und auch unsichtbar sein können, wäre es anderes mitunter recht schwierig, die richtige Ebene auf Anhieb wieder zu finden.
103
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Ebenen und Tracing-Bild gehören zusammen! Wenn Sie bisher auf einen triftigen Grund gewartet haben, Tracing-Bilder zu verwenden, dann hat mit der Einführung von Ebenen das Warten nun ein Ende. Definieren Sie für jedes Element Ihrer Vorlage eine eigene Ebene und platzieren Sie sie über dem Tracing-Bild. Mit den Pfeiltasten können Sie die einzelnen Ebenen genau positionieren und eine pixelgenaue Kopie Ihrer Vorlage schaffen. Natürlich können Sie auch Tabellen verwenden, um Objekte an einem Tracing-Bild auszurichten, aber Sie können nicht einfach einzelne Zellen frei verschieben. Im Tabellen-Layoutmodus sind Sie durch die Größe der übergeordneten Tabelle gebunden.
Eigenschaften Wenn Sie eine Ebene auf Ihrer Seite eingefügt haben, öffnen Sie den Eigenschafteninspektor, um sich ihre Eigenschaften anzeigen zu lassen. Abb. 2.20 zeigt die Palette mit den Werten meiner Navigationsebene. Abbildung 2.20: Ebenen besitzen Attribute, die sie mit keinem anderen HTML-Objekt teilen.
Ebenen besitzen gewisse Attribute, die kein anderes Objekt aufweist: 쐽
L/O/B/H – In diese vier Felder geben Sie (in dieser Reihenfolge) den Abstand der Ebene vom linken bzw. oberen Fensterrand sowie ihre Breite bzw. Höhe ein. Die Positionsangaben beziehen sich auf die linke obere Ecke des Ebenenrahmens.
쐽
SICHTBARKEIT – Über dieses Dropdown-Menü regeln Sie, ob eine Ebene angezeigt wird oder nicht. Für manche Zwecke ist es erforderlich, die Sichtbarkeit einer Ebene bei der Erstellung auf HIDDEN (verborgen) zu setzen, um sie dann per JavaScript einzublenden, so z.B., wenn Sie ein Popup-Fenster auf einer Seite erzeugen möchten.
쐽
Z-INDEX – Der Z-Index regelt, in welcher Schicht eines Stapels von mehreren Ebenen die jeweilige Ebene liegt. Wenn Sie eine Ebene über einer anderen Ebene platzieren möchten, geben Sie ihr einen höheren Z-Index als der darunter liegenden. Vorerst können Sie hier die Standardeinstellungen verwenden.
쐽
TAG – Über dieses Dropdown-Menü regeln Sie, mit welchem Tag die Ebene erzeugt wird. Standardwert ist das -Tag, das ebenso wie das <SPAN>-Tag von allen Browsern verstanden wird. Das
- sowie das -Tag hingegen werden nur vom Netscape Navigator verstanden.
104
Ebenen
쐽
ÜBERLAUF – Das Überlauf-Attribut funktioniert nicht in Verbindung mit den Netscape-spezifischen Tags. In Verbindung mit dem - bzw. <SPAN>-Tag regeln Sie, wie der Browser Inhalt einer Ebene behandeln soll, der größer ist als die Ebene selbst. VISIBLE zeigt den gesamten Inhalt der Ebene an, HIDDEN schneidet alles ab, was außerhalb des sichtbaren Bereichs der Ebene liegt. Die beiden letzten Optionen, SCROLL und AUTO blenden entweder dauerhaft Scrollbalken ein bzw. nur dann, wenn der Inhalt der Ebene den verfügbaren Platz überschreitet.
쐽
ABSCHN. L/O/R/U – Diese Werte sind mit den Koordinaten vergleichbar, die beim Definieren einer Ebene erzeugt werden, nur dass Sie über diese Attribute die sichtbaren Bereiche der Ebene bestimmen und nicht ihre Größe oder Position auf der Seite. Diese Werte sind relativ zur Ebene, nicht zur Seite. Sie benötigen diese Attribute zur Erstellung bestimmter JavaScript-basierter Effekte.
Mit den restlichen Optionen sollten Sie mittlerweile keine Schwierigkeiten mehr haben.
Die Ebenenpalette Da man Ebenen sehr häufig braucht, haben ihnen die Entwickler bei Macromedia eine eigene Werkzeugpalette spendiert. Um deren Funktionen näher kennen zu lernen, fügen Sie noch einige weitere Ebenen in das Dokument ein. Wenn Sie beim Einfügen der Ebene auf die Strg-Taste (Win) oder Befehl-Taste (Mac) drücken, können Sie sogar verschachtelte Ebenen erzeugen. Öffnen Sie nun mit Menü FENSTER > EBENEN die Ebenenpalette (Abb. 2.21). Mit dieser Palette können Sie unter anderem den Z-Index aller erstellten Ebenen verändern.
Abbildung 2.21: Die Ebenenpalette gibt Ihnen einen schnellen Überblick über alle Ebenen innerhalb eines Dokuments.
Wenn Sie auf das Augensymbol in der zugehörigen Spalte klicken, können Sie Ebenen ein- bzw. ausblenden (offenes bzw. geschlossenes Auge). Um den Namen einer Ebene und ihren Z-Index zu ändern, klicken Sie das betreffende Feld an und Sie können es editieren. Wenn Sie verschachtelte Ebenen erzeugt haben, werden diese eingerückt als hierarchische Liste angezeigt. Sie können verschachtelte Ebenen von der übergeordneten Eltern-Ebene lösen, indem Sie sie innerhalb der Ebenenpalette verschieben.
105
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Über dem Ebenenfeld gibt es ein Kontrollfeld ÜBERLAPPUNGEN VERHINDERN. Wenn Sie diese Option aktivieren, können Sie neu erstellte Ebenen nicht mehr über bereits vorhandenen platzieren. Über Menü MODIFIZIEREN > ANORDNEN > EBENENÜBERLAPPUNGEN VERHINDERN erreichen Sie denselben Zweck. Wozu dient nun diese Funktion?
Ebenen in Tabellen verwandeln und umgekehrt Wenn Sie einerseits nicht auf den Komfort verzichten möchten, den Ihnen die Verwendung von Ebenen in der Gestaltungsarbeit gibt, Ihnen andererseits aber auch die CrossBrowser-Kompatibilität Ihrer Seiten am Herzen liegt, bietet UltraDev ein Feature, das die Lösung für dieses Dilemma darstellt: Sie können nämlich Ebenen in Tabellen umwandeln und umgekehrt. Sie setzen also Ihren Entwurf unter Verwendung von Ebenen um, die Ihnen die freie Positionierung aller Elemente auf der Seite gestatten, und bevor Sie die Seiten publizieren, wandeln Sie sie in Tabellen um. Das einzige Hindernis besteht darin, dass das Programm sich überlappende Ebenen nicht in Tabellen verwandeln kann – daher das Kontrollfeld, von dem im vorigen Abschnitt die Rede war. Sie können diese Funktion ausprobieren, indem Sie sie über das Menü MODIFIZIEREN > KONVERTIEREN > EBENEN IN TABELLEN KONVERTIEREN aufrufen. Es öffnet sich das in Abb. 2.22 gezeigte Dialogfenster. Nach meiner Erfahrung ist es das Beste, die eingestellten Defaultwerte zu verwenden. Wenn es Ihnen nicht so sehr auf die exakte Positionierung der Zellen in der erzeugten Tabelle ankommt, können Sie statt der Option HÖCHSTE GENAUIGKEIT auch die Option KLEINSTES verwenden. Wenn Sie Tabellen mit höchster Genauigkeit erstellen lassen, erzeugt UltraDev so viele Zellen wie nötig, um den Inhalt der Ebenen möglichst genau zu positionieren. Mit der Option KLEINSTES werden Inhalte in die nächstliegende Zelle eingefügt, wenn sie innerhalb einer gewissen Zone liegen (Defaulteinstellung 4 Pixel). So werden kleinere Bereiche so weit wie möglich in einer Zelle zusammengefasst und die erzeugte Tabellenstruktur ist weniger kompliziert. Nachfolgend eine Übersicht über die weiteren Einstellungsmöglichkeiten: 쐽
DURCHSICHTIGE GIFS VERWENDEN – Formatiert die erzeugte Tabelle mit transparenten GIFs, sodass sie in allen Browsern gleich angezeigt wird.
쐽
AUF SEITE ZENTRIEREN – Die erzeugte Tabelle wird mittig auf der Seite platziert.
쐽
EBENENÜBERLAPPUNGEN VERHINDERN – Gleichnamige Funktion ein- bzw. ausschalten.
쐽
EBENENPALETTE ANZEIGEN – Ebenenpalette wird angezeigt, nachdem die Tabelle erzeugt wurde.
쐽
RASTER ZEIGEN – Raster wird angezeigt, nachdem die Tabelle erzeugt wurde.
쐽
AM RASTER EINRASTEN – Gleichnamige Funktion ein- bzw. ausschalten, nachdem die Tabelle erzeugt wurde.
106
Ebenen
Abbildung 2.22: Problemlose Umwandlung von Ebenen in Tabellen.
Umgekehrt können Sie auch Seiten, die Sie mithilfe eines Tabellenlayouts erstellt haben, von UltraDev in Ebenen konvertieren lassen. Rufen Sie hierzu den entsprechenden Befehl über Menü MODIFIZIEREN > KONVERTIEREN > TABELLEN IN EBENEN KONVERTIEREN auf. Sie werden feststellen, dass die Ergebnisse dieser Konvertierung nicht hundertprozentig exakt ausfallen. Die Grenzen dieser Funktion zeigen sich, wenn man zwischen Tabellen und Ebenen hin- und herkonvertiert. Wenn Sie z.B. bei der Konversion von Ebenen in Tabellen die Option DURCHSICHTIGE GIFS VERWENDEN aktiviert haben und nun die Tabelle wieder in Ebenen umwandeln lassen, wird nun jedes dieser GIFs in einer eigenen Ebene abgelegt. Aber auch mit diesen Einschränkungen handelt es sich trotz allem um eine höchst nützliche Funktion, die die Umsetzung von Layouts für ältere Browser erleichtert.
Mittels Frames Elemente mehrfach verwenden Bisher haben wir um Seiten miteinander zu verlinken keine andere Möglichkeit kennen gelernt, als jede Seite mit einer eigenen Menüleiste zu versehen. Dem Anwender eine einheitliche Menüsteuerung anzubieten ist eine der wichtigsten Gestaltungsregeln für die Erstellung einer Website. Konfrontieren wir den Anwender ständig mit einer anderen Oberfläche, wird ihn das irritieren und kaum längere Zeit auf unserer Seite halten. Wenn Sie mit Rollover-Menüs arbeiten, kann es einige Zeit dauern, bis die nächste Seite geladen ist. Selbst wenn die Buttons für unser Rollover-Menü im Cache abgelegt werden, bleibt die Ladezeit ein kritischer Punkt. Die Definition eines Framesets ist eine Möglichkeit, wie wir diesem Problem begegnen können. Ein Frameset besteht aus zwei oder mehreren Frames, die jeweils ein selbstständiges HTML-Dokument enthalten. Wir können also ein Framefenster für die Menüsteuerung definieren und ein weiteres für den Inhalt. Ein Vorteil der Frametechnik ist, dass wir die Inhalte der einzelnen Frames unabhängig voneinander austauschen können, also in den Inhaltsframe eine neue Datei laden können, während der Menüframe unverändert bleibt. Ein weiterer Vorteil ist, dass man die einzelnen Framefenster separat scrollen kann.
107
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Wenn Sie also in den Inhaltsframe Ihrer Seite ein längeres Dokument laden, bleibt das Menü an seinem festen Platz, sodass der Anwender jederzeit Zugriff auf die übrigen Seiten hat, während er das Dokument durchsucht. Sicher ist Ihnen schon das Eingabefeld ZIEL aufgefallen, wenn Sie einen Link gesetzt haben. Dieses Feld kommt jetzt bei der Erstellung von Framesets ins Spiel. Jeder Frame innerhalb eines Framesets hat einen eindeutigen Namen. Wenn Sie ein Dokument in einen bestimmten Frame laden lassen wollen, geben Sie bei der Definition des Links im Feld ZIEL den Namen dieses Frames an. Soll das Dokument in den gleichen Frame geladen werden, erübrigt sich die Angabe eines Ziels.
Framesets erstellen Die Definition von Framesets ist nicht gerade die stärkste Seite an UltraDev – wenn Sie mit dieser Funktion Probleme haben, sollten Sie die Schuld nicht bei sich suchen. Die Frame-Werkzeuge sind leider nicht so intuitiv zu bedienen, wie man das gerne hätte. Um ein Frameset zu erstellen, müssen Sie zuerst ein neues Dokument öffnen. Als Nächstes brauchen Sie die Unterpalette FRAMES der Objektpalette. Wählen Sie die Schaltfläche LINKEN FRAME EINFÜGEN. Hiermit teilen wir auf der linken Seite des Fensters einen Bereich, der unser Menü aufnehmen soll. Wenn Sie ein Frameset eingefügt haben, sehen Sie, dass die Design-Ansicht ähnlich wie eine Tabelle in verschiedene Bereiche aufgeteilt ist. Wenn Sie in einen dieser Bereiche klicken, um ihn zu bearbeiten, können Sie das HTML-Dokument, das in diesen Frame geladen wird, unmittelbar bearbeiten. Im Unterschied also zu Tabellen bearbeiten Sie nicht einzelne Zellen, sondern ein ganzes HTML-Dokument. Bevor wir uns aber ans Editieren machen, sollten wir das Frameset nach unseren Vorstellungen einrichten. Wählen Sie hierzu den Frame-Rahmen in der Dokumentansicht per Mausklick aus; die Frame-Rahmen müssen eingeschaltet sein (Menü ANSICHT > VISUELLE HILFSMITTEL > FRAME-RAHMEN). Wenn Sie den Mauszeiger auf den Frame-Rahmen setzen, verändert sich der Cursor zu einem Skalierwerkzeug. Ziehen Sie nun die Begrenzungslinie mit gedrückter Maustaste an die gewünschte Position. Wählen Sie nun durch Klicken auf den äußeren Rahmen das Frameset selbst aus und öffnen Sie den Eigenschafteninspektor. Abb. 2.23 zeigt die Eigenschaften eines Frame-Rahmens mit Menüsteuerung im linken Frame, wie wir ihn eingerichtet haben. Abbildung 2.23: Wählen Sie das Frameset aus, um die Eigenschaften der einzelnen Frames festzusetzen.
108
Ebenen
Im Eigenschafteninspektor können Sie die Größe der einzelnen Frames nun direkt editieren. Am rechten Rand der Palette sehen Sie ein grafisches Schema der aktuellen Frameteilung. Durch Anklicken der jeweiligen Fläche wählen Sie den entsprechenden Frame aus. Folgende Eigenschaften können Sie verändern: 쐽
RAHMEN – Wenn Sie möchten, dass Ihr Frameset von einer sichtbaren Begrenzungslinie umgeben ist, setzen Sie diese Option.
쐽
RAHMENBREITE – Wenn Sie eine Begrenzungslinie anzeigen lassen, definieren Sie hier deren Breite (in Pixel).
쐽
RAHMENFARBE – Hier weisen Sie der Begrenzungslinie eine Farbe zu.
쐽
ZEILEN- BZW. SPALTEN-AUSWAHL – Weist dem Frame eine relative (in Prozent) bzw. absolute (in Pixel) Breite oder Höhe zu.
Nachdem Sie diese Einstellungen vorgenommen haben, können Sie die Frames mit Inhalt füllen. Ich richte mein Frameset so ein, dass der linke Frame die Datei navigation.html aufnimmt und der rechte die Datei content.html. (Achtung! Diese Dateien müssen bereits vorhanden sein, bevor Sie sie in das Frameset einbinden.) Das geht am leichtesten mit der Frames-Palette, die Sie über Menü FENSTER > FRAMES öffnen (siehe Abb. 2.24). Über diese Palette können Sie nun die Eigenschaften der einzelnen Frames editieren, während wir zuvor die Eigenschaften des Framesets bearbeitet haben. Die Namen der einzelnen Frames werden in der Frames-Palette angezeigt.
Abbildung 2.24: Frames mit der Frames-Palette zur Bearbeitung auswählen
Die Frames-Palette Um einzelne Frames mit der Frames-Palette zu bearbeiten, muss der Eigenschafteninspektor ebenfalls geöffnet sein. Wählen Sie nun einen Frame in der Frames-Palette zur Bearbeitung aus und beachten Sie, wie sich die Oberfläche des Eigenschafteninspektors verändert. Es werden ganz spezifische Möglichkeiten der Editierung angeboten: 쐽
FRAME-NAME – Das ist der Name, mit dem Sie den Frame über das Attribut ZIEL ansprechen können. Wenn Sie als Ziel eines Links diesen Wert angeben, wird das Dokument in diesen Frame geladen.
109
Die WYSIWYG-Layoutwerkzeuge von UltraDev
쐽
QUELLE – In dieses Feld tragen Sie die Datei ein, die in diesem Frame zunächst angezeigt werden soll. In meinem Beispiel von oben käme in den linken Frame die Datei navigation.html und in den rechten Frame die Datei content.html.
쐽
ROLLEN – Hier stellen Sie ein, ob der Frame scrollen kann oder nicht. Bei Frames, die eine Menüsteuerung aufnehmen soll, wird man das Scrollen unterdrücken.
쐽
KEINE GRÖSSENÄNDERUNG – Wenn Sie möchten, dass der Anwender die Begrenzungslinien zwischen Frames frei verschieben kann, müssen Sie sie abwählen.
쐽
RAHMEN – Wenn Sie möchten, dass der aktuelle Frame von einem Begrenzungsrahmen umgeben ist, wählen Sie »Ja«. Diese Einstellung überschreibt die Einstellungen im Frameset.
쐽
RAHMENFARBE – Wenn Sie einen Rahmen anzeigen lassen möchten, können Sie ihm hier eine Farbe zuweisen.
Wenn Sie alle Einstellungen vorgenommen haben, speichern Sie Ihr Frameset mit Menü DATEI > FRAMESET SPEICHERN. In Abb. 2.25 sehen Sie das von mir erstellte Frameset. Wie Sie sehen, bleibt die Menüsteuerung im linken Frame fest stehen, während sich der rechte Frame scrollen lässt. Abbildung 2.25: Mit Framesets können Sie auf einer Seite statische Bereiche, wie z.B. ein Menü, definieren, die nicht mit dem anderen Teil der Seite gescrollt werden.
NoFrames-Inhalt bearbeiten Innerhalb des HTML-Codes, mit dem ein Frameset definiert wird, gibt es einen Bereich, der dann angezeigt wird, wenn der Browser die Darstellung von Frames nicht beherrscht. In diesem Bereich können Sie eine »framelose« Variante der Seite ablegen oder den Anwender höflich auffordern, sich einen neueren Browser zu besorgen, wenn er die Seite sehen möchte. Über das Menü MODIFIZIEREN > FRAMESET > NOFRAMES-INHALT BEARBEITEN können Sie diese Bereich aufrufen und bearbeiten.
110
Ebenen
Komplexe Framesets Bei der Erstellung von Framesets sind Sie nicht an die vordefinierten Schemata der Objektpalette gebunden. Ähnlich wie Tabellen können Sie auch Frames ineinander verschachteln, um einen Frame weiter zu unterteilen. Sie können Frames auch über das Menü MODIFIZIEREN > FRAMESET beliebig teilen. Das hat den Vorteil, dass Sie neue Frames innerhalb des aktuellen Framesets definieren und nicht Frameset in Frameset schachteln – was einen unschönen Spagetti-Code zur Folge hätte. Es gibt eigentlich nur einen vertretbaren Grund, mehrere Framesets ineinander zu verschachteln. Wie die Dinge im Moment liegen, können Links nur auf einen einzigen Frame innerhalb eines Framesets oder auf das Frameset selbst zeigen. Möchten Sie innerhalb eines Framesets nun mehrere Frames auf einmal austauschen, müssen Sie diese Frames in einem einzigen Frameset zusammenfassen und den Link auf dieses Frameset setzen.
Das Für und Wider von Frames Momentan wird die Frage, ob man zur Gestaltung von Websites Frames verwenden soll, wieder stärker diskutiert. Ich habe erst kürzlich am Redesign mehrerer ursprünglich Frame-basierter Websites mitgearbeitet, die nun ohne Frames funktionieren. Das Problem mit Frames ist, dass sie bei bestimmten Aktionen manchmal für Verwirrung beim Anwender sorgen können. Angenommen, Sie rufen eine Site auf, die Frames verwendet. In einem der Frames finden Sie Inhalt, der Sie interessiert und den Sie daher Ihren Lesezeichen hinzufügen möchten. Je nach Browser wird nun entweder das ganze Frameset den Bookmarks hinzugefügt (worin nun nicht unbedingt die gewünschte Seite enthalten sein muss) oder nur die der ausgewählte Frame innerhalb des Framesets. Für Neulinge im Internet kann das manchmal ebenso verwirrend wie frustrierend sein. Ein anderes Problem ergibt sich bei dynamischen Anwendungen. Wenn zwischen Anwendungen, die Inhalt für die einzelnen Frames erzeugen, Variablen übergeben werden müssen, können diese einzelnen Anwendungen sozusagen »aus dem Takt geraten«. Anstatt nur eine Seite zu generieren, muss die Anwendung mehrere Seiten in mehreren Frames aktualisieren. Das führt dazu, dass bestimmte Funktionen einer Anwendung auf mehrere Unterprogramme verteilt werden müssen, von denen jedes nur für seinen Frame zuständig ist. Wie Sie sich auch entscheiden, bei jeder Entscheidung gibt es ein Für und Wider. Frames sind ein Gestaltungsmittel von HTML wie Ebenen oder Tabellen mit ihren spezifischen Vor- und Nachteilen. Wählen Sie einfach das, was für Ihre Zwecke am besten passt.
111
Die WYSIWYG-Layoutwerkzeuge von UltraDev
2.7
Formulare
Ein HTML-Element, mit dem wir uns heute noch gar nicht beschäftigt haben, sind Formulare. Formulare werden gebraucht, um Daten an den Server zur Bearbeitung zu übergeben. Das Hauptthema dieses Buches ist ja die Erstellung serverseitiger dynamischer Anwendungen mit UltraDev, darum werden uns dem Thema »Formulare« ausführlich in Tag 11, »Datensätze mit UltraDev-Applikationen speichern, bearbeiten und aktualisieren«, widmen, wenn wir Daten in Online-Datenbanken speichern.
2.8
Zielbrowser prüfen
Nicht jeder Entwickler hat sämtliche Browser auf seinem System installiert, um den Code seiner Seiten auf alle möglichen Fehler hin zu überprüfen. In diesem Fall können Sie sich mit der Funktion im Menü DATEI > ZIELBROWSER ÜBERPRÜFEN behelfen. Dieser Befehl öffnet ein Dialogfenster, in dem Sie konfigurieren, für welche Browser Sie Ihr Dokument überprüfen lassen wollen. Wählen Sie die entsprechenden Browser aus und klicken Sie auf die Schaltfläche ÜBERPRÜFEN. UltraDev ist nun ein paar Augenblicke mit der Analyse des Codes beschäftigt und gibt dann einen präzisen Bericht aus mit Angaben zu eventuellen Fehlern und Kompatibilitätsproblemen zwischen Browsern. Abb. 2.26 zeigt die Analyse einer Seite, die für 4.0-Browser optimiert wurde.
Abbildung 2.26: Die Analyse offenbart alle Schwachstellen einer Seite.
112
Berichte erstellen
Wenn Sie es darauf anlegen, können Sie über den Befehl im Menü DATEI > KONVERTIEREN > 3.0 BROWSER-KOMPATIBEL den Code Ihrer Seite so konvertieren lassen, dass er von älteren Browsern angezeigt werden kann. Das Programm tut zwar sein Bestes, um hierbei möglichst schonend vorzugehen, aber sehr wahrscheinlich ist das Ergebnis nicht in allen Punkten so, wie Sie sich das vorgestellt haben.
2.9
Berichte erstellen
Um sich einen schnellen statistischen Überblick über die gesamte Site oder ein einzelnes Dokument zu verschaffen, rufen Sie den Befehl im Menü SITE > BERICHTE auf. Wie in Abb. 2.27 zu sehen, können Sie sich zu mehreren Themen Informationen ausgeben lassen, die die Funktionalität und die Geschwindigkeit Ihrer Site wesentlich verbessern können: 쐽
Kombinierbare verschachtelte FONT-Tags
쐽
Fehlender ALT-Text bei Grafiken
쐽
Überflüssige verschachtelte Tags
쐽
Entfernbare leere Tags
쐽
Unbenannte Dokumente
Abbildung 2.27: Wählen Sie die gewünschten Berichte aus und das Dokument, das geprüft werden soll.
Sie können auch bearbeiterspezifische Berichte erstellen oder sich eventuell vorhandene Design Notes ausgeben lassen. Mehr über verteilte Entwicklungsumgebungen erfahren Sie in Tag 3, »Websites planen und verwalten«.
113
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Abbildung 2.28: Berichte helfen bei der Fehlersuche und der Optimierung einer Website.
Wenn Sie einen Bericht erstellen lassen, wählen Sie, in welchem Umfang Dokumente geprüft werden sollen (ganze Seite, einzelnes Dokument usw.), und markieren Sie die Kontrollfelder der gewünschten Berichte. Einige Berichte erlauben die Definition zusätzlicher Prüfkriterien, die Sie unter der Schaltfläche BERICHTSEINSTELLUNGEN finden. Um die Berichtsfunktion zu starten, klicken Sie auf die Schaltfläche AUSFÜHREN. Abb. 2.28 zeigt das Ergebnis eines solchen Kontrolldurchgangs.
2.10 Zusammenfassung Heute haben Sie die meisten Werkzeuge kennen gelernt, die Sie zur Erstellung umfangreicher Websites benötigen. Tabellen, Frames, Ebenen und der Eigenschafteninspektor sollten Ihnen jetzt keine Rätsel mehr aufgeben. Zwar brauchen wir diese Werkzeuge nicht unmittelbar zur Entwicklung dynamischer Websites, doch gehören sie zum Inventar von UltraDev, das die Erstellung und Pflege einer Website in all ihren Aspekten ermöglicht – angefangen bei der logischen Struktur bis zur grafischen Gestaltung.
2.11 Fragen und Antworten F
Wenn ich für meine Website Suchbegriffe definiere, bedeutet das, dass meine Site dann in den Suchmaschinen angezeigt wird? A
114
Suchbegriffe in den <META>-Tags werden nur verwendet, wenn Ihre Site indiziert wurde. Dazu müssen Sie sie erst bei den Suchmaschinen anmelden. Gehen Sie auf die Anmeldeseite und geben Sie die URL ein, damit Ihre Site katalogisiert werden kann.
Workshop
F
Ich verwende Tabellen, um Bilder auf meiner Seite zu platzieren, aber irgendwie funktioniert das nicht richtig. Zwischen den Bildteilen ist immer ein Zwischenraum. Woran liegt das? A
F
Ich habe eine Seite mit Ebenen gestaltet, aber in der Browservorschau bekomme ich nichts angezeigt. A
F
Vergewissern Sie sich, dass Sie keine Leerzeichen in die Zellen der Tabelle eingefügt haben und dass die Zellen insgesamt nicht breiter sind als die Tabelle selbst. Tabellen sind nicht unproblematisch. Schon kleine Fehleingaben können bewirken, dass die Tabelle auseinander getrieben wird oder andere Darstellungsfehler aufweist.
Der Einsatz von Ebenen ist nur in Verbindung mit Cascading Style Sheets und 4.0-Browsern oder höher möglich. Vielleicht brauchen Sie ein Upgrade.
Ich habe ein Frameset angelegt, doch ich möchte auch einen Link auf eine Seite ohne Frames anbieten. Wie geht das? A
Geben Sie als Ziel Ihres Links »_top« an. Die Seite wird dann an »über« dem Frameset im Hauptfenster des Browsers geladen.
2.12 Workshop Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Wie können Sie sich die Tags im -Bereich anzeigen lassen und bearbeiten? 2. Wo können Sie definieren, in welcher Farbe Links dargestellt werden? 3. Wie kann ich Elemente mithilfe einer Tabelle so positionieren, dass sie nahtlos aneinander gefügt werden? 4. Ich habe eine Seite mit Ebenen erstellt, doch nun soll sie auch auf 3.0-Browsern korrekt dargestellt werden. Geht das überhaupt? 5. Ich möchte keine Ebenen verwenden. Kann ich auch mit Tabellen pixelgenau positionieren, ohne dass ich mühselig an den Zellenbreiten herumfummeln muss?
115
Die WYSIWYG-Layoutwerkzeuge von UltraDev
Übungen 1. Positionieren Sie die Elemente Ihrer Seite mit Tabellen. Die Versuchung ist zwar groß, derartige Aufgaben mithilfe von Ebenen zu erledigen, doch es schadet nach wie vor nicht, wenn Sie wissen, wie man mit Tabellen arbeitet. 2. Erstellen Sie mehrere Rollover-Bilder und eine Navigationsleiste. Wenn Sie noch keine Erfahrung mit der Erstellung der nötigen Buttons für den aktiven und passiven Zustand haben, ist die Aufgabe schwerer, als es im ersten Moment scheint. 3. Üben Sie sich in der Verwendung von Framesets. Wenn Sie schon statische Websites ohne Frames erstellt haben, strukturieren Sie sie mit Framesets um. Wenn Sie planen, in der Zukunft Frame-basierte Websites zu erstellen, sollten Sie sich mit den FrameWerkzeugen von UltraDev gut vertraut machen.
116
Websites planen und verwalten
3
Websites planen und verwalten
Zwar haben wir in Tag 2, »Die WYSIWYG-Layoutwerkzeuge von UltraDev«, die zur Umsetzung einer Website nötigen Werkzeuge schon kennen gelernt, doch benötigen wir noch etwas Hintergrundwissen, bevor wir eine Website mit allem, was dazugehört, entwickeln können. Die Gestaltung von Websites besteht nicht nur in der Erzeugung des nötigen HTML-Codes und der Grafiken. Sie müssen vor allem planen, wie Sie dem Anwender Ihre Informationen präsentieren, wie Sie ihn durch Ihre Seiten führen und wie er damit interagieren kann. Die Themen des heutigen Tages: 쐽
Vorbereitende Schritte bei der Realisierung einer Website
쐽
Die Werkzeuge von UltraDev zur Optimierung und Vereinfachung des Gestaltungsprozesses
쐽
Bestehende Websites innerhalb der gewohnten Oberfläche bearbeiten
쐽
Websites online betreuen und Arbeiten in verteilten Entwicklungsumgebungen
3.1
Planung der Site
Die Site-Planung ist die wichtigste Phase bei der Erstellung einer Website. Bei der Entwicklung müssen Sie besonders darauf achten, den Anwender navigationstechnisch in keine Sackgasse zu führen. Wird eine Website von einem Team realisiert, muss verstärkt darauf geachtet werden, ein einheitliches Layout- und Navigationsschema einzuhalten. Ich bin mir ziemlich sicher, dass jeder von Ihnen schon einmal die Erfahrung gemacht hat, sich auf einer Website nicht mehr zurecht zu finden. Plötzlich steht das Menü an einer anderen Stelle, Links sind mal sichtbar und dann wieder nicht, das Design wechselt von Unterseite zu Unterseite. Wie in der gestrigen Lektion erwähnt, ist ein Nachteil von Frames der, dass der Überblick schnell verloren gehen kann, wenn mehrere Dateien zugleich in mehrfach geteilten Framesets dargestellt werden. Zudem trifft man immer wieder auf die Unsitte, dass manche Websites stillschweigend Inhalte anderer Sites in eigene Frames laden. Neben dem fragwürdigen Umgang mit fremdem geistigen Eigentum sind solche Sites höchst chaotisch, denn es unmöglich nachzuvollziehen, wo die gezeigten Information herkommen oder angezeigt werden. Diese und ähnliche Fehler lassen sich durch sorgfältige Planung vermeiden. Verwenden Sie vor der Umsetzung einer Website genügend Zeit auf die Planung, Sie sparen sich damit so manchen Arbeitstag, den Sie die Überarbeitung der Site gekostet hätte.
Sitemaps Was versteht man eigentlich unter einer Sitemap? Nun, sie ist der Bauplan Ihrer Website. Sie ist ein Hilfsmittel, mit dem Sie visualisieren, wie der Anwender innerhalb der einzel-
118
Planung der Site
nen Seiten navigieren kann. Wenn Sie die Sitemap Ihrer neuen Website aufzeichnen und dann feststellen, dass man zur Hauptinformation nur über einen einzigen Link von der Seite »Meine Kinderfotos« kommt, sollten Sie Ihre Strategie noch einmal überdenken. Nehmen wir als Beispiel die Sitemap eines kleinen Computerladens. In Abb. 3.1 sehen Sie eine mögliche Sitemap, die wir zur Erstellung unserer Website verwenden können. In dieser Sitemap werden die einzelnen Seiten in Kategorien eingeteilt, die Verlinkung zwischen den einzelnen Kategorien wird durch Linien symbolisiert. Wenn Sie den Aufbau einer Site visualisieren, bevor Sie sie umsetzen, können Sie feststellen, welche die geeignete Navigationsstruktur ist. So vermeiden Sie auch das Problem der verwaisten Seiten, die nicht mit den übrigen Seiten innerhalb der Website verlinkt sind. Verwaiste Seiten entstehen meistens dann, wenn mehrere Entwickler an einer Site arbeiten. Jemand erstellt eine Seite, aber sie wird nie mit den übrigen Dokumenten verlinkt. Ich habe das selbst mehrfach erlebt, wenn Sites ohne entsprechende Sitemap realisiert wurden. Ich habe vor nicht allzu langer Zeit eine Website nach Kundenvorgaben umgesetzt, um schließlich festzustellen, dass man den Bereich »Über unsere Firma« von keiner der übrigen Seiten erreichen konnte. Hätten wir uns die Zeit genommen, vorher eine Sitemap zu erstellen, wäre dieses Problem gar nicht aufgetreten. Startseite
Firmeninfo
Mitarbeiter
Jobbörse
Hilfe
Shopping System
Firmennachrichten
Produktkatalog
Ausloggen
Abbildung 3.1: Eine Sitemap erleichtert die Erstellung der Navigationsstruktur und die anschließende Umsetzung der Website.
119
Websites planen und verwalten
Aufbau einer Verzeichnisstruktur Sitemaps erweisen sich auch als sehr nützlich, wenn es darum geht, die Verzeichnisstruktur einer neuen Website zu definieren. Immer wieder erlebt man, dass man die Betreuung einer Website übernimmt und feststellt, dass sämtliche Seite in einem einzigen Ordner liegen, egal welcher Kategorie oder welchem Menüpunkt sie angehören. Beim Anlegen einer Sitemap muss man sich notgedrungen auch Gedanken darüber machen, in welcher Beziehung die einzelnen Seiten bzw. Dokumente zueinander stehen. Wenn man dann später die eigentliche Site erstellt, bietet es sich geradezu an, zusammengehörige Dokumente in einem eigenen Ordner zu speichern und diesen sinnvoll zu benennen. Das Wiederfinden von Seiten zur späteren Bearbeitung wird hierdurch ungemein erleichtert. Normalerweise legt man für jeden Menüpunkt einer Website einen eigenen Ordner an und innerhalb dieser Ordner jeweils einen Unterordner für das auf diesen Seiten verwendete Grafikmaterial. Natürlich gibt es Fälle, für die sich andere Verzeichnisstrukturen besser eignen. In manchen Fällen enthält das einzelne Dokument so viele Abbildungen, dass es sinnvoller ist, für diese Datei einen eigenen Bildordner anzulegen. Bei der Definition einer Verzeichnungsstruktur sollte man immer im Hinterkopf behalten, dass die Website, die man erstellt, irgendwann von jemand anderem gewartet wird. Wenn Sie eine saubere, logisch gut nachvollziehbare Verzeichnisstruktur aufbauen, können Sie Ihrem Nachfolger das Leben um einiges leichter machen.
Dateinamenskonventionen Wenn Sitemap und Verzeichnisstruktur Ihrer Website stehen, ist der nächste wichtige Schritt, ein verbindliches Namensschema für die Benennung von Dateien festzulegen. Je nach Umfang der Website arbeiten meist mehrere Entwickler – HTML-Autoren, Grafiker, Systemadministrator – am Projekt mit, deren einzelne Beiträge zusammengeführt werden müssen. Jeder der am Projekt Beteiligten sollte auch ein Mitspracherecht bei der Festlegung der Dateinamenskonventionen haben.
Programmierer und Grafiker Für eine reibungslose Umsetzung des grafischen Entwurfs in das fertige Endprodukt muss der Programmierer wissen, wo der Grafiker welche Abbildungen in welcher Form verwenden will. Ein Beispiel: Größere Grafiken werden oft in kleinere Teile zerschnitten und dann in einer Tabelle wieder zusammengesetzt. Erhält der Programmierer diese Bilddateien nun vom Grafiker mit der Bezeichnung bild1.jpg, bild2.jpg usw., muss der Programmierer jede einzelne Datei öffnen und versuchen, das Puzzle richtig zusammenzusetzen (oder den Grafiker stundenlang am Telefon interviewen). Man wird also viel Zeit, Geld und Ner-
120
Planung der Site
ven sparen, wenn man ein System zur Benennung von Grafikdateien festlegt, aus dem die Position der einzelnen Bildteile in Tabellenzeile und -spalte klar hervorgeht. Heißt eine Datei dann z.B. blume01_z1s1.jpg, dann weiß der Programmierer sofort, dass dieses Bild in Zeile 1 Spalte 1 der Tabelle auf dieser bestimmten Seite gehört. Das ist natürlich nur ein Beispiel und Sie finden vielleicht auch ein System, das für Ihr Projekt besser passt. Ich möchte Ihnen nur empfehlen, ein entsprechendes Benennungssystem zu definieren und sich auch strikt daran zu halten, selbst dann, wenn außer Ihnen niemand an dem Projekt arbeitet. Spätestens, wenn Sie die Wartung einer Website übernehmen, bei der Sie auf solche Dateinamen wie 13123a.jpg stoßen, werden Sie feststellen, wie wichtig sinnvolle Dateinamen sind.
Programmierer und Systemadministrator Wenn Sie beide Ämter in Personalunion vereinen, ist das Glück Ihnen hold. Wenn nicht, sollten Sie einige Vorsichtsmaßnahmen treffen, bevor Sie sich an die Erstellung von Seiten machen. Auf welche Dateinamenskonventionen Sie sich auch geeinigt haben, die nach diesem Schema erstellten Dateinamen müssen für den Webserver, auf dem Ihre Website liegt, verständlich sein. Wenn Sie einen Macintosh-Webserver betreiben, auf dem irgendwas unter Mac OS X läuft, werden Sie mit Dateinamen, die länger als 32 Zeichen sind, Schwierigkeiten bekommen. UNIX-Systeme unterscheiden zwischen Groß- und Kleinschreibung, das ist besonders bei Links wichtig. Für einen Windows-Server ist die Datei HELLO.HTM identisch mit hello.htm. Unter Windows ist es also egal, wie Sie den Link schreiben, für UNIXSysteme müssen Sie hier jedoch klar unterscheiden. Die kleinen Eigenheiten der verwendeten Plattform sollten also bekannt und dokumentiert sein, bevor Sie sich daran machen, Dateinamen zu vergeben. Wenn Sie bei der Benennung von Dateien die folgenden Grundregeln einhalten, sind Sie schon weitgehend auf der sicheren Seite: 쐽
Keine Satzzeichen, keine Sonderzeichen – Entfernen Sie sämtliche Satz- und Sonderzeichen aus Dateinamen (ä, ö, ü, ß, &, Komma, usw.).
쐽
Keine Leerzeichen – Sie könnten theoretisch zwar Leerzeichen in Dateinamen verwenden, doch haben sie praktisch verschiedene Nachteile. Leerzeichen müssen im HTML-Code nämlich in die Zeichenfolge %20 aufgelöst werden, was beim Verlinken auf Dateinamen, die Leerzeichen verwenden, problematisch werden kann. Markieren Sie Wortgrenzen innerhalb von Dateinamen besser mit einem Unterstrich: erste_ seite.htm.
쐽
Einheitliche Schreibung – Wechseln Sie nicht bei der Schreibung von Dateinamen nicht zwischen Groß- und Kleinbuchstaben. Entscheiden Sie sich für eine Schreibung und behalten Sie sie bei.
121
Websites planen und verwalten
쐽
Kurz und einfach – Verwenden Sie einfache, möglichst kurze Dateinamen. Dadurch wird die eventuelle Portierung der Website auf andere Systeme erleichtert und der HTML-Code ist besser zu lesen und zu warten.
Die Einhaltung obiger Regeln ist zwar noch keine Garantie, dass Ihre Seiten auf anderen Plattformen problemlos laufen, aber die Wahrscheinlichkeit ist ziemlich groß. Fragen Sie Ihren zuständigen Systemadministrator, ob noch weitere, plattformspezifische Vorgaben bestehen, die Sie einhalten müssen.
3.2
Die Sitemap-Werkzeuge von UltraDev
Mit den eingebauten Sitemap-Werkzeuge von UltraDev wird die Anlage und Wartung von Websites fast zum Kinderspiel. Zwar entheben Sie diese Funktionen nicht der Notwendigkeit, die Grundstruktur Ihrer Website zunächst von Hand zu entwerfen und zu zeichnen, doch erleichtern sie den Weg vom Entwurf zur tatsächlichen Umsetzung erheblich. Nur durch das Öffnen eines Dokuments bzw. das Setzen eines Links erzeugen Sie die komplette Struktur Ihrer Website. (Bei der Erstellung der Inhalte müssen Sie beim gegenwärtigen Stand der Technik freilich noch selber tätig werden.) Sie haben die Site-Werkzeuge in ihrer einfachsten Form bereits kennen gelernt, als wir die Liste der Dateien im lokalen Ordner der Site-Ansicht durchforscht haben. In einem anderen Ansichtsmodus werden die Dateien einer Site in Form eines Struktogramms dargestellt, das die Verbindungen der Dokumente untereinander visualisiert. In dieser Darstellung können Sie z.B. Links zwischen Dokumenten setzen oder wieder löschen. Diese Struktogramm-Ansicht, also die eigentliche Sitemap, können Sie in zweierlei Weise nutzen: entweder, um die Struktur einer bereits erstellten Website darstellen zu lassen oder um eine neue Website zu erstellen. Zuerst werden wir die Sitemap-Funktion an einer bestehenden Website testen, dann erstellen wir mit ihrer Hilfe eine neue Site.
Sitemaps von fertigen Websites anzeigen Wenn Sie schon eine Site definiert und ein paar Seiten erstellt haben, dann öffnen Sie sie bitte über das Menü SITE > SITE ÖFFNEN. Haben Sie noch keine Sites definiert, dann öffnen Sie eine der Tutorial-Sites, die UltraDev bei der Installation automatisch anlegt, um die Funktion der Sitemap-Werkzeuge nachvollziehen zu können. Sobald Sie eine Site geöffnet haben, können Sie in die Sitemap-Darstellung umschalten. Hierzu klicken Sie auf die dritte Schaltfläche von links in der Menüleiste der Site-Ansicht. Über das Menü FENSTER > SITEMAP können Sie diese Ansicht ebenfalls aufrufen. Die Anzeige auf Ihrem Monitor sollte dann in etwa so aussehen wie in Abb. 3.2 gezeigt. Tolle
122
Die Sitemap-Werkzeuge von UltraDev
Sache, nicht wahr? Und das Ganze ist nicht nur nett anzusehen, sondern darüber hinaus noch höchst nützlich. Lassen Sie uns das Site-Fenster und die Funktionen, die man in dieser Ansicht ausführen kann, nun etwas näher untersuchen.
Abbildung 3.2: Die Sitemap ist eine grafische Darstellung der Struktur einer Website.
Die von UltraDev dargestellte Sitemap hat große Ähnlichkeit mit einem handgezeichneten Struktogramm, bietet aber den großen Vorteil, dass sie den direkten Zugriff auf den HTML-Code erlaubt.
Seitensymbole Jedes Symbol in der Sitemap steht für eine verlinkte Seite, wobei für lokale und entfernte Dokumente unterschiedliche Icons verwendet werden. Lokale Dokumente werden mit dem standardmäßigen Dokumentsymbol von UltraDev angezeigt, Links zu externen Seiten werden durch ein Symbol dargestellt, das aussieht wie ein beschriebenes Blatt Papier mit einem kleinen Globus rechts daneben. Diese beiden Symbole sind die primären Platzhalter für Dokumente innerhalb einer Website. Um zusätzliche Informationen zu den Dokumenten anzuzeigen, können Sie sich im Site-Fenster über das Menü ANSICHT > ABHÄNGIGE DATEIEN ANZEIGEN sämtliche Dateien einblenden lassen, die mit den einzelnen Dokumenten verlinkt sind (Grafiken, Stylesheets usw.). Da bei dieser Art der Darstellung der Überblick schnell verloren geht, sollten Sie sie nur im Bedarfsfall einblenden. Standardmäßig wird in der Sitemap der Dateiname eingeblendet, unter dem ein HTMLDokumente gespeichert ist. Sie können sich aber anstelle der Dateinamen den aus dem <TITLE>-Tag abgeleiteten Seitentitel anzeigen lassen, wenn Sie das praktischer finden. Wählen Sie hierzu im Site-Fenster den entsprechenden Befehl im Menü ANSICHT > SEITENTITEL ANZEIGEN. Diese Option können Sie auch im Dialogfenster SITE-DEFINITION unter der Kategorie SITEMAP-LAYOUT wählen.
123
Websites planen und verwalten
Aussagekräftige Seitentitel spielen auch eine wichtige Rolle bei der Benutzerführung, da sie in der Titelleiste des Browsers angezeigt werden. Seiten ohne Seitentitel sind auch nicht sinnvoll unter den Lesezeichen abzulegen, da keine Informationen zur Seite gespeichert werden. Seitentitel helfen dem Anwender somit, gespeicherte Informationen schnell wiederzufinden und erleichtern ihm die Navigation. Über die Option SEITENTITEL ANZEIGEN finden Sie mühelos sämtliche Dateien, denen Sie noch keinen Seitentitel zugewiesen haben. Diese Dateien sind mit »Untitled Document« gekennzeichnet. Wenn Sie möchten, dass ein bestimmtes Dokument in der Sitemap nicht angezeigt wird, können Sie es über das Menü ANSICHT > HYPERLINK EINBLENDEN/AUSBLENDEN verbergen. Wenn Sie allerdings einen Hyperlink ausblenden, wird es schwierig, ihn über HYPERLINK EINBLENDEN wieder anzuzeigen. Zum Glück können Sie über Menü ANSICHT > ALS VERBORGEN MARKIERTE DATEIEN ANZEIGEN ausgeblendete Dateien wieder einblenden. Hier handelt es sich wieder um eine der merkwürdigen Funktionen von UltraDev, die nicht unbedingt auf Anhieb verständlich sind. Lassen Sie verborgene Hyperlinks wieder einblenden, so werden sie in Kursivschrift markiert. Abschließend sei noch auf ein weiteres nützliches Feature der Sitemap hingewiesen, nämlich auf die Farbe, mit der die Symbole beschriftet werden. Unterbrochene Links werden in Rot dargestellt, somit brauchen Sie die Sitemap nur nach rot markierten Symbolen zu durchsuchen, um eventuelle Probleme zu finden.
Links Wie Sie bereits gesehen haben, werden Links zwischen Dokumenten als Pfeillinien zwischen den Dokumenten dargestellt. Manchmal geht die Sitemap-Funktion nicht so sparsam mit dem gebotenen Platz um, wie man das gerne möchte. In diesem Fall können Sie den Cursor auf die vertikalen Pfeillinien setzen und die Symbole mit gedrückter Maustaste verschieben, um mehr Platz zu gewinnen. Neben dem Symbol für lokal gespeicherte Dokumente gibt es ein kleines Fadenkreuz, wie Sie es schon im Eigenschafteninspektor neben dem Eingabefeld HYPERLINK kennen gelernt haben. Sie können Links erstellen, indem Sie dieses Fadenkreuz auf die Datei ziehen, auf die Sie einen Link setzen möchten. Damit fügen Sie im Fußbereich des Dokuments einen Textlink zur Zielseite ein. Es wäre natürlich nur allzu schön, wenn der Link gleich an der richtigen Stelle in unserem tollen grafischen Menü sitzen würde, aber so weit ist die Technik noch nicht. Sie müssen also die Seite öffnen und den Link von Hand an die richtige Stelle kopieren. Über den Befehl Menü MODIFIZIEREN > LINK ERSTELLEN können Sie ebenfalls einen Link setzen. Wenn Sie sich die Struktur Ihrer Website aus mehreren, hierarchisch angeordneten Ebenen zusammensetzt, werden Sie wahrscheinlich schon bemerkt haben, dass UltraDev nur
124
Die Sitemap-Werkzeuge von UltraDev
die oberste Ebene in der Hierarchie anzeigt. Die darunter liegenden Ebenen können Sie sehen, wenn Sie auf das Plussymbol (+) links neben dem Seitensymbol klicken, worauf der Ast des Strukturbaumes aufgeklappt wird, der die von diesem Dokument abhängigen Seiten enthält. Durch Klick auf das Minussymbol (-) können Sie den Ast wieder zusammenfalten. Sie können also die Anzeige übersichtlich halten und immer nur den Ast aufklappen, den Sie bearbeiten möchten. Wenn Sie sehr tief in der Struktur hinuntersteigen, kann es trotzdem irgendwann unübersichtlich werden. Dann empfiehlt es sich, die Datei zu markieren und im Site-Fenster über den Befehl im Menü ANSICHT > ALS STAMMORDNER ANZEIGEN als Verzeichniswurzel zu definieren. Die Datei wird dann in der obersten Ebene der Sitemap angezeigt. Am oberen Rand des Sitemap-Fensters wird dann ein Pfad angezeigt, aus dem Sie ersehen können, an welcher Stelle der Site-Hierarchie Sie sich befinden (siehe Abb. 3.3). Wenn Sie die entsprechenden Knotenpunkte, die über der Sitemap angezeigt werden, anklicken, können Sie im Verzeichnisbaum wieder nach oben hüpfen.
Abbildung 3.3: Verwenden Sie die Knotenpunkte über dem Sitemap-Fenster, um durch die Verzeichnisstruktur der Site zu navigieren.
Wenn Sie ein neue Homepage definieren möchten, markieren Sie die betreffende Datei im lokalen Ordner und wählen Sie im Site-Fenster den entsprechenden Befehl im Menü SITE > ALS HOMEPAGE EINRICHTEN. Über Menü SITE > NEUE HOMEPAGE können Sie ein neues HTML-Dokument einrichten, das die Stammseite Ihrer Website wird. Bis jetzt habe ich allerdings noch keine rechte Verwendung für diese Funktionen gefunden. Nützlicher sind da schon die Befehle SITE > HYPERLINK ÄNDERN bzw. HYPERLINK ENTWenn Sie ein Seitensymbol auswählen und den Befehl SITE > HYPERLINK ÄNDERN aufrufen, öffnet UltraDev das bekannte Dialogfenster HTML-DATEI AUSWÄHLEN. Wenn Sie einen Link ändern, wird UltraDev alle Links entsprechend anpassen, sodass sie auf die neue Datei verweisen. Umgekehrt löscht der Befehl SITE > HYPERLINK ENTFERNEN alle Links innerhalb der Site, die ursprünglich auf diese Datei verwiesen haben. Das hört sich anfangs vielleicht etwas verwirrend an, denn Sie ändern nicht das markierte Dokument, sondern die Links in den Dateien, die auf dieses Dokument zeigen. FERNEN.
125
Websites planen und verwalten
Ausgewählte Dateien Innerhalb der Sitemap können Sie mit der Maus ein Auswahlrechteck aufziehen und mehrere Dateien auf einmal selektieren. In der Statuszeile wird eine Gesamtinformation zu den ausgewählten Dateien angezeigt. Wenn Sie in der Sitemap Dateien auswählen, werden die zugehörigen Einträge in der Dateienliste des lokalen Orders ebenfalls markiert.
Weitere Sitemap-Optionen Sie können die Darstellung der Sitemap über verschiedene Optionen verändern. Rufen Sie hierzu in der Site-Ansicht den Befehl im Menü ANSICHT > LAYOUT auf. Es öffnet sich das Dialogfenster SITE-DEFINITION, die Kategorie SITEMAP-LAYOUT wird automatisch aktiviert. Auch hier ist die Oberfläche von UltraDev nicht ganz logisch. Außer ANZAHL DER SPALTEN und SPALTENBREITE können Sie hier keine Einstellungen vornehmen, die nicht bereits woanders angeboten wurden. ANZAHL DER SPALTEN besagt, wie viele Seitensymbole in der Sitemap nebeneinander in einer Reihe platziert werden, SPALTENBREITE definiert eine Standardbreite für ein Seitensymbol und seine Beschriftung (in Pixel).
Mit der Sitemap neue Websites anlegen Wenn wir eine fertige Website haben, können wir die Sitemap-Funktionen von UltraDev sofort einsetzen, um sie zu verwalten. Doch was bringt die Sitemap, wenn wir unsere Website erst anlegen müssen? Angenommen, Sie haben den Strukturplan Ihrer Website bereits per Hand skizziert, dann können Sie eine »Skelettversion« dieser Site erstellen, ohne dass Sie sofort Inhalte oder die nötigen Navigationselemente einbauen müssen.
Eine neue Site definieren Wenn Sie mit den Sitemap-Funktionen eine Site anlegen wollen, wählen Sie im SiteFenster den Befehl im Menü SITE > NEUE SITE. Erzeugen Sie einen neuen Stammordner, der die Dateien der Site lokal speichert. Nehmen Sie sämtliche Einstellungen so vor, als würden Sie der Site gleich Dateien hinzufügen. Definieren Sie eine Homepage und lassen Sie sie vom Programm gleich erstellen. Schalten Sie nun die Sitemap-Ansicht ein. Sie sollte eine einzige Datei oben im Fenster anzeigen.
Inhaltsseiten erstellen Für eine Website brauchen wir natürlich mehr als bloß die Homepage. Die übrigen Seiten und die erforderlichen Links zwischen den Seiten lassen sich in einem Arbeitsgang leicht erstellen. Nehmen wir an, dass wir von der Homepage auf drei weitere Seiten verlinken:
126
Die Sitemap-Werkzeuge von UltraDev
content.html, links.html und about.html. Markieren Sie das Seitensymbol der Homepage in der Sitemap und rufen Sie den Befehl im Menü SITE > VERKNÜPFEN MIT NEUER DATEI auf (auch über das Kontextmenü zugänglich). Es öffnet sich das in Abb. 3.4 Dialogfenster VERKNÜPFEN MIT NEUER DATEI. In dieses Fenster geben Sie Titel und Dateinamen Ihres neuen Dokuments ein.
Abbildung 3.4: Einfaches Erzeugen neuer Dateien in der Site-Ansicht.
Wenn Sie die neuen Dateien angelegt haben, werden die zugehörigen Symbole in der Sitemap sowie die Links angezeigt. Auf diese Weise können Sie alle Seiten Ihrer Website erzeugen.
Links definieren Zwar wurden die neu erzeugten Seiten mit der markierten Seite verlinkt, zwischen den neuen Seiten selbst jedoch bestehen noch keine Verknüpfungen. Wenn Sie sich noch erinnern können, was über die Erstellung von Links innerhalb bestehender Websites geschrieben wurde, wissen Sie, was zu tun ist. Wenn nicht, dann sei es hiermit wiederholt: Markieren Sie das entsprechende Seitensymbol und ziehen Sie das Fadenkreuz, das neben dem Symbol angezeigt wird, auf die Datei, auf die Sie den Link setzen wollen. Innerhalb kürzester Zeit können Sie so das Grundgerüst einer Website definieren sowie die Links zwischen den Seiten. So können Sie im Schnellverfahren einen Prototyp Ihrer Website anlegen, um die Navigation Ihrer künftigen Website zu testen und so ein Gefühl für ihre Funktionalität zu bekommen. Und wenn Sie dann so allmählich das Material von Ihren Kunden bekommen, können Sie die Seiten sogar mit Inhalt füllen.
Dateien organisieren Nun könnten Sie natürlich einwenden, dass alle Dateien, die wir auf diesem Weg erzeugt haben, im selben Verzeichnis liegen, und mich fragen, wie das zu meinen früheren Aussagen bezüglich einer klaren Dateistruktur passt. UltraDev besitzt die erfreuliche Eigenschaft, Links zu aktualisieren, wenn Dateien verschoben werden. Nachdem Sie also alle Seiten erzeugt und miteinander verlinkt haben, können Sie die nötigen Ordner anlegen und die Dateien dorthin verschieben. Die Links funktionieren weiterhin.
127
Websites planen und verwalten
Um neue Ordner zu erzeugen, klicken Sie mit der rechten Maustaste in das Fenster LOKALER ORDNER. Aus dem Kontextmenü wählen Sie den Befehl NEUER ORDNER. Wenn Sie alle Ordner definiert haben, verschieben Sie die Dateien in die richtigen Ordner. UltraDev wird alle Links aktualisieren.
Sitemap speichern Wen die Site fertig ist und Sie mit der Sitemap zufrieden, können Sie dieselbe über den Befehl im Menü DATEI > SITEMAP SPEICHERN als Grafik speichern. Das ist sehr nützlich, wenn Sie die Sitemap online stellen möchten. Sie können auf dieser Grafik dann Imagemaps definieren, um auf die verschiedenen Seiten zu verlinken. So wird die Sitemap zur Navigationshilfe für die Besucher Ihrer Site.
3.3
Websites in UltraDev importieren
Als Benutzer von UltraDev fallen Sie zwangsläufig in eine der folgenden Kategorien: Entweder erstellen Sie mit dem Programm neue Websites, oder Sie verwenden es, um bereits existierende Websites zu bearbeiten. Sie haben mittlerweile das nötige Wissen, um eine neue Website anzulegen. Doch was, wenn eine Website irgendwo draußen auf einem Server liegt und gepflegt und aktualisiert werden muss?
Wie Sie an die Daten kommen Je nach Serverplattform haben Sie mehrere Zugriffsmöglichkeiten auf die benötigten Daten. Am einfachsten ist es, wenn die Daten auf einem Netzlaufwerk liegen, zu dem Sie direkten Zugang haben, und Sie die Daten direkt auf dem Server bearbeiten können. Meine Kopie von UltraDev greift auf das Netzlaufwerk eines Linuxservers zu, sodass HTML-Dateien unmittelbar bearbeitet und aktualisiert werden. Linux- und NT-basierte Server haben im Normalfall keine Probleme im Zusammenspiel mit Mac- oder WindowsClients, was sie zu nahezu idealen Serverplattformen macht. Wenn Sie keinen Netzwerkzugang zum Server haben, können Sie über FTP auf die Daten der Website zugreifen. Wenn Sie mit FTP arbeiten, müssen Sie immer eine lokale Kopie der Website auf dem Rechner anlegen, auf dem Sie die Website bearbeiten. Sie nehmen Aktualisierungen an den lokalen Dateien vor und laden die geänderten Dateien dann auf den Server.
128
Websites in UltraDev importieren
Sie können auf jeden Fall eine lokale Kopie der Website anlegen und die Änderungen auf den Server übertragen, ob der Zugriff nun per Netzwerk oder FTP erfolgt. Wenn Sie Änderungen direkt auf dem Server durchführen können, wozu sollten Sie dann eine lokale Kopier der Website anlegen? Dateien lokal zu bearbeiten empfiehlt sich vor allem dann, wenn Sie nicht ständig mit dem Netzwerk verbunden sind oder Ihr Zugang sehr langsam ist. Darüber hinaus können Sie mit einer lokalen Kopie Änderungen an der Website ausführlich testen, bevor Sie sie online stellen. Wenn eine Seite noch im Bearbeitungsstadium ist und versehentlich publiziert wurde, dann können Sie nur beten, dass Sie keine Kommentare eingefügt haben, die nicht für die Augen der Öffentlichkeit bestimmt sind. Ich möchte Ihnen raten, grundsätzlich mit einer lokalen Kopie zu arbeiten und die Seiten erst dann zu veröffentlichen, wenn alle Änderungen abgeschlossen sind und die Site ausführlich getestet wurde.
Webserver-Verbindung einrichten Bevor Sie eine Verbindung zum Webserver einrichten, müssen Sie sich entscheiden, ob Sie eine lokale Kopie der Site anlegen wollen oder direkt auf dem Server arbeiten. Wenn Sie einen FTP-Zugang einrichten, müssen Sie ohnehin eine lokale Kopie anlegen. Wenn Sie noch keine lokale Kopie der Dateien angelegt haben, dann ist jetzt der Augenblick dafür gekommen.
Direkter Zugriff auf den Webserver Wenn Sie direkt auf den Produktionsserver zugreifen, müssen Sie die Adresse der Site so angeben, als würde sie lokal auf Ihrem Rechner liegen. Die anderen Verbindungen greifen auf eine lokale Kopie der Dateien zu. Wenn Sie diese kleine Hürde genommen haben, sollten Sie eigentlich loslegen können. Die ganze Prozedur dürfte eigentlich keine Schwierigkeit darstellen, Ähnliches haben Sie die ganze Zeit gemacht. Wenn Sie direkt auf dem Server arbeiten, sollten Sie den Server-Zugriff im Dialogfenster SITE-DEFINITION auf »Keine« stellen, obwohl man zunächst vermuten würde, dass »Lokal/Netzwerk« die richtige Einstellung ist. In letzterem Falle geht UltraDev dann allerdings davon aus, dass auf dem lokalen Rechner ein Webserver installiert ist, was aber nicht immer zutreffend sein dürfte.
Lokale/Netzwerk-Verbindung einrichten Die zweite Art des Serverzugriffs wird im Dialogfenster SITE-DEFINITION als »Lokal/Netzwerk« aufgeführt. Sie funktioniert ähnlich wie der zuvor besprochene direkte Zugriff auf
129
Websites planen und verwalten
den Webserver und setzt voraus, dass Sie auf das Verzeichnis Ihres Webservers wie auf ein Netzlaufwerk zugreifen können. Der Unterschied besteht darin, dass Sie auch eine lokale Kopie der Site angelegt haben, an der Sie Änderungen durchführen, um sie anschließend auf den Webserver zu publizieren. Bei der Auswahl dieses Verbindungstyps verändert sich die Eingabemaske im Dialogfenster SITE-DEFINITION wie in Abb. 3.5 gezeigt. Sie müssen einen entfernten Ordner angeben, in dem die Online-Version Ihrer Website liegt. Dieser Ordner darf nicht mit dem lokalen Site-Ordner identisch sein.
Abbildung 3.5: Auf Sites, die lokal gehostet werden oder auf einem Netzlaufwerk liegen, kann entweder direkt zugegriffen werden oder über die Option Lokal/Netzwerk, bei der eine lokale Arbeitskopie der Site angelegt wird.
WebDAV WebDAV ist erst mit der 4.0-Version von UltraDev verfügbar. WebDAV (Web Distributed Authoring and Versioning) ist ein neues Web-basiertes Datenverwaltungsprotokoll, das zunehmend als offener Standard akzeptiert wird. Windows unterstützt WebDAV bei seiner Webordner-Implementierung, und auch unter Mac OS X steht WebDAV systemweit zur Verfügung. Falls Ihr Netzwerk an einen WebDAV-Server angebunden ist, fragen Sie Ihren Systemadministrator nach den Zugangsdaten. Um eine WebDAV-Verbindung einzurichten, wählen Sie die entsprechende Zugangsart aus und klicken dann auf die Schaltfläche EINSTELLUNGEN. Sie werden nach den üblichen Daten gefragt: URL, Benutzername, Kennwort sowie E-Mail-Adresse. Das Kennwort können Sie speichern, sofern Sie das möchten.
130
Websites in UltraDev importieren
SourceSafe Database Auch dieses Feature steht erst mit UltraDev 4.0 zur Verfügung. SourceSafe Database arbeitet mit der Visual Sourcesafe-Technologie von Microsoft, die eine Datenzugriffskontrolle ermöglicht. Da es sich um eine proprietäre Technologie handelt, steht sie natürlich nicht auf allen Plattformen zur Verfügung. Haben Sie Zugriff auf ein SourceSafe-System, klicken Sie auf den Button EINSTELLUNGEN, um den Zugang einzurichten. Geben Sie den Pfad an sowie den Namen des Projekts, Benutzernamen und Kennwort. Aktivieren Sie das Kontrollkästchen SPEICHERN, wenn Sie das Kennwort nicht jedes Mal neu eingeben wollen. Welche Zugangsart Sie letztlich auch wählen, UltraDev erleichtert die Konfiguration mit diesem Dialogfenster erheblich.
FTP-Zugang Die letzte Option für den Zugriff auf den Webserver ist die Übertragung der Daten per FTPProtokoll – wenn sonst nichts geht, FTP geht immer. Wenn Sie nur per Einwahlverbindung auf den Server zugreifen können oder erhöhte Sicherheitsvorschriften gelten, bleibt Ihnen vermutlich sowieso nichts anderes übrig, als eine FTP-Verbindung einzurichten. Eingerichtet wird der FTP-Zugang über die entsprechende Option im Dropdown-Menü SERVER-ZUGRIFF. Um per FTP auf die entfernte Site zugreifen zu können, müssen Sie mehrere Einstellungen treffen, wie in Abb. 3.6 gezeigt. In diesem Beispiel ist die Hostadresse des FTP-Servers 192.168.0.1 und der Name des Verzeichnisses, in das die Dateien geladen werden, public.html. Sie müssen natürlich die Zugangsdaten eintragen, die Sie von Ihrem Provider bekommen.
Abbildung 3.6: Den FTP-Zugang konfigurieren im Dialogfenster SiteDefinition
131
Websites planen und verwalten
Über folgende Eingabefelder konfigurieren Sie den Zugang zum Webserver: 쐽
FTP-HOST – Hier tragen Sie den Host-Namen oder die IP-Adresse Ihres Webservers ein.
쐽
HOST-ORDNER – Hier tragen Sie den Pfad zum Stammverzeichnis Ihrer Website ein.
쐽
ANMELDUNG – Hier geben Sie Ihren Benutzernamen ein.
쐽
KENNWORT – In dieses Feld geben Sie das geheime Kennwort ein, das Ihnen Ihr Provider mitgeteilt hat. Wenn sichergestellt ist, dass mit Ihrem Kennwert kein Missbrauch betrieben werden kann, können Sie das Kennwort speichern, indem Sie das Kontrollfeld SPEICHERN anklicken.
쐽
PASSIVEN FTP VERWENDEN – Diese Einstellung wird wichtig, wenn Sie aus einem Subnetz, das mit IP-Masquerading und Network Address Translation arbeitet, per FTP auf den Server zugreifen. Technisch gesehen öffnet beim passiven FTP der lokale Rechner einen Daten- und Kontrollkanal zum Server, statt dass wie üblich der entfernte Rechner einen Rückkanal zum Client herstellt. Sie können diese Option vorbeugend aktivieren. Sollte sie nicht benötigt werden, verursacht sie keine Probleme.
쐽
FIREWALL VERWENDEN – Wenn Ihre Site hinter einer Firewall liegt, müssen Sie unter Umständen die Voreinstellungen von UltraDev entsprechend anpassen, damit das Programm auf den Server zugreifen kann. Versuchen Sie es zuerst über passiven FTP. Wenn das nicht funktioniert, müssen Sie den Firewall-Anschluss konfigurieren.
Den Firewall-Anschluss konfigurieren Sie wie schon erwähnt in den Voreinstellungen von UltraDev. Ein paar der Einstellungen sind identisch mit denen des Serverzugriffs über LOKAL/NETZWERK. Sie können also dort die entsprechenden Einstellungen nachsehen, auch wenn Sie kein FTP verwenden. Die Voreinstellungen zu Site-FTP verändern Öffnen Sie im Menü BEARBEITEN das Dialogfenster VOREINSTELLUNGEN. Wählen Sie im Listenfeld KATEGORIE den Eintrag SITE-FTP. Die Eingabemaske ändert sich wie in Abb. 3.7 gezeigt, sodass Sie die nötigen Feineinstellungen vornehmen können. Wenn Sie nicht hinter einer Firewall arbeiten, werden Sie die Einstellungen so belassen können, wie sie sind. Falls Sie Änderungen vornehmen müssen, stehen Ihnen folgende Optionen zur Auswahl: 쐽
IMMER ZEIGEN – Die Site-Ansicht ist in zwei Fenster geteilt, von denen das rechte standardmäßig die lokalen und das linke die entfernten Dateien der Site anzeigt. Über diese beiden Dropdown-Menüs können Sie die Anzeige der Dateien in den Fenstern austauschen.
쐽
ABHÄNGIGE DATEIEN – Abhängige Dateien sind Dateien, die von HTML-Dokumenten benötigt werden und ohne die sie nicht vollständig angezeigt werden können. Einfacher ausgedrückt: Wenn Ihr HTML-Dokument Bilder enthält, dann sind diese Bil-
132
Websites in UltraDev importieren
der abhängige Dateien. Über diese Kontrollfelder regeln Sie, ob UltraDev Sie vorher fragt, ob es abhängige Dateien einschließen soll, wenn es Dateien vom oder zum Server überträgt.
Abbildung 3.7: In den Site-Voreinstellungen legen Sie die Darstellung der Dateien in der Site-Ansicht sowie die Arbeitsweise des FTP-Clients fest. 쐽
FTP-VERBINDUNG – Hier stellen Sie ein, ob und nach welcher Zeitspanne die FTPVerbindung getrennt werden soll, falls keine Daten übertragen werden. Das ist vor allem dann sinnvoll, wenn Sie sich per Wählverbindung auf dem Server einloggen und Ihre Verbindungen nach Zeittakt abgerechnet werden.
쐽
FTP-ZEITÜBERSCHREITUNG – Hier geben Sie an, wie lange UltraDev versuchen soll, eine Verbindung zum entfernten Server herzustellen. Kommt innerhalb der eingestellten Zeitspanne keine Verbindung zu Stande, gibt UltraDev eine Fehlermeldung aus.
쐽
FIREWALL-HOST – Wenn Sie hinter einer Firewall arbeiten, geben Sie in diesem Feld die Adresse des Proxy-Servers ein, zu dem die Verbindung hergestellt werden soll. Über diesen Host erfolgt die eigentliche Verbindung zum Internet.
쐽
FIREWALL-ANSCHLUSS – Wenn Sie eine Firewall verwenden, muss ein feste Portnummer angegeben werden, über die die Verbindung zum FTP-Server hergestellt wird. Die Default-Portnummer ist 21.
쐽
BEREITSTELLUNGSOPTIONEN – Wenn Sie dieses Kontrollfeld aktivieren, werden noch nicht gespeicherte Änderungen an Dateien automatisch gesichert, bevor diese auf den Server geladen werden. Mit dieser Option verhindern Sie, dass Änderungen versehentlich verloren gehen.
133
Websites planen und verwalten
Die meisten dieser Optionen können unverändert bleiben. Wenn Sie Einstellungen an den Firewall-Option vornehmen, obwohl Sie nicht hinter einer Firewall arbeiten, führt dies zu einem Verbindungsfehler. Fortgeschrittene FTP-Konfiguration Das FTP-Protokoll erlaubt die Übertragung von ASCII- und Binär-Daten. Programme und Grafiken im ASCII-Modus zu übertragen ist eine ebenso schnelle wie wirksame Methode, diese Daten zu zerschießen. Warum sollten Sie dann überhaupt den ASCII-Modus verwenden? Unix, Mac und Windows verwenden unterschiedliche Kodierungen, um ein »end of line« zu bezeichnen, und dieses Steuerzeichen wird automatisch umgewandelt. Leider gibt es in UltraDev keine direkte Möglichkeit, dem Programm mitzuteilen, in welchem Modus es bestimmte Dateitypen vom und zum Server übertragen soll. Hier bleibt nur Handarbeit. Öffnen Sie zu diesem Zweck die Datei FTPExtensionMapMac.txt (Mac OS) bzw. FTPExtensionMap.txt (Windows) und passen Sie sie entsprechend an. Sie finden diese Datei im Ordner Dreamweaver UltraDev\Configuration auf Ihrer Festplatte. Nachfolgend sehen Sie einen Ausschnitt aus der Windows-Version dieser Datei: CGI CSS DCR DIR DOC DXR EXE GIF HTM HTML JPG JPEG JS LBI MNO MOV MPEG
ASCII ASCII BINARY BINARY BINARY BINARY BINARY BINARY ASCII ASCII BINARY BINARY BINARY BINARY BINARY BINARY BINARY
Um nun einem bestimmten Dateityp den entsprechenden Übertragungsmodus zuzuweisen, setzen Sie die Dateinamenserweiterung dieses Dateityps in die erste Spalte und den Modus (ASCII bzw. BINARY) in die zweite. Wie Sie in obigem Ausschnitt sehen, werden HTML-Dokumente im ASCII-Modus und Bilder (JPG, GIF) als Binär-Daten übertragen. Wenn Sie z.B. Java-Dateien übertragen müssen, ergänzen Sie die Liste um die Einträge JAR und CLASS und geben Sie als Übertragungsmodus BINARY an. Somit können Sie die entsprechenden Datentypen problemlos per FTP übertragen.
134
Websites in UltraDev importieren
Creator-Kennung und Dateitypen auf dem Mac Macs haben ein einzigartiges System der Dateiverwaltung. Zusammen mit jeder Datei wird eine Signatur bestehend aus vier alphanumerischen Zeichen gespeichert, an der das System erkennt, um welche Art von Datei es sich handelt und mit welchem Programm sie erzeugt wurde. Wenn Sie also eine GIF-Datei mit Photoshop erzeugen, wird sie auch mit Photoshop geöffnet. Bei anderen GIF-Dateien weist die Signatur vielleicht auf Fireworks als Erstellungsprogramm hin und ruft entsprechend dieses Programm auf. Jede Datei »merkt« sich also, welche Art von Datei sie ist und mit welchem Programm sie erzeugt wurde. Mit einem Programm wie Apples ResEdit können Sie die CreatorKennung einer Datei ermitteln. Setzen Sie diese Kennung dann in die Datei FTPExtensionMap.txt ein, damit UltraDev die Dateien im richtigen Modus übertragen kann.
Die Verbindung öffnen Wenn Sie nun den Server-Zugriff konfiguriert haben, können wir die Übertragungsfunktionen im Site-Fenster testen. Klicken Sie dazu auf die Schaltfläche VERBINDEN in der Werkzeugleiste. Abb. 3.8 zeigt die geöffnete Verbindung einer lokalen Site zum entfernten Server. Wenn Sie in der Site-Ansicht nur das Fenster mit den lokalen Dateien sehen, klicken Sie auf den kleinen Pfeil links unten in der Statuszeile, sodass er nach rechts zeigt. Einer Übertragung der Dateien zwischen der lokalen und der entfernten Site steht nun nichts mehr im Wege.
Abbildung 3.8: Die Verbindung zum Server ist geöffnet.
Dateien übertragen Am leichtesten lassen sich Dateien zwischen der lokalen und der entfernten Site per Drag and Drop verschieben. Auf diese Art und Weise können Sie eine oder mehrere Dateien oder sogar ganze Ordner von einem ins andere Fenster ziehen. Beim Verschieben prüft
135
Websites planen und verwalten
UltraDev automatisch, ob und welche Dateien von den ausgewählten Dateien abhängig sind, und fragt, ob die abhängigen Dateien mit übertragen werden sollen. Das Programm spart Ihnen also eine Menge Arbeit, da Sie nach den abhängigen Dateien nicht selbst suchen müssen. Der File-Transfer lässt sich auch mit den Pfeilen DATEI(EN) BEREITSTELLEN bzw. ABRUdurchführen, wie man sie auch von FTP-Clients kennt. Mit DATEI(EN) BEREITSTELLEN laden Sie Dateien auf den entfernten Server, mit DATEI(EN) ABRUFEN holen Sie sich Dateien oder ganze Ordner lokal auf die Festplatte. Eine Anzeige rechts unten in der Statusleiste informiert Sie, wie weit der Up- bzw. Download fortgeschritten ist. Wenn Sie auf den roten Stop-Button klicken, unterbrechen Sie die Übertragung. FEN
Falls es bei der Übertragung zu Fehlern kommt, können Sie sich das FTP-Protokoll anzeigen lassen, das alle Kommandos während der Datenübertragung aufzeichnet. Sie finden es unter Menü SITE > FTP-PROTOKOLL (Mac) bzw. unter Menü FENSTER > SITE-FTP-PROTOKOLL in der Site-Ansicht (Windows). Hier dürften Sie aller Wahrscheinlichkeit nach die Lösung für Ihr Problem finden.
Dateiansicht in den Site-Fenstern aktualisieren Wenn Sie Dateien in der entfernten bzw. lokalen Site ändern (löschen oder hinzufügen), kann es vorkommen, dass die Änderung in den entsprechenden Fenstern nicht angezeigt wird. Wenn Sie das unbestimmte Gefühl haben, dass eine der beiden Seiten nicht vollständig angezeigt wird, klicken Sie auf die Schaltfläche AKTUALISIEREN (der kreisförmige Pfeil in der Werkzeugleiste), dann werden die Dateilisten in beiden Fenstern auf den aktuellen Stand gebracht. Wenn Sie möchten, dass speziell die Liste mit den Dateien der entfernten bzw. der lokalen Site aktualisiert wird, wählen Sie den jeweiligen Befehl im Menü ANSICHT > ENTFERNT AKTUALISIEREN bzw. LOKAL AKTUALISIEREN. Die entsprechende Ansicht wird dann neu geladen.
Dateien synchronisieren Dateien zu synchronisieren ist die bequemste Art und Weise, HTML-Dokumente vom oder zum Server zu übertragen. Statt alle geänderten Dateien mühsam selbst zu suchen und per Drag & Drop zu verschieben, lassen Sie sich die Änderungen von UltraDev anzeigen. Wenn Sie sich nur eine Liste der geänderten Dateien anzeigen lassen wollen, wählen Sie den Befehl im Menü BEARBEITEN > NEUERE AUSWÄHLEN (LOKAL) bzw. NEUERE AUSWÄHLEN (ENTFERNT). Im entsprechenden Fenster werden dann die Dateien markiert, die neuer sind als die Dateien am anderen Ende der Verbindung. Per Drag and Drop können Sie die markierten Dateien dann in das andere Fenster ziehen, um die Daten zu synchro-
136
Websites pflegen
nisieren. Dieses Aktualisieren von Hand lässt Ihnen die volle Kontrolle darüber, welche Dateien aktualisiert werden sollen, andrerseits laufen Sie nicht Gefahr, abhängige Dateien zu vergessen, da UltraDev sie automatisch mit überträgt. Wenn Sie die ganze Arbeit dem Programm überlassen wollen, wählen Sie den Befehl SITE > SYNCHRONISIEREN, woraufhin sich das in Abb. 3.9 gezeigte Dialogfenster öffnet. Klicken Sie auf die Schaltfläche OK, um sich eine Liste aller zu aktualisierenden Dateien anzeigen zu lassen. Dateien, die Sie nicht übertragen wollen, können Sie abwählen. Klicken Sie nun auf OK.
Abbildung 3.9: Entfernte und lokale Site schnell synchronisieren
Im Dialogfenster DATEIEN SYNCHRONISIEREN können Sie einstellen, was übertragen werden soll (die ganze Site oder nur ausgewählte Dateien) und in welcher Richtung diese Dateien übertragen werden sollen (von der lokalen zur entfernten Site oder umgekehrt bzw. in beiden Richtungen). Wenn Sie das etwas missverständliche Kontrollfeld ENTFERNTE DATEIEN NICHT AUF LOKALEM LAUFWERK LÖSCHEN aktivieren, werden beim Upload sämtliche Dateien der entfernten Site gelöscht, für die es kein Gegenstück auf der lokalen Site gibt. Ebenso werden beim Download sämtliche lokalen Dateien gelöscht, die sich nicht auf der entfernten Site finden. Wenn Sie alle Daten übertragen haben, klicken Sie auf die Schaltfläche TRENNEN, um die Verbindung zwischen Ihrem Rechner und dem Server zu schließen. In der Site-Ansicht können Sie mit den beiden Schaltflächen links oben in der Werkzeugleiste schnell zwischen der Sitemap und den Site-Dateien umschalten.
3.4
Websites pflegen
Mit zum Schwierigsten beim Warten großer Websites gehört das Vermeiden von unterbrochenen Links. Bei ein paar Hundert Seiten kann es schon mal passieren, dass man versehentlich einen Link löscht, vor allem, wenn man so wie ich bei kleineren Eingriffen gerne selbst am Code bastelt.
137
Websites planen und verwalten
Hyperlinks überprüfen UltraDev kann sämtliche Links auf Ihren Seiten in Sekundenschnelle überprüfen. Rufen Sie hierzu den Befehl SITE > HYPERLINKS FÜR GANZE SITE PRÜFEN auf. Das Programm untersucht daraufhin die gesamte Website nach fehlerhaften, verwaisten und externen Links. Wählen Sie den benötigten Bericht über das Dropdown-Menü ANZEIGEN aus. Fehlerhafte (unterbrochene) Links beziehen sich auf lokale Dateien, die nicht mehr korrekt funktionieren. Mit den programminternen Funktionen von UltraDev zum Bearbeiten, Verschieben und Umbenennen von Dateien lassen sich diese Probleme in den meisten Fällen gut in den Griff bekommen. Dateien von Hand zu bearbeiten stellt allerdings immer eine gewisse Fehlerquelle dar. Externe Links sind Links, die auf Dateien zeigen, die nicht auf Ihrer Site liegen. Um sich alle externen Links Ihrer HTML-Dokumente anzeigen zu lassen, wählen Sie diese Option. UltraDev checkt diese Links zwar nicht selbst, aber anhand der angezeigten Liste können Sie diese Links aber selbst per Browser überprüfen. Abb. 3.10 zeigt die Ergebnisse eines Suchdurchlaufs nach den externen Links einer Website.
Abbildung 3.10: Mit der Funktion Hyperlinks für ganze Site prüfen können Sie sich z.B. alle externen Links anzeigen lassen.
Die letzte Option VERWAISTE DATEIEN findet sämtliche Dateien, die mit keinen anderen Dokumenten der Site verknüpft sind. Falls nicht zufällig ein externer Link von außerhalb auf diese Dateien gesetzt ist, kann kein Browser der Welt sie finden – daher der Name verwaiste Dateien. Wenn Sie die Linkprüfung über Ihre Site haben laufen lassen, können Sie das Ergebnis mit Klick auf die Schaltfläche SPEICHERN als Datei ausgeben. Es wird eine einfache Textdatei erzeugt, die Ihnen eine gute Kontrollmöglichkeit darüber gibt, welche Links schon berichtigt wurden und welche nicht. Nachfolgend ein Muster eines solchen Berichts:
138
Websites pflegen
Fehlerhafte Hyperlinks: klapptest.htm klapptest.htm klapptest.htm
# grafiken/transparent.gif #
Externe Hyperlinks: index.asp <%=MM_moveNext%> index.asp <%=MM_movePrev%> test01.asp <%=MM_moveNext%> test01.asp <%=MM_moveLast%> test01.asp <%=MM_editAction%> test03.asp <%=MM_moveNext%> test04.asp <%=MM_moveNext%> TMPz9av7d5cj.asp <%=MM_moveNext%> TMPz9av7d5cj.asp <%=MM_movePrev%> Verwaiste Dateien: hg_farbtest.gif multicol.htm screenshot.jpg test01.asp test02.asp test04.asp TMPz9av7d5cj.asp _mmDBScripts/adojavas.inc _mmDBScripts/MMHTTPDB.asp Connections/connTest.asp Connections/connVideothek.asp datenbank/video.ldb datenbank/video.mdb file:///E|/Eigene Dateien/Websites/videothek/multicol.htm Templates/Unbenannt.dwt Dateien: 21 gesamt, 13 HTML, Hyperlinks: 17 gesamt, 5 OK,
15 verwaist 3 fehlerhaft,
9 extern
Der Bericht enthält Angaben zu allen drei Kategorien, die geprüft werden, sowie zum Linkstatus innerhalb der gesamten Website. Wenn Sie eine schnelle Möglichkeit suchen, externe Links zu überprüfen, möchte ich Sie auf meinen Linkchecker hinweisen, den Sie unter der Adresse http://jray.ag.ohio-state.edu herunterladen können. Damit können Sie externe Links auf Ihrer Website in Echtzeit mit Ihrem Browser testen.
139
Websites planen und verwalten
Unterbrochene Links reparieren Wenn Sie auf Ihrer Website einen gebrochenen Link entdecken, der auf allen Seiten vorhanden ist – z.B. ein externer Link auf eine Adresse, die nicht mehr existiert oder sich geändert hat –, dann können Sie diesen Link global auf allen Seiten ändern lassen. Wählen Sie hierzu den Befehl SITE > HYPERLINK FÜR GANZE SITE ÄNDERN. Abb. 3.11 zeigt das Dialogfenster mit den nötigen Einstellungen, um alle Links auf die URL http://www.oldsite.com durch den Link auf die URL http://www.newsite.com zu ersetzen. Sie können auch auf das Ordnersymbol neben dem Eingabefeld klicken und ein Dokument Ihrer Site auswählen, dann müssen Sie nichts tippen. Klicken Sie jetzt auf OK, und das Programm macht sich an die Arbeit. UltraDev zeigt Ihnen ein Fenster mit einer Liste aller betroffenen Dateien an, in dem Sie diejenigen Dokumente auswählen, die aktualisiert werden sollen.
Abbildung 3.11: Schnelle Aktualisierung von Links
3.5
Verteilte Entwicklungsumgebung
Wenn ein mehrköpfiges Team an der Realisierung einer Website arbeitet, kann es erforderlich sein, dass Dateien von mehreren Personen gleichzeitig bearbeitet werden. Zu Problemen kann es kommen, wenn eine Datei von zwei Personen gleichzeitig bearbeitet wird. Im normalen Bearbeitungsmodus überspeichert der letzte Bearbeiter die Änderungen seines »Vorgängers«. Stets allen Kollegen sagen zu müssen, welche Datei Sie gerade bearbeiten und von der sie daher die Finger lassen sollen, kann nicht die endgültige Lösung des Problems sein. Aber, Sie ahnen es schon, UltraDev bietet auch hier Abhilfe. Mithilfe der Funktion EIN-/AUSCHECKEN können Sie sich eine Art Besitzrecht an einem Dokument sichern. »Ausgecheckte« Dokumente können von niemand anderem bearbeitet werden. Das ist so ähnlich wie mit einem Buch aus der Leihbücherei: Wenn Sie das Buch ausleihen, gehört es Ihnen solange, bis Sie es fertig gelesen haben. Ihre Kollegen sehen also, wer das Dokument in Bearbeitung hat, können aber nicht darauf zugreifen. Wenn Sie fertig sind, geben Sie die Datei frei, damit andere sie bearbeiten können. Verschiedene Technologien wie WebDAV und MS SourceSafe bieten solch Ein-/Auschecksysteme. Wenn Sie aber keine entsprechende Servertechnik definiert haben, »weiß« UltraDev nicht, ob diese Technologien zur Verfügung stehen und verwendet daher sein internes System, um Dateien für den Zugriff zu sperren.
140
Verteilte Entwicklungsumgebung
Funktion EIN-/AUSCHECKEN einrichten Wenn Sie die bei der Realisierung einer Website die Funktion EIN-/AUSCHECKEN verwenden wollen, müssen Sie in der Site-Definition die entsprechenden Einstellungen vornehmen. Rufen Sie hierzu in der Site-Ansicht über SITE > SITES DEFINIEREN das entsprechende Dialogfenster auf. Wählen Sie in diesem Fenster die Kategorie REMOTEINFORMAITONEN aus und aktivieren Sie das Kontrollfeld EIN-/AUSCHECKEN VON DATEIEN AKTIVIEREN. Abb. 3.12 zeigt die nicht sehr umfangreiche Eingabemaske. Aktivieren Sie die Funktion EIN-/AUSCHECKEN, können Sie noch wählen, ob die ausgecheckte Datei mit dem Namen und der E-Mail-Adresse des Bearbeiters versehen werden soll. Nicht zuletzt empfiehlt es sich auch, das Kontrollfeld DATEIEN BEIM ÖFFNEN AUSCHECKEN zu aktivieren, da Sie dann nicht jedes Mal von Hand auschecken müssen. Wenn Sie die Funktion EIN-/AUSCHECKEN von UltraDev verwenden wollen, müssen Sie in der Site-Definition als Server-Zugriff eine andere Option als KEINE einstellen.
Abbildung 3.12: Die Funktion Ein-/Auschecken begnügt sich mit wenigen Einstellungen.
Die Funktion EIN-/AUSCHECKEN im praktischen Einsatz Mit der Funktion EIN-/AUSCHECKEN ist es ein Leichtes, den Überblick darüber zu behalten, welche Datei augenblicklich von wem bearbeitet wird. Wenn Sie das Kontrollfeld DATEIEN BEIM ÖFFNEN AUSCHECKEN aktiviert haben, können Sie mit UltraDev wie
141
Websites planen und verwalten
gewohnt arbeiten. Dateien werden beim Öffnen sofort ausgecheckt und können dann von niemand anderem bearbeitet werden, sofern UltraDev bzw. Dreamweaver richtig konfiguriert sind. Sie können auch die Schaltflächen EINCHECKEN bzw. AUSCHECKEN in der Werkzeugliste der Site-Ansicht benutzen (Pfeile), um Dateien für die Bearbeitung durch andere Benutzer zu sperren bzw. freizugeben. Ausgecheckte Dateien werden in der Dateiliste als solche gekennzeichnet, zugleich wird der Name des Bearbeiters angezeigt. Wenn Sie den Namen des Bearbeiters anklicken, öffnet sich Ihr E-Mail-Programm und Sie können dem Kollegen freundlich aber bestimmt mitteilen, dass er nun endlich die Datei wieder freigeben soll. Abb. 3.13 zeigt das Auscheck-System in Funktion.
Abbildung 3.13: Ausgecheckte Dateien werden mit dem Namen des Bearbeiters angezeigt.
Wenn Sie Websites im Team entwickeln, werden Sie auf die Funktion EIN-/AUSCHECKEN bald nicht mehr verzichten wollen. Die einzige Alternative bestünden darin, einen strikten Bearbeitungsplan aufzustellen und genau festzulegen, wer wann welche Datei bearbeitet, oder die Website in mehrere Teile aufzusplitten und jeweils nur diesen Teil lokal auf dem Rechner der einzelnen Mitarbeiter ohne Zugriffsmöglichkeit von Seiten Dritter zu speichern.
Design Notes Auch die Design Notes sind eine Funktion, auf die Sie in einem Entwicklerteam bald nicht mehr verzichten wollen. Design Notes sind einfach ein Kommentar, den Sie während der Bearbeitung an ein beliebiges HTML-Dokument anhängen können. Diese Kommentare werden im XML-Format in einem eigenen Ordner namens _notes im Stammverzeichnis der Site abgelegt. Wenn ein Bearbeiter eine Datei auscheckt, an die Design Notes angehängt sind, kann er diese öffnen und sich über den Bearbeitungsstand informieren und seinerseits Kommentare einfügen. Design Notes werden unabhängig vom eigentlichen HTML-Dokument gespeichert, Sie brauchen also keine Bedenken zu haben, dass sich plötzlich XML-Markup in den normalen HTML-Code schleicht. Um Kommentare an eine Datei anzufügen, rufen Sie den Befehl DATEI > DESIGN NOTES auf. Um die an eine Datei angehängten Design Notes zu lesen, markieren Sie die entspre-
142
Verteilte Entwicklungsumgebung
chende Datei im Fenster LOKALER ORDNER der Site-Ansicht. Mit Klick auf die rechte Maustaste öffnen Sie das Kontextmenü und wählen den Befehl DESIGN NOTES. Das Eingabefenster DESIGN NOTES sehen Sie in Abb. 3.14.
Abbildung 3.14: Speichern Sie in den Design Notes alle wichtigen Informationen zu einer Datei.
Unter dem Register BASIS-INFO können Sie im Dropdown-Menü STATUS aus einer vordefinierten Liste den Bearbeitungsstatus der Datei auswählen. In das Feld ANMERKUNGEN können Sie freien Kommentar eingeben und mit Klick auf das Kalender-Symbol mit einem Datum versehen. Sie können ferner ein Kontrollfeld aktivieren, ob die Design Notes angezeigt werden sollen, wenn die Datei geöffnet ist. Möchten Sie in den Design Notes zusätzliche Informationen ablegen, klicken Sie auf das Register ALLE INFORMATIONEN. Ohne hier groß in XML einsteigen zu wollen, sei darauf hingewiesen, dass in den Design Notes sämtliche Attribute als Name/Wert-Paar gespeichert werden. Im Feld INFO finden Sie alle Paare aufgelistet, die definiert wurden. Name und Wert können verändert werden, indem man die entsprechende Zeile anklickt und in den Eingabefeldern NAME bzw. WERT die neuen Werte zuweist. Wie bei allen Eigenschaftslisten von UltraDev können über das Plus- bzw. Minussymbol Einträge hinzugefügt bzw. gelöscht werden. Wenn Sie die Design Notes direkt bearbeiten möchten, dann öffnen Sie im Explorer bzw. Finder den Ordner _notes. Er liegt im gleichen Verzeichnis wie die Website, wird aber in der Site-Ansicht von UltraDev nicht angezeigt. Die XML-Datei, die die Design Notes zu einem HTML-Dokument enthält, wird mit dem Namen dieses Dokuments und der Extension .xmo abgespeichert. Die Design Notes zu index.html werden also als index.html.mno gespeichert.
143
Websites planen und verwalten
Nachfolgend ein Beispiel für eine solche Notes-Datei in XML:
Wie Sie sehen, sind alle Informationen einsehbar und frei zugänglich. Die meisten Konfigurationsdateien von UltraDev sind in XML geschrieben, sodass sie relativ leicht angepasst werden können.
3.6
Zusammenfassung
Allmählich nehmen die Dinge Gestalt an. Mit Abschluss der heutigen Lektion sollten Sie mit den Werkzeugen zur Erstellung und Bearbeitung von HTML-Code vertraut sein sowie eine Verbindung zum Webserver herstellen können. Damit Websites auf unterschiedlichen Plattformen lauffähig sind, sollten Sie vor der Erstellung den nötigen Planungsaufwand nicht scheuen. Ohne eine verbindliche Dateinamenskonvention können bei der Umsetzung Problem auftreten. UltraDev bietet sehr leistungsfähige Tools zur Site-Erstellung, mit denen Sie in kürzester Zeit die Grundstruktur einer Website anlegen können. UltraDev unterstützt mehrere Zugriffsmethoden auf Webserver. Sobald eine Verbindung aufgebaut ist, können Sie Dateien, die zwischen dem lokalen Rechner und dem Server ausgetauscht werden, auschecken und für die Bearbeitung seitens Dritter sperren. HTMLDokumente können mit Design Notes versehen werden, um andere Bearbeiter über den aktuellen Bearbeitungsstand zu informieren.
3.7 F
Wenn ich auf Dateien auf dem Server verlinke, deren Namen die Zeichen »:« und »\« enthalten, gibt es Probleme. Warum? A
144
Fragen und Antworten
Diese Zeichen werden von Mac OS und Windows als Trennzeichen in Pfadangaben verwendet. Wenn Sie andere als alphanumerische Zeichen verwenden, informieren Sie sich bei Ihrem Systemverwalter, welche Sonderzeichen Sie auf Ihrer Serverplattform verwenden dürfen.
Workshop
F
Ich bin bis jetzt beim Entwurf und der Umsetzung von Websites immer ohne Sitemaps ausgekommen. Warum soll ich nun plötzlich welche verwenden? A
F
Was ist die günstigste Einstellung für den Server-Zugriff? A
F
Kleinere Websites lassen sich relativ problemlos ohne Map realisieren. Bei größeren Websites mit mehreren Hundert Seiten, die auf viele verschiedene Äste verteilt sind, verlieren Sie ohne sauber ausgearbeitete Struktur schnell den Überblick. Große Websites so anzugehen wie eine kleine Site ist ein Fehler, der sich bitter rächen kann.
Ich persönlich ziehe den Zugriff über Lokal/Netzwerk vor. Wenn ich Dateien direkt auf dem Server bearbeiten will, stelle ich die Option Server-Zugriff auf Keine. Wenn Sie nicht in einem Netzwerk arbeiten, verwenden Sie den Zugriff per FTP.
Was passiert, wenn ich eine Datei auschecke und nicht wieder einchecke? A
3.8
Dann sorgen Sie für böses Blut bei Ihren Kollegen. Diese könnten zwar die Ein-/ Auscheck-Funktion deaktivieren, damit wäre aber ihr eigentlicher Sinn ad absurdum geführt.
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Welche Zeichen sollten Sie in Dateinamen verwenden? 2. Wie finden Sie am schnellsten alle HTML-Dokumente, denen Sie kein <TITLE>-Tag zugewiesen haben? 3. Welche zusätzlichen Einstellungen müssen Sie am FTP-Client von UltraDev vornehmen, wenn Sie von einem Subnetz, das IP-Masquerading verwendet, auf einen Webserver zugreifen? 4. Wie können Sie sich eine Liste sämtlicher externen Links Ihrer Website anzeigen lassen? 5. Welche Funktion müssen Sie aktivieren, um eine Datei während der Bearbeitung für die Benutzung durch Dritte zu sperren?
145
Websites planen und verwalten
Übungen 1. Zeichnen Sie für ein fiktives Unternehmen eine Sitemap mit allen erforderlichen Bereichen – News, Links, Kontaktinformationen, Produktpalette usw. 2. Bauen Sie diese Sitemap in UltraDev mit Platzhalterseiten nach und verlinken Sie diese Seiten untereinander. 3. Laden Sie die so erstellte Grundstruktur der Site auf den Webserver. Aktivieren Sie die Ein-/Auscheck-Funktion und fügen Sie Inhalt auf den Seiten ein.
146
Websites in Bewegung – clientseitige Verhaltensweisen
4
Websites in Bewegung – clientseitige Verhaltensweisen
Der Stoff der vorausgegangen Tage hat sich ausschließlich mit der Erstellung statischer Websites beschäftigt. Statisch bedeutet, dass Inhalt und Erscheinungsbild eines HTMLDokumentes durch anwenderseitige Aktionen weder beeinflusst noch verändert werden können. Zwar haben wir schon über die vorprogrammierten JavaScript-Objekte von UltraDev gesprochen, mit denen Sie HTML-Objekten dynamische Funktionalität verleihen können, doch haben wir sie bis jetzt noch nicht eingesetzt. Doch ab heute wird das anders, denn mit den DHTML-Objekten kommt Leben in die Website. Der Stoff des heutigen Tages im Überblick: 쐽
DHTML: Grundlagen, Für und Wider
쐽
Die Verhaltenspalette und wie Sie damit dynamische Objekte erzeugen sowie die vorprogrammierten JavaScript-Objekte an Ihre Zwecke anpassen können
쐽
Wie Sie mit Ebenen und DHTML einzigartige Webanwendungen erstellen
쐽
Wie Sie mit der Zeitleiste von UltraDev Animationen und andere zeitgesteuerte Effekte erstellen
쐽
Sonstige clientseitige dynamische Effekte
4.1
DHTML – Was hat man darunter zu verstehen und was nicht?
Der Begriff DHTML, die Abkürzung für dynamisches HTML, ist nicht ganz glücklich gewählt, denn er legt die Schlussfolgerung nahe, dass die bisher statische Auszeichnungssprache HTML nun um die Fähigkeit erweitert wurde, Objekte mit dynamischem Verhalten zu versehen. Liest man zum ersten Mal von DHTML, denkt man sich vielleicht: »Muss ich jetzt etwa schon wieder eine neue Programmiersprache lernen?« Tatsächlich ist DHTML nichts anderes als eine Mischung aus HTML, Stylesheets und JavaScript. Wenn Ihre Website für ein möglichst breites Publikum und die unterschiedlichsten Plattformen zugänglich sein soll, dann verbietet sich unter Umständen der Einsatz von DHTML. Wenn Sie Ihre Website mit DHTML-Effekten ausstatten, muss der Browser des Anwenders bestimmte Voraussetzungen erfüllen (Browser der neueren Generation, Installation bestimmter Plug-Ins usw.). Bei Einsatz solcher Effekte laufen Sie also Gefahr, ein bestimmtes Publikum auszuschließen.
148
DHTML – Was hat man darunter zu verstehen und was nicht?
Stylesheets Stylesheets, die wir in der morgigen Lektion ausführlich besprechen werden, ermöglichen die exakte Positionierung von Elementen auf der Seite sowie präzise Größenangaben. Auch die Verwendung von Ebenen ist weitgehend von der Verwendung von Stylesheets abhängig. Wenn Sie in ein HTML-Dokument Ebenen einsetzen und deren Eigenschaften definieren, haben Sie im Grunde ein Stylesheet für diese Ebene geschrieben. Im Fall von Ebenen werden die nötigen Stylesheets sozusagen stillschweigend im Hintergrund erzeugt, bei anderen Objekten müssen Sie jedoch die Ärmel aufkrempeln und selbst Hand anlegen. Da Stylesheets die pixelgenaue Positionierung von Elementen ermöglichen, spielen sie eine zentrale Rolle bei der Erzeugung von dynamischen Effekten und Animationen. Ohne Stylesheets könnte z.B. JavaScript nicht auf die Attribute eines Objekts zugreifen und sie dynamisch verändern.
JavaScript JavaScript ist eine Programmiersprache, die clientseitig im Browser arbeitet und sämtliche Objekte eines HTML-Dokuments ansprechen und verändern kann. JavaScript hat dabei aber nur auf die Eigenschaften eines Objektes Zugriff, die über HTML-Tags oder Stylesheets definiert sind. Sie können z.B. also nicht Helligkeit oder Kontrast einer Abbildung mit JavaScript verändern. Wenn Sie daher die Eigenschaften eines Objekts nicht per HTML oder Stylesheets ansprechen können, werden Sie auch mit JavaScript nicht weit kommen. Das heißt natürlich nicht, dass JavaScript nutzlos ist. Die Fähigkeit, die Eigenschaften eines Objekts dynamisch ändern zu können, bedeutet, dass Objekte clientseitig, d.h. auf dem Rechner des Anwenders, manipuliert werden können. Mit ein paar Zeilen Code können Sie so Bilder und Text austauschen oder in der Größe verändern. Da die nötigen Operationen vom Rechner des Anwenders ausgeführt werden, muss der Server nur die Seite im Ausgangszustand sowie die nötigen Grafiken übertragen und wird somit entlastet.
Das DHTML-Problem Wenn Sie nun sagen, dass DHTML eine tolle Erfindung ist, stimme ich Ihnen da durchaus zu. Theoretisch handelt es sich bei DHTML um eine wunderbare Möglichkeit, dem Anwender maßgeschneidert Feed-back zu geben, ohne serverseitige Scripts einsetzen oder schreiben zu müssen. Leider ist DHTML in der Praxis nicht so pflegeleicht, wie man sich das wünschen würde.
149
Websites in Bewegung – clientseitige Verhaltensweisen
In der Einleitung zu diesem Buch habe ich das Thema Webbrowser und die Problematik der unterschiedlichen Umsetzung von HTML-Standards angesprochen. Die Browserhersteller haben sich in diesem Punkt mittlerweile weitgehend geeinigt und es hat sich ein verbindlicher HTML-Standard etabliert. Bei der Implementierung von JavaScript in den Browsern bleibt in puncto Standards jedoch noch ein gutes Stück Arbeit zu leisten. Wenn Sie schon einmal ein JavaScript-Programm geschrieben haben, um es in eine Webseite einzubauen, haben Sie vermutlich auch einige Mühe darauf verwendet, dass Ihr fertiges Programm sowohl im Netscape Navigator als auch im Internet Explorer einwandfrei funktioniert. Und nach getaner Arbeit haben Sie sich stolz zurückgelehnt, mit sich und der Welt zufrieden, und an Freunde, Kollegen und Vorgesetzte schnell eine E-Mail geschickt mit der Bitte, doch mal einen Blick auf die tolle JavaScript-gepowerte Seite zu werfen. Aber welchen Browser Sie auch verwenden, um Ihre JavaScript-Seite zu testen, der Betrachter Ihrer Seite wird immer genau den anderen Browser verwenden und prompt funktioniert auch die Seite nicht wie erhofft. Hier holt nicht nur das Schicksal mit harter Hand zu einem grausamen Schlag gegen uns aus, sondern der Hoffnung auf erfolgreiche Präsentation von DHTML-Seiten über alle Browser- und Plattformgrenzen hinweg ist hiermit ein jähes Ende bereitet. Jeder Browser spricht sozusagen seinen eigenen JavaScript-Dialekt. Die Hauptschwierigkeit liegt in der Verwendung von unterschiedlichen Document Object Models (DOM) bei der Implementierung von JavaScript in den verschiedenen Browsern. Über das DOM wird geregelt, wie Objekte per JavaScript angesprochen und verändert werden. Zwischen dem DOM des Internet Explorers und demjenigen von Netscape klafft eine gewaltige Lücke. Um JavaScript-Code problemlos von einer Plattform auf die andere portieren zu können, ist Einiges an Vorausschau und Planung nötig. In vielen Fällen bedeutet das praktisch, dass Sie den Code für jeden Browser extra anpassen müssen. Die Verwendung der DHTML-Funktionen von UltraDev enthebt uns dieser Notwendigkeit, denn das Programm erzeugt Code, der von beiden Plattformen fehlerfrei verstanden wird. Wenn Sie HTML-Objekten auf einer Seite dynamische Verhaltensweisen zuweisen, können Sie darüber hinaus spezifizieren, welche Browsergeneration unterstützt werden soll. Je nach Zielpublikum, das Sie anvisieren, haben Sie verschiedene Optionen zur Auswahl. Sollten Sie es drauf anlegen und Ihre Seiten ausschließlich für den IE 5.0 optimieren, steht Ihnen eine lange Liste von dynamischen Effekten zur Auswahl.
Soll ich nun DHTML verwenden oder nicht? Wenn Sie DHTML-Effekte einsetzen, haben Sie zwar sicher die Bewunderer auf Ihrer Seite, doch Sie laufen Gefahr, dass Sie den Kreis Ihrer Adressaten unter Umständen erheblich einschränken. Wenn der Anwender nicht mindestens einen 4.0-Browser benutzt und JavaScript aktiviert hat, kann er sich DHTML-Websites schlichtweg nicht ansehen. Meiner
150
Clientseitige Verhaltensweisen
Meinung nach wird der Einsatz von DHTML auf manchen Sites übertrieben, sodass sie oft schlecht navigierbar sind und auch dem Auge viel zumuten. Ich finde, der Einsatz von DHTML sollte die Botschaft, die Information einer Seite unterstützen und nicht zum Selbstzweck werden. Wenn Sie den Anwender durch die Anwendung von DHTML-Effekten nicht optisch erschlagen, spricht nichts gegen deren Einsatz. Effekte aber nur um ihrer selbst willen zu verwenden, einfach nur, weil sie machbar sind, ist in meinen Augen keine gute Gestaltungsphilosophie. Es gibt viele Möglichkeiten, auf einer Webseite Animationen einzubauen – GIFs, Flash, Shockwave, Java, QuickTime usw. Diese verschiedenen Typen von Animationen werden in das HTML-Dokument eingebettet und benötigen ein Browser-Plug-In (außer GIFs), um angezeigt werden zu können. Anders bei DHTML-basierten Animationen: Sie sind Teil des HTML-Codes und brauchen zu ihrer Anzeige nur den Browser selbst. Nun können aber mit DHTML nicht alle Effekte erzeugt werden, die mit anderen Animationstechniken möglich sind. Heute werden viele Browser zusammen mit dem Flash-Plug-In installiert, sodass sich für die Erstellung komplexerer Animationen die Verwendung von Flash empfiehlt.
4.2
Clientseitige Verhaltensweisen
Heute lernen wir ein neues Werkzeug kennen: die Verhaltenspalette. Wenn im Folgenden von Verhaltensweisen gesprochen wird, sind damit immer clientseitige Verhaltensweisen gemeint. Mit dieser Palette weisen sie Objekten eine Verhaltensweise zu – das heißt, Sie legen fest, wie ein Objekt auf bestimmte Ereignisse von Seiten des Anwenders, z.B. einen Mausklick, reagieren soll. Die Funktionsweise dieses Werkzeugs wird am besten anhand eines praktischen Beispiels deutlich. Dazu brauchen wir auf unserer Seite zunächst ein JavaScript-Element. Das bekommen wir, wenn wir einen einfachen Rollover-Button auf unsere Seite setzen. Im nächsten Schritt öffnen Sie mit FENSTER > VERHALTEN die Verhaltenspalette.
Die Verhaltenspalette Der Inspector sollte zwei JavaScript-Aktionen anzeigen: onMouseOver und onMouseOut. Wenn alles glatt gegangen ist, sehen Sie auf Ihrem Monitor das in Abb. 4.1 gezeigte Fenster. Die Verhaltenspalette zeigt eine Liste der aktuell einem Objekt zugewiesenen Ereignisse und der damit verbundenen Aktionen. Im Fall unseres Rollover-Bildes handelt es sich um
151
Websites in Bewegung – clientseitige Verhaltensweisen
ein onMouseOver-Ereignis, das die Aktion BILD AUSTAUSCHEN auslöst. Umgekehrt wird durch das onMouseOut-Ereignis die Aktion BILDAUSTAUSCH WIEDERHERSTELLEN ausgeführt. Das Zusammenspiel dieser beiden Ereignisse bewirkt, dass ein Bild ausgetauscht wird, wenn wir den Mauszeiger darauf setzen, und der ursprüngliche Zustand wiederhergestellt wird, wenn sich die Maus außerhalb der Bildfläche befindet.
Abbildung 4.1: Verhaltensweisen sind JavaScript-basierte Aktionen.
Verhaltensweisen erstellen In der Verhaltenspalette gibt es ein Popup-Menü EREIGNISSE ZEIGEN FÜR. Wenn Sie es anklicken, wird eine Liste der verschiedenen Browser angezeigt, aus der Sie die gewünschte Zielplattform auswählen. Diese Einstellung sollten Sie vornehmen, bevor Sie ein Ereignis zuweisen, denn je nach gewähltem Browser ist die Liste der angebotenen Ereignisse kürzer oder länger bzw. nur für diese Plattform erhältlich. Die Auswahlliste selbst bedarf wohl keiner Erklärung, ich möchte Ihnen aber empfehlen, die Einstellung BROWSER AB 3.0 zu verwenden, um größtmögliche Kompatibilität zwischen den Plattformen zu erzielen. Die Einstellung BROWSER AB 4.0 bietet sich an, wenn es um größtmögliche Kompatibilität und Zukunftssicherheit geht. In den folgenden Beispielen arbeiten wir immer mit der Einstellung BROWSER AB 4.0.
Eine Aktion zuweisen Eine Aktion zuzuweisen ist recht einfach – Sie müssen lediglich das betreffende Objekt auswählen und dann zur Verhaltenspalette gehen. Klicken Sie dort auf das Plussymbol (+) und wählen Sie aus dem geöffneten Popup-Menü (siehe Abb. 4.2) die gewünschte Aktion aus. Bei manchen Aktionen ist es offensichtlich, was sie tun, andere bedürfen der Erklärung. In Tabelle 4.1 finden Sie eine Liste sämtlicher Aktionen samt Beschreibung.
152
Clientseitige Verhaltensweisen
Abbildung 4.2: Aktionen warten auf ihren Einsatz. JavaScript-Funktion
Beschreibung
AUDIO ABSPIELEN
Spielt Sounddateien auf dem System des Anwenders ab.
BILD AUSTAUSCHEN
Ersetzt ein Bild durch ein anderes. Wird benutzt, um Rollover-Effekte von Hand zu erstellen.
BILDAUSTAUSCH WIEDERHER- Setzt für das vertauschte Bild wieder die ursprüngliche Grafik ein. STELLEN
BILDER VORAUSLADEN
Lädt Bilder in den Cache, sodass sie im Bedarfsfall ohne weitere Ladezeit ausgetauscht werden können. UltraDev lädt Bilder für Rollover per Default im Voraus.
BROWSER ÜBERPRÜFEN
Leitet den Browser je nach Typ (NN oder IE) bzw. Version zu entsprechend optimierten Seiten.
BROWSER-FENSTER ÖFFNEN
Öffnet URL in neuem Browser-Fenster.
EBENE ZIEHEN
Ermöglicht dem Anwender, eine Ebene im Browser-Fenster frei zu verschieben.
EBENEN EIN-/AUSBLENDEN
Blendet Ebenen ein oder aus bzw. stellt die Standardsichtbarkeit wieder her.
EIGENSCHAFT ÄNDERN
Ändert Eigenschaften eines Objekts. Nützlich zur Anpassung von Ebeneneigenschaften usw.
FORMULAR ÜBERPRÜFEN
Überprüft, ob Formularfelder, die Daten enthalten müssen, vom Anwender auch ausgefüllt worden sind, bevor es zum Server zur Bearbeitung übertragen wird.
Tabelle 4.1: JavaScript-Funktionen und ihr Verwendungszweck
153
Websites in Bewegung – clientseitige Verhaltensweisen
JavaScript-Funktion
Beschreibung
GEHE ZU URL
Leitet den Browser zu neuer URL um.
JAVASCRIPT AUFRUFEN
Ruft eine selbst geschriebene JavaScript-Funktion auf.
NAVIGATIONSLEISTENBILD
Tauscht Bilder in der aktuellen Navigationsleiste aus.
FESTLEGEN
PLUG-IN ÜBERPRÜFEN
Prüft, ob das entsprechende Plug-In installiert ist und leitet den Anwender zur richtigen URL.
POPUP-MELDUNG
Blendet ein Fenster mit einer frei definierten Warnmeldung ein.
SHOCKWAVE ODER FLASHFILM STEUERN
Steuert die Wiedergabe von Shockwave oder Flash-Filmen.
SPRUNGMENÜ
Ändert die Attribute eines Sprungmenüs.
SPRUNGMENÜ GEHE ZU
Fügt dem Sprungmenü eine GEHE ZU-Schaltfläche hinzu. Das entsprechende JavaScript-Element finden Sie in der Unterpalette FORMULARE der Werkzeugpalette.
TEXT DEFINIEREN: EBENE-
Ersetzt Inhalt und Formatierung einer vorhandenen Ebene.
TEXT FESTLEGEN
TEXT DEFINIEREN: STATUS-
Definiert Text zur Anzeige in der Statusleiste des Browsers.
LEISTENTEXT FESTLEGEN
TEXT DEFINIEREN: TEXT VON TEXTFELD EINSTELLEN
Ersetzt den Inhalt eines Textfeldes in einem Formular.
TEXT DEFINIEREN: TEXT VON FRAME EINSTELLEN
Stellt Text eines Frames dynamisch ein.
ZEITLEISTE: GEHE ZU ZEIT-
Bewegt den Wiedergabekopf zu einem beistimmten Bild in der Zeitleiste.
LEISTENBILD
ZEITLEISTE: ZEITLEISTE ABSPIELEN BZW. ZEITLEISTE ANHALTEN
Definiert, welche Aktion zu einem bestimmten Zeitpunkt ausgeführt werden soll. Über diese Funktion können Sie gezielt Punkte in der Zeitleiste anspringen und den zeitlichen Ablauf von Ereignissen steuern.
Tabelle 4.1: JavaScript-Funktionen und ihr Verwendungszweck (Forts.)
Die meisten dieser Aktionen erfordern, dass das Objekt, auf das sie zugreifen, durch einen eindeutigen Namen identifizierbar ist, d.h., das Attribut name muss gesetzt sein. Falls Sie bisher Objekten keinen Namen zugewiesen haben, müssen Sie das nachholen, wenn Sie mit Verhaltensweisen arbeiten wollen. Wählen Sie hierzu das Objekt aus, und öffnen Sie den Eigenschafteninspektor. In der linken oberen Ecke der Palette befindet sich ein Eingabefeld, in das Sie den Namen des Objektes einsetzen.
154
Clientseitige Verhaltensweisen
Als JavaScript-Programmierer werden Sie vielleicht das Menü mit den Aktionen durchsehen und einwenden, dass es sich hier um keine eigentlichen JavaScript-Funktionen handelt. Der Einwand ist nicht unberechtigt. Bei der Verhaltensweisen-Bibliothek handelt sich um eine Sammlung fertig programmierter Verhaltensweisen, deren Ziel es ist, in allen Browsern und auf verschiedenen Plattformen zu funktionieren. Über die letzte Option im Popup-Menü WEITERE VERHALTEN werden Sie mit der Website von Macromedia verbunden, von wo Sie zusätzliche Verhaltensweisen herunterladen können. Die Einbindung neuer Verhaltensweisen sowie die Erweiterung von UltraDev ist Stoff unserer morgigen Lektion.
Ereignisse zuweisen Nachdem Sie in der Verhaltenspalette einem Objekt eine Aktion zugewiesen haben, müssen Sie noch definieren, durch welches Ereignis, d.h. durch welche Maus- bzw. Tastatureingaben des Anwenders, diese Aktion ausgelöst wird. Im Falle des Rollover-Bildes waren die auslösenden Ereignisse onMouseOver bzw. onMouseOut. Bestimmte Ereignisse sind nur in Verbindung mit bestimmten Objekten möglich, und je nach den Einstellungen, die Sie im Eingabefeld EREIGNISSE ZEIGEN FÜR der Verhaltenspalette getroffen haben, sind Sie entweder auf ein paar wenige Ereignisse beschränkt oder haben die ganze Batterie von IEspezifischen Ereignissen zu Ihrer Verfügung. Das auslösende Ereignis definieren Sie, indem Sie zunächst die betreffende Verhaltensweise auswählen und dann im Feld EREIGNISSE auf den kleinen, nach unten gerichteten Pfeil klicken, der rechts neben dem ausgewählten Ereignis angezeigt wird. Es öffnet sich das in Abb. 4.3 gezeigte Popup-Menü mit den möglichen Ereignissen. Vielleicht haben Sie schon bemerkt, dass in manchen Fällen das Ereignis zwischen Klammern steht. Das bedeutet, dass dieses Ereignis in Verbindung mit dem ausgewählten Objekt nicht funktioniert, sondern nur in Verbindung mit einem zweiten Objekt, das das gewünschte Ereignis unterstützt. Das
-Objekt z.B. unterstützt eigentlich kein onMouseOver-Ereignis, es unterstützt nebenbei bemerkt fast überhaupt keine Ereignisse. Damit Grafiken überhaupt für Aktionen des Mauszeigers sensibel werden, legt UltraDev ein Anchor-Tag um das Bild (
). Über diesen Umweg unterstützt die Grafik die gewünschte Funktion, und wir müssen uns nicht den Kopf zermartern, um uns wieder daran zu erinnern, welches Objekt welche Ereignisse unterstützt. Mehr darüber, welcher Browser welche Ereignisse unterstützt, erfahren Sie auf den Websites der Hersteller. Microsoft: http://msdn.microsoft.com/scripting/jscript/default.htm Netscape: http://developer.netscape.com/docs/manuals/index.html?content= javascript.html
155
Websites in Bewegung – clientseitige Verhaltensweisen
Abbildung 4.3: Aktionen ein auslösendes Ereignis zuweisen
Es folgt eine Übersicht der wichtigsten Ereignisse für 4.0-Browser und höher: 쐽
onMouseUp – Die gedrückte Maustaste wird über dem Objekt losgelassen.
쐽
onMouseOver – Der Mauszeiger befindet sich über dem Objekt.
쐽
onMouseDown – Die Maustaste wird gedrückt, während sich der Mauszeiger über dem Objekt befindet.
쐽
onMouseOut – Der Mauszeiger wird vom betreffenden Objekt weg bewegt.
쐽
onClick – Der Anwender klickt auf das betreffende Objekt.
쐽
onDblClick – Der Anwender führt einen Doppelklick auf das betreffende Objekt aus.
쐽
onKeyDown – Der Anwender drückt eine beliebige Taste.
쐽
onKeyPress – Der Anwender drückt eine beliebige Taste und lässt sie wieder los.
쐽
onKeyUp – Der Anwender lässt eine Taste los, die er zuvor gedrückt hat.
쐽
onBlur – Das betreffende Objekt hat seinen Focus verloren, d.h., es ist nicht mehr
Gegenstand der Benutzeraktion. 쐽
156
onChange – Der Inhalt eines Objekts wurde geändert. Dies kann beispielsweise der Fall sein, wenn der Anwender ein Menüelement auswählt oder den Wert eines Textfeldes ändert und dann auf eine andere Stelle der Seite klickt.
Clientseitige Verhaltensweisen
쐽
onFocus – Ein Objekt erhält den Fokus der Benutzerinteraktion. Beispielsweise wird das Ereignis onFocus generiert, wenn ein Anwender in einem Formular in ein Textfeld klickt.
Da die meisten JavaScript-Aktionen von Maus-Ereignissen ausgelöst werden, steht gewöhnlich auch deren Verwendung im Mittelpunkt des Interesses.
Verhaltensweisen bearbeiten Wenn Sie Objekten Aktionen zuweisen, die von bestimmten Ereignissen ausgelöst werden, können Sie die Auf- bzw. Ab-Pfeile in der Verhaltenspalette dazu verwenden, die Reihenfolge der Aktionen neu zu ordnen. Die Ereignisse werden von oben nach unten abgearbeitet. Sie können über das Popup-Menü jederzeit neue Ereignisse als Auslöser für Aktionen zuweisen. Wenn Sie auf eine Aktion doppelklicken, öffnet sich ein Dialogfenster, über das Sie die Aktion selbst editieren können. Um eine Verhaltensweise zu löschen, müssen Sie nichts weiter tun als auf das Minussymbol (-) der Palette zu klicken.
Per Verhaltensweise Text in der Statuszeile ausgeben Für unsere erste clientseitige Verhaltensweise nehmen wir eine einfache Aktion – wir weisen einem Rollover-Bild eine Verhaltensweise zu, die in der Statuszeile einen erklärenden Text zu diesem Bild bzw. Link ausgibt. Das ist eine ganz praktikable Methode, dem Anwender Feed-back zu geben, ohne dass man gleich Änderungen am HTML-Dokument vornehmen oder ein neues Browserfenster öffnen muss. Hoffentlich haben Sie die Datei gespeichert, in die wir einen Rollover-Bild eingesetzt haben. Wenn ja, dann öffnen Sie sie bitte jetzt, wenn nicht, müssen Sie einen neuen Rollover-Effekt erzeugen. Nun brauchen wir die Verhaltenspalette. Wie bereits gesagt, sind für Rollover-Effekte zwei Verhaltensweisen vordefiniert, die auf onMouseOver- bzw. onMouseOut-Ereignissen basieren. Um Text in der Statuszeile auszugeben, brauchen wir eine dritte Verhaltensweise.
Aktion STATUSLEISTENTEXT FESTLEGEN Klicken Sie in der Verhaltenspalette auf das Plussymbol (+), und wählen Sie aus dem Popup-Menü die Aktion TEXT DEFINIEREN > STATUSLEISTENTEXT FESTLEGEN. Es öffnet sich das in Abb. 4.4 gezeigte Dialogfenster, in das Sie den Text eingeben, der in der Statusleiste angezeigt werden soll.
157
Websites in Bewegung – clientseitige Verhaltensweisen
Abbildung 4.4: Textmeldungen in der Statuszeile ausgeben lassen
Wenn Sie vielleicht schon ein bisschen mit den Verhaltensweisen experimentiert haben, wissen Sie bereits, dass zu den meisten Aktionen Dialogfenster angezeigt werden, um den Ablauf der Aktion zu konfigurieren. Die Einstellungen des Fensters STATUSLEISTENTEXT FESTLEGEN gehören zu den einfachsten, die man vornehmen muss.
Ereignis onMouseOver hinzufügen Wenn Sie einem Objekt eine Aktion zuweisen, wird als auslösendes Ereignis standardmäßig onMouseOver gesetzt. Falls das sowieso Ihre Absicht war, brauchen Sie an der Einstellung nichts mehr zu verändern. Wenn Sie nun mit der Maus über die Grafik fahren, wird die Aktion STATUSLEISTENTEXT FESTLEGEN ausgeführt, und der Text, den Sie in der entsprechenden Dialogbox eingetippt haben, wird in der Statuszeile des Browsers ausgegeben. Sie könnten natürlich als auslösendes Ereignis auch onClick oder eines der anderen vordefinierten Ereignisse setzen. Wenn Sie alle Verhaltensweisen wie vorstehend definiert haben, müsste Ihre Verhaltenspalette so aussehen wie in Abb. 4.5 gezeigt.
Abbildung 4.5: Dem Rollover-Bild sind nun drei Aktionen zugewiesen worden.
Es macht nichts, dass zwei onMouseOver-Ereignisse gesetzt wurden. Die Reihenfolge der Verhaltensweisen in der Liste bezeichnet die Reihenfolge, in der sie abgearbeitet werden (von oben nach unten). In der in Abb. 4.5 gezeigten Konfiguration werden zuerst die Bilder ausgetauscht und dann der Text der Statuszeile ausgegeben. Das Ganze jedoch geschieht so schnell, dass wir keine Verzögerung bemerken, und die Reihenfolge spielt eigentlich keine Rolle. Wenn Sie aber möchten, dass zuerst der Text der Statuszeile angezeigt wird, markieren Sie dieses Verhalten und verschieben es mit dem Nach-oben-Button an die erste Stelle.
158
Clientseitige Verhaltensweisen
Sie können die Reihenfolge der Ausführung nur bei bestimmten Ereignissen abändern. Sie können z.B. ein onMouseOver-Ereignis im Stapel nicht über ein onMouseOut-Ereignis legen, da es voneinander unabhängige Ereignisse sind. Die Reihenfolge von zwei onMouseOver-Ereignissen können Sie jedoch vertauschen. Zum Abschluss unserer Bemühungen sollten wir unser Werk im Browser begutachten. Wenn alles gut gegangen ist, wird die Rollover-Grafik angezeigt, wenn Sie den Mauszeiger auf den Button setzen, und die eingestellte Nachricht wird in der Statuszeile angezeigt. So einfach geht das. Als Nächstes wollen wir eine ähnliche Funktionalität mit einer völlig anderen Verhaltensweise erreichen. Es empfiehlt sich, Verhaltensweisen eines Objekts in verschiedenen Browsern zu testen. Sie werden feststellen, dass die Resultate unterschiedlich ausfallen. Das liegt an den unterschiedlichen JavaScript-»Dialekten«. Bevor wir uns jedoch zu neuen Ufern wagen, möchten Sie vielleicht noch wissen, wie UltraDev diese und jene Kunststücke vollbringt. Lassen Sie uns daher einen Blick auf den JavaScript-Code werfen, den das Programm erzeugt hat, um den Objekten diese Verhaltensweisen zuzuweisen: <script language="JavaScript"> 0&&parent.frames.length) { d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);} if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i
159
Websites in Bewegung – clientseitige Verhaltensweisen
Die obigen vier Funktionen werden in jedes HTML-Dokument eingefügt, das RolloverBilder verwendet. Die generische Routine MM_findObj ist für jeden JavaScript-Programmierer höchst nützlich. Sie ermöglicht unabhängig von der verwendeten Browserplattform auf Objekte über deren Namen zuzugreifen. Wenn Ihnen das böhmische Dörfer sind, müssen Sie sich deswegen keine grauen Haare wachsen lassen. Die übrigen drei Funktionen, MM_preloadImages, MM_swapImage und MM_swapImgRestore, dienen dazu, die benötigten Bilder auf die Seite zu laden, das aktuelle Bild gegen sein Rollover-Bild zu tauschen und den Ausgangszustand wiederherzustellen. Die folgende Funktion hat die Aufgabe, Text in der Statuszeile auszugeben: function MM_displayStatusMsg(msgStr) { //v1.0 status=msgStr; document.MM_returnValue = true; } //-->
Im -Bereich des HTML-Codes finden wir die auslösenden JavaScript-Ereignisse. Durch das onMouseOver-Ereignis werden der Austausch der Grafiken und die Anzeige in der Statuszeile veranlasst, während durch das onMouseOut-Ereignis wieder das Ausgangsbild geladen wird.
Mit jeder neuen Verhaltensweise wird dem Dokument auch neuer JavaScript-Code hinzugefügt. Auch wenn Sie selbst kein JavaScript-Programmierer sind, sollten Sie anhand der Namen der Funktionen erkennen, welche Routine zu welchem Verhalten gehört.
Benutzerhilfen einblenden Erklärenden Test in der Statuszeile einzublenden ist durchaus ein gangbarer Weg, um dem Benutzer Feed-back zu geben, doch von einem echten Blickfänger kann man in diesem Zusammenhang nicht gerade sprechen. Die Information sollte schon ein bisschen besser ins Auge fallen. Sie kennen sicher alle die Tooltipps, die aus keiner neuen Software mehr wegzudenken sind. Wäre es nicht toll, wenn Sie mit etwas JavaScript auf Ihrer Website eine ähnliche Funktionalität anbieten könnten? (Natürlich wäre das toll!)
160
Clientseitige Verhaltensweisen
Tooltipps einrichten Bevor Sie einen Tooltipp einrichten können, müssen Sie ein Objekt haben, zu dem dieser Tooltipp eingeblendet wird. Ich habe ein altgedientes Rollover-Bild aus meiner Sammlung genommen und es zweimal auf der Seite eingefügt. Welche Art von Objekt Sie verwenden ist egal, solange es onMouseOver-Ereignisse und onMouseOut-Ereignisse unterstützt. Die Tooltipps selbst werden in Ebenen abgelegt. Da ich zwei Buttons habe, zeichne ich auch zwei Ebenen – je eine pro Tooltipp. Geben Sie Ihren Ebenen eindeutige Namen, die die Zuordnung erleichtern. Wenn Sie auf Ihrer Seite Button1 und Button2 verwenden, dann nennen Sie die Ebenen ebene1 und ebene2. Schreiben Sie nun in diese Ebenen den Text, der beim Rollover angezeigt werden soll. Positionieren Sie die Ebenen an der Stelle, an der sie später eingeblendet werden sollen. Abb. 4.6 zeigt zwei Buttons und den zugehörigen Ebenen. Wenn Sie die Ebenen mit Text gefüllt und richtig positioniert haben, müssen für jede Ebene im Eigenschafteninspektor die Sichtbarkeit auf HIDDEN stellen. Somit ist sichergestellt, dass der Anwender die Ebenen nicht sieht, wenn er Ihre Seite zum ersten Mal lädt, und nur die Buttons angezeigt bekommt. Im nächsten Schritt werden wir den Ebenen das entsprechende Verhalten zuweisen, sodass sie bei einem Rollover wie Tooltipps zu den jeweiligen Buttons eingeblendet werden.
Abbildung 4.6: Positionieren Sie die Ebenen dort, wo sie später eingeblendet werden sollen.
161
Websites in Bewegung – clientseitige Verhaltensweisen
Verhaltensweise EBENEN EIN-/AUSBLENDEN zuweisen Für jeden Tooltipp, der ein- und wieder ausgeblendet werden soll, müssen Sie der Verhaltensweise des übergeordneten Buttons die Aktion EBENEN EIN-/AUSBLENDEN zuweisen. Wenn der Anwender mit der Maus den Button überfährt, sollte die entsprechende Ebene eingeblendet werden. Bewegt sich die Maus vom Button weg, sollte die Ebene wieder unsichtbar werden. Wählen Sie einen Button aus, um ihm ein Verhalten zuzuweisen und öffnen Sie die Verhaltenspalette. Klicken Sie auf das Plussymbol (+) und wählen Sie die Aktion EBENEN EIN/AUSBLENDEN aus. Es öffnet sich ein Fenster, das eine Liste aller Ebenen und die verfügbaren Optionen anzeigt (siehe Abb. 4.7). Abbildung 4.7: Wählen Sie die Ebene aus, die angezeigt oder verborgen werden soll, und klicken Sie auf die entsprechende Schaltfläche.
Markieren Sie die Ebene, die zu dem Button oder Objekt gehört, das Sie gerade bearbeiten, und klicken Sie auf die Schaltfläche AUSBLENDEN. Markieren Sie in der Verhaltenspalette das neu hinzugefügte Verhalten und ändern Sie das Ereignis auf onMouseOut. Damit stellen Sie sicher, dass die Ebene ausgeblendet wird, wenn der Anwender die Maus vom Button wegbewegt. Wiederholen Sie diesen Schritt und weisen Sie dem Button eine weitere Aktion EBENEN zu, nur dass Sie diesmal im Fenster EBENEN EIN-/AUSBLENDEN die Option »Einblenden« wählen. Die Verhaltenspalette sollte nun zwei Aktionen EBENEN EIN-/AUSBLENDEN (einmal EINBLENDEN, einmal AUSBLENDEN) enthalten, die die Ebene mit den Tooltipps des Buttons kontrollieren. Als auslösendes Ereignis für die Aktion EBENE EINBLENDEN setzen Sie onMouseOver. Dadurch wird die Ebene eingeblendet, wenn der Anwender die Maus auf den Button setzt. Wenn Sie sämtliche Verhaltensweisen zugewiesen haben, sollte die Palette so aussehen wie in Abb. 4.8 gezeigt. EIN-/AUSBLENDEN
Für den zweiten Button wiederholen Sie die gesamte Prozedur, nur dass Sie natürlich die zu diesem Button gehörige Ebene verwenden. Mit geringem Aufwand haben Sie jetzt Ihrer Webseite dynamische Informationen verpasst, die nur angezeigt werden, wenn sie benötigt werden.
162
Clientseitige Verhaltensweisen
Abbildung 4.8: Das Endergebnis: zwei Buttons, zwei Tooltipps – vier Verhaltensweisen.
Viele Webdesigner erzeugen Tooltipps über das onMouseOver-Ereignis, indem sie Abbildungen gegen Grafiken mit erklärendem Text austauschen lassen. Das ist zwar möglich, ist aber keine so effektive Methode wie die eben verwendete Verhaltensweise EBENEN EIN-/AUSBLENDEN. Als Grafik abgespeicherter Text braucht wesentlich länger um zu laden, außerdem können Sie diese Grafiken nicht so frei positionieren wie Ebenen. Auch in dem Fall, dass Ihre Tooltipps grafische Elemente enthalten, können Sie Ebenen verwenden, denn Ebenen können alle Arten von Objekten enthalten, auch Grafiken.
Popup-Fenster Ein weiteres sehr beliebtes Mittel, um dem Anwender zusätzliche Informationen zu geben, sind Popup-Fenster. Das sind eigene Fenster, die über dem Hauptfenster des Browsers geöffnet werden, wenn der Anwender auf den entsprechenden Link klickt. Diese Technik bietet sich vor allem dann an, wenn kurze Informationen eingeblendet werden sollen, die bestimmte Inhalte im Hauptfenster näher erläutern sollen. Sie können natürlich auch ohne den Einsatz von Verhaltensweisen einen Link in einem neuen Fenster öffnen lassen. Hierzu müssen Sie dem Link im Eigenschafteninspektor nur das entsprechende Ziel zuweisen. Diese Methode hat allerdings den Nachteil, dass ein neues Browserfenster mit all seinen Menüs und Werkzeugleisten geöffnet wird. Das sind nicht nur relative schwere Geschütze, um wenig zusätzliche Information einzublenden, sondern auch das Hauptfenster wird verdeckt, was den Anwender irritieren kann.
163
Websites in Bewegung – clientseitige Verhaltensweisen
Verhaltensweise BROWSERFENSTER ÖFFNEN Im Arsenal der Verhaltensweisen von UltraDev findet sich auch eine Aktion, die das Öffnen von neuen Browserfenstern mit oder ohne die üblichen grafischen Steuerelemente ermöglicht. Zur Realisierung dieses Beispiels verwende ich diesmal ein einfaches Bild. Ziel dieser Übung ist es, den Mausklick des Anwenders abzufangen und daraufhin ein neues Fenster zu öffnen. Im Beispiel mit den Tooltipps war der Text für die eingeblendete Information im gleichen HTML-Dokument gespeichert wie die aufrufende Verhaltensweise. Die Verhaltensweise BROWSERFENSTER ÖFFNEN zeigt jedoch auf die URL einer externen Datei, in der die entsprechenden Information liegen, und öffnet sie in einem neuen Fenster. Sie müssen also vorher ein neues Dokument anlegen. Ich habe zu diesem Zweck eine Datei namens help.html erzeugt. Sobald Sie diese Datei erstellt haben, markieren Sie das Objekt, dem Sie das Verhalten zuweisen wollen und öffnen die Verhaltenspalette. Wählen Sie im Popup-Menü die Aktion BROWSERFENSTER ÖFFNEN. Es öffnet sich das in Abb. 4.9 gezeigte Dialogfenster, in dem Sie weitere Einstellungen vornehmen.
Abbildung 4.9: Optionen für das neue Browserfenster festlegen
Durchsuchen Sie die Site nach der URL, die im neuen Fenster angezeigt werden soll, oder geben Sie sie direkt ein. Wenn Sie dem Fenster eine feste Höhe oder Breite zuweisen wollen, geben Sie die Werte in die entsprechenden Felder ein. Wenn das neue Fenster zusätzliche Informationen zur Hauptseite anzeigen soll, sollten Sie es nicht größer machen als die Hauptseite, sodass es der Anwender im Bedarfsfall verschieben kann, ohne das Hauptfenster zu verdecken. Mit den Kontrollfeldern setzen Sie die Attribute, mit denen das Popup-Fenster dargestellt werden soll. Stellen Sie keine festen Fenstergrößen ein, auch wenn Sie mit vorgegebenen Auflösungen arbeiten. Das letzte Wort darüber, wie er seinen Browser konfiguriert, hat immer der Anwender. Wenn Sie Ihr Layout noch so präzise angelegt haben, kann der Anwender mit seinen Einstellungen Ihre sämtlichen Vorgaben
164
Clientseitige Verhaltensweisen
überschreiben. Wenn Sie dem Anwender feste Auflösungen aufzwingen, wird es immer jemanden geben, dem Ihre Inhalte nicht zugänglich sind aus dem einfachen Grund, weil sie außerhalb des Anzeigebereichs liegen. Zu guter Letzt möchten Sie dem Kind vielleicht noch einen Namen geben. Wenn Sie das Fenster benennen, können Sie dieses Fenster als Ziel für andere Links angeben. Schließt der Anwender dieses Fenster jedoch, verliert der Browser dieses Ziel, und alle Links, die auf dieses Fenster zielen, werden in ganz normalen neuen Browserfenstern geöffnet. Damit haben wir alle nötigen Schritte durchgeführt. Bleibt uns nur noch, unser PopupFenster in Aktion zu bewundern. Rufen Sie die Browservorschau auf und klicken Sie auf das Objekt, dem Sie das Verhalten zugewiesen haben. Die Früchte meiner Arbeit sehen Sie in Abb. 4.10.
Abbildung 4.10: Hiermit stehen die berüchtigten Popup-Fenster auch zu Ihrer Verfügung.
Sie kennen sicher genügend Websites, die sofort ein Popup-Fenster öffnen, wenn man auf die Homepage geht. Manchmal ist das ganz nützlich, manchmal nervt es auch bloß. Wollen Sie auf Ihrer Website dieses Feature einbauen, müssen Sie die Aktion BROWSERFENSTER ÖFFNEN dem onLoad-Ereignis im Tag zuweisen. Auch wenn diese Funktion wie gesagt in manchem Fällen ganz nützlich ist, sollten Sie sie nicht in jeder Ihrer Seiten einbauen – Hunderte von kleinen Browserfenstern verderben schnell den Spaß am Surfen.
165
Websites in Bewegung – clientseitige Verhaltensweisen
Drag-and-Drop auf meiner Website? Ja, das geht. Allein mit den Bordmitteln von UltraDev ist es möglich, auf einer Website volle Drag-and-Drop-Funktionalität zu realisieren. Mit dem folgenden Beispiel schließen wir unsere Erkundung der Verhaltenspalette ab und lernen ein paar der interessanteren Aktionen von UltraDev kennen. Wie Sie gesehen haben, können Ebenen pixelgenau positioniert und ihre Attribute per JavaScript verändert werden. Es erhebt sich die Frage, ob man nicht Verhaltensweisen schreiben könnte, die eine Ebene im Fenster verschieben. Zwar lassen sich auf diesem Weg keine hochkomplexen Anwendungen realisieren, aber für einfachere Lernprogramme, die dem Anwender Rückmeldung geben, reicht es allemal. Im Folgenden bauen wir mit der Funktion EBENE ZIEHEN ein kleines Geschichtsquiz zusammen. Zu diesem Zweck habe ich die in Abb. 4.11 gezeigten Grafiken vorbereitet, denen wir dann das entsprechende Verhalten zuweisen.
Abbildung 4.11: Mithilfe dieser Grafiken erstellen wir eine einfache Quizanwendung.
Ziel der folgenden Übung ist es, eine Anwendung zu erstellen, bei der die drei gezeigten Grafiken an die richtige Stelle in der Tafel oben verschoben werden müssen. Um die Elemente auf der Seite zu positionieren, habe ich Ebenen verwendet. Elemente, die verschoben werden sollen, können sowieso nur in Ebenen abgelegt werden. Der statische Teil, die »Tafel«, wurde ebenfalls mit Ebenen erzeugt. Dies wäre zwar nicht nötig, aber mit Ebenen geht es einfacher. Wenn Sie meine Anwendung nachbauen, sollte das fertige Dokument so aussehen wie in Abb. 4.12 gezeigt.
Verhalten EBENE ZIEHEN zuweisen Die Grafiken sind platziert, nun müssen wir ihnen das Verhalten EBENE ZIEHEN zuweisen. Jede Ebene muss einzeln eingerichtet werden, aber wenn Sie einmal alle Schritte durchgespielt haben, dürfte es keine Schwierigkeiten mehr geben.
166
Clientseitige Verhaltensweisen
Abbildung 4.12: Das Dokument besteht aus vier Ebenen, die obere enthält das Ablageziel.
Sie können zwar bewegliche Ebenen im Dokument platzieren, doch wie alle Verhaltensweisen braucht auch diese ein auslösendes Ereignis. Wenn Sie möchten, dass die Ebenen verschiebbar sind, sobald die Seite geladen ist, setzen ein onLoad-Ereignis im -Tag. Bevor Sie ein Verhalten zuweisen, sollten Sie die Ebenen, die Sie bearbeiten, an die Endposition ziehen (sofern es eine gibt), die als Ablageziel dient. Das wird später ganz praktisch sein, weil Sie die Ebenen dann von hier aus an die Startposition ziehen können, wenn Sie die Ziehbewegung definieren. Setzen Sie nun das angesprochene onLoad-Ereignis im -Tag des Dokuments, um ihm das Verhalten EBENE ZIEHEN zuzuweisen. Es öffnet sich das in Abb. 4.13 gezeigte Dialogfenster.
Abbildung 4.13: Definieren Sie die Ziehbewegung und das Ablageziel der Ebene.
167
Websites in Bewegung – clientseitige Verhaltensweisen
Wählen Sie als Erstes im Popup-Menü die Ebene aus, die bewegt werden soll. Definieren Sie nun die Art der Bewegung, die die Ebene auf der Seite ausführen kann. Den Bewegungsmodus von Ebenen einstellen Wenn der Anwender Ebenen frei im Browserfenster verschieben können soll, lassen Sie die standardmäßige Voreinstellung im Eingabefeld BEWEGUNG auf UNBESCHRÄNKT. Wenn Sie jedoch möchten, dass der Anwender die Ebene nur innerhalb eines vorgegebenen Bereichs nach links, rechts, oben oder unten verschieben kann, wählen Sie die Option BESCHRÄNKT. In dieser Einstellung werden rechts neben dem Eingabefeld vier weitere Felder sichtbar. In diese Felder geben Sie ein, um wie viele Pixel die Ebene nach oben (O:), unten (U:), links (L:) und rechts (R:) ausgehend von ihrer Ursprungsposition verschoben werden kann. Das Eingabefeld akzeptiert nur positive Werte. Wenn ich nun z.B. möchte, dass der Anwender die Ebene nur nach oben oder unten verschieben kann, aber nicht nach links oder rechts, setze ich die Werte für L und R auf »0« und schränke damit die Bewegungsrichtung auf die Vertikale ein. Ablageziele von Ebenen festlegen Sie können Ebenen auch ein Ablageziel zuweisen. Weiter oben habe ich schon angedeutet, dass es sich empfiehlt, verschiebbare Ebenen an der Stelle zu positionieren, wo sie schließlich abgelegt werden sollen, bevor Sie ihnen ein Verhalten zuweisen. So können Sie nämlich über die Schaltfläche AKTUELLE POS. ABRUFEN die exakten Koordinaten für das Ablageziel abrufen. Als Letztes können Sie im Feld EINRASTEN, FALLS INNERHALB den Radius festlegen, innerhalb welchem die abgelegte Ebene am Ziel »einschnappt«, wenn die Ebene nicht exakt am Ablageziel platziert wird. Als guter Wert für die Einrastfunktion hat sich die halbe Breite des verschiebbaren Objekts erwiesen. Damit ist sichergestellt, dass das Objekt einschnappt, wenn es nur zur Hälfte auf dem Ablageziel liegt. Erweiterte Einstellungen Die erweiterten Einstellungen der Aktion EBENE ZIEHEN erhöhen das Maß an Interaktivität dieses Verhaltens. Standardmäßig gilt die gesamte Ebene als Anfasser, mit dem sie verschoben werden kann – der Anwender klickt das Objekt an irgendeiner Stelle an und verschiebt es über den Bildschirm. Für bestimmte Anwendungen ist es jedoch sinnvoller, Abbildungen mit einem als solchen erkennbaren Anfasser zu versehen. Wenn Sie z.B. eine Anwendung mit verschiebbaren Fenstern erstellen, könnten Sie am oberen Rand des Fensters eine Titelleiste anbringen, die als Anfasser dient. Zu diesem Zweck wählen Sie im Eingabefeld ZIEHGRIFF die Option BEREICH IN EBENE. In dieser Einstellung werden vier zusätzliche Eingabefelder angezeigt. Die Koordinaten des Anfassers sowie seine Größe
168
Clientseitige Verhaltensweisen
definieren Sie über den Abstand vom linken (L:) und oberen (T:) Rand der Ebene sowie über die Breite (B:) und Höhe (H:). Abb. 4.14 zeigt das Dialogfenster EBENE ZIEHEN im Register ERWEITERT.
Abbildung 4.14: Die erweiterten Einstellungen ermöglichen die Definition eines Anfassers sowie die Verknüpfung mit weiteren JavaScript-Funktionen.
Die Einstellungsoptionen neben BEIM ZIEHEN steuern, wie die Ebene beim Ziehen behandelt wird. In der Standardeinstellung wird die gezogene Ebene in den Vordergrund gebracht und an oberster Stelle über allen anderen Ebenen abgelegt. Mit der Option Z-INDEX WIEDERHERSTELLEN wird die Ebene wieder in ihre ursprüngliche Position im Stapel zurückgebracht. Wenn während der Ziehaktion zusätzlicher JavaScript-Code ausgeführt werden soll, dann geben Sie das im Feld JAVASCRIPT AUFRUFEN ein. Über das Eingabefeld WENN ABGELEGT: JAVASCRIPT AUFRUFEN steuern Sie, ob und welche JavaScripts ausgeführt werden sollen, sobald der Anwender das gezogene Objekt abgelegt hat. Aktivieren Sie zusätzlich das Kontrollfeld NUR WENN EINGERASTET, wird dieses JavaScript nur ausgeführt, wenn das Objekt am Ablageziel eingerastet ist. In diesem Beispiel lasse ich ein Alert-Fenster aufrufen. Mithilfe der Option NUR WENN EINGERASTET können Sie überprüfen, ob der Anwender das Objekt korrekt abgelegt hat, da das JavaScript nur ausgeführt wird, wenn das Objekt am Ablageziel eingerastet ist. Wenn Sie alle Einstellungen vorgenommen haben, müssen Sie nur noch auf OK klicken. Vergessen Sie aber nicht, die Ebene an ihren Ausgangspunkt zu verschieben. Wenn alles glatt gelaufen ist, sollten Sie jetzt die Früchte Ihrer Arbeit in der Browservorschau genießen können. Um den übrigen Ebenen dieselbe Funktionalität zuzuweisen, müssen Sie nur die entsprechenden Arbeitsschritte wiederholen und jeder Ebene einen eindeutigen Namen zuweisen sowie das jeweilige Ablageziel. Nicht um Sie zu erschrecken, sondern um Ihnen einen Eindruck davon zu vermitteln, wie viel Arbeit Ihnen UltraDev abgenommen hat, sei im Folgenden der komplette JavaScript-Code der Funktion MMdragLayer abgedruckt, der das Ziehen von Ebenen ermöglicht:
169
Websites in Bewegung – clientseitige Verhaltensweisen
function MM_dragLayer(objName,x,hL,hT,hW,hH,toFront,dropBack,cU,cD,cL, cR,targL,targT,tol,dropJS,et,dragJS) { //v3.0 //Copyright 1998 Macromedia, Inc. All rights reserved. var i,j,aLayer,retVal,curDrag=null, NS=(navigator.appName=='Netscape'), curLeft, curTop; if (!document.all && !document.layers) return false; retVal = true; if(!NS && event) event.returnValue = true; if (MM_dragLayer.arguments.length > 1) { curDrag = MM_findObj(objName); if (!curDrag) return false; if (!document.allLayers) { document.allLayers = new Array(); with (document) if (NS) { for (i=0; i
document.MM_maxZ) document.MM_maxZ = aLayerZ; var isVisible = (((NS)?aLayer.visibility:aLayer.style.visibility).indexOf('hid') == -1); if (aLayer.MM_dragOk != null && isVisible) with (aLayer) { var parentL=0; var parentT=0; if (!NS) { parentLayer = aLayer.parentElement; while (parentLayer != null && parentLayer.style.position) { parentL += parentLayer.offsetLeft; parentT += parentLayer.offsetTop; parentLayer = parentLayer.parentElement; } } var tmpX=mouseX-(((NS)?pageX:style.pixelLeft+parentL)+MM_hLeft); var tmpY=mouseY-(((NS)?pageY:style.pixelTop +parentT)+MM_hTop);
170
Clientseitige Verhaltensweisen
var tmpW = MM_hWidth; if (tmpW <= 0) tmpW += ((NS)?clip.width :offsetWidth); var tmpH = MM_hHeight; if (tmpH <= 0) tmpH += ((NS)?clip.height:offsetHeight); if ((0 <= tmpX && tmpX < tmpW && 0 <= tmpY && tmpY < tmpH) && (maxDragZ == null || maxDragZ <= aLayerZ)) { curDrag = aLayer; maxDragZ = aLayerZ; } } } if (curDrag) { document.onmousemove = MM_dragLayer; if (NS) document.captureEvents(Event.MOUSEMOVE); curLeft = (NS)?curDrag.left:curDrag.style.pixelLeft; curTop = (NS)?curDrag.top:curDrag.style.pixelTop; MM_oldX = mouseX – curLeft; MM_oldY = mouseY – curTop; document.MM_curDrag = curDrag; curDrag.MM_SNAPPED=false; if(curDrag.MM_toFront) { eval('curDrag.'+((NS)?'':'style.')+'zIndex=document.MM_maxZ+1'); if (!curDrag.MM_dropBack) document.MM_maxZ++; } retVal = false; if(!NS) event.returnValue = false; } } else if (theEvent == 'mousemove') { if (document.MM_curDrag) with (document.MM_curDrag) { var mouseX = (NS)?objName.pageX : event.clientX + document.body.scrollLeft; var mouseY = (NS)?objName.pageY : event.clientY + document.body.scrollTop; newLeft = mouseX-MM_oldX; newTop = mouseY-MM_oldY; if (MM_bL!=null) newLeft = Math.max(newLeft,MM_bL); if (MM_bR!=null) newLeft = Math.min(newLeft,MM_bR); if (MM_bT!=null) newTop = Math.max(newTop ,MM_bT); if (MM_bB!=null) newTop = Math.min(newTop ,MM_bB); MM_LEFTRIGHT = newLeft-MM_startL; MM_UPDOWN = newTop-MM_startT; if (NS) {left = newLeft; top = newTop;} else {style.pixelLeft = newLeft; style.pixelTop = newTop;} if (MM_dragJS) eval(MM_dragJS); retVal = false; if(!NS) event.returnValue = false; } } else if (theEvent == 'mouseup') { document.onmousemove = null; if (NS) document.releaseEvents(Event.MOUSEMOVE); if (NS) document.captureEvents(Event.MOUSEDOWN); //for mac NS if (document.MM_curDrag) with (document.MM_curDrag) { if (typeof MM_targL =='number' && typeof MM_targT == 'number' && (Math.pow(MM_targL-((NS)?left:style.pixelLeft),2)+ Math.pow(MM_targT-((NS)?top:style.pixelTop),2))<=MM_tol) { if (NS) {left = MM_targL; top = MM_targT;} else {style.pixelLeft = MM_targL; style.pixelTop = MM_targT;} MM_SNAPPED = true; MM_LEFTRIGHT = MM_startL-MM_targL; MM_UPDOWN = MM_startT-MM_targT; } if (MM_everyTime || MM_SNAPPED) eval(MM_dropJS); if(MM_dropBack) {if (NS) zIndex = MM_oldZ; else style.zIndex = MM_oldZ;} retVal = false; if(!NS) event.returnValue = false; } document.MM_curDrag = null; } if (NS) document.routeEvent(objName); } return retVal; }
Wenn Sie bis jetzt alle Übungen erfolgreich mitgemacht haben, sind Sie mit allem ausgerüstet, um Ihre Webanwendungen um dynamische Objekte zu erweitern. Nun ist es an der Zeit, Sie mit der letzten Möglichkeit von UltraDev bekannt zu machen, Objekten ein bestimmtes Verhalten zuzuweisen, einem Werkzeug, das ebenso mächtig wie leicht zu bedienen ist.
171
Websites in Bewegung – clientseitige Verhaltensweisen
4.3
Mit Zeitleisten arbeiten
Wenn Sie schon mit Flash oder QuickTime gearbeitet haben, ist die Zeitleiste für Sie nicht Neues mehr. Zeitleisten dienen nicht so sehr dazu, um auf Aktionen, die der Anwender auf der Webseite ausführt, zu reagieren, sondern um die Ausführung bestimmter Aktionen abhängig vom Zeitpunkt zu steuern. Mit UltraDev können Sie Zeitleistenverhalten definieren, die ausgeführt werden, wenn die Seite geladen wird oder andere auslösende Ereignisse auftreten, ganz nach Belieben und Erfordernis. Die einzige Warnung, die ich in diesem Zusammenhang aussprechen möchte, ist die, dass auch hier eine übermäßige Verwendung dieses Effekts den Anwender eher irritiert als ihm nützt.
Der Zeitleisteninspektor Haupteinsatzgebiet des Zeitleisteninspektors ist die Animation von Ebenen. Hier kann er seine Stärken auch am besten ausspielen. Sie können damit zwar auch Grafiken animieren, doch haben Sie in diesem Fall nicht dieselben Möglichkeiten der Steuerung wie bei der Verwendung von Ebenen. Daher würde ich Ihnen empfehlen, grundsätzlich immer mit Ebenen zu arbeiten und die zu animierenden Grafiken in Ebenen einzusetzen. Für meine erste Demonstration des Zeitleisteninspektors möchte ich einen Ball über den Bildschirm zu seiner Endposition neben dem Logo meiner Website hüpfen lassen. Meine Startseite beinhaltet lediglich die Ebene mit der Grafik und dem Text, der auf der Seite erscheinen soll. Abb. 4.15 zeigt die Ausgangsposition der Elemente. Legen Sie ein ähnliches Dokument mit einer Ebene an, in die Sie eine beliebige Grafik einfügen. Wenn Sie alle nötigen Bestandteile für eine Animation zusammen haben, öffnen Sie über das Menü FENSTER > ZEITLEISTEN den Zeitleisteninspektor. Die leere StandardZeitleiste sehen Sie in Abb. 4.16. Bevor wir irgendetwas in die Zeitleiste einsetzen, sollten wir uns mit ihrer grundsätzlichen Funktionsweise bekannt machen. Da ist die zunächst die horizontale Reihe von Zahlen im Fenster. Diese Zahlen stehen für die Frames oder Schlüsselbilder, d.h. die einzelnen Phasen der Animation, die Sie erstellen. Sie können jedes Schlüsselbild in der Zeitleiste durch Klick auf die zugehörige Zahl anspringen. Eine roter Zeiger, der so genannte Wiedergabekopf, zeigt an, an welcher Stelle der Zeitleiste Sie sich befinden. Die vertikal angeordneten Zahlen links in der Palette stehen für die einzelnen Spuren der Zeitleiste. Diese Spuren oder Animationskanäle können Objekte aufnehmen, die simultan per Zeitleiste animiert werden. Über dem Wiedergabekopf liegt ein separater Kanal, der mit einem V bezeichnet ist. Hierbei handelt es sich um den Verhaltenskanal. Wenn Sie ein Schlüsselbild im Verhaltenskanal markieren, können Sie die Verhaltenspalette öffnen und diesem Schlüsselbild eine Aktion zuweisen. Über die Zeitleiste können Sie all jene Aktionen steuern, die sonst durch Maus-Rollover, Klicken oder andere Ereignisse ausgelöst werden.
172
Mit Zeitleisten arbeiten
Abbildung 4.15: Problemlose Animation von Ebenen mit der Zeitleiste
Im Kopf der Zeitleiste finden sich verschiedene Kontroll- und Navigationselemente. Da Sie pro HTML-Dokument mehrere Zeitleisten in Abhängigkeit von bestimmten Verhaltensweisen erzeugen können, empfiehlt es sich, jeder Zeitleiste einen eindeutigen Namen zu geben, um sie später nicht durcheinander zu bringen. Durch Klick auf den kleinen Pfeil öffnet sich ein Popup-Menü, aus dem Sie schnell die gewünschte Zeitleiste auswählen können.
Abbildung 4.16: Mit der Zeitleiste Aktionen zeitgesteuert auslösen
Die Buttons rechts davon funktionieren ähnlich wie die Steuerung eines Videorecorders. Der Rückspulknopf bewegt den Wiedergabekopf zum ersten Bild in der Zeitleiste zurück. Mit den Links- und Rechts-Pfeilen können Sie jeweils ein Bild zurück- bzw. vorspringen. Um schnell zu einem bestimmten Schlüsselbild zu springen, geben Sie einfach seine Nummer in das Feld zwischen diesen Pfeilen ein und das gewünschte Bild wird sofort angefahren. Wenn Sie auf den Wiedergabekopf klicken und ihn mit gedrückter Maustaste verschieben, können Sie Ihre Animation in Echtzeit betrachten und ihre Wirkungsweise beurteilen.
173
Websites in Bewegung – clientseitige Verhaltensweisen
Damit eine Animation flüssig abgespielt wird, müssen Sie im Eingabefeld BPS (Bilder pro Sekunde) die Framerate anpassen. Eine Framerate von 15 bedeutet, dass 15 Schlüsselbilder pro Sekunde abgespielt werden. Sollten mit diesem Defaultwert Ihre Animation allzu holprig geraten, erhöhen Sie die Framerate auf 30 Bps. Die Zeitleiste wird dadurch feiner unterteilt, sodass Sie die jeweilige Position des Objekts genauer festlegen können, was in einem runderen Bewegungsablauf resultiert. Als Letztes können Sie noch die Kontrollfelder AUTO-WDG und SCHLEIFE aktivieren. Mit AUTO-WDG fügen Sie dem -Tag ein onLoad-Ereignis hinzu, das bewirkt, dass die Animation abgespielt wird, sobald die Seite vollständig geladen ist. Die Option SCHLEIFE bewirkt, dass eine Animation immer wieder von vorne abgespielt wird, sobald sie am letzten Bild angekommen ist – hierzu wird im Verhaltenskanal eine entsprechende Anweisung (Gehe zu ZEITLEISTENBILD) in das letzte Schlüsselbild der Animation eingesetzt. Soll eine geloopte Animation sauber ablaufen, sollte das Objekt im letzten Schlüsselbild wieder auf der gleichen Position stehen wie im ersten Schlüsselbild. Andernfalls hat der Betrachter den Eindruck, dass das Objekt planlos auf dem Monitor herumhüpft.
Schlüsselbilder für eine Animation definieren Einfache Animationen lassen sich mit einigen wenigen Mausklicks erzeugen. Sie markieren ein bestimmtes Schlüsselbild in der Zeitleiste und platzieren die Ebene an der gewünschten Position. Alle nötigen Zwischenbilder berechnet UltraDev mit Fleiß und JavaScript. Ein praktisches Beispiel: Sie möchten eine Ebene animieren. Markieren Sie zuerst die entsprechende Ebene und klicken Sie dann auf den Pfeil rechts im Zeitleisteninspektor. Wählen Sie aus dem Popup-Menü den Befehl OBJEKT HINZUFÜGEN (Alternativ: Menü MODIFIZIEREN > ZEITLEISTE > OBJEKT IN ZEITLEISTE EINFÜGEN oder Kontextmenü IN ZEITLEISTE EINFÜGEN). In Kanal 1 sollte nun Ihre Ebene angezeigt werden. Wenn Sie möchten, können Sie die Ebene auch in andere Kanäle verschieben. Standardmäßig werden zwei Schlüsselbilder erzeugt: das Start- und das End-Schlüsselbild. Schlüsselbilder werden im jeweiligen Kanal durch einen weißen Ring erkennbar gemacht.
Schlüsselbilder hinzufügen und entfernen Für unsere erste Animation setzen Sie das End-Schlüsselbild bitte auf Frame 60. So haben wir genügend Ellbogenfreiheit bei unserer Arbeit. Markieren Sie nun in dem Kanal, in dem die zu bearbeitende Ebene liegt, Frame 15, und wählen Sie im Popup-Menü der Palette den Befehl KEYFRAME HINZUFÜGEN. (Die Begriffe »Keyframe« und »Schlüsselbild« werden von UltraDev in derselben Bedeutung nebeneinander verwendet. In der Hilfefunktion ist meist von Schlüsselbildern die Rede, in den Menüs von Keyframes.) Fügen
174
Mit Zeitleisten arbeiten
Sie auch bei Bild 30 und 45 Keyframes ein. Haben Sie versehentlich zu viele Keyframes gesetzt, können Sie sie mit dem Befehl KEYFRAME ENTFERNEN aus dem Palettenmenü entfernen. Nun können Sie anhand dieser Keyframes die Position der Ebene auf der Seite definieren. Ich möchte mein Logo um den Text auf meiner Seite kreisen lassen. Wenn Sie die Keyframes für Ihre Animation setzen, wird in der Dokumentansicht ein Pfad gezeichnet, der den Bewegungsablauf der Ebene symbolisiert. Abb. 4.17 zeigt den Pfad und die Zeitleiste, nachdem ich meine Animation fertig erstellt habe. Vergessen Sie nicht, die Option AUTO-WDG zu aktivieren, damit Ihre Animation abgespielt wird, wenn die Seite in den Browser geladen wird.
Abbildung 4.17: Zeitleiste und Bewegungspfad einer einfachen Animation
Komplexe Bewegungspfade mühelos erstellen Das war doch gar nicht so tragisch, oder? Aber es gibt noch eine einfachere Methode, um ein Objekt zu animieren. Mit ruhiger Hand und einer klaren Vorstellung vom Ablauf der Animation können Sie ein Objekt einfach den gewünschten Bewegungspfad entlang ziehen, während UltraDev die erforderlichen Schlüsselbilder automatisch erzeugt. Für diese Art der Animationserstellung brauchen wir ein leeres Arbeitsfenster. Entweder öffnen Sie ein neues Dokument mit einer Ebene oder Sie löschen den soeben erstellten Bewegungspfad in der Zeitleiste. Um eine Animation zu löschen, markieren den betreffenden Kanal per Mausklick und löschen die Animationsleiste über den Befehl ZEITLEISTE ENTFERNEN im Palettenmenü.
175
Websites in Bewegung – clientseitige Verhaltensweisen
Bewegungspfad aufzeichnen Markieren Sie in der Entwurfsansicht die Ebene, deren Bewegungspfad Sie aufzeichnen wollen, und aktivieren Sie den Befehl PFAD DER EBENE AUFZEICHNEN im Palettenmenü des Zeitleisteninspektors. Wechseln Sie wieder in die Entwurfsansicht und ziehen Sie die Ebene mit ruhiger Hand den Bewegungspfad entlang, dem die spätere Animation folgen soll.
Abbildung 4.18: Komplexe Animationen lassen sich durch Aufzeichnung des Bewegungspfades leicht erstellen.
Während Sie die Ebene verschieben, werden auf dem Monitor graue Punkte angezeigt, die die Richtung bzw. den Richtungswechsel Ihrer Ziehbewegung aufzeichnen. Wenn Sie die Ebene ablegen, wird der Pfad gefüllt und geglättet. Es ist aber mehr als schwierig, per Maus die ideale Bewegungskurve zu zeichnen, sodass UltraDev vermutlich weit mehr Schlüsselbilder in die Zeitleiste eingefügt hat, als tatsächlich nötig sind. Handarbeit ist also angesagt, um den Bewegungspfad nachträglich zu optimieren. Markieren Sie überflüssige Schlüsselbilder in der Zeitleiste und löschen Sie sie. Außerdem können Sie einzelne Schlüsselbilder anfahren und die Position der Ebene nachträglich noch feintunen. Ich habe die Hüpfbewegung eines Balls erzeugt, indem ich die Abbildung mehrfach vom unteren zum oberen Rand der Arbeitsfläche verschoben und die Eckpunkte etwas abgerundet habe. In Abb. 4.18 sehen Sie den aufgezeichneten Bewegungspfad und die zugehörige Zeitleiste.
176
Flash-Elemente mit UltraDev
Weitere Funktionen der Zeitleiste Die Mehrzahl der im Popup-Menü der Zeitleiste enthaltenen Befehle erklären sich von selbst. Es folgt eine Übersicht der Funktionen, die wir bis jetzt noch nicht besprochen haben: 쐽
FRAME HINZUFÜGEN – Nicht zu verwechseln mit der Funktion KEYFRAME HINZUFÜGEN. Fügt der Zeitleiste einen einfachen Frame hinzu. Wenn Sie eine Animation verlängern möchten, aber nicht alle Schlüsselbilder von Hand verschieben wollen, fügen Sie so viele Frames hinzu, bis die Animation die gewünschte Dauer hat.
쐽
FRAME ENTFERNEN – Löscht den markierten Frame.
쐽
OBJEKT ÄNDERN – Weist einem erstellten Bewegungspfad ein anderes Objekt zu, ohne den Bewegungspfad selbst zu verändern. Es öffnet sich das Dialogfenster OBJEKT ÄNDERN, in dem Sie aus einem Dropdown-Menü das neue Objekt auswählen.
쐽
OBJEKT HINZUFÜGEN/ENTFERNEN – Über diese beiden Funktionen setzen Sie ein Objekt in die Zeitleiste ein bzw. löschen es daraus.
쐽
VERHALTEN HINZUFÜGEN/ENTFERNEN – Eines der stärksten Features der Zeitleiste. Ermöglicht z.B. das Öffnen von Popup-Fenstern oder weiteren Zeitleisten. Mit dieser Funktion können Sie über die Zeitleiste jede Aktion steuern, für die sich eine Verhaltensweise schreiben lässt.
쐽
ZEITLEISTE HINZUFÜGEN/ENTFERNEN/UMBENENNEN – Diese Befehle tun genau das, was ihr Name sagt. Diese Funktionen brauchen Sie nur, wenn Sie mit mehreren Zeitleisten arbeiten.
Die Funktionalität von Zeitleisten bekommen Sie am besten in Griff, wenn Sie ausgiebig damit herumexperimentieren. Die Zeitleiste ermöglicht die Realisierung von Effekten, die vorher nur unter Verwendung von Flash oder anderen Plug-Ins möglich waren. Der Kreativität sind kaum Grenzen gesetzt: Lassen Sie beispielsweise gesteuert von Verhaltensweisen Sounddateien abspielen, während eine Animation abläuft – und zu all dem genügt ein einziges HTML-Dokument!
4.4
Flash-Elemente mit UltraDev
Mit UltraDev 4.0 lassen sich spezielle dynamische Objekte so einfach erzeugen wie HTML-Elemente. Flash ist ein sehr viel verwendetes Animationsprogramm, mit dem sich ressourcenschonende, schnell ladende Vektoranimationen erstellen lassen. Im Gegensatz zu den herkömmlichen animierten GIFs oder eingebetteten Videos benötigen FlashMovies nur sehr wenig Speicherplatz und ermöglichen beeindruckende Effekte.
177
Websites in Bewegung – clientseitige Verhaltensweisen
Macromedia hat die Objektpalette von UltraDev um zwei Funktionen erweitert, die einfache Flash-Elemente automatisch erzeugen. Sie müssen dazu weder das Programm selbst haben noch wissen, wie man damit arbeitet. 쐽
FLASH-SCHALTFLÄCHE EINFÜGEN – Flash-Buttons funktionieren wie mit einer Grafik erstellte Rollover-Buttons. Sie können jedoch die Größe flexibel anpassen und jeden auf Ihrem Rechner installierten Font verwenden, zur Markierung des Rollover-Status können auch Farbverläufe eingesetzt werden.
쐽
FLASH-TEXT EINFÜGEN – Die Möglichkeiten von Flash-Text beginnen dort, wo HTML-formatierter Text seine Grenzen findet. Sie sind nicht mehr auf ein paar Schriften bzw. Schriftgrößen eingeschränkt, sondern können jeden auf Ihrem Rechner installierten Font in beliebiger Größe verwenden. Der eingegebene Text lässt sich außerdem mit anderen Dokumenten verlinken.
Lassen Sie uns diese Features nun einmal ausprobieren. Sie werden staunen, wie leicht es ist, Ihre Site mit Flash-Elementen anzureichern.
Flash-Schaltflächen Um Flash-Schaltflächen auf Ihre Seite zu bringen, klicken Sie entweder auf das Icon FLASH-SCHALTFLÄCHE EINFÜGEN in der Objektpalette oder wählen Sie EINFÜGEN > INTERAKTIVE BILDER > FLASH-SCHALTFLÄCHE. Es macht nichts, wenn die Einfügemarke nicht dort steht, wo die Schaltfläche später hin soll. Sie können das Element, nachdem es eingefügt wurde, jederzeit in vollem Umfang editieren.
Abbildung 4.19: Wählen Sie Form und Beschriftung der FlashSchaltfläche.
178
Flash-Elemente mit UltraDev
Wenn Sie den Befehl FLASH-SCHALTFLÄCHE EINFÜGEN aktiviert haben, öffnet sich die in Abb. 4.19 gezeigte Dialogbox. Hier konfigurieren Sie das Verhalten des Buttons. Das Feld BEISPIEL zeigt ein Muster des späteren Buttons. Die Ansicht des Musters verändert sich nicht, wenn Sie Ihre persönlichen Einstellungen anpassen. Wählen Sie zuerst aus der Scrollliste einen passenden Stil aus – das Angebot geht von kreativ bis sachlich. Wenn Sie einen Stil ausgesucht haben, geben Sie in das Feld SCHALTFLÄCHENTEXT den Text ein, mit dem die Schaltfläche beschriftet werden soll, und weisen Sie ihm über das Dropdown-Menü SCHRIFT einen Schriftschnitt zu. Im Feld GRÖSSE geben Sie die gewünschte Größe ein. Im Feld HYPERLINK setzen Sie den Pfad auf die Datei, die geöffnet werden soll, oder wählen mit Klick auf DURCHSUCHEN die gewünschte Datei Ihrer Site. Über das DropdownMenü ZIEL stellen Sie ein, in welchem Fenster der Link geöffnet werden soll. Als letzten Schritt bestimmen Sie die Hintergrundfarbe des Buttons sowie den Namen, unter dem er abgespeichert werden soll. Die endgültige Flash-Datei kann mehr Platz beanspruchen als der eigentliche Button. Stellen Sie daher unter HG-FARBE für den umgebenden Hintergrund des Buttons eine passende Farbe ein. Wenn Sie mit Ihrem Werk zufrieden sind, brauchen Sie ihm nur noch einen Namen zu geben, doch wenn Sie möchten, weist UltraDev der Datei automatisch einen Namen zu. Klicken Sie nun noch auf ANWENDEN, um dem Button die getroffenen Einstellungen zuzuweisen. Ist die Flash-Schaltfläche ins Dokument eingefügt, können Sie sie auswählen und mithilfe der Anfasser auf jede beliebige Größe skalieren. Da Flash-Schaltflächen vektorbasiert sind, leidet die Auflösung darunter nicht und sie werden immer gleich scharf dargestellt. Durch Doppelklick auf den Button öffnet sich wieder das Dialogfenster FLASH-SCHALTFLÄCHE EINFÜGEN, sodass Sie ihn jederzeit editieren können.
Flash-Text Flash-Text funktioniert nach demselben Prinzip wie Flash-Schaltflächen und erlaubt das einfache Einsetzen von hochauflösendem Vektortext in ein Dokument. Klicken Sie hierzu entweder auf das Icon FLASH-TEXT EINFÜGEN in der Objektpalette oder wählen Sie EINFÜGEN > INTERAKTIVE BILDER > FLASH-TEXT. Es öffnet sich die in Abb. 4.20 gezeigte Dialogbox, über die Sie Flash-Text editieren. Dieses Fenster bietet ähnliche Einstellungsmöglichkeiten, wie wir sie schon bei den FlashSchaltflächen kennen gelernt haben. Sie können Font, Schriftgröße und Schriftschnitt sowie die Textausrichtung wählen. Wenn Sie im Text einen Link setzen wollen, können Sie außerdem eine Rollover-Farbe bestimmen.
179
Websites in Bewegung – clientseitige Verhaltensweisen
Abbildung 4.20: Die Funktion Flash-Text einfügen erzeugt hochauflösenden Vektortext.
Geben Sie im Feld TEXT den Text ein, der im Flash-Format abgespeichert werden soll. Ist das Kontrollfeld SCHRIFT ZEIGEN aktiviert, zeigt die Vorschau den Text in der gewünschten Schrift an. Wollen Sie einen Link setzen, geben Sie in den entsprechenden Feldern den Pfad und, falls nötig, das Ziel ein. Schließlich können Sie wie bei den Flash-Schaltflächen noch eine Hintergrundfarbe bestimmen und einen Dateinamen vergeben. Letzteres können Sie auch wieder vom Programm erledigen lassen. Im Gegensatz zu HTML-formatiertem Text können Sie Flash-Text in der Dokumentansicht beliebig proportional oder ungleichmäßig skalieren. Wollen Sie Flash-Text editieren, öffnen Sie per Doppelklick auf den Text das zugehörige Dialogfenster und verändern die gewünschten Einstellungen. Abb. 4.21 zeigt ein Dokument mit eingefügtem Flash-Text und Flash-Schaltfläche. Bevor Sie jedoch der Versuchung erliegen, nur noch mit den vektorbasierten Werkzeugen von UltraDev zu arbeiten, sollten Sie sich erst über Ihre Zielgruppe Gedanken machen. Nicht in allen Browsern ist das Flash-Plug-In installiert, und wenn Sie die Navigation Ihrer Seiten ausschließlich auf Flash-Text oder -Schaltflächen aufbauen, laufen Sie Gefahr, zumindest einen Teil Ihrer Adressaten auszusperren.
180
Weitere dynamische Elemente
Abbildung 4.21: Flash-Text und Flash-Schaltflächen erlauben die Verwendung hochauflösender Vektorelemente direkt in der HTML-Entwicklungsumgebung.
4.5
Weitere dynamische Elemente
Mit den bisher vorgestellten Lösungen sind die Möglichkeiten von UltraDev, dynamische Elemente auf die Website zu bringen, noch nicht erschöpft. In diese Kategorie fallen z.B. ausgewachsene Flash-Animationen oder Java-Applets. Mit Java können Sie komplette interaktive Programme in Ihre Website einbinden. Es gibt so gut wie nichts, das mit diesem Animationswerkzeug bzw. mit dieser Programmiersprache nicht möglich wäre. Im Unterschied zu den weiter oben vorgestellten Techniken brauchen Sie hier jedoch spezielle Plug-Ins, um die erstellten Anwendungen abspielen zu können, und die Anwendungen selbst müssen Sie außerhalb von UltraDev erstellen. Bestimmte Elemente lassen sich in der Dokumentansicht direkt abspielen, wenn Sie den Button ABSPIELEN im Eigenschafteninspektor anklicken. Wenn Sie eines dieser Elemente auf einer Webseite verwenden wollen, tun Sie das über EINFÜGEN > MEDIEN, wobei Sie im Untermenü MEDIEN dann den entsprechenden Typ auswählen, im Falle eines Flash-Movies also FLASH. Der eingefügte Medientyp wird als graues Rechteck mit dem entsprechenden Symbol dargestellt, wie in Abb. 4.22 gezeigt. Das dynamische Element selbst wird also nicht angezeigt, Sie können seine Attribute aber mit dem Eigenschafteninspektor bearbeiten und um den Platzhalter herum wie gewohnt Ihre sonstigen Elemente platzieren. Wenn ich auf meinen Websites spezielle dynamische Elemente brauche, verwende ich nach Möglichkeit lieber Java-Applets als irgendwelche proprietären Lösungen, die ohne eigenes Plug-In nicht laufen. Beim Einsatz von Java sollte man aber auf eine gewisse Verhältnismäßigkeit der Mittel achten, denn nur für ein paar animierte grafische Effekte Java zu bemühen, ist, als wollte man Reisnägel mit dem Dampfhammer einschlagen. Nichtsdestotrotz, falls Sie Ihre Website mit ein paar Java-Applets aufpeppen möchten, finden Sie unter http://www.gamelan.com komplette Bibliotheken zum herunterladen.
181
Websites in Bewegung – clientseitige Verhaltensweisen
Abbildung 4.22: Nicht alle dynamischen Elemente sind so pflegeleicht wie DHTMLEffekte.
4.6
JavaScript für Fortgeschrittene
UltraDev bietet JavaScript-Programmierern einige nützliche Features, um JavaScript-Code in HTML-Dokumenten zu editieren und auf Fehler zu überprüfen. Wenn Sie Programmierer sind, werden Ihnen diese Funktionen von anderen Entwicklungsumgebungen bzw. Debuggern her vertraut sein. Öffnen Sie ein neues Dokument, setzen ein paar Verhaltensweisen und schalten Sie in die Codeansicht um. In der Werkzeugleiste sehen Sie eine Schaltfläche mit geschwungenen Klammern: {}. Dieses Menü listet alle verwendeten JavaScripts auf. Die ausgewählte Funktion wird direkt gezielt angesteuert. Zur gezielten Einkreisung von Fehler können Sie außerdem im Code Haltepunkte setzen. Wenn Sie an der Stelle, an der die Einfügemarke steht, einen Haltepunkt setzen wollen, wählen Sie im Menü den Befehl HALTEPUNKT SETZEN. Am Kopf dieser Zeile wird dann ein roter Punkt angezeigt. An dieser Stelle wird die Ausführung des Programms gestoppt, sodass Sie die aktuellen Werte aller Variablen überprüfen und eventuelle Fehler einkreisen können. Um Haltepunkte zu löschen, wählen Sie im entsprechenden Pulldown-Menü den Befehl ALLE HALTEPUNKTE ENTFERNEN. Wenn Sie die nötigen Haltepunkte im JavaScript-Code gesetzt haben, wählen Sie den Befehl DATEI > DEBUG IN BROWSER. (Sie erreichen die Funktion auch über das GlobusIcon der Werkzeugleiste.) Daraufhin öffnet sich der gewählte Browser und arbeitet das Script ab, während gleichzeitig das in Abb. 4.23 gezeigte Fenster JAVASCRIPT-DEBUGGER angezeigt wird.
182
JavaScript für Fortgeschrittene
Abbildung 4.23: JavaScript-Code auf Fehler überprüfen mit dem Debugger
Im Kopf dieses Fensters sehen Sie mehrere Icons, über die Sie den Prüfdurchlauf durch das Script steuern. Wie bereits erwähnt, stoppt der Prüfdurchlauf, wenn das Programm bei einem Haltepunkt ankommt. Diese Schaltflächen erlauben jedoch noch weiter gehende Kontrollen. Es folgt (von links nach rechts) eine Übersicht über die Schaltflächen und ihre Funktionen: 쐽
AUSFÜHREN – Startet das Script. Arbeitet das Programm von der ersten Zeile an ab.
쐽
DEBUG-VORGANG BEENDEN – Beendet den Debugging-Durchlauf und schließt den Debugger.
쐽
HALTEPUNKT SETZEN/ENTFERNEN – Je nachdem, ob ein Haltepunkt gesetzt ist oder nicht, wird er gelöscht bzw. hinzugefügt.
쐽
ALLE HALTEPUNKTE ENTFERNEN – Löscht alle gesetzten Haltepunkte.
쐽
PROZEDURSCHRITT – Überspringt eine Zeile oder eine Funktion, sodass sie nicht ausgeführt wird.
쐽
EINZELSCHRITT – Springt eine Funktion an und arbeitet sie ab.
쐽
PROZEDUR ABSCHLIESSEN – Unterbricht die Abarbeitung einer Funktion (Gegenstück zu EINZELSCHRITT).
183
Websites in Bewegung – clientseitige Verhaltensweisen
Sie können ferner das Verhalten von Variablen in Funktionen überwachen, indem Sie sie in das untere Feld des Debugging-Fensters eintragen. Klicken Sie auf das Plussymbol (+), und geben Sie den Namen der Variablen ein. Wenn das Programm abgearbeitet wird, wird der jeweils aktuelle Wert der Variablen in dem Feld neben ihrem Namen angezeigt. Der JavaScript-Debugger ist für Programmierer eine fantastische Erweiterung der Entwicklungsumgebung von UltraDev. Was Cross-Browser-Kompatibilität und die Beachtung der zahlreichen Fallstricke angeht, ist und bleibt JavaScript eine der verzwicktesten Programmiersprachen.
4.7
Zusammenfassung
Es gibt kaum eine Website, die heute ohne dynamische Elemente arbeitet. Wenn sich auf Ihrer Site nicht irgendwas bewegt, haben Sie die Zeichen der Zeit noch nicht erkannt. Nun, ganz so schlimm ist es noch nicht, aber die Dinge bewegen sich in diese Richtung. Darum wird es zusehends wichtiger, dass man über das entsprechende Know-how verfügt, um DHTML-basierte Websites erstellen zu können. Heute haben Sie gelernt, wie Sie mit UltraDev Ihren Seiten automatisch dynamische Verhaltensweisen zuweisen können, die ohne die programminternen Funktionen ein erhebliches Maß an JavaScript-Programmierung erfordern würden. Mit ein paar Mausklicks erstellen Sie innerhalb Ihrer gewohnten HTML-Umgebung komplexe Animationen und verschiebbare Elemente – ohne andere Animations- oder DesignTools zu benötigen. Wer Flash-Elemente auf seine Seiten bringen will, kann mit der Objektpalette ganz einfach Flash-Buttons bzw. Flash-Text erstellen. Im Gegensatz zu HTML-Text oder den Pixelgrafiken im jpg- bzw. gif-Format sind Flash-Elemente vektorbasiert und lassen sich bei gleich bleibender Qualität auf jede beliebige Größe skalieren.
4.8 F
Werden der Netscape Navigator und der Internet Explorer bei der Implementierung von JavaScript jemals das gleiche DOM verwenden? A
184
Fragen und Antworten
Darauf würde ich mich nicht verlassen. Das Document Object Model des Netscape Navigator unterscheidet sich erheblich von demjenigen des Internet Explorer. Wenn Sie Anwendungen gezielt für den Internet Explorer 5.0 oder höher ver-
Workshop
wenden, haben Sie Zugriff auf eine Menge von Verhaltensweisen, die mit dem Netscape Navigator nicht funktionieren. Ich möchte Ihnen auf alle Fälle raten, so kompatibel wie möglich zu bleiben. F
Ich möchte eine bestimmte Verhaltensweise verwenden, die standardmäßig nicht vorhanden ist. Wie kann ich sie hinzufügen? A
F
Kann ich DHTML-Effekte aus einer Anwendung kopieren und in UltraDev einsetzen und bearbeiten? A
F
Sie könnten sich auf der Website von Macromedia umsehen und weitere Verhaltensweisen herunterladen. Wie man Sie einbindet, lernen wir in Tag 5, »Wieder verwertbare Elemente und Erweiterungsmodule«. Wenn Sie programmieren können, sollten Sie sich auch einmal in der Hilfefunktion das Kapitel »Dreamweaver erweitern« ansehen.
Nein, das geht nicht. Sie könnten zwar JavaScript-Code in UltraDev einsetzen, doch können Sie ihn nicht mit der Zeitleiste oder anderen Werkzeugen bearbeiten.
Verwende ich besser DHTML oder ein Plug-In? A
4.9
Das liegt ganz bei Ihnen. Ist die Wahrscheinlichkeit größer, dass Ihre Zielgruppe das erforderliche Plug-In installiert hat oder dass sie einen 4.0-Browser oder höher installiert hat? Bevor Sie eine Anwendung entwickeln, sollten Sie versuchen, diesbezügliche Informationen zu bekommen.
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie im Anhang A, »Quiz-Antworten«.
Quiz 1. Was versteht man unter Verhaltensweisen? 2. UltraDev zeigt manche Ereignisse in Klammern an. Was ist der Unterschied zu anderen Ereignissen? 3. Wenn Sie die Ziehbewegung einer Ebene auf links und rechts einschränken wollen, welche Werte müssen Sie dann in die entsprechenden Felder eingeben?
185
Websites in Bewegung – clientseitige Verhaltensweisen
4. Was müssen Sie tun, damit Ebenen sofort verschiebbar sind, wenn die Seite geladen wird? 5. Sie haben eine Animation mit der Zeitleiste erstellt. Was können Sie tun, damit sie flüssiger abläuft? 6. Mit welchem Werkzeug können Sie beliebig skalierbaren Vektortext erstellen?
Übungen 1. Erzeugen Sie eine Verhaltensweise, die mit einem Rollover zwei Grafiken auf einmal austauscht. Mit der vordefinierten Rollover-Funktion kann nur das Bild ausgetauscht werden, das mit der Maus überfahren wird. 2. Erstellen Sie Ihre eigene DHTML-Animation eines hüpfenden Balls. Erweitern Sie die Animation um ein Aufprallgeräusch, das jedes Mal wiedergegeben wird, wenn die entsprechenden Frames abgespielt werden. 3. Forschen Sie ein bisschen herum, welche anderen Animationstechniken Sie durch die Verwendung von Plug-Ins möglich werden. Ein paar gute Beispiele finden Sie unter folgenden Adressen: Gamelan Java Collection, http://www.gamelan.com, und Joe Cartoon's Flash-Animationen, http://www.joecartoon.com. Auch die Website von Macromedia, http://www.macromedia.com, ist eine gute Anlaufstelle.
186
Wieder verwertbare Elemente und Erweiterungsmodule
5
Wieder verwertbare Elemente und Erweiterungsmodule
In den ersten vier Tagen haben Sie so ziemlich alles über den Umgang und die Verwendung der Werkzeugpaletten von UltraDev gelernt und wissen nun, wie Sie damit komplette Websites realisieren können. Auf der nächsten Stufe lernen Sie nun, wie Sie diese Werkzeuge so selten wie möglich benutzen. Damit meine ich natürlich nicht, dass Sie UltraDev jetzt wieder deinstallieren sollen – nein, es geht mir darum, Ihnen zu zeigen, wie Sie das Instrumentarium von UltraDev so effektiv wie möglich einsetzen. Macromedia hat das Programm mit einigen höchst nützlichen Funktionen ausgestattet, die die weit gehende »Wiederverwertung« einmal geschriebenen HTML-Codes ermöglichen. Sie können den Funktionsumfang des Programms durch Einbindung zusätzlicher Verhaltensweisen erweitern und sogar die Oberfläche von UltraDev selbst verändern, indem Sie z.B. neue Befehle in ein Menü integrieren oder die Menüstruktur verändern. Ein Blick auf die Themen des heutigen Tages: 쐽
Strategien für wieder verwertbaren Code. Lernen Sie, wie Sie Ihre Websites optimal strukturieren, um erstellten HTML-Code auch für andere Projekte verwenden zu können.
쐽
Wie Sie mit Stylesheets Ihren Produktionsalltag erleichtern und bessere Cross-Browser-Kompatibilität erreichen
쐽
HTML-Code mit den Bibliotheksfunktionen von UltraDev speichern und mehrfach nutzen
쐽
Sinnvolle Arbeitsteilung durch Verwendung von Vorlagen oder wie sich Designer, Autoren und Programmierer nicht mehr in die Quere kommen
쐽
Arbeitsschritte aufzeichnen und als Makro speichern
쐽
Erweiterung und Anpassung von UltraDev an die eigenen Arbeitsumgebung
5.1
HTML-Code wieder verwenden
Wenn Sie schon an größeren Websites gearbeitet haben, haben Sie vermutlich auch per Ausschneiden und Einfügen Elemente zwischen den einzelnen Seiten hin- und herkopiert, um eine einheitliche Gestaltungslinie einzuhalten. Es gibt viele Möglichkeiten, Websites möglichst ökonomisch und effektiv anzulegen, hierzu gehören sicher auch Frames oder Server-Side-Includes. Aber was ist, wenn sich der Einsatz dieser Techniken verbietet, weil der Webserver Server-Side-Includes nicht unterstützt oder Frames für eine spezielle Anwendung nicht sinnvoll sind? UltraDev verfügt über Funktionen, die den Erstellungsaufwand von Websites deutlich minimieren können und trotzdem zu allen Serverplattformen kompatibel sind. Welche Werkzeuge sind das nun, wie funktionieren sie, wie muss ich meine Site planen, um dieses
188
HTML-Code wieder verwenden
Instrumentarium sinnvoll einsetzen zu können? Mit ein bisschen Vorausplanung werden Sie in Zukunft Sites erstellen, die mit weit weniger Aufwand als bisher zu pflegen und aktualisieren sind – zu Ihrem eigenen Wohle und dem eventueller Nachbearbeiter.
Einheitliche Formatierung mit Stylesheets Werfen Sie einmal einen Blick in Ihren HTML-Code. Wenn Sie Text wie üblich mit HTML-Formaten auszeichnen, dann wimmelt es in der Code-Ansicht nur so von Tags und zugehörigen Attributen wie face, size usw. Verwendet man Text in Tabellen, dann wird das definieren von -Tags für jede einzelne Zelle schnell zur Strafarbeit, abgesehen davon wird auch die Datei schnell aufgebläht. Zudem ist die Einhaltung einheitlicher Textformatierungen über viele Seiten sehr aufwändig und fehleranfällig. Die Formatierung von Text und die Zuweisung von Stilattributen lässt sich zum größten Teil bequem über Cascading Style Sheets (CSS) erledigen. Stylesheets werden von Browsern der 4. Generation (und höher) verstanden und sind so etwas wie eine Formatvorlage. Z.B. könnten Sie über Stylesheets die Darstellung von Text innerhalb des -Tags neu definieren und dem Browser so mitteilen, dass er diesen Text in 10 Punkt Arial darstellen soll. Sie können auch ganz neue Stile definieren und diese den verschiedenen Objekten innerhalb Ihres HTML-Dokuments zuweisen, sei es von Hand oder über die entsprechenden Inspektoren von UltraDev. CSS können für das jeweilige Dokument erstellt werden, oder – was weit sinnvoller ist – in einer externen Datei gespeichert und mit den einzelnen HTML-Dateien innerhalb der Site verlinkt werden. Müssen Sie nun Änderungen an der Textformatierung durchführen, z.B. Times durch Arial ersetzen, müssen Sie nur noch eine Datei, das Stylesheet bearbeiten, und Ihre Änderungen werden sofort in allen Dateien durchgeführt. Darüber hinaus wird es mit Stylesheets möglich, Websites zu gestalten, die auf den unterschiedlichen Plattformen konsistent dargestellt werden. Gestalten Sie eine Website auf dem Mac und schauen Sie sich diese Website dann auf einem PC an – gut möglich, dass das Ergebnis nicht ganz Ihre Absichten widerspiegelt. Gestalten Sie dieselbe Site auf dem PC und öffnen Sie sie dann auf einem Mac – dasselbe in Grün. Abb. 5.1 zeigt, wie eine häufig besuchte Website auf dem Mac aussieht. Abb. 5.2 zeigt dieselbe Site auf einem PC. Beachten Sie die unterschiedliche Menge an Information, die bei gleicher Monitorgröße angezeigt wird. Das größte Problem bei der Entwicklung plattformübergreifender Websites ist die unterschiedliche Auflösung von 96 dpi auf Windowssystemen und von 72 dpi bei Macs. Das hat zur Folge, dass dieselbe Seite auf einem PC wesentlich größer dargestellt wird als auf einem Mac.
189
Wieder verwertbare Elemente und Erweiterungsmodule
Abbildung 5.1: Der Mac stellt Schriften mit 72 dpi dar.
Abbildung 5.2: Windows verwendet Fonts mit 96 dpi.
Über diese Unterschiede in der Auflösung muss ich mich immer wieder wundern. Nach wie vor hängen an den meisten Windows-Rechnern 15“- oder 17“-Monitore – etwas unterdimensioniert für eine Auflösung von 96 dpi. Bei gleicher Monitorgröße ist vom Inhalt einer Webseite auf einem Mac weit mehr zu sehen als auf PCs.
190
HTML-Code wieder verwenden
Durch die Verwendung von CSS lässt sich das Problem der unterschiedlichen Auflösungen umgehen, indem man Fonts nicht eine Größe in Punkt, sondern eine exakte Höhe in Pixel zuweist. Damit lässt sich auf allen Plattformen eine weitgehend identische Darstellung erreichen. Wenn Sie auf den Einsatz von CSS verzichten wollen, weil sie von der anvisierten Browserplattform nicht unterstützt werden, können Sie an ihrer Stelle HTML-Stile verwenden, um Text in Ihren Dokumenten einheitlich zu formatieren, doch arbeiten HTML- Stile mit den üblichen -Tags.
Wiederkehrende Elemente In allen Websites gibt es wiederkehrende Elemente, die über viele Seiten hinweg immer wieder auftauchen: Kopf- und Fußzeilen oder Menüs. Meistens werden diese Elemente auf jeder Seite frisch in HTML codiert. Bei kleineren Sites mag das noch praktikabel sein, doch wenn eine Website erst einmal mehrere Hundert Seiten zählt, wächst sich die Pflege und Aktualisierung solcher Elemente schnell zu einer Sisyphosarbeit aus. Zur Veranschaulichung ein Beispiel aus meiner eigenen Praxis. Ich betreue eine Website mit Veranstaltungshinweisen, die ständig aktualisiert werden. Auf dieser Site gibt es auch ein Archiv, in dem die Covergrafik des einmal jährlich erscheinenden Prospektes veröffentlicht wird. Jede Jahresgrafik bekommt eine eigene Seite und wird mit den Seiten verlinkt, die die vorhergehenden Jahresgrafiken enthalten. Wenn also eine neue Seite hinzukommt, müssen alle bereits vorhandenen mit der neuen Seite verlinkt werden. Angenommen, die Site enthält bereits 20 solcher Archivseiten, müsste ich 20 einzelne Seiten bearbeiten, nur um einen einzigen Link hinzuzufügen. Solche Aktionen lassen sich mit den Bibliotheksfunktionen von UltraDev erheblich rationalisieren. Bibliotheken sind Sammlungen von HTML-Elementen, die beliebig oft auf verschiedenen Seiten verwendet werden können. Wenn Sie ein Element der Bibliothek hinzugefügt haben, können Sie es in jede beliebige Seite einschließen, müssen es aber an einer Stelle bearbeiten. Wenn Sie den Einsatz serverseitiger Dienste wie der erwähnten Server-Side-Includes planen, um eine ähnliche Funktionalität wie durch die Verwendung von Bibliothekselementen zu erreichen, müssen Sie zuerst mit dem zuständigen Webmaster abklären, welche Features vom Server überhaupt unterstützt werden, bevor Sie sich an die Umsetzung machen. Wenn Sie keine Informationen über den künftigen Produktionsserver haben, sollten Sie ausschließlich das Bibliothekssystem von UltraDev einsetzen. Wenn Ihr Webserver Server-Side-Includes (SSI) versteht, sind sie das Mittel der Wahl, um mehrfach verwendbare Komponenten zu erzeugen. Durch SSI werden Dateien kleiner, da diese Komponenten in eigenen HTML-Dokumenten
191
Wieder verwertbare Elemente und Erweiterungsmodule
abgelegt werden und erst bei der Übertragung vom Server in das Dokument eingeschlossen werden. Bibliotheken gestatten dieselbe Flexibilität, nur wird der HTML-Code eines Bibliothekselements automatisch in den Code der jeweiligen Dokumente eingefügt. Dadurch werden die Dateien zwar größer, aber Sie sind nicht von der Serverplattform und deren Technologie abhängig. Wenn Sie Strukturplan und Navigationsschema Ihrer Website erstellen, überprüfen Sie, ob und welche Elemente auf den einzelnen Seiten wiederkehren und ob diese gegebenenfalls aktualisiert werden müssen. Solche Elemente empfehlen sich zur Aufnahme in das Bibliothekssystem.
Vorlagen Vorlagen sind nicht ganz das Gleiche wie Bibliotheken, sind aber ebenfalls eine Möglichkeit, erstellten HTML-Code wieder zu verwenden. Vorlagen sind, wie der Name schon sagt, Vorlagen oder Musterseiten für eine Website. Angenommen, Sie haben für eine Website ein Musterlayout für eine Produktseite entwickelt, die nun, mit verschiedenen Produkten gefüllt, immer wieder verwendet werden soll. Der gewitzte Webmaster wird nun nicht jedes Mal die ganze Seite komplett neu erstellen wollen, wenn ein neues Produkt dazukommt. Nehmen wir zum Beispiel eine Immobiliensite. Das Layout für die einzelnen Immobilien steht zwar, aber eigentlich wäre es Ihnen am liebsten, wenn nun die Makler die Daten ihrer neuen Objekte selbst einstellen würden. Darum erstellen Sie eine Vorlage, damit die einzelnen Mitarbeiter Inhalte ins Netz stellen können, ohne sich um den HTML-Code kümmern zu müssen. In Vorlagen lassen sich die wichtigen Teile der Seite wie z.B. Menüs gegen versehentliche oder mutwillige Veränderungen schützen, indem man sie für die Bearbeitung sperrt, während die Inhaltsbereiche frei editierbar bleiben. Mit Vorlagen lässt sich die mit der Aktualisierung und Pflege einer Website anfallende Belastung effizient auf mehrere Mitarbeiter verteilen. In Verbindung mit CSS erlauben Vorlagen das Maximum an Kontrolle über den Inhalt und seine Darstellung.
5.2
HTML-Stile
Wenn Sie Schriftstile erzeugen möchten, die auch mit nicht CSS-fähigen Browsern funktionieren, können Sie HTML-Stile mit den standardmäßigen Fontattributen verwenden. Die erzeugten Stile finden Sie unter TEXT > HTML-STILE. In diesem Menü finden Sie einige bereits vordefinierte Stile, die Sie sofort einsetzen können. Markieren Sie den Text, den Sie formatieren möchten, und weisen Sie ihm den gewünschten Stil aus dem Menü zu.
192
HTML-Stile
Um einen neuen Stil zu erzeugen, wählen Sie TEXT > HTML-STILE > NEUER STIL, woraufhin sich das in Abb. 5.3 gezeigte Dialogfenster öffnet.
Abbildung 5.3: HTML-Stile funktionieren in allen Browsern.
Bevor Sie den neuen Stil verwenden können, müssen Sie ein paar Attribute einstellen: 쐽
NAME – Der Name, den Sie Ihrem neuen Stil zuweisen. Wird in im Untermenü HTML-STILE angezeigt.
쐽
ANWENDEN AUF – Hier legen Sie fest, welcher Textbereich formatiert wird: ein ganzer Absatz oder nur der markierte Abschnitt.
쐽
BEIM ANWENDEN – Die Option ZU VORHANDENEM STIL HINZUFÜGEN verbindet den neuen Stil mit bereits bestehenden Stilattributen. Die Option VORHANDENEN STIL LÖSCHEN löscht alle eventuell bestehenden Formatierungen und wendet den Stil auf den Defaultstil an.
쐽
SCHRIFTATTRIBUTE – Hier wählen Sie Schriftart, Größe, Farbe und Schnitt der Schrift.
쐽
ABSATZATTRIBUTE – Wenn Sie einen Absatzstil definieren, wählen Sie hier das Format und die Ausrichtung.
Wenn Sie alle Einstellungen vorgenommen haben, schließen das Fenster mit Klick auf OK, und der Stil steht zur Verfügung.
193
Wieder verwertbare Elemente und Erweiterungsmodule
Es gibt noch einen anderen Weg, HTML-Stile zu erzeugen. Formatieren Sie zunächst den Text im Dokument wie gewünscht. Nun markieren Sie den formatierten Text und rufen die Option NEUER STIL auf. Die Attribute des formatierten Textes werden im Dialogfenster angezeigt, sodass Sie dem Stil nur noch einen Namen zuweisen und ihn dann abspeichern müssen. Auf HTML-Stile haben Sie außer über das Menü TEXT auch über die Palette HTMLSTILE Zugriff. Sie öffnen sie über FENSTER > HTML-STILE. Eine Abbildung dieser Palette sehen Sie in Abb. 5.4. Am Buchstaben- bzw. Absatzsymbol erkennen Sie, ob es sich um einen Auswahl- oder einen Absatzstil handelt.
Abbildung 5.4: Mit der Palette HTML-Stile lassen sich Stile schnell erzeugen, zuweisen, löschen und bearbeiten.
Sie können HTML-Stile einem Text auf zwei Arten zuweisen. Standardmäßig ist das Kontrollfeld ANWENDEN links unten in der Palette aktiviert. Wenn Sie in der Dokumentansicht Text markieren und dann einen Stil aus der Liste auswählen, indem Sie darauf klicken, wird er automatisch auf die Auswahl angewendet. Deaktivieren Sie das Kontrollfeld, wird der Button ANWENDEN aktiv. Um dann einer Auswahl einen Stil zuzuweisen, müssen Sie auf diesen Button klicken. Am rechten unteren Rand der Palette gibt es zwei weitere Schaltflächen, die manchmal recht nützlich sind. Durch Klicken auf das Papier-Icon können Sie einen neuen Stil erzeugen, klicken auf den Abfalleimer löscht den in der Liste markierten Stil. Durch Doppelklick auf einen Stil in der Liste können Sie ihn editieren, doch Vorsicht: Ist das Kontrollfeld ANWENDEN aktiviert, weisen Sie unter Umständen den Stil – statt ihn zu editieren – einem Textabschnitt zu. Um das zu verhindern, deaktivieren Sie das Kontrollfeld. HTML-Stile stehen nur innerhalb der Site, in der sie erstellt wurden, zur Verfügung. Möchten Sie Ihre selbst definierten HTML-Stile auch in anderen Sites verwenden, müssen Sie die Datei styles.xml aus dem Ordner Library in den gleichen Ordner der anderen Site kopieren. Die Stilformate werden im HTML-Dokument unabhängig von der Datei styles.xml angezeigt.
194
Cascading Style Sheets
5.3
Cascading Style Sheets
Cascading Style Sheets oder CSS sind eine prima Sache, die das Leben des Webdesigners um vieles leichter machen können. Im Gegensatz zu HTML-Stilen ermöglichen CSS eine weit bessere Kontrolle über die Elemente einer Seite und Sie können damit Attribute eines Objekts verändern, die über HTML nicht zugänglich sind. Stylesheets sind sehr komplex, und sie von Hand zu editieren ist nicht so spaßig. Es ist nicht so schwierig, ihre Syntax zu verstehen, wohl aber, sämtliche möglichen Attribute und Einstellungen im Kopf zu behalten. Nachstehend eines kleines Beispiel, das die Formatierung von -Tags und -Tags verändert: <style type="text/css">
Mit diesem Stylesheet wird der Font für -Tags auf »Arial, Helvetica, sans serif« gesetzt sowie eine Schriftgröße und -farbe definiert. Das -Tag bekommt ebenfalls dieselbe Fontgruppe zugewiesen, nur wurde eine andere Farbe und eine höhere Schriftgröße gewählt. Jedes HTML-Dokument, das mit diesem Stylesheet verlinkt wird bzw. in das dieses Stylesheet eingefügt wird, erbt diese Eigenschaften. Mit UltraDev wird die Erstellung von CSS bzw. die Neudefinition von Tags zum Kinderspiel – nur ein paar Einträge auswählen, klick, fertig!
Stylesheets verwenden Die Palette CSS-STILE hat große Ähnlichkeit mit der Palette HTML-STILE. Sie können CSS-Stile zwar auch über TEXT > CSS-STILE definieren, doch bietet die Palette CSSSTILE bequemere Möglichkeiten der Einstellung, darum arbeiten wir gleich mit der Palette. Wenn Sie sie noch nicht geöffnet haben, tun Sie das bitte jetzt über FENSTER > CSS-STILE (siehe Abb. 5.5). Im Gegensatz zu den HTML-Stilen gibt es in der CSS-Palette keine vordefinierten Stile. Haben Sie bereits ein Stylesheet erstellt, können Sie es sofort mit Ihrem Dokument verknüpfen. Klicken Sie hierzu rechts unten im Fenster auf das äußerste linke Icon. Es öffnet sich ein Dialogfenster, das Sie auffordert, das Stylesheet auszuwählen. Um ein neues Stylesheet zu erzeugen, klicken Sie auf das Icon NEUER STIL rechts unten in der Palette (ein Blatt Papier mit einem Pluszeichen). Alternativ können Sie auch den entsprechenden Befehl über das Palettenmenü aufrufen (auf den schwarzen Pfeil rechts oben klicken). Daraufhin öffnet sich das in Abb. 5.6 gezeigte Dialogfenster NEUER STIL.
195
Wieder verwertbare Elemente und Erweiterungsmodule
Abbildung 5.5: CSS-Stile lassen sich einem einzelnen Dokument sowie einer ganzen Website zuweisen.
Abbildung 5.6: Wählen Sie den gewünschten Stil und klicken Sie auf OK.
Folgende drei Stiltypen stehen zu Ihrer Auswahl: 쐽
BENUTZERDEFINIERTEN STIL ERSTELLEN (KLASSE) – Benutzerdefinierte Stile werden auf beliebige HTML-Objekte angewandt, doch müssen sie explizit zugewiesen werden. Dem Namen von benutzerdefinierten Stilen muss ein Punkt vorausgehen: .benutzerstil.
쐽
HTML-TAG NEU DEFINIEREN – Wenn Sie ein HTML-Tag neu definieren, setzen Sie einen Defaultstil für dieses Tag, der jedes Mal zum Einsatz kommt, wenn dieses Tag verwendet wird. Wollen Sie diese Einstellungen fallweise überschreiben, müssen Sie einen benutzerdefinierten Stil erstellen.
쐽
CSS-SELEKTOR VERWENDEN – CSS-Selektoren sind Kombinationen mehrerer Tags.
Die mächtigste Funktion in diesem Zusammenhang ist sicher die, benutzerdefinierte Stile erstellen zu können. Ohne dass Sie irgendetwas am HTML-Code verändern, bekommt Ihr Dokument plötzlich einen völlig neuen Look verpasst.
196
Cascading Style Sheets
Sie können Stylesheets an zwei Orten ablegen – einmal in einer externen Datei, zum anderen im aktuellen Dokument selbst. Möchten Sie das Stylesheet als externe Datei speichern, können Sie im Dialogfenster NEUER STIL unter DEFINIEREN IN die Option NEUE STYLESHEET-DATEI wählen. Haben Sie bereits ein Stylesheet mit Ihrem Dokument verknüpft, können Sie auch dieses aus dem Popup-Menü wählen, anstatt ein neues zu erzeugen. Wollen Sie das Stylesheet nur für das aktuelle Dokument erzeugen, wählen Sie die Option NUR DIESES DOKUMENT.
Einen Stil erzeugen Für unseren ersten Stil definieren wir das Tag neu. Wählen Sie HTML-TAG NEU DEFINIEREN, und wählen Sie aus dem Popup-Menü TAG das Tag B. Klicken Sie dann auf OK. 1. Im Listenfeld KATEGORIE können Sie zwischen acht Kategorien von Attributen wählen, die Sie einem Stil zuweisen können. Die am meisten gebräuchliche Kategorie ist TYP. Hier legen Sie sämtliche Schriftattribute fest. Sollte diese Kategorie nicht ausgewählt sein, dann machen Sie das bitte jetzt. Die zugehörige Eingabemaske ist in Abb. 5.7 zu sehen.
Abbildung 5.7: Im Fenster Stildefinition setzen Sie sämtliche Attribute für den Font.
2. Wählen Sie als Schriftgruppe »Arial, Helvetica, sans-serif«, als Schriftgröße stellen Sie 72 Pixel ein, als Stärke wählen Sie »fett«. Sie müssen sich natürlich nicht an diese Werte halten, sondern können sämtliche zur Verfügung stehenden Einstellungen ganz nach Geschmack treffen. Die Qual der Wahl liegt bei Ihnen. Da so viele Optionen zur Auswahl stehen, folgt im Anschluss an diese Einführung eine kurze CSS-Referenz.
197
Wieder verwertbare Elemente und Erweiterungsmodule
3. Wenn Sie alle Einstellungen vorgenommen haben, klicken Sie auf OK. 4. Bevor Sie Ihren Stil anwenden, öffnen Sie das Fenster noch einmal, doch diesmal erzeugen Sie einen benutzerdefinierten Stil. 5. Das Procedere ist das gleiche, nur dass Sie diesmal anstelle der Option HTML-TAG NEU DEFINIEREN die Option BENUTZERDEFINIERTEN STIL ERSTELLEN auswählen. Nennen Sie ihn .heading und weisen Sie ihm die entsprechenden Attribute zu, wie Sie das beim vorigen Stil getan haben. Ich habe als Größe 128 Pixel genommen und als Stil »oblique«. 6. Haben Sie alle Attribute gesetzt, klicken Sie auf OK. Öffnen Sie nun die Codeansicht ihres Dokuments. Wenn bei der Stildefinition nichts schief gegangen ist, finden Sie im Head-Bereich des Codes die folgenden Style-Anweisungen: <style type="text/css">
Öffnen Sie jetzt die CSS-Stile-Palette, um sich alle verfügbaren Stile anzeigen zu lassen. Wie Sie sehen, ist nur »heading« aufgelistet. Das liegt daran, dass nur benutzerdefinierte Stile aufgeführt werden. Stile, die auf neu definierten HTML-Tags basieren, werden automatisch zugewiesen und müssen daher nicht angezeigt werden.
Stile zuweisen Stile, die auf HTML-Tags beruhen, brauchen Sie wie gesagt nicht zuzuweisen, da sie automatisch angewendet werden, sobald dieses Tag im HTML-Code erscheint. Probieren Sie das einmal mit dem HTML-Tag aus, das Sie neu definiert haben. Wenn Sie wie im obigen Beispiel das -Tag umdefiniert haben, geben Sie etwas Text ein und formatieren ihn fett (Menü TEXT > STIL > FETT). Wie Sie sehen, verhält sich fett formatierter Text auf einmal völlig anders als gewohnt. Fett formatierter Text wird in dem Dokument, in dem Sie das Stylesheet definiert haben, nun mit den Attributen angezeigt, die Sie diesem Tag zugewiesen haben. Wollen Sie Text einen benutzerdefinierten Stil zuweisen, benutzen Sie hierzu entweder die CSS-Palette oder das Menü TEXT > CSS-STILE. Markieren Sie den Text und klicken Sie auf den gewünschten Stil in der CSS-Palette oder wählen Sie ihn über das Menü aus.
198
Cascading Style Sheets
Ist das Kontrollfeld ANWENDEN in der CSS-Palette deaktiviert, müssen Sie auf den Stil doppelklicken, bevor er angewählt wird. Um zugewiesene Stile wieder zu löschen, markieren Sie den Text und wählen in der CSS-Palette die Option KEINE. Genaue Kontrolle darüber, auf welche Abschnitte ein Stil angewendet wird, erhalten Sie, wenn Sie im Feld ANWENDEN AUF das Popup-Menü öffnen und das Tag auswählen, dem die Stildefinition zugewiesen wurde. Falls ein selbst definierter Stil in der Dokumentansicht nicht richtig angezeigt wird, könnte es daran liegen, dass UltraDev dieses Stilattribut nicht unterstützt. Überprüfen Sie in einem solchen Fall, ob der betreffende Stil im Dialogfenster STILDEFINITION mit einem * gekennzeichnet ist. In diesem Fall müssten Sie das Dokument in der Browservorschau öffnen, damit Sie sehen, ob dieses Stilattribut korrekt gerendert wird.
Bearbeitung und Links zu externen Stylesheets Stylesheets innerhalb eines einzelnen Dokuments zu verwenden ist zwar nicht verkehrt, zieht aber nicht den optimalen Nutzen aus dieser Technik. Statt für jedes Dokument Stilanweisungen zu schreiben, erzeugen Sie ein zentrales Stylesheet, auf das alle Dateien verlinken. Das ist die effektivste Methode, einen einheitliche Gestaltungslinie innerhalb einer Site einzuhalten. Am einfachsten verknüpfen Sie – wie bereits erwähnt – eine Datei und ein Stylesheet mit dem Button STYLESHEET ANFÜGEN rechts unten in der CSS-Palette. Damit haben Sie aber nicht die volle Kontrolle über das Stylesheet – verwenden Sie besser das Icon STYLESHEET BEARBEITEN (es stellt Papier und Bleistift dar), um mit dem Dokument verlinkte Stile zu bearbeiten. Um ein externes Stylesheet zu erzeugen, klicken Sie auf dieses Icon, oder wählen Sie TEXT > CCS-STILE > STYLESHEET BEARBEITEN. Es öffnet sich das in Abb. 5.8 gezeigte Dialogfenster STYLESHEET BEARBEITEN. In diesem Dialogfenster können Sie Stile neu erstellen oder duplizieren, bearbeiten oder entfernen. Was uns in diesem Zusammenhang am meisten interessiert, ist der Button VERKNÜPFEN. Bitte klicken Sie jetzt diese Schaltfläche an, um das Dialogfenster ENTFERNTES STYLESHEET HINZUFÜGEN zu öffnen (siehe Abb. 5.9). Geben Sie dort in das Feld DATEI / URL die Adresse des Dokuments ein, auf das verlinkt werden soll, und wählen Sie unter der Option HINZUFÜGEN ALS, ob das Stylesheet in das aktuelle Dokument importiert oder damit verknüpft werden soll. Wenn Sie bereits ein Stylesheet erstellt haben, geben Sie bitte den Pfad in das Feld DATEI /URL ein. Wenn nicht, dann vergeben Sie einen neuen Dateinamen wie z.B. meinStil.css und klicken auf OK. Daraufhin wird ein neues Stylesheet ohne Inhalt erzeugt.
199
Wieder verwertbare Elemente und Erweiterungsmodule
Abbildung 5.8: Stylesheets bearbeiten und einbinden mit der Dialogbox Stylesheet bearbeiten
Abbildung 5.9: Mit existierendem Stylesheet verknüpfen oder neues Stylesheet erzeugen
Jetzt sehen Sie wieder das Dialogfenster STYLESHEET BEARBEITEN. Im Listenfeld wird das verlinkte Stylesheet angezeigt. Um es zu bearbeiten, markieren Sie es und klicken auf BEARBEITEN. Es öffnet sich eine leere Kopie des Dialogfensters STYLESHEET BEARBEITEN, in der Titelleiste wird jedoch der Name des Stylesheets angezeigt. Um nun die gewünschten Stile zu definieren, klicken Sie in diesem Fenster auf NEU. Alle Stile, die Sie auf diesem Weg definieren, werden nun zwar in dem externen Stylesheet abgelegt, stehen aber im aktuellen Dokument ohne Einschränkung zur Verfügung. Bei der Erstellung der Folgeseiten brauchen Sie nur noch auf dieses Stylesheet zu verlinken, und sämtliche Stile stehen Ihnen zur Verfügung. In den bisherigen Versionen verfügt UltraDev nicht über die Fähigkeit, Stile zwischen einzelnen Stylesheets auszutauschen oder zwei Stilvorlagen zusammenzuführen. Hierzu müssen Sie einen Texteditor öffnen und die Stildefinitionen per Ausschneiden und Einfügen übertragen.
200
Cascading Style Sheets
CSS-Referenz Das Dialogfenster STILDEFINITION und die schriftspezifischen Einstellmöglichkeiten haben Sie ja schon kennen gelernt. Die meisten dieser Optionen sind selbsterklärend, doch ein paar bedürfen der Erläuterung. Darüber hinaus sind nicht alle Einstellungen in allen Fällen gültig oder sinnvoll. Wenn Sie z.B. die Positionierungseigenschaften einer Ebene definieren, sind Fontattribute nicht sonderlich hilfreich. Die folgenden Tabellen geben einen Überblick über die verschiedenen Einstellungsmöglichkeiten in den acht Kategorien des Fensters STILDEFINITION sowie über deren Wirkungsweise. Die Eingabemaske TYP haben Sie ja schon benutzt, um die Stilattribute von Text zu definieren. In Tabelle 5.1 gehen wir auf die einzelnen Attribute noch einmal näher ein. Attribute
Beschreibung
SCHRIFT
Font bzw. Fontgruppe, die einem Objekt zugewiesen wird.
GRÖßE
Festlegung der Schriftgröße. Die Verwendung der Maßeinheit »Pixel« ermöglicht bessere Cross-Browser-Kompatibilität.
STÄRKE
Definiert, wie mager bzw. fett ein Font dargestellt wird.
STIL
Der Schriftschnitt: gerade oder kursiv.
VARIANTE
Kleinbuchstaben werden als Kapitälchen ausgegeben.
ZEILENHÖHE
Regelt den Durchschuss im Text, indem Werte für den Zeilenabstand gesetzt werden.
GROß-/KLEIN-
Text wird nur in Groß- bzw. Kleinbuchstaben ausgegeben bzw. der erste Buchstabe eines Wortes ist groß.
SCHREIBUNG
AUSZEICHNUNG
Weitere Textstile, die mit HTML nicht möglich sind, wie z.B. DURCHGESTRICHEN.
FARBE
Textfarbe zuweisen.
Tabelle 5.1: Typ-Atribute
In der Eingabemaske HINTERGRUND definieren Sie Hintergrundfarbe oder Hintergrundbilder von Objekten wie z.B. Tabellen oder Ebenen. Tabelle 5.2 erläutert die verschiedenen Optionen. Attribute
Beschreibung
Hintergrundfarbe
Definiert die Hintergrundfarbe eines Objekts.
Hintergrundbild
Zeigt ein Objekt mit einem Hintergrundbild an.
Tabelle 5.2: Hintergrund-Attribute
201
Wieder verwertbare Elemente und Erweiterungsmodule
Attribute
Beschreibung
Wiederholen
Definiert, ob und wie ein Hintergrundbild wiederholt wird (horizontal, vertikal, in beiden Richtungen).
Anlage
Je nach Einstellung wird das Hintergrundbild mit der Seite gescrollt oder bleibt im Hintergrund fest stehen.
Horizontale Position
Gibt die horizontale Position des Hintergrundbildes in Bezug zum Element an.
Vertikale Position
Gibt die vertikale Position des Hintergrundbildes in Bezug zum Element an.
Tabelle 5.2: Hintergrund-Attribute (Forts.)
In der Eingabemaske BLOCK regeln Sie Textausrichtung und Abstände von ganzen Textblöcken wie z.B. Absätzen. Tabelle 5.3 erläutert die verschiedenen Optionen. Attribute
Beschreibung
Wortabstand
Regelt den Abstand zwischen den einzelnen Wörtern. Negative Werte verschieben die Wortgrenzen ineinander.
Zeichenabstand
Regelt den Abstand zwischen den Buchstaben. Negative Werte rücken die Buchstaben näher aneinander.
Vertikale Ausrichtung
Gibt die vertikale Ausrichtung in Relation zum übergeordneten Element an.
Textausrichtung
Gibt an, wie der Text innerhalb des Elements ausgerichtet ist (mittig, links, rechts).
Texteinzug
Gibt an, ob und wie weit die erste Zeile einen Textblocks eingezogen wird.
Leerraum
Legt fest, wie Leerraum behandelt wird. Während bei der normalen Ausgabe von HTML-formatiertem Text mehrere Leerzeichen zu einem zusammen gefasst werden, erhält PRE sämtliche Leerzeichen. Die Option KEIN UMBRUCH bricht Text nur dann um, wenn im Text ein -Tag steht.
Tabelle 5.3: Block-Attribute
Die Eingabemaske BOX regelt die Position eines Objektes auf der Seite sowie die Randabstände. Tabelle 5.4 gibt über die verschiedenen Optionen näher Auskunft. Attribute
Beschreibung
Breite
Weist dem Objekt eine Breite zu.
Höhe
Weist dem Objekt eine Höhe zu.
Tabelle 5.4: Feld-Attribute
202
Cascading Style Sheets
Attribute
Beschreibung
Schwebend
Das Objekt wird an den linken oder rechten Rand verschoben und von den übrigen Elementen umflossen.
Frei
Legt die Seite des Objekts fest, die nicht umflossen werden darf. Diese Seite bleibt frei.
Auffüllen
Definiert den Abstand zwischen dem Inhalt und dem Rahmen eines Objekts.
Rand
Definiert den Abständen zwischen Objekten.
Tabelle 5.4: Feld-Attribute (Forts.)
In der Eingabemaske RAHMEN definieren Sie den Randstil und die Farbe von Tabellenrahmen. Tabelle 5.5 erläutert die verschiedenen Optionen. Attribute
Beschreibung
Breite
Randstärke von Tabellen oder Ebenen.
Farbe
Farbe, in der ein Rahmen dargestellt wird.
Stil
Randstil des Rahmens (gestrichelt, durchgehend usw.)
Tabelle 5.5: Rahmen-Attribute
Die Eingabemaske LISTE definiert die Darstellung von geordneten und ungeordneten Listen. Tabelle 5.6 erläutert die verschiedenen Optionen. Attribute
Beschreibung
Typ
Art der Aufzählungspunkte (Zahl, Kreis usw.)
Aufzählungsbild
Ersetzt die zeichenbasierten Aufzählungspunkte durch anwenderdefinierte Grafiken.
Position
Regelt den Umbruch innerhalb von Listeneinträgen.
Tabelle 5.6: Listen-Attribute
Die Eingabemaske POSITIONIERUNG regelt die Positionierung von Ebenen und deren sichtbare Bereiche. Tabelle 5.7 erläutert die verschiedenen Optionen. Attribute
Beschreibung
Typ
Art der Positionierung einer Ebene. RELATIV platziert die Ebene in eine relative Position zum übergeordneten Objekt. ABSOLUT definiert eine Position zum linken oberen Seitenrand. STATISCH hält die Ebene an einer festen Position innerhalb des Textflusses.
Z-Index
Gibt die Position der Ebene innerhalb eines Stapels von Ebenen an.
Tabelle 5.7: Positionierungs-Attribute
203
Wieder verwertbare Elemente und Erweiterungsmodule
Attribute
Beschreibung
Sichtbarkeit
Definiert, ob die Ebene ursprünglich sichtbar ist oder nicht.
Überlauf
Stellt ein, wie mit Inhalt umgegangen wird, der größer ist als die Ebene (sichtbar, unsichtbar, scrollen).
Plazierung
Position und Größe der Ebene.
Abschneiden
Definiert, welche Bereiche der Ebene sichtbar sein sollen und welche nicht.
Tabelle 5.7: Positionierungs-Attribute (Forts.)
Die Eingabemaske ERWEITERUNGEN enthält Stile und Effekte, die nicht in allen Browsern zur Verfügung stehen, wie z.B. bestimmte Filtereffekte oder Cursorstile. Tabelle 5.8 beschreibt die verschiedenen Optionen näher. Attribute
Beschreibung
Seitenumbruch
Erzwingt einen Seitenumbruch, wenn die Seite gedruckt wird.
Cursor
Verändert den Cursorstil, wenn der Cursor auf ein Objekt gesetzt wird. Funktioniert nur im Internet Explorer.
Filter
Ebenfalls ein Feature, das nur vom Internet Explorer unterstützt wird. Bringt Photoshop-ähnliche Effekte auf eine Website. Diese Funktionen werden wohl nicht zum Standardinventar von HTML gehören.
Tabelle 5.8: Erweiterungen-Attribute
UltraDev bietet wie zu HTML auch zu Cascading Style Sheets umfangreiche Informationen in der Hilfe-Funktion. Rufen Sie für detaillierte Angaben einfach das Hilfe-Menü auf.
Ein letzte Bemerkung zu Stylesheets Wenn Sie nun mit CSS arbeiten, lassen Sie sich nicht von den Wogen der Begeisterung davon reißen. CSS sind ein fantastisches Werkzeug, aber leider verhalten sie sich nicht immer so, wie wir uns das vorstellen. Es gibt Unterschiede in der Darstellung zwischen Netscape Navigator und Internet Explorer und sogar bei den gleichen Browsern auf unterschiedlichen Plattformen. Ich habe gute Erfahrungen mit CSS gemacht und finde sie höchst nützlich, um innerhalb einer Website ein einheitliches Schriftbild und größtmögliche Cross-Browser-Kompatibilität zu erreichen. Doch dürfen Sie nicht davon ausgehen, dass die Browserdarstellung sich hundertprozentig mit der Designansicht von UltraDev deckt. Kontrollieren Sie die Seiten immer wieder in der Browservorschau und verwenden Sie nicht nur einen speziellen Browser für Ihre Testläufe.
204
Bibliotheken
5.4
Bibliotheken
Bibliotheken sind im Grunde eine Sammlung von häufig verwendeten »HTML-CodeSchnipseln«. Diese Schnipsel werden an einer Stelle gespeichert und lassen sich nach Bedarf beliebig auf anderen Seiten verwenden. Gutes Beispiel für solche wieder verwertbaren Elemente sind Navigationsleisten. Haben Sie sich einmal die Mühe gemacht, ein Menü zu erstellen, werden Sie es vermutlich wieder verwenden wollen. Darum möchte ich Ihnen als Nächstes zeigen, wie Sie ein fertig erstelltes Menü als Bibliothekselement ablegen.
Fertige HTML-Elemente in Bibliotheken ablegen Am bequemsten erstellen Sie Bibliothekselemente, wenn Sie das Objekt, das Sie der Bibliothek hinzufügen möchten, in der Dokumentansicht erstellen. Nehmen wir als Beispiel die schlichte Navigationsleiste aus Abb. 5.10, die mithilfe von Imagemaps erstellt wurde. Wenn Sie Objekte in Tabellen oder Ebenen erstellen, werden die Objekte gewissermaßen gruppiert und können bei der Anzeige im Browser nicht auseinander gerissen werden. Um die Navigationsleiste unserem Bibliotheksbestand einzuverleiben, markieren Sie die Ebene, die das Menü enthält und gehen Sie dann auf MODIFIZIEREN > BIBLIOTHEK > OBJEKT IN BIBLIOTHEK EINFÜGEN.
Die Elementepalette: Bibliotheken Das Objekt sollte nun im Register BIBLIOTHEK der Palette ASSETS stehen. Sie öffnen die Palette ELEMENTE über FENSTER > ELEMENTE. Klicken Sie auf das Buch-Icon, um sich alle Bibliothekselemente anzeigen zu lassen. Wie in Abb. 5.11 zu sehen, ist die Menüleiste jetzt zum Bibliothekselement geworden. Über die Palette ELEMENTE haben Sie schnellen Zugriff auf alle gespeicherten Objekte. Das im Listenfeld aktuell markierte Objekt wird im oberen Feld der Palette angezeigt. Normalerweise ist die Palette ziemlich klein, wenn sie geöffnet wird, unter Umständen müssen Sie sie etwas aufziehen, um das obere Feld sehen zu können. Sie können Bibliothekselemente schnell der aktuellen Seite hinzufügen, wenn Sie auf den Button EINFÜGEN links unten in der Palette klicken.
205
Wieder verwertbare Elemente und Erweiterungsmodule
Abbildung 5.10: Mit UltraDev Objekte in die Bibliothek aufnehmen
Abbildung 5.11: Unter dem Register Bibliothek werden alle Objekte angezeigt, die Sie Ihrer Sammlung von HTML-Elementen hinzugefügt haben.
206
Bibliotheken
Bibliothekselemente neu erstellen Sie können Bibliothekselemente natürlich auch von der Pike auf erstellen. Hierzu müssen Sie in die Dokumentansicht gehen und das Bibliotheksregister der Palette ELEMENTE öffnen. Klicken Sie rechts unten in der Palette auf das Icon NEU (Blatt Papier mit einem Pluszeichen). Nun wird im Listenfeld der Bibliothekselemente ein leerer Eintrag angezeigt. UltraDev gibt Ihnen daraufhin im oberen Feld Hinweise auf die erforderlichen weiteren Schritte, wie in Abb. 5.12 zu sehen.
Abbildung 5.12: Bibliothekselemente von der Pike auf erstellen
Das Icon BEARBEITEN, von dem die Programmmeldung spricht, ist ein kleines Icon rechts unten in der Palette ELEMENTE, das ein Blatt Papier und einen Stift zeigt. Mit diesem Icon können Sie jederzeit Bibliothekselemente öffnen und editieren. Schließen Sie das Dokument, das das Bibliothekselement enthält, werden Sie aufgefordert, Ihre Änderungen zu speichern. Die Aktualisierungen werden dann sofort in allen Seiten angezeigt, die das Element verwenden.
Weitere Bibliotheksfunktionen Um Bibliothekselemente neu zu benennen, doppelklicken Sie auf seinen Namen im Listenfeld und geben dann den gewünschten Namen ein. Sie können auch das Palettenmenü öffnen (auf den Pfeil rechts oben in der Palette klicken) und den Befehl UMBENENNEN aufrufen. Der Befehl AKTUELLE SEITE AKTUALISIEREN aktualisiert das geöffnete Dokument, so dass alle neu durchgeführten Änderungen an Bibliothekselementen angezeigt werden. Normalerweise werden Sie aber nicht einzelne Dokumente aktualisieren, sondern die ganze Site. Wählen Sie hierzu den Befehl SITE AKTUALISIEREN.
207
Wieder verwertbare Elemente und Erweiterungsmodule
Mit diesem Befehl öffnen Sie das in Abb. 5.13 gezeigte Dialogfenster. Hier stellen Sie ein, ob UltraDev die ganze Site überprüfen oder nur nach solchen Seiten suchen soll, die ein bestimmtes Bibliothekselement enthalten, um sie dann zu aktualisieren. Es wird ein Bericht über sämtliche Aktualisierungen angelegt, sodass Sie volle Kontrolle über alle Änderungen haben.
Abbildung 5.13: Sämtliche Dokumente einer Website in einem Durchgang auf den neuesten Stand bringen
Um ein Bibliothekselement zu entfernen, klicken Sie auf den kleinen Abfalleimer rechts unten in der Palette. Der Befehl LÖSCHEN im Palettenmenü erfüllt denselben Zweck. Die Bibliothekselemente einer Site finden Sie im Ordner Library im Fenster LOKALER ORDNER. Bibliothekselemente erkennen Sie an der Endung .lbi. Trotz dieser Extension handelt es sich um ganz normale HTML-Dateien, die Sie in UltraDev oder jedem anderen Editor öffnen und bearbeiten können.
5.5
Vorlagen
Bei der Arbeit mit UltraDev sind Sie sicher auch schon über den Begriff »Vorlagen« gestolpert. Vorlagen sind eine spezielle Art von Dokument, die sich etwas anders verhalten als die gewöhnlichen HTML-Files einer Site. Vorlagen ermöglichen es, Seiten mit einem festen, nicht veränderbaren Layout zu erstellen, in die aber beliebiger Inhalt eingestellt werden kann. Somit ist sichergestellt, dass am Layout einer Seite nichts verändert werden kann, wenn diese Dokumente von den unterschiedlichsten Bearbeitern geöffnet, verändert und wieder abgespeichert werden. Macht ein »normales« HTML-Dokument die Runde durch die Firma, so widerfahren ihm im Laufe der Zeit die wunderlichsten Veränderungen – Tabel-
208
Vorlagen
lenbreiten ändern sich scheinbar in Abhängigkeit von der Raumtemperatur, Links führen plötzlich ins Nichts – und niemand kann sich auch nur im Entferntesten vorstellen, woran das liegen könnte. Speichern Sie solche Dokumente als Vorlagen, ist dem ein Riegel vorgeschoben. Erstellen Sie solche Seiten auf Basis von Vorlagen, können Sie Ihre Seiten beruhigt an die verschiedenen Bearbeiter weitergeben, da nun das Layout der Seite selbst gegen Veränderungen aller Art geschützt ist. Dieses Vorgehen ist vor allem bei Sites, die von mehreren Bearbeitern betreut werden, ein absolutes Muss. Man könnte sich Vorlagen auch als die Umkehrung der Bibliotheksfunktion vorstellen. Statt einzelne HTML-Schnipsel zu speichern, die dann in das jeweilige Dokumente eingefügt werden, wird bei Vorlagen ein komplettes HTML-Dokument gespeichert, in das man dann diverse HTML-Schnipsel einsetzt. Die Bibliothekspalette und die Vorlagenpalette sehen sich daher auch ziemlich ähnlich.
Bestehende HTML-Dokumente als Vorlage speichern Da eine Vorlage letztlich nichts anderes ist als das fertige Layout einer Webseite, empfiehlt es sich, Vorlagen auf Basis schon vorhandener Seiten zu erstellen. Entwerfen und realisieren Sie wie gewohnt Ihre Seite in UltraDev, ohne sich schon im Vorfeld den Kopf zu zerbrechen, welche Seitenbereiche editierbar sein sollen und welche nicht. Nehmen wir als Beispiel den in Abb. 5.14 gezeigten Screen, ein schlichtes dreispaltiges Tabellenlayout. Die linke Spalte nimmt das Menü auf, die beiden anderen Spalten den Inhalt. Nun wollen wir das Menü in der linken Spalte vor unbefugten Zugriffen schützen und nur die beiden anderen Spalten zur Bearbeitung freigeben, sodass Bild und Text ausgetauscht werden können. Mit dem Befehl DATEI > ALS VORLAGE SPEICHERN machen Sie aus einem normalen Dokument eine Vorlage. Das Dialogfenster ALS VORLAGE SPEICHERN unterscheidet sich etwas vom normalen SPEICHERN UNTER-Dialog. Vorlagen werden innerhalb der Website in einem eigenen Ordner Templates abgespeichert und sind an der Endung .dwt erkenntlich. Wie Abb. 5.15 zeigt, können Sie in diesem Dialogfenster wählen, in welche Site diese Vorlage gespeichert werden soll und welchen Namen sie erhalten soll. Ist die Vorlage gespeichert, können Sie die editierbaren Bereiche definieren. Sie müssen ein Dokument nicht als Vorlage speichern, bevor Sie die editierbaren Bereiche definieren. Das ist nur eine Sicherheitsmaßnahme, um die Originaldatei vor ungewollten Änderungen zu schützen. Standardmäßig ist das gesamte Dokument für die Bearbeitung gesperrt. Sie müssen nun festlegen, welche Bereiche editierbar sein sollen. Markieren Sie einen editierbaren Bereich und gehen Sie in Menü MODIFIZIEREN > VORLAGEN > NEUER BEARBEITBARER BEREICH. Es öffnet sich in Dialogfenster, in das Sie einen Namen für diesen editierbaren Bereich eingeben. So können Sie die einzelnen Bereiche voneinander unterscheiden, wenn Sie
209
Wieder verwertbare Elemente und Erweiterungsmodule
Inhalt in die Vorlage importieren. Möchten Sie die Editierbarkeit eines Bereiches wieder aufheben, gehen Sie in Menü MODIFIZIEREN > VORLAGEN > BEARBEITBAREN BEREICH ENTFERNEN. Wählen Sie im geöffneten Dialogfenster den Bereich aus und löschen Sie ihn. Der Bereich ist somit wieder gesperrt.
Abbildung 5.14: Fertige Seiten lassen sich im Handumdrehen in Vorlagen verwandeln.
Abbildung 5.15: Vorlagen werden in eine Site gespeichert.
Editierbare Bereiche werden blaugrau markiert, um anzuzeigen, dass sie nicht gesperrt sind. Wenn Sie eine Vorlage öffnen, um eine neue Webseite zu erstellen, werden gesperrte Bereiche durch eine gelbe Markierung angezeigt, während bearbeitbare Bereiche nicht markiert sind.
210
Vorlagen
Wenn diese Tönungen nicht ganz Ihren Geschmack treffen, können Sie die Markierungsfarben in den Voreinstellungen verändern.
Wenn Sie alle editierbaren Bereiche definiert haben, speichern Sie die Vorlage mit allen Änderungen und schließen das Vorlagenfenster.
Die Elementepalette: Vorlagen Sie können Ihre Vorlagen mit der Elementepalette (öffnen über FENSTER > ELEMENTE) überprüfen, indem Sie auf das Vorlagen-Icon klicken (direkt über dem Bibliothek-Icon). Wenn Ihnen die Vorlagenpalette ganz so vorkommt wie die Bibliothekspalette, dann ist da was Wahres dran. Wenn Sie eine Vorlage per Klick auswählen, wird sie in der oberen Hälfte der Palette angezeigt. Die unter den Icons liegenden Befehle sowie die Befehle im Palettenmenü sind identisch mit denen der Bibliothekspalette.
Vorlagen neu erstellen Sie können Vorlagen ohne Weiteres mithilfe der Vorlagenpalette von einem leeren Dokument, sozusagen von Null aus erstellen, doch ist das meiner Meinung nach nicht so effektiv, als wenn Sie eine fertige Seite als Vorlage speichern. Klicken Sie hierzu auf das Icon NEUE VORLAGE, worauf im Listenfeld eine neue Vorlage angezeigt wird. Durch Doppelklick auf diesen Eintrag bzw. Klick auf das Icon BEARBEITEN öffnen Sie die neue Vorlage, um sie zu editieren. Mit diesen Funktionen sollten Sie ja schon von der Arbeit mit der Bibliothekspalette her vertraut sein. Das leere Dokument im Vorlagenfenster unterscheidet sich äußerlich nicht von einer normalen Datei in der Dokumentansicht, nur stehen Ihnen im Vorlagenfenster ein paar weitere Funktionen zur Verfügung. Gestalten Sie die Vorlage zunächst wie jedes normale Dokument. Wenn Sie nun einen Bereich als bearbeitbar definieren möchten, gehen Sie in Menü MODIFIZIEREN > VORLAGEN > NEUER BEARBEITBARER BEREICH und vergeben einen Namen für diesen Bereich. Dieser Name wird dann an der entsprechenden Stelle wie ein Etikett angezeigt. Den Text unter dieser Marke können Sie überschreiben. Beachten Sie, dass alles, was Sie in ein solches Feld eingeben, mit derselben Farbe wie editierbare Bereiche markiert wird. Sie können diese Markierung aufheben, wenn Sie den Bereich im Untermenü VORLAGEN anhand seines Namens abwählen. Ob Sie nun erst die komplette Seite erstellen und dann die editierbaren Bereiche bestimmen oder Zug um Zug arbeiten, einen Teil fertig stellen und dann editieren, liegt ganz bei
211
Wieder verwertbare Elemente und Erweiterungsmodule
Ihnen, doch sollten Sie gut vorausplanen. Wenn Sie zuerst die ganze Site erstellen und dann nachträglich versuchen, Sie an Ihre Vorlage anzupassen, dürfen Sie sich auf Überstunden einstellen. Eine klug geplante Website erspart Ihnen langfristig viel überflüssige Arbeit.
Hast du mal 'ne Vorlage? Die Vorlage ist fertig, aber was tun wir nun damit? Am leichtesten lassen sich Vorlagen zum Einsatz bringen, wenn Sie über DATEI > NEU VON VORLAGE ein Dokument gleich auf Basis einer Vorlage erstellen. Ein Dialogfenster zeigt Ihnen daraufhin alle zur Verfügung stehenden Vorlagen an, die Sie als Grundlage Ihrer neuen Seite verwenden können. Und wie wir es von einer Vorlage erwarten dürfen, können nur die editierbaren Bereiche überschrieben werden. Andere Bearbeiter können nun Inhalte in die Seite einstellen, ohne befürchten zu müssen, an der Datei oder am Layout etwas zu zerstören. Eine andere Art mit Vorlagen zu arbeiten ist, ein Dokument mit einer Vorlage zu verbinden. Die Vorlage wird mit dem Dokument verknüpft und der Inhalt in eines der editierbaren Felder eingefügt. Verwenden Sie hierzu den Button ANWENDEN in der Vorlagenpalette. Ähnlich wie Bibliothekselemente können Sie auch Vorlagen bearbeiten und aktualisieren und über MODIFIZIEREN > VORLAGEN > SEITEN AKTUALISIEREN auf alle Seiten anwenden, die auf dieser Vorlage basieren. Somit lassen sich eventuelle Layoutänderungen an Seiten, die dieselbe Formatvorlage verwenden, durch Anpassung einer einzigen Datei auf schnellstem Wege bewerkstelligen. Wenn das keine gute Nachricht ist! Damit Bibliotheken und Vorlagen optimal eingesetzt werden können, ist es wichtig, dass sämtliche Mitarbeiter, die eine Site betreuen, deren Funktionsweise wirklich verstehen, bevor sie damit arbeiten. Verwendet man eine Vorlage wie ein gewöhnliches HTML-Dokument, ist es nicht mehr möglich, Dokumente zentral zu aktualisieren oder Inhalte zu kontrollieren. Wenn Sie größere Veränderungen an einer Vorlagen-basierten Seite vornehmen möchten, ohne die Vorlage dabei zu zerstören, können Sie über MODIFIZIEREN > VORLAGEN > VON VORLAGE LÖSEN das Dokument von seiner Vorlage trennen. Sie unterliegen dann nicht mehr den Einschränkungen der Vorlage, die Inhalte der Seite bleiben aber erhalten. Wenn Sie eine Seite von ihrer Vorlage lösen, werden eventuelle Aktualisierungen an dieser Vorlage nicht mehr auf diese Seite übertragen.
212
Der Elemente-Manager
5.6
Der Elemente-Manager
Wie Sie bei der Arbeit mit Vorlagen und Bibliotheken schon gesehen haben, enthält die Palette ELEMENTE sämtliche Objekte die innerhalb einer Website zur Verfügung stehen. Wir haben uns vordringlich mit Vorlagen und Bibliotheken beschäftigt, weil das die komplexesten Themen sind. Doch stehen über den Elemente-Manager auch noch andere Objekte zu Verfügung. Öffnen Sie bitte die Palette ELEMENTE. Am linken Palettenrand sehen Sie neun Icons. Jedes Icon steht für eine bestimmte Ressource, die Sie damit aufrufen können. Es handelt sich um die folgenden Objekte, von oben nach unten: 쐽
BILDER – Jedes Bild, das in der Site vorkommt, ist hier aufgeführt.
쐽
FARBEN – Enthält die Farben, die verwendet wurden.
쐽
URLS – Zeigt Links zu andern Seiten oder Objekten an.
쐽
FLASH – Flash-Dateien, die in der Site verwendet werden.
쐽
SHOCKWAVE – Listet alle Shockwave-Inhalte auf.
쐽
FILME – Alle eingebetteten oder sonst wie verknüpften Videodateien werden hier aufgeführt.
쐽
SCRIPTE – Listet sämtliche JavaScript-Funktionen bzw. VBScript-Code auf.
쐽
VORLAGEN – Hier stehen alle verfügbaren Vorlagen.
쐽
BIBLIOTHEK – Sämtliche Bibliothekselemente werden hier geführt.
Wenn Sie einen bestimmten Objekttyp ausgewählt haben, können Sie die enthaltenen Elemente über diese Palette editieren oder einer Seite hinzufügen, wie wir das bei den Bibliothekselementen und Vorlagen schon gemacht haben. Sie können auch ausgewählte Objekte in eine andere Site kopieren. Öffnen Sie hierzu mit dem kleinen Pfeil rechts das Palettenmenü. So können Sie Elemente zwischen einzelnen Sites austauschen, ohne irgendwelche Dateien von Hand hin- und herkopieren zu müssen.
Verschiedene Ansichtsmodi im Elemente-Manager Im Elemente-Manager haben Sie zwei Ansichtsmodi zur Auswahl: ganze Site und Favoriten. Standardmäßig werden alle Objekte einer Site angezeigt – auch solche, die eher im Weg sind. Um die Liste etwas kürzer zu halten und den Überblick zu bewahren, können Sie ein Element auswählen und es über das Palettenmenü oder durch Klick auf das Favoriten-Icon (ein Band mit einem Pluszeichen) der Favoritenliste hinzufügen. Sie können natürlich jederzeit zwischen den Ansichten umschalten, indem Sie das jeweilige Optionsfeld oben in der Palette anklicken.
213
Wieder verwertbare Elemente und Erweiterungsmodule
5.7
UltraDev erweitern
UltraDev ist extrem ausbaufähig. Darauf einzugehen würde den Rahmen dieses Buches bei weitem sprengen, denn die Erweiterung von UltraDev wäre noch einmal Stoff für zwei oder drei Wochen. Das ganze Menüsystem ist editierbar, selbst geschriebene JavaScript-Verhaltensweisen lassen sich nahtlos in die Entwicklungsumgebung von UltraDev integrieren. Nehmen wir zum Beispiel das Menü BEFEHLE. Hier wurden schon einige externe Befehle integriert, wie z.B. HTML OPTIMIEREN und WORD-HTML OPTIMIEREN. Diese Funktionen sind nicht Teil des genuinen Programmcodes, sondern liegen als Erweiterungsmodul vor. Wenn Sie kein Programmierer sind und Ihre JavaScript-Verhaltensweisen nicht selbst schreiben wollen, stehen Ihnen zwei Wege offen, wie Sie UltraDev um zusätzliche Funktionen erweitern können: die Installation von vordefinierten Verhaltensweisen von Drittanbietern und die Speicherung von mehreren Arbeitsschritten in einem Makro.
Makros aufzeichnen Die einfachste Art, UltraDev um selbst erstellte Funktionen zu erweitern, ist die Aufzeichnung von Bearbeitungsschritten als Makro, das sich immer wieder verwenden lässt. Leider können Sie während der Aufzeichnung Objekte nicht mit der Maus auswählen, sodass Sie im Wesentlichen auf Tastatureingaben und das Einfügen von Objekten beschränkt sind. Wenn Sie ein Makro aufzeichnen wollen, gehen Sie wie folgt vor: 1. Führen Sie die Bearbeitungsschritte aus, die Sie aufzeichnen möchten: Text eingeben, Objekt einfügen usw. 2. Öffnen Sie die Palette VERLAUF und markieren Sie die Schritte, die Sie als Makro (von UltraDev als »Befehl« bezeichnet) speichern wollen. 3. Wenn Sie die Befehlsfolge vor dem Speichern erst noch einmal abspielen wollen, um zu überprüfen, ob sie sich wie gewünscht verhält, klicken Sie auf den Button WIEDERGABE oder wählen im Palettenmenü den Befehl SCHRITTE WIEDERHOLEN. 4. Sind Sie mit dem Ergebnis zufrieden, können Sie es durch Klick auf das DiskettenIcon oder mit dem Befehl ALS BEFEHL SPEICHERN im Palettenmenü speichern. 5. Vergeben Sie einen Namen für Ihren neuen Befehl. 6. Wenn Sie jetzt das Menü Befehle öffnen, sehen Sie, dass nun Ihr Makro dort aufgelistet wird. Abb. 5.16 zeigt die Verlaufspalette, nachdem ein paar einfache Aktionen durchgeführt wurden. Diese Bearbeitungsschritte können nun als Befehl gespeichert werden.
214
UltraDev erweitern
Wenn Sie sehr oft Textbausteine oder Tabellen in ein Dokument einfügen müssen, können Sie solche wiederkehrenden Arbeitsschritte als Makro ablegen und müssen dann im Bedarfsfall nur noch das Makro abspielen. Möchten Sie ein Makro löschen oder umbenennen, wählen Sie BEFEHLE > BEFEHLSLISTE BEARBEITEN. Es öffnet sich das in Abb. 5.17 gezeigte Dialogfenster. Klicken Sie auf den entsprechenden Befehl im Listenfeld, um ihn neu zu benennen. Mit Klick auf die Schaltfläche LÖSCHEN wird das Makro gelöscht.
Abbildung 5.16: Markieren Sie die Bearbeitungsschritte, die Sie als Befehl speichern möchten.
Abbildung 5.17: Befehle löschen und umbenennen
Sie haben aber auch die Möglichkeit, eine Folge von Bearbeitungsschritten aufzuzeichnen und beliebig oft zu verwenden, ohne sie als Makro abzulegen, indem Sie sie als temporären Befehl speichern.
Temporäre Befehle aufzeichnen Mit der Erstellung von temporären Befehlen zeichnen Sie eine Folge von Bearbeitungsschritten während einer UltraDev-Sitzung auf, die beliebig oft wiedergegeben werden kann, aber mit Beendigung dieser Sitzung wieder gelöscht wird. Um einen temporären
215
Wieder verwertbare Elemente und Erweiterungsmodule
Befehl zu erstellen, wählen Sie BEFEHLE > AUFZEICHNUNG STARTEN. Sie arbeiten wie gewohnt mit dem Programm, während es Ihre Aktionen aufzeichnet. Auch hier gilt leider die Einschränkung, dass Sie während der Aufzeichnung keine Objekte mit der Maus auswählen können. Um die Aufzeichnung zu beenden, wählen Sie BEFEHLE > AUFZEICHNUNG STOPPEN. Sobald ein temporärer Befehl gespeichert wurde, steht das Kommando BEFEHLE > AUFGEBEFEHL ABSPIELEN zur Verfügung und Sie können die aufgezeichnete Sequenz beliebig oft wiedergeben.
ZEICHNETEN
Erweiterungsmodule für UltraDev herunterladen Bevor Sie sich nun durch die Hilfe-Funktion von UltraDev pflügen und sich das Hirn darüber zermartern, wie Sie Ihre eigenen Erweiterungen schreiben, sollten Sie erst einmal auf der Website von Macromedia vorbeischauen und auskundschaften, was dort an fertigen Modulen bereits erhältlich ist. Über BEFEHLE > MEHR BEFEHLE kommen Sie direkt auf die Website von Macromedia. (Dazu müssen Sie natürlich online sein.) Ein Blick auf Abb. 5.18 dürfte keinen Zweifel aufkommen lassen, dass sich dort so manche nützliche Erweiterung finden lässt.
Abbildung 5.18: Auf der Website von Macromedia finden Sie ein reiches Angebot an Erweiterungsmodulen.
Mit den folgenden vier Schritten installieren Sie ein Erweiterungsmodul (von Macromedia als »Package« bezeichnet):
216
UltraDev erweitern
1. Klicken Sie auf das Modul, das Sie herunterladen möchten. 2. Klicken Sie auf der Seite, die sich nun geöffnet hat, auf das Download-Icon für Ihr Betriebssystem (Mac oder Windows). 3. Öffnen Sie den Ordner, in den das Erweiterungsmodul gespeichert wurde. 4. Doppelklicken Sie auf das Modul. Nachdem Sie doppelt auf das Modul geklickt haben, öffnet sich der Extension Manager (siehe Abb. 5.19) und installiert das Modul. Abschließend wird eine Meldung über die erfolgreiche Installation sowie den Funktionsumfang des Moduls angezeigt.
Abbildung 5.19: Der Extension Manager verwaltet alle installierten Erweiterungsmodule.
Um ein Modul wieder zu entfernen, wählen Sie im Extension Manager den Befehl FILE > REMOVE EXTENSION. Es steht ein Unzahl an neuen Features zur Verfügung, um die Sie UltraDev erweitern können. Sie müssen nur auf der Website von Macromedia vorbeischauen und sich die passenden Module herunterladen. Bevor Sie also den Schluss ziehen, dass es doch etwas gibt, was UltraDev nicht kann, sollten Sie sich erst einmal alle erhältlichen Erweiterungen vornehmen. Diese Module gibt es übrigens umsonst! Sie können UltraDev nicht nur durch diverse Module erweitern, sondern auch die Oberfläche nach Ihren Vorstellungen umgestalten. Im Anhang B, »Anpassen der UltraDev-Umgebung«, finden Sie die nötigen Informationen, wie Sie die Programmoberfläche so umstrukturieren, dass Sie damit Ihren persönlichen Workflow verbessern.
217
Wieder verwertbare Elemente und Erweiterungsmodule
5.8
Zusammenfassung
Zu einer effizienten Entwicklung von Websites gehört auch die intelligente Wiederverwertung bereits erstellter Funktionen und Inhalte. Zu diesem Zweck hält UltraDev ein paar sehr nützliche Werkzeuge bereit. Cascading Stylesheets sorgen für ein einheitliches Schriftbild innerhalb einer Site und garantieren eine weitgehend identische Darstellung über Browser- und Betriebssystemgrenzen hinweg. Darüber hinaus können Sie den Aufwand mit CSS-Dateien wesentlich kleiner halten als mit der üblichen HTML-Formatierung von Text. Entwickeln Sie für Browser, die keine CSS unterstützen, können Sie auf HTML-Stile ausweichen. Vorlagen und Bibliotheken sind Features von UltraDev, die die Wiederverwendung bereits erstellter Elemente ermöglichen. Bibliotheken speichern häufig verwendete »HTMLSchnipsel«, die sich in jedes beliebige Dokument einfügen lassen, sodass bei Änderungen nur eine Datei aktualisiert werden muss. Vorlagen sorgen für ein einheitliches Erscheinungsbild aller Seiten, die auf dieser Vorlage basieren. Und auch hier muss im Falle einer Aktualisierung nur eine einzige Datei geändert werden. Und schließlich ist UltraDev erweiterbar – durch Installation von Modulen, die Sie aus dem Internet herunterladen können oder durch Aufzeichnung eigener Makros. Ein paar Klicks und das Programm ist um neue, leistungsfähige Funktionen erweitert, die in der Standardinstallation fehlen.
5.9 F
Soll ich ein zentrales Stylesheet verwenden oder die Stilinformationen in jedem Dokument gesondert speichern? A
F
Das kommt ganz auf Ihre Anforderungen an. Ein zentrales Stylesheet empfiehlt sich vor allem für komplexe Websites. Wenn sich jedoch die Seiten im Layout stark unterscheiden, müssen Sie vielleicht das Stylesheet ständig anpassen, um sämtliche Stilvarianten abzudecken. In diesem Fall würde es sich empfehlen, bei Seiten, die im Layout abweichen, die Stildefinitionen direkt ins Dokument zu schreiben.
Kann ich spezielle Effekte, wie z.B. Filter verwenden, auch wenn sie vom Netscape Navigator nicht unterstützt werden? A
218
Fragen und Antworten
Ja, aber ich würde ein solches Vorgehen nicht empfehlen. Die Grundidee des Internet ist, eine offene Plattform zu sein, über die Dokumente unabhängig von Betriebsystemen oder Browsern ausgetauscht werden können. Websites nur für einen speziellen Browser zu entwickeln ist ziemlich kurzsichtig.
Workshop
F
Welche Elemente speichert man besten in einer Bibliothek? A
F
Vor allem natürlich Menüs und Navigationsleisten, doch auch kleinere Elemente, die sich öfter ändern, wie z.B. Linklisten, E-Mail-Adressen oder regelmäßig wechselnde Grafiken. Wenn Sie bei Aktualisierungen nicht jedes Mal die ganze Site durchpflügen wollen, sollten Sie solche Objekte in Bibliotheken ablegen.
Sind Vorlagen völlig sicher gegen Veränderungen? A
Ganz und gar nicht. Sie können eine auf Vorlagen basierende Website nicht für verschiedene Bearbeiter zugänglich machen und die Dateien hundertprozentig gegen Veränderungen schützen, seien sie nun absichtlich oder nicht. Sie sollten daher sämtliche Mitarbeiter im effektiven Umgang mit UltraDev schulen, damit sie Sinn und Zweck solcher Vorlagen verstehen und dementsprechend damit umgehen.
5.10 Workshop Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie im Anhang A, »Quiz-Antworten«.
Quiz 1. Welches ist der Hauptverwendungszweck von CSS? 2. Funktionieren sämtliche CSS-Attribute in sämtlichen Browsern und auf allen Plattformen? 3. Wozu dient die Bibliothek? 4. Wie machen Sie aus einem normalen HTML-Dokument eine Vorlage? 5. Wie installieren Sie Erweiterungsmodule?
Übungen 1. Öffnen Sie eine bereits bestehende Website und ersetzen Sie HTML-Formatierungen durch Stylesheets. 2. Trainieren Sie die Verwendung von Bibliotheken und Vorlagen. Erzeugen Sie Vorlagen von bestehenden Webseiten und fügen Sie neuen Inhalte ein. 3. Gehen Sie auf die Website von Macromedia und installieren Sie neue Erweiterungsmodule für UltraDev. Machen Sie sich mit dem Extension Manager vertraut und wie man damit Erweiterungen installiert.
219
Einführung in dynamische Webanwendungen und Datenbankentwicklung
6
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Was sind eigentlich datenbankgestützte Websites? Welche Vorteile bieten sie gegenüber »normalen« Websites? Welche Kenntnisse braucht man, um sie zu erstellen? Das sind die Fragen, auf die wir in der heutigen Lektion eine Antwort finden wollen. Heute können wir uns einmal zurücklehnen und den Computer ausgeschaltet lassen. Sie werden lernen, was dynamische Websites sind und welche Konzepte dahinter stehen. Leider geht das nicht ohne etwas Theorie. Die heutigen Themen im Überblick: 쐽
Welche Art von Websites lässt sich per Datenbank steuern? Welche Elemente können dynamisch verändert werden?
쐽
Welche Technologien stecken hinter dynamischen Websites und wie werden diese Technologien vom HTTP-Protokoll unterstützt?
쐽
Wie lassen sich datenbankgestützte Websites realisieren? Welchen Planungsaufwand muss man vor der Umsetzung betreiben?
쐽
Wie lautet das kleine Einmaleins des Datenbankentwurfs? Was versteht man unter Normalisierung? Wie baut man eine effektive und leicht zu pflegende Datenbankstruktur auf?
6.1
Dynamische Websites
An den vorausgegangenen Tagen haben wir uns mit der Erzeugung von statischen Websites befasst und haben gerade einmal das erste Viertel des Buches hinter uns gebracht. Zu was in aller Welt muss man nun noch so viel Papier und Druckerschwärze verbrauchen? Nun, für die Erklärung, wie man dynamische Websites erstellt. Aber was versteht man eigentlich darunter? Wenn eine Website dynamisch ist, so heißt das, dass Inhalte eines HTML-Dokuments nicht – wie wir das bisher von HTML-Dateien kennen – statisch, also unveränderlich, sind, sondern ausgetauscht werden können. Diese neuen Inhalte werden dynamisch in Abhängigkeit von den Eingaben des Anwenders erzeugt. Nun haben wir ja schon Seiten erstellt, bei denen sich Objekte verändert oder bewegt haben, wenn der Anwender z.B. den Mauszeiger darauf gesetzt hat. Sind das also auch schon dynamische Websites? Nein, eigentlich nicht. Der Code, auf dem diese Effekte basieren, ist bereits in das HTML-Dokument integriert, alle erforderlichen Rechenoperationen werden clientseitig, vom System des Anwenders, durchgeführt. Bei echten dynamischen Sites wird ein HTML-Dokument aus Programmcode generiert, der vom Server abgearbeitet wird. Rufen zwei Besucher einer Site dasselbe Dokument ab, kann sich der HTML-Code dieser Dateien durchaus unterscheiden. Zur Erstellung einer individualisierten HTML-Seite wird also auf die Rechenleistung des Servers zugegriffen,
222
Dynamische Websites
der das Dokument auf der Grundlage der Anwendereingaben erzeugt. Diese Seite kann nun die Art von dynamischen Elementen enthalten, die wir in den vorhergehenden Lektionen kennen gelernt haben, oder ein gewöhnliches statisches HTML-Dokument sein. Der entscheidende Punkt ist, dass die Seite während der Laufzeit vom Server erzeugt und dann an den Client übertragen wurde. Hinter dynamischen Websites steht gewöhnlich ein Datenbanksystem, um die Datenbestände möglichst effektiv zu speichern und zu verwalten. Dynamisch erzeugte Dokumente lassen sich manchmal an der Extension der angeforderten Datei wie .cgi, .php oder .jsp – kurz allem, was von .htm oder .html abweicht – erkennen. Die Extension einer Datei ist zwar noch keine hundertprozentige Garantie, dass hinter der Website eine Datenbank steht, aber doch ein ziemlich verlässlicher Hinweis. Sie ist auch ein Hinweis darauf, welche Technologie verwendet wird, um die Site dynamisch zu machen. Es gibt zwei verbreitete Ansätze, um dynamische Websites zu erzeugen: den Einsatz von CGI-Scripts und die Verwendung eingebetteter Skriptsprachen.
Traditionelle Programmierung von Web-Applikationen Traditionell konzentrierte man sich bei der Programmierung von Web-Applikationen darauf, spezialisierte Anwendungen zu schreiben, die genau definierte Aufgaben erledigen, die so genannten CGI-Scripts (CGI: Common Gateway Interface). CGI-Scripts sind Anwendungen, die sich im Prinzip nicht von den Programmen unterscheiden, die Sie lokal auf Ihrem Rechner einsetzen, nur dass sie auf einem Server installiert sind. Es sind Programme wie andere auch, nur verwenden sie ein HTML-Interface. Das Hauptproblem von CGI-Scripts ist, dass sie eine Menge Speicherplatz auf dem Server beanspruchen. Eine typische Perl-Anwendung (Perl ist die am weitesten verbreitete Programmiersprache für CGI-Scripts) belegt ungefähr 5 MB RAM. Für einen modernen UNIX- oder NT-Server ist das noch kein Problem, wohl aber das ständige Laden des Programms in den Arbeitsspeicher und das anschließende Löschen. Diese ständigen Ladeund Löschvorgänge machen CGI-Applikationen weit ressourcenhungriger als eingebettete Scriptsprachen, auf die wir im Anschluss eingehen. Bevor sich jetzt allgemein Unmut breit macht, möchte ich darauf hinweisen, dass man das Perl-Problem elegant umgehen kann. Mit der mod_perl-Library für den Apache-Webserver bzw. dem Perl-Add-on von ActiveState für den IIS kann man einen Perlinterpreter in den Webserver integrieren. So muss nicht jedes Mal ein eigener Perl-Prozess gestartet werden, wenn ein CGI-Script aufgerufen wird. CGI-Scripts werden normalerweise programmiert, um eine genau definierte Aufgabe auszuführen. Auf meiner Website unter http://jray.ag.ohio-state.edu/ finden Sie ver-
223
Einführung in dynamische Webanwendungen und Datenbankentwicklung
schiedene solcher CGI-Scripts. Es handelt sich nicht um die üblichen seitenlangen Webapplikationen, sondern sie sind für einen speziellen Einsatzzweck geschrieben (Besucherstatistiken, grafische Netzwerkanalyse usw.). Der »Pferdefuß« an den herkömmlichen CGI-Programmiersprachen ist, dass sie nicht für die Programmierung von Webapplikationen konzipiert wurden. Wofür Sie bei einer herkömmlichen CGI-Applikation mehrere Dutzend Zeilen Code brauchen, lässt sich mit eingebetteten Scriptsprachen vielleicht mit einer einzigen Zeile erledigen. Wenn Sie Erfahrung mit CGI-Scripts haben, werden Sie feststellen, dass der Einsatz von eingebetteten Sprachen den Sourcecode drastisch verkürzen kann.
In den HTML-Code eingebettete Scriptsprachen Eingebettete Scriptsprachen sind die Nachfolger der CGI-Sprachen. In puncto Benutzerfreundlichkeit und Leistungsumfang übertreffen sie herkömmliche CGI-Scripts bei weitem. Der Hauptunterschied zwischen CGI-Scripts und eingebetteten Scriptsprachen lässt sich am besten an der Frage festmachen, wer sozusagen die »Oberhoheit« über den Code hat. Bei CGI-Scripts steht der Code unter der Regie der Programmiersprache, die das HTML-Dokument erzeugt. Bei eingebetteten Sprachen steuert das HTML-Dokument den Code. Statt also erst ein Programm zu schreiben, das dann anschließend eine HTMLDatei ausgibt, schreiben Sie gleich den erforderlichen HTML-Code und setzen dort, wo Elemente dynamisch verändert werden sollen, den entsprechenden Anwendungscode ein. Auch hinsichtlich der Abarbeitung unterscheiden sich die Programmiersprachen. Eingebettete Sprachen werden vom Server abgearbeitet, wenn er die Seite an den Client schickt. Hierzu muss kein externes Programm aufgerufen werden. Der Interpreter für die Sprache ist in den Server selbst eingebunden. Das macht eingebettete Sprachen höchst effektiv, was Geschwindigkeit und Ressourcenbedarf angeht. Ein anderer fantastischer Vorteil von eingebetteten Sprachen ist, dass man mit ihnen direkt auf Datenbanken zugreifen kann. Datenbankunterstützung wurden bei den meisten Programmiersprachen erst nachträglich integriert. Die Entwickler eingebetteter Sprachen erkannten jedoch frühzeitig das Potenzial, das im direkten Zugriff auf Datenbanken aus dem HTML-Code heraus liegt und integrierten dieses Feature von vorneherein in diese Sprachen. Geschwindigkeit und leichte Anwendbarkeit sind nur zwei der Vorteile dieser optimal aufeinander abgestimmten Technologien. Die Kombination von eingebetteten Scriptsprachen und HTML-Code bietet also große Vorteile. In den letzten zwei Jahren sind eingebettete Sprachen daher zu einem wahren Siegeszug angetreten und werden mittlerweile auf breiter Front eingesetzt. UltraDev unterstützt drei Typen eingebetteter Scriptsprachen und ist somit flexibel einsetzbar. Außerdem erlaubt das Programm als eines der ersten dieser Art eine Live-Vorschau dynamischer Websites.
224
Dynamische Sites verstehen
6.2
Dynamische Sites verstehen
Auch wenn es vielleicht den Anschein hat, dass sich die Entwicklung einer dynamischen Website bis auf den Punkt, dass sie eine HTML-Oberfläche benötigt, in nichts von der Programmierung einer anderen Anwendung unterscheidet, so ist hierbei doch eine völlig andere Vorgehensweise vonnöten. Was den Entwicklern von Web-Applikationen das Leben etwas vergällt, ist das HTTP-Protokoll. Was geschieht zum Beispiel, wenn Sie eine Anwendereingabe entgegennehmen, sie verarbeiten, eine weitere Information abfragen, sie verarbeiten und dann das Ergebnis ausgeben? Mit einer gewöhnlichen Programmiersprache ist das kein Problem. Sie strukturieren den Programmablauf genau in der Reihenfolge, wie die einzelnen Bearbeitungsschritte ausgeführt werden sollen. Soll eine Anwendung im Web laufen, müssen Sie an die Programmierung anders herangehen. Der Grund liegt darin, dass immer nur ein Programmschritt auf einmal implementiert werden kann und dass diese Programmschritte irgendwie miteinander verknüpft werden müssen. Nun ist aber das HTTP-Protokoll ein verbindungsloses Protokoll, und zwischen Client und Server besteht zwischen dem Aufruf von zwei dynamisch erzeugten Seiten keine Verbindung. Jede einzelne Seite, die ausgegeben wird, ist – sofern sie dynamisch erzeugt wurde – das Ergebnis der individuellen Ausführung eines Programms auf dem Server. Wenn der Anwender ein Formular abschickt, geht es an den Server, wird dort abgearbeitet und an den Anwender wird eine Ergebnisseite übermittelt. Nach der Übertragung sind die Daten auf dem Server nicht mehr existent und die Verbindung zwischen Client und Server wurde gelöscht. Also, was tun, wenn Sie diese Daten eigentlich für weitere Operationen benötigen? Um eine konstante Verbindung zwischen Client und Server über mehrere Anwenderzugriffe hinweg aufrecht zu erhalten, müssen Sie die Eigenheiten des HTTP-Protokolls überlisten und mit einem so genannten Session-Management arbeiten. Einfach ausgedrückt ist das Session-Management ein Trick, um zwischen dem Anwender und dem Webserver eine permanente virtuelle Verbindung einzurichten, während in Wirklichkeit keine dauerhafte Verbindung besteht. Für die Realisierung eines Session-Managements können Sie zwischen zwei Möglichkeiten wählen – dem Einsatz von Cookies und der Übergabe von Variablen.
Variablenübergabe Variablenübergabe ist eine Möglichkeit, die Werte von verschiedenen Variablen von einem HTML-Dokument an das nächste weiterzugeben. Sie kennen sicher URLs wie die folgende, die sich nicht auf eine bestimmte statische HTML-Seite beziehen: http://www.someplaceurl.com/test.jsp?firstname=John&lastname=Ray
225
Einführung in dynamische Webanwendungen und Datenbankentwicklung
In diesem Beispiel werden die Variablen firstname und lastname an das Programm test.jsp auf dem Server mit den Werten John bzw. Ray übertragen. Sollen bei einer Anwendung Daten zwischen Seiten übergeben werden, kann man diese Werte in Variablen ablegen und an den Link anhängen, der diese Seite aufruft. Wird der Link aktiviert, werden die Daten »weitergereicht«. Man bezeichnet diese Art der Variablenübergabe als GET-Methode. Sie wird häufig verwendet, doch erzeugt sie hässliche Monster-URLs, die zudem manchmal unerwünschte Einblicke ins Innenleben einer Website zulassen. Ein weiterer Nachteil ist, dass beim Bookmarken von Seiten, die mit der GET-Methode erzeugt wurden, diese Variablen mit abgelegt werden. Werden diese Seiten nun wieder aufgerufen, werden auch die Variablen wieder mitgesendet, die beim ersten Aufruf der Seite vom Webserver erzeugt wurden. Der Vorteil der Variablenübergabe per GETMethode ist, dass man die erforderlichen Links gut von Hand erzeugen kann. Parameter aus Datenbankabfragen oder an anderer Stelle eingegebene Benutzerdaten lassen sich so problemlos in einen Link schreiben. Es folgt ein Codebeispiel für einen Request an den Webserver unter Verwendung der GET-Methode: GET / thetest.jsp?firstname=John&password=notonyourlife&lastname=Ray&action=transferbank funds HTTP/1.0 Host: poisontooth.com: User-Agent: Johnclient.pl (Linux)
Daten lassen sich alternativ auch per POST-Methode übergeben. Sie wird gewöhnlich dann verwendet, wenn man Formulardaten an den Server übermitteln möchte, ohne dabei sämtliche Daten in die URL einbetten zu müssen. Gerade bei sehr umfangreichen Formularen ist es nicht wünschenswert, Daten per URL zu übergeben. Die POST-Methode sendet Daten als Teil der Request-Mitteilung an den Server. POST /thetest.jsp HTTP/1.0 Host: poisontooth.com: User-Agent: Johnclient.pl (Linux) Content-type: application/x-www-form-urlencoded Content-Length: 75 firstname=John&password=notonyourlife&lastname=Ray&action=transferbankfunds
Wie Sie sehen, sind die Unterschiede zwar klein, aber umso weitreichender. Abgesehen davon, dass der resultierende HTML-Code übersichtlicher ist, können auch größere Datenmengen per Formular an das Programm übergeben werden. Mit dem POST-Befehl können Sie jedoch nur dann Daten per HTML übergeben, wenn Sie Formulare benützen. Sie können nicht selber eine URL erzeugen und damit per POST-Befehl Daten übergeben. Dadurch lässt sich die POST-Methode nur begrenzt einsetzen. Verwenden Sie jedoch eine Reihe von Formularen, die der Anwender ausfüllen soll, ist die POST-Methode sehr nützlich.
226
Dynamische Sites verstehen
Sitzungsvariablen Egal für welche Art der Variblenübergabe Sie sich letztlich entscheiden, das Problem, wie Sie Ihre Daten verwalten, ist damit noch nicht gelöst. Wenn Sie z.B. eine WarenkorbFunktion programmieren wollen, die alle gekauften Waren in einer Einkaufsliste speichert, wäre es nicht gerade effizient, eine Warenkorb-Variable zu definieren, an diese Variable dann alle Bestellnummern zu hängen und dann per URL an die nächste Seite zu übergeben. Zur Übergabe dieser Informationen empfiehlt sich die Verwendung von Sitzungsvariablen. Sitzungsvariablen sind virtuelle Variablen, die für die Dauer einer Anwendungssitzung vergeben werden. In Sitzungsvariablen lassen sich beliebige Werte ablegen, die nur für die jeweilige Sitzung gültig sind. Da sich die Dauer einer Anwendersitzung nicht vorhersagen lässt, werden die Variablen gelöscht, sobald der Anwender die Seite wieder verlässt. Manchmal werden Sitzungsvariablen auch zeitabhängig gelöscht. Der Anwender wird dann automatisch vom System ausgeloggt, und die gespeicherten Informationen werden gelöscht. Haben Sie nicht auch schon mal einen Webshop besucht und ein paar Dinge in Ihren Einkaufskorb gelegt, um sie dann schließlich doch nicht zu kaufen? Wahrscheinlich haben Sie dann Ihren Einkaufswagen nicht geleert, sondern einfach das Browserfenster geschlossen. Falls Sie dann am nächsten Tag nochmal auf die Site gegangen sind, war Ihr Einkaufskorb wahrscheinlich leer, d.h., die Sitzungsvariable wurde gelöscht. Sitzungsvariablen können, wenn sie intelligent eingesetzt werden, sowohl dem Anwender als auch dem Programmierer das Leben leichter machen. Man kann damit sowohl komplexere als auch sicherere Anwendungen schreiben, als das unter der Verwendung der üblichen Art der Variablenübergabe möglich wäre. Werden Anwendungen mit Sitzungsvariablen aber nicht sauber programmiert, kann sich der Effekt ins Gegenteil verkehren. Bei den meisten Programmiersprachen, die die Definition von Sitzungsvariablen gestatten, können Sie die vollständige Warenkorbstruktur in einer einzigen Variablen abbilden. Das ist zwar möglich, kann aber den Server schon mal in die Knie zwingen. Komplexe Strukturen, die in einer einzigen Variablen abgelegt werden, müssen zuerst serialisiert, d.h. in eine Datenfolge umgewandelt werden, die auf dem Server gespeichert werden kann. Wird die Information nun aus irgendeinem Grund noch einmal abgerufen, muss sie wieder zurückkonvertiert werden. Laufen mehrere solcher Prozesse simultan ab, kann ein Server in puncto Rechenzeit und Ressourcen schon mal an seine Grenzen kommen. Es empfiehlt sich daher, Datenbanken so zu modellieren, dass sie die Struktur der Daten logisch abbilden, und für den Zugriff auf die einzelnen Datensätze jeweils eigene Sitzungsvariablen zu definieren. Der Webserver kann dann sämtliche Daten an den Datenbankserver weitergeben und wird dadurch entlastet.
227
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Ein weiterer Variblentyp, der bei dynamischen Anwendungen zum Einsatz kommt, ist die so genannte Applikationsvariable. Dieser Typ von Variable wird für sämtliche Anwendersitzungen definiert und kann von der gesamten Webanwendung jederzeit abgerufen werden. Ähnlich globalen Variablen gelten Applikationsvariablen als wenig sinnvolles Konzept. Zur Erstellung interner Statistiken von Webanwendungen können sie jedoch recht nützlich sein. Über Session-IDs lassen sich Anwendersitzungen eindeutig identifizieren. Sie sind eine »Gedächtnisbrücke« für den Server, die ihm hilft, sich an bestimmte Werte wieder zu »erinnern«, die der Anwender während einer Session bereits eingegeben hat. Für den Programmierer heißt das, dass er lediglich eine ID von einer Seite zur nächsten übergeben muss, mehr nicht. Leider gibt's auch hier ein kleines Problem mit der Bookmark-Funktion des Browsers. Wird eine URL mit einer Session-ID in der URL als Lesezeichen abgespeichert, kann es – je nachdem, wie die Anwendung konfiguriert ist – zu Fehlermeldungen wie »session expired« oder nicht vorhersehbaren Fehlfunktionen kommen, wenn die Seite wieder aufgerufen wird. Die perfekte Lösung wäre, wenn man das Session-Management so handhaben könnte, dass man Variablen ohne spezielle Programmierung weitergeben kann und die Vorgänge für Anwender und Programmierer transparent sind. Und diese Möglichkeit gibt es: Cookies.
Cookies Cookies sind eine Möglichkeit, wie eine Webanwendung auf dem Clientrechner Informationen ablegen und wieder auslesen kann. Bei vielen Anwendern läuten beim Thema Cookies allerdings die Alarmglocken. Wenn Cookies auf meinem Rechner Daten ablegen können, wer garantiert mir dann, dass sie nicht irgendwelche unerwünschten Transaktionen vornehmen und Daten auf meinem Rechner zerstören? Nun, das ist schon der schlichten Dateigröße wegen nicht möglich. Cookies können gerade mal einige Tausend Bytes haben – was kaum ausreicht, um eine größere Menge an sinnvollen Informationen zu speichern, geschweige denn ganze Programme. Zudem werden Cookies in einer eigenen Datei gespeichert. Sie können diese Datei jederzeit öffnen und ihre Inhalte überschreiben oder löschen. Als Netscape-Anwender können Sie nach der Datei cookies.txt suchen, verwenden Sie den Internet Explorer, sehen Sie im Ordner Cookies im Windowsverzeichnis nach. Nachfolgend ein Ausschnitt aus meiner eigenen Cookie-Datei: #Netscape HTTP Cookie File #http://www.netscape.com/newsref/std/cookie_spec.html #This is a generated file!Do not edit.
228
Dynamische Sites verstehen
free.aol.com FALSE /tryaolfree FALSE 993674880 user 31031923 .excite.com TRUE / FALSE 1057815167 mesp_popup y2k%fDyes .excite.com TRUE / FALSE 1057815167 UID 9A7BF6F2Df023B94 .excite.com TRUE / FALSE 1057815167 registered no .doubleclick.net TRUE / FALSE 1920499223 id 8bccs8ce .deja.com TRUE / FALSE 1102550463 GTUID 04.48861.3.0.f.4363
Jede kommerzielle Website verwendet aus dem einen oder anderen Grund Cookies. Meine Cookie-Datei zählt momentan gut 400 Cookies, obwohl ich meistens technikorientierte Sites ansurfe und nichts online einkaufe. Ein weiterer Vorbehalt gegen Cookies ist, dass man mit ihrer Hilfe das Surfverhalten von Anwendern über mehrere Websites hinweg verfolgen kann. Für manche Sites ist das zwar richtig, aber nur, weil diese Sites untereinander kooperieren. Cookies sind so konzipiert, dass die darin gespeicherte Information nur von der Site ausgelesen werden kann, die das Cookie gesetzt hat. Damit soll Datenklau seitens anderer Webanwendungen verhindert werden. Für die einzelne Site ist es jedoch sehr wohl möglich, die Aktionen des Anwenders zu rekonstruieren. Und das ist ja genau das, was wir erreichen wollen: bestimmte Vorgänge auf der Website einem einzelnen Anwender zuordnen. Mithilfe von Cookies kann der Programmierer ohne besonderen Programmieraufwand Variablen setzen, auf die von jeder Seite der Website aus zugegriffen werden kann. Cookies werden mit einer Pfadangabe gesetzt. Seiten, die innerhalb dieses Pfades stehen, haben Zugriff auf das Cookie. Den folgenden Code schickt eine Website an den Browser mit der Anfrage, ob ein Cookie gesetzt werden darf: Set-Cookie: SESSION=3424; path=/shopping
Sobald das Cookie gesetzt ist, wird jedes Mal, wenn der Client eine URL anfordert, die innerhalb des Verzeichnisses »Shopping« steht, an den Server folgende Mitteilung geschickt: Cookie: SESSION=3424
Mit der Anweisung path=/ definiert die Webanwendung, wann und von welchen Seiten aus der Client die Cookie-Information an die Webanwendung zurückschickt. Wie sieht nun der typische Einsatz von Cookies in Webanwendungen aus? Sind sie ein »Speichermedium«, das sämtliche Informationen aufnimmt, die zwischen den einzelnen Seiten einer Webanwendung übergeben werden müssen? Das wird wohl nur in den seltensten Fällen so sein, wenn die Informationsmenge so gering ist, dass man diese Daten am besten direkt in ein Cookie schreibt. Arbeiten Webanwendungen mit Sitzungsvariablen, dienen Cookies gewöhnlich der Speicherung der vergebenen Session-IDs. Eine Frage wird zwangsläufig immer wieder gestellt: »Soll ich auf meiner Website mit Cookies arbeiten?« Ich persönlich halte Cookies für eine wunderbare Sache, um mit dem geringsten Programmieraufwand dem Besucher ein
229
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Höchstmaß an Anwendungsfreundlichkeit zu bieten. Wenn Sie Ihre Besucher darüber aufklären, warum und wie Sie Cookies einsetzen, dürfen Sie auch mit entsprechender Akzeptanz rechnen. Die Alternative zu Cookies wäre, mit Variablenübergabe zu arbeiten, eine in meinen Augen alles andere als verlockende Perspektive. Bei den verschiedenen Webanwendungen, die wir im Laufe dieses Buches noch gemeinsam entwickeln werden, werden wir jeweils die Techniken verwenden, die für den jeweiligen Zweck am sinnvollsten sind. Mit UltraDev können Sie beide Varianten des Session-Managements automatisieren. Das Programm erlaubt sowohl die Verwendung von Cookies als Art globaler Variable als auch die Übergabe von Variablen an die nächste Seite per Link.
6.3
Dynamische Websites kreieren
Die Entscheidung, ob und wann man eine Website um dynamische Funktionen erweitert, sollte nicht überstürzt getroffen werden. Ich habe Websites betreut, die aus den unterschiedlichsten Gründen als statische Websites konzipiert und umgesetzt wurden. Die monatliche Aktualisierung dieser Sites erfordert nun aber jedes Mal mehrere Arbeitsstunden, um alle betroffenen Seiten auf den neuesten Stand zu bringen. Je umfangreicher solche Sites mit der Zeit werden, desto aufwändiger wird es, sie zu warten, und umso größer werden die Schwierigkeiten, sie dynamisch an eine Datenbank anzubinden. Es empfiehlt sich dringend, für jede Website, die aus mehr als einem HTML-Dokument besteht, eine Sitemap anzulegen, auch wenn dies am Anfang völlig überflüssig erscheint. Eines vielleicht gar nicht so fernen Tages werden Sie ganz froh darüber sein.
Verschiedene Typen dynamischer Websites Wenn abzusehen ist, dass eine Website häufig aktualisiert werden muss, ist sie ein »Bilderbuchkandidat« für eine Datenbankanbindung. Dynamische Websites entlasten den Bearbeiter von der lästigen Pflicht, jedes Mal den gesamten HTML-Code aktualisieren zu müssen, wenn sich ein Inhalt ändert. Sie müssen nur einmal eine Dateneingabemaske erstellen, mit der sich dann ebenso leicht arbeiten lässt wie mit einer gewohnten OfficeAnwendung. Auch Sites, bei denen größere Mengen an Benutzerdaten anfallen, eignen sich gut zur Dynamisierung. Erstaunlich oft werden die Ergebnisse von Anwenderbefragungen und Kundenkommentare einfach als E-Mails zusammengefasst und an den Betreiber der Site weitergeleitet. Einige Hundert CGI-Applikationen sind in der Folge damit beschäftigt, diese per Formular gewonnenen Daten in lesbaren Text umzuwandeln und dann per
230
Dynamische Websites kreieren
E-Mail an ein Wesen aus Fleisch und Blut zur endgültigen Bearbeitung weiterzuleiten. Da ist es dann interessant zu hören, dass es eigens Programme gibt, die solche per Webanwendung generierten E-Mails zur leichteren Bearbeitung auf Empfängerseite aufbereiten und in Datenbanken speichern. Wäre es da nicht viel einfacher, diese Daten nicht gleich von Anfang an in einer Datenbank zu erfassen, anstatt den Umweg über Formular zu E-Mail und von E-Mail zu Datenbank zu gehen? Ähnlich verhielt es sich bei einigen großen kommerziellen Sites, an deren Redesign ich mitgearbeitet habe. Anfragen zu Produkten oder andere Daten, die ein Anwender in ein Formular auf der Website eingeben hatte, wurden per E-Mail an den Betreiber der Site weitergeleitet. Dort wurden die E-Mails vom Systemadministrator ausgedruckt und an die verschiedenen Kundenbetreuer zur endgültigen Bearbeitung weitergeleitet. Das ist eigentlich nicht die Art von Prozedere, an die man beim Wort E-Commerce denkt. Hier zeigte sich einmal mehr, wie schwierig es ist, bestimmte Praktiken wieder auszumerzen, wenn sie sich erst einmal eingeschliffen haben. Und schließlich eignen sich alle Websites zur Umstellung auf Datenbanken, die große Mengen von Information hosten (und die für den Anwender gut navigierbar gemacht werden sollen). Hat der Anwender z.B. die Möglichkeit, ganze Bücher zu durchsuchen und sich die Ergebnisse strukturiert anzeigen zu lassen, so ist dies für den Nutzwert natürlich unvergleichlich höher, als nur den reinen Text zur Verfügung zu stellen oder allgemeine Informationen über das Buch. Kann der Anwender seine Suchabfragen selbst definieren, wird eine Webdatenbank zu einem fantastischen Recherchewerkzeug.
Die Planung von dynamischen Websites Der erste Schritt zur Umsetzung einer dynamischen Website besteht in der gründlichen Planung. Wenn Sie schon im Vorfeld die richtigen Entscheidungen treffen, kann Ihnen das später so manches graue Haar ersparen – es ist nämlich alles andere als leicht, eine bis dato statische Website datenbankgerecht aufzubereiten. Tatsächlich können Sie sich gar nichts Schlimmeres antun, als eine Website zunächst statisch anzulegen und sich dann im Nachhinein doch dafür zu entscheiden, die Site an eine Datenbank anzubinden. Je umfangreicher und vielschichtiger eine Site wird, desto stärker sind HTML-Code und Inhalt ineinander verzahnt. In solchen Fällen lässt sich der Übergang von der statischen Website zur dynamischen Webanwendung meistens nur durch völlige Neugestaltung bewältigen. Nachfolgend wird auf die einzelnen Planungsschritte eingegangen.
Eine Sitemap anlegen Erstellen Sie eine detaillierte Sitemap der Website mit allen Bereichen und einer kurzen Beschreibung der Inhalte, die unter diesen Bereichen liegen. Die Sitemap ist das A und O bei der Planung und Umsetzung einer jeden Website, und für dynamische Websites gilt
231
Einführung in dynamische Webanwendungen und Datenbankentwicklung
das noch in weit höherem Maße. Wenn Sie sämtliche Seiten und ihre wechselseitigen Bezüge in einem klaren Struktogramm erfassen, können Sie damit auch gut die Beziehungen erkennen, die zwischen den Daten dieser Seiten bestehen.
Mehrfach vorhandene Informationen ermitteln Stellen Sie fest, ob und welche Informationen in den jeweiligen Bereichen mehrfach vorhanden sind. Häufen sich solche Elemente oder sind sie sehr umfangreich, kann man sie in einer Datenbank ablegen. Bei der Identifizierung solcher Elemente sollten Sie natürlich den gesunden Menschenverstand walten lassen. Nur weil das Wörtchen »der« 19 Mal auf einer Seite vorkommt, sollten Sie es nicht bei jedem Auftreten aus der Datenbank abrufen. Adressen, Kontaktinformationen, Telefonnummern u.ä. – das sind unsere Kandidaten, die sich zur Aufnahme in die Datenbank empfehlen.
Auf Listen überprüfen Überprüfen Sie, ob es irgendwelche Listen mit Informationen gibt, die mehr als einige wenige Einträge umfassen. Listen sind eigentlich schon eine Art Datenbank, nur sind sie nicht in elektronischer Form gespeichert. Auf jeder Website gibt es z.B. Linklisten oder Listen von Presseberichten. Diese Listen werden meistens von Mitarbeitern der Firma gepflegt und nicht von der betreuenden Internetagentur. In den Firmen, mit denen ich zu tun hatte, erledigten das die PR- bzw. die Personalabteilung, die die neuen Daten dann an die Agentur weitergaben. Je länger die Liste war, desto häufiger waren auch doppelte Einträge.
Häufige Änderungen lokalisieren Finden Sie heraus, ob es auf den verschiedenen Seiten Elemente gibt, die häufig verändert oder aktualisiert werden müssen. Der »Lesetipp der Woche« oder ähnliche kurzfristig wechselnde Aufmacher lassen sich gut über eine Datenbank generieren. Ist die Werbeaktion abgelaufen, kann das Buch – um bei diesem Beispiel zu bleiben – in den Archivbereich der Site verschoben werden, sodass sich Interessenten auch später noch über diesen Titel informieren können. Das Wichtigste bei der Planung datenbankgestützter Websites ist der Grundsatz der Verhältnismäßigkeit. Es gibt keine unfehlbaren Gesetze, wann und unter welchen Umständen eine Website an eine Datenbank angebunden werden sollte oder nicht. Besteht Ihre Site nur aus zwei oder drei HTML-Dokumenten, lohnt es den Aufwand nicht, einen Datenbank- bzw. Anwendungsserver aufzusetzen, um sie ins Netz zu stellen. Bei so kleinen Sites ist manuelle Datenpflege das Mittel der Wahl. Als professioneller Webdesigner werden Sie allerdings von Kundenseite oft mit der Forderung konfrontiert, dass mit der erstellten Website kein hoher Wartungsaufwand verbunden
232
Datenbankentwurf
sein soll. Selbst in diesen Zeiten des Internetbooms möchten die Leute möglichst wenig mit HTML und allem, was damit zusammenhängt, zu tun haben. Die Einrichtung eines Datenbank-Backends ist in solchen Fällen die einfachste Lösung, die Informationen auf der Site von einer Anwendung aus zu verwalten. Der Kunde kann somit seine Website stets auf dem neuesten Stand halten, ohne an irgendeinem Punkt mit dem Code in Berührung zu kommen. Und schließlich gibt es noch die Leute, die einfach jeder Mode hinterher rennen. Und bei Websites geht der Trend augenblicklich weg von statischen und hin zu dynamischen, datenbankgestützten Anwendungen. In dieser Hinsicht habe ich durchaus schon einige unangenehme Erfahrungen gemacht. Manche Leute wollen einfach nicht einsehen, dass es Fälle gibt, in denen die damit verbundenen Nachteile in keinem Verhältnis zu den wenigen Vorteilen stehen. Statt einfach, um ein Beispiel zu nennen, ein paar Zeilen im HTML-Code anzupassen, muss man nun erst einmal die Datenbank nach dem zugehörigen Datensatz durchsuchen und ihn dann dort ändern. Datenbankgestützte Websites sind in manchen Fällen auch deshalb schwerer zu warten, weil sie, einmal abgesehen von zusätzlich erforderlichen Arbeitsschritten, auch höhere Anforderungen an das Know-how des Bearbeiters stellen. Mit einem UNIX-Zugang und einem einfachen Palm Pilot könnte ich mich auf nahezu jedem Server einloggen und Änderungen an einer Website durchführen. Liegen die Daten in einer Datenbank, dann geht das nicht mehr so leicht. Treffen Sie diesbezügliche Entscheidungen nur nach reiflicher Überlegung. Setzen Sie nicht irgendwelche Technologien ein, nur weil Ihnen jemand weismachen will, Sie müssten das tun. Vielleicht realisieren Sie eine statische Website und stellen später fest, dass Sie besser doch eine datenbankgestützte Anwendung erstellt hätten. Doch kann es Ihnen genauso gut passieren, dass Sie eine dynamische Website erstellen, die sich als statische Website besser und einfacher hätte pflegen lassen. Die Kunst besteht darin, den später möglicherweise entstehenden Schaden möglichst gering zu halten.
6.4
Datenbankentwurf
Doch bevor wir überhaupt eine datenbankgestützte Website ins Netz stellen können, brauchen wir erst einmal ein Datenbank-Backend, aus dem wir unsere Daten holen können. UltraDev liefert kein solches Backend und sucht auch keines für uns aus. Bevor wir also mit UltraDev dynamische Websites entwickeln können, müssen wir auf unserem Rechner zuerst einen Datenbankserver oder zumindest eine Datenbank wie z.B. MS Access installieren. Aber keine Bange, Sie erhalten später eine schrittweise Anleitung, wie Sie eine MySQL-Datenbank einrichten. Diese Datenbank ist für UNIX-Systeme als Freeware und für Windows NT-Rechner als Shareware erhältlich. Somit kann sie auf jeder beliebigen Plattform, eingeschlossen Mac OS X, eingesetzt werden, und das in vielen Fällen unentgeltlich.
233
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Bevor Sie eine Datenbank anlegen, sollten Sie über die Grundlagen des Datenbankenentwurfs Bescheid wissen. Leider ist es nicht damit getan, dass Sie ein paar Werte in eine Tabelle schreiben und das Ganze dann unter dem Namen Datenbank speichern. Zuerst müssen Sie sich eine Strategie überlegen, wie Sie Ihre Daten sinnvoll strukturieren, damit Sie mit der gespeicherten Information effektiv arbeiten können. Lassen Sie uns daher anhand eines Beispiels den Aufbau einer sauberen Datenstruktur nachvollziehen.
Terminologie der Datenmodellierung Wenn Sie eine Datenbank anlegen, sollten Sie auch die damit verbundene Terminologie kennen. Beginnen wir mit dem Wichtigsten: Was versteht man unter Normalisierung?
Normalisierung Unter Normalisierung versteht man den Prozess, eine Menge von Daten so weit zu reduzieren, dass sämtliche Redundanzen, also mehrfach vorhandene identische Datensätze, ausgeschlossen sind. Hierarchische Datenbanksysteme speichern mehr Daten, als tatsächlich erforderlich sind. Durch Normalisieren wird diese monolithische Datenstruktur heruntergebrochen in mehrere kleinere, besser handhabbare »Datenpakete«. Ziel der Normalisierung ist es, Redundanzen auszuschließen und die Aktualisierung des Datenbestands zu vereinfachen. Der Prozess der Normalisierung erfolgt in mehreren Schritten, wie wir heute noch sehen werden. Diese Schritte kann man als Etappen sehen, um die eine Datenmenge Zug um Zug der endgültigen Form zugeführt wird, die sie dann in der Datenbank haben wird.
Entitäten Entitäten sind so etwas wie ein Oberbegriff, unter dem wir spezielle Daten speichern. Praktisch sind sie gleichbedeutend mit den Tabellen in einer Datenbank. Tatsächlich benennt man die Tabellen einer Datenbank nach diesen aufgestellten Entitäten.
Attribute Entitäten setzen sich aus Attributen zusammen. In gewöhnliche Datenbanksprache übersetzt heißt das, dass Tabellen Felder enthalten. Ein Attribut ist ein Feld innerhalb einer Entität. Sie heißen Attribute, weil sie die Entität näher beschreiben. Die Entität Auto könnte z.B. die Attribute Jahr oder Farbe besitzen.
234
Datenbankentwurf
Identifikationsschlüssel Unter Identifikationsschlüssel versteht man ein Attribut oder eine Gruppe von Attributen, über die ein bestimmter Datensatz und nur dieser Datensatz eindeutig identifiziert werden kann. Für die Definition eines Identifikationsschlüssels gelten drei feste Vorschriften: 쐽
Der Identifikationsschlüssel muss eindeutig definiert sein und immer einen Wert haben. Er darf also nicht leer sein.
쐽
Identifikationsschlüssel dürfen in allen Datensätzen einer Entität jeweils nur einmal vorkommen. Sie dürfen nicht zwei Datensätze innerhalb einer Entität erzeugen, die denselben Identifikationsschlüssel haben. Wenn also zwei Personen denselben Namen haben, können Sie den Namen nicht als Identifikationsschlüssel verwenden.
쐽
Der Identifikationsschlüssel darf sich nicht ändern. Vielleicht scheint Ihnen das im Moment wenig einleuchtend, aber wir werden auf die Gründe hierfür noch eingehen. Veränderliche Werte eignen sich nicht als Identifikationsschlüssel einer Entität.
Beziehungen Beziehungen sind genau das, was sich im Namen ausdrückt – die Art und Weise der Verbindung, die zwischen zwei Informationen oder Datensätzen besteht. Folgende drei Arten oder Grade der Beziehung sind zwischen Entitäten möglich: 쐽
1:1 – Jeder Instanz einer Entität entspricht genau eine Instanz einer anderen Entität. Dieser Fall ist eher selten, denn 1:1-Beziehungen treten gewöhnlich nur innerhalb einer Entität auf und nicht zwischen zwei Entitäten.
쐽
1:n – Einer Instanz einer Entität entsprechen mehrere Instanzen einer anderen Entität. Die Entitäten Kurs und Raumnummer stehen in einer 1:n-Beziehung, denn von einem bestimmten Raum kann es nur eine Instanz geben, aber dieser Raum kann von mehreren Kursen benutzt werden. Die meisten Datensätze fallen unter diese Art von Beziehung.
쐽
m:n – Eine »Viele-zu-viele«-Beziehung. Mehrere Instanzen einer Entität stehen zu mehreren Instanzen einer anderen Entität in Beziehung. Sie dürfen keine m:n-Beziehungen schaffen, da sonst die Zuordnung von Daten zwischen den verschiedenen Entitäten nicht eindeutig ist. Sollte am Ende Ihrer Normalisierungsbemühungen eine m:n-Beziehung stehen, müssen Sie leider Ihre Datenstruktur noch einmal völlig überarbeiten.
235
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Beispiel für eine Normalisierung Nehmen wir an, Sie möchten eine Datenbank für eine Schule erstellen, die die folgenden Informationen enthält: 쐽
Dozent
쐽
Kurse
쐽
Teilnehmer
쐽
Raumnummern
Der erste Gedanke wäre vielleicht, nun die Datenbank auf der Basis einer einfachen Tabelle zu erstellen und in den Spalten Dozent, Kurse, Teilnehmer und Raumnummern die entsprechenden Informationen einzutragen. Wenn wir das mit ein paar einfachen Datensätzen durchspielen, sehen wir jedoch bald, wo bei diesem Datenmodell das Problem liegt. Werfen Sie einen Blick auf Tabelle 6.1. Name des Dozenten
Kurse
Teilnehmer
Raumnummern
Hr. Müller
Chemie I Chemie II
Franz Feinbein Lieschen Müller Otto Döderlein
112, 113
Hr. Müller
Mathematik I
Otto Döderlein Karl Kraut Rosie Rüstig
010, 314, 112
Fr. Meier
Psychologie im Alltag
Hans Holbein Anna Lieblich Susi Söhnlein
212, 112, 322
Tabelle 6.1: Tabellarische Aufbereitung der gewünschten Informationen
Wie Sie sehen, lassen sich mit dieser Tabelle die vorhandenen Daten zwar bequem erfassen, aber die Art der Erfassung macht sie nicht besonders tauglich für praktische Zwecke. Nehmen wir beispielsweise an, Sie möchten herausfinden, welche Kurse ein bestimmter Teilnehmer besucht. Dazu müssten Sie alle Dozenten durchgehen und die Spalte Teilnehmer überprüfen. Das ist in höchstem Maße Zeit raubend und ineffektiv. Um unser Suchverfahren optimieren zu können, müssen wir unseren Datenbestand normalisieren. Zu diesem Zweck werden wir uns heute mit der ersten, zweiten und dritten Normalform auseinander setzen. Es gibt zwar noch weitere Normalformen, doch die ersten drei sind die wichtigsten. Mit jedem Schritt wird ein höherer Grad der Normalisierung erreicht.
236
Datenbankentwurf
Erste Normalform Um Daten in eine Normalform zu bringen, muss man sie in Entitäten zusammenfassen. Wir beginnen mit der Entität Dozent, unter der wir die Attribute Namen der Dozenten, Kurse, Teilnehmer, Raumnummern ablegen. Abb. 6.1 zeigt die grafische Darstellung der Entität Dozent. Um unser Datenmaterial vollständig zu normalisieren, müssen wir unserem Datenbankmodell noch weitere Entitäten hinzufügen. Am Schluss wird es nicht mehr viel gemeinsam haben mit unserem momentanen Modell. Dozent Name des Dozenten unterrichtete Kurse Teilnehmer Raumnummern
Abbildung 6.1: Die Basisentität Dozent nach dem Ausgangsdatenmodell
Die erste Normalform verlangt, dass alle Entitäten eindeutig sein müssen und alle Attribute nur einfache Attributwerte aufweisen, also nicht mehrfach vorkommen dürfen. Um herauszufinden, ob sich Attribute wiederholen, überprüfen wir einfach, ob irgendwelche Attribute im Plural stehen. Und da haben wir gleich mehrfach Anlass, uns am Kopf zu kratzen: 쐽
Kurse
쐽
Teilnehmer
쐽
Raumnummern
All diese Attribute wiederholen sich und dürfen daher nicht in der Entität Dozent enthalten sein, wenn wir unsere Daten in die erste Normalform bringen wollen. Zu diesem Zweck müssen wir diese Attribute herunterbrechen und in ihrer eigenen Entitätentabelle erfassen. Ferner müssen wir überprüfen, ob alle Attribute in die kleinsten sinnvollen Entitäten aufgesplittet worden sind. So sollten Namen z.B. in Vornamen und Nachnamen aufgeteilt werden. Abb. 6.2 zeigt unsere neue Sammlung von Entitäten, die auch gleich um ein paar Attribute erweitert wurden. Wir haben jetzt also vier verschiedenen Tabellen: Dozent, Kurs, Teilnehmer, Raum. Und weil's grad so schön war, habe ich die Entitäten gleich um ein paar Attribute erweitert: Dozent – vname, nname, status, gehalt Kurs – bezeichnung, zeit, thema, level Teilnehmer – vname, nname, alter, level Raum – nummer, plaetze, einrichtung
237
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Dozent
Kurs
vname nname status gehalt
bezeichnung zeit thema level
Teilnehmer
Raum
vname nname alter level
nummer plaetze einrichtung
Abbildung 6.2: Sich wiederholende Attribute erhalten ihre eigene Tabelle.
Jede Entität ist nun eindeutig und enthält keine sich wiederholenden Attribute. Die Entitäten enthalten sich aber nur selbst und haben keine Beziehung zueinander. Somit können wir aus diesem Datenmodell immer nur die Informationen beziehen, die innerhalb einer Entität abgelegt sind. Damit hat dieses Modell allerdings keinen besonderen praktischen Wert für uns. Um nun die Daten zueinander in Beziehung zu setzen, brauchen wir Identifikationsschlüssel. Lassen Sie uns die einzelnen Entitäten der Reihe nach dahingehend untersuchen, was wir als Identifikationsschlüssel verwenden können. Die Entität »Dozent« muss irgendwie adressiert werden können. Der erste Gedanke wäre vielleicht, die Namen der Dozenten als Identifikationsschlüssel zu verwenden. Aber, so muss man sich fragen, ist dieser Wert immer eindeutig und unveränderlich? Da es sich um Personennamen handelt, muss diese Frage mit Nein beantwortet werden. Selbst wenn dieser Fall aller Wahrscheinlichkeit nach nie eintritt, darf die potenzielle Möglichkeit dennoch nicht gegeben sein, damit das Datenmodell korrekt ist. Aus diesem Grund müssen wir für die Entität Dozent einen eindeutigen Identifikationsschlüssel einführen. Wir tun das mit dem Attribut persNr, also einer Personalnummer. Das kann ein beliebiger Wert sein, solange er eindeutig ist. Die meisten Datenbanken verfügen über eine Autowert-Funktion, die an jeden neuen Datensatz automatisch eine neue Nummer vergibt, sodass die Datensätze fortlaufend durchgezählt werden. In Abb. 6.3 sehen Sie die normalisierte Form der Entität Dozent. Bei der grafischen Darstellung von Datenmodellen werden die Attribute, die als Identifikationsschlüssel dienen, in geeigneter Form optisch hervorgehoben. Die Entität Kurs ist ähnlich problematisch wie die Entität Dozent. Vermutlich werden mehrere Kurse mit derselben Bezeichnung angeboten und finden vielleicht sogar parallel statt. Also brauchen wir auch für die Entität Kurs einen Identifikationsschlüssel. Am leichtesten lösen wir dieses Problem, indem wir für jeden Kurs eine eigene Kursnummer vergeben. Da die meisten Kurse sowieso schon eine Nummer haben, brauchen wir uns hier nicht übermäßig verausgaben. Wenn Sie versuchen, einen Datenbestand zu normalisie-
238
Datenbankentwurf
ren, werden Sie auf Informationen stoßen, die Sie bei der Erstellung des Ausgangsdatenmodells zunächst außer Acht gelassen haben, oder auf andere Daten, die sich nun als plötzlich sehr nützlich erweisen und darum in die Datenbank aufgenommen werden sollten. Mit der Vergabe einer Kursnummer ist die Entität Kurs in der ersten Normalform, zu sehen in Abb. 6.4. Dozent persNr* vname nname status gehalt
Abbildung 6.3: Die Entität Dozent in der ersten Normalform
Kurs kursNr* vname nname zeit thema level
Abbildung 6.4: Die Entität Kurs wird über die Kursnummer eindeutig identifiziert.
In unserem Ausgangsdatenmodell waren die Kursteilnehmer nur »Menschen zweiter Klasse«, denn der einzige Weg, über die Teilnehmer etwas herauszufinden, führte über die Entität Dozent. Erfassen wir die Teilnehmer nun in einer eigenen Entität und damit in einer eigenen Tabelle, können wir mit jedem Datensatz noch zusätzliche Informationen speichern. Wie bei der Entität Dozent haben wir auch hier das Problem, dass Teilnehmer denselben Namen haben können, und die Wahrscheinlichkeit ist sogar größer, da es ja mehr Teilnehmer als Dozenten gibt. Wie bei den Dozenten vergeben wir auch für die Teilnehmer Nummern, um sie eindeutig identifizieren zu können. Heraus kommt die erste Normalform der Tabelle Teilnehmer, zu sehen in Abb. 6.5. Teilnehmer teilnNr* vname nname alter level
Abbildung 6.5: Wie bei der Entität Dozent können auch bei der Entität Teilnehmer Namen mehrfach vorkommen.
Die letzte Entität, die adressiert werden muss, ist die Entität Raum. Mit unserer gegenwärtigen Festlegung haben wir Glück. Da sich ein Raum über seine Raumnummer eindeutig von allen anderen Räumen des Gebäudes unterscheiden lässt, sind wir schon am Ziel unserer Bestrebungen. Sollte sich die Volkshochschule jedoch entschließen, ihre Kurse auf mehrere Veranstaltungsorte zu verteilen, bekämen wir Schwierigkeiten. Wir wollen es
239
Einführung in dynamische Webanwendungen und Datenbankentwicklung
aber heute nicht allzu schwer machen und gehen darum davon aus, dass alle Kurse im selben Gebäude stattfinden. Eine vielleicht nicht ganz realistische Annahme, darum können Sie im Übungsteil zu dieser Lektion das Datenmodell dahingehend anpassen, dass die Kurse auf mehrere Veranstaltungsorte verteilt werden. Die endgültige Form der Entität Raum sehen Sie in Abb. 6.6. Raum raumNr* plaetze einrichtung
Abbildung 6.6: Die Entität Raum ist bereits in der Normalform.
Nachdem alle Entitäten in die erste Normalform gebracht sind und eindeutige Identifikationsschlüssel besitzen, können wir daran gehen, die Beziehungen zwischen den einzelnen Entitäten zu definieren. So erhalten wir ein klareres grafisches Datenmodell und können eventuelle Inkonsistenzen besser lokalisieren. Nehmen wir zum Beispiel die Entitäten Kurs und Raum. Sehen Sie sich die verschiedenen Entitäten an und versuchen Sie, die einzelnen Entitäten mit dem Verb »hat« in Beziehung zu setzen. Im Falle von Kurs und Raum ergäbe das: »Jeder Kurs hat einen Raum«. Auf diesem Weg haben wir unsere erste Beziehung ermittelt. Nach unserem Datenmodell lassen sich die nachstehend aufgeführten Beziehungen ermitteln (grafisch dargestellt in Abb. 6.7): Raum raumNr* plaetze einrichtung
1 Kurs
∞ ∞
kursNr* zeit thema level
Dozent
∞
persNr* 1 vname nname status gehalt
∞ Teilnehmer teilNr* vname nname alter level
240
Abbildung 6.7: Die Beziehungen innerhalb unseres aktuellen Datenmodells. Nicht unproblematisch!
Datenbankentwurf
쐽
Raum/Kurs (1:n) – In einem Raum können mehrere Kurse stattfinden.
쐽
Dozent/Kurs (1:n) – Ein Dozent kann mehrere Kurse geben.
쐽
Teilnehmer/Kurs (m:n) – Ein Teilnehmer kann mehrere Kurse belegen. Ein Kurs
kann mehrere Teilnehmer haben. Mit der Teilnehmer/Kurs-Beziehung sind wir etwas in die Bredouille geraten. Es handelt sich hier um eine Viele-zu-viele-Beziehung, die wir in zwei getrennte Eins-zu-viele-Beziehungen aufbrechen müssen. Hierzu müssen wir eine dritte Entität einfügen, die zwischen den beiden anderen Entitäten sozusagen den Vermittler spielt. Diese neue Entität muss zu den beiden anderen Entitäten in einer 1:n-Beziehung stehen. Im Falle der Entitäten Teilnehmer und Kurs könnten wir die Entität Platznummer einführen und damit den Platz des Teilnehmers in einem bestimmten Kurs definieren. 쐽
쐽
Teilnehmer/Platznummer (1:n) – Ein Teilnehmer kann mehrere Platznummern in verschiedenen Kursen haben. Kurs/Platznummer (1:n) – Ein Kurs kann mehrere Platznummern für Teilnehmer ha-
ben. Raum raumNr* plaetze einrichtung
1
∞
Kurs
Dozent
kursNr* name zeit thema level
∞
persNr* 1 vname nname status gehalt
Abbildung 6.8: Alle Entitäten sind nun in die erste Normalform gebracht und über 1:n-Beziehungen miteinander verknüpft.
1
∞ Platznummer sitzNr*
∞ 1
Teilnehmer teilnNr* vname nname alter level
241
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Damit lösen wir unser m:n-Problem, denn ein Sitzplatz kann nicht von mehr als einem Teilnehmer gleichzeitig besetzt werden, noch können Sitzplätze von mehreren Kursen auf einmal belegt werden. Wir fügen die neue Entität mitsamt ihren Beziehungen in unser grafisches Datenmodell ein und erhalten das in Abb. 6.8 gezeigte Schema. Na, das war jetzt doch Einiges an Gehirnakrobatik. Sie fragen sich vielleicht, was der ganze Aufwand soll, nur um eine simple Datenbank zu entwerfen. Aber – so lehrt die Erfahrung – die Mühe, die Sie in die Entwurfsphase stecken, erspart Ihnen später Einiges an Zeit und Arbeit. Ohne Fleiß gibt's nun mal keinen Preis.
Die zweite Normalform Der Weg zur ersten Normalform war hie und da mit Steinen gepflastert. Im nächsten Schritt müssen wir die Entitäten in die zweite Normalform bringen. Um die Bedingungen für die zweite Normalform zu erfüllen, müssen die Entitäten in einer Form definiert werden, die ermöglicht, dass die einzelnen Attribute (mit Ausnahme des Identifikationsschlüssels) allein vom jeweiligen Identifikationsschlüssel abhängen. Kommen z.B. bestimmte Attribute in verschiedenen Datensätzen einer Entität mehrfach vor, sind also identisch, so sind sie nicht vollständig von einem Identifikationsschlüssel abhängig. Ein Weg, das herauszufinden, ist sich zu fragen: »Wenn sich ein Datum in diesem Datensatz ändert, muss ich es dann in anderen Datensätzen dieser Entität ebenfalls ändern?« Überprüfen Sie unter diesem Gesichtspunkt die verschiedenen Attribute der Entitäten, die wir in unserem Datenmodell aufgestellt haben. In allen Fällen sind sämtliche Attribute von einem Identifikationsschlüssel abhängig. Jeder Datensatz einer Entität kommt nur einmal vor.
Die dritte Normalform Bringt man Daten in die zweite oder dritte Normalform, stößt man immer wieder mal auf Daten, die noch nicht in das Datenmodell integriert sind. Die dritte Normalform bietet weniger Verständnisschwierigkeiten als die zweite. Um die Bedingungen für die dritte Normalform zu erfüllen, muss die Entität bereits in die zweite Normalform gebracht sein und darf keine Attribute enthalten, die in irgendeiner Form voneinander abhängig sind (mit Ausnahme vom ID-Schlüssel). Solche Fälle lassen sich gewöhnlich leicht einkreisen. So gibt es z.B. bei unserer Entität Kurs eindeutig Probleme mit der dritten Normalform. Die Entität Kurs hat die Attribute Name und Thema. Diese beiden Attribute hängen offensichtlich zusammen, also müssen wir die Entität modifizieren, um sie in die dritte Normalform zu bringen. Zu diesem Zweck führen wir eine neue Entität Thema ein, die den Namen des Kurses und sein Thema aufnimmt. Da mehrere Kurse dieselbe Bezeichnung und dasselbe Thema haben können, besteht zwischen Thema und Kurs eine 1:n-Beziehung. Abb. 6.9 zeigt das endgültige Datenmodell.
242
Datenbankentwurf
Unser Datenmodell umfasst nun die folgenden Entitäten: 쐽
Dozent – persNr, vname, nname, status, gehalt
쐽
Kurs – kursNr, zeit, level
쐽
Thema – name, thema
쐽
Teilnehmer – teilnNr, vname, nname, alter, level
쐽
Platznummer – sitzNr
쐽
Raum – raumNr, plaetze, einrichtung
Diese Entitäten und die Beziehungen, die zwischen ihnen bestehen, sind alles, was Sie brauchen, um Datenbanken für dynamische Websites anzulegen.
Vom Entwurf zur Datenbank Haben wir unser Datenbankmodell auf dem Papier konzipiert, ist die Datenbank selbst damit noch nicht vollständig definiert. Wir müssen unsere Informationen noch irgendwie aufbereiten, um die physikalische Datenbankstruktur anlegen zu können. Diese Struktur ist den Entitäten nicht unähnlich, die wir definiert haben, aber wir müssen noch Mittel und Wege finden, wie wir die Beziehungen zwischen ihnen beschreiben. Die Definition mehrerer Tabellen mit den gewählten Attributen reicht offensichtlich nicht aus, um diese Tabellen untereinander zu verknüpfen. Hierzu müssen wir uns noch mit dem Konzept der Schlüssel auseinander setzen.
Datenschlüssel definieren Um unser Datenbankmodell zu komplettieren, brauchen wir noch so genannte Schlüssel, von denen es zwei verschiedene Typen gibt. Der erste ist der so genannte Primärschlüssel, den wir schon kennen gelernt haben, als wir den Identifikationsschlüssel der einzelnen Entitäten definiert haben. Über den Primärschlüssel kann das Datenbanksystem Datensätze eindeutig erkennen. Mit der Definition eines eigenen Schlüssels für jeden Datensatz haben wir eigentlich nichts anderes getan, als jeder Entität ein weiteres, eindeutiges Feld hinzuzufügen. Es wäre aber auch eine andere Vorgehensweise denkbar, vor allem dann, wenn eine Entität auf der »n-Seite« einer 1:n-Beziehung steht. Man kann nämlich verschiedene Attribute einer Entität sozusagen gruppieren und als Primärschlüssel definieren. Ein Beispiel: Der Nachname einer Person kann mehrfach vorkommen und ist daher kein eindeutiges Merkmal, könnte es aber in Verbindung mit anderen Attributen werden. So ist es höchst unwahrscheinlich, dass der Name einer Person in Kombination mit Anschrift und Geburtsdatum nicht eindeutig ist.
243
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Raum raumNr* plaetze einrichtung
1
∞
Thema
Kurs
tname* thema
kursNr* zeit level
1
∞
Dozent
∞
persNr* 1 vname nname status gehalt
1
∞
Platznummer sitzNr*
∞ 1 Teilnehmer teilnNr* vname nname alter level
Abbildung 6.9: Nun ist unser Datenmodell in der dritten Normalform.
Primärschlüssel haben wir also schon verwendet und sie stellen auch kein Verständnisproblem dar. Die zweite Art von Schlüssel, die wir brauchen, ist der so genannte Fremdschlüssel. Mit ihm kommt Bewegung in unsere träge Datenmasse, denn er definiert die Beziehungen zwischen den verschiedenen Entitäten. Der Fremdschlüssel ist nichts anderes als der in einer Entität gespeicherte Primärschlüssel einer anderen Entität. Er macht die Beziehung zwischen diesen beiden Entitäten sozusagen amtlich. Für alle Beziehungen muss auf der »n-Seite« einer Beziehung ein Fremdschlüssel festgelegt werden. Für unser Datenmodell haben wir die folgenden Beziehungen definiert: 쐽
Raum/Kurs (1:n) – In einem Raum können mehrere unterschiedliche Kurse stattfinden.
쐽
Dozent/Kurs (1:n) – Ein Dozent kann mehrere Kurse geben.
쐽
Teilnehmer/Platznummer (1:n) – Ein Teilnehmer kann mehrere Platznummern haben.
244
Datenbankentwurf
쐽
Kurs/Platznummer (1:n) – Ein Kurs hat mehrere Plätze für Teilnehmer.
쐽
Thema/Kurs (1:n) – Ein Thema kann in mehreren Kursen behandelt werden.
In all diesen Fällen muss die »n-Seite« den Primärschlüssel der »1-Seite« erben. Wird ein Primärschlüssel in einer anderen Tabelle gespeichert als in der, in der er definiert wurde, spricht man von ihm als Fremdschlüssel. So müssen wir z.B. in der Entität Kurs das Attribut Raumnummer mit speichern, das wir von der Entität Raum übernehmen. Damit werden die 1:n-Beziehungen der Entität komplettiert. Diesen Schritt müssen wir für alle anderen Entitäten ebenfalls durchführen. Wenn Sie möchten, können Sie das jetzt durchspielen. Abb. 6.10 zeigt das endgültige grafische Modell unserer Datenstruktur. An diesem Punkt haben wir die Daten so weit geordnet, dass wir sie als saubere SQL-Datenbank anlegen können. Raum raumNr* plaetze einrichtung
Thema tname* thema
1
Kurs 1
1
∞
kursNr* raumNr tname persNr level
Dozent
∞ ∞
1
persNr* vname nname status gehalt
Platznummer
∞
sitzNr* kursNr teilnNr
∞
Teilnehmer teilnNr* vname nname alter level
1
Abbildung 6.10: Das endgültige Datenbankmodell
245
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Die fertige SQL-Datenbank In einer späteren Lektion (Tag 12, »Komplexe Datenbankabfragen«) werden Sie etwas über die Datenbank-Abfragesprache SQL lernen. Im Moment wollen wir uns mit einem Blick darauf begnügen, wie unser Datenbankmodell in SQL aussieht. Die Entitäten unseres Modells bilden die Tabellen der Datenbank, die einzelnen Attribute werden zu den Feldern der Tabelle. Es dürfte nicht schwer fallen, die Bezüge zwischen Modell und SQL nachzuvollziehen. create table raumTbl ( raumNr int not null, plaetze int, einrichtung varchar(50), primary key (raumNr) ) create table dozentTbl ( persNr int not null, vname varchar(25), nname varchar(25), status varchar(50), gehalt int, primary key (persNr) ) create table kursTbl ( kursNr int not null, thema varchar(50), persNr int, raumNr int, time time, level int, primary key (kursNr) ) create table themaTbl ( name varchar(50) not null, thema varchar(250), primary key (name) ) create table teilnTbl ( teilnNr int not null, vname varchar(25), nname varchar(25), alter int, level int, primary key (teilnNr) ) create table platznrTbl (
246
Zusammenfassung
sitzNr int not null, teilnNr int, kursNr int, primary key (sitzNr) )
Im Grunde ist daran nichts Geheimnisvolles. Interessant ist ein Vergleich des endgültigen Datenbankmodells mit unserem Ausgangsmodell. Statt einer einzigen Tabelle mit einem Wust von teils redundanten Daten haben wir nun ein logisch strukturiertes Modell von sechs Tabellen.
6.5
Zusammenfassung
Um dynamische, datenbankgestützte Websites zu erzeugen braucht es etwas mehr als nur UltraDev zu öffnen und dann einfach loszulegen. Sie sollten reichlich Zeit auf die Planungsphase verwenden. Es ist effektiver, zunächst einmal auf einem Blatt Papier die komplette Datenbankstruktur zu entwerfen, statt gleich am Programmcode zu stricken und dann festzustellen, dass man die Datenbank nochmal völlig neu konzipieren muss. Bestimmte HTML-Dokumente lassen sich besonders gut dynamisch machen: 쐽
Listen – Einträge in Listen lassen sich gut aus einer Datenbank beziehen und als Tabelle darstellen.
쐽
Mehrfach verwendete Informationen – Bestimmte Informationen, die auf mehreren Seiten verwendet werden, können ebenfalls in einer Datenbank abgelegt werden. So hat man leichten Zugriff darauf und kann sie ohne großen Aufwand aktualisieren.
쐽
Informationen, die häufig aktualisiert werden müssen – Für Informationen, die häufig ausgetauscht oder geändert werden müssen, empfiehlt sich ebenfalls der Einsatz einer Datenbank. Mit einer eigens erstellten Eingabemaske lassen sich diese Informationen leicht auf den neuesten Stand bringen.
Eine Sitemap zu zeichnen und die künftige Site auf diese drei Kategorien hin zu überprüfen sind die ersten Schritte in der erfolgreichen Planung einer dynamischen Webanwendung. Haben Sie alle Informationen vorliegen, die Sie zur Erstellung einer Site benötigen, können Sie ein Datenmodell entwerfen. Das Verfahren, mit dem das Datenmodell um redundante Daten bereinigt wird, bezeichnet man als Normalisierung. Es gibt drei Normalisierungsschritte, die man einhalten sollte, damit das Datenmodell problemlos in eine tatsächliche Datenbank übersetzt werden kann.
247
Einführung in dynamische Webanwendungen und Datenbankentwicklung
Die erste Normalform definiert die Entitäten, mit denen das Modell arbeitet, sowie die entsprechenden Attribute. Damit wird ferner sichergestellt, dass die Attribute nur einmal vorkommen und sich wiederholende Attribute in einer eigenen Tabelle abgelegt werden. Sind die Entitäten definiert, muss geklärt werden, welche Beziehungen zwischen ihnen bestehen. Beziehungen werden graduell eingestuft: 1:1, 1:n, m:n. Die zweite Normalform setzt voraus, dass die Daten bereits in die erste Normalform gebracht sind. Ferner dürfen Attribute ausschließlich vom Identifikationsschlüssel des jeweiligen Datensatzes abhängig sein. Für die dritte Normalform müssen die Entitäten in der zweiten Normalform vorliegen. Zusätzlich muss eine weitere Anforderung erfüllt sein. Hängen Attribute nicht ausschließlich vom Identifikationsschlüssel, sondern von anderen Attributen ab, müssen sie in einer eigenen Tabelle abgelegt werden, damit die Bedingungen für die dritte Normalform erfüllt sind. Der letzte Schritt im Datenbankentwurf besteht in der Anlage der Datenbankstruktur selbst. Die Struktur der Datenbank beruht auf dem fertig ausgearbeiteten Datenbankmodell, muss aber noch um die Informationen ergänzt werden, in welcher Beziehung die Entitäten zueinander stehen.
6.6 F
Was ist der Hauptgrund für den Einsatz von datenbankgestützten Websites? A
F
Vielleicht wundern Sie sich, wieso eine datenbankgestützte Website »pflegeleichter« sein soll als eine auf reinem HTML-Code basierende Site. Wenn Sie eine Datenbank wie MS Access verwenden oder eine Programmiersprache wie RealBASIC, können Sie eine Eingabemaske erstellen, die genauso leicht zu bedienen ist wie eine beliebige Office-Anwendung.
Kann ich Datenbanken auch erstellen, ohne die Daten vorher zu normalisieren? A
248
Das Hauptargument für eine Datenbankanbindung ist die Effizienz. Allzu oft ist das Argument für den Einsatz einer bestimmten Technologie die bloße Verfügbarkeit, nicht tatsächliche praktische Erfordernisse oder Notwendigkeiten. Sie sollten Datenbanken nur dann einsetzen, wenn es die Website um sinnvolle Funktionen bereichert und die Betreuung vereinfacht – nicht, weil es gerade »hipp« ist.
Wie kann man mit einer Datenbank eine leichter bedienbare Oberfläche für eine Webseite erstellen, als das mit HTML-Mitteln möglich wäre? A
F
Fragen und Antworten
Das geht zwar, aber ich würde es nicht empfehlen. Die Normalisierung von Daten führt zu einem effizienten Datenmodell ohne Redundanzen. In manchen Fällen ist ein gewisses Maß an Redundanz vertretbar, und Sie können auf den Prozess der
Workshop
Normalisierung verzichten. Wollen Sie aber professionelle Sites erstellen, möchte ich Ihnen dringend raten, sich die Zeit zu nehmen und die Daten sauber zu normalisieren. F
Mit welchen Problemen muss ich rechnen, wenn ich Daten nicht normalisiere? A
6.7
In diesem Fall müssen Sie damit rechnen, dass Sie wirklich viel Zeit damit aufwenden müssen, um Ihren Datenbestand zu aktualisieren. Nicht normalisierte Datenbanken weisen Redundanzen auf. Somit ist es unmöglich, exakte Suchabfragen zu formulieren. Eine Aktualisierung ist ebenfalls sehr aufwändig, da Sie pro Änderung immer mehrere Datensätze aktualisieren müssen. Bei fünf oder sechs Datensätzen ist das noch kein Problem. Aber, wie Sie sich vorstellen können, wächst die benötigte Zeit mit der Anzahl der Datensätze.
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Welche Teile einer Website lassen sich am besten dynamisieren? 2. Was bewirkt die Normalisierung einer Datenbank? 3. Was ist die erste Normalform? 4. Was ist die zweite Normalform? 5. Was ist die dritte Normalform? 6. Was versteht man unter einem Primärschlüssel? 7. Was versteht man unter einem Fremdschlüssel?
Übungen 1. Zeichnen Sie Sitemaps von Sites, die Sie erstellt haben oder erstellen wollen. Welche Bereiche ließen sich mit Datenbankanbindung effizienter gestalten? Konzentrieren Sie sich dabei nicht nur auf solch offensichtliche Punkte wie Personaldaten oder Videoarchive. Suchen Sie nach Informationen, die sich zur Manipulation per Datenbank anbieten.
249
Einführung in dynamische Webanwendungen und Datenbankentwicklung
2. Erstellen Sie ein Datenmodell für einen Spielzeugladen mit den Daten aus Tabelle 6.2 und bringen Sie sie in die dritte Normalform. Der Spielzeugladen möchte diese Datenbank für Mailingaktionen verwenden und Kunden anschreiben, die ähnliche Artikel bereits gekauft haben. Artikel
Preis
Käufer
Kategorie
Riesen-Rad
320,00 DM
Lisa Fröhlich, Heinz Kopf, Emma Maier
Räder, Kleinkinder
Toller Flieger
75,00 DM
Emma Maier, Jule Huber, Sven Moser
Jugendliche, Flugzeuge
Murmeln
5,00 DM
Kurt Knobel, Paul Grüblein, Susi Sommer
Kleinkinder, Jugendliche, Erwachsene, Diverses
Tabelle 6.2: Schreiben Sie ein normalisiertes Datenmodell für diesen Spielzeugladen
250
Die unterstützten Skriptsprachen verstehen
7
Die unterstützten Skriptsprachen verstehen
Was tun Sie, wenn Sie noch keinen eigenen Webserver installiert haben und auch sonst keinen Zugriff auf einen Server haben? UltraDev unterstützt drei verschiedene Skriptsprachen (dreieinhalb, um genau zu sein). Wenn Sie kein genaues Verständnis davon haben, was diese Sprachen tun und wo bzw. wie Sie sie einsetzen können, werden Sie eine Bruchlandung erleiden, bevor Sie überhaupt gestartet sind. Um es aber erst gar nicht so weit kommen zu lassen, lernen Sie heute, 쐽
welche Skriptsprachen von UltraDev unterstützt werden und welche Konsequenzen eine Entscheidung für die jeweilige Sprache hat;
쐽
welche Servertypen die gewählte Skriptsprache unterstützen;
쐽
wie der Sourcecode der jeweiligen Skriptsprachen zu lesen und zu interpretieren ist. Dieser Teil ist nicht die ultimative Einführung ins Programmieren, aber danach sollten Sie sich im Programmcode besser zurecht finden können.
7.1
Skriptsprachen in UltraDev
Wenn Sie mit UltraDev das erste Mal eine Live-Data-Verbindung für Ihre Website einrichten, müssen Sie sich entscheiden, in welcher Sprache der erforderliche Sourcecode geschrieben werden soll. Doch das ist Stoff für unsere morgige Lektion. Heute erarbeiten wir uns das Wissen, das uns die morgigen Entscheidungen erleichtert. Wie in Abb. 7.1 zu sehen, werden verschiedene Servermodelle unterstützt: 쐽
ASP (VBScript) – Das Servermodell Active Server Pages mit der Standard-Skriptsprache VBScript.
쐽
ASP (JavaScript) – Das Servermodell Active Server Pages mit der Standard-Skriptsprache JavaScript.
쐽
JSP – Java Server Pages. Java Server Pages werden unter Verwendung von eingebettetem Java-Code (nicht JavaScript) erzeugt.
쐽
CFML – Cold Fusion Markup Language. Die Cold Fusion Markup Language ist keine Programmiersprache im eigentlichen Sinn, vereinfacht aber die Erstellung von Webapplikationen erheblich.
Es gibt wie gesagt vier verschiedene Skriptsprachen und drei verschiedene Servermodelle zur Auswahl. Welche eignet sich nun am besten für Ihre Applikation, was ist langfristig die beste Investition? Wofür soll man sich entscheiden, wenn man noch nach allen Seiten offen ist?
252
Skriptsprachen in UltraDev
Abbildung 7.1: UltraDev unterstützt drei verschiedene Servermodelle und vier verschiedene Skriptsprachen.
Die Projekte in diesem Buch wurden unter Verwendung von Active Server Pages als Serverplattform realisiert. Der den Beispielen beigegebene Code wurde also mit Active Server Pages erzeugt, doch sollte es Ihnen nicht schwer fallen, diese Applikationen so anzupassen, dass sie auch auf anderen Serverplattformen lauffähig sind – vor allem nach der Lektüre dieses Kapitels.
Active Server Pages Active Server Pages sind eine Microsoft-Entwicklung und eine der ersten Technologien überhaupt, die die Programmierung mit eingebetteten Skriptsprachen ermöglicht. Statt wie üblich eine externe Anwendung zu schreiben und von diesem Programm dann den erforderlichen HTML-Code erzeugen zu lassen, können Sie das Programm direkt in den HTML-Code einbetten. Das ASP-Modell ist insofern etwas verwirrend, da es sich hierbei um keine Programmiersprache im eigentlichen Sinn handelt, sondern um ein Set von Technologien, die in Verbindung mit verschiedenen Programmiersprachen funktionieren. Unklar? Dann versuchen wir es mal so herum: Eingebettete Skriptsprachen machen es möglich, Informationen aus Datenbanken auszulesen bzw. dort abzulegen, Cookies zu speichern usw. Das ASP-Modell stellt für all diese Funktionen vordefinierte Routinen zur Verfügung, die von jeder Programmiersprache
253
Die unterstützten Skriptsprachen verstehen
genützt werden können, die Active Server Pages unterstützen. Sie könnten sich z.B. Perl herunterladen und als ASP-Sprache installieren. Allerdings wird Perl als Skriptsprache für Active Server Pages von UltraDev nicht unterstützt. Das Haupt-Handicap von Active Server Pages ist, dass es sich hierbei um eine proprietäre Technologie handelt und nur für zwei Plattformen verfügbar ist. Wenn Sie MS Windows installiert haben, können Sie sich den Personal Web Server (PWS) herunterladen und die ASP-Komponenten installieren. Allerdings ist das nicht die ideale Plattform, denn sie ist mehr als langsam. Während der Arbeit an diesem Buch wollte ich den PWS eigentlich unter Windows ME auf einem 750-MHz-Athlon betreiben. Da ich aber jedes Mal gut 10 Sekunden warten musste, bis die Seite generiert war, gab ich dieses Vorhaben auf und zog auf einen NT 4.0-Server um, der eine wesentlich bessere Performance bietet. Hier liegt das Problem von Active Server Pages. Um damit zu arbeiten, sind Sie an die verschiedenen Microsoft-Plattformen gebunden. Und für Mac-User bzw. Open-Source-Jünger dürften diese Plattformen wahrscheinlich nicht zur ersten Wahl gehören. Doch zum Glück gibt es für alle Probleme eine Lösung. Wenn Sie Active Server Pages einsetzen müssen, aber nicht auf Windows NT/2000 arbeiten, können Sie ein Produkt namens ChiliSoft verwenden. Damit werden Active Server Pages auf verschiedenen UNIXDerivaten lauffähig, unter anderem Solaris und Linux. Der Haken an der Sache ist, dass die Anschaffungskosten für eine UNIX-basierte ASPLösung weit über denen für die NT-Plattform liegen. Sie können sich Testversionen und weitergehende Produktinformationen unter folgender Adresse herunterladen: http://www.chilisoft.com/
Das ist sicher eine gangbare Möglichkeit, hat aber ihre Haken und Ösen. Für den Einsteiger empfiehlt es sich, Servermodell und Skriptsprachen nach den Vorteilen auszusuchen, die sie ihm bieten. Das ASP-Modell ist eine sehr flexible Entwicklungsplattform und bietet einiges an Funktionalität. Als Skriptsprache kommt gewöhnlich VBScript zum Einsatz, allerdings wird manchmal auch JavaScript verwendet. VBScript ist leicht zu lernen, wird aber von vielen als nicht besonders leistungsfähige Programmiersprache angesehen. Gestandene C-Programmierer finden es meist unter ihrer Würde, sich plötzlich wieder mit BASIC abzugeben. Die zweite Möglichkeit, JavaScript, gilt zwar als etwas salonfähiger, hat aber nicht ganz den Chic und die Power »angesagter« Sprachen wie z.B. Java.
254
Skriptsprachen in UltraDev
Java Server Pages Java Server Pages oder JSP ist eine relativ junge Technologie der eingebetteten Programmierung. JSP setzen auf einem Java-Servlet-Modul (auch als Servlet Engine bezeichnet) auf, das seinerseits auf Java basiert. Java-Servlets entsprangen dem Bedürfnis, für Java-Umgebungen ein Java-basiertes Äquivalent zu den traditionellen CGI-Scripts zu schaffen. Ein Servlet ist ein kompiliertes Java-Programm, mit dem sich verschiedene Aufgaben erledigen lassen wie die Erzeugung von HTML-Dokumenten oder die Verarbeitung von Anwendereingaben usw. Servlets halten sich vollständig an den Java-Standard, arbeiten jedoch mit speziellen Klassen zur Erzeugung von dynamischen Webapplikationen. Sie können zwar HTML-Code in ein Servlet einbetten, jedoch kein Servlet in ein HTMLDokument. Um diese Einschränkung zu umgehen, wurden Servlets zu Java Server Pages weiterentwickelt. JSP sind ein Mittel, Java-Code in HTML-Dokumente einzubinden. Was das Ganze noch interessanter macht, ist die Tatsache, dass die JSP-Technologie Java Server Pages vor ihrer Ausführung als Servlet kompiliert. Aber keine Angst, das sind Dinge, die Sie gar nicht wissen müssen, wenn Sie mit JSP arbeiten – die erforderlichen Schritte laufen automatisch auf dem Server ab. Vielleicht erhebt sich nun von der einen oder anderen Seite der Einwand, dass dieser Umwandlungsprozess von JSP zu Servlet zu Performance-Einbußen führt, darum will ich näher darauf eingehen. Wenn eine JSP in ein Servlet übersetzt wird, bleibt das Servlet im Server-Cache gespeichert. Erst wenn die JSP modifiziert wird, wird entsprechend ein neues Servlet erzeugt. Beim ersten Aufruf einer Seite kann es vielleicht zu gewissen Verzögerungen kommen, aber es gibt keinen Grund, sich hinsichtlich der Geschwindigkeit Sorgen zu machen. Einer der Vorzüge von JSP ist, dass es sich um Java pur handelt. Alles, was mit Java realisierbar ist (mit der Ausnahme von grafischen Benutzerschnittstellen), ist auch mit JSP machbar. Das heißt, dass Sie als Java-Programmierer sofort in die Erstellung von JSP einsteigen können. Java ist eine moderne Programmiersprache, die in den letzten Jahren zunehmend an Bedeutung gewonnen und andere Programmiersprachen verdrängt hat. Es gibt auch keine Anzeichen, dass sich daran in nächster Zukunft etwas ändern wird. Java hat auch den Vorzug, vollständig plattformübergreifend und an kein spezielles Betriebssystem gebunden zu sein. Java Server Pages sind ohne Anpassung oder Änderung am Code auf jedem Webserver lauffähig, der JSP unterstützt. Das gilt für sämtliche Bereiche der Seitenerstellung einschließlich Datenbankzugriff. JDBC-Datenbanktreiber können mit nur einer einzigen Treiberdatei auf diverse Datenbanken zuzugreifen. Kopieren Sie den JDBC-Treiber auf einen anderen JSP-Server und eine völlig andere Plattform: Er wird dort genauso funktionieren.
255
Die unterstützten Skriptsprachen verstehen
Der Einsatz von JSP-Anwendungen gestaltet sich etwas flexibler als die Verwendung von ASP- oder ColdFusion-Applikationen. Die JSP-Technologie steht zudem völlig unentgeltlich zur Verfügung. Die Apache Group hat z.B. einen Open-Source-JSP-Server implementiert, der unentgeltlich heruntergeladen werden kann. Dieser Server trägt den Namen Tomcat und wurde vom Apache-Jakarta-Projekt entwickelt. Die JSP-1.1-Spezifikationen wurden vollständig implementiert. Tomcat erfreut sich großer Beliebtheit und entwickelt sich zum meistverwendeten JSP-Server. Wenn Sie in die Entwicklung von JSP-Seiten einsteigen möchten, können Sie sich Tomcat von der Website des Jakarta-Projekts bei Apache herunterladen: http:://jakarta.apache.org/
Da an Tomcat noch fleißig entwickelt wird, müssen Sie ein paar Nachteile in Kauf nehmen – die gewichtigsten sind die mehr als unvollständige Dokumentierung und der wenig anwenderfreundliche Installationsprozess. Wenn Sie mit diesem Manko leben können, werden Sie feststellen, dass Tomcat eine universell einsetzbare Produktionsplattform ist, die auf jedem Betriebssystem lauffähig ist, das JSP unterstützt – von Windows 2000/NT bis zu Mac OS X. Wenn Sie lieber auf kommerzielle Software zurückgreifen, können Sie Ihren Anforderungen entsprechend zwischen mehreren Produkten auswählen. Für Windows und UNIX sind mehrere JSP-Server verfügbar, nachfolgend eine subjektive Auswahl: 쐽
Allaire Jrun – http://www.allaire.com/
쐽
Oracle 8i Jserver – http://www.oracle.com/
쐽
IBM WebSphere Application Server – http://www.software.ibm.com/
쐽
iPlanet Web Server – http://www.iplanet.com/
쐽
Silverstream Application Server – http://www.silverstream.com/
Beim Einsatz von JSP-Servern sind hohe Zuwachsraten zu verzeichnen. Informationen über den neuesten Entwicklungsstand bei JSP-Servern finden Sie auf der Website von Sun unter http://java.sun.com/products/jsp/industry.html
Alle ColdFusion-Jünger seien auf den ersten Hersteller in obiger Liste hingewiesen. Dieselbe Firma, die die ColdFusion-Linie entwickelt und vertreibt, hat ihren eigenen (sehr guten) JSP-Server im Programm. Wenn das kein Indiz für die Leistungsfähigkeit der JSP als Produktionsplattform ist, dann weiß ich es auch nicht.
256
Skriptsprachen in UltraDev
Obwohl es sich also bei JSP um eine auf verbindlichen Standards basierende Serverplattform handelt, die vermehrt Anwendung findet, bleibt da noch die Sache mit Java selbst. Java ist eine moderne, objektorientierte Programmiersprache, die auf Grund ihrer Komplexität an den Lerner einige Ansprüche stellt. Wenn Sie C oder C++ kennen, werden Sie sich mit JSP-Code schnell zurechtfinden. Sind Sie jedoch bisher nur an Visual Basic oder RealBasic gewöhnt, dann kann die Beschäftigung mit JSP zunächst mal zur kalten Dusche werden. Wir werden uns mit JSP-Code später noch näher beschäftigen.
ColdFusion Die am leichtesten handhabbare Skriptsprache ist die ColdFusion Markup Language (CFML). Sie erinnert weniger an eine Programmiersprache, sonder eher an erweitertes HTML, mit dem sich nun plötzlich auch auf Datenbanken zugreifen lässt. Allaire hat mit ColdFusion eine Programmierumgebung entwickelt, die auch den Ansprüchen professioneller Entwickler genügt, anderseits aber so leicht erlernbar ist, dass sie auch den gelegentlichen HTML-Autor nicht abschreckt. Die Entwicklung dynamischer Webanwendungen ist damit für einen großen Anwenderkreis in den Bereich des Möglichen gerückt. Nächste Woche werden wir anhand von Codebeispielen die verschiedenen Skriptsprachen, die UltraDev schreiben kann, direkt miteinander vergleichen. Sie werden feststellen, dass CFML-Code bei weitem am klarsten ist. Während ASP und JSP ihren proprietären Programmcode zwischen speziellen BegrenzerTags in den HTML-Code einbetten, müssen Sie sich bei ColdFusion lediglich an den Anblick ein paar neuer Tags gewöhnen, die in das bekannte HTML-Inventar eingefügt werden. Als ich zum ersten Mal mit dieser erweiterten Entwicklungsumgebung gearbeitet habe, war das ein richtiges Aha-Erlebnis für mich. ColdFusion bricht aus dem Schema herkömmlicher Programmiersprachen aus und betritt echtes Neuland, indem es Datenbankanbindung so einfach macht wie die Erzeugung von normalem HTML-Code. Wenn Sie ColdFusion noch nicht kennen, sollten Sie das unbedingt nachholen. Ich habe meine Programme immer in Java, Perl oder C geschrieben, aber nachdem ich einige Zeit mit ColdFusion gearbeitet hatte, war ich wirklich beeindruckt. Die Entwickler der CFML hatten wirklich an alle Funktionen gedacht, die man sich als Entwickler von Webanwendungen wünscht, und gleich noch einige Dutzend mehr drauf gelegt. Man sollte sich von dem scheinbar simplen ColdFusion-Ansatz der eingebetteten Programmierung nicht täuschen lassen. Man kann mit diesem Programm sehr schnelle und sehr leistungsfähige Webanwendungen realisieren, die sich zudem noch kinderleicht debuggen lassen.
257
Die unterstützten Skriptsprachen verstehen
Doch wo Licht ist, ist auch Schatten, und das gilt auch für ColdFusion. Das erste Problem ist ein mentales, nämlich gewisse fixe Ideen seitens der Programmierer. Programmierer haben immer bestimmte Erwartungen bzw. Vorstellungen, wie eine Programmiersprache aufgebaut zu sein hat. Und diese Konzepte stehen ihnen bei der Beschäftigung mit einer neuen Sprache gerne im Weg. Da wird nach for...next-Schleifen und if...then-Bedingungen Ausschau gehalten und keiner kann sich vorstellen, dass sich komplette Funktionen hinter ein paar Tags verbergen. Sie können nicht glauben, dass die komplexe Syntax einer Schleifenanweisung in einem schlichten -Tag steckt. Dieser Umlernprozess macht erfahrenen Programmierern den Einstieg in ColdFusion unter Umständen schwerer als jemandem, der noch gar keine Programmiererfahrung hat. Und wie Active Server Pages leidet auch ColdFusion an der Beschränkung auf bestimmte Plattformen. Sie müssen den ColdFusion-Server unter Linux, Solaris, HP-UX oder Windows zusätzlich zum Webserver installieren und vor dem praktischen Einsatz wird erst einmal Bares fällig. Dass ColdFusion nicht auf allen Plattformen verfügbar ist, ist der einzige Nachteil dieser wirklich tollen Software. Ich weiß, ich sollte das hier eigentlich gar nicht sagen, aber wenn Sie mit ColdFusion Studio arbeiten, werden Sie früher oder später feststellen, dass im Vergleich mit UltraDev ColdFusion Studio die bessere CFML Entwicklungsumgebung ist. Die verschiedenen Serververhalten wurden für die unterstützten Plattformen möglichst homogen in UltraDev implementiert. Aus diesem Grund hat man auch kaum versucht, die besonderen Vorteile der einzelnen Sprachen auszureizen. ColdFusion Studio hingegen wurde für die ausschließliche Verwendung mit CFML konzipiert und optimiert und bietet daher natürlich ein Höchstmaß an Flexibilität und Kontrolle über die damit erstellten Anwendungen. Als Mac-User haben Sie allerdings keine andere Alternative als UltraDev. Es ist momentan die einzige CFML-Entwicklungsumgebung für den Mac.
7.2
Die Auswahl des Servers
Eigentlich sollten die folgenden Zeilen in eine kleine Marginalie bzw. Fußnote wandern, aber nach reiflicher Überlegung fand ich, dass dieses Thema einen eigenen Abschnitt innerhalb dieses Kapitels verdient. Wenn Sie sich für eine bestimmte Servertechnologie entschieden haben, müssen Sie sich darüber klar werden, welches Betriebssystem auf dem Server verwendet werden soll. Für alle gängigen Entwicklungsumgebungen können Sie in der Hauptsache zwischen zwei Optionen wählen: UNIX oder Windows. Aber wofür sich entscheiden?
258
Die Auswahl des Servers
Diese Frage wird oft und gerne ausführlich diskutiert, ohne jedoch jemals zu wirklichen Ergebnissen zu führen. Erst kürzlich habe ich wieder in einem IT-Magazin einen Artikel über das Pro und Contra von UNIX und NT gelesen, und obwohl auf dem Cover »die endgültige Antwort« versprochen wurde, blieb der Autor die Antwort auf die Frage, welches System welchem nun vorzuziehen sei und warum, geflissentlich schuldig. Wenn der gewiefte Fachmann sich also weigert, verbindliche Auskunft zu geben, worauf soll der Laie seine Entscheidung in Sachen Serverbetriebssystem dann stützen? Die Wahl der Serverplattform wächst sich mittlerweile fast schon zum selben »Glaubenskrieg« aus wie die Entscheidung für Mac oder Windows-PC. Der jüngste Linux-Boom hat auch hat auch den Markt für UNIX- und UNIX-Derivate wiederbelebt, während man schon allgemein mit einer Abdankung von UNIX als Serverplattform zugunsten von NT rechnete.
Anwenderfreundlichkeit Das Hauptargument für den Einsatz von NT lässt sich auf einen Begriff bringen – Anwenderfreundlichkeit. Auch ohne große Erfahrung im Umgang mit Computern kann man in kurzer Zeit einen Windows NT/2000-Server aufsetzen und ein Netzwerk einrichten. Microsoft hat die Einrichtung der verschiedenen Dienste, die für den Betrieb eines Internetservers erforderlich sind, stark vereinfacht. Die Integration der einzelnen Systemkomponenten und das Zusammenspiel der verschiedenen Anwendungen ist gut gelöst, sodass komplexe Netzwerke leicht aufzubauen und über ein einfaches Interface gut zu administrieren sind. UNIX und Linux sehen diesem Treiben allerdings nicht tatenlos zu. In den letzten beiden Jahren hat sich Linux vom Betriebssystem ohne konsistente Benutzerschnittstelle zum Betriebssystem mit einer der komfortabelsten grafischen Oberflächen überhaupt gemausert. Dank den freien Entwicklern des GNOME- (http://www.gnome.org/) und des KDEProjekts (http://www.kde.org/) kommen Linux-Anwender heute in den Genuss ähnlich bequem per Mausklick zu bedienender Installationsroutinen wie Windows-User. Leider sind noch nicht alle dieser Konfigurations-Tools auf dem Niveau kommerzieller Anwendungen. Zieht man aber in Betracht, dass die Entwicklung von Linux weit schneller vorangetrieben wird als die von Windows oder anderen Betriebssystemen, dürfte diese Einschränkung bald nicht mehr gelten. Obwohl manchmal behauptet wird, dass es sich bei UNIX und Linux um zwei Paar Stiefel handle, stehen sie sich in Wirklichkeit ziemlich nahe. Linux ist eine Open-Source-Implementierung eines UNIX-Derivates. Das Ganze ist letztlich nur eine Frage der Wortwahl, und wo ich die beiden Begriffe verwende, können Sie sie nach Belieben als UNIX oder Linux lesen.
259
Die unterstützten Skriptsprachen verstehen
Welche Dienste werden angeboten? Ein weiteres Entscheidungskriterium für oder gegen ein bestimmtes Betriebssystem ist die Frage, welche Dienste sie bieten. Standardmäßig kommt NT mit einigen grundlegenden Webserver- und Netzwerkdiensten (File Sharing, Print Sharing, Active Directories). Red Hat Linux oder ähnliche Distributionen bieten das Open-Source-Gegenstück dieser Dienste und noch einiges mehr. Der PostgreSQL-Datenbankserver ist ein extrem leistungsfähiger relationaler Datenbankserver, der bei industriellen Standard-Benchmarktests (http://www.greatbridge.com/) Kopf an Kopf mit kommerziellen Produkten von Oracle und Microsoft liegt. Tatsächlich hat der zusammen mit Linux vertriebene Apache-Webserver höhere Zuwachsraten zu verzeichnen als der rein auf NT beschränkte IIS-Server. Die neuesten Statistiken über die Verbreitung der verschiedenen Serverplattformen finden Sie im Internet unter http://www.netcraft.com/survey/
Die verschiedenen Linuxdistributionen unterstützen zwar standardmäßig weit mehr solcher Serverdienste als NT, aber die Konfiguration dieser Dienste gestaltet sich leider unter Linux immer noch schwieriger als unter Windows. Der Internet-Dienstmanager von Windows ermöglicht die Konfiguration von Web-, FTP- und anderen Internetdiensten mittels eines einzigen Interfaces. Unter UNIX müssen Sie pro Dienst jeweils eine eigene Datei öffnen und die Einstellungen von Hand vornehmen.
Stabilität Windows ist im Laufe der letzten Jahre immer stabiler geworden, vor allem mit dem Erscheinen von Windows 2000. Nichtsdestotrotz liegt hier UNIX vorne. Kommerzielle UNIX-Betriebssysteme wie Solaris oder AIX bieten ein Höchstmaß an Stabilität bei kritischen Anwendungen. Es ist ziemlich schwierig, Betriebssysteme in puncto Stabilität miteinander zu vergleichen, und leider sind die meisten Aussagen diesbezüglich sehr subjektiv. Nachfolgend sei als Beispiel die Uptime-Statistik einer stark frequentierten E-CommerceSite angeführt, die auf AIX läuft: www3:/> uptime 10:38AM up 285 days,17:59,1 user,load average: 0.26,0.48,0.45
Es handelt sich hier um einen Produktionsserver mit extrem hoher Auslastung. Der Entwicklungsserver dieser Site ist ein NT 4.0-Rechner, der nur wenig belastet wird. Trotzdem bleibt er öfters stehen und muss ein bis zwei Mal pro Woche neu gebootet werden. Ich würde Ihnen empfehlen, sich umzuhören und für die ins Auge gefasste Serverplattform und Hardware Erfahrungsdaten zu sammeln. Die richtige Kombination von Hard- und Software ist die beste Garantie, dass Ihre Site rund um die Uhr online ist und Sie nicht um 3 Uhr früh durch die Gegend telefonieren müssen, weil Ihr Server wieder mal hängt.
260
Die Auswahl des Servers
Performance/Kosten-Relation Über viele Jahre hat NT bei der Performance/Kosten-Relation gepunktet, da Sie hier relativ preisgünstige, Intel-basierte Hardware einsetzen konnten. Wollten Sie ein UNIX-System verwenden, mussten Sie zum Betriebssystem auch gleich die passende Hardware kaufen. Mit Linux hat sich in dieser Beziehung Einiges geändert. Linux läuft auf derselben Hardware wie NT (und, nebenbei bemerkt, auch auf einigen Plattformen, auf denen NT nicht läuft), stellt aber bei weitem nicht die Anforderungen an die Hardware wie NT und läuft auch kleineren Pentium-Systemen ohne Murren. Die Anschaffungskosten für ein Linux-System (kostenlos, wenn man keine Distribution verwendet) sprechen ebenfalls zugunsten des Open-Source-Betriebssystems.
Support Für viele ist das der eigentliche Knackpunkt. »Was soll ich mit einem Produkt, für das ich keinen Support bekommen kann?« Das ist eine berechtigte Frage, die gerade im Firmenumfeld immer wieder gestellt wird. Hinter NT steht natürlich ein Großkonzern mit den entsprechenden Möglichkeiten. Wird ein Fehler entdeckt, wird er sofort dokumentiert und ein Bugfix bereitgestellt. Man kommt kaum einmal in die Lage, dass man Hilfe suchend das Internet durchstreift in der Hoffnung, jemanden zu finden, der weiß, wovon man da eigentlich spricht. Kommerzielle UNIX-Systeme bieten zwar vergleichbaren Support, für Linux gilt das leider nicht. Linux »gehört« niemandem und es gibt keinen Händler, der im »Garantiefall« tätig werden muss. In vielen Fällen bekommen Sie auf ein Posting in einer Newsgroup Hunderte von nützlichen Antworten, aber es gibt auch Situationen, in denen man völlig auf sich allein gestellt ist, und das kann ganz schön frustrierend sein. Ein Freund von mir hatte z.B. eine neue Ethernet-Karte in seinem Rechner installiert. Nachdem er auf seinem Rechner Linux aufgespielt hatte, musste er feststellen, dass sich die Netzwerkverbindung alle paar Stunden verabschiedete. Er suchte im Internet nach einer Lösung für sein Problem und fand heraus, dass derjenige, der den fehlerhaften Treiber entwickelt hatte, mittlerweile einen neuen Treiber geschrieben hatte. Freudig wollte er auf die Website des Entwicklers gehen, musste aber dann feststellen, dass die Site umgezogen und nicht länger existent war. Diesen Programmierer wieder ausfindig zu machen, ihn per E-Mail um Zusendung eines neuen Treibers zu bitten und anschließend auf eine Reaktion zu warten, zog sich über mehrere Wochen hin. Das Ganze komplizierte sich noch durch eine umständliche und komplizierte Installationsprozedur, die einen Linux-Neuling an den Rand der Verzweiflung treiben kann. Das ist sicher ein Extrembeispiel, doch sollte man Fälle wie den geschilderten mit einplanen.
261
Die unterstützten Skriptsprachen verstehen
Die endgültige Entscheidung Wägt man also die Vor- und Nachteile der jeweiligen Plattformen ab, welche ist dann für die eigenen Zwecke die richtige? Statt einer spreche ich zwei Empfehlungen aus und nenne Ihnen jeweils die Gründe, warum Sie sich für die eine oder andere Seite entscheiden sollten. Option eins: Windows. Mit der Entscheidung für Windows als Serverplattform sind Sie auf der sicheren Seite. Sie bekommen ein hinreichend stabiles System, das leicht zu konfigurieren und pflegen ist. Sie müssen eine größere Anfangsinvestition für die benötigten Softwarekomponenten einplanen, die Sie zur Realisierung Ihrer Website brauchen. Windows ist die beste Wahl für jemanden, der sich nicht noch nebenbei mit Systemadministration und komplexen Betriebsystemfragen auseinander setzen will. Option zwei: UNIX/Linux. Mit der Entscheidung für UNIX bekommen Sie eine sehr flexible und schnelle Plattform. Ihren Server ans Netz zu bringen kostet Sie im Falle von Linux nicht mehr als die eingesetzte Hardware plus Ihre Online-Kosten. Für Technikfreaks oder Leute mit schmalem Geldbeutel ist das ein gewichtiges Argument. Der Support ist allerdings eine zweischneidige Sache, doch wenn Sie Hardware von bekannten Markenherstellern verwenden, ist nicht mit größeren Schwierigkeiten zu rechnen. Wenn es Ihnen schlichtweg wurst ist, wie ein Server funktioniert, sollten Sie lieber die Finger von UNIX lassen. Welchen Server verwendet der Autor? Finden Sie es heraus auf seiner Website unter http://www.poisontooth.com/.
7.3
Ein Blick auf die unterstützten Skriptsprachen
Bisher haben wir uns mit der Frage beschäftigt, welche Skriptsprachen UltraDev verwendet, welche Anwendungsserver diese Sprachen unterstützen und unter welchen Gesichtspunkten man das Betriebssystem des Webservers auswählen sollte. Nun wollen wir uns die Struktur und die Funktionsweise dieser Sprachen näher ansehen. Das Folgende ist natürlich keine Einführung ins Programmieren. Ich möchte Ihnen jedoch das nötige Wissen an die Hand geben, damit Sie die von UltraDev erzeugten Serververhalten analysieren und an Ihre Bedürfnisse anpassen können. Sehen Sie das Folgende als Heranführung an grundlegende Programmierkonzepte für diejenigen, die noch nie eine Zeile Code geschrieben haben. Falls Sie nicht zu dieser Gruppe gehören, bitte ich um Nachsicht.
262
Ein Blick auf die unterstützten Skriptsprachen
Grundlegende Konzepte der Programmierung Gewisse grundlegende Konzepte sind allen Programmiersprachen gemeinsam. Das gilt bei allen sonstigen Unterschieden auch für die von UltraDev unterstützten Skriptsprachen. Am besten versteht man eine Programmiersprache, mit der man sich noch nie befasst hat, wenn man sich ein Verständnis für diese Konzepte erwirbt und sich ansieht, wie diese Sprache sie umsetzt. JavaScript wird zwar von UltraDev unterstützt, doch gehe ich in diesem Zusammenhang nicht darauf ein. Auf einer grundlegenden Ebene unterscheiden sich JavaScript und Java nicht, sodass sich eine nähere Besprechung erübrigt.
Grundsätzliches Bevor wir auf die einzelnen Sprachen eingehen, sollten Sie sich ein paar grundsätzliche Dinge für den Umgang mit dem Programmcode einprägen: 쐽
Tags – ASP- und JSP-Tags werden in spitze Klammern eingeschlossen: <% tag %>. ColdFusion-Tags werden direkt in den HTML-Code eingebettet und sehen aus wie die bekannten HTML-Tags.
쐽
Kommentare – Kommentare werden im ASP-Code durch einen Apostroph ' gekennzeichnet, der die Kommentarzeile einleitet. Kommentare im Java- und CFScriptCode werden durch Doppel-Slash // markiert. Da sämtliche Skriptsprachen den Code in HTML einbetten, können Sie Kommentare auch ganz HTML-konform kennzeichnen: .
쐽
Zeilenende – In VBScript wird die einzelne Code-Zeile mit einem »Return« abgeschlossen. ColdFusion-Script und Java verwenden hier ein Semikolon.
Variablen Variablen speichern bestimmte Informationen, solange eine bestimmte Anwendung ausgeführt wird. In Variablen können Text, Zahlen oder abstraktere Informationen wie z.B. die Uhrzeit abgelegt werden. Jede Programmiersprache behandelt Variablen anderes und bietet unterschiedliche Möglichkeiten, mit den definierten Variablen zu arbeiten. ASP/VBScript VBScript oder Visual Basic Script ist eine leicht zu erlernende Programmiersprache von Microsoft, die sich von deren verbreiteter Visual Basic-Entwicklungsumgebung herleitet. In VBScript-Programmen definieren Sie Variablen einfach durch ihre erstmalige Benutzung. Sie können in Variablen Text oder numerische Daten ablegen, ohne zwischen dem Variablentyp zu unterscheiden.
263
Die unterstützten Skriptsprachen verstehen
Ein Beispiel: myVar=3
und myVar="Vier"
sind beides gültige Wertzuweisungen. Manchmal finden man in VBScript-Code auch die Anweisung Dim(Dimension): Dim myVar
Mit dieser Anweisung wird die Variable myVar deklariert, ihr aber kein bestimmter Wert zugewiesen. Da Variablen mit ihrer erstmaligen Verwendung automatisch deklariert werden, wird dieser Befehl selten verwendet. Es gibt auch die Möglichkeit, ganze Wertelisten unter einer Variablen zu speichern, die so genannten Arrays. Sie werden gekennzeichnet durch einen Variablennamen, gefolgt von []. Über einen Index lässt sich einem Eintrag des Arrays ein Wert zuweisen oder dieser auslesen: myVar [50]=12345. Java Verglichen mit VBScript ist Java wesentlich restriktiver. So können Sie nicht mittendrin im Programmcode neue Variablen einführen, wenn es gerade nötig ist. Sie müssen Variable und Variablentyp ausdrücklich deklariert haben, bevor Sie sie im Sourcecode verwenden. Das sieht dann etwa folgendermaßen aus: int myInt; float myFloat; String myString="Hier steht ein String"; myInt=3; myFloat=4.5;
Wie Sie am Beispiel von myString sehen können, ist es möglich, Variablen bei der Deklaration gleich einen Wert zuzuweisen. Beachten Sie auch, dass jede Code-Zeile mit Semikolon abgeschlossen wird, wie es den Konventionen von Java und JavaScript entspricht. Eine Anweisung darf dabei ruhig über mehrere Zeilen laufen, wichtig ist nur, dass sie immer korrekt abgeschlossen wird. Java-Arrays unterscheiden sich nicht von ihren VBScript-Pendants, sie müssen nur entsprechend den Java-Konventionen erst deklariert werden (int myInt[50];), bevor Sie damit arbeiten können. CFML/CFScript ColdFusion lässt sich nicht in das übliche Schema von Programmiersprachen einordnen. CFML erlaubt die schnelle Erledigung von Programmieraufgaben, erfordert aber von Programmierern, die an die Logik von herkömmlichen Programmiersprachen gewöhnt sind,
264
Ein Blick auf die unterstützten Skriptsprachen
ein gewisses Umdenken. Aus diesem Grund hat man ColdFusion eine zweite Programmiersprache mitgegeben, die ebenfalls in den HTML-Code eingebettet werden kann. UltraDev verwendet bei der Generierung seiner Serververhalten beide Varianten. Variablen werden in CFML nach dem folgenden Schema deklariert:
Innerhalb von CFScript werden Variablen jedoch in ähnlicher Weise deklariert und verwendet wie in VBSCript: myVar="Test" myInt [50]=75
Von CFML aus können Sie auf eine CFScript-Variable über die Anweisung #variablenname# zugreifen. Vielleicht etwas verwirrend, aber es funktioniert.
Bedingungen und Schleifen Jedes Programm und jede Anwendung muss die zu verarbeitenden Daten irgendwie bewerten und zuordnen können und danach den weiteren Programmablauf steuern. Sie möchten z.B. alle Datensätze in Ihrer Datenbank anzeigen lassen, wissen aber nicht, wie viele Datensätze tatsächlich gespeichert sind. Daher müssen Sie den Datenbestand so lange durchsuchen lassen, bis der letzte Datensatz erreicht ist. Sind keine Datensätze vorhanden, soll ein entsprechender Warnhinweis auf dem Bildschirm ausgegeben werden. In beiden Fällen muss der logische Programmablauf je nach den zu erfüllenden Bedingungen entsprechend modifiziert werden. Lassen Sie uns im Folgenden die Programmierlogik bzw. die Sprachkonstrukte, mit denen sich eine solche Ablaufsteuerung erreichen lässt, sowie ihre Umsetzung in den drei Skriptsprachen näher betrachten. VBScript Bei der Arbeit mit den Serververhalten von UltraDev werden Ihnen zwei Typen von Schleifen begegnen: die for...next-Schleife und die while-Schleife. Die for...nextSchleife wird so oft durchlaufen und die darin enthaltene Anweisung so oft ausgeführt, bis ein bestimmter Wert erreicht ist. Die while-Schleife hingegen führt eine Anweisung so lange aus, wie die damit verknüpfte Bedingung erfüllt ist. Beispiel für eine for...next-Schleife: For x=1 To 5 ' Führe diese Schleife fünf Mal aus Next
Beispiel für eine while-Schleife: Do While (x<5) ' Führe diese Anweisung aus, solange x kleiner 5 ist Loop
265
Die unterstützten Skriptsprachen verstehen
Anwendungen müssen nicht nur in der Lage sein, bestimmte Anweisungen per Schleife wiederholt auszuführen, sondern auch entscheiden können, wie sie im Programmablauf weiterfahren sollen, wenn bestimmte Bedingungen erfüllt sind. Möglich wird dieses Verhalten durch das if...then...else-Konstrukt, das überprüft, ob eine Bedingung erfüllt ist, bevor es eine Anweisung ausführt: If x=5 Then ' Tu was Vernünftiges!! Else ' Such Dir einen neuen Job!! End If
Durch das Definieren von Bedingungen können Sie den logischen Programmfluss steuern und erzwingen, dass in Abhängigkeit von dieser Bedingung eine andere Operation ausgeführt wird. Java Schleifen werden in Java entsprechend der C-Syntax definiert. Im Gegensatz zum vergleichsweise »geschwätzigen« VBScript-Code gibt sich Java eher wortkarg: for (x=0;x<5;x=x+1){ //Mach das jetzt 5 Mal }
Die einleitende Zeile der for-Schleife bewirkt dreierlei: Sie initialisiert die Variable x mit dem Wert 0, formuliert die Bedingung, wie oft die Schleife ausgeführt werden soll (x<5), und teilt dem Programm mit, was es bei jedem Bearbeitungsschritt tun soll (erhöhe x um den Wert 1). Im Gegensatz zu VBScript, das verschiedene Konstrukte verwendet, ist Java-Code immer nach demselben Muster aufgebaut, wobei Anweisungen in geschweifte Klammern {} eingeschlossen werden. So unterscheidet sich die while-Schleife von der for-Schleife nur in der ersten Zeile: while (x<5){ //Tu was! }
Auch die if-Bedingung ist nach demselben Prinzip konstruiert: if (x==5){ // Tu was Vernünftiges!! } else { // Such Dir einen neuen Job!! }
Wie Sie sehen, führt das zu einem weit konsistenteren Programmierstil. Bei mehreren verschachtelten Bedingungen kann sich die Fehlersuche jedoch schwierig gestalten.
266
Ein Blick auf die unterstützten Skriptsprachen
CFML/CFScript Wie es der Zufall so will, ist die Syntax von CFScript und Java identisch, sodass wir nicht weiter darauf eingehen müssen. Dafür müssen wir uns mit den CFML-Tags beschäftigen, die Schleifen und Bedingungen steuern. Mit den ... -Tags lässt sich sowohl eine for...next-Schleife als auch eine while-Schleife definieren:
Diese Schleife wird von 1 bis 5 durchgezählt, genau wie die entsprechenden ASP- und JSPPendants. Das -Tag normal wurde der besseren Übersichtlichkeit halber auf mehrere Zeilen umbrochen, um seinen Aufbau zu verdeutlichen. Man könnte es aber ohne Weiteres in eine einzige Zeile setzen. Um eine bedingte Schleife zu definieren, muss das Tag nur leicht verändert werden:
Wie Sie sehen, ist mit ColdFusion die Erstellung dynamischer Websites so einfach wie die Kodierung in normalem HTML-Code. Die Definition einer if-Bedingung ist ebenso einfach – mit ein paar weiteren Tags, ...... , steuern Sie den Programmablauf:
Es ist nicht schwer, mit CFML zu arbeiten, nur gewöhnungsbedürftig!
Dynamische Elemente Dynamische Elemente sind in diesem Zusammenhang Elemente, die von Inhalten erstellt werden, die der Browser des Clients übermittelt hat. Dazu zählen Session-IDs, Cookies und Formulardaten.
267
Die unterstützten Skriptsprachen verstehen
Die hier behandelten Programmiersprachen handhaben diese Elemente ganz unterschiedlich, da es sich hier nicht um ein gemeinsames Feature herkömmlicher Programmiersprachen handelt, sondern diese Funktionalitäten erst nachträglich in die Kernsyntax implementiert wurden. ASP/VBScript Active Server Pages erleichtern den Umgang mit dynamisch erzeugten benutzerspezifischen Daten wie Session-IDs, Cookies oder Formulardaten erheblich. Wenn Sie je mit Perl oder einer anderen traditionellen Programmiersprache serverbasierte CGI-Skripten geschrieben haben, werden Sie angenehm überrascht sein, wie leicht sich diese Dinge mit ASP realisieren lassen. Die Definition einer Session-Variable ist so leicht wie das Setzen jeder beliebigen anderen Variable: Session("myVar)="Mein Wert"
Auch Cookies lassen sich mühelos einrichten: Response.Cookies("myVar")="Mein zweiter Wert"
Durch Anfügen einer kleinen Anweisung können Sie sogar das Verfallsdatum festsetzen: Response.Cookies("myVar").Expires=#12/31/2030#
Cookies lassen sich zwar problemlos einrichten, doch müssen Sie das tun, bevor irgendwelche Informationen an den Client-Rechner geschickt werden. Andernfalls erhalten Sie eine Fehlermeldung. Mit UltraDev können Sie die Werte all dieser Elemente auslesen, wenn Sie eine Datenbindung einrichten. Wie das geht, ist Thema von Tag 9, »Einführung in die dynamischen Werkzeuge von UltraDev«. Wollen Sie allerdings einen Wert setzen, müssen Sie das von Hand tun. Java Session-Variable werden in Java ähnlich definiert wie in ASP, die Syntax variiert allerdings ein wenig: session.putValue("myVar","Mein Wert")
In diesem wie im vorigen Beispiel setzt sich der Code aus einem Befehl und einem daran angefügten »Nachsatz« zusammen, der eine Methode innerhalb eines Objekts beschreibt. Sie können sich ein Objekt als höhere Funktionsbibliothek vorstellen. Es enthält Methoden (Funktionen), die einen speziellen Typ von Daten verarbeiten. Das Objekt session z.B. enthält eine Funktion putValue, die das Setzen einer Sitzungsvariablen ermöglicht.
268
Ein Blick auf die unterstützten Skriptsprachen
Wollen Sie mehr über objektorientierte Programmierung wissen, möchte ich Ihnen den Markt&Technik-Titel »Java in 21 Tage« empfehlen. Um in JSP ein Cookie zu setzen, müssen Sie das Cookie in den Response-Header schreiben, der an den Client-Rechner zurückgeschickt wird. Das deckt sich vom Ansatz her mit der von ASP verwendeten Methode und erklärt, warum der ASP-Befehl das Wort »response« enthält. myCookie = new Cookie("myVar","Mein Wert!")); myCookie.setMaxAge(50000); response.addCookie(myCookie);
Der Unterschied ist der, dass hier zur Erzeugung des Cookies ein weiterer Schritt erforderlich ist. Als Erstes müssen Sie das Objekt »Cookie« erzeugen (in diesem Beispiel myCookie). Als Nächstes definieren Sie – wenn Sie möchten – die maximale Gültigkeitsdauer des Cookies in Sekunden. Schließlich wird das korrekt konfigurierte Cookie in den Response-Header geschrieben. CFML Bevor Sie unter ColdFusion Sitzungsvariablen verwenden können, müssen Sie das -Tag setzen, um das Session-Management zu aktivieren. Dieses Tag wird in die Datei application.cfm, die Sie für jedes Projekt erstellen, geschrieben und sollte
nur dort verwendet werden.
Sobald Sie das Session-Management für ein Projekt aktiviert haben, können Sie mit dem -Tag Sitzungsvariablen wie irgendeine andere beliebige Variable definieren.
Cookies werden über ein spezielles -Tag definiert, in dem sich vom Client übermittelte Werte ablegen lassen:
Und das war's auch schon! Mit diesen Informationen und den Werkzeugen von UltraDev sollte es Ihnen möglich sein, die vom Programm erzeugten Serververhalten zu analysieren und Ihren Erfordernissen entsprechend abzuwandeln. Und was noch wichtiger ist: Sie können die Beispiele im Buch durch ein paar Änderungen am Programmcode (keine Angst, Sie müssen lediglich hie und da ein paar Zeilen Code ergänzen) an Ihre Serverplattform anpassen.
269
Die unterstützten Skriptsprachen verstehen
7.4
Zusammenfassung
Die heutige Lektion hat alle Informationen nachgeliefert, die uns noch gefehlt haben, bevor wir uns an die Erstellung von dynamischen Websites machen können. Mit UltraDev steht Ihnen eine große Auswahl an Entwicklungs- und Serverplattformen zur Verfügung, aber für einen Einsteiger kann es schwer sein, die richtige Entscheidung zu treffen. Wir haben uns mit den verschiedenen eingebetteten Skriptsprachen, ihren Vor- und Nachteilen beschäftigt sowie mit den Betriebssystemen, auf denen sie lauffähig sind. Nach diesen Ausführungen haben Sie hoffentlich die nötigen Informationen, um unter den Gesichtspunkten der Anwenderfreundlichkeit sowie der Performance/Kosten-Relation die für Sie sinnvollste Konstellation auszuwählen. Schließlich haben wir noch einen Blick ins Innenleben dieser Skriptsprachen gewagt. Das war zwar keine erschöpfende Einführung ins Programmieren, doch sollten Sie so viel an Information bekommen haben, dass Sie mit von UltraDev erzeugtem Code auch ohne vorausgehende Programmiererfahrung umgehen können. Von nun an werden einen Zahn zulegen und im Laufe der nächsten Woche werden Sie schon mit der Erstellung dynamischer Websites zugange sein.
7.5 F
Warum sollte ich Tomcat nicht verwenden, wenn es doch nichts kostet? A
F
Jeder favorisiert eine bestimmte Programmiersprache. Da liegt es nahe, dass man bei der Erstellung dynamischer Webanwendungen auf diese Sprachen zurückgreift und sie in den HTML-Code einbettet. JSP richtet sich an Java-Entwickler, ASP an Visual Basic-Programmierer. ColdFusion ist eine der wenigen Sprachen, die von vornherein für die Entwicklung dynamischer Websites konzipiert wurden.
Ich lasse auf meinem Rechner NT laufen und er stürzt nie ab. Also was soll das Gerede? A
270
Die Frage ist nicht, ob das Programm etwas kostet oder nicht. Einige kommerzielle Anwendungen sind jedoch schneller und bieten besseren Support. Bevor Sie eine Entscheidung treffen, sollten Sie Ihre speziellen Anforderungen überprüfen.
Warum werden eigentlich so viele verschiedene eingebettete Skriptsprachen verwendet? A
F
Fragen und Antworten
Ein Teil der Probleme mit NT haben ihren Ursprung in der verwendeten Hardware. Der x86-Standard ist alles andere als ein Standard und NT verhält sich je nach Hardware-Umgebung ganz unterschiedlich. Ich habe auf einem kommerziellen Server NT in einer Minimalversion installiert und einmal pro Woche hängt sich das System auf. Aber vielleicht ist das nur bei mir so.
Workshop
F
Ich habe einen Mac und möchte meinen eigenen Server betreiben. Geht das? A
7.6
Ja. Sehen Sie sich Tomcat vom Jakarta-Projekt an. Es läuft unter Mac-OS X und sogar unter Mac-OS 8/9, wenn man an ein paar Schräubchen dreht.
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Was bedeutet ASP und von wem stammt es? 2. Welche Skriptsprachen verwenden die Zeichenfolge <%...%>, um Anfang und Ende des eingebettetem Codes zu markieren? 3. Können Sie in JSP und ASP einem Cookie jederzeit einen Wert zuweisen? 4. Können Sie jederzeit eine Session-Variable setzen? 5. Welche Entwicklungsumgebung eignet sich am besten für ColdFusion?
Übung Unsere heutige Übung ist nicht schwer. Entscheiden Sie sich für einen bestimmten Server und installieren Sie ihn. Zwar sind Sie bis zur heutigen Lektion ohne Webserver bzw. Applikationsserver ausgekommen, doch für alles Weitere sind sie unabdingbar. Für alle weiteren Kapitel benötigen Sie eine Serveranbindung.
271
Tag 1 Tag 2 Tag 3 Tag 4 Tag 5 Tag 6 Tag 7
Tag 8 Tag 9 Tag 10 Tag 11 Tag 12 Tag 13 Tag 14
Tag 15 Tag 16 Tag 17 Tag 18 Tag 19 Tag 20 Tag 21
Die Programmumgebung von UltraDev Die WYSIWYG-Layoutwerkzeuge von UltraDev Websites planen und verwalten Websites in Bewegung – clientseitige Verhaltensweisen Wieder verwertbare Elemente und Erweiterungsmodule Einführung in dynamische Webanwendungen und Datenbankentwicklung Die unterstützten Skriptsprachen verstehen
Mac und Windows-PC für die Datenbankanbindung fit machen Einführung in die dynamischen Werkzeuge von UltraDev Datenbankgestützte Webseiten entwickeln Datensätze mit UltraDev-Applikationen speichern, bearbeiten und aktualisieren Komplexe Datenbankabfragen Komplexe Komponenten: Kataloge und Suchen Komplexe Komponenten: Benutzeranmeldungen
Komplexe Techniken: Existierende Websites mithilfe dynamischer Werkzeuge konvertieren Komplexe Techniken: Datensammlung und Berichte Komplexe Techniken: Benutzerdaten verfolgen und verwenden Komplexe Techniken: Komplexe Abfragesysteme Komplexe Techniken: Lehren und Prüfen – online Komplexe Techniken: E-Commerce-Lösungen Dynamische Applikationen testen und einsetzen
31 69 117 147 187
W O C H E
221 251
275 305 337 365 409 435 467
501 529 561 599 633 669 707
W O C H E
W O C H E
Auf einen Blick Nachdem wir die verschiedenen Paletten und Inspektoren, die wir zur Erstellung eines HTML-Dokuments benötigen, kennen gelernt haben, werden wir uns in der zweiten Woche mit den Werkzeugen auseinander setzen, die uns die Erzeugung serverbasierter Anwendungen ermöglichen. UltraDev unterstützt von einem konsistenten Interface aus drei verschiedene Skriptsprachen, die die Realisierung dynamischer Websites ermöglichen. Ohne Programmierkenntnisse erstellen Sie mit ein paar Mausklicks datenbankgestützte Websites. Probleme mit UltraDev haben meist nur Anwender, die aus der »Programmierecke« kommen. UltraDev und seine dynamischen Werkzeuge zielen eher auf den Designer als den Informatiker, und obwohl diese Werkzeuge leicht zu bedienen sind, müssen Programmierer häufig erst einmal umdenken. Der Stoff der zweiten Woche ist speziell auf Nicht-Programmierer zugeschnitten, doch ist die Einführung so gehalten, dass auch Programmierer daraus ihren Nutzen ziehen und ihren programmiertechnischen Hintergrund einfließen lassen können. UltraDev realisiert dynamische Webanwendungen durch die Kopplung von Daten mit vorprogrammierten Verhaltensweisen. Diese Verhaltensweisen führen genau definierte Aufgaben aus wie das Auslesen von Informationen aus einer Datenbank oder die Ausgabe einer Meldung auf dem Monitor. Serververhalten an sich sind eher unspektakulär. Ihr Einsatz macht aus einer Website noch kein multimediales Meisterwerk, aber in Verbindung mit den clientseitigen Verhaltensweisen, die wir letzte Woche kennen gelernt haben, kann man in der Tat sehr aufwändige Sites gestalten. Nachfolgend ein kleiner Überblick über die Funktionen, die Sie im Laufe der folgenden Lektionen kennen lernen werden: 쐽
Informationen in Abhängigkeit von bestimmten Bedingungen anzeigen oder verbergen
쐽
Datensätze einer Datenbank anzeigen, aktualisieren oder löschen
쐽
Identität eines Anwenders mittels Benutzername und Passwort überprüfen
쐽
Daten zwischen einzelnen Webseiten übergeben
Ende der zweiten Woche werden wir diese (und andere) Verhaltensweisen ausführlich besprechen. Sie werden auch lernen, wie Sie durch Kombination dieser Features die für dynamische Websites typischen Bedienelemente erzeugen. Am Ende dieser zweiten Woche werden Sie praktisch mit dem gesamten Funktionsumfang von UltraDev vertraut sein. Wenn Sie den Stoff der zweiten Woche durchgearbeitet haben, sollten diese Verhaltensweisen eigentlich kein Problem mehr für Sie darstellen. Das Einzige, was Ihnen dann noch fehlt, ist Praxis. Die Lektionen der letzten Woche wurden vor diesem Hintergrund konzipiert. Jeden Tag werden Sie eine andere dynamische Website erstellen, wobei Sie jedes Mal andere nützliche Anwendungen kennen lernen.
274
Mac und Windows-PC für die Datenbankanbindung fit machen
8
Mac und Windows-PC für die Datenbankanbindung fit machen
Damit Sie von UltraDev aus mit Datenbanken arbeiten können, muss auf Ihrem Rechner bzw. in Ihrem Netzwerk bereits ein Datenbanksystem eingerichtet sein, auf das Sie zugreifen können. Sämtliche Programmfeatures, die Sie in den nun folgenden Tagen kennen lernen werden, setzen zwingend voraus, dass Sie eine Datenbankanwendung installiert haben. Das heutige Kapitel ist absolut grundlegend, denn auf diesen Stoff bauen alle weiteren Lektionen auf. Die Themen im Überblick: 쐽
Datenbanken, mit denen UltraDev kommunizieren kann und wie Sie den eigenen Rechner für die Arbeit mit Datenbanken konfigurieren
쐽
Unterschiedliche Datenbankverbindungen bei Macintosh- und Windows-Rechnern
쐽
Wie man einen Mac mit einem Windows-PC vernetzt, um Zugriff auf ein größeres Spektrum von Datenbanken zu bekommen
쐽
Wie man einen Open-Source-Datenbankserver auf Windows- und UNIX-basierten Serverplattformen einrichtet
8.1
Datenbankverbindungen
Da wir uns mit unterschiedlichen Plattformen auseinander setzen werden, ist der Text im Anschluss an diese allgemeine Einführung entsprechend in Abschnitte gegliedert. Die gemachten Ausführungen gelten entweder plattformübergreifend oder plattformspezifisch, worauf jeweils hingewiesen wird. Manche Unterkapitel beschäftigen sich speziell mit ASP (Active Server Pages), JSP (Java Server Pages) oder ColdFusion-Anwendungen. Ich möchte Ihnen nahe legen, keinen der Abschnitte zu überspringen, denn diese Informationen könnten Ihnen auch bei der Arbeit mit anderen Anwendungen als UltraDev nützlich sein. Wenn Sie in einer reinen Mac- bzw. Windows-Umgebung arbeiten oder sich nur für eine bestimmte Serverplattform interessieren, steht es Ihnen natürlich frei, lediglich die diesbezüglichen Abschnitte zu lesen. Für die heutige Lektion wird davon ausgegangen, dass Sie bereits einen Datenbankserver installiert haben und Erfahrung in der Erstellung von Datenbanken besitzen. Wenn nicht, arbeiten Sie bitte zuerst die Ausführungen über die Installation des MySQL-Servers am Ende der heutigen Lektion durch. Danach haben Sie das nötige Grundlagenwissen, um Ihr UltraDev-Backend einzurichten. Wenn Sie mit UltraDev dynamische Seiten erzeugen, müssen Sie dem Programm bestimmte Informationen geben, damit es den Anwendungsserver mit einer Datenbank verbinden kann. Je nach Voreinstellung werden Sie eine Webanwendung vielleicht auf Basis einer lokalen Datenbank entwickeln und sie dann auf den Produktionsserver stellen, auf dem eine eigene Datenbankverbindung eingerichtet ist. In diesem Fall müssen Sie Ihre Datenbank lokal genauso konfigurieren wie auf dem entfernten Server.
276
Datenbankverbindungen
Die Alternative wäre, die Applikation gleich in Anbindung an die Datenbank auf dem Produktionsserver zu entwickeln. So oder so ist die Einrichtung einer Datenbankverbindung nicht schwierig, und für den Fall, dass Sie mit einer Datenbank auf dem entfernten Server arbeiten, braucht Ihr lokaler Rechner nicht einmal einen eigenen Treiber, denn UltraDev verwendet den Treiber des Servers, um die Daten lokal verfügbar zu machen. Falsch konfigurierte Datenbankverbindungen sind eine häufige Fehlerquelle. In der Folge kommuniziert UltraDev mit einer Datenbank, die lokal anders konfiguriert ist als auf dem Produktionsserver. UltraDev kann dann zwar problemlos auf die Datenbank zugreifen und in der Dokumentansicht funktioniert scheinbar auch alles bestens. Laden Sie das Dokument dann allerdings zur Vorschau in den Browser oder übertragen es auf den Server, funktionieren die dynamischen Verhaltensweisen nicht mehr. Der entscheidende Punkt ist wie gesagt, dass Sie, falls Sie mit lokalen Datenquellen arbeiten, diese genauso wie auf dem Anwendungsserver konfigurieren.
Eine Datenbankverbindung einrichten (Mac/Win) Sie können theoretisch pro Website mehrere Datenbankverbindungen einrichten, doch gewöhnlich arbeitet man nur mit einer. Die Verwendung mehrerer verschiedener Datenquellen ist durchaus zulässig, und Sie könnten sogar eine Website anlegen, die Daten von verschiedenen, voneinander unabhängigen Servern bezieht. Um eine dynamische Website einzurichten, definieren Sie wie gewohnt eine neue Site, doch bevor Sie das Konfigurationsmenü verlassen, aktivieren Sie im Listenfeld KATEGORIE die Option ANWENDUNGSSERVER (siehe Abb. 8.1). Wählen Sie ein Servermodell (ASP, JSP oder ColdFusion) aus, die Standard-Skriptsprache, in der die Anwendung geschrieben werden soll, sowie die zu verwendende Standard-Seitenerweiterung. Darüber hinaus können Sie noch einige Zugriffsinformationen definieren. UltraDev trägt der Tatsache Rechnung, dass Sie Ihre dynamische Anwendung vielleicht auf einem anderen Server ablegen möchten als die übrige Website. Über die Anpassung der Einstellungen unter ZUGRIFF und ENTFERNTER ORDNER können Sie einen anderen Speicherort definieren. Diese Einstellungen entsprechen denen, die wir in Tag 3, »Websites planen und verwalten«, bei der Definition des entfernten Ordners auf dem Server vorgenommen haben. Wenn Sie hier nichts anderes eingeben, geht UltraDev davon aus, dass der Anwendungsserver und der entfernte Server identisch sind. Sie können sich die Dateien auf dem Anwendungsserver anzeigen lassen, indem Sie in der Site-Ansicht in der Werkzeugleiste auf das zweite Icon von links (kleine Quadrate mit einem Blitz) klicken. Falls entfernter Server und Anwendungsserver identisch sind (was meistens der Fall sein dürfte), erfüllt diese Schaltfläche keine weiteren Funktionen.
277
Mac und Windows-PC für die Datenbankanbindung fit machen
Abbildung 8.1: Einrichten des Servermodells, der Skriptsprache und des Speicherorts
Nachdem Sie die neue Website eingerichtet und ein Anwendungsserver-Modell gewählt haben, richten Sie im nächsten Schritt die Datenbankverbindung ein. Bei der Auswahl des für Ihre Serverplattform geeigneten Verbindungstyps unterstützt Sie das Programm durch verschiedene Dialogfenster. Es stehen folgende Verbindungstypen zur Auswahl: 쐽
ADO/ODBC – ActiveX Data Objects. Die ADO-Technologie ist die jüngste Entwicklung von Microsoft zur Verbindung mit Datenquellen. ADO ist eine generische Datenzugriffsmethode, über die sich die unterschiedlichsten Informationen abfragen lassen. Für Datenbankverbindungen wird eine ADO/ODBC-Verbindung eingerichtet (Open Database Connectivity). Wenn Sie mit dem ASP-Datenmodell arbeiten, wählen Sie diesen Verbindungstyp. Auf dem Mac können Sie keine lokale ADO/ODBCVerbindung einrichten. In diesem Fall muss der Zugriff über den entfernten Server erfolgen.
쐽
JDBC – Java Database Connectivity. Eine vollkommen plattformunabhängige Technologie der Datenbankabfrage. Haben Sie sich für JSP als Servermodell entschieden, wählen Sie diese Einstellung.
쐽
ColdFusion Data Source – Eine Datenquelle, die im ColdFusion-Administrator entsprechend dem ColdFusion-Konventionen definiert wurde. Wird nur in Verbindung mit dem Server benutzt.
An diesem Punkt entringt sich der Brust des Mac-Users gewöhnlich ein tiefer Seufzer der Klage: »Unter Windows hat man viel mehr Typen der Datenbankverbindung zur Auswahl als auf dem Mac. Das ist gemein!« (Als Powerbook-Benutzer kann ich in diese Klage nur
278
Datenbankverbindungen
einstimmen.) Doch gibt es eine Möglichkeit, Verbindungen zu Datenbanken herzustellen, für die nur Windows-ODBC-Treiber verfügbar sind. Macromedia hat UltraDev so programmiert, dass Datenbankverbindungen über den Anwendungsserver selbst erfolgen können. Wenn Sie also Ihre Sites auf einem Mac entwickeln, stehen Ihnen trotzdem sämtliche Verbindungstypen zur Verfügung. Zusätzlich können Sie sich noch per JDBC-Treiber mit Windows-Datenquellen verbinden, was ein weiteres Plus an Verbindungsoptionen darstellt. So, und jetzt wollen wir endlich unsere erste Datenbankverbindung erstellen. Wenn Sie Ihre Website richtig konfiguriert und Servermodell und Zugriffsmethode korrekt gewählt haben, kann es losgehen.
Eine Datenbankverbindung kreieren Um für Ihre Site eine Datenbankverbindung einzurichten, wählen Sie MODIFIZIEREN > VERBINDUNGEN, worauf sich das in Abb. 8.2 gezeigte Dialogfenster öffnet. Wenn Sie bis dato noch keine Datenbankverbindung in UltraDev eingerichtet haben, ist das Listenfeld leer. Wurden bereits Verbindungen definiert, können Sie sie hier durch Klick auf die entsprechende Schaltfläche bearbeiten, duplizieren oder entfernen.
Abbildung 8.2: Das Dialogfenster zur Einrichtung und Bearbeitung von Datenbankverbindungen
Oftmals ist es leichter, eine bereits definierte Datenbankverbindung zu duplizieren, statt eine neue einzurichten, falls diese neue Verbindung ähnlich der schon vorhandenen ist. Ich habe meistens die Syntax für einen JDBC-Verbindungsstring nicht im Kopf und muss dann meine Kenntnisse anhand eines bereits definierten Strings auffrischen. Klicken Sie auf den Button NEU, um eine neue Datenbankverbindung einzurichten. Je nach gewähltem Servermodell wird ein Popup-Menü angezeigt, über das Sie die Verbindungstypen konfigurieren können. Im Folgenden werden wir die einzelnen Einstellungsmöglichkeiten, nach Anwendungsservern getrennt, näher untersuchen. Gehen Sie zum Abschnitt für Ihre Plattform und lesen Sie dort, wie Sie für Ihre Site eine Datenbankverbindung einrichten.
279
Mac und Windows-PC für die Datenbankanbindung fit machen
Data Source Name (ASP) Default-Verbindungstyp ist eine ADO/ODBC-Verbindung, die einen Data Source Name (DSN) verwendet. Um einen Data Source Name zu vergeben, muss eine ODBC-Datenquelle für diesen Server und diese spezielle Datenbank definiert worden sein. Wenn Sie noch nie eine ODBC-Verbindung eingerichtet haben, sollten Sie unbedingt das entsprechende Unterkapitel am Ende dieser Lektion lesen, in dem die Einrichtung eines einfachen Datenbankservers und das Zusammenspiel mit UltraDev beschrieben wird. Neben den Anweisungen zur Installation des Servers wird auch die Einrichtung einer ODBC-Verbindung zu diesem Server beschrieben. Wie in Abb. 8.3 zu sehen, müssen Sie für eine Grundverbindung fünf Eingabefelder konfigurieren: 쐽
VERBINDUNGSNAME – Der Name, den Sie für diese Datenbankverbindung vergeben. Wählen Sie nach Möglichkeit einen ebenso einfachen wie sprechenden Namen, aus dem hervorgeht, zu welcher Datenquelle die Verbindung erstellt wurde. Wenn abzusehen ist, dass Sie den von UltraDev generierten Code von Hand editieren werden, sollten Sie einen Namen wählen, der sofort als entsprechende Variable im Code erkennbar ist. Das Programm schlägt zu diesem Zweck vor, dem Namen das Kürzel conn voranzustellen, damit ersichtlich ist, dass sich diese Variable auf eine Verbindung bezieht. Sie müssen sich aber daran nicht halten. Praktisch ist das nur von Nutzen, wenn Sie den Code von Hand editieren wollen.
쐽
DATA SOURCE NAME (DSN) – Der Data Source Name für die ODBC-Datenquelle, zu der die Verbindung erstellt wird. Bei der Arbeit mit lokalen Datenquellen können Sie unter Windows hier ein Popup-Menü öffnen und eine der bereits auf Ihrem Rechner definierten Datenquellen auswählen. Falls Sie mit Datenquellen auf dem Anwendungsserver arbeiten (die einzige Möglichkeit für Mac-User), klicken Sie auf die Schaltfläche DATA SOURCE NAME (DSN), um sich mit den auf dem Server liegenden Datenquellen zu verbinden. Unter Windows können Sie Datenquellen nicht nur über das Popup-Menü auswählen. Klicken Sie auf die Schaltfläche DEFINIEREN, um das ODBC-Dialogfenster zu öffnen. Nun können Sie einen neuen DSN für Ihren lokalen Rechner definieren.
쐽
BENUTZERNAME – Der Benutzername, der für den Datenbankzugriff für diese Verbindung vergeben wird.
쐽
KENNWORT – Das für die Verbindung erforderliche Passwort.
쐽
ULTRADEV SOLL VERBINDUNG HERSTELLEN – Über diese Optionsfelder teilen Sie dem Programm mit, ob es sich mit der Datenquelle über den Anwendungsserver verbinden oder eine lokale Datenquelle verwenden soll. Mac-Usern steht dies Option nicht zur Verfügung, da sie sich sowieso nur über den Anwendungsserver mit der Datenquelle verbinden können.
280
Datenbankverbindungen
Auf dem Mac werden zwar lokale ODBC-Verbindungen unterstützt, aber UltraDev macht von diesem Feature keinen Gebrauch. Falls UltraDev auf Mac OS X portiert wird, werden verbesserte Netzwerkfunktionen und damit auch ODBC-Verbindungen zur Verfügung stehen.
Abbildung 8.3: DSN-Verbindungen werden zu bereits existenten ODBCDatenquellen eingerichtet.
Bei der Konfiguration einer ODBC-Datenquelle werden zusammen mit dem DSN oft auch gleich ein Benutzername und ein Kennwort definiert. So müssen nicht noch einmal extra Benutzername und Kennwort vergeben werden, wenn eine Anmeldeseite eingerichtet wird. Wenn Sie alle Einstellungen vorgenommen haben, klicken Sie auf OK oder auf TESTEN, um zu überprüfen, ob eine funktionierende Verbindung eingerichtet wurde. Damit steht Ihre Datenbankverbindung. Wenn Sie möchten, können Sie die folgenden Abschnitte lesen, um mehr über andere Arten von Datenbankverbindungen zu erfahren.
Benutzerdefinierte Datenbankverbindungen (ASP-Server) Datenbankverbindungen über einen benutzerdefinierten Verbindungsstring einzurichten geht nicht ganz so bequem wie unter Verwendung eines DSN. Allerdings können Sie bei der Wahl des Speicherorts und der Einstellung anderer datenbankspezifischer Parameter wesentlich flexibler verfahren und müssen keine lokale ODBC-Datenquelle definieren. Da die einzelnen Parameter des Verbindungsstrings vom gewählten Datenbankserver abhängig sind, müssen Sie bei Einrichtung dieses Verbindungstyps die Dokumentation zu Ihrer Datenbank zu Rate ziehen. Abb. 8.4 zeigt das Dialogfenster zur Konfiguration des Verbindungsstrings. Für diesen Verbindungstyp müssen Sie lediglich zwei Eingabefelder ausfüllen: VERBINDUNGSNAME, d.h. den Verbindungsnamen, den UltraDev verwendet, und VERBINDUNGSSTRING. Den Aufbau und die genaue Syntax des ADO-Verbindungsstrings müssen Sie dem Handbuch zu Ihrer Datenbank entnehmen. Sie können zwei Arten von Verbindungsstrings definieren: mit DSN und ohne DSN. Die DSN-Variante ist lediglich eine Spielart
281
Mac und Windows-PC für die Datenbankanbindung fit machen
des eben besprochenen Verbindungstyps. Hier genügt für den Verbindungsaufbau allerdings bereits die Angabe des Data Source Name und optional von Benutzernamen und Kennwort.
Abbildung 8.4: Über Strings lässt sich eine Datenbankverbindung einrichten, ohne dass zuvor ein ODBCDSN definiert wurde.
Ein Verbindungsstring dieses Typs zu einer ODBC-Datenquelle namens mydatabase mit dem Benutzernamen myname und dem Kennwort mypassword würde folgendermaßen aussehen: dsn=mydatabase;uid=myname;pwd=mypassword;
Ein DSN-loser Verbindungsstring dagegen speichert wesentlich mehr Informationen. Er enthält sämtliche Angaben, die zur Verbindung mit einer ODBC-Datenquelle gebraucht werden. Ein DSN-loser Verbindungsstring zu einer Access-Datenbank mit Namen mydatabase.mbd auf Laufwerk c:\ wäre folgendermaßen aufgebaut: DRIVER={Microsoft Access Driver (*.mdb)};DBQ=c:\mydatabase.mdb
Anders als eine Verbindung zu bereits existenten Datenquellen hängt ein ADO-Verbindungsstring von den speziellen Datenbank-Features ab, die Sie einsetzen wollen. Schlagen Sie wegen näherer Informationen über die unterstützten Verbindungsattribute im Handbuch zu Ihrer Datenbank nach. Ähnlich wie bei der Datenbankverbindung über DSN können Sie auch hier wählen, ob die Verbindung über einen Treiber auf dem Anwendungsservers oder einen lokalen Treiber erfolgen soll. Mac-Usern steht nur die Verbindung über den Anwendungsserver zur Verfügung.
ColdFusion-Datenquellen (ColdFusion) ColdFusion verwaltet Datenbanken anders als andere Programme. Datenbanken werden direkt in der ColdFusion-Umgebung definiert und unabhängig von Standard-ODBC-Verbindungen verwaltet. Um eine ColdFusion-Datenquelle einzurichten, wählen Sie MODIFIZIEREN > VERBINDUNGEN > NEU > DATA SOURCE NAME (DSN). Abb. 8.5 zeigt die Dialogbox zur Konfigurierung einer ColdFusion-Datenquelle. Dieses Dialogfenster sieht der Palette zur Definition von ODBC-Verbindungen verblüffend ähnlich. Der einzige Unterschied besteht im Eingabefeld DSN. Wenn Sie die Option
282
Datenbankverbindungen
MITHILFE DES DSN AUF DEM ANWENDUNGSSERVER wählen, müssen Sie auf ANMELDUNG klicken, um sich auf dem ColdFusion-Server einzuloggen und sich eine Liste der verfügbaren Datenquellen anzeigen zu lassen.
Abbildung 8.5: Bei der Definition der Datenbankverbindung auf die Verwendung von ColdFusion-DSN achten
Ähnlich wie ODBC-DSNs speichern auch ColdFusion-DSNs Benutzernamen und Kennwort für gewöhnlich mit. Wenn Sie Ihren DSN mit diesen Angaben definiert haben, können Sie die Eingabefelder BENUTZERNAME und KENNWORT frei lassen. Wenn Sie nicht ständig freien Zugriff auf den Datenbankmanager des ColdFusion-Servers haben, können Sie Ihre Anwendungen unter Verwendung eines ODBC-DSN auf Ihrem Arbeitsrechner entwickeln. Diese Option ist bei der Konfigurierung von ColdFusion-Verbindungen standardmäßig voreingestellt. Über die Optionsfelder ULTRADEV SOLL VERBINDUNG HERSTELLEN können Sie zwischen der Verwendung von lokalen DSNs (ODBC) und ColdFusion-ODBCs (Anwendungsserver) wählen. Da auf dem Mac keine Verbindung zu lokalen ODBC-Datenquellen möglich ist, müssen Sie in diesem Fall MODIFIZIEREN > VERBINDUNGEN > NEU > DATA SOURCE NAMEADVANCED wählen. Dieses Dialogfenster ist im oberen Teil identisch mit der bereits bekannten Dialogbox, enthält aber noch zusätzlich Eingabefelder, um einen JDBC-Treiber zur Verbindung mit lokalen oder Netzwerk-Datenbanken zu konfigurieren. Näheres zu den hier erforderlichen Einstellungen erfahren Sie im folgenden Abschnitt über JDBCVerbindungen.
JDBC-Verbindungen (JSP-Server) Der letzte mögliche Verbindungstyp ist die JDBC-Verbindung. Haben Sie JSP als Serverplattform gewählt, zeigt Ihnen ein Klick auf ÄNDERN > VERBINDUNGEN > NEU sämtliche auf Ihrem System installierten JDBC-Treiber an. Wird der gewünschte Treiber nicht angeboten, wählen Sie BENUTZERDEFINIERTE JDBC-VERBINDUNG. Sie bekommen dann eine leere Konfigurationsmaske angezeigt. Dieser Verbindungstyp ist am schwierigsten einzurichten. Abb. 8.6 zeigt das Dialogfenster für einen MySQL-Treiber. Die Einstellungen leh-
283
Mac und Windows-PC für die Datenbankanbindung fit machen
nen sich etwas an den benutzerdefinierten Verbindungsstring an und erlauben die Anpassung der einzelnen Verbindungsparameter, die für den Zugriff auf entfernte Datenbanken gesetzt werden müssen.
Abbildung 8.6: Nicht gerade anwenderfreundlich: JDBC-Treiber
Wie bei den anderen Verbindungstypen auch, müssen Sie der Verbindung einen Namen zuweisen, damit UltraDev sie erkennt. Sie müssen ferner einen Benutzernamen und ein Kennwort für den Datenbankzugriff vergeben. So weit ist also alles wie gehabt, doch gibt es zwei weitere Eingabefelder, die der Erklärung bedürfen: 쐽
TREIBER – Die anderen Verbindungstypen kommen zwar auch nicht ohne Treiber aus, doch müssen Sie sie nicht speziell definieren, da sie bereits ins Betriebssystem integriert sind. Java hingegen wird von vielen Betriebssystemen immer noch als Add-on angesehen, daher müssen Sie dem System ausdrücklich mitteilen, wie der zu verwendende Treiber heißt. Java-Datenbanktreiber werden als Java-Klassen implementiert und sind daher auf jedem System lauffähig, sofern sie als reiner Java-Code implementiert wurden. Der Treiber für die MySQL-Datenbank, die Sie später noch einrichten werden, heißt org.gjt.mm.mySQL.Driver. Wenn Sie zusammen mit Ihrem Datenbankserver eine Dokumentation erhalten haben und er JDBC-Verbindungen unterstützt, sollte der Treiber sehr gut beschrieben sein.
쐽
URL – Hat in diesem Zusammenhang in etwa dieselbe Funktion wie der ADO-Verbindungsstring. In diesem Feld geben Sie ein, wohin und auf welche Weise die Verbindung erfolgt. Diese Einstellungen sind datenbankspezifisch, sodass Sie in Ihren Dokumentationsunterlagen die richtigen Parameter nachschlagen müssen. Die URL, mit der Sie zu einer MySQL-Datenbank eine JDBC-Verbindung aufbauen, sieht in etwa folgendermaßen aus: jdbc:mySQL://192.168.0.1/ud1, wobei »192.168.0.1« die IPAdresse Ihres Rechners wäre und »ud1« der Name Ihrer Datenbank.
Die Verbindung testen Nachdem wir eine Verbindung definiert haben, sollten wir zu guter Letzt noch testen, ob UltraDev nun auch wirklich mit der Datenbank kommunizieren kann. Der einfachste
284
Datenbankverbindungen
(und unspektakulärste) Weg ist ein kurzer, trockener Klick auf den Button TESTEN im Fenster VERBINDUNG DEFINIEREN. Hat alles geklappt, wird das Dialogfenster VERBINDUNG WURDE ERFOLGREICH HERGESTELLT angezeigt, wie in Abb. 8.7 zu sehen.
Abbildung 8.7: Der erfolgreiche Verbindungsaufbau wird durch dieses lakonische Fenster signalisiert.
Konnte kein Verbindungsaufbau erfolgen, erhalten Sie eine detaillierte Fehlermeldung der folgenden Art: 쐽
Benutzername/Kennwort ungültig
쐽
Falscher Hostname/Falsche IP-Adresse des entfernten Datenbankservers
쐽
Falscher Datenbankname
쐽
Ungültige Treibernamen
쐽
Zugriffsverweigerung auf dem Datenbankserver Wenn Sie einen ODBC-Treiber für Ihre Datenbankverbindung verwenden und eine Benutzername/Kennwort-Fehlermeldung erhalten, sollten Sie sich vergewissern, ob Sie den ODBC-DSN korrekt konfiguriert haben. Vielleicht haben Sie im Konfigurationsmenü Namen oder Passwort falsch eingegeben. Wenn Sie noch keinen ODBC-Treiber eingerichtet haben, möchte ich Sie noch einmal daran erinnern, sich mit dem Kapitel MySQL und ODBC-Treiber am Ende dieser Lektion zu befassen.
Gehen wir einmal ganz optimistisch und zuversichtlich davon aus, dass der Verbindungstest positiv war. Wenn nicht, müssen Sie wohl oder übel noch einmal alle Einstellungen durchgehen und genau überprüfen. Wenn Sie hier keine Fehler entdecken können, könnte das Problem beim Datenbankserver selbst liegen, vor allem wenn Sie sich mit einer Datenbank auf einem entfernten Server verbinden. Die meisten Datenbankserver können den Zugang IP-abhängig sperren. Es ist sogar so, dass die meisten Datenbankserver den Zugriff für sämtliche Anwender zunächst einmal grundsätzlich sperren und erst im Bedarfsfall freigeben. In solchen Fällen müssten Sie zunächst einige Einstellungen an der Datenbank selbst verändern, bevor Sie darauf zugreifen können.
285
Mac und Windows-PC für die Datenbankanbindung fit machen
Eine Testabfrage durchführen Unsere Verbindung wurde also erfolgreich aufgebaut und wir könnten so weit ganz glücklich sein. Aber ist dieses kleine graue Mitteilungsfenster wirklich alles, was wir uns vom Leben erhofft haben? Nein! Wenn Sie mit eigenen Augen sehen wollen, dass Sie nun wirklich mit Ihrer Datenbank verbunden sind, schließen Sie zunächst die Fenster VERBINDUNGEN DEFINIEREN und VERBINDUNGEN. Öffnen Sie nun in der Dokumentansicht eine neue Datei. Das Dokument kann ruhig leer sein, wir müssen nur ein Serververhalten hinzufügen, um überprüfen zu können, ob die Verbindung wirklich aktiv ist. 1. Öffnen Sie die Palette SERVERVERHALTEN. 2. Klicken Sie auf das Plussymbol (+), um dem Dokument ein neues Verhalten zuzuweisen. 3. Wählen Sie den Befehl DATENSATZGRUPPE (ABFRAGE). 4. Wählen Sie in der nun geöffneten Dialogbox im Popup-Menü VERBINDUNG die Verbindung, die Sie gerade eingerichtet haben. 5. Wählen Sie aus dem Popup-Menü TABELLE eine Tabelle aus Ihrer Datenbank. Diese Tabelle sollte bereits mit einigen Daten gefüllt sein. 6. Klicken Sie zuletzt auf die Schaltfläche TESTEN. Die Testabfrage einer Datensatzgruppe (siehe Abb. 8.8) ist in der Tat ein weit befriedigenderer Beweis dafür, dass unser Bemühen nicht fruchtlos war.
Abbildung 8.8: Die Testabfrage einer Datensatzgruppe zeigt die tatsächlichen Daten einer Tabelle an.
Das sollte eigentlich Beweis genug sein, dass die Dinge tatsächlich funktionieren wie behauptet. Wenn nicht, dann harren Sie der morgigen Lektion.
286
Java/ODBC-Verbindung einrichten (Macintosh/Windows NT)
8.2
Java/ODBC-Verbindung einrichten (Macintosh/Windows NT)
Datenbanken werden auf dem Mac bisher eher wenig unterstützt. Es gibt zwar einen ODBC-Treiber-Manager, aber dieser führt ein ziemliches Schattendasein. Die meisten Mac-User wissen nicht einmal, dass er überhaupt existiert. Diese Verhältnisse könnten sich allerdings mit der Einführung von Mac OS X ändern, das dank seiner verschiedenen UNIX-Unterbauten mit einer guten ODBC-Unterstützung kommt. Doch gibt es auch für all diejenigen, die ihr altes Mac OS weiter verwenden wollen, eine Möglichkeit, UltraDev für die Entwicklung dynamischer Websites einzusetzen: ein JDBC/ ODBC-Gespann, das per RmiJdbc-Treiber aneinander gekoppelt wird. Dieses kleine Stückchen Software verlinkt zwei JDBC-Treiber miteinander. Im Zusammenspiel mit einem JDBC-ODBC-Treiber auf einem Windows NT-Rechner kann ein Mac mithilfe dieses Treibers auf Datenquellen unter NT zugreifen. Windows NT fungiert als Übersetzer zwischen den ODBC-Treibern auf dem Rechner und der JDBC-Verbindung zum Mac. Somit steht jede auf dem NT-Server verfügbare ODBC-Datenbankverbindung nun auch auf dem Mac als JDBC-Datenquelle zur Verfügung. Als weitere Konsequenz stehen damit auch auf dem Mac die meisten Datenbanken für die Entwicklung von ColdFusion- und JSP-Anwendungen offen. Abb. 8.9 veranschaulicht das Zusammenspiel der verschiedenen Treiber.
Mac OS
RMIJDBC
Windows NT/2000
ODBC/ADO
Datenbanken
RMIJDBC
Abbildung 8.9: Der ODBC-JDBC-Treiber fungiert als Übersetzer und öffnet dem Mac den Weg in eine größere Datenbankwelt.
Den Macintosh-JDBC-Client-Treiber installieren Dann wollen wir zur Tat schreiten. Voraussetzung ist, dass Sie neben Ihrem Mac auch noch einen NT-Server besitzen und dass beide Rechner miteinander vernetzt sind. Als NTRechner genügt ein alter Pentium 90. Für den Übersetzungsdienst ist dessen Leistung ausreichend.
287
Mac und Windows-PC für die Datenbankanbindung fit machen
Auf dem Mac müssen Sie folgende Installationsschritte durchführen: Kopieren Sie die Datei RmiJdbc.jar von der UltraDev-CD auf die Festplatte. Sie können auch die aktuellste Version des Treibers als gepackte Datei aus dem Internet herunterladen: http://www.objectweb.org/RmiJdbc/rmijdbcDownload.htm
Macromedia gibt im Handbuch zu UltraDev eine andere Download-Adresse für den RmiJdbc-Treiber an. Unter diesem Link liegt die Macromedia-Version des Treibers. Der Link, den ich im Buch angebe, führt zur Homepage der RmiJdbc-Entwickler. Ich empfehle Ihnen, auf dieser Website vorbeizuschauen, egal woher Sie Ihren Treiber beziehen, denn auf dieser Seite finden Sie wertvolle Informationen. Nebenbei bemerkt funktioniert dieser Treiber nicht nur auf dem Mac. Sie können ihn immer verwenden, wenn Sie über Netzwerk auf einen anderen JDBC-Treiber zugreifen möchten (in diesem Fall den JDBC-ODBC-Treiber von Sun). Nun müssen den Treiber noch im richtigen Verzeichnis installieren – im Systemordner unter Extensions > MRJ Libraries > MRJClasses (siehe Abb. 8.10).
Abbildung 8.10: Der Ordner MRJClasses: Hier werden der RmiJdbcund alle anderen Java-Treiber installiert.
Falls dieser Ordner auf Ihrem Rechner nicht existiert, haben Sie vermutlich nicht die richtige Version des Macintosh Runtime for Java installiert. Dem lässt sich aber leicht abhelfen, da auf der UltraDev-CD die aktuellste Version des MRJ installiert ist. Alternativ können Sie sich die letzte Version bei Apple herunterladen: http://asu.info.apple.com/
288
Java/ODBC-Verbindung einrichten (Macintosh/Windows NT)
Nachdem Sie die .jar-Datei mit dem JDBC-Treiber im richtigen Verzeichnis installiert haben, sollten Sie den Rechner neu starten, damit das System den Treiber erkennt. Danach ist der Treiber einsatzbereit. Nach dem Neustart können Sie mittels RmiJdbcTreiber eine Datenbankverbindung einrichten. Eine korrekt konfigurierte Verbindung sehen Sie in Abb. 8.11.
Abbildung 8.11: Konfigurieren Sie in UltraDev den RmiJdbc-Treiber, um auf den NT-Server zugreifen zu können.
Folgende Parameter müssen Sie in die Eingabefelder eintragen. Sie müssen auch die Design-Zeit-Einstellungen entsprechend diesen Werten verändern: 쐽
TREIBER (DRIVER) – RmiJdbc.RJDriver
쐽
BENUTZERNAME (USER NAME) – Der Benutzername, mit dem Sie sich an der Datenbank auf dem NT-Server anmelden.
쐽
KENNWORT (PASSWORD) – Das Kennwort, mit dem Sie sich an der Datenbank anmelden.
쐽
URL – jdbc:rmi:///jdbc:odbc:<Windows NT Data Source Name>
Wenn Sie zum ersten Mal einen JDBC-Treiber auf einem Mac einrichten, könnte Ihnen beim Anblick des Eingabefeldes TREIBER vielleicht der Gedanke kommen, dass es sich hier um eine bestimmte Datei handelt, die an einem bestimmten Ort auf dem Rechner gespeichert ist. Doch ein Suchlauf mit Sherlock fördert nichts zu Tage. Die .jar-Datei, die Sie zuvor installiert haben, ist eine Archivdatei, die eine oder mehrere Java-Klassen enthält, die zusammen den Treiber bilden. Wenn Ihr System einen JDBC-Treiber anfordert, durchsucht es die .jar-Datei nach den benötigten Klassen. Das klingt vielleicht etwas ungewohnt, aber es funktioniert.
289
Mac und Windows-PC für die Datenbankanbindung fit machen
Nachdem Sie Ihren Mac eingerichtet haben, müssen Sie sich um den NT-Server kümmern, der die ODBC-Datenquelle verwaltet und sie dem Mac zur Verfügung stellt. Die Konfiguration der NT-Server-Seite ist etwas aufwändiger, fassen Sie sich daher in Geduld, wenn nicht alles gleich beim ersten Mal klappt.
Den Windows NT-JDBC-ODBC-Server konfigurieren Für diesen Abschnitt wird davon ausgegangen, dass Sie Windows NT 4.0-Server und mindestens Service Pack 4 installiert haben. Wenn Sie NT frisch aufgespielt haben, um dessen JDBC/ODBC-Übersetzungsdienste zu nutzen, sollten Sie unbedingt erst die erforderlichen Service Packs installiert haben, bevor Sie weitere Schritte unternehmen. Damit der NT-Rechner als Übersetzer zwischen einer ODBC-Datenquelle und einem Mac mit RmiJdbc-Treiber fungieren kann, muss zunächst auf der Windows-Maschine ein funktionierender ODBC-Treiber eingerichtet werden. Bevor diese Voraussetzung nicht gegeben ist, wäre es ziemlich unklug, irgendwelche weiteren Schritte zu unternehmen. Eine falsch konfigurierte ODBC-Datenquelle kann das Leben zur Hölle machen, wenn Sie in einem Client-Server-Pool nach Fehlern in der JDBC-ODBC-Verbindung suchen müssen. Falls Sie noch nie einen ODBC-Treiber konfiguriert haben, sollten Sie zuerst den entsprechenden Abschnitt am Ende des Kapitels über die Verbindung einer ODBCDatenquelle mit einer MySQL-Datenbank lesen. Dort wird die Installation einer MySQLDatenbank beschrieben sowie die Konfiguration der ODBC-Verbindung. Zweitens müssen Sie auf Ihrem NT-Rechner Java installieren. Hierzu müssen Sie sich lediglich den Java-Installer 1.1.8 von der Sun-Website herunterladen: http://java.sun.com/products/jdk/1.1/jre/download-jre-windows.html
Java 1.1.8 ist die jüngste Version der 1.1-Java-Implementierung. Haben Sie Java 2 (1.2) installiert oder möchten es verwenden, sollte es keine Probleme geben. Die Version 1.1.8 ist die Version von Java, die von allen Plattformen (Windows, Mac, Linux) unterstützt wird. Die Version 2.0 leidet noch an gewissen Kinderkrankheiten, aber man darf davon ausgehen, dass sie bald ausgereift ist und die Version 1.1.8 ablöst. Nachdem Sie sich das Java Development Kit heruntergeladen haben, installieren Sie es mit Doppelklick auf das Icon INSTALLIEREN und folgen den Anweisungen des Installationsprogramms. Während des Installationsvorgangs wird lediglich die Java-Distribution in einem Ordner auf dem Windowsrechner abgelegt. Der ganze Vorgang ist eine Sache von Minuten. Legen Sie als Nächstes einen Ordner für die Datei RmiJdcb.jar an, z.B. c:\rmijdcb, und laden Sie den Treiber unter folgender Webadresse herunter: http://www.objectweb.org/RmiJdbc/rmijdbcDownload.htm
290
Java/ODBC-Verbindung einrichten (Macintosh/Windows NT)
Sie können natürlich auch den Treiber von der Programm-CD verwenden, ganz nach Belieben. Im letzten Schritt müssen Sie den Pfad der Datei RmiJdbc.jar in die CLASSPATH-Umgebungsvariable von NT schreiben. So findet das Java-Laufzeitsystem die .jar-Datei und kann die dort gespeicherte RmiJdbc-server-class ausführen. Dieser Vorgang ist identisch mit dem Ablegen der .jar-Datei im Ordner MRJClasses auf dem Mac. Der Unterschied ist der, dass Sie unter NT Java-Klassen in jedes beliebige Verzeichnis schreiben können, solange Sie den Pfad in die CLASSPATH-Variable eintragen. Mac OS sieht standardmäßig im Ordner MRJClasses nach. Um die CLASSPATH-Variable auf dem NT-Server zu setzen, befolgen Sie folgende Schritte: 1. Klicken Sie mit der rechten Maustaste auf das Symbol ARBEITSPLATZ. 2. Wählen Sie im Kontextmenü die Option EIGENSCHAFTEN. 3. Klicken Sie auf die Registerkarte UMGEBUNG. Unter Windows 2000 klicken Sie auf das Register FORTGESCHRITTEN und dann auf die Schaltfläche UMGEBUNGSVARIABLE. 4. Scrollen Sie durch das Listenfeld SYSTEMVARIABLEN und suchen Sie den Eintrag CLASSPATH und markieren Sie ihn mit einem Mausklick. Die Variable CLASSPATH wird dann im Feld Variable unten im Fenster angezeigt. 5. Sollte die Variable CLASSPATH nicht gesetzt sein, tragen Sie sie in das Feld VARIABLE ein. Unter Windows 2000 klicken Sie auf den Button NEU und nennen die Variable CLASSPATH. 6. Tragen Sie in das Feld WERT den Pfad der Datei RmiJdbc.jar ein. Haben Sie die Variable eben erst definiert, brauchen Sie nur c:\rmijdbc einzugeben. Ist die Variable bereits gesetzt, hängen Sie den Pfad, getrennt durch ein Semikolon (;), einfach an bereits definierte Pfade an. 7. Klicken Sie auf die Schaltfläche SETZEN (Windows 2000: OK). Die neue gesetzte bzw. modifizierte Variable CLASSPATH wird nun in der Liste SYSTEMVARIABLEN angezeigt. In Abb. 8.12 wurde im Dialogfenster SYSTEMEIGENSCHAFTEN die Variable CLASSPATH markiert und ihr ein Wert zugewiesen. Bevor Sie das Dialogfenster SYSTEMEIGENSCHAFTEN schließen, sollten Sie auch noch den Pfad zum Verzeichnis bin des Java-Laufzeitsystems angeben. Wenn Sie diesen Wert nicht setzen, müssen Sie jedes Mal den vollen Pfad angeben, wenn Sie Java starten. Je nachdem, wo Sie das Java-Laufzeitsystem installiert haben, sieht der Pfad etwa folgendermaßen aus: c:\jdk1.1.8\bin. Führen Sie noch einmal die gleiche Prozedur wie beim Setzen der Variable CLASSPATH durch, nur dass Sie diesmal die Variable PATH bearbeiten und den Pfad zum Java-Laufzeitsystem an den bereits existierenden Pfad anfügen. (Die Variable PATH ist bereits vorhanden, Sie müssen Sie nicht neu setzen.) Klicken Sie zum Abschluss wieder auf SETZEN, damit Ihre Änderungen gespeichert werden.
291
Mac und Windows-PC für die Datenbankanbindung fit machen
Abbildung 8.12: Durch Setzen der CLASSPATH -Variable kann Java die Datei RmiJdbc finden.
Haben Sie im Dialogfenster SYSTEMEIGENSCHAFTEN sämtliche Einstellungen getroffen, schließen Sie mit Klick auf OK und starten Sie anschließend den Rechner neu, damit alle Änderungen wirksam werden. Nach dem Neustart des Rechners können Sie den RmiJdbc-Server starten. Öffnen Sie die Kommandozeile und geben Sie Folgendes ein: java RmiJdbc.RJJdbcServer sun.jdbc.odbc.JdbcOdbcDriver
Der Server startet daraufhin ohne großes Tamtam. Kein großartiges Schauspiel, aber es funktioniert. Sobald der Server läuft, können Sie am Mac eine Verbindung zu jeder beliebigen Datenquelle auf dem NT-Server herstellen. Der RmiJdbc-Treiber kommuniziert mit dem RmiJdbc-Server auf dem NT-Rechner, der wiederum mit dem der ODBC-Datenquelle kommuniziert. Der einzige Haken an dieser Konfiguration ist, dass sie zwar läuft, aber dass Sie jedes Mal, wenn Sie den Rechner neu starten oder die Kommandozeile schließen, auch diesen Prozess neu starten müssen. In einer Produktionsumgebung, wo Server und Datenbank rund um die Uhr verfügbar sein müssen, ist das nicht sehr praktikabel. Sie können den RmiJdbc-Treiber unter Windows NT jedoch als Dienst einrichten. In diesem Fall wird der RmiJdbc-Server automatisch neu gestartet, wenn der Rechner gebootet wird. Der Server läuft im Hintergrund, ohne dass Sie die Kommandozeile öffnen müssen.
292
Java/ODBC-Verbindung einrichten (Macintosh/Windows NT)
Die Originalanleitung, wie man den RmiJdbc-Server als Dienst einrichtet, stammt von der RmiJdbc-Website. Ich stelle diese Informationen hier in modifizierter Form zur Verfügung. Für weitere Informationen empfiehlt sich ein Besuch auf der ObjectWeb-Website: http://www.objectweb.org/RmiJdbc/
Den RmiJdbc-Server als Dienst konfigurieren Damit Sie den RmiJdbc-Server als Dienst einrichten können, brauchen Sie die Datei srvany.exe aus dem Resource Kit von Windows NT. Für die folgenden Ausführungen wird davon ausgegangen, dass Sie diese Datei im Verzeichnis c:\tools gespeichert haben. Führen Sie nach der Installation folgende Schritte aus: 1.
Starten Sie INSTSRV RmiJdbc c:\tools\svrany.exe.
2. Wählen Sie START > AUSFÜHREN. 3. Tippen Sie regedit in das Eingabefeld ÖFFNEN, um den Registrierungseditor zu öffnen. 4. Erzeugen Sie einen neuen Schlüssel: HKEY_LOCAL_MACHINE\SYSTEM \CurrentControlSet\Services\RmiJdbc\Parameters.
5. Erzeugen Sie unter diesem Schlüssel einen neuen Eintrag Application mit dem Namen REG_SZ und dem Wert einer .cmd-Datei, die die Parameter für den RmiJdbcServer enthält, z.B. c:\rmijdbc\rmijdbc.cmd. 6. Schließen Sie den Registrierungseditor. Nun müssen Sie die Datei c:\rmijdbc\rmijdbc.cmd erzeugen, die den Rmidbc-Server startet. Nachstehend finden Sie ein entsprechendes Beispielskript. Dabei wird davon ausgegangen, dass die Variable CLASSPATH richtig gesetzt wurde und das Java-Laufzeitsystem im Verzeichnis c:\jdk1.1.8\bin liegt. @echo off c:\jdk1.1.8\bin\java RmiJdbc.RJJdbcServer sun.jdbc.odbc.JdbcOdbcDriver > c:\rmijdbc \rmijdbc_server.log
Als letzten Schritt konfigurieren Sie den neuen Dienst so, dass er automatisch gestartet wird, wenn der Rechner bootet. 1. Klicken Sie auf START. 2. Wählen Sie EINSTELLUNGEN > SYSTEMSTEUERUNG. 3. Öffnen Sie das Kontrollfenster DIENSTE. 4. Suchen Sie den neu definierten Dienst »RmiJdbc« und markieren Sie ihn. 5. Klicken Sie auf STARTART, um zu definieren, wie der Dienst gestartet werden soll.
293
Mac und Windows-PC für die Datenbankanbindung fit machen
6. Wählen Sie die Option AUTOMATISCH. 7. Schließen Sie das Kontrollfenster und starten Sie den Rechner neu. 8. Der Dienst wird nach dem Neustart automatisch gestartet. Sie müssen sich nicht einloggen oder den Dienst von Hand starten. Nach dieser Prozedur können Sie sich wieder wie gewohnt Ihrem Mac widmen. Das ganze Verfahren scheint zwar recht aufwändig, doch müssen Sie nur ein paar problemlos erhältliche Programmpakete installieren und bestimmte Einstellungen vornehmen, die denen bei der Einrichtung anderer Datenbankverbindungen weitgehend ähnlich sind. Mit der oben beschriebenen Konfiguration haben Sie auf dem Mac mehr oder weniger dieselben Zugriffsmöglichkeiten auf Datenbanken wie unter Windows.
8.3
MySQL installieren
Das letzte Thema des heutigen Tages beschäftigt sich mit der Einrichtung der MySQLDatenbank. MySQL ist ein Open Source-Datenbanksystem, das weitgehend konform zu den SQL-Spezifikationen ist. Leider unterstützt es bestimmte recht nützliche Features von UltraDev wie Ansichten und gespeicherte Prozeduren nicht, dafür ist es aber sehr schnell und stabil und gerade für den Einsatz von Webanwendungen sehr beliebt. Das Sympathische an MySQL ist, dass es für viele Plattformen erhältlich ist und als Open Source-Produkt frei für andere Plattformen kompiliert werden darf. (Die binäre Version für Windows ist allerdings Shareware.) Zuerst werden wir MySQL unter Windows konfigurieren, und dann werden wir uns ansehen, wie wir es unter UNIX/Linux zum Laufen bringen.
MySQL unter Windows einrichten Der MySQL-Server läuft ohne Probleme unter Windows 95/98 und natürlich auch unter NT. Spielen Sie jedoch mit dem Gedanken, MySQL in irgendeiner Form als professionellen Datenbankserver einzusetzen, weichen Sie besser auf NT als Produktionsplattform aus. Unter NT können Sie MySQL als Standard-Dienst einrichten. Unter Windows ist die Installation von MySQL mit ein paar Handgriffen erledigt, da das Programm bereits kompiliert ist: 1. Laden Sie die aktuelle Version von MySQL Win32 aus dem Internet herunter: http: //www.mysql.com/. Die Windowsvariante liegt manchmal in einer älteren Version vor als das UNIX-Paket. Sehen Sie ab und zu unter dieser Adresse nach, ob zwischenzeitlich aktuellere Versionen angeboten werden.
294
MySQL installieren
2. Entpacken Sie die Datei. 3. Starten Sie das Setup-Programm. 4. Folgen Sie den Anweisungen des Installationsprogramms. Nach erfolgter Installation können Sie nach ein paar Handgriffen loslegen. Öffnen Sie das Installationsverzeichnis. Da das Programm nicht ins Startverzeichnis eingetragen wird, müssen Sie das Installationslaufwerk durchsuchen. Das MySQL-Verzeichnis besteht aus mehreren Ordnern. Für unsere Zwecke ist das Verzeichnis bin wichtig. Hier liegen die verschiedenen Applikationen, die wir brauchen, um MySQL zu kontrollieren. Die beiden, mit denen wir arbeiten werden, sind mysqld und mysql. MySQL ist eine Client/Server-Anwendung. Auch bei rein lokalem Einsatz braucht MySQL einen Client, um mit dem Server zu kommunizieren. mysqld ist ein Server ohne Oberfläche, die Clientanwendung heißt mysql. Den Server starten Sie mit der Betriebssystem-spezifischen Version von mysqld – mysqld-opt unter Windows 95/98, unter NT mysqld-nt. Durch Doppelklicken auf die entsprechende Version wird der Server gestartet und verschwindet sofort von der Oberfläche. Das heißt nicht, dass die Serveranwendung wieder geschlossen wurde, sie legt sich nur automatisch in den Hintergrund. Unter NT können Sie MySQL als Dienst einrichten. Dazu müssen Sie das Programm folgendermaßen aufrufen: c:\mysql\bin\mysqld-nt-install
Dabei wird natürlich davon ausgegangen, dass MySQL im Verzeichnis c:\mysql liegt – passen Sie den Pfad Ihrer Arbeitsumgebung entsprechend an. Als Nächstes müssen Sie den neu eingerichteten MySQL-Dienst so konfigurieren, dass er automatisch gestartet wird. Nähere Informationen hierzu finden Sie im Abschnitt »RmiJdbc-Server als Dienst konfigurieren«.
MySQL auf UNIX-Systemen einrichten MySQL auf UNIX-Systemen einzurichten erfordert etwas Handarbeit. Verwenden Sie eine Linux-Distribution, müssen Sie sich nur eine RPM herunterladen und folgen der Installationsroutine. Ansonsten müssten Sie sich eine vorkompilierte Version besorgen oder den Sourcecode selbst kompilieren. Im letzteren Falle laden Sie den Sourcecode unter folgender Adresse herunter: http:// www.mysql.com/downloads/
und entpacken Sie ihn. Die Version, die in diesem Buch verwendet wird, ist mysql-3.23.21beta.tar.gz, die aktuellste, die zum Zeitpunkt, als ich diese Zeilen schrieb, erhältlich war.
295
Mac und Windows-PC für die Datenbankanbindung fit machen
[jray@contempt mysql ]$tar -zvxf mysql-3.23.21-beta.tar.gz | more mysql-3.23.21-beta/ mysql-3.23.21-beta/Makefile.in mysql-3.23.21-beta/README mysql-3.23.21-beta/stamp-h.in mysql-3.23.21-beta/COPYING mysql-3.23.21-beta/COPYING.LIB mysql-3.23.21-beta/Makefile.am mysql-3.23.21-beta/acconfig.h mysql-3.23.21-beta/acinclude.m4 ... mysql-3.23.21-beta/support-files/my-huge.cnf.sh mysql-3.23.21-beta/support-files/mysql-log-rotate.sh mysql-3.23.21-beta/support-files/mysql.server.sh mysql-3.23.21-beta/support-files/binary-configure.sh
Starten Sie nun das Konfigurationsprogramm, um eine Makefile für Ihr System zu erzeugen. Daraufhin werden die erforderlichen Systemdaten ausgelesen, was unter Umständen etwas dauern kann. creating checking checking checking .. creating creating creating creating creating creating ...
cache ./config.cache host system type... i686-pc-linux-gnu target system type... i686-pc-linux-gnu build system type... i686-pc-linux-gnu sql-bench/Makefile tests/Makefile Docs/Makefile support-files/Makefile include/mysql_version.h config.h
Ist die Konfigurierung abgeschlossen, müssen Sie das Programm kompilieren. Starten Sie die Kompilierung mit dem Befehl »make«. (Dieser Vorgang dauert eine gewisse Zeit.) [jray@contempt mysql-3.23.21-beta ]$ make make all-recursive make [1]:Entering directory '/home/jray/mysql/mysql-3.23.21-beta ' ... binary-configure.sh > binary-configure-t /bin/mv binary-configure-t binary-configure make [2]:Leaving directory '/home/jray/mysql/mysql-3.23.21-beta/support-files ' make [2]:Entering directory '/home/jray/mysql/mysql-3.23.21-beta ' make [2]:Nothing to be done for 'all-am '. make [2]:Leaving directory '/home/jray/mysql/mysql-3.23.21-beta ' make [1]:Leaving directory '/home/jray/mysql/mysql-3.23.21-beta '
296
MySQL installieren
Die Installation ist ebenfalls einfach. Geben Sie nur den Befehl »make install« ein: [jray@contempt mysql-3.23.21-beta]$ make install Making install in include make [1]:Entering directory '/home/jray/mysql/mysql-3.23.21-beta/include ' make [2]:Entering directory '/home/jray/mysql/mysql-3.23.21-beta/include ' make [2]:Nothing to be done for 'install-exec-am '. /bin/sh ../mkinstalldirs /usr/local/include/mysql mkdir /usr/local/include .. make [2]:Nothing to be done for 'install-data-am '. make [2]:Leaving directory '/home/jray/mysql/mysql-3.23.21-beta ' make [1]:Leaving directory '/home/jray/mysql/mysql-3.23.21-beta '
Starten Sie jetzt den Server. Ist er standardmäßig im Verzeichnis /usr/local/bin installiert, geben Sie Folgendes ein: [jray@contempt mysql-3.23.21-beta]$ /usr/local/bin/safe_mysqld &
Über ein Skript können Sie den MySQL-Server starten, wenn der Rechner bootet. Näheres hierzu finden Sie in der MySQL-Dokumentation und im Handbuch zu Ihrer Linux-Distribution.
Den MySQL-Server testen Um die erfolgreiche Installation von MySQL (unter Windows und Linux) zu testen, stellen Sie per mysql-Client eine Verbindung zum Datenbankserver her. Anschließend können Sie die Systemdatenbank von MySQL auslesen, in der verschiedene Tabellen zur Zugriffskontrolle auf den Datenbankserver gespeichert sind. Einzelheiten zur Konfiguration entnehmen Sie bitte der Dokumentation zu MySQL. Einen grundlegenden Funktionstest führen Sie über die Kommandozeile (Windows: MSDOS-Eingabeaufforderung) durch. Es folgt eine Beschreibung der erforderlichen Schritte unter Windows. Wechseln Sie zunächst in das Verzeichnis mysql/bin, geben Sie dann am DOS-Prompt den Befehl »mysql« ein, um den Client zu starten. Verbinden Sie sich mit der Systemdatenbank mit dem Befehl »connect mysql;«. Geben Sie zuletzt den Befehl »show tables;« ein. Sie schließen den Client mit dem Befehl »quit«. Welcome to the mySQL monitor. Commands end with ; or \g. Your mySQL connection id is 10 to server version: 3.23.29a-gamma Type 'help;' or '\h' for help. Type '\c' to clear the buffer mysql> connect mysql; Connection id: 11 Current database: mysql mysql>show tables;
297
Mac und Windows-PC für die Datenbankanbindung fit machen
+-----------------+ | Tables_in_mysql | +-----------------+ | columns_priv | | db | | host | | tables_priv | | user | +-----------------+ 5 rows in set (0.00 sec) mysql>quit Bye
Als Folge dieser Operation wird die interne Datenbank mysql, die Zugriffsrechte regelt, sowie die zugehörigen Tabellen angezeigt. Zwar kein Augenschmaus, aber ein Beweis, dass der Server läuft. Nähere Informationen finden Sie unter http://www.mysql.com/
ODBC-Datenquelle für MySQL einrichten Bevor Sie einen ODBC-Treiber für MySQL einrichten können, müssen Sie ihn erst aus dem Internet unter folgender Adresse herunterladen: http://www.mysql.com/downloads/ api-myodbc.html. Wählen Sie aus den angebotenen Versionen die richtige für Ihre Windowsplattform aus (95/98, NT). Achtung: Laden Sie die Full-Setup-Version herunter! Starten Sie nach erfolgtem Download das Setup-Programm: 1. Klicken Sie im Begrüßungsfenster auf den Button CONTINUE. 2. Daraufhin wird das Dialogfenster INSTALL DRIVERS angezeigt (siehe Abb. 8.13). Markieren Sie im Listenfeld AVAILABLE ODBC DRIVERS den MySQL-Treiber, sonst wird er nicht installiert. Klicken Sie anschließend auf OK.
Abbildung 8.13: Markieren Sie den MySQL-Treiber, ansonsten wird er nicht installiert.
298
MySQL installieren
3. Nachdem der Treiber installiert wurde, werden Sie aufgefordert, eine ODBC-Datenquelle zu definieren. Diesen Schritt können Sie ohne Weiteres abbrechen. Wir werden das anschließend per Standard-Prozedur erledigen. Falls Sie eine Fehlermeldung erhalten, dass Sie Ihr System neu booten und den Installationsvorgang wiederholen sollen, kann es unter Umständen genügen, wenn Sie das Setup etwas modifizieren. Klicken Sie im Dialogfenster auf den Button ADVANCED und wählen Sie die Option DO NOT INSTALL DRIVER MANAGER und schließen das Fenster mit OK. In den meisten Fällen ist damit das Problem behoben. Sobald der Treiber installiert ist, können Sie eine Datenquelle definieren. Führen Sie hierzu folgende Schritte aus (ein anschließender Neustart ist nicht erforderlich): 1. Klicken Sie auf START. 2. Wählen Sie EINSTELLUNGEN > SYSTEMSTEUERUNG. 3. Öffnen Sie mit Doppelklick das Kontrollfenster ODBC-DATENQUELLEN (Windows 9x/NT). Unter Windows 2000 klicken Sie auf VERWALTUNG und dann DATENQUELLEN (ODBC). 4. Öffnen Sie die Registerkarte SYSTEM-DSN. 5. Klicken Sie auf HINZUFÜGEN. 6. Wählen Sie den MySQL-Treiber aus der Liste und klicken Sie auf FERTIG STELLEN. 7. Es öffnet sich das in Abb. 8.14 gezeigte Konfigurationsfenster. Nehmen Sie die entsprechenden Einstellungen vor und klicken Sie auf OK. Nun ist die Datenquelle einsatzbereit. Abb. 8.14 zeigt die Konfiguration einer Testdatenbank, die ich während der Arbeit an diesem Buch verwendet habe. Im Einzelnen können Sie folgende Einstellungen vornehmen: 쐽
WINDOWS DNS NAME – Vergeben Sie einen frei gewählten Data Source Name, um sich mit der Datenquelle zu verbinden.
쐽
MYSQL HOST – Der Hostname des Datenbankservers.
쐽
MYSQL DATABASE NAME – Name der Datenbank auf dem MySQL-Server.
쐽
USER – Der Benutzername, mit dem Sie sich auf dem MySQL-Server anmelden.
쐽
PASSWORD – Das Kennwort für die Datenbank, sofern eines vergeben wurde.
쐽
PORT – Sofern Sie nicht irgendwelche Netzwerkeinstellungen des MySQL-Servers verändert haben, können Sie dieses Feld leer lassen.
299
Mac und Windows-PC für die Datenbankanbindung fit machen
Abbildung 8.14: Mit einigen wenigen Einstellungen sind Sie mit der Datenbank verbunden. 쐽
SQL COMMAND ON CONNECT – Befehle, die nach dem Verbindungsaufbau auf dem Server durchgeführt werden sollen.
Sofern die Verbindung zur Datenbank mysql korrekt definiert wurde, können Sie sofort damit arbeiten. Mit MS Access oder einer anderen Anwendung lässt sich eine Verbindung schnell testen. Waren Sie nicht auch überwältigt von den zahllosen Einstellungsmöglichkeiten, die myODBC bietet? Die meisten können Sie unbeachtet lassen, der Treiber funktioniert trotzdem. Wenn Sie Näheres dazu wissen wollen, werden Sie in der Dokumentation zum MySQL-Server fündig.
8.4
Eine ODBC-Datenquelle für Microsoft Access definieren
Auf vielen Windowsrechnern ist MS Access schon installiert und kann für Datenbankanbindungen mit UltraDev verwendet werden. Genau wie bei MySQL müssen Sie einen Access-spezifischen ODBC-Treiber einrichten und in UltraDev verwenden. Sofern Sie Access bereits installiert haben, ist auch der passende ODBC-Treiber bereits vorhanden.
300
Eine ODBC-Datenquelle für Microsoft Access definieren
1. Klicken Sie auf START. 2. Wählen Sie EINSTELLUNGEN > SYSTEMSTEUERUNG. 3. Öffnen Sie mit Doppelklick das Kontrollfenster ODBC-DATENQUELLEN (Windows 9x/NT). Unter Windows 2000 klicken Sie auf VERWALTUNG und dann DATENQUELLEN (ODBC). 4. Öffnen Sie die Registerkarte SYSTEM-DSN. 5. Klicken Sie auf HINZUFÜGEN. 6. Wählen Sie den MS Access-Treiber aus der Liste und klicken Sie auf FERTIG STELLEN. 7. Es öffnet sich das in Abb. 8.15 gezeigte Konfigurationsfenster. Nehmen Sie die entsprechenden Einstellungen vor und klicken Sie auf OK. Nun ist die Datenquelle einsatzbereit.
Abbildung 8.15: Um eine ODBC-Datenquelle für eine Access-Datenbank einzurichten, müssen Sie lediglich den DSN und die Datenbank selbst zuweisen.
In Abb. 8.15 sehen Sie ein Beispiel für eine Muster-ODBC-Verbindung zu einer AccessDatenbank: 쐽
DATENQUELLENNAME – Der DSN ist ein frei gewählter Name, mit dem Sie eine Datenbank ansprechen.
쐽
BESCHREIBUNG – Eine kurze Beschreibung der Verbindung. Dieser Eintrag dient nur zur Information des Anwenders und wird von UltraDev nicht benötigt.
쐽
DATENBANK – Klicken Sie auf die Schaltfläche AUSWÄHLEN, um zu einer bereits bestehenden Datenbank eine Verknüpfung herzustellen. Die anderen Schaltflächen (ERSTELLEN, REPARIEREN, KOMPRIMIEREN) haben die gleiche Funktion wie in Access. Sie haben keinen Einfluss auf die Konfiguration des ODBC-Treibers.
301
Mac und Windows-PC für die Datenbankanbindung fit machen
쐽
SYSTEMDATENBANK – Ist eine Datenbank im Netzwerk gespeichert und wird sie von mehreren Anwendern benutzt, müssen Sie dieses Feld entsprechend den Angaben Ihres Netzwerkadministrators ausfüllen. Ansonsten können Sie es frei lassen.
Falls Sie keinen ODBC-Treiber finden, müssen Sie ihn von der MS-Office-CD nachinstallieren. Genau wie im Falle des MySQL-Treibers können Sie auch nach der Konfiguration des Access-Treibers von UltraDev aus sofort auf die Datenquelle zugreifen. Der Einsatz von MySQL erfolgt zu reinen Trainingszwecken. Der Hintergrund ist, jedem Anwender und für jede Plattform ein freies Datenbanksystem an die Hand zu geben, das schnell einsatzbereit ist. Für komplexere Anwendungen empfiehlt sich der Einsatz professioneller Datenbanken wie PostgreSQL (http://www.postgresql.com/) oder der SQL-Server von Microsoft, die zusätzliche Programmfeatures von UltraDev unterstützen. Es mag zwar verlockend sein, MS Access als Datenbankserver einzusetzen, doch kommen Office-Programme schnell an ihre Grenzen, wenn mehrere Benutzeranfragen parallel zu verarbeiten sind. Wenn Access denselben Leistungsumfang böte wie der SQL-Server von Microsoft, was wäre dann der Sinn eines solchen Produkts? Andererseits ist MS Access ein ausgezeichnetes Entwicklungstool, mit dem sich funktionierende Arbeitsmodelle realisieren lassen, die dann auf einen größer dimensionierten SQL-Server portiert werden.
8.5
Zusammenfassung
Gegenstand der heutigen Lektion war die Einrichtung von Datenbankverbindungen, die die Grundlage für die Entwicklung von dynamischen Webapplikationen mit UltraDev darstellen. Datenbankverbindungen können lokal oder über den Anwendungsserver definiert werden. Mögliche Verbindungstypen zu einer Datenbank sind ADO/ODBC, ColdFusion und JDBC. Mit UltraDev 4.0 stehen diese Verbindungstypen auch Mac-Usern zur Verfügung, doch müssen sie sich über den Anwendungsserver verbinden. Die Ausnahme sind Verbindungen per JDBC oder fortgeschrittene ColdFusion-Konfigurationen. Diese beiden Verbindungsarten erlauben Mac-Usern den Datenbankzugriff per JDBC-Treiber. Wenn Sie sich als Mac-Anwender in puncto Datenbankverbindungen eingeschränkt fühlen, steht Ihnen per RmiJdbc-Treiber eine größere Auswahl an Verbindungstypen zur Verfügung. Über einen NT-Server stellt RmiJdbc eine Brücke zwischen den ODBC-Treibern des NT-Rechners und dem JDBC-Treiber auf dem Mac her.
302
Fragen und Antworten
Zur Vervollständigung des Stoffes wurde zum Abschluss der heutigen Lektion das MySQLDatenbankssytem vorgestellt. MySQL ist ein äußerst stabiler und kostengünstiger Datenbankserver, den Sie gut mit UltraDev kombinieren können. Er bietet zwar nicht alle Features kommerzieller Produkte, ist jedoch extrem schnell und eignet sich hervorragend für Internet-Anwendungen. Jedoch lassen sich nicht alle Beispiele in diesem Buch problemlos realisieren, da es an bestimmten Zusatzfunktionen fehlt.
8.6 F
Welche Datenbanken kann ich zusammen mit UltraDev verwenden? A
F
Die Verbindungsparameter werden zusammen mit den übrigen Dateien der Site in einem eigenen Ordner Connections gespeichert. Jeder Anwender, der seine Site mit denselben Einstellungen einrichtet, kann auf dieselben Datenbankverbindungen zugreifen. Frühere Versionen von UltraDev haben diese Verbindungsdaten in der Datei connections.xml gespeichert, die im Ordner Configuration > Connections liegt. Wenn Sie mit UltraDev 1.0 arbeiten, brauchen Sie diese Datei nur auf den anderen Rechner zu kopieren, dann stehen diese Verbindungsdaten auch dort zur Verfügung.
Warum kann man eigentlich keine JDBC-Treiber zusammen mit ASP verwenden? A
F
Zu den meisten modernen Datenbanken gibt es sowohl ODBC- wie auch JDBCTreiber, sogar zum SQL Server von Microsoft. Insofern dürfte es keine Probleme bei der Einrichtung einer Datenbankverbindung geben.
Kann man eine eingerichtete Datenbankverbindung auf einen anderen Rechner transferieren? A
F
Fragen und Antworten
ASP unterstützt ursprünglich keine JDBC-Treiber. Es gäbe zwar einen Workaround, aber UltraDev akzeptiert nur reinen ADO-ASP-Code.
Welche Funktionen unterstützt MySQL nicht, die für den praktischen Einsatz unter Umständen wichtig wären? A
Was in erster Linie fehlt, sind Ansichten und gespeicherte Prozeduren. Für komplexe Anwendungen könnten diese Features wichtig werden. In solchen Fällen müssten Sie entweder zu einem anderem Produkt wechseln oder per Handarbeit die fehlenden Funktionen implementieren, indem Sie den vom Server automatisch generierten Code entsprechend bearbeiten.
303
Mac und Windows-PC für die Datenbankanbindung fit machen
8.7
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Welche Typen von Datenbankverbindungen gibt es? 2. Wie kann man vom Mac aus auf ODBC-Datenquellen zugreifen? 3. Auf welchen Systemen ist MySQL lauffähig? 4. Welche Konsequenzen hat es, wenn Sie RmiJdbc nicht als Dienst einrichten? 5. Wo werden JDBC-Treiber am Mac installiert?
Übungen 1. Richten Sie eine Datenbankverbindung ein und testen Sie diese Verbindung mit den Mitteln, die Sie heute kennen gelernt haben. 2. Richten Sie eine MySQL-Datenbank ein und experimentieren Sie damit. SQL wurde zwar noch nicht besprochen, doch können Sie den Beispielcode von Tag 6, »Einführung in dynamische Webanwendungen und Datenbankentwicklung«, benutzen, um die Funktionalität zu testen. Die Befehle, mit denen eine Datenbank erzeugt wird, stehen im Text. Nachdem Sie eine Datenbank angelegt haben, stellen Sie mithilfe des MyODBC-Treibers eine Verbindung dazu her.
304
Einführung in die dynamischen Werkzeuge von UltraDev
9
Einführung in die dynamischen Werkzeuge von UltraDev
Auch wenn Sie Dreamweaver-Profi sind oder Datenbankexperte und MS-Access- oder Filemaker-Anwendungen im Schlaf einrichten, müssen Sie eine gewisse Einarbeitungszeit einplanen, um sich mit den dynamischen Programmfunktionen von UltraDev vertraut zu machen. Mit UltraDev, das traditionelle Datenbankwerkzeuge und eine weborientierte Entwicklungsumgebung unter einer Oberfläche integriert, ist Macromedia ein großer Wurf gelungen. Die Themen des heutigen Tages im Überblick: 쐽
Die Befehlssprache von UltraDev zur Verbindung mit Datenbanken, Definition von Abfragen und Anzeige von Suchergebnissen
쐽
Die Funktionen der Paletten SERVERVERHALTEN und DATENBINDUNGEN
쐽
Effizienter Einsatz der dynamischen Werkzeuge und Anpassung der Arbeitstechniken an den eigenen Entwicklungsstil
9.1
Herkömmliche Datenbanken und das Web
Herkömmliche Datenbanken unterscheiden sich etwas von Web-basierten Datenbanken. Im ersteren Fall haben Sie sofortigen Zugriff auf die Daten und volle Kontrolle über programminterne Abläufe. Wie wir bereits gelernt haben, haben wir es im Internet mit einem verbindungslosen Protokoll zu tun, d.h., es merkt sich Ihre Eingaben nicht. Um mit UltraDev effizient arbeiten zu können, müssen Sie wissen, was Sie mit diesen dynamischen Werkzeugen tun können und was nicht. Ziel dieses Kapitels ist es, Sie mit diesen Möglichkeiten und Einschränkungen bekannt zu machen, wobei auch einige bereits bekannte Dinge wiederholt und vertieft werden. Ich denke, dass ein Überblick über die verschiedenen Programmfunktionen, die der Entwicklung dynamischer Sites dienen, ganz nützlich sein wird. Wenn Sie die gestrige Lektion durchgearbeitet haben, wissen Sie, wie man eine Datenbankverbindung einrichtet und können alles Weitere nachvollziehen. In Woche 1 haben Sie die Werkzeuge kennen gelernt, die der Erstellung statischer Sites dienen. Nun werden wir uns die Werkzeuge ansehen, die eine Website dynamisch machen. Wenn Sie mit MS Access oder einem anderen Datenbankprogramm vertraut sind, wird Ihnen die Art und Weise, wie UltraDev Daten handhabt, bekannt vorkommen. Um Ihre Datenbank vom Desktop ins Web zu bekommen, gibt es drei wichtige Werkzeuge oder Grundfunktionalitäten: Datenbankverbindung, Serververhalten und Datenbindungen.
Datenbankverbindungen Mit Datenbankverbindungen haben wir uns in Tag 8, »Mac und Windows-PC für die Datenbankanbindung fit machen«, beschäftigt. Datenbankverbindungen sind die Grundlage für die Kommunikation von UltraDev und dem gewählten Anwendungsserver mit
306
Herkömmliche Datenbanken und das Web
dem Datenbankserver. Datenbankverbindungen gelten für die komplette Site und sind spezifisch für das jeweilige Projekt. Die Verbindungsdaten werden im Verzeichnis der Site in einem eigenen Ordner Connections gespeichert. Da die Verbindungsdaten zusammen mit den übrigen Dokumenten der Site gespeichert werden, sind diese Daten auf jedem anderen Rechner verfügbar, auf dem die Site mit denselben Parametern definiert wurde. Darüber hinaus wird eine Datei connections.xml, gespeichert im Ordner Connections, angelegt. Sie können diese Datei um Ihre eigenen Treiber-Konfigurationen ergänzen, womit sich die manuelle Eingabe der Verbindungsdaten erübrigt, wenn Sie eine weitere Datenbank anbinden. Gestern haben wir uns mit der Konfiguration von JDBC-Treibern beschäftigt. Sie werden sich wahrscheinlich noch daran erinnern, dass dieser Vorgang mit einem Haufen Schreibarbeit verbunden war, die Sie sich sparen können, wenn Sie besagte Datei um einen Eintrag driverinfo ergänzen, in dem die Defaulteinstellungen eines bestimmten Treibers gespeichert werden Im Falle eines JDBC-Treibers würde das so aussehen: MySQL JDBC: Driver Class Name-"org.gjt.mm.mysql.Driver" Access URL-"jdbc:mysql://[hostname]:[port]/[database]"
Anhand dieser Daten können wir in der connections.xml folgendes driverinfo-Objekt erzeugen:
Damit Sie die mit den im Folgenden vorgestellten Werkzeugen arbeiten können, müssen Sie eine funktionierende Datenbankverbindung eingerichtet haben.
Serververhalten Wenn Sie eine Datenbankverbindung eingerichtet haben, ist der nächste Schritt in der Entwicklung dynamischer Websites die Zuweisung von Serververhalten, die auf dieser Verbindung aufsetzen. Mithilfe der Serververhaltenpalette (siehe Abb. 9.1) können Sie Serververhalten zuweisen und bearbeiten. Sie können Sie die Serververhaltenpalette als fortgeschrittene Variante der Standard-Verhaltenspalette vorstellen, die wir zur Erstellung konventioneller HTML-Dokumente verwendet haben. Der Unterschied liegt darin, dass der Programmcode eines Verhaltens in diesem Fall nicht clientseitig, sondern vom Server abgearbeitet wird. Das bedeutet, dass Sie nun nicht mehr den Unwägbarkeiten von JavaScript unterliegen, sondern sich beim Einsatz dynamischer Elemente ganz auf die Performance Ihres Servers verlassen können.
307
Einführung in die dynamischen Werkzeuge von UltraDev
Abbildung 9.1: Serververhalten zuweisen und editieren mit de Serververhaltenpalette
Neben diesen Vorteilen gibt es wie immer auch den einen oder anderen Nachteil. Das größte Plus ist sicher, dass egal welche Serververhalten Sie einsetzen, diese auf jeder Plattform funktionieren, unabhängig davon, ob JavaScript aktiviert ist oder nicht. Solange der Server selbst richtig konfiguriert ist, können Sie jede beliebige dynamische Anwendung entwickeln, ohne sich über die Anwenderplattform Gedanken machen zu müssen. Serververhalten sind nicht in jedem Fall völlig unabhängig vom Client. Arbeitet ein Serververhalten mit Cookies, muss der Clientbrowser diese akzeptieren. Doch ist dieser Weg immer noch zuverlässiger als eine JavaScript-Lösung. Serververhalten sind Codefragmente, aus denen UltraDev ein funktionierendes Programm zusammensetzt. Es handelt sich hierbei um vordefinierte ASP-, JSP- bzw. ColdFusionRoutinen, die in der Kombination lauffähigen Code ergeben, der in das HTML-Dokument eingebettet wird. Wenn Sie sich näher für die Bausteine dieses Puzzles interessieren, empfehle ich Ihnen, im Programmordner von UltraDev einen Blick in den Unterordner Configuration/ ServerBehaviors zu werfen. Sie werden dort eine lange Liste von Serververhalten finden. Diese Serververhalten sind allesamt in JavaScript programmiert und steuern alle dynamischen Funktionen von UltraDev. Als Beispiel ein Code-Schnipsel aus der Datei Recordset.js:
308
Herkömmliche Datenbanken und das Web
//Copyright 2000 Macromedia,Inc.All rights reserved. //***************GLOBALS VARS ***************** var helpDoc =MM.HELP_ssAdvancedRecordset var SP_Mode =false;//Since we have different formatting behavior based //on whether the object is a stored proc or not, //we use this as a switch to keep track of what's //the current selection. //The following constants and vars are used to build up the SQL statement. var CONST_SELECT="SELECT"; var CONST_FROM="FROM"; var CONST_WHERE="WHERE"; var CONST_EQUALS="="; var CONST_ORDERBY="ORDER BY"; var var_select="*"; var var_from=""; var var_where=""; var var_orderby="; var gSimpleParamName="MMColParam" var ERROR_MESSAGE="";
Wie Sie sehen, enthalten diese Programmdateien die Funktionen, mit denen das Serververhalten den erforderlichen SQL-Code erzeugt. Sie können diese Dateien Ihren Erfordernissen entsprechend umschreiben und die Variablen durch die Standardwerte ersetzen, die Sie in Ihrer Entwicklungsumgebung verwenden, doch möchte ich Ihnen von zu massiven Eingriffen abraten. In diesem Codefragment könnten Sie z.B. die Defaultwerte ändern, die an den Datenbankserver übermittelt werden. Wenn Sie diese Programmdateien ausgiebiger unter die Lupe nehmen, werden Sie auch an die Codeteile stoßen, die dann tatsächlich ins HTMLDokument eingesetzt werden. Wenn Sie jedoch an diesen Dateien Änderungen vornehmen, müssen Sie sich der Tatsache bewusst sein, dass Ihre fertige Anwendung nicht mehr mit dem originalen Macromedia-Code arbeitet, der sozusagen unter härtesten Praxisbedingungen seine Tauglichkeit bewiesen hat. Einem ausgemachten Programmierer wird das freilich vielleicht bloß ein müdes Schulterzucken entlocken. Als Neuling in diesen Dingen muss Ihnen aber klar sein, dass Sie durch Veränderungen am Originalcode Ihren Garantieanspruch verwirken. Und es dürfte mehr als unwahrscheinlich sein, dass Sie irgendwo einen UltraDev-User finden, der Ihnen dann noch weiterhelfen kann. Also, was sind nun diese famosen Serververhalten und was können sie für uns tun? Lassen Sie uns zu diesem Zweck die wichtigsten Serververhalten und ihre Arbeitsweise unter die Lupe nehmen.
309
Einführung in die dynamischen Werkzeuge von UltraDev
Standard-Serververhalten Auf einer grundlegenden Ebene ist die dynamische Datenbankanbindung von UltraDev eine einfache Sache – Sie zeigen damit Informationen aus einer Datenbank an und verändern sie gegebenenfalls. Es gibt fünf Hauptfunktionen und ein paar weitere einfache Verhaltensweisen, die nachfolgend beschrieben werden.
Datensatzgruppe Unter einer Datensatzgruppe versteht man die Gesamtheit aller Datensätze, die auf eine Datenbankabfrage hin zurückgegeben werden. In UltraDev werden Datensatzgruppen dadurch erzeugt, dass man der Anwendung die SQL-Anweisungen übergibt, die sie ausführen soll, sich entspannt zurücklehnt und das Programm arbeiten lässt. Eine Datensatzgruppe kann aus mehreren Datensätzen bestehen, doch ist jeweils nur der erste Datensatz zugänglich, nachdem die Datensatzgruppe erzeugt wurde. Um auf die weiteren Datensätze zugreifen zu können, müssen Sie weitere Serververhalten hinzufügen, die die erstellte Datensatzgruppe handeln können. Sie haben zwei Möglichkeiten, Datensatzgruppen zu erzeugen – die erste ist die einfache Abfrage (siehe Abb. 9.2).
Abbildung 9.2: Für einfach aufgebaute Datensatzgruppen genügt die einfache Abfrage.
Mit einfachen Abfragen lassen sich Gruppen von Datensätzen aus einer Datenbanktabelle ohne großen Aufwand selektieren. Wenn Sie z.B. Datensätze anhand von im URL-Feld übergebenen Parametern auswählen wollen und das endgültige Abfrageergebnis dann ausgehend vom Inhalt einer bestimmten Spalte sortieren lassen wollen, wählen Sie für die
310
Herkömmliche Datenbanken und das Web
Erstellung einer Datensatzgruppe die einfache Variante. Hierbei sind Sie an automatisch erzeugte SQL-Anweisungen gebunden. In manchen Fällen genügen aber diese StandardRoutinen nicht. Klicken Sie auf die Schaltfläche ERWEITERT. Es öffnet sich die in Abb. 9.3 gezeigte Eingabemaske, die eine weit flexiblere Erzeugung von Datensatzgruppen erlaubt.
Abbildung 9.3: Erweiterte Abfragen ermöglichen eine bessere Kontrolle über die Anwendung.
Im Modus ERWEITERT können Sie selbst geschriebene SQL-Abfragen an den Datenbankserver schicken und seine Leistungsfähigkeit ausreizen. Von hier aus haben Sie direkten Zugriff auf Tabellen, Ansichten und gespeicherte Prozeduren. Ferner weisen Sie hier den Abfragevariablen, die UltraDev verwendet, einen Wert zu. Mit Abfragevariablen können Sie vom Client übermittelte Daten wie Request-Werte, Cookies und Sitzungsvariable einer lokalen Variablen in UltraDev zuweisen und für Abfragen verwenden. Diese Einbindung von Clientdaten in eine SQL-Abfrage ist im einfachen Abfragemodus nicht möglich. Definiert werden diese internen Abfragevariablen durch Klick auf das Plussymbol (+) und Vergabe eines Variablennamen sowie durch Setzen des Standardwerts und des Laufzeitwerts. 쐽
NAME – Der Name der UltraDev-Variablen, der die dynamischen Daten zugewiesen werden. Diese Variable muss in einfache Anführungszeichen gesetzt und im Feld SQL eingetragen sein.
311
Einführung in die dynamischen Werkzeuge von UltraDev
쐽
STANDARDWERT – Für jede Variable lässt sich ein Defaultwert setzen, falls keine dynamischen Daten verfügbar sind. Somit ist sichergestellt, dass Abfragen auch dann funktionieren, wenn der Anwender nicht die erforderlichen Angaben gemacht hat.
쐽
LAUFZEITWERT – Der Wert, denn die Variable annimmt, während die Anwendung auf dem Server läuft. Laufzeitwerte werden gewöhnlich auf den Wert von Variablen aus Formularen oder anderen dynamischen Daten gesetzt. Seien Sie vorsichtig beim Setzen von Standardwerten. Sie sind zwar sehr nützlich, wenn man sich in der Live-Data-Ansicht Ergebnisse von Abfragen anzeigen lassen will, ohne Anwendereingaben simulieren zu müssen. Nur passiert es leider allzu oft, dass man Standardwerte setzt und nicht mehr daran denkt, sie wieder zu löschen. Nehmen wir zum Beispiel an, dass Sie eine Anmeldeseite erzeugen, die Benutzernamen und Kennwort abfragt und auf ihre Richtigkeit überprüft. Wenn Sie Standardwerte für Benutzernamen und Kennwort gesetzt haben, könnte ein Anwender ein leeres Formular abschicken und sich trotzdem einloggen. Da bei der Überprüfung keine Daten gefunden wurden, werden die leeren Eingabefelder mit den Standardwerten ausgefüllt.
Falls Sie mit UltraDev kompliziertere Features wie das Durchsuchen von Datenbeständen oder benutzerdefinierte Abfragen in Ihre Anwendungen implementieren wollen, brauchen Sie diese Suchvariablen. Sobald die Datensatzgruppe definiert ist, können Sie durch Klicken auf die Schaltfläche TESTEN Ihre Abfrage in Echtzeit testen.
Datensatz einfügen Mit dem Serververhalten DATENSATZ EINFÜGEN können Sie einen neuen Datensatz in eine Datenbank schreiben. Dieser Datensatz wird aus einem Formular gelesen und über die definierte Datenbankverbindung zu einer bestimmten Tabelle übertragen. Dieses Verhalten funktioniert nur in Verbindung mit einem HTML-Formular. Doch mit etwas Erfindungsgabe und etwas Programmierung können Sie mit diesem Verhalten bestimmte Informationen vom Anwender abfragen. In einer späteren Lektion werden wir dieses Verhalten dazu benützen, Artikel in einem Warenkorb abzulegen. Bevor Sie Datensätze in eine Tabelle schreiben bzw. diese aktualisieren oder löschen können, müssen Sie in einem HTML-Dokument ein Formular definieren. Jedes dieser Verhalten wird in Abhängigkeit von einer bestimmten Formulareingabe ausgelöst. Abb. 9.4 zeigt das Dialogfenster, in dem Sie das Verhalten DATENSATZ EINFÜGEN konfigurieren.
312
Herkömmliche Datenbanken und das Web
Abbildung 9.4: Daten aus einem Formular in einer Datenbanktabelle ablegen mit Datensatz einfügen
Da wir jetzt noch keine Webanwendungen entwickeln, möchte ich Ihnen empfehlen, in ein leeres HTML-Dokument ein Formular einzufügen. So können Sie die Dialogfenster zu den einzelnen Serververhalten öffnen und den Ausführungen besser folgen. Das Serververhalten DATENSATZ EINFÜGEN ist insofern ähnlich strukturiert wie die übrigen Serververhalten, als es eine Datenbankverbindung voraussetzt sowie Tabellen, in die es diese Datensätze schreiben kann. Es folgt eine Erklärung der verschiedenen Einstellungsmöglichkeiten: 쐽
FORMULAR – Da eine Seite mehrere Formulare enthalten kann, müssen Sie UltraDev mitteilen, welches Formular die Daten an die Tabelle übermittelt. Das Formular selbst muss alle Felder enthalten, die auch in der Tabelle ausgefüllt werden sollen.
쐽
FORMULARELEMENTE – In diesem Listenfeld werden alle Formularfelder angezeigt. Damit UltraDev die Daten aus den Formularfeldern den richtigen Tabellenfeldern zuordnen kann, müssen Sie die einzelnen Einträge der Reihe nach markieren und dann aus dem Popup-Menü SPALTEN die Tabellenspalte auswählen, in die die Eingabe aus dem Formularfeld eingetragen werden soll. Im Popup-Menü SENDEN ALS wählen Sie den Datentyp (Text/Numerisch) aus.
쐽
ZU URL WECHSELN – Nachdem die Daten eingegeben wurden, leitet das Serververhalten den Anwender auf eine neue Seite, deren URL Sie hier eingeben. Sie können den Anwender auch zur selben Seite zurückschicken.
Sie werden feststellen, dass die anderen datenbankspezifischen Verhaltensweisen dem Serververhalten DATENSATZ EINFÜGEN verblüffend ähnlich sind.
Datensatz aktualisieren Obwohl es vielleicht zunächst so scheint, dass das Serververhalten DATENSATZ EINFÜGEN identisch ist mit dem Serververhalten DATENSATZ AKTUALISIEREN, handelt es sich doch
313
Einführung in die dynamischen Werkzeuge von UltraDev
um zwei ganz unterschiedliche Dinge. Um einen Datensatz in einer Datenbank zu aktualisieren, wählen Sie das Serververhalten DATENSATZ AKTUALISIEREN. Das Dialogfenster zur Konfigurierung dieses Verhaltens sehen Sie in Abb. 9.5. Die Ähnlichkeit zwischen den beiden Fenstern ist offensichtlich, tatsächlich sind sie mehr oder weniger identisch. Gegenüber dem Serververhalten DATENSATZ AKTUALISIEREN müssen Sie jedoch zwei weitere Angaben machen: 쐽
DATENSATZ AUSWÄHLEN AUS – Im Gegensatz zum Einfügeverhalten greift eine Aktualisierung auf einen bereits bestehenden Datensatz zu. Diesen Datensatz müssen Sie aus einer Datensatzgruppe auswählen. Hierzu öffnen Sie das Popup-Menü und selektieren die betreffende Datensatzgruppe.
쐽
SPALTE FÜR EINDEUTIGEN SCHLÜSSEL – Das Feld mit dem Identifikationsschlüssel, über den der einzufügende Datensatz eindeutig adressiert werden kann. Da UltraDev keine zusammengesetzten Primärschlüssel unterstützt, müssen Sie diesem Faktum bereits beim Entwurf Ihrer Datenbank Rechnung tragen. Wenn Sie nicht mehr genau wissen, was es mit Primärschlüsseln auf sich hat, lesen Sie Einzelheiten noch einmal unter Tag 6, Einführung in dynamische Webanwendungen und Datenbankentwicklung, nach.
Abbildung 9.5: Datensatz aktualisieren schreibt keine neuen Einträge, sondern aktualisiert bestehende Datensätze.
Fortgeschrittene Datenmanipulation: replace into Manche Datenbankserver verwenden anstelle der Anweisung insert into, die standardmäßig vom Serververhalten DATENSATZ EINFÜGEN verwendet wird, die Anweisung replace into. Die Anweisung replace into leistet im Prinzip dasselbe wie insert into, der Unterschied besteht darin, dass ein alter Eintrag zuerst aus der Tabelle gelöscht wird, wenn der neue Eintrag unter diesem Schlüssel denselben Wert hat. Wenn Sie replace into an Stelle von insert into verwenden, können Sie Daten in eine Datenbank neu einfügen, ohne sich mit dem Serververhalten DATENSATZ AKTUALISIEREN beschäftigen zu müssen. Später in den Beispielen verwende ich dieses Kommando nicht (da es nicht in allen Datenbanken zur Verfügung steht), aber vielleicht möchten Sie ein-
314
Herkömmliche Datenbanken und das Web
mal austesten, ob Ihr Datenbankserver dieses Feature unterstützt. Haben Sie sich für den MySQL-Server als Produktionsplattform entschieden, wird es Sie interessieren, dass Sie hier diese Funktion zur Verfügung haben. Um das Serververhalten DATENSATZ EINFÜGEN gegen ein replace into auszutauschen, müssen Sie die Datei InsertRecord.js im Ordner Configuration/ServerBehaviors modifizieren. Diese Datei ist in vier Abschnitte gegliedert: ASP (JavaScript), ASP (VBScript), JSP und CFML. Öffnen Sie die Datei und suchen Sie den entsprechenden Abschnitt. Der Code für ASP/JavaScript beispielsweise liest sich folgendermaßen: //***********ASP *************** var WGHT_AspEditMain =20; //***ASP/JavaScript *** var PREP_AspJsEditMain ="MM_insert"; var PATT_AspJsEditMain ='Request\\([\'"]MM_insert'; var MASK_AspJsEditMain =""+
In diesem Abschnitt des Programmcodes steht eine einzelne Zeile, die die SQL-Anweisung erzeugt: " var MM__insertStr = ' insert into ' +MM_tableName + ' ➥(' +MM_tableValues + ')values...
Damit UltraDev das neue Kommando verwendet, müssen Sie lediglich die insert intoAnweisung durch replace into ersetzen: " var MM__insertStr = ' replace into ' + MM_tableName + ' ➥(' +MM_tableValues + ')values...
Das modifizierte Serververhalten steht danach unmittelbar zur Verfügung. In der praktischen Arbeit werden Sie keinen Unterschied feststellen, nur verwendet das DATENSATZ EINFÜGEN-Verhalten statt des von UltraDev eingestellten Codes nun den neuen Code. Falls Sie ein Serververhalten modifizieren, dürfen Sie nicht davon ausgehen, dass die modifizierte Verhaltensweise automatisch auf allen Seiten aktualisiert wird. Die Serververhalten werden zusammen mit jedem Dokument der Website gespeichert. Um den Code im Dokument zu aktualisieren, müssen Sie ihn entweder von Hand aktualisieren oder das Serververhalten löschen und wieder zuweisen.
Datensatz löschen Vierter im Bunde ist das Serververhalten DATENSATZ LÖSCHEN. Denn wenn man Datensätze in einer Datenbank ablegen kann, dann sollte man sie auch wieder löschen können. Von diesem Serververhalten gibt es weiter nichts zu berichten als das es genau tut, was sein Name sagt. Abb. 9.6 zeigt das Konfigurationsmenü des Serververhaltens DATENSATZ LÖSCHEN.
315
Einführung in die dynamischen Werkzeuge von UltraDev
Abbildung 9.6: Datensätze per Formular löschen: das Serververhalten Datensatz löschen
Die Einstellungen in diesem Dialogfenster lassen sich aus den vorher beschriebenen Menüs ableiten. Sie sollten damit keine Probleme haben.
Befehl Das Allzweck-Serververhalten ist das Verhalten BEFEHL, zu sehen in Abb. 9.7. Über dieses Verhalten können Sie gespeicherte Prozeduren oder blanken HTML-Code ausführen und gegebenenfalls eine Datensatzgruppe ausgeben lassen. Im Unterschied zu anderen Serververhalten können Sie aber mit dem Verhalten BEFEHL programminterne Variablen mit Serververhalten verbinden, die so mit anderen Verhaltensweisen nicht möglich sind.
Abbildung 9.7: Mit dem Serververhalten Befehl können Sie gespeicherte Prozeduren und andere SQLAbfragen ausführen lassen.
Wenn Sie einen Befehl definieren, werden Sie feststellen, dass dieses Verhalten große Ähnlichkeit mit dem Verhalten DATENSATZ EINFÜGEN und DATENSATZGRUPPE hat. Wenn Sie für den Befehl einen Namen vergeben haben, müssen Sie den Typ wählen: entweder
316
Herkömmliche Datenbanken und das Web
eine Standard-SQL-Anweisung (Einfügen, Aktualisieren usw.) oder eine gespeicherte Prozedur. Soll nach Ausführung des Befehls ein Datensatz zurückgegeben werden, müssen Sie noch das Kontrollfeld FOLGENDEN DATENSATZ ZURÜCKGEBEN NAMENS: aktivieren und einen Namen für die neue Abfrage vergeben. Was dieses Werkzeug noch flexibler macht, ist die Tatsache, dass Sie programminterne Variablen von UltraDev wie eine normale Datensatzgruppe verwenden können. Das heißt, Sie können auf Sitzungsvariablen, Cookies usw. für die Definition des Befehls zurückgreifen. Im Gegensatz zum normalen Einfüge-Verhaltens BEFEHL EINFÜGEN kann das Verhalten BEFEHL URL-Parameter und andere Daten in einer insert-Anweisung verarbeiten. Wenn Sie sich für die fortgeschritteneren Entwicklungsmöglichkeiten mit UltraDev interessieren, dann sind Sie hier richtig. Wenn Sie den Stoff von Tag 12, »Komplexe Datenbankabfragen«, durchgearbeitet haben, können Sie mit diesem Verhalten direkt auf Datenbanken und deren Befehlssatz zugreifen.
Der Unterschied online – offline Wenn Sie schon Datenbankerfahrung haben, werden Sie sich vielleicht fragen: »Das ist doch alles wie bei anderen Datenbanken auch, wo liegt also das Problem?« Der Unterschied zwischen einer gewöhnlichen Datenbank und den Serververhalten ist der, dass eine Aktion nicht unmittelbar ausgeführt wird. Serververhalten benötigen Informationen von einer Webseite, und diese Webseite verwendet die Informationen zur Ausführung des Serverhaltens. Was die Sache vielleicht etwas verwirrend macht, ist, dass der Code für ein Serververhalten in der Seite gespeichert wird, die die Daten überträgt, obwohl die übertragende Seite aller Wahrscheinlichkeit nach nicht die Seite ist, die nach Ausführung des Serververhaltens angezeigt wird. Nachfolgend der genaue Ablauf: 1. Es wird ein HTML-Dokument erstellt, das mithilfe eines Formulars Daten an eine Datenbank überträgt. Bei den zu übertragenden Daten kann es sich um Datensätze handeln, die beispielsweise eingefügt oder gelöscht werden müssen. 2. Dem HTML-Dokument wird ein Serververhalten zugewiesen, das die Daten verarbeiten soll, die in dieses Dokument eingefügt werden. Bei diesen Serververhalten handelt es sich typischerweise um die Befehle DATENSATZ EINFÜGEN, AKTUALISIEREN oder LÖSCHEN. 3. Das Verhalten wird so konfiguriert, dass der Anwender nach Ausführung des Serververhaltens auf eine neue Seite geleitet wird. 4. Die Webseite steht online. 5. Ein Anwender kommt auf die Seite, füllt das Formular aus und schickt es ab.
317
Einführung in die dynamischen Werkzeuge von UltraDev
6. Das Formular schickt die Daten an dieselbe Seite zurück, in der das Serververhalten gespeichert ist, woraufhin das Serververhalten ausgeführt wird. 7. Nachdem das Serververhalten ausgeführt wurde, schickt das Serververhalten den Browser zu einem anderen Dokument oder einer anderen Website. Ich hoffe, das macht die Geschichte etwas transparenter. Der Ablauf, der sich hinter diesen Serververhalten verbirgt, mag etwas bizarr erscheinen, doch um effektive dynamische Sites zu entwickeln, müssen Sie mit diesen Hintergründen vertraut werden. Nicht alle Serververhalten dienen jedoch dem Zweck, Daten in einer Datenbank abzulegen oder den Anwender auf eine neue Seite zu leiten. Lassen Sie uns einen Blick auf die restlichen Serververhalten werfen, die Sie zum Entwickeln von Webapplikationen brauchen.
Weitere Serververhalten Daten in einer Datenbank anzuzeigen bzw. zu manipulieren ist das Haupteinsatzgebiet von UltraDev. Die zuvor besprochenen Serververhalten sind ein guter Einstieg in die Materie, doch reichen sie allein noch nicht aus, um eine brauchbare Webanwendung zu realisieren. Nehmen wir an, wir haben eine Datensatzgruppe mit 20 Einträgen erzeugt – wie bringen wir sie alle auf den Schirm? Und nehmen wir weiter an, es handelt sich um 2000 Datensätze. Wie können wir dem Anwender diese 2000 Datensätze zugänglich machen, ohne sie alle in ein einziges HTMLDokument zu packen? Die Lösung für dieses Problem (und einige andere) bieten verschiedene zusätzliche Serververhalten, mit denen es möglich ist, die Anzeige einer Datensatzgruppe zu steuern.
Bereich wiederholen Das Verhalten BEREICH WIEDERHOLEN arbeitet in einer Datensatzgruppe wie eine Schleife. Sie können sich damit mehrere Datensätze einer Gruppe auf einmal anzeigen lassen – entweder alle oder eine bestimmte Anzahl. Dieses Verhalten wiederholt nicht nur einzelne Feldwerte, sondern alles, was in einem bestimmten Bereich steht. Die einzelnen Felder oder Spalten einer Datenbank werden in HTML-Dokumenten gewöhnlich in Tabellenform dargestellt, damit die Daten zusammengehalten werden. Wenn Sie das Verhalten BEREICH WIEDERHOLEN verwenden, würden Sie in diesem Fall alle Felder, die Sie wiederholen möchten, in eine einzige Tabellenzeile schreiben und auf diese Zeile das Verhalten anwenden. Von diesen Datensätzen werden dann jeweils so viele angezeigt, wie Sie im Konfigurationsdialog eingestellt haben. Abb. 9.8 zeigt das Dialogfenster BEREICH WIEDERHOLEN.
318
Herkömmliche Datenbanken und das Web
Abbildung 9.8: Mehrere Datensätze auf einmal anzeigen lassen mit dem Verhalten Bereich wiederholen
Haben Sie einen bestimmten Bereich ausgewählt, der wiederholt angezeigt werden soll, fordert das Dialogfenster Sie auf, die Datensatzgruppe und die Anzahl der anzuzeigenden Datensätze einzugeben.
Zu Datensatz verschieben Die wenigsten Anwender wollen sich durch 5.000 Datensätze auf ihrem Monitor scrollen. Tatsächlich sind den meisten schon zehn Datensätze zu viel. Wenn Sie die Anzahl der angezeigten Datensätze mit dem Verhalten BEREICH WIEDERHOLEN einschränken, müssen Sie auch Navigationsmöglichkeiten anbieten, um zu den vorherigen oder nachfolgenden Datensätzen in der Datenbank springen zu können. Die Befehlsgruppe ZU DATENSATZ VERSCHIEBEN stellt alle erforderlichen Verhaltensweisen zur Verfügung, um durch eine Datensatzgruppe navigieren zu können. Sie finden diese Verhaltensweisen in der Palette SERVERVERHALTEN unter dem Menüpunkt ZU DATENSATZ VERSCHIEBEN: 쐽
ZUM ERSTEN DATENSATZ VERSCHIEBEN – Unabhängig vom zuletzt angezeigten Datensatz springt dieses Verhalten zum ersten Datensatz einer Gruppe.
쐽
ZUM VORHERIGEN DATENSATZ VERSCHIEBEN – Geht zum jeweils vorigen Datensatz zurück. Wollen Sie zum vorher angezeigten »Datenblatt« zurückspringen, verwenden Sie dieses Verhalten.
쐽
ZUM NÄCHSTEN DATENSATZ VERSCHIEBEN – Das Pendant zum obigen Verhalten. Springt einen Datensatz weiter.
쐽
ZUM LETZTEN DATENSATZ VERSCHIEBEN – Springt zum letzten Datensatz einer Gruppe. Dieses Verhalten in Verbindung mit dem Verhalten ZUM ERSTEN DATENSATZ VERSCHIEBEN erlaubt dem Anwender, schnell zum ersten bzw. letzten Eintrag einer Datenbank zu springen.
쐽
ZU BESTIMMTEM DATENSATZ VERSCHIEBEN – Statt wie mit den obigen Verhaltensweisen zu Einträgen zu springen, die relativ zum aktuell angezeigten sind, definieren Sie hier per Identifikationsschlüssel absolute Sprünge zu einem Datensatz, den Sie im Feld URL-PARAMETER spezifizieren.
319
Einführung in die dynamischen Werkzeuge von UltraDev
Man muss sich klar machen, dass diese Serververhalten jeweils nur in Verbindung mit bestimmten Datensatzgruppen funktionieren, nicht etwa mit einer kompletten Tabelle in der Datenbank. Wenn Sie also z.B. den Befehl ZUM NÄCHSTEN DATENSATZ VERSCHIEBEN verwenden, muss das nicht der nachfolgende Datensatz in der Tabelle sein, sondern der nächste Eintrag in der Datensatzgruppe. Die ganze Befehlsgruppe ZU DATENSATZ VERSCHIEBEN funktioniert nach demselben Prinzip: Datensatzgruppe auswählen, Link definieren, der das Serververhalten auslöst, und fertig. Abb. 9.9 zeigt ein vorschriftsmäßig konfiguriertes Serververhalten.
Abbildung 9.9: Die Befehlsgruppe Zu Datensatz verschieben ermöglicht die Navigation in Datensatzgruppen.
Bereich anzeigen Der Befehl BEREICH ANZEIGEN ist mein absolutes Lieblingsserververhalten, obwohl man es eigentlich nicht braucht, um Datensätze einer Datenbank anzuzeigen. Dieses Verhalten macht genau, was sein Name vermuten lässt: Es verbirgt bzw. zeigt bestimmte Bereiche innerhalb eines Dokuments. Sie wollen wissen, wozu das gut ist? Ein eindeutiger Anwendungsfall z.B. wäre (übrigens der einzige, den Macromedia in den Programmunterlagen dokumentiert), einen bestimmten Bereich einer Seite in Abhängigkeit von bestimmten Daten der Datensatzgruppe anzuzeigen oder auszublenden. Dieses Verhalten wird also gesteuert vom Vorhandensein (bzw. Nicht-Vorhandensein) bestimmter Einträge in der Datensatzgruppe. Ein Beispiel: Auf der Dokumentseite gibt es eine Schaltfläche oder einen Link NÄCHSTER DATENSATZ, gesteuert vom Serververhalten ZUM NÄCHSTEN DATENSATZ verschieben. Wenn Sie beim letzten Datensatz einer Gruppe angelangt sind, ist dieser Link natürlich überflüssig. Also weisen Sie diesem Link das VERHALTEN BEREICH ZEIGEN, WENN NICHT LETZTER DATENSATZ zu. Die Konfiguration des Verhaltens BEREICH ANZEIGEN bereitet keine Probleme (siehe Abb. 9.10).
320
Herkömmliche Datenbanken und das Web
Abbildung 9.10: Wählen Sie zum Testen des Verhaltens die richtige Bedingung und die richtige Datensatzgruppe aus.
Zum Ein- bzw. Ausblenden von Vor/Zurück-Buttons ist das Verhalten BEREICH offensichtlich von großem Nutzen, aber es gibt noch ein paar andere, viel effektivere Einsatzmöglichkeiten.
ANZEIGEN
Mit diesem Verhalten lässt sich jede Art von Information anzeigen bzw. verbergen. Damit lassen sich Webseiten erstellen, deren Inhalte in Abhängigkeit von Abfrageergebnissen komplett ausgetauscht werden. Sollen Inhalte in Abhängigkeit von bestimmten Bedingungen verborgen werden, kann das gewünschte Verhalten auch erreicht werden, indem die Inhalte angezeigt werden, wenn die Umkehrung der Bedingung zutrifft. In einer der späteren Lektionen werden Sie lernen, wie Sie mit diesem Verhalten Login-Informationen überprüfen können und noch ein paar interessante Dinge mehr.
Dynamische Elemente Die in der Gruppe DYNAMISCHE ELEMENTE zusammengefassten Serververhalten gehören zu den Elementen, die Sie wahrscheinlich am häufigsten benutzen werden, auch wenn das momentan noch nicht so offensichtlich sein mag. Wenn Sie eine Datensatzgruppe angelegt haben, wird diese Datengruppe in der Palette DATENBINDUNGEN zusammen mit einem kleinen Icon angezeigt. Klicken Sie auf das Plussymbol (+), wird der ganze Ast ausgeklappt und alle verfügbaren Datenfeldnamen angezeigt (siehe Abb. 9.11). Um diese Datenfelder im HTML-Dokument zu platzieren, müssen Sie in der Dokumentansicht lediglich das entsprechende Feld in den DATENBINDUNGEN anklicken und mit gedrückter Maustaste an die gewünschte Stelle im Dokument ziehen. Folgende dynamischen Elemente stehen zur Auswahl: 쐽
DYNAMISCHER TEXT – Fügt den Wert eines Datenbankfeldes direkt in der Dokumentansicht ein.
쐽
DYNAMISCHE(S) LISTE/MENÜ – Füllt ein Listen- bzw. Menüobjekt mit Einträgen aus einer Tabelle der Datenbank. Erlaubt außerdem die datenbankgesteuerte Vorbelegung eines Listen- bzw. Menüeintrags.
321
Einführung in die dynamischen Werkzeuge von UltraDev
Abbildung 9.11: Die Palette Datenbindungen zeigt alle verfügbaren Felder einer Datensatzgruppe an. 쐽
DYNAMISCHES TEXTFELD – Schreibt das Attribut »value« aus einem Formularfeld in die Datenbank. Wird oft benutzt, um bereits eingegebene Anwenderwerte wiederherzustellen.
쐽
DYNAMISCHES KONTROLLKÄSTCHEN – Überprüft, ob ein Kontrollkästchen als aktiviert angezeigt werden soll. Hierzu wird ein Wert in der Datenbank mit einem anderen bekannten Wert verglichen.
쐽
DYNAMISCHE OPTIONSSCHALTER – Ähnlich wie beim Kontrollkästchen wird ein Optionsfeld als ausgewählt gesetzt, wenn eine bestimmte Bedingung erfüllt ist.
In den meisten Fällen reichen die Verhalten BEREICH WIEDERHOLEN und DYNAMISCHER TEXT völlig aus, um Datenbankinhalte online auf den Monitor des Anwenders zu bringen.
9.2
Datenbindungen
Jedes Mal, wenn Sie ein Serververhalten DYNAMISCHE ELEMENTE einer Seite zuweisen, erstellen Sie in Wirklichkeit eine Datenbindung. Die Palette DATENBINDUNGEN ist das zentrale Instrument, das Ihnen einen Überblick darüber gibt, auf welche Daten Sie Zugriff haben, mit welchem HTML-Objekt sie verknüpft sind und wie Sie sie formatieren können. Lassen Sie uns die verschiedenen Funktionen dieser Palette nun der Reihe nach durchgehen.
322
Datenbindungen
Dynamische Daten Zuallererst zeigt die Palette DATENBINDUNGEN alle Daten an, die innerhalb der definierten Datensatzgruppe verfügbar sind. In Datensatzgruppen stehen die dynamischen Daten, die Sie an Ihre Website anbinden können. Ist eine Datensatzgruppe definiert, wird sie sowohl in der Palette SERVERVERHALTEN wie in der Palette DATENBINDUNGEN angezeigt. Im Gegensatz zu anderen Serververhalten können Sie eine Datensatzgruppe (Abfrage) direkt in der Palette DATENBINDUNGEN definieren, indem Sie auf das Plussymbol (+) klicken und DATENSATZGRUPPE (ABFRAGE) wählen. Diesen Datentyp werden Sie bei der Arbeit mit UltraDev sicher am häufigsten verwenden, doch stehen in dieser Ansicht auch noch weitere Daten zur Verfügung. So können Sie auch Anforderungsvariablen und Sitzungsvariablen definieren, zwei ebenfalls sehr nützliche Datenbindungstypen. Über diese beiden Verhalten haben Sie Zugriff auf serverseitig generierte Sitzungsvariablen, URL-Parameter, Cookies, Formulardaten usw. Im Gegensatz zu Datensatzgruppen oder Datenbindungen, die eine Datenbankverbindung voraussetzen, sind Sitzungsvariablen und auf Cookies basierende Anforderungsvariablen Site-weit zugänglich. Die meisten Bindungstypen sind seitenspezifisch und gelten nur für die Seite, für die sie definiert wurden. Genau wie Datensatzgruppen werden diese zusätzlichen Daten in der Palette DATENBINangezeigt und können mit der Maus direkt ins Dokument gezogen werden.
DUNGEN
Die Datenbindungen (Sitzungsvariable, Cookies) bringen ein gravierendes Manko der UltraDev-Entwicklungsumgebung ans Licht. Sie können zwar zu bereits definierten Sitzungsvariablen usw. eine Datenbindung herstellen, jedoch ist es nicht möglich, Cookies oder Sessions neu zu erzeugen. Um diese Webtechniken einsetzen zu können, müssen Sie selbst Hand an den Code legen und ein neues Serververhalten schreiben. Dies wird unser letzter Tagespunkt sein.
Datenbindungen in der Dokumentansicht Die Palette DATENBINDUNGEN hat sozusagen einen Doppelnutzen. Einerseits zeigt sie, wie wir mittlerweile wissen, alle dynamischen Daten an, die mit einem Dokument verbunden sind. Das ist die erste Information, die wir über diese Palette bekommen. Zusätzlich zeigt sie uns Informationen darüber an, wie die einzelnen Daten mit den Objekten in der Dokumentansicht verbunden sind.
323
Einführung in die dynamischen Werkzeuge von UltraDev
Die einfachste Bindung ist z.B. die zwischen dynamischem Text in der Dokumentansicht und einem x-beliebigen Datensatz in der Palette DATENBINDUNGEN. Ziehen Sie probehalber einen Datensatz aus der Palette in die Dokumentansicht und sehen Sie sich dann die Palette noch einmal an (siehe Beispiel in Abb. 9.12). In der Spalte BINDEN wird angezeigt, dass das ausgewählte Feld mit »Ausgewählter Text« verbunden ist. Jede Beziehung von einem Objekt im Dokument mit einem dynamischen Datensatz wird in dieser Palette angezeigt.
Abbildung 9.12: Die Palette Datenbindungen macht deutlich, wie Elemente in der Dokumentansicht mit DesignZeit-Elementen verknüpft sind.
Bindungen in der Dokumentansicht beschränken sich nicht bloß auf dynamischen Text. So könnten Sie z.B. ein bereits erstelltes Popup-Menü mit einem Datensatz verknüpfen, statt per Serververhalten ein Popup-Menü oder eine Auswahlliste zu erzeugen. Wenn Sie ein Objekt in der Dokumentansicht auswählen und den entsprechenden Datensatz in der Palette markieren, können Sie jedes der für dieses Objekt verfügbaren Attribute damit verbinden, wenn Sie auf den Button EINFÜGEN klicken. (Die verfügbaren Attribute werden im Popup-Menü unten in der Palette angezeigt.) Sie können Dutzende von Attributen – Name, Farbe, ausgewähltes Objekt – binden. Alles, was UltraDev als Attribut eines Objektes erkennt, kann mit dynamischen Daten verbunden werden. Um eine Bindung zu ändern, markieren Sie die Bindung, klicken auf den Pfeil, der neben der Bindung angezeigt wird, und wählen ein neues Attribut aus. Sie können Daten einer Datenbank auf zwei Arten dynamisch mit HTMLObjekten verknüpfen. Entweder direkt über ein Serververhalten oder indirekt über Datenbindungen. Beide Techniken werden in den nächsten Lektionen ausführlich besprochen.
324
Datenbindungen
Datenformate Für jeden verbundenen Datensatz können Sie eine Formatierung wählen, mit der er an UltraDev übergeben wird – sei es zur Darstellung auf dem Monitor oder für die Datenbindung selbst. Die Formate wählen Sie aus dem Popup-Menü in der Spalte FORMAT. Fügen Sie Ihrem Dokument dynamische Daten hinzu, damit Sie dieses Popup-Menü öffnen können. Folgende Formatierungen stehen zur Auswahl: 쐽
DATUM/UHRZEIT – Ist der verbundene Datensatz ein Datum oder eine Uhrzeit, können Sie eine der angebotenen Formatierungen verwenden.
쐽
WÄHRUNG – Hiermit können Sie Geldbeträge formatieren. Mithilfe von Währungsformaten müssen Sie Währungssymbole (wie z.B. $) nicht von Hand einsetzen.
쐽
NUMMER – Hiermit lassen sich Zahlen formatieren: Aufrunden, Anzahl der Kommastellen usw.
쐽
PROZENT – Wie oben, nur eben für Prozentwerte.
쐽
GROSS-/KLEINSCHREIBUNG – Wandelt Text in Groß- oder Kleinbuchstaben um.
쐽
FEINEINSTELLUNG – Textinformationen in Datenbanken werden oft durch Leerzeichen getrennt. Feinstellung beseitigt Leerzeichen entweder von links, rechts oder beiden Seiten.
Die übrigen Arten der Formatierung betreffen die Kodierung von URLs, die Stringdaten enthalten, sodass sie per URL übergeben werden können. (Sonderzeichen werden in Hexagesimalcode umgewandelt.) Falls Sie das passende Format nicht finden, können Sie es über FORMATLISTE BEARBEITEN erstellen oder ein bereits vorhandenes Format anpassen. Abb. 9.13 zeigt das Dialogfenster FORMATLISTE BEARBEITEN.
Abbildung 9.13: Formatierungen bearbeiten oder hinzufügen
Wie Sie ein neues Format hinzufügen: 1. Klicken Sie auf das Plussymbol (+). 2. Wählen Sie das Format, das Sie ergänzen wollen (Nummer, Währung, Prozent) aus dem Popup-Menü.
325
Einführung in die dynamischen Werkzeuge von UltraDev
3. Setzen Sie die Attribute für Ihr neues Format: Zahl der führenden Nullen, Nachkommastellen usw. 4. Klicken Sie auf OK.
Abbildung 9.14: Passen Sie Formate an die speziellen Erfordernisse Ihrer Anwendung an.
9.3
Benutzerauthentifizierung
Ab UltraDev 4.0 gibt es eine Reihe neuer Serververhalten, die der Authentifizierung des Anwenders dienen. Im Gegensatz zu anderen Verhaltensweisen verändern sie keine Daten oder die Art ihrer Darstellung. Diese Verhaltensweisen dienen dem Zweck, den Zugang zu bestimmten Seiten nur für berechtigte Anwender zuzulassen. Sie setzen eine Tabelle mit Zugangsberechtigungen voraus, die Sie selbst verwalten und pflegen müssen. In dieser Tabelle werden der Name und das Passwort des Anwenders in Klartext gespeichert. Die UltraDev-Verhaltensweisen vergleichen diese Daten mit den Eingaben des Anwenders im Anmeldeformular. Stimmen sie überein, wird eine Session-Variable MM_Username gesetzt. Auf allen weiteren Seiten wird diese Variable überprüft um festzustellen, ob der Betreffende eine Zugangsberechtigung zu diesen Seiten besitzt. Es gibt insgesamt vier Authentifizierungsverhalten, die wir nun der Reihe nach durchgehen werden.
Benutzer anmelden Das Verhalten BENUTZER ANMELDEN (siehe Abb. 9.15) präsentiert sich zwar mit einer umfangreichen Eingabemaske, ist aber leicht zu konfigurieren. Dieses Verhalten wird zweckmäßigerweise einer Anmeldeseite zugewiesen. Alles, was Sie tun müssen, ist, ein Formular zu erstellen – der Rest wird automatisch erledigt. Um das Verhalten zu konfigurieren, müssen Sie die vier Felder der Eingabemaske entsprechend den Werten in Ihrer Site bzw. Datenbank ausfüllen: 쐽
326
EINGABE ABRUFEN AUS FORMULAR – Hier wählen Sie das Formular aus, das die Authentifizierungsdaten an das Verhalten schickt. Ferner müssen Sie spezifizieren, welche Formularfelder den Benutzernamen und das Passwort enthalten.
Benutzerauthentifizierung
Abbildung 9.15: Das Verhalten Benutzer anmelden vergleicht Anwendereingaben aus einem Formular mit Einträgen in der Datenbank. 쐽
VALIDIEREN ÜBER VERBINDUNG – Hier wählen Sie die Datenbankverbindung aus, die Tabelle und die Tabellenspalten, die die gespeicherten Log-In-Daten enthalten. Diese Informationen müssen im Klartext vorliegen, dürfen also nicht verschlüsselt sein.
쐽
BEI ERFOLGREICHER ANMELDUNG HIERHER GEHEN – Wenn sich die Daten aus dem Anmeldeformular mit den Einträgen in der Datenbank decken, wird der Besucher zu der hier definierten URL geschickt. Wenn Sie das Kontrollfeld ZUM VORHERIGEN URL GEHEN aktivieren, wird der Besucher zurück zu der Seite geleitet, die er ursprünglich laden wollte, für die er aber keine Zugriffsrechte hatte. Schlägt die Anmeldung fehl, können Sie den Besucher zu einer eigens hierfür definierten Seite schicken.
쐽
ZUGRIFF BESCHRÄNKEN BASIEREND AUF – In diesem untersten Bereich der Eingabemaske haben Sie zwei Optionen zur Auswahl: Sie können die Zugriffsrechte entweder auf Grund von Benutzernamen und Kennwort beschränken bzw. auf Grund von Benutzernamen, Kennwort und Berechtigungslevel. Die erste Option bedarf keiner weiteren Erklärung. Bei der zweiten Option können Sie den Zugang zu bestimmten Seiten über eine Berechtigungshierarchie regeln (Gast, registrierter Besucher, Administrator usw.). Falls Sie Zugang mit Berechtigungslevel implementieren, müssen Sie in der Datenbanktabelle, in der die Zugangskennungen gespeichert sind, eine entsprechende Spalte angelegt haben.
Mit diesen wenigen Handgriffen haben Sie eine Anmeldeseite generiert. Hat das Serververhalten die nötigen Daten erhalten und überprüft, wird der Besucher auf die von Ihnen festgelegte Seite gelenkt. Ihre Aufgabe ist es nunmehr, diese Seiten zu gestalten.
327
Einführung in die dynamischen Werkzeuge von UltraDev
Zugriff auf Seite beschränken Wenn sich ein Besucher auf einer Website einloggen muss, dann hat das meistens einen tieferen Grund – z.B., um den Zugang zu bestimmten Informationen zu beschränken. Das Serververhalten ZUGRIFF AUF SEITE BESCHRÄNKEN ermöglicht es zu überprüfen, ob ein Besucher die erforderliche Berechtigung hat, eine bestimmte Seite anzusehen, bevor diese angezeigt wird. Es wird vorausgesetzt, das Sie bereits ein Verhalten BENUTZER ANMELDEN definiert haben, bevor Sie über dieses Verhalten eine Zugangsbeschränkung festsetzen. Wenn Sie dieses Verhalten einsetzen wollen, brauchen Sie es lediglich der Seite zuzuweisen, die nur für bestimmte Besucher zur Verfügung stehen soll. Wie aus Abb. 9.16 ersichtlich, genügt es für die Konfigurierung dieses Verhaltens, dass Sie festlegen, auf Grund welcher Daten der Zugriff beschränkt werden soll (gültiges Login bzw. gültiges Login plus Berechtigungslevel). Hat sich der Besucher nicht korrekt eingeloggt, wird er auf die Seite geschickt, die Sie im Feld BEI VERWEIGERTEM ZUGRIFF HIERHER GEHEN eingeben.
Abbildung 9.16: Zugriffsrechte beschränken mit Benutzernamen und Kennwort, eventuell ergänzt um einen Berechtigungslevel
Wollen Sie Zugriffsrechte zusätzlich über die Definition von Berechtigungsleveln regeln, müssen Sie bereits ein Anmeldeverhalten erstellt haben, das Berechtigungslevel überprüft. Wenn Sie Berechtigungslevel an dieser Stelle zum ersten Mal einsetzen, müssen Sie auf die Schaltfläche DEFINIEREN klicken, um die entsprechenden Level der Auswahlliste hinzuzufügen. Über die Plus- und Minussymbole können Sie Berechtigungslevel erzeugen bzw. löschen. Vorsicht: Berechtigungslevel müssen exakt so benannt sein wie ihre Entsprechungen in der Datenbank. Haben Sie diese Berechtigungslevel bereits definiert, müssen Sie sie nur noch aus der Liste auswählen. In der Folge haben nur die Besucher Zugang zu dieser Seite, die den nötigen Berechtigungslevel besitzen.
Benutzer abmelden Sinn und Zweck des Verhaltens BENUTZER ABMELDEN lässt sich problemlos aus seinem Namen ableiten. Auch wenn Sie dieses Verhalten auf Ihrer Website nicht wirklich brauchen, gibt es doch ein paar sinnvolle Einsatzmöglichkeiten. Sobald sich ein Besucher ein-
328
Benutzerauthentifizierung
loggt, legt dessen Browser für diese Session ein Cookie an. Dieses Cookie existiert nur so lange, wie der Browser geöffnet ist. Schließt der Anwender den Browser, hat er sich damit definitiv aus der Anwendung ausgeloggt und es besteht keine Notwendigkeit für ein Auslog-Verhalten. Soll der Besucher aber die Möglichkeit haben, sich während einer Sitzung aus einem Zugangskonto auszuloggen und sich anschließend unter einem anderen Zugang wieder einzuloggen, müssen Sie dieses Verhalten implementieren. Das zugehörige Dialogfenster sehen Sie in Abb. 9.17. Abbildung 9.17: Konfiguration des Abmelde-Verhaltens und der Seite, die in der Folge angezeigt werden soll
Zur Konfiguration dieses Verhaltens braucht das Programm Informationen, wann das Abmelde-Verhalten aktiviert werden soll (nachdem ein Link angeklickt wurde oder wenn die Seite mit dem Abmelde-Verhalten geladen wird), und zu welcher Seite der Besucher im Anschluss gelenkt werden soll. Wie gesagt, wirklich brauchen tun Sie dieses Verhalten nicht. Es ist ziemlich unwahrscheinlich, dass die Besucher auf Ihrer Site diesen Logout-Link überhaupt bemerken werden – so ist das eben im Internet.
Neuen Benutzernamen überprüfen Für bestimmte Websites ist es erforderlich, dem Besucher ein Online-Anmeldeformular zur Verfügung zu stellen, über das er seinen eigenen Zugang konfigurieren kann. Hierzu muss er einen Benutzernamen und ein Kennwort eingeben können. Bei einigen Hundert registrierten Benutzern kann jedoch nicht ausgeschlossen werden, dass der gewählte Benutzername bereits vergeben ist. (Wenn Sie je versucht haben, bei einem Free-Maildienst eine persönliche Mailadresse einzurichten, dann wissen Sie wahrscheinlich, wovon ich rede.) Das Verhalten NEUEN BENUTZERNAMEN ÜBERPRÜFEN kontrolliert, ob ein Benutzername bereits vergeben ist, bevor es ihn in die Datenbank schreibt. Das Verhalten NEUEN BENUTZERNAMEN ÜBERPRÜFEN arbeitet in Verbindung mit dem Verhalten DATENSATZ EINFÜGEN und verlangt zwei Eingaben: das Datenfeld, das den Benutzernamen enthält, sowie die URL der Seite, auf die der Besucher geschickt werden soll, falls der gewählte Benutzername bereits vergeben ist. Abb. 9.18 zeigt das zugehörige Dialogfenster.
329
Einführung in die dynamischen Werkzeuge von UltraDev
Abbildung 9.18: Wählen Sie die Spalte der Tabelle aus, die den Benutzernamen enthält, sowie die Seite, auf die der Besucher geschickt wird, falls der Name bereits vergeben ist.
Wenn Sie Anmeldeseiten entwickeln, werden Sie dieses Verhalten nicht mehr missen wollen, da damit doppelte Einträge unmöglich sind.
Technik für Fortgeschrittene: Serververhalten editieren bzw. neu erstellen Die nachfolgenden Instruktionen sollten nur von den Lesern praktisch umgesetzt werden, die die Entwicklungsumgebung von UltraDev und zumindest eine der eingebetteten Skriptsprachen aus dem Effeff kennen. UltraDev enthält einen eigenen Editor, mit dem Sie neue Serververhalten erzeugen bzw. bereits vorhandene Ihren Erfordernissen entsprechend modifizieren. Ich kann nur jedem dringend davon abraten, die vordefinierten Serververhalten von UltraDev in irgendeiner Form zu verändern. Wenn Sie dergleichen vorhaben, speichern Sie das Verhalten erst unter einem anderen Namen, bevor Sie den Code umschreiben. Ich möchte Ihnen an einem kleinen Beispiel vorführen, wie sich Serververhalten anpassen lassen, damit Sie einen Eindruck davon bekommen, wie die Sache im Prinzip funktioniert. Klicken Sie in der Palette SERVERVERHALTEN auf das Plussymbol (+), und wählen Sie SERVERVERHALTEN BEARBEITEN, um ein bereits vorhandenes Serververhalten zu modifizieren (wir raten ab) oder NEUES SERVERVERHALTEN, um ein neues Serververhalten zu erstellen bzw. ein Serververhalten als Kopie zu speichern und dann zu modifizieren. Nehmen wir an, Sie möchten ein neues ASP-Serververhalten definieren, das eine SessionVariable unter Bezug auf eine Anforderungsvariable setzt. Die Befehlssyntax würde sich folgendermaßen lesen: <%Session("MySessionVariable")=Request("MyRequestVariable")%>
Im ersten Schritt wählen Sie im Popup-Menü der Serververhaltenpalette den Befehl NEUES SERVERVERHALTEN. Es öffnet sich das in Abb. 9.19 gezeigte Dialogfenster.
330
Benutzerauthentifizierung
Abbildung 9.19: Wählen Sie das Servermodell aus und vergeben Sie einen Namen für das neue Verhalten.
Wählen Sie das richtige Servermodell aus (in diesem Fall ASP) und vergeben Sie einen Namen für das neue Verhalten. Wenn Sie die Option VORHANDENES SERVERVERHALTEN KOPIEREN aktivieren, können Sie eines der bereits vorhandenen Serververhalten auswählen und modifizieren. Sie müssen dann nicht ganz blank beginnen. Haben Sie die erforderlichen Eingaben gemacht, klicken Sie auf OK. Im zweiten Schritt definieren Sie das eigentliche Serververhalten. Hierzu müssen Sie den erforderlichen Code im Dialogfenster SERVERVERHALTEN-ERSTELLUNG einsetzen (siehe Abb. 9.20).
Abbildung 9.20: Im Dialogfenster Serververhalten-Erstellung definieren Sie den nötigen ASP-, JSP- bzw. CFML-Code.
Jedes Serververhalten kann aus mehreren Codeblöcken bestehen, die an ganz unterschiedlichen Stellen im HTML-Dokument stehen können. Da es sich bei unserem Beispiel um ein ganz simples Serververhalten handelt (es besteht aus einem einzigen Codeblock), sollte es nicht schwierig zu definieren sein: 1. Klicken Sie auf das Plussymbol (+), um einen neuen Codeblock hinzuzufügen. Nennen Sie ihn Set_Session_block1 (der Defaultname). 2. Wählen Sie in den Eingabefeldern CODE EINFÜGEN und RELATIVE POSITION die Option »Über dem Tag « bzw. »Anfang der Datei«. Diese beiden Popup-Menüs regeln, in welchen Teil des Dokuments der Code eingefügt wird und wo er dort steht.
331
Einführung in die dynamischen Werkzeuge von UltraDev
3. Ändern Sie den Codeblock folgendermaßen um: <%Session("")=Request("")%> 4. Platzieren Sie nun den Cursor zwischen die beiden Anführungszeichen der SessionHälfte: Session(""). Klicken Sie dann auf die Schaltfläche PARAMETER IN CODEBLOCK EINFÜGEN. Sie werden aufgefordert, einen neuen Parameter zu definieren. Nennen Sie ihn SessionName. 5. Setzen Sie den Cursor jetzt zwischen die Anführungszeichen der Request-Hälfte: Request(""). Klicken Sie wieder auf die Schaltfläche PARAMETER IN CODEBLOCK EINFÜGEN. Es öffnet sich das bereits bekannte Dialogfenster. Nennen Sie diesen Parameter RequestName. 6. Damit haben Sie das Grundgerüst für das neue Serververhalten geschaffen. Klicken Sie nun für die weiteren Schritte auf die Schaltfläche WEITER. Der letzte Schritt in der Definition des neuen Serververhaltens besteht darin, das nun geöffnete Dialogfenster zu konfigurieren. Dieser Vorgang ist wie so viele andere in UltraDev ebenfalls automatisiert. Wie in Abb. 9.21 zu sehen, können Sie die Anordnung der Eingabefelder im Dialogfenster verändern. Klicken Sie in der Spalte ANZEIGEN ALS auf einen der Parameter, können Sie sie mit der Datensatzgruppe verknüpfen. Dadurch wird es möglich, dass diese Parameter mit dynamischen Daten gefüllt werden.
Abbildung 9.21: Legen Sie die Reihenfolge und die Art der Anzeige der Eingabefelder im neuen Serververhalten fest.
Wenn Sie die erforderlichen Einstellungen vorgenommen haben, klicken Sie auf OK. Nun wird das Serververhalten erzeugt und dem Menü der Palette SERVERVERHALTEN hinzugefügt. Das Dialogfenster für unser neu erzeugtes Serververhalten ist in Abb. 9.22 zu sehen. Wenn Sie die Beispiele in den kommenden Lektionen durcharbeiten, werden Sie feststellen, dass in manchen Fällen der automatisch generierte Codes angepasst werden muss, damit die Anwendung wie gewünscht funktioniert. Und das sind genau die Einsatzbereiche, wo wir nicht mit modifizierten Serververhalten arbeiten sollten. Rein theoretisch ginge das zwar, aber es würde länger dauern, ein Verhalten auf die gewünschte Funktionalität hin abzuändern, als einfach den Code zu editieren. Die Definition neuer Verhaltens-
332
Zusammenfassung
weisen empfiehlt sich dann, wenn sich damit stets wiederkehrende Arbeitsschritte automatisieren lassen – nicht der gelegentliche Einzelfall, da die vordefinierten Verhaltensweisen nicht die gewünschte Funktionalität bieten. So gesehen ist die Möglichkeit, eigene Serververhalten zu generieren ein fantastisches Werkzeug, das gerade die Programmierergilde zu schätzen wissen wird.
Abbildung 9.22: Das neue Serververhalten ist einsatzbereit.
9.4
Zusammenfassung
Ähnlich wie in der allerersten Lektion haben wir heute die grundlegenden Werkzeuge kennen gelernt, die wir für die weitere Arbeit brauchen. Ich weiß, es brennt Ihnen unter den Nägeln, diese Tools nun selbst auszuprobieren und eigene Sites zu kreieren, drum legen wir morgen auch gleich los damit. Später in dieser Woche werden wir uns den SQLBefehlssatz selbst noch etwas genauer ansehen, damit Sie Ihre eigenen Abfragen generieren können, die über die Möglichkeiten der vordefinierten Routinen hinausgehen. Nach der heutigen Lektion sollten Sie ein Verständnis für die Funktion der Serververhalten mitbringen, wissen, wo Sie sie im Programm finden und was Sie damit tun können. Auch Sinn und Zweck der Datenbindungen sollte Ihnen klar sein. Die Palette DATENBINDUNGEN werden Sie für die Entwicklung dynamischer Websites ständig brauchen, denn sie ist die Schnittstelle zu allen Datenbankabfragen sowie sämtlichen dynamischen Daten. Über die Palette DATENBINDUNGEN können Sie außerdem die Attribute eines beliebigen HTML-Objekts in der Dokumentansicht mit dynamischen Daten verknüpfen.
333
Einführung in die dynamischen Werkzeuge von UltraDev
Schließlich haben Sie auch noch die Möglichkeit, aus der Datenbank bezogene Daten bei der Ausgabe formatieren zu lassen. Da bestimmte Attribute in Tabellen von Datenbank zu Datenbank oft unterschiedlich formatiert sein können, kann diese Funktion in vielen Fällen ein wahres Geschenk der Götter sein. Wenn Ihnen die Funktion einzelner Werkzeuge vielleicht jetzt noch nicht ganz klar ist, wird sich das sicher in Laufe der kommenden Lektionen ändern, wenn Sie mit praktischen Beispielen arbeiten. Die einzelnen Serververhalten werden noch einmal gründlich besprochen, wenn wir sie in eine Seite einbauen. Sie müssen also den Stoff der heutigen Lektion nicht auswendig lernen.
9.5 F
Gibt es bei den fortgeschrittenen Abfragen irgendwelche Einschränkungen? A
F
Ja und nein. Wenn Sie dieses Verhalten wie zwei ineinander geschachtelte for...next-Schleifen verwenden, werden Sie eine kleine Überraschung erleben. Der von UltraDev generierte Code initialisiert die beiden Schleifen gleichzeitig, bevor eine davon ausgeführt wird. Das hat zur Folge, dass die innere Schleife nur einmal ausgeführt wird.
Wozu ist eigentlich der Befehl ZUSÄTZLICHE DATENQUELLEN ABRUFEN der Datenbindungspalette gut? A
334
Es ist vom Ergebnis her völlig gleich, ob ein Bereich angezeigt wird, weil eine Bedingung wahr ist, bzw. weil das Gegenteil der Bedingung wahr ist. Wenn Sie z.B. einen Bereich verbergen möchten, wenn die Bedingung A=1 erfüllt ist, können Sie das Serververhalten so konfigurieren, dass das Element angezeigt wird, wenn A≠1. Der Effekt ist der gleiche.
Kann man das Verhalten BEREICH WIEDERHOLEN ineinander schachteln? A
F
Die Abfragemöglichkeiten werden nur vom Datenbankserver begrenzt. UltraDev schickt die Abfrage so, wie sie ist, an den Server. Der SQL-Code selbst wird vom Programm nicht geparst.
Wie kann ich einen Bereich verbergen statt ihn anzuzeigen? A
F
Fragen und Antworten
Immer, wenn Sie in einer Palette oder einem Menü den Befehl Zusätzliche ... abrufen finden, können Sie über diesen Befehl Ihren Browser starten und direkt von der Macromedia-Website die entsprechenden Erweiterungen herunterladen.
Workshop
9.6
Workshop
Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Welche Funktion hat das Verhalten DATENSATZGRUPPE? 2. Wie können Sie die Anweisung DATENSATZ EINFÜGEN direkt auf dem Server ausführen? 3. Unterstützt UltraDev zusammengesetzte Primärschlüssel bei Abfragen? 4. Gibt es neben den Serververhalten noch andere Wege, eine Site um dynamische Funktionen zu erweitern? 5. Wie können Sie dynamische Werte bei der Ausgabe formatieren lassen?
Übungen 1. Probieren Sie die verschiedenen Werkzeuge aus, die Sie heute kennen gelernt haben. Versuchen Sie, diese Tools zusammen mit der gestern definierten Datenbankverbindung zu testen. 2. Machen Sie sich mit der Palette Datenbindungen vertraut. Wenn Sie eine funktionierende Datenbankverbindung eingerichtet haben, fügen Sie einige HTML-Elemente in der Dokumentansicht ein und verbinden Sie mit den Daten einer Datensatzgruppe. Sie müssen hier keine sinnvolle Anwendung erstellen, es geht darum, dass Ihnen das Prinzip in Fleisch und Blut übergeht. 3. Wenn Sie schon Webanwendungen entwickelt haben, untersuchen Sie, wie Sie die dort implementierten Funktionen mit den Serververhalten von UltraDev realisieren können. Sie werden feststellen, dass UltraDev ein sehr flexibles Werkzeug ist, mit dem Sie eine große Anzahl von Entwicklungsaufgaben lösen können, auch wenn Sie hier nicht mit herkömmlichen Programmiersprachen arbeiten.
335
Datenbankgestützte Webseiten entwickeln
0 1
Datenbankgestützte Webseiten entwickeln
Sobald Sie eine funktionierende Verbindung zu einem Datenbankserver eingerichtet haben, zeigt sich UltraDev als der leistungsfähige visuelle Editor, der er ist. Wenn Sie eine Verbindung zu einer Datenbank erstellt haben, wird es Ihr erstes Ziel sein, die dort gespeicherte Information anzuzeigen. Je nach Webanwendung kann das schon die ganze dynamische Funktionalität sein, die wir brauchen. Heute lernen Sie, wie Sie datenbankgestützte Webseiten entwickeln und wie das Backend aussehen muss, das die Dynamik liefert. Die Themen der heutigen Lektion: 쐽
Datenbank-Backends erstellen und online verfügbar machen
쐽
Optisch ansprechende Gestaltung dynamisch erzeugter Informationsseiten
쐽
Einfache Suche in Datensätzen
쐽
Individualisierte Ausgabeseiten durch Einsatz von Grafiken
10.1 Datenbankgestützte Webseiten Unser erstes Produkt, das wir mit UltraDev anfertigen, ist gleichzeitig auch das wichtigste, den Sie werden es für jede Website mit Datenbankanbindung brauchen: eine einfache Übersichtsseite, die alle Inhalte der Datenbank darstellt. Eine solche Seite wird manchmal auch als Report bezeichnet. Auch wenn Sie Ihren Besuchern nicht mehr Interaktion mit der Datenbank bieten, als sich den Inhalt derselben anzeigen zu lassen, sollten Sie sich trotzdem darum bemühen, diese Informationen in einer für den Anwender möglichst transparenten Form zu präsentieren. Ein häufiges (optisches) Problem datenbankgestützter Webseiten ist, dass sie den Charme von Zugfahrplänen haben. Doch Daten lassen sich auch anders präsentieren. Überlegtes Design in Verbindung mit den Möglichkeiten von UltraDev ermöglicht die Entwicklung dynamischer datenbankgestützter Websites, deren Optik den Besucher sich nicht schaudernd abwenden lässt. Heute werden wir lernen, wie man unterschiedliche Typen dynamischer Seiten »von Null an« erstellt. Ein weiteres Thema ist die Einrichtung der zugehörigen Datenbank. Am Ende der Lektion werden Sie die grundlegenden Abfragefunktionen von UltraDev kennen wie Ihre Westentasche. Danach können wir uns an größere Projekte wagen. Um uns das Leben leichter zu machen, starten wir mit einer einfachen Datendarstellung und arbeiten uns schließlich Zug zum Zug empor.
338
Eine einfache Tabelle
10.2 Eine einfache Tabelle Wie Sie wissen, bezeichnet man eine Gruppe zusammengehöriger Informationen in einer Datenbank als Tabelle. Die Ausgabe von Tabellen auf dem Bildschirm ist unsere erste Aufgabe heute. Wie sich vorstellen können, lässt sich die Tabelle einer Datenbank problemlos in eine HTML-Tabelle übersetzen. Mit UltraDev ist die Erzeugung einer solchen Anwendung ein Kinderspiel – leider ist das Rohprodukt so beschaffen, dass wir um etwas Schönheitspflege nicht herumkommen. Die Befehle in diesem und den nachfolgenden Beispielen entstammen dem Wortschatz von MySQL. Sie sollten sich jedoch mit wenigen oder gar keinen Änderungen auf jeden Standard-SQL-Server übertragen lassen.
Das Backend erstellen Zunächst werden wir eine SQL-Tabelle erzeugen, die bestimmte Kontaktinformationen enthalten soll. Nachfolgend die entsprechenden Anweisungen an den MySQL-Server: create table personal( vname varchar(50) not null, nname varchar(50) not null, age int, telephon varchar(20), beschreibung varchar(200), primary key (vname,nname) )
Diese Tabelle enthält lediglich ein paar Personendaten wie Vorname, Nachname, Alter, Telefonnummer und eine kurze Beschreibung. (Achtung: Die Variable »Alter« habe ich mit dem englischen Wort »age« benannt, da »alter« ein reservierter MySQL-Name ist, dessen Verwendung zu Fehlermeldungen führt.) Als Primärschlüssel werden vname und nname der Person gesetzt. Das bedeutet, dass es keine zwei Personen geben darf, die denselben Vor- und Nachnamen haben. Für eine reelle Anwendung ist das ein problematischer Ansatz, doch für unsere Zwecke hier mag er genügen. Die Tabellen, die wir heute erzeugen, werden wir auch für die morgige Lektion brauchen. Die Verwendung eines zusammengesetzten Primärschlüssels soll auch nicht zuletzt dazu dienen, das Bewusstsein für verschiedene »Problemzonen« in UltraDev zu schärfen. insert into personnel values ('John','Ray',99,'555-555-5555', 'Ein famoses Haus'); insert into personnel values ('Robyn','Ness',62,'555-555-1234', 'Ein scharfes Mundwerk'); insert into personnel values ('Anne','Groves',12,'230-555-1234',
339
Datenbankgestützte Webseiten entwickeln
'Besitzt knabenhaften Charme'); insert into personnel values ('Paul','Jeebers',12,'430-555-4444 ', 'Eine rein virtuelle Existenz'); insert into personnel values ('Jack','Dairyfay',62,'555-555-7123', 'Glaubt, dass Fleisch verseucht ist und vor dem Verzehr schwarz gebraten werden muss');
Ein Hinweis in eigener Sache: Falls Sie sich gewundert haben, was der letzte Eintrag in der Liste soll, hier ist die Erklärung: Der Betreffende existiert wirklich und ist ein Freund von mir. Er traut keinem Stück Fleisch, das er nicht eigenhändig hat anbrennen lassen. Und um bei abgepacktem Hackfleisch kein Risiko einzugehen, kocht er es vor dem Verzehr. Ich weiß nicht, ob es nur mir so geht, aber ich finde das etwas seltsam. Der letzte Schritt beim Einrichten unseres Datenbank-Backends besteht darin, zu testen, ob auch alle Daten korrekt in die Tabelle eingesetzt wurden. Das geschieht mithilfe der SQL-Anweisung SELECT: mysql>select * from personnel mysql> \G ***************************1.row *************************** firstname: John lastname: Ray age: 99 phone: 555-555-5555 description: Ein famoses Haus ***************************2.row *************************** firstname: Robyn lastname: Ness age: 62 phone: 555-555-1234 description: Ein scharfes Mundwerk ***************************3.row *************************** firstname: Jack lastname: Dairyfay age: 62 phone: 555-555-7123 description: Glaubt, dass Fleisch verseucht ist und vor dem Verzehr schwarz gebraten werden muss ***************************4.row *************************** firstname: Anne lastname: Groves age: 12 phone: 230-555-1234 description: Besitzt knabenhaften Charme ***************************5.row ***************************
340
Eine einfache Tabelle
firstname: Paul lastname: Jeebers age: 12 phone: 430-555-4444 description: Eine rein virtuelle Existenz 5 rows in set (0.00 sec)
So weit sieht alles ganz gut aus, drum lassen Sie uns die Daten jetzt ins Netz bringen.
Das UltraDev-Frontend entwickeln Nachdem wir unser Datenmaterial im Backend gespeichert haben, wird es Zeit, das erforderliche Frontend zu schaffen. Zuerst müssen wir wieder eine Datenbankverbindung einrichten. Wenn Sie nicht mehr genau wissen, wie das geht, sehen Sie bitte in Tag 8, »Mac und Windows-PC für die Datenbankanbindung fit machen«, nach. Falls es Sie interessiert, in welcher Umgebung ich diese Anwendung entwickle, hier die Daten: Als Webserver verwende ich Windows NT mit dem IIS, einen Linuxrechner mit MySQL und PostgreSQL als Datenbankserver sowie ein Macintosh-Powerbook als Designwerkzeug. Wie Sie sehen, eine sehr heterogene Installation, aber sie funktioniert unglaublich gut. Damit Sie die folgenden Beispiele nachvollziehen können, müssen Sie diese Schritte erledigt haben: 1. Definieren Sie eine neue Site. 2. Richten Sie ein lokales Verzeichnis der Site ein sowie ein entferntes auf dem Webserver. Das Verzeichnis auf dem Server muss Ausführungsrechte besitzen. 3. Wählen Sie das gewünschte Anwendungsservermodell. Ich arbeite mit ASP 2.0. 4. Richten Sie eine Datenbankverbindung ein. Haben Sie diese vier Schritte erfolgreich durchgeführt und die Verbindung getestet, steht weiteren Taten nichts mehr im Wege.
Datensatzgruppe definieren In unserer Testdatenbank gibt es augenblicklich nur eine Tabelle, darum brauchen wir auch nur eine Datensatzgruppe zu erzeugen. Öffnen Sie die Palette SERVERVERHALTEN und klicken Sie auf das Plussymbol (+), um eine neue Datenbindung zu erstellen. Wählen Sie DATENSATZGRUPPE (ABFRAGE). Ich möchte nur eine einfache Datensatzgruppe einrichten, die alle Daten meiner Tabelle enthält. Die entsprechenden Einstellungen sehen Sie in Abb. 10.1.
341
Datenbankgestützte Webseiten entwickeln
Abbildung 10.1: Definition einer einfachen Datensatzgruppe, die sämtliche Felder der Tabelle enthält
Die einzigen Einstellungen, die ich in diesem Dialogfenster vornehmen muss, ist die Auswahl einer Verbindung sowie einer Tabelle aus der Datenbank. Schließlich vergebe ich noch einen Namen für die Verbindung und wähle die Option SPALTEN : ALLE. Wenn alles vorschriftsmäßig funktioniert hat, sollte die Palette DATENBINDUNGEN so aussehen wie in Abb. 10.2 gezeigt. Können Sie die einzelnen Felder nicht sehen, klicken Sie auf das Plussymbol (+), um die Datensatzgruppe auszuklappen.
Abbildung 10.2: Datensatzgruppe mit den darin enthaltenen Datenfeldern
Weil das unsere erste dynamisch erzeugte Site ist, wollen wir mit den Werkzeugen noch ein bisschen herumspielen. Wie bekommen wir z.B. Daten aus der Datenbank in unser HTML-Dokument? Nun, das ist nicht schwer: klicken, ziehen, fallen lassen.
342
Eine einfache Tabelle
Daten auf die Seite bringen Für den Anfang ziehen wir jedes der Felder in der Datenbindungenpalette in die Dokumentansicht. Das fertige Dokument enthält dann einige Tags, die nach folgendem Muster aufgebaut sind: {Recordset.Fieldname}. Abb. 10.3 zeigt ein einfaches Dokument, in das ich alle Felder der Datensatzgruppe gezogen habe. Abbildung 10.3: Datensätze lassen sich mit Drag and Drop ins Dokument importieren.
Wahrscheinlich sind Ihnen in der Palette DATENBINDUNGEN drei zusätzliche Einträge aufgefallen, die nicht aus unserer Datenbank stammen. Diese drei Funktionen werden sich später noch als recht nützlich erweisen: [erster Datensatz-Index], [letzter Datensatz-Index] sowie [Datensätze gesamt]. [Datensätze gesamt] zeigt die Gesamtanzahl von Einträgen in der Datensatzgruppe, [erster Datensatz-Index] ist die Nummer des ersten auf der Seiten angezeigten Datensatzes, [letzter Datensatz-Index] analog die Nummer des letzten Datensatzes, der auf einer Seite angezeigt wird. Diese Zähler werden wir bald brauchen. Natürlich kann man nun Seiten erstellen, indem man diese abstrakten Platzhalter für Datenfelder wie jedes andere Element auch im Dokument platziert. Auf diese Weise machen wir allerdings von einem der stärksten Features, die UltraDev zu bieten hat, keinen Gebrauch. Ich spreche von der Fähigkeit des Programms, in der Dokumentansicht Daten aus der Datenbank sozusagen live anzeigen zu können. Andere Entwicklungsumgebungen benutzen zur Darstellung von Datenbankmaterial ähnliche Tags wie wir sie gerade kennen gelernt haben. Verbindungen zu Daten auf einem Datenbankserver von unterschiedlichen Designumgebungen und unterschiedlichen Serverplattformen aus herzustellen zu können, die mit den unterschiedlichsten Verbindungstechniken arbeiten, ist sicher alles andere als eine leichte Aufgabe. Macromedia hat eine völlig neue und höchst leistungsfähige Technik entwickelt, die es ermöglicht, in der Entwurfsansicht einer Entwicklungsumgebung direkt auf eine Datenbank zugreifen zu können.
Live Data-Vorschau Damit Sie sich eine Seite in der Live Data-Vorschau ansehen können, wird das Dokument, das Sie gerade bearbeiten, auf den Server geladen. Dieser rendert die Seite wie unter reel-
343
Datenbankgestützte Webseiten entwickeln
len Produktionsbedingungen, lädt die berechnete Webseite herunter, gleicht sie mit dem Dokument in der Dokumentansicht ab und setzt die dynamischen Daten in die entsprechenden Felder – und all das in weniger als einer Sekunde, eine schnelle Verbindung vorausgesetzt. Um auf die Live Data-Vorschau umzuschalten, wählen Sie lediglich Menü ANSICHT > LIVE DATA. Wenn Sie diesen Befehl jetzt wählen und Sie Ihre Datenbank aufgebaut haben wie ich die meine, bekommen Sie die Abb. 10.4 gezeigte Ansicht. Abbildung 10.4: Die abstrakten FeldTags werden durch aktuelle Daten aus der Datenbank ersetzt.
Sollte die Live Data-Ansicht nicht funktionieren, dann überprüfen Sie noch einmal sämtliche Einstellungen in der Site-Definition, vor allem die Informationen zum Anwendungsserver sind hier interessant. Wichtig sind dabei die Felder LIVE DATA SERVER und LIVE DATA-URL-PRÄFIX. Unter LIVE DATA SERVER haben Sie zwei Optionen zur Auswahl: Entweder »lokaler Web-Server«, der mit einer gespiegelten Kopie der Daten arbeitet, oder »entfernter Web-Server«. Wenn Sie auf den entfernten Server über eine Wählverbindung oder eine sonstige langsame Verbindung gehen, kann die Live Data-Vorschau per entfernter Server zur Geduldsprobe werden. Der einzige Ausweg ist hier, die Daten vom Server auf den lokalen Rechner zu spiegeln und die Live Data-Vorschau von dieser Kopie berechnen zu lassen. Wenn Sie sich für diesen Weg entscheiden, muss der lokale Server dieselbe Technologie verwenden wie der entfernte. Es geht also nicht, dass Sie auf der entfernten Website mit JSP arbeiten und das ASP-Modell für die lokale Live Data-Vorschau verwenden. Wenn Sie die Live Data-Verbindung richtig eingerichtet haben, können Sie die Seite mit Klick auf den kreisförmigen Pfeil links oben neu laden lassen. Sollte ein Reload länger dauern als vorgesehen, klicken Sie auf das kleine Stop-Icon. Der Reload wird dann abgebrochen. Soll bei Änderungen an der Seite die Live Data-Ansicht unmittelbar aktualisiert werden, aktivieren Sie das Kontrollfeld AUTOMAT. AKTUALISIERUNG. Ziehen Sie also beispielsweise ein neues Element (Datenfelder usw.) auf die Seite, spiegeln sich diese Veränderungen sofort in der Dokumentansicht wider. Aktivieren Sie dieses Kontrollfeld, müssen Sie entweder über den Reload-Button oder über Menü ANSICHT > LIVE DATA AKTUALISIEREN die Seite frisch laden, um den Fortschritt Ihres Werkes begutachten zu können. Über das URL-Feld unterhalb der Menüzeile der Live Data-Ansicht, können Sie sich von einer Seite bestimmte Werte in die Dokumentansicht schicken lassen. Somit können Sie die Übergabe von Variablen durch eine andere Webanwendung simulieren. Dieses Feature wird sich als höchst nützlich erweisen, wenn wir in der letzten Woche daran gehen, richtige Webanwendungen zu entwickeln.
344
Eine einfache Tabelle
Mehrere Datensätze gleichzeitig darstellen Wie Sie bemerkt haben, bekommen wir in der Dokumentansicht nur einen einsamen Datensatz angezeigt, während unsere Datenbank doch an Material nur so überbordet. (Wir haben immerhin fünf Datensätze gespeichert.) Wie können wir nun das Programm überreden, statt nur einem alle Datensätze auf einmal anzuzeigen? Wir könnten nun lauter neue Datensatzgruppen generieren, die jeweils einen Datensatz aus der Datenbank holen, was aber ziemlich daneben wäre. Hier kommt nun das Serververhalten BEREICH WIEDERHOLEN ins Spiel. Damit lassen sich mehrere Datensätze auf einmal anzeigen. Dieses Verhalten kann entweder alle oder eine bestimmte Anzahl von Datensätzen auf der Webseite ausgeben. Sie wählen lediglich aus, welche Daten (welche Bereiche) wiederholt werden sollen, und UltraDev erledigt den Rest. BEREICH WIEDERHOLEN funktioniert nach dem Prinzip einer do...until- bzw. for...next-Schleife. Wenn Sie alle Datensätze einer Gruppe anzeigen lassen, wird dieses Verhalten einen Bereich des HTML-Dokuments wiederholen, den nächsten Datensatz holen und dann diesen Bereich zusammen mit dem neuen Datensatz ausgeben, bis der letzte Datensatz erreicht wurde. Wenn Sie nur eine Teilmenge aller Datensätze anzeigen lassen, wird das Verhalten BEREICH WIEDERHOLEN zählen, wie oft es die Schleife bereits durchlaufen hat, und dann stoppen, wenn die angegebene Zahl der maximalen Durchläufe erreicht wurde. Bevor Sie das Verhalten BEREICH WIEDERHOLEN einer Seite zuweisen, sollten Sie die Zeile, die die dynamischen Daten enthält, mit einem Zeilenumbruch abschließen. Andernfalls werden sämtliche Datensätze in einer einzigen Zeile ausgegeben. Wollen Sie die Datensätze, die Sie bereits ins Dokument gezogen haben, zeilenweise ausgeben, müssen Sie nur Folgendes tun: 1. Wählen Sie für jeden Datensatz, den Sie wiederholen wollen, das entsprechende Element auf der Seite aus. Da wir in diesem Fall ja alle Datenfelder ins Dokument gezogen haben, müssen wir lediglich die ganze Zeile auswählen. 2. Öffnen Sie als Nächstes die Palette SERVERVERHALTEN. 3. Klicken Sie auf das Plussymbol (+), und wählen Sie aus dem Popup-Menü BEREICH WIEDERHOLEN. Nun müssen Sie das Verhalten noch konfigurieren. Abb. 10.5 zeigt das zugehörige Dialogfenster. Wählen Sie die Datensatzgruppe aus, in der die Daten liegen, die wiederholt werden sollen (in diesem Fall MitarbeiterInfo), sowie die Zahl der Datensätze, die ausgegeben werden sollen (in diesem Fall alle).
345
Datenbankgestützte Webseiten entwickeln
Abbildung 10.5: Wählen Sie die Datensatzgruppen, deren Elemente wiederholt ausgegeben werden sollen, sowie die Anzahl der Datensätze, die zugleich dargestellt werden sollen.
Haben Sie alle Einstellungen vorgenommen, müssen Sie nur noch auf OK klicken. Wenn Sie in der Live Data-Ansicht sind, müssten Sie jetzt alle Datensätze der Datenbank sehen – einen pro Zeile. Die dynamischen Daten der Live Data-Ansicht werden farblich hervorgehoben, um zu signalisieren, dass die »Platzhalter« vom entfernten bzw. lokalen Server erfolgreich in echte Daten übersetzt wurden. Sie können die Farbe dieser Markierung über Menü BEARBEITEN > VOREINSTELLUNGEN > MARKIERUNG Ihrem Geschmack anpassen. Wenn Sie erst einmal mit UltraDev vertraut geworden sind und der Umgang mit Live-Daten auf dem Schirm für Sie nichts Neues mehr ist, möchten Sie die farbliche Markierung von Live-Daten vielleicht ganz abschalten. Hierzu müssen Sie nur die entsprechenden Kontrollfelder für Live Data in den Voreinstellungen deaktivieren. Ich finde diese farbigen Markierungen eher hinderlich beim Entwickeln von Seiten. Wenn Sie Ihre Datensätze genug bewundert haben, schließen Sie bitte die Live-DataAnsicht und sehen sich die veränderte Dokumentansicht an. Wie in Abb. 10.6 deutlich zu erkennen, gibt sich die Normalansicht nicht die geringste Mühe, uns einen Eindruck davon zu vermitteln, was das Verhalten BEREICH WIEDERHOLEN bewirkt. Sie legt um die zu wiederholenden Bereiche lediglich einen Rahmen und versieht ihn mit einer Registermarke WIEDERHOLEN. Abbildung 10.6: Ist die Live-DataAnsicht ausgeschaltet, präsentiert sich die Ansicht minder prächtig.
Diese Art der Darstellung ist zwar hilfreich, wenn man wissen will, wie die Seite anwendungstechnisch aufgebaut ist oder wenn man Änderungen an bestimmten Bereichen vornehmen will, dem Designer wird sie jedoch weniger einen Eindruck vom endgültigen Aussehen seines Produkts geben.
346
Eine einfache Tabelle
Eine Tabelle in der Tabelle Wir haben also erreicht, dass das Programm unsere Daten anzeigt, an der Optik lässt sich aber sicher noch feilen. Genau genommen sieht das Ding bis dato eher scheußlich aus. Fünf Datensätze unterschiedlichen Umfangs werden ohne jegliche Formatierung ausgegeben. Dem lässt sich aber leicht abhelfen. Wir nehmen uns ein HTML-Objekt, das eigens zu dem Zweck geschaffen wurde, Daten optisch zu gliedern und zusammenzuhalten, was zusammengehört: eine Tabelle. Wir haben fünf Datenfelder (Vorname und Nachname gehen getrennt), also könnten wir eine Tabelle mit fünf Spalten erstellen und da alles hineinplatzieren. Damit aber die Tabelle nicht übermäßig aufgebläht wird, setzen wir Vorund Nachnamen in eine Spalte. Öffnen Sie ein neues Dokument, das die Tabelle aufnehmen soll. Für dieses Dokument müssen Sie die Datensatzgruppe, die wir für die vorige Seite erstellt haben, neu definieren. Sie können natürlich auch das alte Dokument weiter verwenden, dann müssen Sie aber zuvor sämtliche Serververhalten löschen. In letzterem Falle müssen Sie die Palette SERVERVERHALTEN öffnen und jedes Verhalten mit Klick auf das Minussymbol (-) löschen. Wenn Sie ein Dokument, dem Sie Serververhalten zugewiesen haben, bearbeiten oder anderweitig neu verwenden, dürfen Sie die Serververhalten auf keinen Fall in der Dokumentansicht selbst löschen. Sie könnten natürlich im Dokument selbst beispielsweise das Verhalten BEREICH WIEDERHOLEN markieren und löschen, und scheinbar funktioniert auch alles, doch wird der hinter dem Verhalten liegende Code nicht (vollständig) entfernt. Versuchen Sie ein Verhalten direkt in der Dokumentansicht zu löschen, erhalten Sie eine Warnmeldung. Weisen Sie nun ein neues Verhalten BEREICH WIEDERHOLEN der Seite zu, wird es nicht funktionieren, wenn Sie sich die Seite anzeigen lassen wollen. Die einzige Abhilfe besteht in einem solchen Fall darin, die serverseitigen Skripten direkt im HTML-Code zu bearbeiten. Grundsätzlich möchte ich Ihnen raten, lieber gleich ein neues Dokument anzulegen, als bereits erstellte zu »recyclen«. Die erforderlichen Datenbindungen sind mit wenigen Handgriffen neu erstellt, und Sie laufen nicht Gefahr, alten »Störcode« im Dokument mitzuschleifen. Haben Sie die erforderlichen Datenbindungen neu definiert, fügen Sie in der Dokumentansicht eine Tabelle ein. Für unsere Personaldatenbank brauchen wir eine Tabelle mit vier Spalten und zwei Zeilen. Die vier Spalten dienen der Aufnahme der vier Datenfelder (Vor- und Nachname kommen wie gesagt in eine Spalte). Aber warum zwei Zeilen? Warum nicht fünf, wenn doch die Tabelle stolze fünf Datensätze zählt? Stimmt, die brauchen wir auch, aber das erledigt UltraDev für uns. Eigentlich braucht die Tabelle ja sogar nur eine Zeile, um die Datenfelder aufzunehmen. Aber bei zwei Zeilen können wir in die obere einen Spaltenkopf setzen, was den Informationswert der Tabelle für den Anwender deutlich erhöht. Erstellen wir also nun unser Tabellenlayout:
347
Datenbankgestützte Webseiten entwickeln
1. Deaktivieren Sie die Live Data-Ansicht während der Designphase. Das ist zwar kein Muss, doch ich persönlich finde es leichter, ein Dokument in der Normalansicht einzurichten. 2. Fügen Sie eine Tabelle mit zwei Zeilen und vier Spalten ins Dokument ein. 3. Schreiben Sie in die Felder der oberen Zeile den Namen der jeweiligen Spalte: Name, Alter, Telefon und Beschreibung. Sie bilden den Spaltenkopf. 4. Ziehen Sie aus der Datenbindungenpalette die einzelnen Datensätze in die jeweilige Spalte der zweiten Zeile. 5. Als Letztes markieren Sie die Zeile, die die Datenfelder enthält. Weisen Sie ihr dann das Serververhalten BEREICH WIEDERHOLEN zu. Wählen Sie im Dialogfenster die richtige Datensatzgruppe aus und die Option SPALTEN : ALLE. Wenn es alles gut gegangen ist, sollte Ihr Bildschirm in etwa so aussehen wie in Abb. 10.7 gezeigt.
Abbildung 10.7: Mit einem Tabellenlayout lassen sich Daten gut präsentieren. Gestalten ...
Schalten Sie zum endgültigen Test in die Live-Data-Ansicht oder in die Browservorschau. Wie in Abb. 10.8 zu sehen, werden alle fünf Datensätze in der Tabelle angezeigt – ganz so, wie wir das gewollt haben.
Abbildung 10.8: ... und das Werk begutachten.
Auch wenn es nicht so aussieht, so ist hier im Prinzip (bis auf die verbesserte Optik natürlich) nichts anderes geschehen als im vorigen Beispiel auch, bei dem die Datensätze zeilenweise ausgegeben wurden. UltraDev erzeugt automatisch den nötigen Code, um eine
348
Grafiken mit Datensatzgruppen verknüpfen
Gruppe von Feldern sowie die erforderlichen HTML-Tags so oft zu wiederholen, bis alle Datensätze angezeigt worden sind. Im ersten Beispiel mussten nur die dynamischen Daten wiederholt werden sowie das -Tag am Ende jeder Zeile. Dieses Beispiel funktioniert nicht anders, nur war der wiederholte Bereich eine Tabellenzeile: ... . Für das Programm macht es keinen Unterschied, ob es Teile einer Tabelle wiederholt oder eine Textzeile. Uns jedoch nötigt solcherlei vielleicht doch einen gewissen Respekt ab. Nun ist also unsere Tabelle schon recht hübsch, aber wollen wir damit wirklich schon an die Öffentlichkeit treten? Ist das wirklich schon das Maximum an Ästhetik? Präsentiert sie die Information so, wie man es von einer Website erwartet? Wie können wir dem Ganzen etwas Pep geben? Die naheliegendste Lösung wäre natürlich, die Seite um ein paar Grafiken zu ergänzen und damit das monotone Tabellengefüge etwas aufzulockern. UltraDev selbst kann zurzeit noch nicht direkt mit in Datenbanken eingebetteten Grafiken umgehen. Doch mit etwas Planung ist das keine unüberwindliche Hürde.
10.3 Grafiken mit Datensatzgruppen verknüpfen Es wäre schon eine tolle Sache, wenn man zu jeder Person in der Tabelle neben ihren Personendaten auch noch ein Bild hätte. Wenn in diesem Fall jedoch UltraDev die Zusammenarbeit verweigert, wie können wir dann Grafiken in Datenbanken einbinden? Die Antwort ist nicht schwer: Wir speichern in der Datenbank einfach die URL, die zu einer bestimmten Grafik in einem bestimmten Verzeichnis auf dem Server führt. Statt des Bildes speichern wir einfach eine Referenz auf das Bild. Selbst wenn UltraDev eines Tages eingebettete Grafiken unterstützen sollte, würde ich es mir gut überlegen, von diesem Feature Gebrauch zu machen. Der Datentyp blob (Binary Large Object) erlaubt das direkte Speichern von Grafiken, Dateien und anderen Binär-Daten in einer Datenbank. Grafiken in einer Datenbank zu halten kann fallweise recht nützlich sein, da so das Wiederfinden von Grafiken in großen Bildbibliotheken erleichtert wird. Anderseits können die Leute, die mit dem Bildmaterial arbeiten, die Grafiker also, nicht mehr so ohne Weiteres auf die Grafiken zugreifen. Je nach System ist dann der Einzige, der Zugriff auf das Bildmaterial hat, der Datenbankadministrator. Da Dreamweaver und UltraDev ja als verteilte Entwicklungsumgebung konzipiert sind, wäre es entgegen der Philosophie dieser Software.
349
Datenbankgestützte Webseiten entwickeln
Um nun Bilder in unserer Datenbank zu speichern, müssen wir sie bloß um ein Feld imageurl erweitern. In diesem Feld speichern wir dann den Pfad der Abbildung, also z.B. pictures\image01.jpg.
Ein grafiktaugliches Datenbank-Backend Damit wir Grafikverweise in der Datenbank ablegen können, müssen wir die Personaldatenbank mit neuer Struktur noch einmal aufbauen: create table personal2 ( vname varchar(50), nname varchar(50), age int, phon varchar(20), beschreibung varchar(200), imageurl varchar(80) not null, primary key (imageurl) )
Wie Sie sehen, habe ich nicht nur ein neues Datenfeld imageurl hinzugefügt, sondern auch den Primärschlüssel verändert und auf imageurl gesetzt – denn wir dürfen davon ausgehen, dass es keine zwei Angestellten gibt, die dasselbe Bild haben. Als Nächstes müssen wie die Daten in der Datenbank entsprechend aktualisieren: insert into personal2 values ('John','Ray',99,'555-555-5555', 'Ein famoses Haus','bilder/JohnRay.jpg'); insert into personal2 values ('Robyn','Ness',62,'555-555-1234', 'Ein scharfes Mundwerk','bilder/RobynNess.jpg'); insert into personal2 values ('Anne','Groves',12,'230-555-1234', 'Besitzt knabenhaften Charme','bilder/AnneGroves.jpg'); insert into personal2 values ('Paul','Jeebers',12,'430-555-4444', 'Eine rein virtuelle Existenz','bilder/PaulJeebers.jpg'); insert into personal2 values ('Jack','Dairyfay',62,'555-555-7123', 'Glaubt, dass Fleisch verseucht ist und vor dem Verzehr schwarz gebraten werden muss','bilder/JackDairyfay.jpg');
Die Datensätze wurden nun um ein Feld ergänzt, das einen Verweis auf das Bild der betreffenden Person und das Verzeichnis, in dem es liegt, enthält. Wie geht das Ganze nun online? Kein Problem! Wir erstellen wieder ein Tabellenlayout wie im letzten Beispiel, ergänzen es aber um eine weitere Spalte, die die Grafik aufnimmt. Wiederholung ist die Mutter des Lernfortschritts, daher nachfolgend noch einmal alle erforderlichen Schritte zum Aufbau unserer grafiktauglichen Tabelle: 1. Öffnen Sie ein neues Dokument bzw. speichern Sie die bereits erstellte Seite unter anderem Namen und löschen Sie alle Serververhalten.
350
Grafiken mit Datensatzgruppen verknüpfen
2. Erstellen Sie für dieses Dokument eine Datensatzgruppe, die alle Felder unserer neu definierten Datenbank enthält. 3. Fügen Sie eine Tabelle ein oder modifizieren Sie die Daten im Dokument dahingehend, dass Sie eine weitere Spalte für die Grafik einfügen, die mit jedem Datensatz angezeigt werden soll. 4. Ziehen Sie wie im letzten Beispiel alle Platzhalter mit Ausnahme der Grafik-URL ins Dokument. Hier müssen wir etwas anders vorgehen. Weisen Sie noch kein Verhalten BEREICH WIEDERHOLEN zu. Die Tabelle steht nun, jetzt müssen wir nur noch die Grafiken in die Spalte bringen. Im Prinzip geht das so einfach wie das Einfügen einer normalen Grafik.
Das Dokument um dynamische Bilder ergänzen Setzen Sie zunächst die Einfügemarke in die letzte Tabellenspalte, die die Grafik aufnehmen soll. Wählen Sie dann im Menü EINFÜGEN > BILD und aktivieren unter DATEINAMEN WÄHLEN AUS die Option DATENQUELLEN. Nun können Sie die einzusetzende Grafik so konfigurieren, dass die Anwendung keine statische Abbildung verwendet, sondern Namen und Speicherort aus der Datenbank bezieht. Abb. 10.9 zeigt das geöffnete Dialogfenster.
Abbildung 10.9: Markieren Sie den Datensatz, der die Grafik-URL enthält.
Wählen Sie in diesem Dialogfenster im Listenfeld DATENQUELLEN die richtige Datensatzgruppe sowie das Datenfeld aus, das die Grafik-URL enthält. Klicken Sie abschließend auf OK. Ein kleines Icon im Dokumentfenster zeigt an, dass eine dynamische Grafik eingesetzt wurde.
351
Datenbankgestützte Webseiten entwickeln
Markieren Sie nun die Zeile, die die dynamischen Platzhalter enthält, und weisen Sie ihr das Verhalten BEREICH WIEDERHOLEN zu. Wenn Sie noch nicht in der Live Data-Vorschau sind, schalten Sie sie jetzt ein. Sämtliche Grafiken werden nun in der richtigen Spalte angezeigt (Abb. 10.10).
Abbildung 10.10: Die Grafiken werden jetzt zusammen mit den übrigen Informationen angezeigt.
Und das war auch schon die ganze Kunst, wobei das Layout zugegebenermaßen etwas Nacharbeit vertragen könnte, aber darum kümmern wir uns später. Zuerst möchte ich Ihnen noch eine andere Methode vorstellen, die zum selben Ergebnis führt.
Ein anderer Ansatz Die Namen unserer Grafikdateien setzen sich ja aus Vor- und Nachnamen der betreffenden Person plus der Extension .jpg zusammen. Könnten wir nicht einfach die Grafik über diese beiden Felder adressieren, statt ein ganz neues Datenfeld imageurl einzuführen? Wie Sie sicher vermuten, geht das tatsächlich und ist nicht einmal besonders schwierig, Sie dürfen lediglich ein bisschen Bastelarbeit nicht scheuen. Markieren Sie eine Grafik in der Dokumentansicht und öffnen Sie den Eigenschafteninspektor in der Attributansicht (auf das untere der beiden Icons am linken Palettenrand klicken). Wenn Sie mit Active Server Pages arbeiten, sollte die Anzeige in der Palette in etwa so aussehen wie in Abb. 10.11 gezeigt. Verwenden Sie andere Anwendungsserver, sieht der Code natürlich anders aus, aber der Aufbau deckt sich im Prinzip, sodass Sie die entscheidenden Stellen erkennen müssten. Das Tag <%=(Recordset1.Fields.Item("imageurl").Value)%> macht nichts anderes, als sich selbst durch den Wert im Feld imageurl der Datenbank zu ersetzen. Wir bringen wir das System dazu, statt dessen Vor- und Zunamen aus der Datenbank zu verwenden? Indem wir den Code folgendermaßen abändern: <%=(Recordset1.Fields.Item("firstname").Value)%> <%=(Recordset1.Fields.Item("lastname").Value)%>
352
Grafiken mit Datensatzgruppen verknüpfen
Abbildung 10.11: Dieser ASP-Code ruft die Grafik aus der Datenbank ab.
Damit ist das Gröbste schon geschafft. Was uns noch fehlt, ist das bilder vorne und das .jpg hinten. Diese Informationen mit dem ASP-Code zu verknüpfen, ist ebenfalls keine besondere Hürde. Die von UltraDev unterstützten Serverskriptsprachen binden den Code direkt ins HTML ein. Wir können also nach Herzenslust normalen Text um die ASP-Tags herumsetzen. Der Text, den wir im Attribut src des -Tags ablegen, sieht dann so aus: bilder/<%=(Recordset1.Fields.Item("vname").Value)%> <%=(Recordset1.Fields.Item("nname").Value)%>.jpg
Tauschen Sie obigen Code gegen das Tag <%=(Recordset1.Fields.Item("imageurl") .Value)%> aus und sehen Sie sich das Dokument noch einmal in der Live-Data-Vorschau an. Es sollte kein Unterschied zu vorher zu sehen sein. Letztlich ist damit das Dateifeld imageurl in der Datenbank überflüssig geworden. Dieses Feld benötigen Sie nur, wenn Sie
die Grafik in anderen Dokumenten ohne Rückgriff auf Vor- und Nachnamen ausgeben wollen. Ansonsten können Sie die Datenbank in den ersten Zustand zurückversetzen und die Grafik-URLs durch Verkettung der Vor- und Nachnamen erzeugen. In größeren Unternehmen dürfte es schwierig werden, die Namen der Grafikdateien und die Namen der betreffenden Personen konsistent zu halten. Die Grafik könnte dann z.B. als franzmeier.jpg gespeichert sein, während derselbe Herr in der Datenbank als Franz Meier geführt wird. In diesem Fall ist sicherer, einheitlich formatierte Daten wie Personal- oder Versicherungsnummern zu verwenden.
353
Datenbankgestützte Webseiten entwickeln
10.4 Das Layout verschönern Die bisherigen Layouts waren zwar durchaus zweckdienlich, doch sicher nicht übermäßig attraktiv oder das, was man sich unter gelungenem Webdesign vorstellt. In diesem Abschnitt werden wir ausprobieren, wie wir unsere Mitarbeitertabelle aufpeppen können. Der zentrale Punkt bei der Entwicklung eines ansprechenden Designs ist, einmal ganz zu vergessen, dass man mit dynamischen Daten arbeitet. Das heißt, dass wir die Seite zunächst wie ein statisches Dokument anlegen. Hierbei dürfen wir ruhig einmal voll in die Tasten langen und das ganze Instrumentarium einsetzen, das UltraDev zu bieten hat. Die in Abb. 10.12 gezeigte Anordnung der Elemente ist ein weit attraktiverer Ansatz, Material aus einer Datenbank darzustellen. Die Positionierung der Elemente und das Layoutschema wurden unter Verwendung von Tabellen umgesetzt.
Abbildung 10.12: Dynamische Seiten müssen nicht unansehnlich sein.
Ferner habe ich auch mit unterschiedlichen Fonts und Hintergrundfarben gearbeitet. Das Endergebnis hat nicht ganz diesen Computerlook und ist fürs Auge etwas gefälliger. In diesem Fall habe ich auch mit der Regel gebrochen, nur eine Zeile wiederholen zu lassen. Hier wird eine ganze Tabelle und eine horizontale Linie wiederholt, um die Tabellen optisch zu trennen. Es gibt keine fixen Vorschriften, wie Sie Ihre Dokumente gestalten müssen. Entwickeln Sie Ihr Design, wie Sie bei anderen Dokumenten auch tun würden. Ziehen Sie alle Register von UltraDev, und lassen Sie sich nicht von der Vorstellung einschränken, dass Sie nur die Inhalte einer Zeile mehrfach ausgeben dürften.
354
Dynamische Attribute und komplexe Screens
10.5 Dynamische Attribute und komplexe Screens Wir haben nun gesehen, wie wir Grafiken auf eine Seite bringen können, indem wir die Attribute des HTML-Tags mit dynamischen Daten verknüpfen. In diesem Beispiel wurde für jeden Datensatz das src-Attribut ausgetauscht. Gibt es in dieser Hinsicht irgendwelche Einschränkungen? Sie werden sehen, dass Sie nahezu alle Attribute eines Objekts dynamisch setzen können. Somit können Sie Dokumente gestalten, deren Layout dynamisch in Abhängigkeit von den Daten in Ihrer Datenbank gesteuert wird. Bevor wir uns anderen Themen zuwenden, möchte ich Ihnen eine weitere Möglichkeit der Seitengestaltung vorstellen, diesmal unter Verwendung von wiederholten Ebenen. Angenommen, Sie möchten Ihr Seitenlayout nicht auf einem Tabellenraster aufbauen, sondern irgendwie versetzt. Da wir fünf Bilder haben, könnten wir sie ja schlauerweise im Fünfeck anordnen. In einem statischen HTML-Dokument lässt sich dieses Vorhaben mithilfe von Ebenen problemlos verwirklichen. Aber nehmen wir an, die Bilder werden täglich ausgetauscht, und Sie möchten Ihre Website an ein Datenbank-Backend anbinden. Grundsätzlich gibt es zwei Möglichkeiten, um zum Ziel zu kommen. Einmal könnten Sie für jeden der fünf Datensätze eine eigene Datensatzgruppe definieren. Das ist aber ziemlich aufwändig und Sie müssten immer das Dokument selbst bearbeiten, wenn ein neuer Mitarbeiter dazu kommt oder das Layout verändert werden soll. Zweitens könnten Sie eine wiederholte Datengruppe definieren, die unter anderem Felddaten zur Positionierung der Ebenen sowie einige weitere Ebenenattribute enthält. Und das ist genau der Ansatz, den wir hier verfolgen werden. Falls Sie eine weitere Ebene hinzufügen müssen, brauchen Sie nur einen Datensatz in die Datenbank zu schreiben. Der erforderliche HTML-Code wird dann ganz von alleine erzeugt.
Ein erweitertes Datenbank-Backend Damit wir das Ebenenlayout (Position und Hintergrundfarbe) dynamisch erzeugen können, müssen wir unser Datenbankschema etwas modifizieren und Felder für die Höhe, Breite und Position anlegen: create table personal3( vname varchar(50) not null, nname varchar(50) not null, age int, phon varchar (20), beschreibung varchar(200), width int, height int,
355
Datenbankgestützte Webseiten entwickeln
xloc yloc primary key
int, int, (vname,nname)
)
Für unsere neue Datenbank brauchen wir natürlich noch das richtige Zahlenfutter. Die Daten für unser dynamisches Ebenenlayout bekommen wir am einfachsten, wenn wir die Seite zuerst statisch anlegen und uns die Werte für die linke obere Ecke der Ebenen notieren, um sie dann in die Datenbank zu übernehmen. Für mein Fünfeck-Layout habe ich folgende »Eckdaten« ermittelt: insert into personal3 values ('John','Ray',99,'555-555-5555', 'Ein famoses Haus',150,150,300,10); insert into personal3 values ('Robyn','Ness',62,'555-555-1234', 'Ein nettes Frauenzimmer',150,150,0,180); insert into personal3 values ('Anne','Groves',12,'230-555-1234', 'Typischer ColdFusion-Freak',150,150,450,180); insert into personal3 values ('Paul','Jeebers',12,'430-555-4444', 'Ein Ex-Knacki',150,150,70,350); insert into personal3 values ('Jack','Dairyfay',62,'555-555-1723', 'Ein Mathe-Genie',150,150,380,350);
Für unser datenbankgesteuertes Layout müssen wir erst einmal eine Ebene mit den erforderlichen Werten erzeugen. Ich habe die Style-Attribute folgendermaßen gesetzt: position:absolute;width:<%=(Recordset1.Fields.Item("width").Value)%>px; height:<%=(Recordset1.Fields.Item("height").Value)%>px;z-index:1; left:<%=(Recordset1.Fields.Item("xloc").Value)%>px; top:<%=(Recordset1.Fields.Item("yloc").Value)%>px; width:170px;height:158px;left:217px;top:3px; background-color:#FFFF99;layer-background-color:#FFFF99; border:1px none #000000
Dieser Code-Schnipsel greift auf die Felder height, width, xloc und yloc der Datenbank zu und holt sich dort die Werte für die jeweiligen Stilattribute. Leider geht das nicht mit den Standardmitteln von UltraDev. Da hier verschiedene Attribute kombiniert werden, müssen wir sie von Hand setzen. Wenn Sie mit den Ebenen später noch anderes vorhaben, kann es sinnvoll sein, ihnen eindeutige Namen zu geben. Zur Realisierung des Designs ist das zwar nicht zwingend erforderlich, aber wenn Sie selbst oder eine andere Person diese Seite einmal ändern möchten, dann kann das bei einem größeren Stapel von Ebenen ziemlich zeitaufwändig sein. Um die Namen von Ebenen im Moment der Erzeugung dynamisch zu setzen, müssen Sie den entsprechenden Datensatz mit dem id-Attribut der Ebene verknüpfen. Folgende Schritte sind erforderlich, um ein (beliebiges) Attribut dynamisch an einen Datensatz zu binden: 1. Markieren Sie zunächst das Objekt, dessen Attribut Sie dynamisch verändern wollen. In diesem Fall also die Ebene, deren Name dynamisch gesetzt werden soll.
356
Dynamische Attribute und komplexe Screens
2. Schalten Sie den Eigenschafteninspektor in die Attributansicht um. Wählen Sie das Attribut aus, das an die Datenbankinformation angebunden werden soll. Beim Namen der Ebene wäre das id. 3. Klicken Sie auf das kleine Blitzsymbol am rechten Ende der Zeile, zu sehen in Abb. 10.13.
Abbildung 10.13: Über das Blitz- bzw. Ordnersymbol können Sie dynamische Daten mit jedem beliebigen Attribut verknüpfen.
Gewöhnlich verwendet UltraDev ein Blitz-Icon, um anzuzeigen, dass bestimmte Attribute dynamisch gesetzt werden können. Manchmal erfüllt ein Ordnersymbol denselben Zweck. Die Version 4.0 führt nun zusätzlich ein Fadenkreuz ein, mit dem Attribute sofort mit Dateien in der Site-Ansicht verknüpft werden können. 4. Wählen Sie die Datensatzgruppe und den Feldnamen, der die Informationen für das Attribut enthält. Ich habe das Feld nname gewählt. Somit trägt jede Ebenen den Namen der Person, zu der sie Informationen anzeigt. 5. Klicken Sie auf OK. Zum Schluss müssen Sie noch die einzelnen Felder, die angezeigt werden sollen, in die Ebene ziehen. Ich habe auch das Bild in die Ebene gesetzt, wobei ich das src-Attribut wie schon vorher beschrieben über eine Verkettung von vname und nname setze. Nun müssen Sie nur noch die Ebene markieren und ihr das Verhalten BEREICH WIEDERHOLEN zuweisen. Abb. 10.14 zeigt das Endergebnis in der Dokumentansicht. Ist die Live Data-Ansicht abgeschaltet, bietet sich kein besonders aufregender Anblick. Legen wir den Schalter jedoch um, ergibt sich gleich ein anderes Bild. In der Live Data-Ansicht werden sämtliche Ebenen entsprechend den Daten angeordnet und mit dem richtigen Datenmaterial gefüllt. Abb. 10.15 zeigt die Live Data-Vorschau mit dem datenbankgesteuerten Layout.
357
Datenbankgestützte Webseiten entwickeln
Abbildung 10.14: Die endgültige Dokumentansicht für ein vollkommen datenbankgesteuertes Layout
Abbildung 10.15: Die Live DataAnsicht zeigt das ganze Bild.
Als letzte Kontrolle, ob alles zu unserer Zufriedenheit gelaufen ist, können wir die Seite noch in einem Webbrowser öffnen und uns den Quelltext zu Gemüte führen (siehe Listing 10.1). 1 2 3 Untitled Document 4 <meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"> 5 6 7 8 12 John Ray
13 99
358
Dynamische Attribute und komplexe Screens
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
555-555-5555
Ein famoses Haus
Robyn Ness
62
555-555-1234
Ein nettes Frauenzimmer
Anne Groves
12
230-555-1234
Typischer ColdFusion-Freak
Paul Jeebers
12
430-555-4444
Ein Ex-Knacki
Jack Dairyfay
62
555-555-7123
Ein Mathe-Genie
Listing 10.1: Mit dynamischen Ebenenattributen erzeugter HTML-Code
Code-Analyse Jeder Ebene wird wie beabsichtigt der Nachname der Person als id zugewiesen (Zeilen 8, 21, 34, 47 und 60). Die Positionierungsattribute werden ebenfalls dynamisch gesetzt (Zeilen 9, 22, 35, 48 und 61). Dieses Dokument unterscheidet sich im HTML-Code nicht von einem statischen, per Hand erzeugten. Der Einsatz von dynamisch erzeugten Layouts wird nur durch die Zeit begrenzt, die Ihnen für die Erstellung des Probelayouts zu Verfügung steht, sowie durch die Grenzen von HTML selbst. Mit etwas Mehraufwand könnten Sie auch verschiebbare bzw. zeitleistengesteuerte Ebenen dynamisch erzeugen.
10.6 Zusatzfunktionen in dynamisch erzeugten Dokumenten Nun denken Sie vielleicht: »Na ja, nicht schlecht, aber war das schon alles?« Aber keine Bange, wir haben noch längst nicht alle Möglichkeiten ausgeschöpft, dazu brauchen wir schon noch ein paar Lektionen mehr. Mit dem, was wir heute gelernt haben, können wir Seiten erstellen, die Datensätze aus der Datenbank nach dem Inhalt einer ausgewählten Spalte sortiert ausgeben. Die nachfolgend vorgestellte Methode ist vielleicht nicht die effektivste Technik, aber sie funktioniert ohne Schnörkel und tut ihren Dienst. Später werden wir noch fortgeschrittenere Methoden kennen lernen.
360
Zusatzfunktionen in dynamisch erzeugten Dokumenten
Sortieren Datensätze zu sortieren ist nicht schwer. Wenn Sie eine Datensatzgruppe definieren, können Sie im untersten Eingabefeld des Dialogfensters DATENSATZGRUPPE unter SORTIEREN auswählen, nach welcher Spalte die Datensätze sortiert werden sollen. Abb. 10.16 zeigt das Dialogfenster mit der Einstellung SORTIEREN nach nname. Das Setzen von Sortierungsparametern beeinflusst die Reihenfolge, in der Datensätze ausgegeben werden. Mit unseren bisher erworbenen Kenntnissen können wir eine Webseite erstellen, die je nachdem, welcher Spaltenkopf angeklickt wird, die Daten in einer anderen Reihenfolge ausgibt.
Abbildung 10.16: Die Sortierfunktion beeinflusst die Reihenfolge, in der Datensätze ausgegeben werden.
Angenommen, Sie haben eine Tabellen mit vier Spalten, und die Datensätze sollen jeweils nach dem Inhalt der verschiedenen Spalten sortiert werden können. Um diese Sortierfunktion auf HTML-Basis zu realisieren, gibt es einen schnellen, aber nicht ganz sauberen Trick. 1. Erstellen Sie ein HTML-Dokument, das die dynamischen Elemente enthält. Erzeugen Sie drei weitere Kopien diese Dokuments, sodass Sie das Dokument in vierfacher Ausfertigung vorliegen haben. 2. Ändern Sie in jedem Dokument die Sortierfolge der Datensatzgruppe, sodass jedes Dokument nach einer anderen Spalte geordnet wird. 3. Speichern Sie die Dokumente mit den geänderten Sortierparametern neu ab.
361
Datenbankgestützte Webseiten entwickeln
4. Verknüpfen Sie die einzelnen Dokumente mit einem ganz normalen HTML-Link. So kann man mit einfach per Mausklick zwischen den unterschiedlich sortierten Dokumenten springen. Der Haken an der Sache ist natürlich, dass Sie für jedes Feld, das Sie sortieren lassen, eine eigene Datei benötigen. Diese Dokumente müssen natürlich auch jeweils extra aktualisiert werden – je mehr Dateien Sie haben, desto unerquicklicher wird es. Es gibt programmiertechnisch gesehen bessere Methoden, Dokumente sortieren zu lassen. Diese sind Stoff von Tag 14, »Komplexe Komponenten: Benutzeranmeldungen«. Zu Übungszwecken jedoch ist die eben beschriebenen Technik ganz nützlich.
10.7 Zusammenfassung Dynamische HTML-Dokumente in UltraDev zu erstellen erfordert nicht mehr, als eine Datenbankverbindung einzurichten, eine Datensatzgruppe zu definieren und die »Platzhalter« der dynamischen Daten an die entsprechende Stelle im Dokument zu ziehen. Die Vorschau auf das endgültige Dokument ist ebenfalls problemlos möglich – die Live Data-Vorschau ist ein Feature, das nur wenige Entwicklungsumgebungen für Webanwendungen bieten. Die fertige gestaltete Seite wird auf dem entfernten Server abgelegt und gerendert. Somit haben Sie mit UltraDev eine Entwicklungsumgebung zur Verfügung, die Ihnen bei der Arbeit mit dynamischen Daten echtes WYSIWYG bietet. Die Kunst bei der Erstellung dynamischer Seiten liegt darin, Seiten zu erstellen, die nicht nur funktional, sondern auch gestalterisch ansprechend sind. Viele Websites begnügen sich damit, dem Anwender Daten in einer spartanischen Tabellendarstellung zu präsentieren. Wenn Sie mit UltraDev dynamische Seiten entwickeln, stehen Ihnen neben den dynamischen Tools aber auch alle anderen Gestaltungswerkzeuge zur Verfügung. Machen Sie davon Gebrauch. UltraDev erlaubt die Verknüpfung dynamischer Daten mit nahezu allen Attributen eines beliebigen HTML-Objekts. Somit können Sie diese Attribute dynamisch per Datenbank setzen. Sogar das Erscheinungsbild der Seite selbst, also die Platzierung der Elemente auf der Seite usw., kann über Werte aus der Datenbank gesteuert werden.
362
Fragen und Antworten
10.8 Fragen und Antworten F
Muss ich bei der Gestaltung einer Site in der Live Data-Vorschau arbeiten? A
F
Welche Attribute können mit dynamischen Daten verknüpft werden? A
F
Grundsätzlich jedes Attribut eines HTML-Objekts. Sogar wenn Sie auf das Attribut nicht direkt zugreifen können, können Sie den entsprechenden ASP-, JSP- bzw. CFML-Code in den HTML-Code einfügen, aber solche Fälle sind eher selten.
Welche Art von Daten kann ich in einer Datenbank speichern? A
F
Nein, ganz und gar nicht. Die Live Data-Vorschau funktioniert am besten in schnellen Netzwerken mit schnellen Rechnern. Sind Sie auf eine Wählverbindung angewiesen oder haben keinen lokalen Webserver installiert, am dem eine Kopie der Site liegt, dann kann die Live-Data-Vorschau die Arbeit ganz schön ausbremsen. Sie können Ihre Seiten durchaus ohne Live Data-Vorschau entwickeln, Sie müssen sich nur an den Anblick solcher Platzhalter-Tags wie recordset.fieldname gewöhnen.
UltraDev kann nur als Text gespeicherte Daten verarbeiten. Momentan ist es nicht möglich, binäre Daten wie z.B. Grafiken zu verarbeiten. Sie haben jedoch immer noch die Möglichkeit, in der Datenbank Verweise auf die entsprechenden Dateien zu speichern.
Was mache ich, wenn sich der von UltraDev erzeugte Code »aufhängt"? A
Die beste Lösung ist, es gar nicht erst so weit kommen zu lassen. UltraDev gibt eine Warnmeldung aus, wenn Eingriffe des Anwenders in den Code voraussichtlich zu Problemen führen werden. Als Faustregel kann man sagen, dass Sie immer die Palette Serververhalten verwenden sollten, wenn Sie Serververhalten wieder von einer Seite löschen wollen.
10.9 Workshop Der Workshop dient dazu, den gelesenen Stoff mithilfe von gezielten Fragen und Übungen zu vertiefen. Die Antworten finden Sie in Anhang A, »Quiz-Antworten«.
Quiz 1. Welche beiden Voraussetzungen müssen schon erfüllt sein, bevor Sie eine dynamische Webseite erstellen können?
363
Datenbankgestützte Webseiten entwickeln
2. Wie generiert UltraDev seine Live Data-Ansicht?. 3. Wie erstellen Sie ein Serververhalten BEREICH WIEDERHOLEN? 4. Welche Attribute können mit dynamischen Daten verknüpft werden? 5. Wie können Sie Grafiken in einer Datenbank verwenden? 6. Was genau passiert, wenn ein Datensatz sortiert ausgegeben wird? 7. Müssen Sie ein weiteres Datenfeld anlegen, wenn Sie in einer Datenbank mit Grafiken arbeiten?
Übungen 1. Legen Sie ein Datenbank-Backend an und entwickeln Sie das zugehörige Frontend. Erweitern Sie diese Datenbank um Grafiken und binden diese Grafiken in Ihre dynamisch erzeugten Seiten ein. Entwickeln Sie ein Seitenlayout, das nicht auf einem Tabellenraster aufbaut. Nutzen Sie möglichst die ganze Bandbreite der UltraDev-Werkzeuge. 2. Erweitern Sie die Funktionalität Ihrer datenbankgestützten Webseiten, indem Sie die Attribute einzelner HTML-Objekte dynamisch setzen lassen. Wenn Sie mit Grafiken arbeiten, könnten Sie z.B. deren height- und width-Attribute aus der Datenbank auslesen lassen (sofern die Bilder nicht alle gleich groß sind). Wenn Sie bei Grafiken die Höhen- und Breiten-Attribute setzen, kann der Browser schon das Seitenlayout aufbauen, bevor alle Elemente geladen sind.
364
Datensätze mit UltraDev-Applikationen speichern, bearbeiten und aktualisieren
1 1
Datensätze mit UltraDev-Applikationen speichern, bearbeiten und aktualisieren
Gestern haben wir gelernt, wie wir mit den per Mausklick zu konfigurierenden Dialogfenstern von UltraDev schnell und einfach datenbankgestützte Webseiten erstellen können. Nun können Sie statt gewöhnlicher statischer HTML-Dokumente Seiten erzeugen, die in Laufzeit Daten aus jeder beliebigen Datenbank auslesen. Rechnen Sie einmal nach, wie viel Zeit Sie sich dadurch sparen, dass Sie Daten nun nicht mehr ständig neu eintippen müssen. Nur war die einzige Eingabemaske, über die wir auf diese Daten zugreifen konnten, die Datenbank selbst. Darum werden wir heute lernen, wie wir mit UltraDev für diese Datenbank eine Bedienoberfläche erzeugen, die uns das Einfügen, Aktualisieren und Löschen von Datensätzen in unserer Datenbankanwendung erlaubt. Wenn Sie den Stoff der heutigen Lektion durchgearbeitet haben, haben Sie von jedem Rechner mit Internetanschluss aus völlige Kontrolle über Ihre Datenbank. Die Themen des heutigen Tages: 쐽
Erstellen von Formularen. Bis jetzt haben wir mangels Veranlassung noch nicht mit den Formularwerkzeugen von UltraDev gearbeitet. Das wird jetzt anders.
쐽
Anwenderdaten per Formular an eine Datenbank übertragen und speichern. Fortan haben Sie nicht mehr nur über die Datenbankoberfläche Zugriff auf Ihr Datenmaterial.
쐽
Datensätze aus der Datenbank löschen. Datensätze speichern ist nur die eine Seite der Medaille – Informationen müssen im Bedarfsfall auch gelöscht werden können.
쐽
Datensätze modifizieren. Zwar ließen sich per Löschen und Speichern Datensätze auch bearbeiten, was aber ein vergleichsweise umständliches Vorgehen wäre. Da ist es doch viel eleganter, die vorhandenen Datensätze zu aktualisieren und neu zu speichern.
11.1 Datenmanipulation online Um Ihre Webapplikationen richtig planen zu können, sollten Sie sich ein Verständnis dafür erwerben, nach welchem Prinzip der Code funktioniert, den UltraDev schreibt. Mit UltraDev erstellte Anwendungen folgen einem vordefinierten Programm- bzw. Datenfluss. Die gesamte Funktionalität wird nicht in eine einzige eingebettete Datei geschrieben, sondern die Kontrolle über den Programmablauf wird von einer Teilanwendung an die nächste übergeben. Üblicherweise funktionieren Websites, wie sie auch UltraDev erzeugt, nach folgendem Prinzip: 1. Eine Liste von Datenbankeinträgen wird angezeigt. 2. Von jedem Datensatz wird zu einer Aktualisierungs- bzw. Detailseite verlinkt. 3. Wird eine Detailseite aufgerufen, kann der Anwender wählen, ob er den Datensatz aktualisieren oder löschen möchte. 4. Nach dem Löschen oder Aktualisieren eines Datensatzes wird eine Bestätigungsseite angefordert, die über den erfolgreichen Lösch- bzw. Aktualisierungsvorgang informiert. Diese Seite ist oft identisch mit der, von der der Anwender gekommen ist.
366
Online-Formulare erstellen
Vielleicht hört sich das für Sie jetzt so an, als hätten Sie keinen großen Spielraum beim Design Ihrer Websites. Doch diese Ängste sind völlig unbegründet. Die meisten dynamischen Sites funktionieren nach genau diesem Schema, sie wissen es nur gut zu verbergen. Der Trick am Ganzen ist, dass man die Anwendung für den Anwender spannend gestaltet. Wenn Sie noch keine Erfahrung mit eingebetteten Programmiersprachen haben, fragen Sie sich vielleicht, was an dem oben dargestellten Vorgang so ungewöhnlich sein soll. Eingebettete Programmiersprachen sind sehr flexibel, und es wäre durchaus möglich, eine gesamte Webanwendung in eine einzige Datei zu packen. Wenn ich Webanwendungen von Hand programmiere, schreibe ich gewöhnlich alle Ausgabe-, Lösch- und Aktualisierungsfunktionen in eine einzige Datei. In UltraDev ist das schwer möglich, will man nicht den kompletten Code, den das Programm schreibt, von Hand editieren. Damit wir neue Daten in eine Datenbank schreiben können, müssen wir ein Formular erstellen, dessen Felder denen der Datenbank exakt entsprechen. Das ist der erste Einsatz für die Formularwerkzeuge. Wenn Sie jetzt den Eindruck haben, dass wir uns wieder den HTML-Werkzeugen der ersten Tage zuwenden, dann ist das vollkommen zutreffend.
11.2 Online-Formulare erstellen In Tag 10, Datenbankgestützte Webseiten entwickeln, haben wir eine Übersichtsseite für unsere Personaldatenbank entwickelt, in der zu jedem Mitarbeiter Personendaten und ein Bild angezeigt wurden. Abb. 11.1 zeigt noch einmal unser ursprüngliches Datendisplay. Im ersten Entwicklungsschritt werden wir unserer Personaldatenbank eine Eingabemaske spendieren. Ihre Funktion besteht darin, neue Datensätze in die Datenbank zu schreiben. Die Aktualisierung von bereits vorhandenen Datensätzen erfordert zusätzlichen Programmcode, den wir in einem späteren Schritt hinzufügen. Die Personaldatenbank personal2 haben wir mit folgendem SQL-Code erzeugt: create table personal2 ( vname varchar(50), nname varchar(50), age int, phon varchar(20), beschreibung varchar(200), imageurl varchar(80) not null, primary key (imageurl) )
367
Datensätze mit UltraDev-Applikationen speichern, bearbeiten und aktualisieren
Abbildung 11.1: Die Personaldatenbank war unsere erste datenbankgestützte Anwendung.
Das Formular, das wir nun erstellen, muss exakt dieselben Felder enthalten. Ich werde die gestern erstellte Datenbank weiter verwenden und würde Ihnen raten, dasselbe zu tun. Möchten Sie die heutige Lektion als neues Projekt anlegen, müssen Sie Ihr DatenbankBackend neu aufsetzen und die erforderlichen Datenbankverbindungen einrichten, bevor Sie weitermachen.
Ein einfaches HTML-Formular erstellen Die Gestaltung von Formularen macht mir überhaupt keinen Spaß, und vielleicht ist das der wahre Grund, warum dieses Thema erst so spät zur Sprache kommt. Formulare sind eines der am wenigsten Cross-Browser- bzw. Cross-Plattform-kompatiblen HTML-Elemente überhaupt. Auf Windows-Systemen kann man z.B. über das -Tag die Größe von -Feldern und anderen Formularelementen beeinflussen. Auf dem Mac hingegen werden Formularelemente in einer festen Größe dargestellt. Da beim Rendern von Formularen zudem je nach Plattform verschiedene Systemschriften zum Einsatz kommen, ist es schier unmöglich, vorauszusagen, wie ein Formular auf der jeweiligen Plattform aussehen wird. Überprüfen Sie nach Möglichkeit das Aussehen von Formularen auf den verschiedenen Systemen, bevor Sie Ihr Werk für vollendet erklären.
368
Online-Formulare erstellen
Vielleicht kann es der eine oder andere von Ihnen schon nicht mehr hören, doch halte ich diesen Punkt für so wichtig, dass ich an dieser Stelle noch einmal darauf eingehen möchte. Hauptkriterium für eine gute Benutzerführung ist eine durchgehend einheitliche Gestaltung von Bedienelementen. Buttons und Eingabefelder sollten stets von gleicher Größe und Form sein. Wenn natürlich der HTML-Code die Darstellung dieser Elemente verändert, haben wir ein Problem. Das Grundkonzept von HTML ist, dass Informationen auf jedem Bildschirm unabhängig vom Betriebssystem identisch dargestellt werden. Diese Unabhängigkeit geht zum Teil wieder verloren, wenn das Betriebsystem das Aussehen von Bedienelementen in der HTML-Oberfläche verändert. Legen Sie nun in der Site, die die Übersichtsseite der Personaldaten enthält, ein neues Dokument an und nennen Sie es dateneingabe. Platzieren Sie eine Tabelle mit 6 Zeilen und 2 Spalten im Dokument. Am leichtesten lassen sich Formulare mit Tabellen aufbauen. Ohne Tabellen ist ein exaktes Layout von Tabellenelementen schier unmöglich, da deren Größe stark variiert. Ich lege alle Formularseiten so an, dass ich eine Tabelle mit 2 Spalten und so viele Zeilen wie Datenfeldern definiere. Schreiben Sie nun in die linke Spalte der Tabelle den Namen der einzelnen Datenfelder. Nun kommt der spannende Teil – die dynamischen Platzhalter ins Bild ziehen. Doch bevor wir uns an diese Aufgabe machen können, müssen wir noch das Objekt einfügen, zu dem diese Datenfelder gehören, also ein Formular. Klicken Sie in der Unterpalette auf das Icon FORMULAR EINFÜGEN. Formulare werden durch eine gestrichelte rote Linie symbolisiert. Nun gibt es aber mit dem Formular, das wir gerade eingefügt haben, ein Problem. Die Tabelle, die später die Eingabefelder aufnehmen soll, steht nicht innerhalb des Formularrahmens. Dazu müssen wir den HTML-Code etwas anpassen. Mit Formularen direkt in der Dokumentansicht zu arbeiten ist kein Problem, sie sind schnell eingesetzt. Das Formular auswählen und bearbeiten ist eine andere Sache. Wechseln Sie in die Codeansicht und setzen Sie das öffnende Tag hinter das schließende