La différence entre Server.Execute et Execute dans ASP pour implémenter des scripts d'inclusion dynamiques, les amis dans le besoin peuvent s'y référer. J'ai récemment prévu d'essayer d'implémenter l'architecture MVC dans ASP. Quelqu'un a dû me demander : ASP a été éliminé, pourquoi est-ce que je l'étudie encore ? Je le sais aussi. Depuis que Microsoft a abandonné ASP 3.0 et est passé à ASP.NET, ASP est loin derrière PHP et JSP, qui ont démarré presque en même temps. Les avantages de l'open source par rapport au fermé sont les mêmes que ceux de PHP et d'ASP. On dit que l'ASP est éliminé. Personne ne peut empêcher son élimination, mais il convient de noter que l'ASP est encore assez répandu sur le marché chinois, en particulier pour certaines applications de certaines petites et moyennes entreprises. un problème, et il est facile à déployer sur certains anciens systèmes Windows, pas besoin d'installer .NET. Le framework peut essentiellement être exécuté directement, il est donc toujours nécessaire de préparer un framework. Cependant, mon framework est un framework expérimental, juste pour vérifier si ASP peut implémenter une architecture MVC similaire à PHP.
Bon, cela dit, allons droit au but. La raison de ce problème est que je dois inclure dynamiquement les fichiers ASP. Comme nous le savons tous, il n'existe qu'une seule méthode d'inclusion dans ASP, à savoir SSI (Server Side Include), qui est essentiellement divisée en deux types :
Copiez le code comme suit :
<!-- #include file=sample.asp -->
<!-- #include virtual=sample.asp -->
Fondamentalement, le premier est le plus couramment utilisé parmi ces deux. #include virtual contient le chemin virtuel, qui est généralement utilisé dans les répertoires virtuels. Mais les deux sont statiques. Si nous voulons l’inclure dynamiquement, cela ne peut pas être écrit comme suit :
Copiez le code comme suit :
<!-- #include file=<%=MyVar%> -->
<!-- #include virtual=<%=MyVar%> -->
L'écriture ci-dessus est fausse. On peut comprendre que la directive #include est exécutée avant qu'ASP ne démarre le moteur de script et exécute le script entre les balises ASP<% %>. En d'autres termes, #include n'est pas le travail d'ASP, mais. le programme serveur. Tel que le travail de traduction IIS, il ne fera donc pas attention à votre code ASP.
Comment implémenter des méthodes de script d'inclusion dynamique similaires à PHP include, include_once, require et require_once ? Examinons une méthode de l'objet ASP Server : Server.Execute En recherchant toutes les fonctionnalités ASP, nous pouvons constater que cette fonction est la plus similaire à l'inclusion dynamique.
Sample.inc.asp
Copiez le code comme suit :
<%
Réponse.Écrivez Bonjour tout le monde !
%>
test.asp
Copiez le code comme suit :
<%
Serveur.Execute Sample.inc.asp
Response.Write Je suis test.asp !
%>
Le résultat réel devrait être Hello World ! Je suis test.asp !, indiquant que Server.Execute peut bien fonctionner avec l'inclusion dynamique, mais que se passe-t-il si je souhaite inclure une classe ou une fonction ? Faites ensuite l'expérience suivante :
Exemple.class.asp
Copiez le code comme suit :
<%
Exemple de classe
Fin du cours
%>
test.asp
Copiez le code comme suit :
<%
Serveur.Execute Sample.class.asp
Response.Write TypeName (Eval (nouvel échantillon))
%>
Exécutez-le directement, et l'erreur d'erreur d'exécution Microsoft VBScript '800a01fa' n'est pas définie : 'Sample', le résultat est très décevant, pourquoi cela se produit-il ? J'ai vérifié MSDN et trouvé cette description : Si un fichier est inclus dans la page appelante en utilisant #include, le .asp exécuté ne l'utilisera pas. Par exemple, vous pouvez avoir un sous-programme dans un fichier inclus dans votre page appelante. mais le .asp exécuté ne reconnaîtra pas le nom du sous-programme. Cela semble être quelque peu différent du problème que j'ai rencontré. Le code Server.Execute est-il isolé ? Réalisez ensuite l’expérience suivante :
Sample.inc.asp
Copiez le code comme suit :
<%
Atténuer MaVar
MyVar = Je suis Sample !
%>
test.asp
Copiez le code comme suit :
<%
Atténuer MaVar
MyVar = je suis test !
Serveur.Execute Sample.inc.asp
Réponse.Écrire MyVar
%>
Le résultat est Je suis test !, ce qui est très décevant ! Il semble que Server.Execute isole les variables, fonctions, classes et autres codes, ce qui signifie que l'extrémité appelante et l'extrémité appelée n'interfèrent pas au niveau du code. Il semble que Server.Execute ne puisse être utilisé que pour inclure . modèles asp.
Ce qui suit est la fonctionnalité de script VBScript Execute. Ce qui est transmis à Execute doit être un code de script VBScript valide, et Execute est sensible au contexte. Cela semble être très proche de l'inclusion dynamique dont nous avons besoin.
test.asp
Copiez le code comme suit :
<%
Exemple de classe d'exécution : fin de classe
Response.Write TypeName (Eval (nouvel échantillon))
%>
Le code ci-dessus génère avec succès le nom de type Sample dont nous avons besoin. Cela prouve qu'Execute peut effectivement être sensible au contexte, mais le problème est que l'utilisation d'Execute pour inclure des fichiers asp n'est pas aussi pratique que Server.Execute est fourni avec des scripts VBScript. Tout d'abord, il ne peut être utilisé que pour exécuter du texte de code. , le contenu du fichier doit donc être lu une fois. Deuxièmement, il ne peut pas. Certaines balises utilisées pour identifier ASP, telles que <% %>, il existe une méthode d'appel similaire à <%=MyVar %>, vous devez donc filtrer < % %>, puis convertissez <%=MyVar %> en Response.Write MaVar. Puisque j'ai besoin d'inclure des fichiers de classe, <%=MyVar %> n'apparaîtra pas, il me suffit de remplacer <% %>. Pour lire le contenu du fichier et exclure simplement <% %>, vous pouvez vous référer à la fonction suivante :
Copiez le code comme suit :
Fonction file_get_contents(nom de fichier)
Faible fso, f
Définir fso = Server.CreateObject (Scripting.FilesystemObject)
Définir f = fso.OpenTextFile(Server.MapPath(filename), 1)
file_get_contents = f.ReadAll
f.Fermer
Définir f = Rien
Définir fso = Rien
Fonction de fin
Fonction class_get_contents (nom de fichier)
Diminuer le contenu
contenu = file_get_contents (nom de fichier)
contenu = Remplacer (contenu, < & %, )
contenu = Remplacer (contenu, % & >, )
class_get_contents = contenu
Fonction de fin
Avec la fonction ci-dessus nous pouvons tester directement le code suivant :
Exemple.class.asp
Copiez le code comme suit :
<%
Exemple de classe
Fin du cours
%>
test.asp
Copiez le code comme suit :
<%
Exécuter class_get_contents(Sample.class.asp)
Response.Write TypeName (Eval (nouvel échantillon))
%>
Le résultat est le nom du type Sample auquel nous nous attendions. Il semble qu'Execute soit toujours très puissant, car les personnes mal intentionnées l'utilisent souvent pour créer des poneys. Le cheval de Troie ASP d'une phrase le plus simple est probablement écrit comme. phrase suivante :
Copiez le code comme suit : <%Execute Request(c)%>
Par exemple, ce script se trouve dans file.asp, puis transmettez file.asp?c=Texte du cheval de Troie, haha, vous savez déjà la chose suivante. D'accord, c'est une digression. Une autre chose à noter à propos d'Execute est qu'elle est liée au contexte, alors faites attention au problème de portée si Execute est situé à l'intérieur d'un sous-processus ou d'une fonction Function, il est inaccessible de l'extérieur.