Geschrieben von: Christian Koller
Kategorie: ASP Tricks
This printed page brought to you by AlphaSierraPapa
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
Deutsche Version:
http://www.microsoft.com/msdownload/vbscript/scripting.asp?id=11
Die 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.
Die 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!
Um 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
<!--#include virtual="/Includes/Add.asp"-->
<%
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
%>
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.
This printed page brought to you by AlphaSierraPapa
Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000706.zip
Berechnen von beliebigen mathematischen Formeln
http:/www.aspheute.com/artikel/20000727.htm
Cachen von Dynamischen Includes
http:/www.aspheute.com/artikel/20000710.htm
Ein einfacher Eventkalender für Projektteams
http:/www.aspheute.com/artikel/20020319.htm
Schreiben einer Textdatei auf den Server
http:/www.aspheute.com/artikel/20000725.htm
Strukturierter Aufbau in der ASP-Programmierung
http:/www.aspheute.com/artikel/20011112.htm
VBScript - Deutsche Version
http://www.microsoft.com/msdownload/vbscript/scripting.asp?id=11
VBScript - US Version
http://www.microsoft.com/msdownload/vbscript/scripting.asp
©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.