Die klassischen Active Server Pages
Transcription
Die klassischen Active Server Pages
Kapitel 7 Die klassischen Active Server Pages In diesem Kapitel: Erzeugung dynamischer HTML-Seiten Architektur (asp.dll) ASP-Objekte Seitenübergänge Parameterübergabe und Sitzungsverwaltung Umgebungsvariablen Einbindung von externen Dateien 172 174 175 180 182 189 190 171 Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 172 Kapitel 7: Die klassischen Active Server Pages Dieses Kapitel liefert eine kurze Einführung in das klassische ASP für diejenigen Leser, die bisher nicht oder nur wenig mit ASP gearbeitet haben. Kenntnisse über das klassische ASP sind keine notwendige, aber eine hilfreiche Voraussetzung zum Erlernen von ASP.NET. Erfahrene ASP-Entwickler können dieses Kapitel überblättern. Die Ausführungen in diesem Kapitel basieren auf ASP 3.0, das im Internet Information Server (IIS) 5.0 in Windows 2000 und IIS 5.1 in Windows XP enthalten ist. Frühere ASP-Versionen unterstützen einige der hier genannten Möglichkeiten nicht. WICHTIG Soweit nicht anders erwähnt, sind die in diesem Kapitel vorgestellten Programmiertechniken bzw. eingebauten Objekte auch unter ASP.NET verfügbar. Allerdings ergeben sich einige syntaktische Änderungen, da nicht mehr die Sprache VBScript, sondern das neue Visual Basic .NET bzw. Visual Basic 2005 (VB.NET/VB2005) zum Einsatz kommt. Erzeugung dynamischer HTML-Seiten Eine ASP-Seite ist eine Datei mit der Dateierweiterung .asp. Eine ASP-Seite besteht aus HTML-Code und – optional – Script-Code. Es macht allerdings in der Regel keinen Sinn, eine rein statische HTML-Seite mit der Dateierweiterung .asp zu belegen, weil eine .asp-Seite - selbst wenn gar kein Programmcode enthalten ist - langsamer verarbeitet wird als eine .html-Seite. Sinnvoll ist dies nur, wenn zu einem späteren Zeitpunkt die Hinzufügung von Programmcode geplant ist. Dann kann später die Umbenennung der Seite vermieden werden. Um Programmcode einzubetten, gibt es drei Möglichkeiten: <Script RUNAT="Server" language="VBScript"> ... </Script> <% ... %> <%=...%> Während die ersten beiden Varianten äquivalent sind (sie werden Render-Blöcke genannt), dient die dritte Variante nur der Ausgabe des Wertes eines Ausdrucks (Display-Block). Schleifen und andere Sprachkonstrukte, die keinen einzelnen Wert zurückliefern, sind hier nicht erlaubt. Innerhalb eines Render-Blocks erzeugt man eine Ausgabe mit der Methode Write(), die von dem eingebauten Objekt Response zur Verfügung gestellt wird. Das erste Beispiel erzeugt dreimal die gleiche Ausgabe, jeweils unter Einsatz eines der drei verschiedenen Ausgabe-Blöcke. Dabei zeigt sich der Vorteil eines Display-Blocks: Wenn ein nur kleiner Teil der Ausgabe dynamisch ist, ist er wesentlich übersichtlicher als die Zusammensetzung einer Zeichenkette für Response.Write(). <%@ LANGUAGE="VBSCRIPT" %> <html> <body> <h2>Dies ist eine einfache ASP-Seite! </h2> <Script RUNAT="Server" language="VBScript"> Response.Write "Es ist jetzt " & time & " Uhr!<br>" </Script> <% Response.Write "Es ist jetzt " & time & " Uhr!<br>" %> Es ist jetzt <%=time%> Uhr! <br> Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 173 Erzeugung dynamischer HTML-Seiten </body> </html> Listing 7.1 Erste_ASP_Seite.asp Abbildung 7.1 Ausgabe der obigen ASP-Seite In diesem Beispiel wurde als Programmiersprache Visual Basic Script (VBScript) verwendet. Dies ist auch die Standardsprache für ASP-Seiten. Möglich sind alle Programmiersprachen, die der Active ScriptingArchitektur (vgl. [SCH01a]) entsprechen. Dies sind neben den von Microsoft gelieferten Sprachen VBScript und JScript auch zahlreiche Sprachen von anderen Anbietern, z.B. PerlScript, PScript, Object REXX, PythonScript, HaskellScript, ActiveScriptRuby und LUAScript. Die Standardsprache kann im InternetDienstemanager verändert werden. Die Sprache jeder einzelnen Seite kann zu Seitenbeginn mit der @Language-Direktive festgelegt werden. Die Verarbeitung einer ASP-Seite ist linear: Die Befehle werden in der Reihenfolge ihres Vorkommens abgearbeitet. Die Linearität kann durch Unterroutinen unterbrochen werden (siehe folgendes Beispiel). Möglich sind sowohl Unterroutinen ohne Rückgabewert (Sub) als auch mit Rückgabewert (Function). <%@ LANGUAGE="VBSCRIPT" %> <html><body> <h2>Guten Tag, herzlich Willkommen auf unserem Webserver! </h2> <% Zeitausgabe %> <%= HoleZeitInfo %> <Script RUNAT="Server" language="VBScript"> Sub Zeitausgabe Response.Write "Es ist jetzt " & time & " Uhr!<br>" End Sub Function HoleZeitInfo HoleZeitInfo = "Es ist jetzt " & time & " Uhr!<br>" End Function </Script> </body></html> Listing 7.2 ASP-Seite mit Unterroutinen Es sind auch Unterroutinen erlaubt, die (nur) HTML-Code enthalten. Diese als Render-Funktionen bezeichneten Unterroutinen können als wiederverwendbare Textbausteine benutzt werden. <%Sub Footer%> <hr><h2>Diese Website wurde von Holger Schwichtenberg erstellt</h2><hr> <%End Sub%> Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 174 Kapitel 7: Die klassischen Active Server Pages Mit ASP können nicht nur HTML-Seiten dynamisch erzeugt werden, sondern auch beliebige andere Formate. Damit der Browser diese korrekt verarbeitet, muss allerdings dann der HTTP-Inhaltstyp über Response.ContentType = "inhaltstyp" gesetzt werden. Auch Nicht-Text-Formate wie »image/GIF« oder »image/JPEG« können erzeugt werden. Dann muss als Ausgabefunktion aber Response.BinaryWrite(BYTEARRAY) statt Response.Write("STRING") verwendet werden. Architektur (asp.dll) ASP ist eine Erweiterung für den Internet Information Server (IIS) für NT4.0 bzw. die Internet Information Services (IIS) in Windows 2000/XP/.NET. ASP ist aber auch für den Personal Web Server (PWS) in Windows 95/98/ME verfügbar. Drittanbieter haben ASP auch für andere Webserver und andere Betriebssysteme implementiert. ASP ist implementiert als eine Internet Server Application Programming Interface (ISAPI)-Erweiterung mit Namen asp.dll. Die asp.dll verarbeitet alle .asp- und .asa-Dateien und leitet die Ausgabe an den IIS weiter. Webclient (z.B. Internet Explorer) HTTPAnfrage HTTPAntwort IIS (InetInfo.exe) asp.dll Zugriff auf statische Dateien im Dateisystem Optionaler Zugriff auf Datenquellen Statische Datei (.htm, .gif, .jpg, etc.) ASP-Datei Datenquelle (z.B. Datenbank) Abbildung 7.2 ASP-Architektur Die obige Grafik gilt für die IIS-Versionen 3.0, 4.0, 5.0 und 5.1. Ab dem IIS 6.0 läuft die asp.dll nicht mehr im Prozess des IIS, sondern in einem getrennten Prozess mit dem Namen des IIS-Arbeitsprozesses (W3WP.exe). Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 175 ASP-Objekte ASP-Objekte Die Programmierung mit Active Server Pages (ASP) ist objektbasiert: Alle wichtigen Funktionen werden durch Attribute, Methoden und Ereignisse in Objekten bereitgestellt. Dabei gibt es zwei Arten von Objekten: eingebaute Objekte, die nicht instanziiert werden können, weil sie automatisch vorhanden sind, und externe Objekte, die vor der Verwendung instanziiert werden müssen. Eingebaute Objekte Es gibt sechs eingebaute Objekte, die der Kommunikation mit dem Webserver dienen, auf dem die ASPSeite läuft (siehe Tabelle). Diese Objekte können direkt, also ohne vorherige Instanziierung, verwendet werden. Objekt Bedeutung Request Informationen über die HTTP-Anfrage des Browsers und den Webserver. Response Daten für die HTTP-Antwort des Webservers. Server Funktionen, die unabhängig von einer konkreten Anfrage sind. Session Zustandsverwaltung durch die Speicherung von Werten auf Sitzungsebene. Application Speicherung sitzungsübergreifender Werte. ObjectContext Dient dem Zugriff auf das Kontextobjekt, wenn die Seite im Microsoft Transaction Server (MTS) oder als COM+Anwendung läuft. Die folgenden Grafiken zeigen für die ersten fünf die Objektmodelle. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 176 Kapitel 7: Die klassischen Active Server Pages Request Cookies IRequestDictionary IRequestDictionary Cookie String IRequestDictionary Form String IRequestDictionary QueryString String Item String IRequestDictionary ServerVariables String IRequestDictionary ClientCertificate String Abbildung 7.3 Objektmodell für das Request-Objekt Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 177 ASP-Objekte Response IRequestDictinary Cookies IRequestDictinary Cookie String Abbildung 7.4 Objektmodell für das Response-Objekt Server GetLastError() CreateObject() ASPError beliebiges COM-Objekt mit IDispatch-Schnittstelle Abbildung 7.5 Objektmodell für das Server-Objekt Application IVariantDictionary Contents Item Variant (Wert oder Objektzeiger) IVariantDictionary StaticObjects Item COM-Objekt mit IDispatch-Schnittstelle Abbildung 7.6 Objektmodell für das Application-Objekt Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 178 Kapitel 7: Die klassischen Active Server Pages Session IVariantDictionary Contents Item Variant (Wert oder Objektzeiger) IVariantDictionary StaticObjects Item COM-Objekt mit IDispatch-Schnittstelle Abbildung 7.7 Objektmodell für das Session-Objekt Die folgende Tabelle listet die wichtigsten Attribute und Methoden dieser Objekte auf. Attribut/Methode Erläuterung Request.QueryString (Collection) Sofern an den URL eine URL-Parameterliste angehängt wurde, enthält die QueryStringMenge die übergebenen Attribute mit ihren Werten. Request.Form (Collection) Sofern die aufgerufene Seite ein Formular enthielt und die Navigation zu der aktuellen Seite mit einer Submit-Schaltfläche erfolgte, enthält die Form-Objektmenge die Feldnamen und Feldwerte des aufrufenden Formulars. Request.Cookies (Collection) Die Cookies-Objektmenge enthält die vom Client übergebenen Cookies für diese Site. Request.ClientCertificate (Collection) Sofern der Browser Zertifikate übermittelt hat, sind diese über ClientCertificate einsehbar. Request.ServerVariables (Collection) Die ServerVariables-Objektmenge bietet Informationen über den Webserver und die aktuelle Anfrage. Response.ContentType = "Inhaltstyp" Legt den HTTP-Inhaltstyp für die Ausgabe fest. Standard ist "text/HTML". Alternativen sind zum Beispiel "text/XML" oder "image/GIF". Response.Write("AUSGABE") Response.BinaryWrite(BYTE-ARRAY) Ausgabe an den Client Response.Redirect("URL") Umlenkung des Clients auf eine andere Seite. Alle nachfolgenden Befehle und Tags auf der aktuellen Seite werden ignoriert. Response.End() Ende der Verarbeitung einer Seite, alle nachfolgenden Befehle und HTML-Tags werden ignoriert. Response.Expires = 10 Verfallszeit des Seiteninhalts in Minuten (-1 = sofort) als Anweisung für das Seitencaching. Response.CacheControl = "public|private" Mit der Einstellung Private verhindert man die Speicherung der Seite in einem ProxyServer. Server.MapPath("PFAD") Umsetzung eines relativen logischen Pfads in einen für den lokalen Webserver absoluten physischen Pfad. Server.UrlEncode("WERT") Codierung von Sonderzeichen in Werten in URL-Parameterslisten. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 179 ASP-Objekte Attribut/Methode Erläuterung Server.GetLastError() Liefern eines Zeigers auf ein ASPError-Objekt mit dem letzten aufgetretenen Fehler. Server.ScriptTimeout = 10 Festlegung der maximalen Laufzeit der Seitenverarbeitung in Sekunden Server.Execute ("seitenname.asp") Ausführung einer anderen Seite innerhalb des Kontextes der aktuellen Seite Server.Transfer ("seitenname.asp") Komplette Übergabe der Kontrolle an eine andere Seite. Alle nachfolgenden Befehle und Tags auf der aktuellen Seite werden ignoriert. Die Folgeseite kann über Page.PreviousPage auf die aufrufende Seite zugreifen. Server.HTMLEncode("STRING") Diese Funktion muss verwendet werden, wenn Inhalte ausgegeben werden sollen, die der Browser als HTML-Code missverstehen könnte. Server.CreateObject ("Komponente.Klassenname") Instanziierung eines COM-Objekts Session.Contents (Collection) Liste der Sitzungsvariablen Session.SessionID Session.SessionID liefert die Sitzungs-ID der aktuellen Sitzung im Rahmen des ASPSitzungsmanagements. Session.Abandon Beendet die aktuelle Sitzung. Application.Contents (Collection) Liste der sitzungsübergreifenden globalen Variablen Externe Objekte Da ASP eine Implementierung eines Active Scripting Hosts ist, kann ASP jede gemäß dem Component Object Model (COM) implementierte Klasse verwenden, die COM-Automation unterstützt (also die Standardschnittstelle IDispatch anbietet). Diese Klassen können über die Methode Server.CreateObject() instanziiert werden. Die wohl am häufigsten verwendeten externen COM-Klassen sind die Klassen der Komponente ActiveX Data Object (ADO) für den Zugriff auf Datenquellen aller Art, hauptsächlich relationale Datenbanken. Die folgende Tabelle nennt weitere COM-Komponenten, die oft in ASP zum Einsatz kommen. Name Kürzel Kurzbeschreibung ActiveX Data Objects ADO Zugriff auf Datenbanken und andere Datenquellen Active Directory Service Interface ADSI Zugriff auf Verzeichnisdienste (NT 4.0, Windows 2000, Active Directory, Exchange 5.5, Exchange 2000, Novell Directory Service, Novell Netware, Netscape Directory Server u.v.m.) Active User Objects AUO Verwaltung von Benutzern im Site Server Collaboration Data Objects Version 1.21 CDO 1.21 Zugriff auf MAPI-Mailstores, insbesondere Exchange Server 5.5/2000 und Persönliche Ordner/Persönliche Adressbücher Collaboration Data Objects Version 3.0 CDO 3.0 Zugriff auf den Exchange Server 2000 Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 180 Kapitel 7: Die klassischen Active Server Pages Name Kürzel Kurzbeschreibung CDO for NT Server CDONTS Versand von SMTP-Nachrichten unter NT Server 4.0; Empfang von SMTP-Nachrichten in Drop-Directories CDO for Windows 2000 (heißt auch: CDO Version 2.0) CDOSYS Versand von SMTP-Nachrichten unter Windows 2000; Empfang von SMTP-Nachrichten in Drop-Directories Distributed Management Object DMO Zugriff auf die Konfiguration des Microsoft SQL Server Decision Support Objects DSO Zugriff auf den Microsoft OLAP Server File System Objects FSO Zugriff auf das Dateisystem Document Object Model für HTML MSHTML Zugriff auf HTML-Dokumente Document Object Model für XML MSXML Zugriff auf XML-Dokumente Regular Expressions Component RegExp Aufwertung regulärer Ausdrücke Windows Management Instrumentation WMI Universelle Systemmanagement-Komponente Microsoft Office-Objekte MSO Nutzung von Funktionen aus Microsoft Office (Word, Excel, PowerPoint, Access, Outlook) Tabelle 7.1 Microsoft-Komponenten für die Entwicklung von ASP-Seiten Neben diesen oben aufgelisteten Komponenten aus dem Hause Microsoft gibt es zahlreiche Drittanbieter, die Komponenten für die Verwendung in ASP herstellen. Weitere Informationen zu diesen COMKomponenten finden Sie in [SCH01b]. Seitenübergänge Grundsätzlich wäre es möglich, eine Webanwendung in einer einzelnen ASP-Datei zu implementieren: Durch entsprechende Fallunterscheidungen könnte der ASP-Code gemäß der übergebenen Parameter immer andere Ausgaben erzeugen. Dies wäre jedoch kein gutes Design, denn diese ASP-Datei würde schnell sehr unübersichtlich werden. Das soll nicht heißen, dass es im Einzelfall nicht sinnvoll sein könnte, dass eine Datei sich selbst wieder aufruft. Wenn die folgende Ausgabe sich von der vorherigen nicht viel unterscheidet, ist ein Selbstaufruf gegenüber einer Duplizierung großer Mengen von HTML-Code die bessere Alternative (Man denke an ein Formular, dessen Eingaben geprüft werden: Wenn die Fehlermeldungen direkt hinter die entsprechende Fehleingabe auf dem Bildschirm ausgegeben werden sollen, sollte man das lieber mit dem Selbstaufruf lösen). Die Regel ist jedoch, dass aus einer Seite eine andere Seite aufgerufen wird. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 181 Seitenübergänge eine Code-Datei erzeugt verschiedene HTML-Dokumente pro HTML-Dokument eine Code-Datei Code Code Code Code Webserver Seitenübergang HTML HTML HTML Seitenübergang HTML HTML Webbrowser (C) [email protected] 2002 Abbildung 7.8 Seitenübergänge Grundsätzlich kann man einen Seitenübergang danach einteilen, ob er vom Client oder vom Server initiiert wird. Vom Client initiierte Seitenübergänge Um einen Übergang von einer zur anderen Seite zu initiieren, gibt es in ASP sowohl client- als auch serverseitige Möglichkeiten. Clientseitig stehen die Navigationsmöglichkeiten von HTML zur Verfügung: Hyperlinks (Zielangabe mit href="ziel.asp" im <a>-Tag) die automatische Seitenweiterleitung mit einem Meta-Tag (<META HTTP-EQUIV="Refresh" CONTENT="1; URL=ziel.asp">). das Absenden von Formularen mit einer Submit-Schaltfläche (Zielangabe mit action="ziel.asp" im <form>-Tag) und Vom Server initiierte Seitenübergänge Auch auf der Serverseite kann innerhalb des Programmcodes ein Seitenübergang initiiert werden. Dafür gibt es zwei Optionen: Durch den Befehl Response.Redirect("URL") wird der HTTP-Statuscode 302 an den Client gesendet. Dieser Statuscode veranlasst den Browser, sofort eine neue Anfrage nach der übermittelten URL an den Server zu stellen. Rein serverseitig kann ein Seitenübergang mit Server.Transfer("PFAD") ausgeführt werden. In diesem Fall wird die Programmkontrolle an eine andere Seite übergeben, ohne dass der Browser davon überhaupt etwas mitbekommen wird. Bei dem in der folgenden Abbildung dargestellten Server.Transfer() von Seite1.asp zu Seite2.asp erhält der Browser den Inhalt von beiden Seiten als Antwort auf die Anfrage nach Seite1.asp. Die URL in der Adress- Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 182 Kapitel 7: Die klassischen Active Server Pages zeile des Browsers wechselt also nicht. Bei einem Response.Redirect() ist dies – genauso wie bei den vom Client initiierten Seitenübergängen – anders: Der Browser zeigt immer die »richtige« URL an. Sowohl bei einem Server.Transfer() als auch bei einem Response.Redirect() wird die Ausführung der aktuellen Seiten sofort beendet. Nachfolgender Programmcode wird übergangen. Unter ASP.NET kann bei Response.Redirect() durch einen zweiten Zusatzparameter erreicht werden, dass die aktuelle Seite noch zu Ende abgearbeitet wird. vom Server initierter Seitenübergang vom Client initierter Seitenübergang GET | POST Seite1.asp Seite2.asp ASP-Verarbeitung GET Seite1.asp ASPVerarbeitung ASP-Verarbeitung ASP-Verarbeitung Webserver Seite2.asp Server.Transfer ("Seite2.aspx") Response.Redirect "Seite2.asp" GET GET HTTP200 HTTP200 HTTP302 Seite2.asp HTTP200 Meta-Tag Webbrowser 00 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 00000000000000000000000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 Link Browser stellt leeres Dokument nicht dar, sondern fragt direkt nach der übermittelten Seite erneut an. (C) [email protected] 2002 Abbildung 7.9 Seitenübergänge in ASP Die Folgeseite kann über Page.PreviousPage auf die aufrufende Seite zugreifen. Parameterübergabe und Sitzungsverwaltung HTTP ist ein zustandsloses Protokoll; das Protokoll merkt sich also nicht, was für Daten in einer Seite vorhanden waren, um diese beim nächsten Aufruf der gleichen Seite oder erneuten Aufruf der gleichen Seite wieder bereitzustellen. Man muss sich eine Webseite wie eine Unterroutine mit lokalen Variablen vorstellen: Man kann der Unterroutine Informationen übergeben und auch einen Rückgabewert erhalten. Aber die während der Abarbeitung der Routine angefallenen Daten werden sofort nach Verlassen der Routine verworfen. Globale Variablen gibt es auf dem Server nicht. Es ist die Aufgabe des Aufrufers (also des Browsers), die relevanten Daten von einem zum nächsten Aufruf zwischenzuspeichern und weiterzureichen. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 183 Parameterübergabe und Sitzungsverwaltung Parameterübergabe bei HTTP/HTML HTML und HTTP stellen im Zusammenspiel dazu nur rudimentäre Möglichkeiten bereit: In ein Formular eingegebene Daten werden über eine an die URL angehängte Zeichenkette (URLParameterliste oder Querystring) oder durch Speicherung im HTTP-Inhalt an die aufgerufene Seite übergeben, nachdem ein Klick auf die Submit-Schaltfläche erfolgte. Ein Hyperlink oder ein Meta-Tag können Daten nur in Form einer URL-Parameterliste übergeben. Datenübergabe per Assemblies Datenübergabe per HTTP-Inhalt HTTP-Verb GET POST Verwendung im Hyperlink <a href="ziel.asp?x=y"> (Standard) Nur möglich unter Einsatz von clientseitigem Script Verwendung im Formular <form action="ziel.asp" method="GET"...> (Standard) <form action="ziel.asp" method="POST"...> und <form action="ziel.asp?x=y" method="POST"...> Verwendung im Meta-Tag <META HTTP-EQUIV="Refresh" CONTENT="1; URL=ziel.asp?x=y">). Nicht möglich Beim Formular können beide Formen der Parameterübergabe gemischt werden, indem im action-Attribut eine URL mit URL-Parameterliste angegeben wird. GET /Kapitel01/Formular/eintragen.asp?Vorname=Holger&Name=Schwichtenberg&Firma+Name=ITObjects+GmbH&submit=Eintragen HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://www.IT-Visions.de/Kapitel01/Formular/form.asp Accept-Language: de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) Host: localhost:8889 Connection: Keep-Alive Listing 7.3 Datenübergabe in der URL-Parameterliste bei HTTP-GET Beim Einsatz von HTTP-POST werden die Daten durch eine Leerzeile getrennt vom HTTP-Header übergeben. POST /Kapitel01/Formular/eintragen.asp HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Referer: http://www.IT-Visions.de/Kapitel01/Formular/form.asp Accept-Language: de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) Host: localhost:8889 Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 184 Kapitel 7: Die klassischen Active Server Pages Content-Length: 78 Connection: Keep-Alive Cache-Control: no-cache Vorname=Holger&Name=Schwichtenberg&Firma+Name=IT-Objects+GmbH&submit=Eintragen Listing 7.4 Datenübergabe in der URL-Parameterliste bei HTTP-GET Damit lassen HTTP und HTML den Entwickler aber auch schon im Stich: Damit die übergebenen Daten auf dem Server verarbeitet werden, ist dort Programmlogik notwendig. Wenn Werte von einer zur nächsten Seite weitergereicht werden sollen (z.B. der Inhalt eines Warenkorbs oder der Benutzername, der sich autorisiert hat), dann ist es Aufgabe der serverseitigen Programmlogik, die Werte, die der Server in einer Anfrage empfängt in der zugehörigen Antwort wieder an den Client zurückzusenden. Diese Rückübermittlung kann durch Einbauen der Daten in die HTML-Seite oder alternativ durch so genannte Cookies erfolgen. Werteübermittlung im Seiteninhalt Das Einbauen in den Seiteninhalt kann auf zwei Weisen erfolgen: Die Daten werden in Formularfelder als Vorgabewert eingetragen. Eine Sonderform ist das versteckte Formularfeld (Hidden Field), das nicht nur verhindert, dass der Benutzer die Daten sieht, sondern auch, dass er sie ändert. Ein Hyperlink kann dynamisch erzeugt werden, so dass die übergebenen Daten Teil des URLParameterliste werden. Diese Technik nennt man URL-Rewriting. Beide Verfahren sind nicht nur aufwendig, sondern auch fehleranfällig, weil jede Unterbrechung in der Weitergabe der Daten zum Verlust der Information führt. Cookies Als Alternative wurden daher Cookies eingeführt: Cookies sind Zeichenketten, die der Browser in einem speziellen Verzeichnis (in Windows im Benutzerprofil im Unterverzeichnis /Cookies) ablegt und bei jedem Aufruf der gleichen Webanwendung immer wieder automatisch in die HTTP-Anfrage übermittelt. Diese Technik hat die serverseitige Programmierung erheblich vereinfacht. Ein Cookie wird zwischen Client und Server im HTTP-Header ausgetauscht. Cookies werden serverbezogen abgespeichert, d.h. ein Webserver erhält nur die Cookies, die er selbst abgelegt hat. In einem Cookie kann eine Pfadangabe übertragen werden, um die Gültigkeit des Cookies auf bestimmte Bereiche eines Webservers einzuschränken. Der Benutzer hat durch die Browsereinstellungen die Möglichkeit, Annahme bzw. Rückübermittlung von Cookies zu unterbinden. HTTP/1.1 200 OK Server: Microsoft-IIS/5.1 Date: Sun, 09 Jun 2002 13:43:00 GMT Content-Length: 297 Content-Type: text/html Set-Cookie: Abrufe%5FSeite=239; expires=Wed, 19-Jun-2002 13:52:20 GMT; path=/Kapitel01 Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 185 Parameterübergabe und Sitzungsverwaltung Set-Cookie: User=HS; expires=Wed, 19-Jun-2002 13:52:20 GMT; path=/Kapitel01 Cache-control: private Listing 7.5 Beispiel für den Header einer HTTP-Antwort mit zwei Cookies GET /Kapitel01/Counter/Session.asp HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* Accept-Language: de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) Host: www.IT-Visions.de Connection: Keep-Alive Cookie: Abrufe%5FSeite=146; USER=HS Listing 7.6 Beispiel für den Header einer HTTP-Anfrage mit zwei Cookies Zustandsverwaltung durch Sitzungen ASP ist nicht zuletzt deshalb so erfolgreich, weil es eine Sitzungsverwaltung bietet, die von Cookies abstrahiert: Statt den Programmierer damit zu »belasten«, jeden einzelnen Wert in einem Cookie zu speichern, erzeugt ASP eine eindeutige Nummer (genannte Sitzungs-ID), speichert diese in einem Cookie und merkt sich serverseitig, welche Daten im Rahmen dieser »Sitzung« gespeichert wurden. Dies nennt man das ASPSitzungsmanagement (engl. Session Management). Eine Variable, die im Rahmen des Sitzungsmanagements abgelegt wird, nennt man Sitzungs-Variable. Dem Entwickler steht eine Collection mit Namen Session zur Verfügung, in der er beliebige Attribut-Wert-Paare speichern kann. Sitzungsvariablen sind aus der Sicht des Entwicklers serverseitige, globale Variablen, also genau das, was Eingangs dieses Kapitels schmerzlich vermisst wurde. Die technische Realisierung bleibt dem Entwickler verborgen. ASP verwaltet intern eine Tabelle mit der Zuordnung von Sitzungs-ID, Sitzungsvariablen und deren Werten. Die Werte können auch Arrays oder Objektzeiger sein. Sitzungs-ID Sitzungsvariable Wert 447208138 User "HS" 447208138 Anmeldezeit #12:50:10# 447208138 Warenkorb Array { "ISBN 3-8273-1905-6", "ISBN 3-8273-2010-0", "ISBN 3-86063-667-7" } 447208139 User "CB" 447208139 Anmeldezeit #13:10:11# Tabelle 7.2 Speicherung der Sitzungsvariablen auf dem Server Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 186 Kapitel 7: Die klassischen Active Server Pages An den Client wird nur die Sitzungs-ID übermittelt. Set-Cookie: ASPSESSIONIDGQGQGOUY=447208138; path=/ Da dem Sitzungs-Cookie keine Gültigkeitsdauer mitgegeben wird, wird er beim Schließen des Browser sofort verworfen. Der Client übermittelt diesen Sitzungs-Cookie bei der nächsten Anfrage zurück an den Server. Cookie: ASPSESSIONIDGQGQGOUY=447208138 Abbildung 7.10 Anzeige des Sitzungs-Cookies im Internet Explorer ASP baut dann anhand der im Sitzungs-Cookie übermittelten Sitzungs-ID vor dem Aufruf des Programmcodes die Session-Objektmenge anhand der in der internen Tabelle gespeicherten Werte wieder auf. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 187 Parameterübergabe und Sitzungsverwaltung Browser Webserver HTTP-Header URL CookieVerzeichnis Browser speichert Cookie zeigt HTMLSeite an ASPSESSIONID HTTP-Header ASPSESSIONID HTTP-Content HTML asp.dll erzeugt neue Sitzungs-ID ordnet Werte der Session-ID zu übermittelt HTML & Sitzungs-ID Seite.asp setzt Wert in der Session-Collection Sitzungs-ID Name Wert ... HTTP-Header liest Cookie stellt Anfrage an den Server URL ASPSESSIONID asp.dll Seite.asp liest Session-ID aus Request-Header liesst Werte aus der Session-Tabelle baut Session-Collection auf liesst Wert aus der Session-Collection ... ... Abbildung 7.11 Ablauf des ASP-Session-Managements Eine Sitzung beginnt mit dem ersten Aufruf einer Seite aus der Webanwendung und endet nach einer definierbare Zeit (in der Regel 20 Minuten) nach Aufruf der letzten Seite oder durch einen ausdrücklichen Befehl sofort. Eine Sitzung ist benutzerbezogen, da die Sitzungs-ID ja benutzerbezogen gespeichert wird. Überblick über die Befehle Die folgenden Befehle stehen in ASP für die Parameterübergabe und Sitzungsverwaltung zur Verfügung: VAR = Request.Form("NAME") liefert den Inhalt des Formularfeldes NAME aus der aufrufenden Seite (übermittelt via HTTP-POST im HTTP-Header). VAR = Request.QueryString("NAME") liefert den Inhalt des Attributs NAME aus der URL-Parameterliste, mit dem die aktuellen Seite aufgerufen wurde. VAR = Request("NAME") sucht sowohl in der Form- als auch der QueryString-Objektmenge nach einem Attribut, das NAME heißt. Wenn es in beiden vorkommt, hat die URL-Parameterliste Vorrang. Session("NAME") = WERT speichert einen Wert im Rahmen des ASP-Sitzungsmanagement. VAR = Session("NAME") ermittelt einen Wert, der zuvor in dieser Sitzung gespeicherten Wertes. Session("NAME") ist die Kurzform von Session.Contents("NAME"). Session.SessionID liefert die Sitzungs-ID der aktuellen Sitzung. Die aktuelle Sitzung kann durch Session.Abandon per Programmcode vorzeitig beendet werden. Application("NAME") = WERT speichert einen Wert sitzungsübergreifend. Alle Sitzungen können auf diesen Wert zugreifen. VAR = Application("NAME") ermittelt einen sitzungsübergreifenden Wert. Application("NAME") ist die Kurzform von Application.Contents("NAME"). Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 188 Kapitel 7: Die klassischen Active Server Pages Trotz des ASP-Sitzungsmanagements besteht der Bedarf, individuelle Cookies speichern zu können. Cookies können beim Client permanent gespeichert werden und ermöglichen so, im Gegensatz zu SitzungsVariablen, Werte über längere Zeit zu behalten. Response.Cookies("NAME") = WERT speichert einen Wert in einem Cookie. VAR = Request.Cookies("NAME") liest einen Wert aus einem Cookie. Über das Attribut Expires kann das Verfallsdatum gesetzt werden, in dem folgenden Beispiel gilt der Cookie 90 Minuten. Ohne diese Angabe gilt der Cookie nur bis zum Schließen des Browsers. Response.Cookies.Item("NAME").Expires = now+90 Im Rahmen eines Cookies können mehrere einzelne Werte gespeichert werden: Response.Cookies.Item("NAME")("UNTERNAME") = WERT Beispiel Die folgende Bildschirmabbildung zeigt drei verschiedene Zähler. Abbildung 7.12 Beispiel für Zustandsverwaltung mit ASP Die Implementierung dieser Webseite ist selbsterklärend. Zu beachten ist nur, dass im Fall des Zugriffs auf den Cookie der Schreibzugriff über das Response-Objekt und der Lesezugriff über das Request-Objekt erfolgt, während bei Session- und Application-Variablen vor und nach dem Gleichheitszeichen der gleiche Ausdruck steht. <html> <body MS_POSITIONING="GridLayout" bgcolor="Azure"> <% if Request("Action") = "Sitzungsende" then Session.Abandon end if ' --- Zähler erhöhen Session("Abrufe_Seite") = Session("Abrufe_Seite") + 1 Application("Abrufe_Seite") = Application("Abrufe_Seite")+ 1 Response.Cookies("Abrufe_Seite") = Request.Cookies("Abrufe_Seite") + 1 Response.Cookies("Abrufe_Seite").Expires = Now +10 ' --- Ausgaben out("Sitzungs-ID: " & Session.SessionID) out("Abrufe dieser Seite durch diesen Benutzer in dieser Sitzung: " & Session("Abrufe_Seite")) out("Abrufe dieser Seite durch diesen Benutzer insgesamt: " & Request.Cookies("Abrufe_Seite")+1) out("Abrufe dieser Seite durch alle Benutzer: " & Application("Abrufe_Seite")) Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) Umgebungsvariablen 189 Sub out(ByVal s) Response.Write(s & "<br>") End Sub %> <hr> <a href="session.asp?action=Sitzungsende">Sitzung beenden</a><br> </body> </html> Listing 7.7 /Kapitel01/ASP/Counter.asp Umgebungsvariablen Jeder Webserver stellt eine Reihe von Informationen in sogenannten Umgebungsvariablen bereit. Diese können unter ASP durch die Objektmenge Request.ServerVariables Zugriff auf die Umgebungsvariablen. Das folgende Listing zeigt beispielhaft alle Umgebungsvariablen. Die Variablen »ALL_HTTP« fasst alle mit »HTTP*« beginnenden Umgebungsvariablen in einer Zeichenkette zusammen. ALL_HTTP= HTTP_ACCEPT:*/* HTTP_ACCEPT_LANGUAGE:de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 HTTP_CONNECTION:Keep-Alive HTTP_HOST:localhost HTTP_USER_AGENT:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) HTTP_COOKIE:Abrufe%5FSeite=239 HTTP_ACCEPT_ENCODING:gzip, deflate ALL_RAW= Accept: */* Accept-Language: de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 Connection: Keep-Alive Host: localhost User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) Cookie: Abrufe%5FSeite=239 Accept-Encoding: gzip, deflate APPL_MD_PATH= /LM/W3SVC/1/Root/Kapitel01 APPL_PHYSICAL_PATH= H:\Code\Kapitel01\ AUTH_PASSWORD= AUTH_TYPE= AUTH_USER= CERT_COOKIE= CERT_FLAGS= CERT_ISSUER= CERT_KEYSIZE= CERT_SECRETKEYSIZE= CERT_SERIALNUMBER= CERT_SERVER_ISSUER= CERT_SERVER_SUBJECT= CERT_SUBJECT= CONTENT_LENGTH= 0 CONTENT_TYPE= GATEWAY_INTERFACE= CGI/1.1 HTTPS= off HTTPS_KEYSIZE= HTTPS_SECRETKEYSIZE= HTTPS_SERVER_ISSUER= HTTPS_SERVER_SUBJECT= INSTANCE_ID= 1 INSTANCE_META_PATH= /LM/W3SVC/1 LOCAL_ADDR= 127.0.0.1 LOGON_USER= Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5) 190 Kapitel 7: Die klassischen Active Server Pages PATH_INFO= /Kapitel01/ws_aspLIB.asp PATH_TRANSLATED= H:\Code\Kapitel01\ws_aspLIB.asp QUERY_STRING= REMOTE_ADDR= 127.0.0.1 REMOTE_HOST= 127.0.0.1 REMOTE_USER= REQUEST_METHOD= GET SCRIPT_NAME= /Kapitel01/ws_aspLIB.asp SERVER_NAME= localhost SERVER_PORT= 80 SERVER_PORT_SECURE= 0 SERVER_PROTOCOL= HTTP/1.1 SERVER_SOFTWARE= Microsoft-IIS/5.1 URL= /Kapitel01/ws_aspLIB.asp HTTP_ACCEPT= */* HTTP_ACCEPT_LANGUAGE= de,en-us;q=0.8,fr-be;q=0.6,ar-bh;q=0.4,zh-hk;q=0.2 HTTP_CONNECTION= Keep-Alive HTTP_HOST= localhost HTTP_USER_AGENT= Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Q312461; .NET CLR 1.0.3705) HTTP_COOKIE= Abrufe%5FSeite=239 HTTP_ACCEPT_ENCODING= gzip, deflate Einbindung von externen Dateien HTML selbst bietet (mit Ausnahme von Frames) keine Möglichkeit, eine Seite aus verschiedenen Bestandteilen zusammenzusetzen. Dies ist aber oft sinnvoll, um Redundanzen in verschiedenen Dateien zu vermeiden. ASP bietet zwei Techniken, um eine Datei in eine andere Datei einzubinden: Server.Execute("PFAD") ruft die angegebene Datei auf und kehrt - im Gegensatz zu Server.Transfer() nach Abarbeitung der Datei zur aufrufende Datei zurück, um die weiteren Befehle in der aufrufende Datei abzuarbeiten. <!--#include file|virtual="pfad/dateiname.erweiterung"--> ist kein ASP-Befehl, sondern basiert noch auf einem älteren Verfahren für dynamische Webseiten, den Server Side Includes (SSI). Die IncludeAnweisung verhält sich wie Server.Execute(). Der Pfad ist entweder mit dem Attribut file oder mit dem Attribut virtual anzugeben. Das Attribut file bezieht sich auf die Dateisystemhierarchie. Die Angabe nach file ist relativ zum aktuellen Standort oder ein absoluter Pfad, der mit einem Laufwerkbuchstaben oder Rechnernamen beginnt. Mit virtual kann man im Webserver konfigurierte virtuelle Verzeichnisse ansprechen. Dazu gehören aber auch die dem Wurzelverzeichnis direkt untergeordneten Verzeichnisse, die nicht als virtuelle Verzeichnisse konfiguriert wurden. Sowohl bei der #Include-Anweisung als auch bei Server.Execute() kann die aufrufende Datei HTML-Code und/oder Programmcode enthalten. Die Dateierweiterung der aufgerufenen Datei ist beliebig, denn diese wird dem Browser ja nicht bekannt. Holger Schwichtenberg: Microsoft ASP.NET 2.0 mit Visual Basic 2005 - Das Entwicklerbuch. Microsoft Press 2006 (ISBN 978-3-86063-544-5)