Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs

Dynamische Includes in ASP

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 &copy; <%= 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

Dateien dynamisch inkludieren

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.

VBScript Code zur Laufzeit ausführen

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&sup2;+b&sup2;=c&sup2; :<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ühren

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
%>

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.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20000706.zip

Verwandte Artikel

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

Links zu anderen Sites

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.