Geschrieben von: Christoph Wille
Kategorie: Komponenten
This printed page brought to you by AlphaSierraPapa
Wie aus dem Titel ersichtlich ist, kann man aus Komponenten generell (und im heutigen Artikel Visual Basic im speziellen) auf mehrere Arten und Weisen auf die ASP Objekte wie Request oder Response zugreifen. Heute bespreche ich den Einsatz der Page-Level Event Methoden, ein weiterer Artikel wird sich dann mit der moderneren Methode des ObjectContexts auseinandersetzen.
Die angesprochenen Page-Level Event Methoden sind OnStartPage und OnEndPage. Wie aus den Namen bereits hervorgeht, wird die erstere aufgerufen wenn die Bearbeitung der ASP Seite beginnt, und die letztere wenn alle Scriptblöcke zu laufen aufgehört haben. An OnStartPage wird ein Objekt namens ScriptingContext übergeben, aus dem man die ASP Objekte "extrahieren" - und ab dann genauso wie in ASP mit VBScript verwenden kann. OnEndPage dient hauptsächlich zum CleanUp und kann optional implementiert werden.
Wieder einmal ist "Hello World!" das Opfer unserer ersten Gehversuche am Weg zur ersten eigenen Komponente. Diese wird eine simple Methode namens SayHello haben, um den Zugriff auf die ASP Objekte zu verdeutlichen (ohne durch zuviel an Funktionalität den Blick auf das wichtige zu verstellen).
Zuallererst müssen wir uns ein Projekt in Visual Basic erstellen:
Durch Auswahl des Projekttyps ActiveX DLL wird ein Projekt plus einer leeren Klasse für uns erzeugt, was bereits für unsere Zwecke mehr als ausreicht. Benennen Sie das Projekt auf AspHeute, und die Klasse auf DemoComponent um.
Da wir auf ASP Objekte zugreifen, müssen wir unserem VB Projekt sagen, wie diese definiert sind - dies geschieht indem man einen Verweis auf die Typenbibliothek von ASP legt (Menü Project/References):
Nun sind wir sozusagen "all set" und können zum Code schreiben anfangen. Das nachfolgende Listing zeigt alle benötigten Zeilen unserer Hello World Komponente (im Klassenmodul von DemoComponent einfügen):
Dim objResponse As ASPTypeLibrary.Response Public Sub OnStartPage(sc As ScriptingContext) Set objResponse = sc.Response End Sub Public Sub SayHello() objResponse.Write "Hello World" End Sub
Da die Komponente einfach gehalten ist, sticht der Infrastrukturcode in OnStartPage deutlich heraus. Diese Funktion wird bei der Instanzierung des Objekts aufgerufen, und referenziert aus dem ScriptingContext das Response Objekt (erspart später Zugriffe auf diese Eigenschaft und ist somit schneller). SayHello bedient sich dann der Variable objResponse, um auf das ASP Response Objekt durchzugreifen - alle anderen Objekte würden auch funktionieren (aber eines mußte ich mir herauspicken).
Im Editor sieht das dann wie folgt aus:
Bevor wir das Projekt kompilieren, gönnen wir uns noch einen kleinen "Luxus", und deklarieren die Komponente korrekt für Unattended Execution (Menü Project/Properties):
Diese Einstellung ist für Serverkomponenten extrem wichtig, da somit unsichtbare, nicht-anklickbare Fehlerdialogboxen vollständig unterbunden werden. Ohne dieser Einstellung kann man schon mal den IIS "einfrieren" (diesen Zustand kann man unter IIS5 mit iisreset.exe /restart beheben, IIS4 hat leider kein vergleichbares Utility).
Die Komponente ist fertig - was fehlt ist nur der Aufruf von File/Make AspHeute.dll und die nachfolgende Registrierung mit regsvr32.exe aspheute.dll - und schon ist die Komponente einsatzbereit.
Der einfachste Code zur Verwendung unserer neuen Komponente braucht nur zwei Zeilen lang zu sein - die Instanzierung und der Aufruf der SayHello Methode:
Set xObj = CreateObject("AspHeute.DemoComponent") xObj.SayHello
Wenn man diese Seite aufruft, bekommt man allerdings eine Fehlermeldung die irritierend sein könnte:
AspHeute error '800a005b' Object variable or With block variable not set /aspheute/oldcomponent/sonicht.asp, line 3
Dieser Fehler kommt aus der SayHello Funktion - da VBScript's CreateObject die OnStartPage Methode nicht aufruft, ist die Variable objResponse nicht gesetzt. Dieser Fehler kann einem auch bei kommerziellen Komponenten passieren, die die OnStartPage Methode verwenden!
Um diese Fehlermeldung zu umgehen, muß man Objekte, die eine OnStartPage Methode haben, mittels Server.CreateObject instanzieren - weil nur Server.CreateObject die Page-Level Event Methoden aufruft. Da Server.CreateObject sowieso schneller ist als CreateObject, gibt es eigentlich eh' keinen Grund, dies nicht zu machen (korrekt.asp):
Set xObj = Server.CreateObject("AspHeute.DemoComponent") xObj.SayHello
Die Response an den Client ist "Hello World", was beweist, daß unsere kleine Komponente brav ihren Dienst verrichtet.
Wir haben heute eine kleine Komponente erstellt, die sich der Page-Level Event Methoden bedient. Aus Gründen der Performance soll man diese Variante aber nicht mehr exzessiv verwenden - und statt dessen den ObjectContext. Aber das ist ein anderes Thema (eines weiteren Artikels).
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20010320.zip
In VB Komponenten auf ASP Objekte zugreifen (Variante 2)
http:/www.aspheute.com/artikel/20010322.htm
Klassenauflistungen mit dem Dictionary-Objekt
http:/www.aspheute.com/artikel/20020408.htm
©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.