Dynamische Includes in ASP
Geschrieben von: Christian Koller Vielen ASP Programmieren ist die #Include Direktive vertraut, mit der man weiteren ASP-Code aus einer Datei in eine ASP-Seite einbinden kann. Eine #Include Direktive muß außerhalb der <% und %> Begrenzungszeichen stehen. Ebenso ist der Einsatz in einem <SCRIPT RUNAT=SERVER LANGUAGE=VBScript></SCRIPT> Block nicht erlaubt. Wo setzt man nun Includes ein? Zum Beispiel wenn man eine immer wiederkehrende Funktion in vielen ASP-Seiten verwenden will, so definiert man diese VBScript Funktion in einer Include Datei, und fügt dann mittels der #Include Direktive diese Datei in die gewünschte ASP Seite ein. Nehmen wir einmal an, die Datei "Add.asp" definiert eine VBScript Funktion, die 2 Werte addiert: <% Function Add(x,y) Add = x + y End Function %> Wenn die Datei "Add.asp" im Unterverzeichnis "Includes" am Webservers liegt, so kann man sie mit folgenden Befehl in eine beliebige ASP-Seite des Webservers einbinden: <!-- #include virtual="/Includes/Add.asp" --> Wenn man den absoluten Pfad zur Datei angeben möchte, so kann man dies in folgender Form tun: <!-- #include file="D:\Web\AspHeute\www\Includes\Add.asp" --> Die folgende ASP-Seite greift auf die Funktionalität der Add-Funktion zurück: <% Option Explicit %> <!-- #include virtual="/Includes/Add.asp" --> <% Dim a, b, c a = 17 b = 4 c = Add(a,b) Response.Write a & " + " & b & " = " & c %> Man kann nicht nur Funktionen, sondern natürlich auch komplette Teile einer ASP-Seite, wie zum Beispiel ein Menü oder einen Copyright-Vermerk in ein Include geben. So schreibt die folgende Include Datei "copyright.asp" einen Copyright Vermerk zum User: <div align="center"> <font size="-1"> Copyright © <%= Year(Date) %> by AspHeute.com </font> </div> Diese Datei kann man dann in alle ASP-Dateien inkludieren. Der Nachteil der #Include Direktive ist, daß man dan Namen der inkludierten Datei fix in den Sourcecode der ASP-Seite (oder des ASP-Skripts) schreiben muß. Man kann also nicht zur Laufzeit des Skripts wählen, welche Datei man includiert und ausgeführt haben möchte. Um dies zu umgehen habe ich eine Sammlung von Funktionen erstellt, mit deren Hilfe es möglich ist, zur Laufzeit des Skripts den Inhalt einer bestimmten Datei auszulesen und in VBScript mit der original VBScript Engine auszuführen. Da die Funktionen auf der VBScript Execute Methode beruhen, die ab VBScript Version 5.0 zur Verfügung steht, muß der ausführende Webserver die dementsprechende VBScript.dll (\WinNT\System32\VBScript.dll) der Version 5 (oder höher) installiert haben. Anmerkung: Wenn Sie Internet Explorer Version 5.0 (oder höher) installiert haben, so ist automatisch auch eine VBScript.dll der Version 5.0 installiert Das folgende ASP-Script zeigt Ihnen, welche VBscript Version auf dem Webserver installiert ist: <% Function GetScriptEngine() Dim strSE strSE = ScriptEngine & " " strSE = strSE & ScriptEngineMajorVersion & "." strSE = strSE & ScriptEngineMinorVersion & "." strSE = strSE & ScriptEngineBuildVersion GetScriptEngine = strSE End Function Response.Write GetScriptEngine() %> Um dieses Script auf unserem Webserver auszuführen klicken Sie auf VBScript Version testen. Die neueste Version der VBscript.dll können Sie bei Microsoft auf folgenden Seiten downloaden (ca. 750 KB): US-Version:
http://www.microsoft.com/msdownload/vbscript/scripting.asp
Dateien dynamisch inkludierenDie folgenden Schritte zeigen auf, wie man eine Datei zur Laufzeit (also dynamisch) in eine ASP-Seite inkludiert und ihren Inhalt (VBScript Source Code) ausführt. VBScript Code zur Laufzeit ausführenDie in der VBScript Version 5.0 enthaltene Execute Methode erlaubt das Ausführen von in Variablen gespeicherten VBscript Code zur Laufzeit. Sehen Sie dazu folgendes Beispiel: <% Option Explicit %> <% Dim a, b, strFormel ' Formel des Pythagoras strFormel = "c = sqr(a*a + b*b)" a = 3 b = 4 ' Errechnen von c nach der Formel: Execute strFormel Response.Write "Formel des Pythagoras: a²+b²=c² :<br>" Response.Write "a = " & a & "<br>" Response.Write "b = " & b & "<br>" Response.Write "c = " & c & "<br>" %> Wie leicht nachzuvollziehen ist, wird a der Wert 3 und b der Wert 4 zugewiesen. Die Variable strFormel enthält einen (in VBScript) gültigen Ausdruck, der aus den Werten von a und b den Wert von c errechnet. Die VbScript Methode Execute strFormel (entspricht Execute "c = sqr(a*a + b*b)") führt den in strFormel gespeicherten VBScript Code aus. Somit hat danach die Variable c den Wert 5. Das folgende Skript führt den in der Variablen strAusdruck gespeicherten VBScript-Ausdruck zur Laufzeit aus. Zusätzlich führt das Script einen Check aus, um sicherzustellen, daß tatsächlich eine VBScript Version 5.0 (oder höher) benutzt wird. <% Dim blnOK, strMajorVersion, strAusdruck strFunction = "Function Add(x,y)" & VbCrLf strFunction = strFunction & " Add = x + y " & VbCrLf strFunction = strFunction & "End Function " & VbCrLf strAusdruck = strFunction strMajorVersion = ScriptEngineMajorVersion If strMajorVersion < 5 Then Response.Write "Ihre Script Engine ist " & GetScriptEngine & _ ".<br>" & VbCrLf Response.Write "Bitte Updaten Sie die Scripting-Engine " & _ "auf Version 5.0 oder hoeher!<br>" & VbCrLf Response.Write "Dowload der neuesten Scripting-Eninge unter <br>" Response.write "<a href =""http://www.microsoft.com/" & _ "msdownload/vbscript/scripting.asp"">" Response.Write "http://www.microsoft.com/msdownload/" & _ "vbscript/scripting.asp</a>.<br>" blnOK = False Else On Error Resume Next ' Ausdruck dynamisch ausfuehren: Execute strAusdruck On Error Goto 0 If Err.Number <> 0 Then blnOK = False Else blnOK = True End If End If If blnOK = True Then Response.Write "Funktion Add(x,y) ist nun definiert:<br>" Response.Write "Add(1,1) = " & Add(1,1) Else Response.Write "Ein Fehler ist aufgetreten ..." End If %> Wenn der Ausdruck in der Variable strAusdruck einen Laufzeitfehler verursacht, dann hat die Variable blnOK den Wert False, ansonsten den Wert True. Achtung: Wenn Sie die Methode Execute(strAusdruck) in einer Function oder Sub, anstatt im Hauptprogramm aufrufen, so können Sie eine im Argument strAusdruck definierte Function nicht benutzen! Daher einen Ausdruck, der eine Function oder Sub definiert, mittels der Execute Methode nur im Hauptprogramm ausführen, anderenfalls ist die Function oder Sub nicht benutzbar! Code aus einer Datei zur Laufzeit ausführenUm nun einen VBScript Code, der in einer Datei enthalten ist, zur Laufzeit auszuführen, lädt man einfach den Inhalt der Datei, und führt ihn dann mit der Execute Methode aus. Wie man eine Textdatei ausliest, wurde bereits im Artikel Lesen von Textdateien gezeigt. Mit der ExecuteExpression Funktion und der nachfolgend vorgestellten ReadFile Funktion, die den Inhalt einer Datei ausliest und zurück gibt, lässt sich die Funktionalität einer dynamiscn inkludierten Datei verwirklichen: Auslesen des Inhaltes einer Textdatei in der Funktion ReadFile: Function ReadFile(strDateiname) ' ### Listing aus dem Artikel "Lesen von Textdateien" ### ' ### (http://www.aspheute.com) ### ' strDateiname in der Form "C:\Testdateien\MeineDatei.txt" Const fsForReading = 1 Dim strInhalt Dim objFs ' FileSystemObject Objekt Dim objTextStream ' Textstream Objekt Set objFs = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set objTextStream = objFs.OpenTextFile(strDateiname, fsForReading) If Err.Number <> 0 Then ' Fehler aufgetreten strInhalt = "" Else strInhalt = objTextStream.ReadAll End If objTextStream.Close On Error Goto 0 Set objTextStream = Nothing Set objFs = Nothing ReadFile = strInhalt End Function Die Funktion ReadFile gibt den Inhalt der Textdatei zurück. Um nun den Inhalt einer Datei dynamisch auszuführen, benutzt man die Methode Execute im Hauptprogramm zusammen mit der Funktion ReadFile. Das Äquivalent zu <!--#Include file="C:\www\text.asp"--> sieht also wie folgt aus: Dim blnOK Dim strDateiInhalt ' Localer Dateiname in der Form "C:\www\text.asp" Dim strLocalerDateiName strLocalerDateiName = "C:\www\text.asp" strDateiInhalt = ReadFile(strLocalerDateiName) If ScriptEngineMajorVersion >= 5 Then Execute strDateiInhalt End If Die auszuführende Datei darf dabei, im Gegensatz zu Dateien die mittels #Include Direktive eingefügt werden, nur den reinen VBScript Code enthalten, jedoch kein HTML oder irgendwelche Begrenzungszeichen (wie <% %>) und natürlich auch keine #Include Direktiven enthalten. Um nun zum Beispiel die in der Datei "Add.asp" enthaltene Funktion Add in der ASP Seite verwenden zu können, ist es möglich, die Datei "Add.asp" dynamisch zu inkludieren. Der Inhalt der Datei "Add.asp": Function Add(x,y) Add = x + y End Function Ein Script, das die Methode Execute benutzt und die Function Add(x,y) aus der Datei Add.asp dynamisch inkludiert, könnte wie folgt aussehen. Beachten Sie, daß die Datei "Add.asp" in einem virtuellen Pfad angegeben
ist, es ergibt sich somit das Äquivalent zu folgender #Include Direktive <% Dim x,y, strAusdruck, strDateiInhalt, strHTML Response.Write "Ihre ASP-Datei wird gerade unter " & GetScriptEngine() Response.Write " ausgefuehrt!<br><br>" x = 7 y = 0 strAusdruck = "y = x + 2" Response.Write "x hat einen Wert von: " & x & "<br>" Response.Write "y hat einen Wert von: " & y & "<br><br>" Response.Write "Ausfuehren des Ausdrucks """ & strAusdruck Response.Write """:<br>" Execute strAusdruck Response.Write "x hat einen Wert von: " & x & "<br>" Response.Write "y hat einen Wert von: " & y & "<br><br>" Response.Write "Inhalt der Datei <i>/Includes/add.asp</i>:<br>" strDateiInhalt = ReadVirtualFile("Include.asp") strHTML = Replace(strDateiInhalt,vbCrLf,"<br>" & VbCrLf) strHTML = Server.HTMLEncode(strHTML) Response.Write strHTML Response.Write "<br><br>" & VbCrLf Response.Write "Ausfuehren der Datei <i>/Includes/add.asp</i>:<br>" Execute ReadVirtualFile("/Includes/Add.asp") Response.Write "x hat einen Wert von: " & x & "<br>" Response.Write "y hat einen Wert von: " & y & "<br><br>" Response.Write "Add(x,y) = Add(" & x & "," & y & ") = " Response.Write Add(x,y) ' ### Definition der Funktionen: Function ReadFile(strDateiname) ' ### Listing aus dem Artikel "Lesen von Textdateien" ### ' strDateiname in der Form "C:\Testdateien\MeineDatei.txt" Const fsForReading = 1 Dim strInhalt, strInhaltHTML Dim objFs ' FileSystemObject Objekt Dim objTextStream ' Textstream Objekt Set objFs = CreateObject("Scripting.FileSystemObject") On Error Resume Next Set objTextStream = objFs.OpenTextFile(strDateiname, fsForReading) If Err.Number <> 0 Then ' Fehler aufgetreten strInhalt = "" Else strInhalt = objTextStream.ReadAll End If objTextStream.Close On Error Goto 0 Set objTextStream = Nothing Set objFs = Nothing ReadFile = strInhalt End Function Function ReadVirtualFile(strVirtualDateiname) ' strVirtualDateiname in der Form "/includes/add.asp" ' oder als "datei.asp" fuer relative Angaben Dim strDateiname strDateiname = Server.MapPath(strVirtualDateiname) ReadVirtualFile = ReadFile(strDateiname) End Function Function GetScriptEngine() Dim strSE strSE = ScriptEngine & " " strSE = strSE & ScriptEngineMajorVersion & "." strSE = strSE & ScriptEngineMinorVersion & "." strSE = strSE & ScriptEngineBuildVersion GetScriptEngine = strSE End Function %> Schlußbemerkung:Die Methode Execute kann beliebige VBScript Ausdrücke zur Laufzeit ausführen. So ist es auch möglich, VBScript Code aus Dateien zu lesen und zur Laufzeit auszuführen. Damit werden quasi dynamische Includes möglich, da man erst zur Laufzeit bestimmen muß, welche Datei geladen und ausgeführt wird. Achtung: Dynamisch inkludierte Dateien dürfen nur reinen VBScript Code enthalten, aber keine Begrenzungszeichen oder HTML Code. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Berechnen von beliebigen mathematischen Formeln Links zu anderen Sites
VBScript - Deutsche Version Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |