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)