L'ASP (pour Active Server Page) est un procédé mis au point par
Microsoft pour faciliter l'interactivité entre l'utilisateur d'une page Web et le
serveur.
Il permet notamment de créer des pages Web "à la volée", en fonction
des demandes formulées par le client (l'internaute).
La technique est particulièrement bien adapté pour faciliter les échanges de données
entre une page Web et une base de données.
La programmation de pages ASP est généralement effectuée en VBScript.
La principale limitation de la technique est liée à la nécessité d'utiliser un serveur supportant l'ASP.
Les pages ASP étant executées côté serveur (c'est le serveur et non le navigateur qui travaille), le serveur doit être équipé d'un logiciel supportant ASP, par exemple
IIS (Internet Information Server de Windows NT Server) ou PWS (Personal Web Server).
Créer une page ASP est très simple, il s'agit d'un fichier texte.
Ouvrir un éditeur de texte, par exemple NotePad, et recopier le texte ci-dessous :
<% @LANGUAGE = VBScript %>
<HTML><BODY>
<FONT COLOR='red' > 5 x 3 = </FONT>
<%
Response.Write 5*3
%>
</BODY></HTML>
La page ASP ainsi constituée doit être enregistrée sur le serveur, par exemple sous le nom zaza.asp.
Pour l'ouvrir, il faut appeler à partir d'un navigateur, la page http://nom_du_serveur/zaza.asp.
- La première ligne, <% @LANGUAGE = VBScript %> indique au serveur que le langage utilisé par la page ASP est VBScript. On aurait aussi
bien pu écrire en JavaScript en commençant par <% @LANGUAGE = JScript %>. Dans notre exemple, on aurait aussi pu omettre cette instruction, puisque le langage par défaut est justement VBScript.
- La ligne <FONT COLOR='red' > 5 x 3 = </FONT> est du pur
langage HTML et renvoie simplement "5 x 3 = " en rouge.
- Les symboles <% et %> indiquent le début et la fin d'une zone de script VBScript, c'est cette portion de code que le serveur va devoir executer.
- Response.Write indique que le serveur va renvoyer au navigateur ce qui suit. Response.Write "Zaza" renvoie le texte Zaza au navigateur.
Response.Write 5*3 va donc renvoyer le résultat de l'opération 5*3, c'est à dire 15.
Le serveur va lire la page demandée par le client, et renvoyer au navigateur client
une page html dans laquelle tous les éléments de la page ASP auront été calculés (ou executés).
Dans notre exemple simple, à l'ouverture de la page zaza.asp, on lira simplement :
5 x 3 = 15
Un peu de vocabulaire
Response.Write
Response.Write indique au serveur qu'il doit renvoyer le texte qui suit.
Si la variable age contient 18, l'instruction
Response.Write "Juliette a " & age & " ans" va renvoyer :
Juliette a 18 ans.
Pour plus de concision, on peut remplacer <% Response.Write age %> par <% =age %>.
On peut ainsi écrire : Juliette a <% =age %> ans ou bien <% ="Juliette a " & age & " ans" %> .
Pour passer à la ligne dans la page affichée par le navigateur, il suffit d'utiliser la balise HTML <BR>.
Par exemple Response.Write "1) truc <BR> 2) machin"
Pour rendre le code HTML renvoyé au navigateur plus lisible, on peut également prévoir des retours charriot dans le code, il suffit d'écrire
VbCrLf (ou bien CHR(13) & CHR(10)), par exemple Response.Write "1) truc " & VbCrLf & "<BR> 2) machin".
Manipulation de texte et de chiffres
Trim permet d'éliminer les espaces à chauqe extreminté d'un texte
Replace(texte,truc,machin) remplace tous les truc par des machin dans le texte texte.
IsNumeric(truc) renvoie true si truc est un nombre, IsDate(truc) vérifie si truc est une date, IsNull(truc) vérifie
si truc est vide.
CInt(nombre) renvoie un entier, CLng(nombre) renvoie un nombre long.
Cstr(truc) transforme truc en chaine de caractères.
CDate transforme une chaine en date.
If... Else... End If, Select Case... Case...End Select, For... Next, While... Wend, Do... Loop
Les instructions conditionnelles et les boucles sont utilisées exactement de la même façon qu'en VB ou VBA :
Juliette a
<%
If age>18 then
Response.Write " plus de "
ElseIf age<18 then
Response.Write " moins de "
End If
%>
18 ans.
Response.Expires
Placé en tête d'une page ASP, cette instruction indique la durée de vie de
la page html renvoyée vers le navigateur :
<% Response.Expires = 5 %> indique que la page ne restera dans la cache du navigateur client que 5 minutes.
Cette instruction est particulièment utile dans le cas où la page ASP est basée sur des éléments qui sont mis à jour fréquemment.
Il est alors prudent d'éviter le stockage de la réponse dans le cache du navigateur client en utilisant : <% Response.Expires = 0 %>. On sera alors assuré que le client lira toujours une page raffraichie.
Response.Redirect
Response.Redirect permet de rediriger le client vers une nouvelle page ASP ou vers une page Web :
La page ASP ci-dessous ouvre simplement le site de boursorama.
<%@ LANGUAGE=VBScript %>
<% Response.Redirect "http://boursorama.fr" %>
Variables d'application, variables de session
- Une variable d'application est disponible pour tous les utilisateurs. Application("Zaza")=5 permet de fixer à 5
la variable Zaza. Pour éviter des erreurs liées à l'utilisation simultanée par plusieurs
utilisateurs, on peut utiliser ApplicationLock pour empêcher les autres utilisateurs de modifier la variable (UnLock pour débloquer).
<%
Application.Lock
Application("compteur")=Application("compteur")+1
Application.Unlock
%>
La variable compteur est incrémentée de une unité à chaque fois qu'on ouvre la
page. Elle joue donc le role de compteur du nombre d'accès à la page.
Attention, le contenu de la variable est perdu si le serveur est s'arrete.
- Une variable de session est définie pour la durée d'une session pour un utilisateur.
Session("Zaza")=5 La variable zaza conservera la valeur 5 pour l'utilisateur tant qu'il ne se sera pas déconnecté. Cette
variable de session est stockée au niveau de chaque utilisateur dans un cookie. Elle n'est pas accessible aux autres utilisateurs.
SessionID est un numéro qui identifie l'utilisateur pendant une session.
Les cookies
Un cookie est un petit fichier texte qui est envoyé par le serveur sur le disque dur du client (sous réserve que le
navigateur du client n'ait pas été configuré pour refuser les cookies).
Le cookie est un moyen commode pour stocker des informations spécifiques à chaque client. A chaque nouvelle
connexion, les informations du cookie seront accessibles au serveur.
Response.Cookies("zaza")="chat" crée un cookie nommé zaza et lui attribue la valeur "chat"
(attention, cette instruction doit être placée AVANT les balises <HTML><BODY>).
Pour que le cookie ait une durée de validité de 10 jours, on utilise
Response.Cookie("zaza").Expires=Now+10
Pour récupérer le contenu du cookie, on utilise Request.Cookies :
<% Response.Write Request.Cookies("zaza") %> va renvoyer "chat".
Pour renvoyer le contenu de tous les cookies de l'utilisateur :
<%@ LANGUAGE=VBScript %>
<HTML><BODY>
<%
for each cook in request.cookies
response.write request.cookies(cook) & "<BR>"
next
%>
</BODY></HTML>
On peut enfin stocker plusieurs variables dans un même cookie :
Response.Cookie("zaza")("nom")="chat"
Response.Cookie("zaza")("prenom")="minou"
Response.Cookie("zaza")("age")="5 ans"
<% =Request.Cookie("zaza")("prenom") %> renverra minou.
ServerVariables
Request.ServerVariables("REMOTE_ADDR") renvoie l'adresse IP du navigateur client (ou du proxy qu'il utilise pour se connecter).
Request.ServerVariables("SCRIPT_NAME") renvoie l'adresse virtuelle de la page ASP en cours.
Request.ServerVariables("QUERY_STRING") renvoie la chaine de paramètres transmise à la page ASP, Request.ServerVariables("CONTENT_LENGTH") est la longueur de la chaine.
Server.MapPath(adr) renvoie le chemin physique de l'URL adr. on peut donc utiliser
Server.MapPath(Request.ServerVariables("SCRIPT_NAME")) pour trouver l'adresse physique de la page en cours.
Formulaires
La chaine renvoyée par un formulaire utilisant la méthode GET est Request.ServerVariables("QUERY_STRING"), sa longueur est Request.ServerVariables("CONTENT_LENGTH").
Pour récupérer le paramètre "nom" transmis par le formulaire, on utilise Request.QueryString("nom").
Les paramètres renvoyés par un formulaire utilisant la méthode POST sont récupérés
par Request.Form, par exemple Request.Form("nom").
Les fichiers texte
Pour créer un fichier texte zaza.txt :
Set Fs=Server.CreateObject("Scripting.FileSystemObject")
Set fich=Fs.CreateTextFile("c:\zaza.txt",False,False)
(le deuxième paramètre empêche d'écraser le fichier zaza s'il existe déjà, le troisième permet de créer un fichier au format ASCII, au format UNICODE si True).
Pour ouvrir un fichier existant :
Set Fs=Server.CreateObject("Scripting.FileSystemObject")
Set fich=Fs.OpenTextFile("c:\zaza.txt",8,False)
(le deuxième paramètre vaut 1 pour ouvrir le fichier en lecture, 2 en écriture, et 8 en "appending", le troisième à True entraine la création du fichier zaza
s'il n'existe pas).
Pour écrire une ligne dans le fichier : fich.WriteLine "bonjour les chatons", pour écrire un texte : fich.Write "texte".
Pour lire les 500 premiers caractères du fichier zaza : texte=fich.Read(500), pour lire une ligne texte=fich.ReadLine, et pour lire tout le fichier
texte=fich.ReadLine.
Pour fermer le fichier fich.Close
Pour parcourir le fichier texte, on utilise fich.AtEndOfLine (true en bout de ligne), fich.AtEndOfStream (true en fin de fichier), fich.Line (numéro de ligne) et fich.Column.
Par exemple pour lire la septième ligne du fichier zaza :
<%@ LANGUAGE=VBScript %>
<HTML><BODY>
<%
Set Fs=Server.CreateObject("Scripting.FileSystemObject")
Set fich=Fs.OpenTextFile("c:\zaza.txt",1,False)
Do While fich.line<=7
txt=fich.readline
loop
response.write txt
fich.close
%>
</BODY></HTML>
Fichiers et répertoires
Pour accéder à l'objet répertoire C:\Jac,
set fs=Server.CreateObject("Scripting.FileSystemObject")
Set rep=fs.GetFolder("c:\Jac")
Les fichiers contenus dans Jac sont rep.Files, les sous-répertoires rep.SubFolders.
Pour établir la liste de tous les fichiers du répertoire Jac :
<%@ LANGUAGE=VBScript %>
<HTML><BODY>
<%
set fs=Server.CreateObject("Scripting.FileSystemObject")
Set rep=fs.GetFolder("c:\jac")
for each fich in rep.files
response.write fich.name & "<BR>"
next
%>
</BODY></HTML>
Pour copier, supprimer ou déplacer un fichier, on utilise Copy, Delete et Move.
Sub, Function
Tout comme en VBA, on peut utiliser des procédures Sub ou des fonctions Function qui peuvent être appelées plusieurs fois dans la page ASP.
La syntaxe est la même qu'en VB, la procédure commence par Sub et se termine par
End Sub, la fonction commence par function(truc) et se termine par End Function.
Les deux sont appelées par leur nom éventuellement suivi d'arguments entre parenthèses.
Include
Si on utilise fréquemment certains morceaux de code dans plusieurs pages ASP, on peut
utiliser un fichier "Include". Le code à répéter est enregistré de préférence avec l'extension .inc, par exemple sous le nom de "truc.inc".
Dans la page ASP, il suffit d'ajouter la ligne :
<!-#include file='zaza.asp'-> (avec une adresse relative)
pour insérer le code de zaza.inc.
Les bases de données
On accède au contenu d'une base de données (qu'elle soit Access, SQL ou Excel) par l'intermédiaire d'un objet RecordSet, résultat
d'une requete :
set base=server.createobject("ADODB.Connection")
base.open("DRIVER={microsoft Access Driver (*.mdb)};DBQ=" & Server.MapPath("/Jac/") & "\adresses.mdb;")
set rs=base.execute("SELECT * FROM Table1 WHERE nom LIKE 'zaza' AND pays LIKE 'france'")
Les deux premières lignes effectuent une connexion avec la base de données, une base Access
dans l'exemple ci-dessus. La connexion utilise un pilote ODBC (microsoft Access Driver).
La troisième ligne crée un objet RecordSet contenant le résultat de la requête
SQL :
SELECT * FROM Table1 WHERE nom LIKE 'zaza' AND pays LIKE 'france'
Le language SQL utilisé ici pour définir la requête permet de limiter la sélection
à certains champs, de trier la base :
SELECT nom, prénom FROM Table1 ORDER BY nom
(pour sélectionner tous les enregistrements dont le nom
commence par "Pou" :
SELECT nom FROM Table1 WHERE nom LIKE 'Pou%')
Il permet également de prendre en compte plusieurs tables de la base :
SELECT Table1.pays FROM Table1,Table2.surnom FROM Table1 INNER JOIN Table2 ON Table1.nom=Table2.nom
On peut d'ailleurs très bien utiliser à ce niveau une requête SQL UPDATE pour modifier le contenu de la base :
base.execute("UPDATE Table1 SET pays = 'F' WHERE nom LIKE 'Zaza' AND prénom LIKE 'minou'")
va ainsi inscrire "F" dans le champ "pays" de tous les minou Zaza de la base.
- Plutôt que de créer un objet RecordSet par execution d'une requête SQL, on peut créer d'abord un objet RecordSet
par CreateObject, puis l'ouvrir avec une requête SQL :
Set rs=Server.CreateObject("ADODB.RecordSet")
Set rs.ActiveConnection=base
rs.Open "SELECT Table1.prénom WHERE Table1.nom LIKE Zaza"
- Pour faciliter l'accès à la base de données, on peut
lui associer un DSN Système (Data Source Name) qui integre le nom du pilote ODBC et l'adresse de la base.
La connexion à la base se fera alors par :
base.Open "DSN=DSN_de_Zaza;Database=Zaza;UID=sa;PWD=mot_de_passe"
(UID=sa;PWD=mot_de_passe signifie que la base est ouverte au nom de l'administrateur système avec le mot de passe mot_de_passe).
- Pour parcourir la base de données (en fait l'objet RecordSet rs), on peut aller au premier enregistrement (première ligne de la base)
par rs.MoveFirst, passer à l'enregistrement suivant par rs.MoveNext ou bien au dernier enregistrement par rs.MoveLast.
Pour balayer tous les enregistrements on peut utiliser une boucle :
While not rs.EOF
Response.Write rs("nom")
rs.MoveNext
Wend
rs("nom") renvoie la valeur du champ "nom" dans l'enregistrement sélectionné.
- Pour ajouter un enregistrement à la base de données, on peut soit utiliser
la commande SQL INSERT soit utiliser la méthose AddNew de l'objet RecordSet :
base.execute "INSERT INTO Table1 (nom,prénom) VALUES ('Poulain','Amélie')"
Ou bien, avec l'objet recordset :
rs.LockType=adLockOptimistic
rs.AddNew
rs("nom")="Poulain"
rs("prénom")="Amélie"
rs.UpDate
Pour supprimer un enregistrement, on utilise de même soit rs.Delete soit l'instruction SQL DELETE (DELETE FROM Table1 WHERE...)
- Pour ne sélectionner que certains enregistrements,
on peut, au lien d'écrire une requête SQL, filtrer
un objet RecordSet existant :
rs.Filter = "nom = 'Poulain'"
response.Write rs("prénom")
(renvoie Amélie).
Quelques exemples de pages ASP
Créer un journal de suivi de fréquentation d'une page Web
Publier un tableau Excel sur le Web, avec mise à jour permanente
Publier une sélection d'un tableau Excel sur le Web
Interroger une base de données Excel à partir d'une page Web
Modifier une table Excel à partir d'une page Web
Explorer les répertoires du serveur en ASP
Envoyer un fichier vers le serveur