L'Altruiste : Le guide des langages Web

La technique ASP

Sommaire

1 / Introduction

La technologie Active Server Pages a été élaborée par Microsoft dans le but de concevoir des applications Internet totalement dynamiques.

Les applications ASP sont des programmes conçus à partir de plusieurs sources : du Visual Basic Script (VBScript), voire du JScript (le javascript de Microsoft) et des fonctionnalités propres au serveur IIS (Internet Information Server) de Microsoft telles que les composants et objets ASP mais aussi les objets Scripting Runtime et ActiveX Data Objects (ADO).

Les scripts ASP peuvent effectuer de nombreuses tâches comme accéder à des bases de données, générer un contenu HTML, gérer des dossiers et autres fichiers directement sur le serveur hôte, faire du commerce électronique, etc..

L'implémentation des applications ASP, en réalité des scripts écrits directement dans des pages HTML portant l'extension .asp plutôt que les habituels .htm ou .html, s'effectue du côté serveur. C'est effectivement, ce-dernier qui s'occupe du traîtement du code source et non le navigateur client.

Néanmoins, l'ASP est incapable de fonctionner sur des plateformes différentes de celles de Microsoft, c'est-à-dire les serveurs IIS de Windows NT ou 2000 ou encore sur le PWS (Personal Web Server) de Windows 95, 98, Millenium et XP.

Par ailleurs, en principe n'importe n'importe quel navigateur est capable d'afficher correctement des pages HTML contenant des scripts ASP. Puisque ces-derniers sont pré-traités par le serveur, le navigateur Internet n'a plus qu'à interpréter le résultat, soit du code HTML.
Evidemment, ce code doit être parfaitement compatible avec le logiciel de navigation, en évitant, notamment, tout balisage propriétaire comme <marquee> et <iframe> qui ne fonctionnent que sous Internet Explorer.

Les possiblités qu'offrent l'Active Server Pages sont multiples et témoignent d'un fort potentiel pour un site web professionnel.

En s'appuyant sur les requêtes HTTP (Hyper Text Transfert Protocol), le serveur peut récupérer des données auprès de l'utilisateur, les traiter, puis lui envoyer une réponse adaptée.

L'ouverture d'une session sur le serveur permet de créer un espace virtuel destiné à mémoriser les actions d'un utilisateur, une fonctionnalité très utile dans le domaine de l'e-commerce.

La génération dynamique d'informations apporte une grande souplesse dans la gestion du contenu d'un site Web et pour l'affichage dans un navigateur client.

Ne se contentant pas de se cantonner à son environnement de programmation habituel, certes déjà très puissant, l'ASP accepte également l'utilisation des composants COM (Component Object Model) écrit par exemple en Visual Basic, C++ ou Java, destinés à fournir de multiples services logiciels tels que des contrôles personnalisés de données ou de transferts, ainsi que des liaisons dynamiques entre différentes applications ASP.

2 / L'environnement de développement

Travailler sur la technologie ASP, il est nécessaire de disposer d'un environnment de développement approprié.

Dans un premier temps, le système d'exploitation de prédilection de l'ASP est évidemment Microsoft Windows dans l'une des versions :

Ensuite, un serveur Internet spécifique à chaque système d'exploitation doit être installé et configuré proprement.

L'installation d'un système de base de données est également souhaitable. Il est possible d'utiliser un logiciel comme Access ou SQL Server, mais également d'autres comme Oracle ou MySQL peuvent constituer une alternative intéressante.

Enfin, bien qu'un éditeur de texte conventionnel soit suffisant pour rédiger des pages ASP, il est préférable pour des travaux plus ambitieux, d'employer des éditeurs spécialisés tels que :

3 / Insertion des scripts

Les scripts écrits en VBScript ou en JScript doivent être intégrés dans une page HTML par le biais d'un balisage spécifique.

<!-- Insertion de scripts -->
<script language="VBScript | JScript" 
             type="text/vbscript | jscript"
             runat="Server | Client">
    ' Script...
</script>

L'attribut language indique le moteur de script à utiliser pour implémenter le code. L'ASP autorise deux langages de script, soit Visual Basic Script, soit une version spécifique de Microsoft de l'ECMAScript, JScript, d'ailleurs activée par défaut.

L'attribut runat spécifie le type d'exécution du script, c'est à dire au niveau du serveur (Server) ou au niveau du client (Client), lequel est activé par défaut.

Des scripts externes peuvent être utilisés dans une page ASP par l'intermédiaire de la commande suivante :

<script 
            language="VBScript | JScript"
            src="Adresse.url"
            type="text/vbscript | jscript"
            runat="Server | Client">
</script>

La forme ci-dessous, est également une alternative plus simple et plus rapide permettant d'insérer du code directement dans le balisage HTML.

<%
  Script...
%>

En entête de page, on peut également utiliser la balise suivante afin d'indiquer le langage de script par défaut au serveur.

<%@ LANGUAGE="VBScript | JScript"%>

Toutes les pages HTML, comportant ces balisages précités, doivent impérativement porter l'extension .asp afin que le serveur traite correctement l'ensemble des scripts VBScript ou JScript.

4 / Les directives de traitement

Les directives de traitement sont utilisées dans les scripts afin d'envoyer à Internet Information Server (IIS), des indications sur la manière de traiter un fichier ASP.

Les directives obéissent à la forme énoncée ci-dessous et en outre se placent au sommet du document et en particulier avant le code.

<% @Directive = Valeur %>
Les Directives
Méthode
Directive
@CODEPAGE = Page_de_Code
indique par un entier non-signé, un jeu de caractères représentant un langage ou un dialecte. La propriété CodePage de l'objet session permet de modifier le jeu de caractères dans une portion d'un script.
@ENABLESESSIONSTATE = False
indique la fermeture de la poursuite d'une session pour une page. Une telle disposition est utilsable si la page n'a pas besoin des informations issues d'une session. Cela permettra également d'améliorer le temps de traitement de la page.
@LANGUAGE = "VBScrit | JScript"
permet d'affecter à la page un langage de script par défaut. Par défaut, IIS utilise le moteur de script VBScript.
@LCID = Identificateur local
permet d'affecter un identificateur local pour un script. L'identificateur local est une abréviation numérique internationale standard permettant d'identifier les paramètres locaux du système. (Voir Les identificateurs locaux LCID)
@TRANSACTION = "Required | Requires_New | Supported | Not_Supported"
indique que le script devrait être créé comme une transaction. Si un script est traité comme une transaction, les services de composant créeraient une transaction pour coordonner la mise à jour des ressources. Les deux premières valeurs signifient respectivement que le script initiera une transaction ou une nouvelle transaction, la troisième qu'il n'en ititiera pas et la dernière que la transaction n'est pas supportée.
Les codes de langages ou dialectes
Langage Code
ANSI - Europe Centrale 1250
ANSI - Cyrillique 1251
ANSI - Latin I 1252
ANSI - Grec 1253
ANSI - Turc 1254
ANSI - Hébreux 1255
ANSI - Arabe 1256
ANSI - Baltique 1257
ANSI - Vietnamien 1258
ANSI - Thaï 874
ANSI - Japonais 932
ANSI - Chinois simplifié 936
ANSI - Coréen 949
ANSI - Chinois traditionnel Big5 950
En savoir plus
Exemple
<% @LANGUAGE = "JScript" %>
<html>
  <body>
    <% 
      Response.Write("Ceci est un programme JScript !");
    %>
  </body>
</html>

5 / Les directives SSI

Les directives d'inclusion côté serveur (Server Side Includes) permettent de construire des pages Web avant leurs envoi à l'agent utilisateur.

<!--#Directive Instructions...-->

Les directives SSI sont capables d'exécuter diverses tâches à partir du serveur hôte :

Les Directives
Directive
Description
<!--#config timefmt="Codes_Date_Heure"
| errmsg="Message d'erreur" | sizefmt="ABBREV | BYTE"-->
applique, pour chaque page, une option de configuration date et heure (timefmt), de gestion d'erreurs (errmsg), ou la taille d'un fichier (sizefmt) en kilo-octets (ABBREV) ou en octets (BYTE).
<!--#echo var="VARIABLE_HTTP"-->
affiche la valeur d'une variable d'environnement HTTP.
<!--#exec cmd | cgi="Instruction"-->
exécute une instruction directement sur le serveur hôte. Si une commande de Shell doit être exécutée, il faut utiliser cmd. Si une application CGI doit être exécutée, il faut utiliser cgi.
<!--#flastmod file | virtual="Fichier"-->
retourne la date et l'heure de la dernière modification du fichier.
<!--#fsize file | virtual="Fichier"-->
retourne la taille d'un fichier.
<!--#include file | virtual="Fichier"-->
inclut le contenu d'une page dans une autre.

Selon la localisation du fichier, il faut utiliser soit file, si un chemin physique (\rep\fichier.asp)est utilisé ou si la cible se trouve dans le même répertoire, sinon virtual (rep/fichier.asp) dans le cas où un chemin virtuel est employé.

En ce qui concerne l'inclusion des fichiers par la directive #include, couramment il est fait appel à l'extension inc pour différencier les fichiers à inclure des fichiers ASP. Cependant, cette pratique peut provoquer des problèmes de sécurités, c'est-pourquoi, il est préférable de conserver une extension asp pour tous les fichiers contenant du code sensible.

La directive #exec peut également provoquer de graves problèmes de sécurités puisqu'il est possible de lancer des commandes de Shell sur le serveur avec toutes les conséquences que cela comporte. En conséquence, l'utilisation de tels instructions doivent se faire avec le maximum de précautions.

Exemple [voir]
<!-- #config errmsg="Une erreur est survenue sur la page !"-->
<!-- retourne le message d'erreur. -->
Une erreur est survenue sur la page !

<!-- #config timefmt="%d/%m/%Y"-->
<!-- retourne la date selon le format JJ/MM/AA -->
10/11/2001

<!-- #echo var="PATH_INFO" -->
<!-- retourne -->
/laltruiste/coursado/exemple_ado/directive_ssi.asp

<!-- #exec cmd="dir *.zip"-->
<!-- retourne -->
fichier.zip
...
fichierN.zip

<!-- #exec cgi="cgi-bin/application.exe"-->
<!-- exécute le fichier application.exe -->

<!-- #config timefmt="%d/%m/%Y %H:%M:%S"-->
<!-- #flastmod file="index.html"-->
<!-- retourne la date de dernière modification selon le format spécifié. -->
10/11/2001 20:45:20

<!-- #config sizefmt="BYTE"-->
<!-- #fsize file="\download\fichier.zip"-->
'retourne la taille en octet -->
1245800

<!-- #include virtual="../rep/fichier.asp"-->
<!-- Incorpore tout le contenu dans la page courante. -->

5.1 / Les codes de formatage de dates et heures

Les codes de formatage de dates et heures permettent de retourner une date ou une heure selon un format spécifié à partir de la directive d'inclusion côté serveur (SSI) #config.

<!-- Affiche la date et l'heure selon le format JJ/MM/AA HH:MM:SS. -->
<!-- #config timefmt="%d/%m/%y %H:%M:%S" -->
'retourne
12/12/2001 21:50:30
Les codes
Code Description
%a retourne l'abréviation le nom du jour de la semaine, Mardi donnant Mar par exemple.
%A retourne le nom complet du jour de la semaine.
%b retourne l'abréviation le nom du mois, Janvier donnant Jan par exemple.
%B retourne le nom complet du mois.
%c retourne la date et l'heure selon le format local (04/09/01 10:30:52).
%d retourne le jour du mois compris entre 1 et 31.
%H retourne l'heure sur 24 heures.
%I retourne l'heure sur 12 heures.
%j retourne le jour de l'année compris entre 1 et 366.
%m retourne le mois compris entre 1 et 12.
%M retourne les minutes comprises entre 0 et 59.
%p retourne l'indicateur AM ou PM pour un format sur 12 heures.
%S retourne les secondes comprises entre 0 et 59.
%U retourne le numéro de la semaine, comprise entre 0 et 51, de l'année avec le dimanche comme le premier jour de la semaine.
%w retourne le jour de la semaine compris entre 0 et 6, avec le dimanche comme le premier jour de la semaine.
%W retourne la semaine de l'année, comprise entre 0 et 51, avec le dimanche comme le premier jour de la semaine.
%x retourne la date selon le format local courant (06/02/99).
%X retourne l'heure selon le format local courant (02:10:45).
%y retourne l'année sans le siècle (99).
%Y retourne l'année complète (1999).
%z, %Z retourne le nom de la zone horaire ou son abréviation.
%% retourne le signe de pourcentage %.

6 / Les objets

Le langage ASP possède plusieurs objets permettant de manipuler diverses données entre la station cliente et le serveur, mais aussi de gérer des erreurs, des sessions ou encore des transactions.

6.1 / L'objet Application

L'objet Application permet de partager des informations entre plusieurs utilisateurs d'une application.

Application.[méthode | propriété]

Dans le langage ASP, une application représente un ensemble de fichiers .asp situés dans un même répertoire.

Ainsi, l'objet Application se comporte comme un conteneur d'objets partagés susceptibles d'être accédés et modifiés par les utilisateurs connectés aux fichiers concernées, soit les fichiers formant une application.

Application.Contents("Identificateur") = expression

L'expression suivante est équivalente à la seconde, mais est plus courte.

Application("Identificateur") = expression

Cet exemple permet de partager le modèle d'objet FileSystemObject entre les différents documents ASP d'une application.

Set Application("fso") = _
                          Server.CreateObject("Scripting.FileSystemObject")

Désormais, l'objet Application identifié par fso peut utiliser les méthodes et propriétés du modèle d'objet FileSystemObject.

Set fichier = Application("fso").GetFile(chemin)

Il est également possible pour des raisons de commodités d'affecter l'objet Application à une variable.

objet_fso = Application("fso")

Puisqu'un objet Application peut être utilisé par plusieurs personnes simultanément, il est souhaitable qu'un seul et unique utilisateur puisse modifier la valeur de l'objet à la fois, comme dans le cas d'un compteur notamment.

Application.Lock
Application("Compteur_visite") = Application("Compteur_visite") + 1
Application.Unlock

Response.Write "Nb de visites : " & Application("Compteur_visite")

C'est pourquoi, deux méthodes Lock et Unlock permettent de vérouiller la variable lors de son utilisation puis de la dévérouiller suite à la modification.

Les Collections
Collection
Description
Contents(clé)
contient tous les éléments qui ont été ajoutés à l'application par l'intermédiaire de commandes de script.
StaticObjects(clé)
contient tous les objets ajoutés à l'application par la balise <object>.
Les Propriétés
Propriété
Description
Contents.count
retourne le nombre d'éléments dans la collection Contents.
Contents.item(clé)
retourne l'élément identifié par l'argument clé dans la collection Contents.
StaticObjects.count
retourne le nombre d'éléments dans la collection StaticObjects.
StaticObjects.item(clé)
retourne l'élément identifié par l'argument clé dans la collection StaticObjects.
Les Méthodes
Méthode
Description
Contents.Remove(clé)
supprime un élément de la collection Contents de l'objet Application.
Contents.RemoveAll()
supprime tous les éléments de la collection Contents de l'objet Application.
Lock
empêche d'autres clients de modifier les propriétés de l'objet Application.
Unlock
autorise d'autres clients à modifier les propriétés de l'objet Application.
Les Evénements
Evénement
Description
<script language="..." runat="server">
    Sub Application_OnEnd
        ' Instructions...
    End Sub
</script>
Cet événement se produit lorsque l'application est abandonnée, après qu'intervienne l'événement Session_OnEnd.
<script language="..." runat="server">
    Sub Application_OnStart
      ' Instructions...
    End Sub
</script>
Cet événement se produit avant qu'une première nouvelle session soit créée, et partant avant qu'intervienne l'événement Session_OnStart.
Exemple [voir]
<-- Fichier : departement.asp -->
<html>
  <body>
    <form action="reponse.asp" method="POST">
      <%
        Application("00") = "Province"
        Application("75") = "Paris"
        Application("77") = "Seine-et-Marne"
        Application("78") = "Yvelines"
        Application("91") = "Essonne"
        Application("92") = "Hauts-de-Seine"
        Application("93") = "Seine-Saint-Denis"
        Application("94") = "Val-de-Marne"
        Application("95") = "Val-d'Oise"

        Dim i, departement, liste_choix
        liste_choix = "<select name='dep'>"
        For Each departement In Application.Contents
          liste_choix = liste_choix & "<option value='" & departement _
                             & "'>" & Application.Contents(departement) & "</option>"
        Next
        liste_choix = liste_choix + "</select>"
        Response.Write liste_choix
      %>
      <input type="submit" id="soumission" value="Soumettre">
    </form>
  </body>
</html>
<-- Fichier réponse : reponse.asp -->
<html>
  <body>
    <%
      Session("choix") = Request("dep")
    %>
    <p>Le département de votre choix est :</p>
    <h3><% = Application.Contents(Session("choix")) %></h3>
    <p>parmi cette liste :</p>
    <%
      Dim i, departement
      i = 0
      For Each departement In Application.Contents
        Response.Write i & " : " & departement & " - " _
                                   & Application(departement) & "<br>"
        i = i + 1
      Next

      Application.Contents.RemoveAll
    %>
    <br>
    <a href="confirmation.asp">Confirmez ce choix</a>
  </body>
</html>
<-- Fichier réponse : confirmation.asp -->
<html>
  <body>
    <%
      Response.Write "<h3>Vous avez bien confirmé votre choix.</h3>" _
                           & "<h4>Département : " & Session("choix") & " - " _
                           &  Application.Contents(Session("choix")) & "</h4>"
    %>
  </body>
</html>

6.2 / L'objet Response

L'objet Response a pour rôle de retransmettre des informations au client par l'intermédiaire d'un affichage à l'écran ou par la transmission d'un cookie.

Response.[méthode | propriété]

L'utilisation la plus courante de cet objet consiste à employer la méthode Write,

Response.Write "Texte" & variable_chaîne

ou le signe d'égalité pour insérer un contenu textuel dans une page résultante.

<% = variable_chaîne%>

Il est également possible d'envoyer une réponse à un client par l'intermédiaire de cookies.

Response.Cookies("Identificateur") = Informations

L'objet Response permet de placer diverses ressources soit en mémoire cache, c'est-à-dire dans une zone tampon situé sur un serveur proxy,

Response.CacheControl = "Public"

soit dans un dossier tampon de la station cliente, Temporary Internet Files.

Response.CacheControl = "Private"

Cela a pour avantage de considérablement accélérer le chargement des pages Web et de soulager le traitement des requêtes clientes par le serveur Internet.

Dans le cas d'un site Web dynamique et mis à jour fréquemment, les documents possèdent une durée de vie limitée. C'est pourquoi, l'objet Response dispose de deux propriétés permettant d'indiquer une période limite de validité.

Les propriétés d'expiration ne peuvent s'appliquer qu'au cache local d'un ordinateur client.

La première propriété Expires spécifie une durée en minutes de validité de la page avant son expiration.

Response.Expires = Nombre_minutes

La seconde ExpiresAbsolute étend la validité d'un document à une date et une heure précises.

Response.ExpiresAbsolute = #MM/JJ/AA HH:MM PM|AM#

Enfin, une propriété Buffer associée deux méthodes Clear et Flush permettent de contrôler la construction d'une page ASP dans une mémoire tampon.

Response.Buffer = True ' Activation du tampon.
....Flush ' Envoi des données présentes dans le tampon.
....Clear ' Vidage du contenu du tampon.
Les Collections
Collection
Description
Cookies[("nom_cookie") = Informations]
contient les valeurs d'un cookie.
Les Propriétés
Propriété
Description
Buffer = True|False
indique si une page résultante est stockée en mémoire tampon.
CacheControl = "Private|Public"
détermine si les proxys de serveurs sont capables de mettre en mémoire tampon les informations résultantes générées par un traîtement ASP.
Charset(nom_jeu)
ajoute le nom du jeu de caractères à l'entête de type de contenu.
ContentType [= Type_Contenu]
indique si une page résultante est stockée en mémoire tampon.
Cookies.count
retourne le nombre d'éléments dans la collection Cookies.
Cookies.item(clé)
retourne l'élément identifié par l'argument clé dans la collection Cookies.
Expires Nombre_minutes
spécifie une durée en minutes avant qu'une page placée en mémoire cache dans un navigateur arrive à expiration.
ExpiresAbsolute = #MM/JJ/AA HH:MM PM|AM#
spécifie la date et l'heure à laquelle une page placée en mémoire cache dans un navigateur arrive à expiration.
IsClientConnected()
indique si le client a été déconnecté du serveur.
Pics(Label_PICS)
obtient les valeurs pour les entêtes de réponse des labels PICS (Platform for Internet Content Selection) afin d'indiquer une estimation du contenu des PICS permettant la consultation de pages Web par plusieurs programmes de surveillance.
Status
spécifie la valeur de la ligne de statut retournée par le serveur.
Les Méthodes
Methode
Description
AddHeader(nom_entete, valeur_entete)
ajoute un nom d'entête HTML contenant une valeur spécifique.
AppendToLog(Entrée)
ajoute une chaîne de caractères à la fin du fichier journal du serveur Web pour une requête.
BinaryWrite(Texte)
écrit une information donnée à la sortie HTTP courante sans n'importe quelle conversion de jeu de caractères.
Clear()
efface n'importe quelles sorties stockées en mémoire tampon.
End()
amet un terme au traîtement d'un fichier ASP et retourne le résultat courant.
Flush()
envoie immédiatement une sortie en mémoire tampon.
Redirect(URL)
envoie un message de redirection au navigateur, provoquant une tentative de connection à une URL différente.
Write(Texte)
écrit une variable à la sortie HTTP courante comme une chaîne de caractères.
Exemple [voir]
<html>
<body>
  <%
    Response.CacheControl = "Private"
    Response.Expires = 15
    Response.Buffer = True

    For i = 0 To 1000

      If i Mod 20 = 0 Then
        separateur = "<br>"
      Else
        separateur = " | "
      End If

      For j = 1000 To 0 Step -1
        Response.Write i - j & separateur
      Next
    Next

    If Response.IsClientConnected() = False Then
      Response.Clear
      Response.End
    Else
      Response.Flush
    End If
  %>
</body>
</html>

6.3 / L'objet Request

L'objet Request permet la récupération d'informations en provenance d'une station cliente.

Request.[méthode | propriété]

Les informations fournies par le client peuvent provenir soit de :

Les Collections
Collection
Description
ClientCertificate
contient tous les enregistrements stockés dans le certificat de client qui est envoyé dans une requête HTTP.
Cookies
contient les valeurs des cookies envoyées dans une reqête HTTP.
Form
contient les valeurs des éléments composants un formulaire dans une requête HTTP.
QueryString
contient les valeurs des variables dans la chaîne de caractères d'une reqête HTTP.
ServerVariables
contient les valeurs des variables d'environnement prédéterminées.
Les Propriétés
Propriété
Description
TotalBytes
spécifie le nombre total d'octets que le client a envoyé dans le corps de la reqête HTTP.
Les Méthodes
Méthode
Description
BinaryRead
retrouve les données envoyées au serveur du client comme partie d'une requête POST.
Exemple [voir]
<!-- Formulaire -->
<html>
  <head>
    <%
      Response.Cookies("Visite")("Date") = Date & " " & Time
      Response.Cookies("Visite")("Adresse") = _
                             Request.ServerVariables("PATH_INFO")
      Response.Cookies("Visite")("Hote") = _
                             Request.ServerVariables("REMOTE_HOST")
      Response.Cookies("Visite")("Identite") = _
                             Request.ServerVariables("REMOTE_USER")
      Response.Cookies("Visite")("Navigateur") = _
                             Request.ServerVariables("HTTP_USER_AGENT")
    %>
  </head>
  <body>
    <form
         action="traitement_request.asp?Formulaire=Description&Partie=Première"
         method="POST">

      <u>Nom et Prénom(s) :</u><br>
      <input type="text" name="nom" size="20"><br>

      <u>Adresse complète :</u><br>
      <textarea name="paragraphe" cols="20" rows="3">
      </textarea>
      <br>
      <u>Tranche d'âge :</u><br>
      <input type="radio" name="age" value="Moins de 18 ans" checked>
        Moins de 18 ans<br>
      <input type="radio" name="age" value="19 - 30 ans">
        19 - 30 ans<br>
      <input type="radio" name="age" value="31 - 40 ans">
        31 - 40 ans<br>
      <input type="radio" name="age" value="41 - 50 ans">
        41 - 50 ans<br>
      <input type="radio" name="age" value="51 - 60 ans">
        51 - 60 ans<br>
      <input type="radio" name="age" value="Plus de 61 ans">
        Plus de 61 ans<br>
      <br>
      <u>Situation familiale :</u><br>
      <select name="situation" size="1">
        <option value="Célibataire" selected>Célibataire</option>
        <option value="Marié(e)">Marié(e)</option>
        <option value="Concubinage">Concubinage</option>
        <option value="Pacs">Pacs</option>
        <option value="Veuf(ve)">Veuf(ve)</option>
        <option value="Divorcé(e)">Divorcé(e)</option>
      </select>
      <br>
      <u>Type d'emploi :</u><br>
      <select name="emploi" size="6" multiple>
        <option value="Sans emploi">Sans emploi</option>
        <option value="Cadre" selected>Cadre</option>
        <option value="Artisan">Artisan</option>
        <option value="Employé">Employé</option>
        <option value="Sportif">Sportif</option>
        <option value="Artiste">Artiste</option>
      </select>
      <br>
      <u>Loisirs :</u><br>
      <input type="checkbox" name="loisirs" value="Informatique">
        Informatique<br>
      <input type="checkbox" name="loisirs" value="Musique">
        Musique<br>
      <input type="checkbox" name="loisirs" value="Cinéma">
        Cinéma<br>
      <input type="checkbox" name="loisirs" value="Littérature">
        Littérature<br>
      <input type="checkbox" name="loisirs" value="Sport">
        Sport<br>
      <input type="checkbox" name="loisirs" value="Art">
        Art<br>

      <input type="submit" name="soumission" value="Soumettre">
      <input type="reset" name="annulation" value="Annuler">
    </form>
  </body>
</html>
<!-- Fichier de traitement traitement.asp -->
<html>
  <head>
    <%
      Response.Cookies("Visite")("client") = Request.Form("nom")
      Response.Cookies("Visite")("Emloi") = Request.Form("emploi")
    %>
  </head>
  <body>
    <h2>La Collection Request.Form</h2>
    <table>
    <%
      For Each elt_form In Request.Form
        Response.Write "<tr><td>" & elt_form _
                     & "</td><td>" & Request.Form(elt_form) _
                     & "</td></tr>"
      Next
    %>
    </table>

    <h2>La Collection Request.QueryString</h2>
    <table>
    <%
      For Each chaine_requete In Request.QueryString
        Response.Write "<tr><td>" & chaine_requete & "</td><td>" _
                     & Request.QueryString(chaine_requete) & "</td></tr>"
      Next
    %>
    </table>

    <h2>La Collection Request.Cookies </h2>
    <table>
    <%
      For Each nom_cookie In Request.Cookies
        If Request.Cookies(nom_cookie).HasKeys Then
          For Each cle_cookie in Request.Cookies(nom_cookie)
            Response.Write "<tr><td>" & nom_cookie _
                       & "(" & cle_cookie & ")</td><td>" _
                       & Request.Cookies(nom_cookie)(cle_cookie) _
                       & "</td></tr>"
          Next
        Else
          Response.Write "<tr><td>" & nom_cookie & "</td><td>" _
                       & Request.Cookies(nom_cookie) & "</td></tr>"
        End If
      Next
    %>
    </table>

    <h2>La Collection Request.ServerVariables</h2>
    <table>
    <%
      For Each var_http In Request.ServerVariables
        Response.Write "<tr><td>" & var_http & "</td><td>" _
                      & Request.ServerVariables(var_http) & "</td></tr>"
      Next
    %>
  </table>

    <h2>La Collection Request.ClientCertificate</h2>
    <table>
    <%
      For Each certificat In Request.ClientCertificate
        Response.Write "<tr><td>" & certificat & "</td><td>" _
                     & Request.ClientCertificate(certificat) & "</td></tr>"
      Next
    %>
  </table>

    <h2>Valeurs</h2>
    Request.TotalBytes = <% = Request.TotalBytes %><p>
  </body>
</html>

6.4 / L'objet Server

L'objet Server permet d'accéder à plusieurs fonctions utilitaires.

Server.[méthode | propriété]

L'une des fonctions les plus importantes de l'objet Server consiste à la création d'instance d'objet.

La méthode CreateObject en s'appuyant sur un argument ClassID ou sur une chaîne ProgID, crée un nouvel objet correspondant.

Set Objet = Server.CreateObject("ClassID | ProgID")

Set Obj_IISLog = Server.CreateObject("MSWC.IISLog")

Puis, la fonction GetObject s'occupe de créer une instance d'objet adéquate pour certains types de document.

Set Objet = GetObject([Chemin,] [Classe])

Set Obj_Excel = GetObject("C:\Doc\prevision.xsl", Excel.Application)

Cependant, la création d'objet par les moteurs de script est déconseillée dans certaines conditions, car l'objet ne peut faire appel à aucun objet ASP intrinsèque du contexte en cours, et partant ne peut accèder à aucune des valeurs concernées.
Ne pouvant faire référence à l'objet ObjectContext, il devient impossible de terminer une transaction en cours en cas de défaillance.

Les Propriétés
Propriété
Description
ScriptTimeout = Secondes
spécifie la durée en secondes d'exécution d'un script avant que le serveur ne l'arrête.
Les Méthodes
Methode
Description
CreateObject(Type_Objet)
crée un objet à partir de la référence d'un composant ASP.
Execute(chemin)
appelle un fichier .asp et le traîte comme le fichier ASP courant.
GetLastError()
retourne un objet ASPError décrivant l'erreur qui s'est produite.
HTMLEncode(chaîne_de_caractères)
encode une chaîne de caractères dans le format HTML.
MapPath(chemin)
retourne le chemin physique d'un répertoire du serveur à partir d'un chemin relatif ou virtuel.
Transfer(chemin)
envoie toutes les informations qui ont été rassemblées par le traîtement d'une page ASP, vers une autre, en l'occurrence le fichier en cours.
URLEncode(chaîne_de_caractères)
encode une chaîne de caractères en incluant les caractères d'échappements sous forme d'adresse URL (Uniform Resource Locator).
Exemple [voir]
<-- Fichier server.asp -->
<html>
  <body>
    <%
      Response.Write "<h2>BrowserType</h2>" _
              & "<h3>Adresse encodée du composant ASP</h3>" _
              & Server.URLEncode("http://msdn.microsoft.com/library/en-us" _
              & "/iisref/html/psdk/asp/comp3xx0.asp?frame=true") & "<br>" _
              & Server.HTMLEncode("<title>Configuration de votre navigateur<title>")
      Server.Execute("server2.asp")
    %>
  </body>
</html>
<-- Fichier browsertype.asp -->
<html>
  <body>
    <%
      Set Session("Configuration") = Server.CreateObject("MSWC.BrowserType")
      Set config = Session("Configuration")
    %>
    <h3>Les treize propriétés du composant <i>BrowserType</i></h3>
    <table border="0">
      <tr>
        <th>Propriété</th>
        <th>Valeur</th>
      </tr>
      <tr>
        <td>ActiveXControls</td>
        <td><%=config.ActiveXControls%></td>
      </tr>
      <tr>
        <td>Backgroundsounds</td>
        <td><%=config.Backgroundsounds%></td>
      </tr>
      <tr>
        <td>Beta</td>
        <td><%=config.Beta%></td>
      </tr>
      <tr>
        <td>Browser</td>
        <td><%=config.Browser%></td>
      </tr>
      <tr>
        <td>Cdf</td>
        <td><%=config.Cdf%></td>
      </tr>
      <tr>
        <td>Cookies</td>
        <td><%=config.Cookies%></td>
      </tr>
      <tr>
        <td>Frames</td>
        <td><%=config.Frames%></td>
      </tr>
      <tr>
        <td>Javaapplets</td>
        <td><%=config.Javaapplets%></td>
      </tr>
      <tr>
        <td>Javascript</td>
        <td><%=config.Javascript%></td>
      </tr>
      <tr>
        <td>Platform</td>
        <td><%=config.Platform%></td>
      </tr>
      <tr>
        <td>Tables</td>
        <td><%=config.Tables%></td>
      </tr>
      <tr>
        <td>Vbscript</td>
        <td><%=config.Vbscript%></td>
      </tr>
      <tr>
        <td>Version</td>
        <td><%=config.Version%></td>
      </tr>
    </table>
  </body>
</html>

6.5 / L'objet Session

L'objet Session contient des informations relatives à la session d'un utilisateur sur le serveur.

Session.[méthode | propriété]

Dans le langage ASP, une session représente une période de temps dans laquelle un utilisateur navigue dans un ensemble de pages ASP.

Ainsi, l'objet Session se comporte comme un conteneur d'objets partagés devant être conservés tant que l'utilisateur concerné agît sur un ensemble de pages ou pour mener une opération à son terme, comme dans le cas d'une transaction en ligne.

Session.Contents("Identificateur") = expression

L'expression suivante est équivalente à la seconde, mais est plus courte.

Session("Identificateur") = expression

Cet exemple permet de conserver pendant toute la durée d'une transaction, une information relative à la configuration que possède le navigateur d'un utilisateur.

Session("Config_Utilisateur") = _
                                      Server.Createobject(MSWC.BrowserType)

Désormais, l'objet Session identifié par Config_Utilisateur peut utiliser les méthodes et propriétés du modèle du composant ASP BrowserType.

fichier = Session("Config_Utilisateur").Platform

Il est également possible pour des raisons de commodités d'affecter l'objet Session à une variable.

configuration = Session("Config_Utilisateur")

Le contrôle des sessions s'effectue principalement par l'intermédiaire d'une propriété contrôlant le temps d'expiration en minutes de la session en cours (TimeOut)

Session.TimeOut = 10

et d'une méthode chargée de la terminer immédiatement (Abandon).

Session.Abandon

La durée de vie par défaut d'une session est de vingt minutes. Son ouverture est assurée automatiquement par le serveur.

Les Collections
Collection
Description
Contents(clé)
contient tous les éléments qui ont été ajoutés à la session par l'intermédiaire de commandes de script.
StaticObjects(clé)
contient tous les objets ajoutés à la session par la balise <object>.
Les Propriétés
Propriété
Description
CodePage [= Page_de_Code]
indique la page de code qui sera utilisée pour l'affichage des caractères spéciaux dans un contenu dynamique.
Contents.count
retourne le nombre d'éléments dans la collection Contents.
Contents.item(clé)
retourne l'élément identifié par l'argument clé dans la collection Contents.
LCID [= Identificateur_de_Langue]
indique un identificateur de langue pour régler les paramètres locaux.
SessionID
retourne l'identificateur unique de session, généré par le serveur, pour un utilisateur.
StaticObjects.count
retourne le nombre d'éléments dans la collection StaticObjects.
StaticObjects.item(clé)
retourne l'élément identifié par l'argument clé dans la collection StaticObjects.
Timeout [= Nb_Minutes]
spécifie la période en minutes avant l'expiration d'une session.
Les Méthodes
Méthode
Description
Abandon
détruit un objet Session et libère ses ressources.
Contents.Remove(clé)
supprime un élément de la collection Contents de l'objet Session.
Contents.RemoveAll()
supprime tous les éléments de la collection Contents de l'objet Session.
Evénements
Evénement
Description
<script language="..." runat="server">
    Sub Session_OnEnd
        ' Instructions...
    End Sub
</script>
Cet événement se produit lorsque la session est abandonnée ou que le temps d'expiration soit atteint.
<script language="..." runat="server">
    Sub Session_OnStart
        ' Instructions...
    End Sub
</script>
Cet événement se produit lorsque le serveur crée une nouvelle session.
Exemple [voir]
<-- Fichier : departement.asp -->
<html>
  <body>
    <form action="reponse.asp" method="POST">
      <%
        Application("00") = "Province"
        Application("75") = "Paris"
        Application("77") = "Seine-et-Marne"
        Application("78") = "Yvelines"
        Application("91") = "Essonne"
        Application("92") = "Hauts-de-Seine"
        Application("93") = "Seine-Saint-Denis"
        Application("94") = "Val-de-Marne"
        Application("95") = "Val-d'Oise"

        Dim i, departement, liste_choix
        liste_choix = "<select name='dep'>"
        For Each departement In Application.Contents
          liste_choix = liste_choix & "<option value='" & departement _
                             & "'>" & Application.Contents(departement) & "</option>"
        Next
        liste_choix = liste_choix + "</select>"
        Response.Write liste_choix
      %>
      <input type="submit" id="soumission" value="Soumettre">
    </form>
  </body>
</html>
<-- Fichier réponse : reponse.asp -->
<html>
  <body>
    <%
      Session("choix") = Request("dep")
    %>
    <p>Le département de votre choix est :</p>
    <h3><% = Application.Contents(Session("choix")) %></h3>
    <p>parmi cette liste :</p>
    <%
      Dim i, departement
      i = 0
      For Each departement In Application.Contents
        Response.Write i & " : " & departement & " - " _
                                 & Application(departement) & "<br>"
        i = i + 1
      Next

      Application.Contents.RemoveAll
   %>
    <br>
    <a href="confirmation.asp">Confirmez ce choix</a>
  </body>
</html>
<-- Fichier réponse : confirmation.asp -->
<html>
  <body>
    <%
      Response.Write "<h3>Vous avez bien confirmé votre choix.</h3>" _
                           & "<h4>Département : " & Session("choix") & " - " _
                           &  Application.Contents(Session("choix")) & "</h4>"
    %>
  </body>
</html>

6.6 / L'objet ASPError

L'objet ASPError contient des informations relatives à une erreur dans un script ASP.

ASPError.propriété

L'objet ASPError est créé à partir de l'instruction suivante :

Set objet = Server.GetLastError()

Cet objet a été spécialement conçu pour la gestion personnalisée d'erreurs du côté serveur (erreurs 500).

Dans une configuration par défaut, les erreurs 500 sont redirigées automatiquement vers une page spéciale dénommée 500-100.asp située dans le répertoire unité:\windows\Help\iisHelp\common.

Les Propriétés
Propriété
Description
ASPCode
retourne un code d'erreur généré par Internet Information Server (IIS).
Number
retourne le numéro de l'erreur COM standard.
Source
retourne le code source responsable de l'erreur.
Category
indique si la source de l'erreur était interne à ASP, au langage de script, ou à un objet.
File
indique le nom du fichier portant l'extension .asp qui était traité lorsqu'une erreur s'est produite.
Line
indique un numéro de ligne à l'intérieur d'un fichier ASP qui a généré l'erreur.
Column
indique un numéro de colonne à l'intérieur d'un fichier ASP a généré l'erreur.
Description
retourne une description courte de l'erreur.
ASPDescription
retourne une description détaillée de l'errreur s'il s'agît d'une erreur relative à ASP.
Exemple [voir]
<html>
  <body>
    <%
      Dim erreur
      Set erreur = Server.GetLastError()
    %>
    <h3>Caractéristiques de l'erreur :</h3>
    <table border="0" align="center">
      <tr>
        <td>Propriété</td>
        <td>Erreur</td>
      </tr>
      <tr>
        <td>ASPCode</td>
        <td><% = erreur.ASPCode %></td>
      </tr>
      <tr>
        <td>Number</td>
        <td><% = erreur.Number %></td>
      </tr>
      <tr>
        <td>Source</td>
        <td><% = erreur.Source %></td>
      </tr>
      <tr>
        <td>Category</td>
        <td><% = erreur.Category %></td>
      </tr>
      <tr>
        <td>File</td>
        <td><% = erreur.File %></td>
      </tr>
      <tr>
        <td>Line</td>
        <td><% = erreur.Line %></td>
      </tr>
      <tr>
        <td>Column</td>
        <td><% = erreur.Column %></td>
      </tr>
      <tr>
        <td>Description</td>
        <td><% = erreur.Description %></td>
      </tr>
      <tr>
        <td>ASPDescription</td>
        <td><% = erreur.ASPDescription %></td>
      </tr>
    </table>
  </body>
</html>

6.7 / L'objet ObjectContext

L'objet ObjectContext correspond en quelque sorte à un objet racine autour duquel s'articulent les objets intrinsèques comme Response, Request, Application, Session, Server et ASPError ainsi que tout objet COM (Component Object Model) créé pour des besoins spécifiques.

ObjectContext est un objet COM fournissant un accès aux propriétés d'exécution incluses dans le contexte d'un objet.

Si un objet fait référence à ObjectContext, il aura la possibilité d'accéder aux valeurs des collections Request, Response, Application et Session.

L'objet ObjectContext permet de gérer des transactions initialisées par un script ASP.

ObjectContext.méthode

Les méthodes de ObjectContext permettent de valider (SetCommit) ou d'abandonner (setAbort) une transaction en cours.

Les événements OnTransactionAbort et OnTransactionCommit se produisent lorsque l'événement lié intervient, respectivement, l'abandon ou la validation d'une transaction.

La mise en oeuvre de ces commandes s'effectue par l'intermédiaire d'une procédure chargée de capter l'événement.

Sub OnTransactionAbort | OnTransactionCommit
  Instructions...
end sub

<%@ LANGUAGE="VBScript" TRANSACTION=Required %>
<%
  ObjectContext.SetAbort
  Sub OnTransactionAbort
    Response.Write "<h2>La transaction a été abandonnée</h2>." 
  end sub
%>

<%@ LANGUAGE="VBScript" TRANSACTION=Required %>
<%
  ObjectContext.SetComplete
  Sub OnTransactionCommit
    Response.Write "<h2>La transaction a été accomplie avec succès</h2>." 
  end sub
%>

Par ailleurs, la directive @TRANSACTION doit toujours accompagner l'objet ObjectContext en s'inscrivant au sommet de la page concernée.

<%@ LANGUAGE="VBScript" TRANSACTION=Required %>

Cette instruction spécifique indique que le script doit être traité conformément à une transaction afin que les Services Composants du serveur agissent en conséquence.

Les Méthodes
Méthode
Description
SetAbort
indique que la transaction initiée par le script n'a pas été menée à son terme et que les ressources ne doivent pas être mises à jour.
SetComplete
indique que la transaction initialisée par le script peut être validée.
Les Evènements
Evénement
Description
OnTransactionAbort
se produit si la transaction est abandonnée.
OnTransactionCommit
se produit lorsque la transaction a été validée.
Exemple
<%@ LANGUAGE=VBScript TRANSACTION=Required %>
<%
  Dim obj_Transfert
  Dim Transfert_Montant
  Dim Num_Compte_origine
  Dim Num_Compte_Destinataire

  ' Récupération des informations à partir du
' formulaire initial de demande de transfert de Compte
.
Transfert_Montant = Request.QueryString("Montant")
Num_Compte_origine = Request.QueryString("NumCmptOri")
Num_Compte_Destinataire = Request.QueryString("NumCmptDest")
' Création de l'objet COM+ utilisé pour les transferts
' transfert.dll se trouve dans un répertoire ex: c:\banque\transfert\.
' Auparavant transfert.dll est enregistré par regsvr32.exe.
' ex: c:\winnt\system32\regsvr32.exe c:\banque\transfert\tranfert.dll.

Set obj_Transfert = Server.CreateObject("transfert.AcctTransfer") ' Déduction de la somme en utilisant la méthode Retrait. If obj_Transfert.Retrait(CInt(Num_Compte_origine), _ CInt(Transfert_Montant)) <> 0 Then ' Annulation de la transaction si le retrait a échoué. ObjectContext.SetAbort ' Si le retrait réussi, alors la somme est déposée sur le compte
' destinataire en utilisant la méthode Depot.
Response.Write "Abandon de la procédure de retrait !" Elseif obj_Transfert.Depot(CInt(Num_Compte_Destinataire), _ CInt(Transfert_Montant)) <> 0 Then ' Annulation de la transaction si le dépot a échoué. ObjectContext.SetAbort Response.Write "Abandon de la procédure de dépot !" Else ' Terminer la transaction lorsque le retrait et le dépot ont réussi. ObjectContext.SetComplete Response.Write "Réussite de la procédure !" End If Set Transfert_Montant = Nothing %>

7 / Les composants serveur

Le langage ASP possède plusieurs composants Active Server implémentés par des fichiers librairie (DLL) localisés sur le serveur.

Les composants serveur effectuent diverses tâches utiles pour le fonctionnement dynamique des pages Web.

Le dernier composant ASPSmartUpload n'est pas directement inclus dans ASP, néanmoins il propose des services relatifs au téléchargement.

7.1 / Le composant AdRotator

Le composant AdRotator permet d'afficher des annonces différentes à chaque affichage d'une page ASP.

La déclaration ci-dessous, permet de créer une instance du composant AdRotator sous VBScript.

Set objet = Server.CreateObject("MSWC.AdRotator")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

Les annonces sont spécifiées dans un fichier texte spécifique pointé par la méthode GetAdvertissement(fichier).

objet.GetAdvertissement(nom_fichier)

Ce fichier de planification d'annonces possède le format suivant :

REDIRECT URL du fichier de redirection
WIDTH largeur
HEIGHT hauteur
BORDER taille
*
URL de l'annonce
URL Cible de l'annonce
Commentaire
Importance
...

Le paramètre REDIRECT permet de faire appel à un fichier tiers utilisé pour rediriger les liens.

Les paramètres width, height et border sont optionnels et définissent les dimensions de l'ensemble des annonces présentes dans le fichier.

L'adresse URL Cible de l'annonce correpond donc à un lien pointant vers le document à atteindre en cliquant sur l'image de l'annonce. Si aucune cible ne doit être indiquée, alors, un tiret (-) doit être spécifié.

Le paramètre Importance est représenté par un nombre représentant le pourcentage d'affichage de l'annonce à chaque chargement de la page. Ainsi plus une annonce est importante, plus le nombre est élevé par rapport aux autres. Dans l'exemple en bas du document, la première annonce sera affichée sur 25 pourcent des pages chargées, et pour les deux autres respectivement sur 20 et 15 pourcent.

Les Propriétés
Propriété
Description
Border
spécifie si l'annonce est entourée d'une bordure.
Clickable
spécifie si l'annonce rotative doit prendre la forme d'un lien.
TargetFrame
spécifie dans quelle cadre doit s'afficher le contenu pointé par l'annonce.
Les Méthodes
Méthode
Description
GetAdvertissement(nom_fichier)
retourne l'annonce suivante indiquée dans le fichier de planification d'annonces précisé par l'argument nom_fichier.
Exemple [voir]
<html>
  <body>
    <%
      ' Page hôte affichant les bannières aléatoires.

      Dim objet

      ' Création de l'objet
      Set objet = Server.CreateObject("MSWC.AdRotator")

      Response.Write objet.GetAdvertisement("liste.txt")

      ' Destruction de l'objet
      Set objet = Nothing
    %>
    <a href="adrotator.asp">Recharger la page</a>
  </body>
</html>

<%
  ' Fichier de redirection des liens : lien.asp
  Response.Redirect Request.QueryString("url")
%>
Fichier présentant le liste des bannières et liens : liste.txt
REDIRECT lien.asp
WIDTH 468
HEIGHT 60
BORDER 0
*
http://www.laltruiste.com/coursasp/images/alapage.gif
http://www.alapage.com/
Visitez la librairie en ligne!
5
http://www.laltruiste.com/coursasp/images/blackorange.gif
http://www.blackorange.com/
Découvrez la logithèque en ligne !
4
http://www.laltruiste.com/coursasp/images/oreilly.gif
http://www.editions-oreilly.com/
Découvrez le célèbre éditeur de livres !
3

7.2 / Le composant BrowserType

Le composant BrowserType permet d'indiquer les caractéristiques du navigateur du client.

La déclaration ci-dessous, permet de créer une instance du composant BrowserType sous VBScript.

Set objet = Server.CreateObject("MSWC.BrowserType")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

Le composant BrowserType fonctionne conjointement avec les valeurs de différentes propriétés comprises dans le fichier browscap.ini situé dans le répertoire unité:\windows\system32\inetsrv.

...
[IE 5.0]
browser=IE
Version=5.0
majorver=#5
minorver=#0
frames=True
tables=True
cookies=True
backgroundsounds=True
vbscript=True
javaapplets=True
javascript=True
ActiveXControls=True
Win16=False
beta=True
AK=False
SK=False
AOL=False
Update=False

[Mozilla/4.0 (compatible; MSIE 5.*; Windows NT*)]
parent=IE 5.0
platform=WinNT
beta=True
...

Le fichier ci-dessus est un extrait du fichier browscap.ini, définissant les caractéristiques du navigateur du client, dont certaines propriétés en gras représentent des caractéristiques utiles pour le traîtement de pages ASP.

La propriété Value de l'objet BrowserType permet d'obtenir les valeurs des différentes caractéristiques énoncées dans le fichier browscap.ini du navigateur Internet d'un client.

valeur = objet.Value("Caractéristique")
Les propriétés de Browscap.ini
Propriété
Description
ActiveXControls
indique si le navigateur supporte les contrôles ActiveX.
Backgroundsounds
indique si le navigateur supporte un fond sonore.
Beta
indique si le logiciel est une version beta.
Browser
indique le nom du navigateur.
Cdf
indique si le navigateur supporte le CDF (Channel Definition Format) pour les retransmissions multimédias.
Cookies
indique si le navigateur supporte les cookies.
Frames
indique si le navigateur supporte les cadres (frames).
Javaapplets
indique si le navigateur supporte les applets java.
Javascript
indique si le navigateur supporte le Javascript.
Platform
indique la plateforme sur laquelle le navigateur fonctionne.
Tables
indique si le navigateur supporte les tableaux.
Vbscript
indique si le navigateur supporte Visual basic Script.
Version
indique la version du navigateur.
Les Propriétés
Propriété
Description
Value(Fonction)
retourne la valeur du paramètre Fonction, lequel est défini dans le fichier Browscap.ini.
Exemple [voir]
<html>
  <body>
    <%
      Set Session("Configuration") = Server.CreateObject("MSWC.BrowserType")
      Set config = Session("Configuration")
    %>
    <h3>Les treize propriétés du composant <i>BrowserType</i></h3>
    <table border="0">
      <tr>
        <th>Propriété</th>
        <th>Valeur</th>
      </tr>
      <tr>
        <td>ActiveXControls</td>
        <td><%=config.ActiveXControls%></td>
      </tr>
      <tr>
        <td>Backgroundsounds</td>
        <td><%=config.Backgroundsounds%></td>
      </tr>
      <tr>
        <td>Beta</td>
        <td><%=config.Beta%></td>
      </tr>
      <tr>
        <td>Browser</td>
        <td><%=config.Browser%></td>
      </tr>
      <tr>
        <td>Cdf</td>
        <td><%=config.Cdf%></td>
      </tr>
      <tr>
        <td>Cookies</td>
        <td><%=config.Cookies%></td>
      </tr>
      <tr>
        <td>Frames</td>
        <td><%=config.Frames%></td>
      </tr>
      <tr>
        <td>Javaapplets</td>
        <td><%=config.Javaapplets%></td>
      </tr>
      <tr>
        <td>Javascript</td>
        <td><%=config.Javascript%></td>
      </tr>
      <tr>
        <td>Platform</td>
        <td><%=config.Platform%></td>
      </tr>
      <tr>
        <td>Tables</td>
        <td><%=config.Tables%></td>
      </tr>
      <tr>
        <td>Vbscript</td>
        <td><%=config.Vbscript%></td>
      </tr>
      <tr>
        <td>Version</td>
        <td><%=config.Version%></td>
      </tr>
    </table>
  </body>
</html>

7.3 / Le composant ContentRotator

Le composant ContentRotator permet d'afficher un texte différent à chaque affichage d'une page ASP.

La déclaration ci-dessous, permet de créer une instance du composant ContentRotator sous VBScript.

Set objet = Server.CreateObject("MSWC.ContentRotator")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

L'objet ContentRotator fonctionne conjointement avec un fichier contenant des chaînes de caractères à afficher.

%% [#Importance] [//Remarques]
  Chaîne de caractères...
...

Le paramètre optionnel Importance doit être un nombre compris entre 0 et 10000. Par défaut la valeur est 1, et le 0 signifie que la chaîne de caractères ne doit pas être affichée. Enfin, la somme des paramètres du fichier de contenu ne peut dépasser 10000. Dans l'exemple en bas du document, les contenus s'afficheront respectivement, 5, 1, 5 et 5 fois sur leur somme soit 16 pages affichées.

La chaîne de caractères peut être un simple contenu textuel ou bien du HTML.

Les Méthodes
Méthode
Description
ChooseContent(chemin)
récupère et affiche un contenu sour forme de chaîne de caractères provenant du fichier de contenu pointé par chemin.
GetAllContent(chemin)
récupère et affiche toutes les chaînes de caractères dans le fichier programme de contenu pointé par chemin.
Exemple [voir]
<html>
  <body>
    <%
      Set message = Server.CreateObject("MSWC.ContentRotator") 
    %>
    <% = message.ChooseContent("contenu.txt") %>
  </body>
</html>
<-- Fichier de contenu <i>contenu.txt</i> -->
%% #5 // l'éditeur de livres informatiques O'Reilly
<a href="http://www.editions-oreilly.com">
  <img src="images/oreilly.gif">
</a>
<h3>Découvrez le célèbre éditeur de livres !</h3>

%% #1 // Commentaire avec un minimum d'importance...
<h3>Démonstration de ContentRotator...</h3>

%% #5 // La librairie en ligne Alapage.com
<a href="http://www.alapage.com/">
  <img src="images/alapage.gif">
</a>
<h3>Visitez la librairie en ligne!</h3>

%% #5 // Le vendeur de logiciels BlackOrange.com
<a href="http://www.blackorange.com/">
  <img src="images/blackorange.gif">
</a>
<h3>Découvrez la logithèque en ligne !</h3>

7.4 / Le composant Counters

Le composant Counters permet de gérer des compteurs permanents.

Le code ci-dessous, permet de déclarer une instance du composant Counters pour l'ensemble d'un site Web.

<object
              RUNAT = "Server"
              SCOPE = "Application"
              ID = "Objet_Compteur"
              PROGID = "MSWC.Counters">
</object>

Cette déclaration doit être insérée dans le fichier global.asa du répertoire racine.

Les noms et les valeurs des compteurs sont stockés dans un fichier dénommé counters.txt situé dans un répertoire où se trouve le fichier counters.dll.

Les Propriétés
Propriété
Description
Get(Nom_Compteur)
retourne la valeur du compteur.
Increment(Nom_Compteur)
incrémente le compteur par pas de 1.
Remove(Nom_Compteur)
réinitialise le compteur dans le fichier Counters.txt.
Set(Nom_Compteur, Nombre)
spécifie une valeur entière pour le compteur.
Exemple [voir]
<-- Fichier Global.asa situé sous la racine du site Web -->
<object 
                 runat="Server" 
                 scope="Application" 
                 id="compteur" 
                 progid="MSWC.Counters">
</object>
...

<-- Fichier Counter.asp -->
<html>
  <body>
    <h3>Cette page a été ouverte 
            <%= compteur.Get("compte_page") %> fois.</h3>
    <h4>L'incrémentation : 
            <%= compteur.Increment("compte_page") %></h4>
    <a href="counters.asp">Recharger la page</a>
  </body>
</html>

7.5 / Le composant IISLog

Le composant IISLog permet d'administrer ou d'explorer un fichier journal généré par le serveur Internet Information Server (IIS).

La déclaration ci-dessous, permet de créer une instance du composant IISLog sous VBScript.

Set objet = Server.CreateObject("MSWC.IISLog")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

L'inclusion d'une directive METADATA dans l'entête du document ASP, est impérative en raison de l'utilisation des constantes ForReading, ForWriting et AllOpenFiles, servant de paramètres d'ouverture d'un fichier journal avec l'instruction OpenLogFiles.

<!-- METADATA type="typelib"
                         FILE="C:\WINNT\system32\inetsrv\logscrpt.dll" -->

Le composant IISLog dépend de la librairie logscrpt.dll, c'est pourquoi la directive d'u=inclusion pointe vers ce fichier.

L'utilisation du composant IISLog dans une document Web nécessite de désactiver l'Accès anonyme dans les paramètres de sécurité concernant la page.

Propriétés du répertoire ou du fichier >> Sécurité du répertoire >> Modifier Accès anonyme et contrôle d'authentification >> Décocher l'option Accès anonyme

Le fichier journal par défaut de Internet Information Server (IIS) est localisé dans le répertoire suivant :

C:\WINNT\system32\LogFiles\W3SVC1\

Le fichier Log énumère l'ensemble des accès effectués sur le serveur courant.

Les Propriétés
Méthode
Description
BytesReceived
indique les octets reçus.
BytesSent
indique les octet envoyés.
ClientIP
indique le nom d'hôte du client.
Cookie
indique le cookie du client.
CustomFields
indique un tableau d'entêtes personnalisés.
DateTime
indique la date et l'heure en GMT.
Method
indique le type d'opération.
ProtocolStatus
indique le statut du protocole.
ProtocolVersion
indique la version par une chaine de caractères.
Referer
indique l'URL de la page contenant le lien ayant initialisé la requête.
ServerIP
indique l'adresse IP du serveur.
ServerName
indique le nom du serveur.
ServerPort
indique le numéro de port.
ServiceName
indique le nom du service.
TimeTaken
indique le temps système total de traîtement.
URIQuery
indique tous les paramètres passés avec la requête.
URIStem
indique l'URL cible.
UserAgent
indique l'agent utilisateur (navigateur).
UserName
indique le nom d'utilisateur.
Win32Status
indique le code du statut Win32.
Les Méthodes
Propriété
Description
AtEndOfLog()
indique si tous les enregistrements ont été lus à partir du fichier log.
CloseLogFiles(ForReading(0) | ForWriting(1) | AllOpenFiles(32))
ferme tous les fichiers log ouverts.
OpenLogFile(nom_fichier, mode_E/S,
nom_service, instance_service, format_sortie)
ouvre un fichier log en lecture et écriture.
ReadFilter(nb_début, nb_fin)
filtre les enregistrements du fichier log par date et temps.
ReadLogRecord()
lit le prochain enregistrement disponible du fichier lo courant.
WriteLogRecord(objet_journal)
écrit un enregistrement dans le fichier log courant.
Exemple [voir]
<!-- METADATA type="typelib" FILE="C:\WINNT\system32\inetsrv\logscrpt.dll" -->
<html>
  <body>
    <%
      Dim objJournal
      Set objJournal = Server.CreateObject("MSWC.IISLog")
      objJournal.OpenLogFile _
                  "C:\WINNT\system32\LogFiles\W3SVC1\extend1.log", _
                               ForReading, "W3SVC", 1, 0
      objJournal.ReadFilter DateAdd("d", -1, Now), Now
    %>
    <table cellpadding="10">
      <tr>
        <th>Date/Heure</th>
        <th>Adresse IP</th>
        <th>Nom d'utilisateur</th>
        <th>Agent utilisateur</th>
        <th>Page demandée</th>
      </tr>
      <%
        Do While Not objJournal.AtEndOfLog
        objJournal.ReadLogRecord
      %>
      <tr>
        <td><% = objJournal.DateTime %></td>
        <td><% = objJournal.ClientIP %></td>
        <td><% = objJournal.UserName %></td>
        <td><% = objJournal.UserAgent %></td>
        <td><% = objJournal.URIStem %></td>
      </tr>
      <%
        Loop
        objJournal.CloseLogFiles(ForReading)
      %>
    </table>
  </body>
</html>

7.6 / Le composant MyInfo

Le composant MyInfo permet de stocker diverses valeurs de propriétés qui peuvent être créées dynamiquement.

La déclaration ci-dessous, permet de créer une instance du composant MyInfo dans le fichier global.asa du répertoire racine du site Web.

<object
           runat="Server"
           scope="Session"
           id="Objet_Information"
           progid="MSWC.MyInfo">
</object>

Les informations contenues dans le composant MyInfo sont stockées dans un fichier spécifique au format XML (eXtended Markup Language) dénommée myinfo.xml situé dans le répertoire winnt\system32\inetsrv où se trouve le fichier myinfo.dll pour Windows 2000 et sous le répertoire Windows pour la version 9X.

D'ailleurs avec Windows 9X, il est possible de déclarer le composant MyInfo comme un objet programmé à l'image de PageCounter par exemple.

Set Objet_Information = Server.CreateObject("MSWC.MyInfo")

Le composant MyInfo en possède pas de propriétés propres en ce qui concerne les serveurs IIS, mais peuvent être créées en leurs affectant un nom et une valeur.

Objet_Information.Propriété = Valeur

Sous Windows 9X, plusieurs propriétés sont définies et concernent généralement des données personnelles comme l'illustre le tableau ci-dessous.

Les propriétés fixées par PWS (Personal Web Services)
Propriété Description
PageType retourne un nombre correspondant à une de ses valeurs :
  • 1 = à propos de la compagnie
  • 2 = à propos de l'activité
  • 3 = à propos du parcours scolaire
  • 4 = à propos de l'organisation
  • 5 = à propos de la communauté
PersonalName retourne le nom du propriétaire.
PersonalAddress retourne l'adresse du propriétaire.
PersonalPhone retourne le numéro de téléphone du propriétaire.
PersonalMail retourne l'adresse email du propriétaire.
PersonalWords retourne le texte additionnel associé avec le propriétaire.
CompanyName retourne le nom de la compagnie du propriétaire.
CompanyAddress retourne l'adresse de la compagnie du propriétaire.
CompanyPhone retourne le numéro de téléphone de la compagnie du propriétaire.
CompanyDepartment retourne le nom du département du propriétaire.
CompanyWords retourne le texte additionnel associé à la compagnie du propriétaire.
HomeOccupation retourne l'activité du propriétaire.
HomePeople retourne la liste des personnels évoluant avec le propriétaire.
HomeWords retourne le texte additionnel associé au propriétaire.
SchoolName retourne le nom de l'éole du propriétaire.
SchoolAddress retourne l'adresse de l'école du propriétaire.
SchoolPhone retourne le numéro de téléphone du propriétaire.
SchoolDepartment retourne le service du propriétaire.
SchoolWords retourne le texte associée à l'école du propriétaire.
OrganizationName retourne le nom de organisation présentée sur le site.
OrganizationAddress retourne l'adresse de l'organisation.
OrganizationPhone retourne le numéro de téléphone de l'organisation.
OrganizationWords retourne le texte décrivant l'organisation.
CommunityName retourne le nom de la communauté présentée sur le site.
CommunityLocation retourne la localisation de la communauté.
CommunityPopulation retourne la population de la communauté.
CommunityWords retourne le texte décrivant la communauté.
URL(n) retourne la n-ième URL utilisateur défini correspondant à la n-ième description de lien dans Objet_Information.URLWords.
URLWords(n) retourne une chaîne de caractères contenant la n-ième description d'un lien d'un utilisateur défini.
Style retourne l'adresse URL relative d'une feuille de style.
Background retourne le fond d'écran du site.
Title retourne le titre de la page d'accueil.
Guestbook retourne –1 si le livre d'invités est disponible sur le site, sinon il retourne 0.
Messages retourne –1 si le formulaire de message privée est disponible sur le site, sinon il retourne 0.
Exemple [voir]
<-- Fichier global.asa situé sous le répertoire racine du site -->
<object
          runat="Server"
          scope="Session"
          id="obj_info"
          progid="MSWC.MyInfo">
</object>
...

<-- Fichier myinfo.asp -->
<html>
  <body>
    <%
      obj_info.auteur = "Jean-Chritophe Debré"
      obj_info.service = "Développement"
      obj_info.societe = "IngDev Org"
      obj_info.email = "jc.debre@yahoo.fr"
      obj_info.editeur = "WebExpert 2000"
    %>
    Auteur : <%= obj_info.auteur %> <br>
    Service : <%= obj_info.service %> <br>
    Société : <%= obj_info.societe %> <br>
    eMail : <%= obj_info.email %> <br>
    Editeur : <%= obj_info.editeur %> <br>
  </body>
</html>

7.7 / Le composant NextLink

Le composant NextLink permet de gérer une liste d'adresses URL (Uniform Resource Locator) dans un fichier texte.

La déclaration ci-dessous, permet de créer une instance du composant NextLink sous VBScript.

Set objet = Server.CreateObject("MSWC.NextLink")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

Le composant NextLink dépend du fichier librairie NextLink.dll et d'un fichier textuel spécifique contenant une liste d'adresses URL.

Le fichier texte contenant la liste d'adresses URL doit obéir à la construction suivante :

Adresse.url->Description->Commentaire
...
AdresseN.url->DescriptionN->CommentaireN

Une tabulation doit obligatoirement apparaître entre chaque élément et chaque URL doit commencer une nouvelle ligne.

Seules des adresses virtuelles relatives (rep/page.asp) ou physiques (rep\page.asp) sont acceptées par le composant NextLink.

Les adresses absolues (http://www.adresse.com) ne peuvent être utilisées telles quelles dans le fichier précité. Néanmoins, l'instruction Redirect peut permettre de s'affranchir de cette limitation.

redirection.asp?url=http://adresse.com
                 ->Description->Commentaire

Le fichier de redirection redirection.asp permet de récupérer l'adresse absolue et de la rediriger par l'intermédiaire de l'instruction Redirect.

<%
  Response.Clear
  Response.Redirect Request.QueryString("url")
%>
Les Méthodes
Méthode
Description
GetListCount(fichier_texte)
retourne le nombre de liens contenus dans le fichier texte.
GetListIndex(fichier_texte)
retourne l'index du lien de la page en cours du fichier texte.
GetNextDescription(fichier_texte)
retourne la description de la prochaîne page listée dans le fichier texte.
GetNextURL(fichier_texte)
retourne l'adresse URL de la prochaîne page listée dans le fichier texte.
GetNthDescription(fichier_texte, n-ieme_page)
retourne la description de la n-ième page dans le fichier texte.
GetNthURL(fichier_texte, n-ieme_page)
retourne l'adresse URL de la n-ième page listée dans le fichier texte.
GetPreviousDescription(fichier_texte)
retourne la description précédente des pages listées dans le fichier texte.
GetPreviousURL(fichier_texte)
retourne l'adresse URL précédente des pages listées dans le fichier texte.
Exemple [voir]
<!-- Fichier nextlink.asp -->
<%@LANGUAGE="VBScript"%>
<html>
  <body>
    <%
      Set objLiens = Server.CreateObject("MSWC.Nextlink")
    %>
    <h2>Sommaire</h2>
    <h3>
      <a href="<% = objLiens.GetNthURL("liste_liens.txt", 1) %>">
        <% = objLiens.GetNthDescription("liste_liens.txt", i) %>
      </a>
    </h3>
    <ol>
    <%
      nbLiens = objLiens.GetListCount("liste_liens.txt")
      For i = 2 To nbLiens
    %>
      <li>
        <a href="<% = objLiens.GetNthURL("liste_liens.txt", i) %>">
          <% = objLiens.GetNthDescription("liste_liens.txt", i) %>
        </a>
      </li>
    <%
      Next
    %>
    </ol>
  </body>
</html>
<!-- Fichier liste_liens.txt -->
composant.html Les composants
objet_adrotator.html AdRotator
objet_browsertype.html BrowserType
objet_contentrotator.html ContentRotator
objet_counters.html Counters
objet_iislog.html IISLog
objet_myinfo.html MyInfo
objet_nexlink.html NextLink
objet_permissionchecker.html PermissionChecker
objet_tools.html Tools

7.8 / Le composant PageCounter

Le composant PageCounter permet de comptabiliser le nombre d'ouverture d'une page ASP.

La déclaration ci-dessous, permet de créer une instance du composant PageCounter sous VBScript.

Set objet = Server.CreateObject("MSWC.PageCounter")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

Les données recueillies par PageCounter sont stockées dans un fichier texte.

Le composant PageCounter dépend de la librairie pagecnt.dll.

Les Méthodes
Méthode
Description
Hits(chemin)
retourne le nombre d'accès à la page pointée par l'argument chemin, ou par défaut à la page en cours.
PageHit()
effectue une incrémentation du nombre d'accès à la page en cours.
Reset(chemin)
réinitialise le nombre d'accès à la page pointée par l'argument chemin, ou par défaut à la page en cours.
Exemple [voir]
<html>
  <body>
    <%
      Dim compteur_page
      Set compteur_page = Server.CreateObject("MSWC.PageCounter")
      compteur_page.PageHit()
    %>
    <h3>Le nombre de visites sur cette page est égale à 
                                    <%= compteur_page.Hits() %></h3>
    <a href="pagecounter.asp">Recharger la page</a>
  </body>
</html>

7.9 / Le composant PermissionChecker

Le composant PermissionChecker permet de vérifier si un utilisateur à le droit d'accéder à un fichier précisé.

La déclaration ci-dessous, permet de créer une instance du composant PermissionChecker sous VBScript.

Set objet = Server.CreateObject("MSWC.PermissionChecker")

Sous JScript, il suffit de remplacer l'instruction Set par var ou de l'enlever si l'objet est déjà déclaré.

Ce composant n'est utilisable que sous les serveurs IIS (Internet Information server). En effet, la méthode d'authentification d'un utilisateur dépend de la désélection de l'option Accès anonyme, située dans les Propriétés de PermissionChecker du gestionnaire de service Internet.

Ensuite, les utilisateurs autorisés doivent être déclarés dans les paramètres de sécurité des propriétés de la page à restreindre.

Enfin, le composant PermissionChecker pourra désormais comparer les données d'authentification du compte IUSR_nom_machine à celles enregistrées dans les propriétés de sécurités afin d'autoriser le cas échéant l'accès à une page ASP restreinte.

Les Méthodes
Méthode
Description
HasAccess(chemin)
vérifie si le compte utilisateur à la permission d'accéder à la page désignée par l'argument chemin.
Exemple [voir]
<html>
  <body>
    <%
      Set autorisation = Server.CreateObject("MSWC.PermissionChecker")
      If autorisation.HasAccess("acces_special.asp") Then
    %>
      <a href="acces_special.asp">Page réservée</a>
    <%
      Else
    %>
      <h3>Vous n'êtes pas autorisé à continuer la procédure !</h3>
    <%
      End If
    %>
  </body>
</html>

7.10 / Le composant Tools

Le composant Tools possède différentes méthodes utilitaires, permettant de tester l'existence d'un fichier, de traiter un formulaire HTML, de générer une valeur entière aléatoire, et plus spécifiquement pour Macintosh de détecter un module d'extension du serveur ou encore de vérifier si l'utilisateur est proprétaire du site.

La déclaration ci-dessous, permet de créer une instance du composant Tools sous VBScript.

Set objet = Server.CreateObject("MSWC.Tools")

Sous JScript, il suffit de remplacer l'instruction Set par var si l'objet n'a pas été préalablement déclaré, sinon supprimer la simplement.

Le composant Tools dépend de la librairie tools.dll.

Les Propriétés
Propriété
Description
FileExists
vérifie l'existence d'un fichier.
Owner
vérifie si l'utilisateur courant est le propriétaire du site, utilisable seulement sur Macintosh.
PluginExists
vérifie l'existence d'un module plug-in du serveur, utilisable seulement sur Macintosh.
ProcessForm
traite un formulaire HTML.
Random
retourne un entier généré aléatoirement.
Exemple [voir]
<html>
  <head>
    <script language="JScript" runat="server">
      var obj_Outil = Server.CreateObject("MSWC.Tools");
      var Fichier = Request.Form("adresse");
      if ((IsEmpty(Fichier) != True) And (IsNull(Fichier) != True))
      {
        if (obj_Outil.FileExists(Fichier))
        {
          Response.Write("Le fichier <b>" + Fichier + "</b> est présent.");
        }
        else
        {
          Response.Write("Le fichier <b>" + Fichier + "</b> n'existe pas.");
        }
      }
      delete obj_Outil;
    </script>
  </head>
  <body>
    <form action="tools.asp" method="POST">
      Saisissez une adresse vers un fichier : 
      <input type="text" name="adresse"><br>
      <input type="SUBMIT" name="soumettre"><br>
    </form>
  </body>
</html>

7.11 / Le composant ASPSmartUpload

Le composant ASPSmartUpload permet de gérer les téléchargements de fichiers ou de données en Upload ou en Download à partir d'un serveur hôte.

Ce composant puissant et gratuit offre une gestion avancée des transferts de fichiers en flux montant ou descendant, avec notamment un contrôle des fichiers en Upload, la restriction sur leurs caractéristiques en Download ou encore a gestion des formulaires en mode mixte.

L'installation du composant ASPSmartUpload s'effectue selon les étapes suivantes :

Le composant ASPSmartUpload comporte un objet principal appelé SmartUpload, lui même comprenant deux collections Files et Form contenant respectivement des objets File et des objets Item.

Objet_SmartUpload
        ¦¦
          = >   Collection_Files
                  ¦¦
                  = >   Objet_File
        ¦¦
         = >   Collection_Form
                  ¦¦
                  = >   Objet_Item

L'objet SmartUpload peut être créé directement à partir d'un script ASP.

Set Objet_Upload = Server.CreateObject("AspSmartUpload.SmartUpload")

Ensuite comme tous les objets intrinsèques à ASP, l'utilisation de l'objet SmartUpload s'effectue come suit :

Objet_Upload.Collections | Propriété | Méthode
Les Collections
Collection
Description
Files
représente une collection d'objets File.
Form
représente une collection d'objets Item (champs du formulaire).
Les Propriétés
Propriété
Description
TotalMaxFileSize
retourne la taille maximale totale autorisée pour l'upload de fichiers.
MaxFileSize
retourne la taille maximale autorisée par fichier lors de l'upload.
AllowedFilesList
contient la liste des extensions des fichiers autorisées pour l'upload.
DeniedFilesList
contient la liste des extensions des fichiers refusées lors de l'upload.
DenyPhysicalPath
empêche l'enregistrement de fichiers dans des répertoires autres que les répertoires virtuels.
ContentDisposition
modifie le content-disposition.
DownloadBlockSize
retourne la taille des blocs d'une source de données lues.
TotalBytes
retourne la taille totale en octets des données transmises.
BinaryData
retourne l'octet correspondant à l'indice du tableau contenant les données transmises.
Les Méthodes
Méthode
Description
UpLoad
exécute la transfert en upload du formulaire.
Save
sauvegarde tous les fichiers transmis.
DownloadFile
exécute le transfert en download d'un fichier.
DownloadField
télécharge un fichier à partir d'une base de données.
FieldToFile
crée un nouveau fichier contenant les données d'un champ d'une table d'une base de données.
UploadInFile
sauvegarde le formulaire complet dans un fichier.

La collection Files contient l'ensemble des objets File représentant des fichiers spécifiés dans les éléments HTML de transfert de fichier.

Coll_Files.Collection | Propriété | Méthode
Les Collections
Collection
Description
File
représente l'objet File.
Les Propriétés
Propriété
Description
Count
retourne le nombre d'objet File.
TotalBytes
retourne la taille en octets de la collection Files.
Les Méthodes
Méthode
Description
Item(ID)
retourne l'objet File correspondant à l'identifiant spécifié en paramètre.

L'objet File correspond au fichier désigné par la valeur d'un champ de l'élément HTML de transfert de fichier.

Objet_File.Propriété | Méthode
Les Propriétés
Propriété
Description
Name
retourne le nom du champ du formulaire.
FileName
retourne le nom du fichier saisie par l'utilisateur.
FileExt
retourne l'extension du fichier saisie par l'utilisateur.
FilePathName
retourne le chemin du fichier saisie par l'utilisateur.
ContentType
retourne le Content-Type du fichier saisie par l'utilisateur.
ContentDisp
retourne le Content-Disposition du formulaire
Size
retourne la taille du fichier.
ContentString
retourne le contenu du fichier dans une chaîne de caractères.
TypeMIME
retourne le type MIME du fichier saisie par l'utilisateur.
SubTypeMIME
retourne le sous-type MIME du fichier saisie par l'utilisateur.
IsMissing
retourne True si l'utilisateur n'a pas saisi de fichier.
BinaryData
retourne l'octet correspondant à l'indice du tableau contenant les données transmises.
Les Méthodes
Méthode
Description
SaveAs
sauvegarde le fichier sur le disque.
FileToField
sauvegarde le contenu d'un fichier dans le champ d'une table d'une base de données.

La collection Form représente le formulaire et contient les objets Item.

Objet_Fom.Collection | Propriété | Méthode
Les Collections
Collection
Description
Item
représente l'objet Item.
Les Propriétés
Propriété
Description
Count
retourne le nombre d'item de la collection.
Les Méthodes
Méthode
Description
Item(ID)
retourne l'objet Item correspondant à l'identifiant passé en paramètre.

L'objet Item correspond aux champs de transfert de fichiers compris dans le formulaire.

Objet_Item.Propriétés
Les Propriétés
Propriété
Description
Count
retourne le nombre de valeurs pour cet item.
Name
retourne le nom du champ du formulaire.
Values
retourne les valeurs du champ du formulaire.
Exemple [voir]
<!-- Formulaire de saisie -->
<html>
  <body>
    <form 
              method="POST"
              action="traitement.asp"
              enctype="multipart/form-data">
      <input type="file" name="fichier1" size="50"><br>
      <input type="file" name="fichier2" size="50"><br>
      <input type="file" name="fichier3" size="50"><br>
      <input type="file" name="fichier4" size="50"><br>
      <input type="submit" value="Upload">
    </form>
  </body>
</html>
<!-- Fichier de traitement traitement.asp -->
<html>
  <body>
    <%
      Dim Objet_SmartUpload
      Dim Fichier
      Dim i
      i = 0
      Set Objet_SmartUpload = _
              Server.CreateObject("aspSmartUpload.SmartUpload")
      Objet_SmartUpload.Upload
      For each Fichier In Objet_SmartUpload.Files
        If not Fichier.IsMissing Then
          Fichier.SaveAs("/aspSmartUpload/Upload/" & Fichier.FileName)
          Fichier.SaveAs("c:\temp\" & Fichier.FileName)
          Response.Write "" _
              & "<table>" _
                & "<tr><th>Nom complet</th><td>" _
                  & Fichier.Name & "</td></tr>" _
                & "<tr><th>Taille</th><td>" _
                  & Fichier.Size & "</td></tr>" _
                & "<tr><th>Nom</th><td>" _
                  & Fichier.FileName & "</td></tr>" _
                & "<tr><th>Extension</th><td>" _
                  & Fichier.FileExt & "</td></tr>" _
                & "<tr><th>Chemin</th><td>" _
                  & Fichier.FilePathName & "</td></tr>" _
                & "<tr><th>Type de contenu</th><td>" _
                  & Fichier.ContentType & "</td></tr>" _
                & "<tr><th>Disposition de contenu</th><td>" _
                  & Fichier.ContentDisp & "</td></tr>" _
                & "<tr><th>Type MIME</th><td>" _
                  & Fichier.TypeMIME & "</td></tr>" _
                & "<tr><th>Sous-Type MIME</th><td>" _
                  & Fichier.SubTypeMIME & "</td></tr>" _
              & "</table>"
          i = i + 1
        End If
      Next
      Response.Write "<p>" & Objet_SmartUpload.Files.Count _
                            & " fichiers pouvaient être uploadés.</p>"
      Response.Write "<p>" & i & " fichiers uploadés.</p>"
    %>
  </body>
</html>

8 / L'objet CDONTS.NewMail

L'objet CDONTS.NewMail donne la possiblité d'envoyer un message directement à partir d'une page ASP.

L'objet NewMail fait parti de la librairie CDO (Collaboration Data Objects) permettant d'émettre et de recevoir des messages à partir des serveurs Microsoft.

La librairie CDO est installée avec les logiciels Microsoft® Exchange Client and Server, et Outlook 98.

L'instanciation de l'objet NewMail s'effectue comme suit :

Set Objet_eMail = Server.CreateObject("CDONTS.NewMail")
Les propriétés
Propriété
Description
From = "adresse@email.com"
indique l'adresse de l'expéditeur du message courant.
To = "adresse@email.com;...;adresseN@email.com"
indique les adresses des destinataires du message courant.
Subject = "Sujet"
indique le sujet du message.
Body = "Contenu"
contient le texte du message.
Cc = "adresse@email.com;...;adresseN@email.com"
indique les adresse eMail des destinataires de copies du message courant.
Bcc = "adresse@email.com;...;adresseN@email.com"
indique les adresses eMail des destinataires de copies de courtoisie du message courant.
Importance = 0 | 1 | 2
spécifie par une valeur entière, la priorité du message, 0 indiquant une basse priorité, 1 une priorité normale (par défaut) et 2 une haute priorité.
BodyFormat = 0 | 1
spécifie par une valeur entière, le format du corps de l'objet NewMail, ObjMail.BodyFormat = 0 | 1 indiquant respectivement un format HTML ou un format textuel simple.
MailFormat = 0 | 1
spécifie par une valeur entière, l'encodage de l'objet NewMail, ObjMail.MailFormat = 0 | 1 indiquant respectivement un format MIME ou un format textuel simple.
ContentBase = "Base_URL"
fixe une base pour toutes les adresses URL en relation avec le contenu du message courant.
ContentLocation = "Chemin"
fixe un chemin relatif ou absolu pour toutes les adresses URL en relation avec le message courant.
Value("Nom") = "Contenu"
fixe la valeur et le contenu d'un entête additionnel pour le message courant.
Version = "Numéro_de_Version"
retoune le numéro de version de l'objet NewMail.
Les Méthodes
Méthode
Description
AttachFile(Source [, Nom_Fichier] [, Encodage])
attache un fichier (Source) avec un nom de fichier optionnel à l'objet Newmail.
AttachURL(Source, Localisation [, Base] [, Encodage])
attache un fichier (Source) à l'objet Newmail en lui associant une adresse URL (Localisation).
Send([From] [, To] [, Subject] [, Body] [, Importance])
envoie le message.
SetLocaleIDs(CodePageID)
fixe l'identificateur qui définit les paramètres locaux de messagerie d'un utilisateur.

L'encodage des méthodes AttachFile et AttachURL peuvent être :

Exemple [voir]
<%
  Dim objet_NewMail

  Set objet_NewMail = Server.CreateObject("CDONTS.NewMail")

  objet_NewMail.From = "expediteur@serveur.com"
  objet_NewMail.To = "destinataire@serveur.com"
  objet_NewMail.Subject = "Courrier électronique"
  objet_NewMail.Body = "Le corps du message..."
  objet_NewMail.BodyFormat = 0 
  objet_NewMail.MailFormat = 0 
  objet_NewMail.Send

  Set objet_NewMail = Nothing
%> 

<%
  Dim objet_NewMail

  Set objet_NewMail = CreateObject("CDONTS.NewMail") 

  Contenu = "" _
          & "<html>" _
          & "<head>" _
          & "<title>Courrier électronique</title>" _
          & "</head>" _
          & "<body>" _
          & "<h1>Sujet du message</h1>" _
          & "<p>Le corps du message...</p>" _
          & "</body>" _
          & "</html>"
  objet_NewMail.From = "expediteur@serveur.com" 
  objet_NewMail.To = "destinataire"
  objet_NewMail.Subject = "Courrier électronique" 
  objet_NewMail.BodyFormat = 1
  objet_NewMail.MailFormat = 1
  objet_NewMail.Body = Contenu
  objet_NewMail.Importance = 2
  objet_NewMail.AttachFile = "c:\piecejointe.doc", "Pièce jointe"
  objet_NewMail.Send

  Set objet_NewMail = Nothing
%> 

9 / Le fichier Global.asa

Le fichier Global.asa permet le lancement de certaines tâches préalables ou consécutives, nécessaires au fonctionnement d'une application ASP.

Effectivement, le fichier Global.asa localisé sous la racine du site Web, peut contenir des instructions qui s'exéctueront avant ou après que des pages ASP soit accédées par un utilsateur. Ainsi, des objets peuvent être créés, ou des variables initialisés, avant le début de l'implémentation du code ASP dans les pages Web ou après de réinitialiser des variables par exemple.

Plus précisément, le fichier Global.asa permet :les actions énoncées dans la liste ci-dessous.

Exemple
<!-- Fichier Global.asa -->
<!--METADATA type="TypeLib" FILE="Composant.tlb"-->

<object 
             runat="Server"
             scope="Application" 
             id="Compteur"
             progid="MSWC.Counters">
</object>

<object 
             runat="Server"
             id="Liste_Lien"
             scope="Session"
             progid="MSWC.NextLink">
</object>

<script language="VBScript" runat="Server">
  Sub Application_onStart()
    Set Application("oConnection") = Server.CreateObject("ADODB.Connection")
    Dim Tableau(6)
    Tableau(0) = "Nom"
    Tableau(1) = "Prénom"
    Tableau(2) = "Adresse"
    Tableau(3) = "Code Postal"
    Tableau(4) = "Ville"
    Tableau(5) = "Adresse eMail"
    Application("Individu") = Tableau
    Application("Depart") = CStr(Now)
    Application("Compteur_Visite") = 0
  End Sub

  Sub Application_onEnd()
    Set Application("oConnection") = Nothing
  End Sub

  Sub Session_onStart()
    Set Session("oAdRotator") = Server.CreateObject("MSWC.AdRotator")
    Dim Tableau(6)
    Tableau(0) = "Nom"
    Tableau(1) = "Prénom"
    Tableau(2) = "Adresse"
    Tableau(3) = "Code Postal"
    Tableau(4) = "Ville"
    Tableau(5) = "Adresse eMail"
    Session("Individu") = Tableau
    Session("Depart") = CStr(Now)
    Session("Adresse_IP") = Request.ServerVariables("REMOTE_ADDR")
    Application.Lock  
    intVisits = Application("Compteur_Visite") + 1
    Application("Compteur_Visite") = intVisits
    Application.Unlock
  End Sub

  Sub Session_onEnd()
    Set Session("oASPAdRotator") = Nothing
  End Sub
</script>

9.1 / Les événements de Global.asa

Le code événementiel des objets Application et Session se place dans des gestionnaires d'événements définissant daux états sensibles.

Les événements
Evénement Description
ON_START indique des instructions à exécuter avant le démarrage d'une application ASP.
ON_END indique des instructions à exécuter suite à la sortie d'une application ASP.

Les deux événements précités sont utilisés accolés à l'objet par l'intermédiaire d'un caractère souligné (_), dans le fichier Global.asa selon la syntaxe suivante :

<script language="Langage_Script" runat="Server">
  Sub Application | Session_OnStart()
    ' Instructions...
  End Sub
  
  Sub Application | Session_OnEnd()
    ' Instructions...
  End Sub
</script>

En ce qui concerne Application_OnStart | OnEnd, seuls les objets Application et Server peuvent être utilisés à l'intérieur des procédures événementielles, les autres objets provoquant des erreurs.

Par contre, Session_OnStart permet l'utilisation de tous les objets ASP (Application, ObjectContext, Request, Response, Session et Server).

Enfin, Session_OnEnd n'accepte que les objets Application, Session et Server.

Exemple
<script language="VBScript" runat="Server">
  Sub Session_OnStart
  End Sub

  Sub Session_OnEnd
  End Sub

  Sub Application_OnStart
    Application("ConnectString") = "dsn=personnel"
  End Sub

  Sub Application_OnEnd
    Application("ConnectString") = ""
  End Sub
</script>

9.2 / La déclaration d'objets dans Global.asa

La déclaration des objets dans le fichier Global.asa, s'effectue par l'intermédiaire de la balise object.

L'utilisation de la balise object doit se faire à l'extérieur des balises de script (<script...>...</script>) et obéït à la construction suivante :

<object 
             runat="Server"
             scope="Application | Session"
             id="Identificateur"
             {progid="progID"| classid="ClassID"}>
</object>

Les objets, ainsi déclarés, possèdent une portée dans le domaine, soit d'un objet Application, soit d'un objet Session.

L'identificateur permet de faire référence à l'objet à partir d'une page ASP.

Les attributs progid ou classid pointent vers des valeurs spécifiques et connues relatives aux objets à créer.

Les objets ne sont réellement créés qu'à partir du moment où un script, y faisant référence, est exécuté par le serveur.

La destruction de ces objets s'accomplit automatiquement, ainsi, il est inutile de mobiliser des ressources pour cette opération.

Exemple
<object 
             runat="Server"
             scope="Application" 
             id="Fichier_Journal"
             progid="MSWC.IISLog">
</object>

<object 
             runat="Server"
             id="ObjConnection"
             scope="Session"
             progid="ADODB.Connection">
</object>

<script language="VBScript" runat="Server">
  Sub Application_onStart()
  End Sub

  Sub Application_onEnd()
  End Sub

  Sub Session_onStart()
  End Sub

  Sub Session_onEnd()
  End Sub
</script>

9.3 / Le référencement des bibliothèques de type

Le référencement des bibliothèques de type permet de rendre disponible des informations sur des objets.

Cette commande se révèle particulièrement utile lorsqu'une application ASP doit faire appel à des bibliothèques d'objets personnellement développées ou provenant d'un tiers.

Les instructions ci-dessous permettent de faire référence à une bibliothèque de type.

<:!--METADATA type="TypeLib"
                         FILE="Fichier"
                         [UUid="Type_UUID"]
                         [version="Version"]
                         [LCID="ID_Local"]-->

Pour de meilleures performances, il est conseillé de placer la commande au sommet du fichier Global.asa.

La valeur de l'attribut UUID correspond à un identificateur unique universel pour la bibliothèque de type.

Le dernier attribut LCID demande un identificateur local de la bibliothèque de type.

Exemple
<!-- Fichier Global.asa -->
<!--METADATA type="TypeLib" FILE="MesAutorisation.tlb"-->
<!--METADATA type="TypeLib" FILE="Compteur.tlb"-->

<object 
             runat="Server"
             scope="Application" 
             id="objPermission"
             progid="MSWC.PermissionChecker">
</object>

<script language="VBScript" runat="Server">
  Sub Application_onStart()
  End Sub

  Sub Application_onEnd()
  End Sub

  Sub Session_onStart()
  End Sub

  Sub Session_onEnd()
  End Sub
</script>

9.3.1 / Les formulaires avec Request

Les formulaires sont employés pour transmettre des informations saisies par un client à une application Web.

<form action="page.asp" method="post|get">
  Eléments du formulaire...
</form>

L'attribut action pointe un fichier destinataire des données saisies par le client. Cette cible, une page ASP, posséde des scripts VBScript ou JScript permettant de traiter les informations contenues dans le formulaire.

Les méthodes POST ou GET définissent le type de transmission à utiliser dans le traîtement du formulaire vers le serveur. POST envoie le fichier complet au serveur alors que GET se sert de la variable QUERY_STRING pour transmettre les informations.

Les informations saisies par un utilisateur dans les éléments d'un formulaire peuvent être récupérées par l'intermédiaire de l'objet Request.

La collection Form contient toutes les valeurs entrées dans les éléments d'un formulaire.

L'extraction des données à partir d'une collection Form s'effectue comme suit :

Request.Form

Les données retournées par l'utilisateur répondent à la construction suivante :

NomElt=Valeur&Nom_Elt2=Valeur2&...&Nom_EltN=ValeurN

Cette forme semble peu pratique pour une utilisation ultérieure des valeurs dans des programmes ASP.

Une autre forme permet d'extraire les valeurs plus précisément.

Request.Form(Nom_Elément)

Il est également possible de remplacer le nom de l'élément par un indice représentant la position de l'élément concerné, en sachant que l'élément le plus haut dans le formulaire, possède un indice égal à 1.

Request.Form(Indice)

Dans les deux cas, la valeur retournée est unique et se réfère exactement à l'élément spécifiée.

...
<input type="text" name="Nom">
<input type="text" name="Prénom">
<input type="text" name="Pseudonyme">
...
'Retourne la valeur de l'élément Nom
Response.Write Request.Form("Nom")
'Retourne la valeur de l'élément Prénom
Response.Write Request.Form("Prénom")
'Retourne la valeur de l'élément Pseudonyme
Response.Write Request.Form(3)
...

Par ailleurs, deux méthodes permettent de parcourir les éléments de la collection Form.

Enfin, la gestion des élements à valeurs multiples d'un formulaire peut s'effectuer également par l'intermédiaire de la structure ci-dessous.

<!-- Formulaire -->
<html>
  <body>
    <form action="reponse.asp" method="post">

      <input type="text" name="PrenomFrereSoeur">
      <input type="text" name="PrenomFrereSoeur">
      <input type="text" name="PrenomFrereSoeur">
      <input type="text" name="PrenomFrereSoeur">
      <input type="text" name="PrenomFrereSoeur">

    </form>
  </body>
</html>
<!-- Page de réponse reponse.asp -->
<html>
  <body>
    For Each objElement In Request.Form
      If Request.Form(objElement).Count > 1 Then
        For increment = 1 To Request.Form(objElement).Count
          Element = Element & Request.Form(objElement)(increment) _
                           & "<br>"
        Next
      Else
        Element = Element & Request.Form(objElement) & "<br>"
      End If
    Next
  </body>
</html>

9.3.2 / Les champs de saisie

Les formulaires peuvent contenir divers champs de saisie textuels.

<input type="type_champs" name="Identifiant">

Trois types de zone de saisie existent, il s'agit de :

Les champs de saisie doivent possèder chacun un nom permettant au fichier de traitement d'identifier chaque élément d'un formulaire.

Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <form action="traitement.asp" method="post">

      <u>Saisir un titre :</u><br>
      <input type="text" name="mot" size="20"><br>

      <textarea name="paragraphe" cols="20" rows="3">
        Saisissez un texte...
      </textarea>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>
  </body>
</html>
<!-- Fichier destinataire traitement.asp -->
<html>
  <body>

    <u>Le mot saisi par l'utilisateur est :</u><br>
    <h2><% = Request.Form("mot") %></h2>

    <u>Le texte saisi par l'utilisateur est :</u><br>
    <p><% = Request.Form("paragraphe") %></p>

  </body>
</html>

9.3.3 / Les cases à cocher

Les formulaires peuvent contenir des cases à cocher offrant plusieurs options possibles à l'utilisateur.

<input type="checkbox" name="Identifiant" value="Valeur">

Le nom de la case à cocher permet au fichier destinataire d'identifier l'élément du formulaire afin d'opérer un traitement approprié.

En général, les cases à cocher, autorisant le client à sélectionner plusieurs options, possèdent un identifiant unique avec des valeurs différentes.

<input type="checkbox" name="loisirs" value="Informatique">
<input type="checkbox" name="loisirs" value="Musique">
<input type="checkbox" name="loisirs" value="Cinéma">
<input type="checkbox" name="loisirs" value="Littérature">
<input type="checkbox" name="loisirs" value="Sport">
<input type="checkbox" name="loisirs" value="Art">

Les cases à cocher sélectionnées retournent ainsi, le nom des éléments suivi par chacune des valeurs concernées.

loisirs = Informatique, Littérature

Dans le cas où aucune valeur n'est spécifiée pour chacune des cases à cocher, il est nécessaire de dénommer différemment les éléments optionnels.

<input type="checkbox" name="Informatique">
<input type="checkbox" name="Musique">
<input type="checkbox" name="Cinéma">
<input type="checkbox" name="Littérature">
<input type="checkbox" name="Sport">
<input type="checkbox" name="Art">

Ici, les options sélectionnées se démarquent par un renvoi automatique d'une valeur on, les autres options étant simplement ignorées. En conséquence, en cas d'itérations, seulement les cases activées sont prises en compte dans le dénombrement. Ci-dessous seules les options Informatique et Littérature ont été côchées par le client.


Informatique = on 'correspond à 1
Littérature = on 'correspond à 2

L'extraction des données fournies par le client s'effectue par l'intermédiaire de l'objet Request associée à sa collection Form et le cas échéant l'identifiant des cases à cocher pour plus de précision.

Response.Write Request.Form
'retourne
loisirs = Informatique, Littérature

Response.Write Request.Form("loisirs")
'retourne
Informatique, Littérature
Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <form action="traitement.asp" method="post">

      <input type="checkbox" name="loisirs" value="Informatique">
        Informatique<br>
      <input type="checkbox" name="loisirs" value="Musique">
        Musique<br>
      <input type="checkbox" name="loisirs" value="Cinéma">
        Cinéma<br>
      <input type="checkbox" name="loisirs" value="Littérature">
        Littérature<br>
      <input type="checkbox" name="loisirs" value="Sport">
        Sport<br>
      <input type="checkbox" name="loisirs" value="Art">
        Art<br>
      <br>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>
  </body>
</html>
<!-- Fichier destinataire traitement.asp -->
<html>
  <body>

    <u>Les options sélectionnées par l'utilisateur sont :</u><br>
    <h2><% = Request.Form("loisirs") %></h2>
    <p>
    <%
      For Each objElement In Request.Form
          If Request.Form(objElement).Count > 1 Then
            For increment = 1 To Request.Form(objElement).Count
              Response.Write increment & " : " & _
                           Request.Form(objElement)(increment) & "<br>"
            Next
          Else
            Response.Write Request.Form(objElement) & "<br>"
          End If
      Next
    %>
    </p>
  </body>
</html>

9.3.4 / Les cases radio

Les formulaires peuvent contenir des cases radio proposant un choix parmi plusieurs options possibles.

<input type="radio" name="Identifiant" value="Valeur">

Le nom de la case radio permet au fichier destinataire d'identifier l'élément du formulaire afin d'opérer un traitement approprié.

En général, les cases radio, autorisant le client à sélectionner une seule et unique option, possèdent un identifiant unique avec des valeurs différentes.

<input type="radio" name="situation" value="Célibataire">
<input type="radio" name="situation" value="Marié(e)">
<input type="radio" name="situation" value="Concubinage">
<input type="radio" name="situation" value="Pacs">
<input type="radio" name="situation" value="Veuf(ve)">
<input type="radio" name="situation" value="Divorcé(e)">

La case radio sélectionnée retourne ainsi, le nom de l'élément suivi par la valeur concernée.

situation = Célibataire

Dans le cas où aucune valeur n'est spécifiée pour chacune des cases radio, il est nécessaire de dénommer différemment les éléments optionnels.

<input type="radio" name="Célibataire">
<input type="radio" name="Marié(e)">
<input type="radio" name="Concubinage">
<input type="radio" name="Pacs">
<input type="radio" name="Veuf(ve)">
<input type="radio" name="Divorcé(e)">

Ici, les options sélectionnées se démarquent par un renvoi automatique d'une valeur on, les autres options étant simplement ignorées.


Célibataire = on 

L'extraction des données fournies par le client s'effectue par l'intermédiaire de l'objet Request associée à sa collection Form et le cas échéant l'identifiant des cases radio pour plus de précision.

Response.Write Request.Form
'retourne
situation = Célibataire

Response.Write Request.Form("situation")
'retourne
Célibataire
Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <form action="traitement.asp" method="post">

      <input type="radio" name="situation" value="Célibataire">
        Célibataire<br>
      <input type="radio" name="situation" value="Marié(e)">
        Marié(e)<br>
      <input type="radio" name="situation" value="Concubinage">
        Concubinage<br>
      <input type="radio" name="situation" value="Pacs">
        Pacs<br>
      <input type="radio" name="situation" value="Veuf(ve)">
        Veuf(ve)<br>
      <input type="radio" name="situation" value="Divorcé(e)">
        Divorcé(e)<br>
      <br>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>
  </body>
</html>
<!-- Fichier destinataire traitement.asp -->
<html>
  <body>

    <u>L'option sélectionnée par l'utilisateur est :</u><br>
    <h2><% = Request.Form("situation") %></h2>
    <p>Vous serez redirigé vers :</p>
    <%
      Select Case Request.Form("situation")
        Case "Célibataire"
          Response.Redirect "celibataire.asp"
        Case "Marié(e)"
          Response.Redirect "marie.asp"
        Case "Concubinage"
          Response.Redirect "concubinage.asp"
        Case "Pacs"
          Response.Redirect "pasc.asp"
        Case "Veuf(ve)"
          Response.Redirect "veuf.asp"
        Case "Divorcé(e)"
          Response.Redirect "divorce.asp"
      End Select
    %>
  </body>
</html>

9.3.5 / Les listes de choix

Les formulaires peuvent contenir des listes de choix proposant un ou plusieurs items parmi une série d'options possibles.

<select name="Identifiant" size="taille" [multiple]>
  <option value="Valeur">Label</option>
  ...
</select>

Le nom de la liste de choix permet au fichier destinataire d'identifier l'élément du formulaire afin d'opérer un traitement approprié.

Si la taille de l'élément select est égale à 1, alors une liste déroulante apparaît. Si la taille est supérieure à 1, alors une liste simple apparaît. Dans ce dernier cas, l'attribut multiple permet de créer une liste simple à choix multiples.

Les liste de choix, autorisant le client à sélectionner une seule ou plusieurs options, possèdent un identifiant unique avec des valeurs différentes pour chacun des éléments optionnels.

<select name="situation" size="1">
  <option value="Célibataire">Célibataire</option>
  <option value="Marié(e)">Marié(e)</option>
  <option value="Concubinage">Concubinage</option>
  <option value="Pacs">Pacs</option>
  <option value="Veuf(ve)">Veuf(ve)</option>
  <option value="Divorcé(e)">Divorcé(e)</option>
</select>
<select name="loisirs" size="6" multiple>
  <option value="Informatique">Informatique</option>
  <option value="Musique">Musique</option>
  <option value="Cinéma">Cinéma</option>
  <option value="Littérature">Littérature</option>
  <option value="Sport">Sport</option>
  <option value="Art">Art</option>
</select>

Le (ou les) option(s) sélectionnée(s) retourne(nt) ainsi, le nom de l'élément suivi par la (ou les) valeur(s) concernée(s).

Dans le cas d'une sélection multiples, les options non-sélectionnées sont simplement ignorées. En conséquence, en cas d'itérations, seulement les options activées sont prises en compte dans le dénombrement.

situation = Célibataire
loisirs = Informatique, Musique, Cinéma

Dans le cas où aucune valeur n'est spécifiée pour chacune des options, alors les labels feront offices de valeur implicites.

<select name="loisirs" size="6" multiple>
  <option>Informatique</option>
  <option>Musique</option>
  <option>Cinéma</option>
  <option>Littérature</option>
  <option>Sport</option>
  <option>Art</option>
</select>
loisirs = Informatique, Musique, Cinéma

L'extraction des données fournies par le client s'effectue par l'intermédiaire de l'objet Request associée à sa collection Form et le cas échéant l'identifiant de la liste de choix pour plus de précision.

Response.Write Request.Form
'retourne
situation = Célibataire

Response.Write Request.Form("situation")
'retourne
Célibataire
Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <form action="traitement.asp" method="post">

      <select name="situation" size="1">
        <option value="Célibataire">Célibataire</option>
        <option value="Marié(e)">Marié(e)</option>
        <option value="Concubinage">Concubinage</option>
        <option value="Pacs">Pacs</option>
        <option value="Veuf(ve)">Veuf(ve)</option>
        <option value="Divorcé(e)">Divorcé(e)</option>
      </select>

      <select name="loisirs" size="6" multiple>
        <option value="Informatique">Informatique</option>
        <option value="Musique">Musique</option>
        <option value="Cinéma">Cinéma</option>
        <option value="Littérature">Littérature</option>
        <option value="Sport">Sport</option>
        <option value="Art">Art</option>
      </select>
      <br>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>
  </body>
</html>
<!-- Fichier destinataire traitement.asp -->
<html>
  <body>

    <u>L'option sélectionnée par l'utilisateur est :</u><br>
    <h2><% = Request.Form("situation") %></h2>
    <h2><% = Request.Form("loisirs") %></h2>

    <p>
    <%
      For Each objElement In Request.Form
        If Request.Form(objElement).Count > 1 Then
          For increment = 1 To Request.Form(objElement).Count
            Response.Write increment & " : " & _
                           Request.Form(objElement)(increment) & "<br>"
          Next
        Else
          Response.Write Request.Form(objElement) & "<br>"
        End If
      Next
    %>
    </p>

  </body>
</html>

9.3.6 / Les boutons

Les formulaires peuvent contenir plusieurs boutons permettant d'accomplir différentes actions telles que la soumission ou la réinitialisation.

Un formulaire HTML a la possiblité de contenir cinq types spécifiques de boutons.

<input type="submit" name="Identifiant">
<input type="reset" name="Identifiant">
<input type="image" name="Identifiant">
<input type="button" name="Identifiant">
<button name="Identifiant">...</button>

Parmi, ces éléments HTML, seuls les boutons de type submit et image sont capables de renvoyer des informations à une application ASP.

Les noms de ces boutons permettent au fichier destinataire d'identifier l'élément sur lequel l'utilisateur a cliqué.

Par ailleurs, la valeur du bouton est renvoyée à une application ASP, au même titre que toutes les autres valeurs d'éléments de la collection Form.

Ainsi, il devient possible de connaître quel bouton a été actionné et adapté en conséquence la réponse au client.

<form action="traitement.asp" method="post">
  ...
  <input type="submit" name="navigation" value="sommaire">
  <input type="submit" name="navigation" value="précédent">
  <input type="submit" name="navigation" value="suivant">
  <input type="submit" name="navigation" value="sommaire général">
</form>

Dans l'exemple ci-dessous, un clic sur le bouton ayant la valeur précédent provoque la soumission du formulaire, et partant, de ces données ainsi que de la valeur du bouton lui-même.

navigation = précédent

Dans le cas où chaque bouton doit posséder la même apparence sans label, la longueur de la chaîne de caractères retournée détient un rôle central. La méthode permettant de repérer facilement le bouton cliqué des autres peut se faire comme ceci :

<!-- Formulaire -->
<form action="traitement.asp" method="post">
  ...
  <input type="submit" name="sommaire" value="&nbsp;&nbsp;">
  Retourner au sommaire...
  <input type="submit" name="précédent" value="&nbsp;&nbsp">
  Aller à la page précédente...
  <input type="submit" name="suivant" value="&nbsp;&nbsp">
  Aller à la page suivante...
  <input type="submit" name="somm_gen" value="&nbsp;&nbsp">
  Retourner au sommaire principal...
</form>
<!-- Fichier de traîtement traitement.asp -->
If Len(Request.Form("sommaire")) Then
  Response.Write "Vous avez cliqué sur le bouton sommaire !"
ElseIf Len(Request.Form("précédent")) Then
  Response.Write "Vous avez cliqué sur le bouton précédent !"
ElseIf Len(Request.Form("suivant")) Then
  Response.Write "Vous avez cliqué sur le bouton suivant !"
ElseIf Len(Request.Form("somm_gen")) Then
  Response.Write "Vous avez cliqué sur le bouton sommaire général !"
EndIf

L'instruction Len() permet de tester la longueur de la chaîne de caractère retournée. Si la longueur est non-nul, les instructions s'exécutent sinon elles sont ignorées.

Les boutons de type image fonctionnent d'une manière différente.

<input 
           type="image"
           name="Identifiant"
           src="Adresse.url"
           alt="Texte">

Un clic sur ce genre de bouton, provoque l'envoi d'une chaîne de caractères, indiquant le nom du bouton et les coordonnées horizontale et verticale du point cliqué.

sommaire.x=3&sommaire.y=7

Ainsi, la récupération des données s'effectue par l'intermédaire de l'objet QueryString. Ainsi, il est possble de déterminer quel bouton a été actionné en testant la présence de son nom dans la chaîne de requête ou encore en s'appuyant sur sa zone cliquable.

Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <form action="traitement.asp" method="get">

      <input 
           type="image" 
           src="../../images/interface/fleche.gif"
           name="sommaire"
           alt="Retourner au sommaire"> 
      <input 
           type="image"
           src="../../images/interface/flecheg.gif"
           name="precedent"
           alt="Aller au document précédent"> 
      <input 
           type="image" 
           src="../../images/interface/fleched.gif"
           name="suivant"
           alt="Aller au document suivant"> 
      <input 
           type="image"
           src="../../images/interface/flechedbl.gif"
           name="som_gen"
           alt="Retourner au sommaire général">

    </form>
  </body>
</html>
<!-- Fichier destinataire traitement.asp -->
<html>
  <body>
    <%
      If Instr(Request.QueryString, "sommaire") > 0 Then
        Response.Redirect "../formulaire.html"
      End If
      If Instr(Request.QueryString, "precedent") > 0 Then
        Response.Redirect "../form_listechoix.html"
      End If
      If Instr(Request.QueryString, "suivant") > 0 Then
        Response.Redirect "../form_exemple.html"
      End If
      If Instr(Request.QueryString, "som_gen") > 0 Then
        Response.Redirect "../sommaire.html"
      End If
    %>
  </body>
</html>

9.3.7 / L'élément HTML de transfert de fichier

Les formulaires peuvent contenir un ou plusieurs éléments HTML de transfert de fichier.

<input type="file" name="Nom" size="Taille">

De tels éléments sont utilisés pour joindre des fichiers attachés aux informations textuelles d'un formulaire dans le cadre de messagerie électronique ou pour envoyer des fichiers directement sur le serveur.

L'élément de transfert de fichier comporte un champ de saisie destiné à contenir un chemin vers le fichier et un bouton permettant de parcourir l'arborescence de la machine cliente.

Différents composants COM (Components Object Model) permettent de traiter facilement les fichiers provenant des éléments d'envoi de fichier. Les deux premiers composants de la liste ci-dessous, permettent une utilisation gratuite, les autres sont payants.

Ces composants prennent en charge l'ensemble des fonctions nécessaires à la gestion et à la réception sur le serveur hôte, d'un fichier envoyé par un client.

Exemple [voir]
<!-- Formulaire de saisie telechargement.asp -->
<html>
  <body>
    <%
      Option Explicit

      Dim objet_Upload, Nouveau_Fichier 

      Set objet_Upload = Server.CreateObject("ASPSimpleUpload.Upload")

      If Len(objet_Upload.Form("Fichier")) > 0 Then
        Nouveau_Fichier = "/Uploads/" _
            & objet_Upload.ExtractFileName(objet_Upload.Form("Fichier"))
        If objet_Upload.SaveToWeb("Fichier", Nouveau_Fichier) Then
          Response.Write "Le fichier a été transféré correctement sur le serveur."
        Else
          Response.Write "" _
              & "Une erreur s'est produite lors de la sauvegarde du fichier.")
        End If
      End If
    %> 
    <form 
              method="POST" 
              action="telechargement.asp"
              enctype="multipart/form-data">
      <p>Sélectionnez un fichier pour un téléchargement :</p>
      <input type="file" name="Fichier" size="30">
      <input type="submit" name="upload" value="Télécharger">
    </form>
  </body>
</html>

9.3.8 / Exemple de formulaire

Le formulaire ci-dessous permet de mettre en oeuvre certains éléments à l'image des champs de saisie, d'une liste de choix de cases à cocher ainsi que de boutons.

Le formulaire permet de soumettre des informations fournies par le client, de plus, il contrôle également la validité des données transmises. Ainsi, un champs de saisie attendant des chiffres ne doit être composé que d'unbe valeur numérique sous peine de voir apparaître un message d'erreur, c'est le cas, notamment, du code postal.

Exemple [voir]
<html>
  <body>
    <%
      Function Validation(Val_Champs, Type_Champs)
        Dim Champs_Valide

        Champs_Valide = True

        Select Case LCase(Type_Champs)

          Case "sexe"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "nom"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "prénom"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "situation"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "email"
            If Len(Val_Champs) < 5 Or _
               Instr(1, Val_Champs, " ") <> 0 Or _
               InStr(1, Val_Champs, "@") < 2 Or _
              (InStrRev(Val_Champs, ".") < InStr(1, Val_Champs, "@") + 2) _
            Then
              Champs_Valide = False
            End If

          Case "adresse"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "cp"
            If Len(Val_Champs) <> 5 Or Not IsNumeric(Val_Champs) Then
              Champs_Valide = False
            End If

          Case "ville"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

          Case "pays"
            If Len(Val_Champs) < 2 Then Champs_Valide = False

          Case "commentaire"
            If Len(Val_Champs) = 0 Then Champs_Valide = False

        End Select

        Validation = Champs_Valide
      End Function

      Sub Affiche_Champs(Txt_Champs, index)
    %>
      <tr>
        <td align="right"><b><%= Txt_Champs %> : </b></td>
        <td>
          <input 
                 name="<%= Txt_Champs %>" 
                 type="text" 
                 value="<%= Request.Form(Txt_Champs) %>" 
                 tabindex="index">
        </td>
        <td>
        <%
          If champs_Errone(LCase(Txt_Champs)) Then
            Response.Write "<img src=""../../images/interface/erreur.gif""" _
                 & " border=""0"" width=""20"" height=""20"" alt=""Erreur !"">"
          End If
        %>
        </td>
      </tr>
    <%
      End Sub

      Sub Affiche_Bouton()
    %>
        <input type="submit" value="Soumettre" name="soumission">
        <input type="reset" value="Annuler" name="annulatiuon">
    <%
      End Sub

      Dim Champs
      Dim champs_Errone

      Set champs_Errone = Server.CreateObject("Scripting.Dictionary")

      For Each Champs in Request.Form
        If Validation(Request.Form(Champs), Champs) = False Then
          champs_Errone.Add LCase(Champs), True
        End If
      Next

      If Request.Form.Count <> 0 And champs_Errone.Count = 0 Then
    %>
    <form action="" method="post">
        <h2>Vous allez soumettre ces informations :</h2>
    <%
          For Each Champs In Request.Form
            Response.Write Champs & " : <b>" & Request.Form(Champs) _
                        & "</b><br>"
          Next
          Affiche_Bouton
    %>
      </form>
    <%
        Else
          If Request.Form.Count <> 0 Then
    %>
        <h2 style="color: #FF0000">
           Des erreurs ont été détectées !
        </h2>
        <p>
          Veuillez modifier les champs de saisie repérés par un icône.
        </p>
    <%
          End If
    %>
    <form 
          action="formulaire.asp" 
          method="post"
          name="formulaire">
      <table 
             border="0" 
             cellspacing="0"
             cellpadding="0">
        <tr>
          <td> </td>
          <td>
            <input 
                   type="radio"
                   name="sexe"
                   value="Mr"
                   CHECKED
                   tabindex="1">Monsieur<br>
            <input 
                   type="radio"
                   name="sexe" 
                   value="Mme">Madame<br>
            <input 
                   type="radio"
                   name="sexe"
                   value="Mlle">Mademoiselle
          </td>
        </tr>
        <tr>
          <td>
          <%
            Affiche_Champs "Nom", 2
            Affiche_Champs "Prénom", 3
          %>
          </td>
        </tr>
        <tr>
          <td><b>Situation :</b></td>
          <td>
            <select name="situation" size="1" tabindex="4">
              <option value="Célibataire" CHECKED>
                Célibataire
              </option>
              <option value="Marié(e)">
                Marié(e)
              </option>
              <option value="Concubinage">
                Concubinage
              </option>
              <option value="Pacs">
                Pacs
              </option>
              <option value="Veuf(ve)">
                Veuf(ve)
              </option>
              <option value="Divorcé(e)">
                Divorcé(e)
              </option>
            </select>
          </td>
        </tr>
        <tr>
           <td>
           <%
             Affiche_Champs "Email", 5
             Affiche_Champs "Adresse", 6
             Affiche_Champs "CP", 7
             Affiche_Champs "Ville", 8
             Affiche_Champs "Pays", 9
            %>
          </td>
        </tr>
        <tr>
          <td colspan="2" align="right">
            <textarea 
                  name="commentaire"
                  cols="23"
                  rows="3"
                  tabindex="10">
              Commentaire...
            </textarea>
          </td>
        </tr>
        <tr>
          <td colspan="2" align="center">
            <% Affiche_Bouton %>
          </td>
        </tr>
      </table>
    </form>
    <%
      End If
    %>
  </body>
</html>

10 / Les cookies

Les cookies sont des fichiers textuels transmis par une application Web dans le but de stocher des informations sur l'ordinateur de l'utilisateur.

Visite
Identite=MILLON%2DMARC%5CAdministrateur&Hote=127%2
E0%2E0%2E1&Choix=Veuf%28ve%29&Date=23%2F10%2F2
001+16%3A00%3A13&Navigateur=Mozilla%2F4%2E0+%28co
mpatible%3B+MSIE+6%2E0%3B+Windows+NT+5%2E0%3B+
%2ENET+CLR+1%2E0%2E2914%29&Adresse=%2FLAltruiste
%2Fcoursasp%2Fexemple%2Fcreation%5Fcookie%2Easp
localhost/
1024
257617920
29449230
154276752
29449163
*

Ces informations permettent de conserver des données relatives à l'identité du client et ses actions sur un site.

Bien que les cookies aient une mauvaise réputation auprès de certains internautes, les informations recélées par eux, ne concernent la plupart du temps que des activités préférentielles afin d'adapter le fonctionnement du site au client sans que ce-dernier n'ait à recommencer sempiternellement les mêmes processus pour parvenir à son but.

La création ou la mise à jour d'un cookie s'opère par l'intermédiaire de l'objet ASP Response associé à sa méthode Cookies().

Response.Cookies("nom_cookie")[("clé") | .Attribut] = Valeur

L'argument nom_cookie correspond à une chaîne de caractères qui représente le nom de l'élément et partant permet de lui affecter la ou les valeurs associées.

L'argument clé optionnel représente le nom d'une nouvelle entrée dans le cookie.

Les attributs de la collection cookies permettent d'accomplir certaines actions (voir ci-dessous).

La valeur peut être de n'importe quel type à condition qu'elle soit traduisible textuellement.

La lecture des informations contenues dans un cookie, s'effectue par l'intermédiaire de l'objet Request associé à sa méthode cookies().

Request.Cookies("nom_cookie")[("clé") | .Attribut]

Les différents éléments fonctionnent de la même façon que ci-dessous, hormis que dans ce cas, ils sont utilisés pour retrouver les valeurs associées aux cookies ou à leurs clés.

D'autre part, il existe un seul attribut valable dans ce contexte. En effet, l'unique attribut Haskeys vérifie si le cookie contient une ou plusieurs clés (voir ci-dessous).

<table>
<%
  For Each nom_cookie In Request.Cookies
    If Request.Cookies(nom_cookie).HasKeys Then
      For Each cle_cookie in Request.Cookies(nom_cookie)
         Response.Write "<tr><td>" & nom_cookie _
                              & "(" & cle_cookie & ") = " _
                              & Request.Cookies(nom_cookie)(cle_cookie) _
                              & "</td></tr>"
      Next
    Else
      Response.Write "<tr><td>" & nom_cookie & " = " _
                              & Request.Cookies(nom_cookie) _
                              & "</td></tr>"
    End If
  Next
%>
</table>

Dans l'exemple ci-dessous, l'instruction conditionnelle If...Then détermine si la collection de cookies contient des clés en utilisant l'attribut HasKeys.
En outre, les boucles For Each permettent de parcourir les éléments et sous-éléments de la collection cookies().

Par ailleurs, la propriété Count permet de comptabiliser le nombre d'éléments de la collection Cookies.

Response.Cookies.Count

Elle permet également de dénombrer le nombre de clés présentes dans un cookie particulier.

Response.Cookies("nom").Count

La suppression de toutes les clés d'un cookie s'effectue par l'intermédiaire d'une affectation d'une chaîne de caractère vide.

Response.Cookies("nom") = ""

Suite à cette action, la propriété count appliquée au cookie retourne une valeur nulle et l'attribut HasKeys retourne False.

Lorsqu'un cookie arrive à expiration, en principe, le cookie est supprimé de la machine cliente.

Les atributs
Attribut
Description
Domain = "URL_Domaine"
Si spécifié, le cookie est valable uniquement à partir du domaine spécifié (ex: www.laltruiste.com).
Expires = Date
indique la date d'expiration du cookie. Par défaut le cookie expire à la fin d'une session.
HasKeys = True | False
indique si le cookie contient une clé.
Path = "Chemin_Virtuel"
Si spécifié, le cookie est valable uniquement à partir du chemin d'accès fourni (ex: /coursasp). Pour une validité du cookie dans tout un site, il faut lui donner la valeur "/".
Secure = True | False
indique si le cookie doit être sécurisé.

Les cookies sont transmis dans un fichier unique placé dans le répertoire temporaire (temporary internet files) et dans un autre répertoire dénommé Cookies. S'il existe plusieurs cookies, les informations sont séparés par un astérisque (*).

<%
  Response.Cookies("Visite") = Date & " " & Time
  Response.Cookies("Visite")("Choix") = Request.Form("situation")
  Response.Cookies("Visite").Expires = DateAdd("d", 1, Date)
  Response.Cookies("Visite").path = "/"

  Response.Cookies("Adresse").Expires = DateAdd("d", 1, Date)
  Response.Cookies("Adresse").path = "/"
  Response.Cookies("Adresse") = Request.ServerVariables("PATH_INFO")
%>
Contenu du fichier cookie:mon_compte@hote
Visite
08%2F11%2F2002+13%3A44%3A32%5C&Choix=Veuf%28ve%29
localhost/
1024
2424444928
29525882
2518072384
29525796
*
Adresse
%2Fcoursasp%2F%2Fcookie%2Ftraitement%5Fcookie%2Easp
localhost/
1024
2424444928
29525882
2518472384
29525796
*
Exemple [voir]
<!-- Formulaire -->
<html>
  <head>
    <%
      Response.Cookies("Visite") = ""
    %>
  </head>
  <body>
    <h2>Faites un choix pour créer un cookie</h2>
    <form action="creation_cookie.asp" method="post">

      <input type="radio" name="situation" value="Célibataire">
        Célibataire<br>
      <input type="radio" name="situation" value="Marié(e)">
        Marié(e)<br>
      <input type="radio" name="situation" value="Concubinage">
        Concubinage<br>
      <input type="radio" name="situation" value="Pacs">
        Pacs<br>
      <input type="radio" name="situation" value="Veuf(ve)">
        Veuf(ve)<br>
      <input type="radio" name="situation" value="Divorcé(e)">
        Divorcé(e)<br>
      <br>

      <input type="submit" name="soumission" value="Soumettre">

    <table border="1" cellpadding="1" cellspacing="2">
      <tr>
        <td>Nombre de Cookies</td>
        <td><% Response.Write Request.Cookies.Count %></td>
      </tr>
      <tr>
        <td>Présence de clés dans Visite</td>
        <td><% Response.Write Request.Cookies("Visite").HasKeys %></td>
      </tr>
      <tr>
        <td>Nombre de Clés dans Visite</td>
        <td><% Response.Write Request.Cookies("Visite").Count %></td>
      </tr>
    </table>
  </body>
</html>
<!-- Fichier de traitement traitement.asp -->
<html>
  <head>
    <%
      Response.Cookies("Visite")("Date") = Date & " " & Time
      Response.Cookies("Visite").Expires = DateAdd("d", 1, Date)
      Response.Cookies("Visite").Domain = "www.laltruiste.com"
      Response.Cookies("Visite").path = "/"
      Response.Cookies("Visite")("Choix") = _
                      Request.Form("situation")
      Response.Cookies("Visite")("Adresse") = _
                      Request.ServerVariables("PATH_INFO")
      Response.Cookies("Visite")("Hote") = _
                      Request.ServerVariables("REMOTE_HOST")
      Response.Cookies("Visite")("Navigateur") = _
                      Request.ServerVariables("HTTP_USER_AGENT")
      Response.Cookies("Identite") = _
                      Request.ServerVariables("REMOTE_USER")
    %>
  </head>
  <body>
    <h2>Le cookie a été correctement créé.</h2>
    <table border="1" cellpadding="1" cellspacing="2">
      <tr>
        <td>Nombre de Cookies</td>
        <td><% Response.Write Request.Cookies.Count %></td>
      </tr>
      <tr>
        <td>Présence de Clés dans le cookie <i>Visite</i></td>
        <td><% Response.Write Request.Cookies("Visite").HasKeys %></td>
      </tr>
      <tr>
        <td>Nombre de Clés dans le cookie <i>Visite</i></td>
        <td><% Response.Write Request.Cookies("Visite").Count %></td>
      </tr>
      <tr>
        <td>Contenu du Cookie</td>
        <td><% Response.Write Request.Cookies("Visite") %></td>
      </tr>
      <tr>
        <td>Date Visite</td>
        <td><% Response.Write Request.Cookies("Visite")("Date") %></td>
      </tr>
      <tr>
        <td>Situation familiale</td>
        <td><% Response.Write Request.Cookies("Visite")("Choix") %></td>
      </tr>
      <tr>
        <td>Adresse URL</td>
        <td><% Response.Write Request.Cookies("Visite")("Adresse") %></td>
      </tr>
      <tr>
        <td>Hôte distant</td>
        <td><% Response.Write Request.Cookies("Visite")("Hote") %></td>
      </tr>
      <tr>
        <td>Navigateur Client</td>
        <td><% Response.Write Request.Cookies("Visite")("Navigateur") %></td>
      </tr>
      <tr>
        <td>Identité Client</td>
        <td><% Response.Write Request.Cookies("Identite") %></td>
      </tr>
    </table>
  </body>
</html>

11 / Les variables d'environnement HTTP avec Request

L'ensemble des variables d'environnement HTTP est contenu dans la collection de l'objet Request.

Request.ServerVariables

Diverses informations peuvent être récupérées par l'objet Request, associé à sa collection ServerVariables pointant des variables d'environnement HTTP.

Request.ServerVariables("VARIABLE_HTTP")

Les différentes données ainsi extraites, permettent de mettre en place des mécanismes particuliers, comme l'adaptation d'une application ASP à la configuration de l'ordinateur client ou à d'autres paramètres.

If InStr(Request.ServerVariables("HTTP_USER_AGENT"), "MSIE 6.0") > 0 Then
  'Accomplir certaines actions pour Internet Explorer 6...
Else
  'Accomplir d'autres actions...
End If
Les variables d'environnement HTTP
Variable Description
ALL_HTTP retourne tous les entêtes HTTP headers envoyés par le client.
ALL_RAW retrouve tous les entêtes dans un formulaire non-traîté.
APPL_MD_PATH retrouve les chemins (paths) metabase pour l'application ISAPI.DLL.
APPL_PHYSICAL_PATH retrouve le chemin physique correspondant au chemin metabase.
AUTH_PASSWORD retourne la valeur entrée dans un dialogue d'authentification du client.
AUTH_TYPE retourne la méthode d'anthentification que le serveur utilise pour valider les utilisateurs quand ils tentent d'accèder à un script protégé.
AUTH_USER retourne le nom d'utilisateur authentifié non-traîté.
CERT_COOKIE retourne l'identificateur unique pour le certificat du client.
CERT_FLAGS retourne un bit0 signé à 1 si le certificat du client est présent. ou un bit1 signé à si le certificat du client est invalide.
CERT_ISSUER retourne le champ émetteur du certificat du client (O=MS, OU=IAS, CN=user name, C=USA).
CERT_KEYSIZE retourne le nombre de bits dans la taille de la clé de la couche de support de sécurité.
CERT_SECRETKEYSIZE retourne le nombre de bits dans la clé privée du certificat du serveur.
CERT_SERIALNUMBER retourne le champ du numéro de série du certificat du client.
CERT_SERVER_ISSUER retourne le champ émetteur du certificat du serveur.
CERT_SERVER_SUBJECT retourne le champ sujet du certificat du serveur.
CERT_SUBJECT retourne le champ sujet du certificat du client.
CONTENT_LENGTH retourne la longueur du contenu donné par le client.
CONTENT_TYPE retourne le type de donnée du contenu.
GATEWAY_INTERFACE retourne les corrections des spécifications CGI utiisées par le serveur.
HTTP_<HeaderName> retourne la valeur stockée dans l'entête HeaderName.
HTTP_ACCEPT retourne la valeur de l'entête Accept.
HTTP_ACCEPT_LANGUAGE retourne une chaîne de caractères décrivant le langage à utiliser pour l'affichage du contenu.
HTTP_USER_AGENT retourne une chaîne de caractères décrivant le navigateur qui envoie la requête.
HTTP_COOKIE retourne la chaîne de caractères du cookie qui était inclusavec la requête.
HTTP_REFERER retourne une chaîne de caractères contenant l'URL de la page qui renvoie la requête à la page courante.
HTTPS retourne ON si la requête arrive au moyen d'un canal de sécurité SSL, sinon OFF.
HTTPS_KEYSIZE retourne le nombre de bits dans la taille de la clé de la couche de support de sécurité.
HTTPS_SECRETKEYSIZE retourne le nombre de bits de la clé privée du certificat du client.
HTTPS_SERVER_ISSUER retourne le champ émetteur du certificat du serveur.
HTTPS_SERVER_SUBJECT retourne le champ sujet du certificat du serveur.
INSTANCE_ID retourne l'identificateur pour les instances IIS dans un format textuel.
INSTANCE_META_PATH retourne le chemin metabase pour les instances de IIS qui répondent à la requête.
LOCAL_ADDR retourne l'adresse du serveur sur lequel la requête arrive.
LOGON_USER retourne la fenêtre rendant-compte que l'utilisateur est connecté à l'intérieur.
PATH_INFO retourne l'information sur le chemin supplémentaire donnée par le client.
PATH_TRANSLATED retourne une version traduite de PATH_INFO qui prend le chemin et exécute n'importe quel organisation virtual-to-physical nécessaire.
QUERY_STRING retourne une demande d'information stockée dans une chaîne de caractères suivant le caractère ? dans la requête HTTP.
REMOTE_ADDR retourne l'adresse IP de l'hôte distant créant la requête.
REMOTE_HOST retourne le nom de l'hôte créant la requête.
REMOTE_USER retourne le nom d'utilisateur envoyé par le client.
REQUEST_METHOD retourne la méthode utilisée pour créer la requête (GET, HEAD, POST).
SCRIPT_NAME retourne un chemin virtuel au script étant exécuté.
SERVER_NAME retourne le nom, l'alias DNS ou l'adresse IP du serveur hôte.
SERVER_PORT retourne le numéro de port auquel la requête a été envoyée.
SERVER_PORT_SECURE retourne une chaîne de caractères contenant soit 1, si le port est sécurisé, soit 0 dans le cas contraire.
SERVER_PROTOCOL retourne le nom et la révision du protocole d'information de la requête.
SERVER_SOFTWARE retourne le nom et la version du logiciel serveur.
URL retourne la partie de base de l'URL.
Exemple [voir]
<html>
  <body>

    <table>
    <%
      For Each var_http In Request.ServerVariables
        Response.Write "<tr><td>" & var_http & "</td><td>" _
                      & Request.ServerVariables(var_http) & "</td></tr>"
      Next
    %>
    </table>

  </body>
</html>

12 / Les chaînes de requêtes

Les chaînes de requêtes (QueryStrings) correspondent à des informations associées à l'adresse URL avec un point d'interrrogation comme séparateur.

http://www.laltruiste.com/page.asp?chaine_de_requete

Une chaîne de requête doit être constituée d'un ou plusieurs éléments dont chacun est associé à une valeur.Si la chaîne de requête contient plusieurs éléments, alors chaque couple élément/valeur doit être séparé par un caractère esperluette (&).

?element=valeur&element2=valeur2&...&elementN=valeurN

L'inconvénient principal des chaînes de requêtes réside dans le fait que les données transmises au serveur par ce biais sont visibles par les utilisateurs dans le champ Adresse de leur navigateur.

De plus, une chaîne de requêtes ne peut dépasser le maximum de 255 caractères.

Ainsi, l'utilisation de cette technique peut générer des problèmes de sécurité et des limitations quant à la taille des données à transmettre à une application Web.

Il existe deux méthodes pour l'utilisation des chaînes de requêtes :

Dans le premier cas, seules les informations contenues dans l'adresse indiquée par l'attribut action, seront envoyées par l'intermédiaire de la collection QueryString.

element=valeur

Dans le second cas, tous les éléments du formulaire seront transmis au moyen de la collection QueryString, à la page destinataire soit page.asp.

nom=DUPUIS&prenom=Michel

En conséquence, l'expression method="get" provoque la transmission complète et automatique d'un formulaire à partir d'une chaîne de requête.

L'objet Request associé à la collection QueryString permet d'extraire d'une chaîne de requêtes, l'ensemble des éléments et leur valeur y compris celle du bouton de soumission.

Request.QueryString
'Retourne
nom=DUPUIS&prenom=Michel&Soumettre=Soumission

Plus précisément, en spécifiant un nom d'élément en tant qu'argument de la collection QueryString, il devient possible de récupérer essentiellement la valeur liée.

Request.QueryString("nom_element")
'Retourne pour prenom
Michel

Un unique élément de chaînes de requêtes peut posséder plusieurs valeurs.

URL?element=valeur1&element=valeur2&...&element=valeurN

L'extraction des valeurs s'opère en employant l'instruction suivante :

Request.QueryString("nom_element")(index)

L'argument index correspond à une valeur entière.

Le nombre total de valeurs d'un élément est accessible à partir de la propriété Count.

Request.QueryString("nom_element").Count

Afin d'éviter d'éventuels problèmes d'encodage de caractères, l'objet Server associé à sa méthode URLEncode() permet d'appliquer une conversion adéquate d'une chaîne de caractères destinées à devenir une chaîne de requêtes.

Server.URLEncode("chaînes de caractères")
Exemple [voir]
<!-- Formulaire -->
<html>
  <body>
    <h2>Formulaire avec method="POST"</h2>
    <form 
          action="traitement_querystring.asp
                             ?type=post&form=un&form=deux&form=trois"
          method="post"
          name="formPost">

      <u>Saisir un titre :</u><br>
      <input type="text" name="Titre" value="Fatrasie" size="20"><br>

      <textarea name="Paragraphe" cols="30" rows="4">
        La chose va très mal
        Où point n'a de justice
        La chose va très mal
        Dit un veau de métal
      </textarea>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>

    <h2>Formulaire avec method="GET"</h2>
    <form 
          action="traitement.asp"
          method="get"
          name="formGet">

      <u>Saisir un titre :</u><br>
      <input type="text" name="Titre" value="Fatrasie" size="20"><br>

      <textarea name="Paragraphe" cols="30" rows="4">
        La chose va très mal
        Où point n'a de justice
        La chose va très mal
        Dit un veau de métal
      </textarea>

      <input type="submit" name="Soumettre" value="Soumission">

    </form>

  </body>
</html>

<html>
  <body>
    <table>
      <tr>
        <th>Elément</th>
        <th>Valeur</th>
      </tr>
      <%
        For Each chaine In Request.QueryString

          If Request.QueryString(chaine).Count > 1 Then

            For index = 1 To Request.QueryString(chaine).Count

              Response.Write "<tr><td><u>" & chaine & "(" & index _
                                   & ") </u></td><td><b>" _
                                   & Request.QueryString(chaine)(index) _
                                   & "</b></td></tr>"

            Next

          Else

            Response.Write "<tr><td><u>" & chaine _
                                   & "</u></td><td><b>" _
                                   & Request.QueryString(chaine) _
                                   & "</b></td></tr>"

          End If

        Next
      %>
    </table>
  </body>
</html>

13 / Les certificats clients

L'authentification par certificat client demeure une méthode fiable pour contrôler l'accès à des applications ASP.

En effet, le système consiste à la transmission automatique du certificat client de l'utilisateur par le biais de son navigateur au serveur, après une tentative de connexion à une application Web sécurisée.

Pour cela, le serveur hôte doit évidemment être configuré en conséquence, c'est-à-dire, avoir sélectionné dans les propriétés d'un site web ou d'un répertoire virtuel, Activer certificat client et Requiert certificats client pour que le serveur demande les certificats clients.

Ensuite, le développeur doit écrire des programmes capables d'exploiter les informations contenues dans ces certificats clients.

Enfin, l'utilisateur doit également obtenir auprès d'un organisme tiers intègre, un certificat client, c'est-à-dire une méthode d'identification numérique contenant des informations relative à l'identité de l'utilisateur (nom, prénom, adresse, numéro de téléphone, etc.) en quelque sorte une carte d'identité électronique.

Evidemment, si toutes ces conditions ne sont pas réunies, alors la collection ClientCertificate demeurera vide.

La collection ClientCertificate contient l'ensemble des champs de certification provenant d'une certificat client émis par le navigateur Web de;l'utilisateur.

Request.ClientCertificate(Clé[Sous_Champs])

L'argument Clé représente le nom d'un champs de certification.

Request.ClientCertificate(ValidFrom)
Les arguments Clé
Argument Valeur
Certificate retourne une chaîne de caractères contenant le flux binaire du contenu complet d'un certificat client dans le format ASN.1.
Flags correspond à un jeu d'indicateurs fournissant des informations additionnelles à un certificat client.
ceCertPresentindique si le certificat est présent.
ceUnrecognizedIssuerindique si la dernière certification dans cette chaîne provient d'un distributeur inconnu.
Issuer retourne une chaîne de caractères qui contient une liste de valeurs de Sous_Champs.
SerialNumber retourne une chaîne de caractères qui contient le numéro de série de certification (ex: 01-G4-2S-E6).
Subject retourne une chaîne de caractères qui contient une liste de Sous_Champs à propos du sujet du certificat client.
ValidFrom retourne une date spécifiant quand le certificat devient valide.
ValidUntil retourne une date spécifiant l'expiration du certificat client.

Le paramètre optionnel Sous_Champs permet de retrouver un champs individuel dans le sujet (Subject) ou le distributeur (Issuer) des clés.

Request.ClientCertificate(IssuerCN)
Les sous-champs
Argument Valeur
C indique le nom de la région ou du pays d'origine.
CN indique le nom commun de l'utilisateur.
GN indique un nom donné.
i indique un jeu d'initiales.
L indique une localité.
O indique le nom de la compagnie ou de l'organisation.
OU indique le nom de l'unité organisationnelle.
S indique un état ou une province.
T indique la qualité d'une personne ou d'une organisation.
Exemple [voir]
<html>
  <body>
    <table>
      <%
        If Request.ClientCertificate("Flags") And ceCertPresent then
          For Each cle in Request.ClientCertificate
            Response.Write "<tr><td>" & cle & "</td><td>" _
                             & Request.ClientCertificate(cle) _
                             & "</td></tr>")
          Next
        Else
          Response.Write "Vous ne pouvez accéder aux " _
                                  & "informations du certificat client !"
        End If
      %>
    </table>
  </body>
</html>

14 / Les erreurs sous Active Server Pages

Il existe deux types d'erreurs dans les scripts ASP, les erreurs de syntaxe et les erreurs d'exécution dont chacune provoque la plupart du temps l'arrêt du déroulement du programme et l'affichage d'une page expliquant l'erreur.

Les erreurs de syntaxe, généralement facile à détecter, consistent en des fautes de grammaire dans la structure du code comme un guillemet oublié dans une instruction en nécessitant, ou d'orthographe sur les éléments du langage comme Reponse.Write à la place de Response.Write.

Les erreurs d'exécution sont parfois plus insidieuses puisque le code semble correct, tout en provoquant un échec lors de l'interprétation. Cet échec pouvant être concrétisé par l'interruption du programme et la fameuse page d'explication de l'erreur, ou par l'affichage d'un résultat totalement imprévu sans que le déroulement du script ait été interrompu.

Il existe donc divers types d'erreurs d'exécution.

Les erreurs logiques ne produisent généralement qu'un résultat erroné alors que les autres demeurent le plus souvent critiques.

<%
  dim i, j, k
  i = 10
  j = 2
  k = 20
  ' Ceci est une erreur logique dûe à
  ' des priorités d'opérateurs erronées
  Response.Write "Le produit de j * k auquel on ajoute i" _
                  & " est égal à : " & i + j * k
  ' retourne 240 alors qu'on attend 50
%>

<%
  Dim i, j
  i = 1000
  j = 0
  ' Ceci génére une erreur d'exécution de script
  Response.Write "La division de i par j est égal à : " _
                  & i / j
  ' L'erreur provoque l'interruption du programme
  ' et l'affichage d'une page descriptive de l'erreur
%>

Type d'erreur :
Erreur d'exécution Microsoft VBScript (0x800A000B)
Division par zéro
/laltruiste/coursasp/exemples/testerreur.asp, line 7

Ainsi, il existe une différence fondamentale entre les erreurs fatales au traitement d'une application ASP et celles produisant seulement des résultats imprévisibles. Les premières peuvent être rapidement localisées gràce au message d'erreur fournissant le fichier et le numéro de lignes où l'erreur s'est produite, alors que pour les secondes le déboguage peut devenir rapidement diffcile si le programme est complexe car aucune indication n'est fournie par l'interpréteur.

Le serveur IIS détecte automatiquement les erreurs et fait appel à la méthode Transfer associé à l'objet Server pour la génération d'une page explicative 500-100.asp. Cette dernière est un document prédéfini et stocké dans le répertoire C:\WINNT\Help\iisHelp\common. En outre, elle est reconnaissable au texte ci-dessous présent dans le message d'erreur affiché sur le navigateur du client.

HTTP 500.100 - Erreur interne au serveur - Erreur ASP
Services Internet (IIS)

14.1 / La prévention des erreurs

Il est tout à fait possible d'éliminer certains bogues récurrents du code ASP en adoptant des méthodes d'écriture simples et efficaces.

L'indentation du code permet de déceler facilement diverses étourderies comme le montre l'exemple ci-dessous.

<%
Set obj_Recordset = Server.CreateObject("ADODB.Recordset")
obj_Recordset.Open "Select * from Fiche","DSN=personnel"
With Obj_Recordset
  Compteur = .Fields.Count - 1
  Dim i
  Do While Not .EOF
    For i = 0 To Compteur
      .Fields.Item(i)
    %Next
    .MoveNext
  Loop
  .Close
  Set obj_Recordset = Nothing
%>

<%
  Set obj_Recordset = Server.CreateObject("ADODB.Recordset")
  obj_Recordset.Open "Select * from Fiche","DSN=personnel"
    With Obj_Recordset
      Compteur = .Fields.Count - 1
      Dim i
      Do While Not .EOF
        For i = 0 To Compteur
            .Fields.Item(i)
        Next
        .MoveNext
      Loop
      .Close
  End With
  Set obj_Recordset = Nothing
%>

L'adoption de méthodes de convention pour nommer des variables peut être utile afin d'éviter des erreurs de nommage.

Dim Compteur
Dim CompteurOk
Dim CompteurNom

Dim IntCompteur
Dim BoolCompteur
Dim StrCompteur

La déclaration Option Explicit permet d'éviter les dysfonctionnements dûs à des variables déclarées implicitement, c'est-à-dire sans avoir utilisé auparavant l'instruction Dim.

Option Explicit
Dim IntCompte_total, IntTVA
IntCompte_total = 1000000

'Le calcul provoque une erreur d'exécution critique 
'dûe à deux variables mal orthographiées.
'Autrement, le résulat aurait été 0 à lap lace de 196000
Response.Write "Le taux de TVA permet de récupérer la somme de " _
             & IntCompte_total & " Francs : " _
             & (IntCompt_total * inttva) / 100 & " Francs"

La conversion des variables dans des types de données adéquats au moyen de fonctions VBScript, donne le moyen de se prémunir contre les erreurs relatives aux affectations avec de mauvais types de données étant donné le type de variable courant dans les langages de script, soit Variant.

Dim IntResultat, BoolResultat, Chaine
IntResultat = Cint(Variable_Variant)
BoolResultat = CBool(Variable_Variant)
Chaine = CStr(Variable_Variant)

Une lecture attentive et réfléchie de son code afin de détecter toutes les erreurs éventuelles dûes à la saisie de l'utilisateur ou à la transmission de valeurs de pages en pages ou encore à l'existence des pages ou fichiers pointées par des instructions demeure la meilleure solution d'éradication des erreurs.

<!-- Une erreur évidente s'est glissée dans le script -->
<%
  Dim objError
  Dim objConnection
  Dim objRecordset

  Set objConnection = Server.CreateObject("ADODB.Connection")
  Set objRecordset = Server.CreateObject("ADODB.Recordset")

  objConnection.Open strConnection

  objRecordset.Open "select Nom, Prénom from Personnel", objConn

  objRecordset.Close
  objConnection.Close
  Set objRecordset = Nothing
  Set objConnection = Nothing
%>

Enfin, la dernière étape avant de mettre l'application à la disposition des clients, reste essentielle est impérative. Elle consiste à tester rigoureusement l'ensemble de l'application en se mettant à la place de l'utilisateur final en se soumettant au parcours que ce-dernier aura à subir. Par la même occasion, cela donnera un aperçu de la convivialité et de l'ergonomie du site...

14.2 / La gestion d'erreurs sous VBScript

La gestion des erreurs sous VBScript se résume à l'utilisation de l'instruction On Error Resume Next et à un contrôle méticuleux du code afin de détecter tous les cas potentiels d'erreurs.

On Error Resume Next

En fait l'instruction VBScript On Error Resume Next placée au sommet du script, permet d'activer la gestion des erreurs dans des pages ASP.

Plus précisément, cette instruction évite l'interruption du déroulement d'un script lorsqu'une erreur se produit, et partant, les erreurs peuvent être traitées par le programmeur à l'aide de l'objet Err conservant les références de l'erreur en cours.

Une autre instruction On Error Goto 0 permet de désactiver la gestion d'erreur.

On Error Goto 0

L'objet Err constituant la solution de gestion des erreurs d'exécution ou de syntaxe, contient cinq informations, le numéro, la description et la source de l'erreur ainsi qu'un identificateur contextuel et l'adresse d'un fichier d'aide, toutes accessibles par des propriétés, et de plus possède la capacité de générer une erreur délibérément, ou d'effacer les information précitées par l'intermédiaire de deux méthodes.

Err.Propriété | Méthode

A l'aide de l'instruction On Error Resume Next pour la détection des erreurs et de l'objet Err pour leur gestion, il devient possible de concevoir des parades efficaces contre des dysfonctionnements prévisibles des applications ASP. Bien que la tâche se révéle fastidieuse, il est nécessaire de mettre en place un gestionnaire d'erreurs pour les programmes ASP, il n'y a rien de plus désagréable pour un utilisateur, surtout dans le cadre du commerce électronique, de se retrouver devant un affichage inattendu et de surcroît déplaisant.

Exemple [voir]
<!-- METADATA type="typelib" 
             FILE="C:\Program Files\Fichiers communs\System\ado\msado15.dll" -->
<%@ LANGUAGE="VBScript" %>
<html>
  <head>
    <%
      Function Verif_coll_Errors (obj_Connection)
        Dim obj_Error
        If Err.Number <> obj_Connection.Errors(0).Number Then
          Exit Function
        End If
        If obj_Connection.Errors.Count > 0 Then
          For Each obj_Error in obj_Connection.Errors
            If obj_Error.Number <> 0 Then
              Response.Write "" & _
                "<table border=1 cellpadding=1 cellspacing=2>" & _
                "<tr><th>Propriété</th><th>Valeur</th>" & _
                "</tr><tr><th>Numéro</th><td>" & obj_Error.Number & "</td></tr>" & _
                "<tr><th>Erreur native</th><td>" & obj_Error.NativeError & "</td></tr>" & _
                "<tr><th>Etat SQL</th><td>" & obj_Error.SQLState & "</td></tr>" & _
                "<tr><th>Source</th><td>" & obj_Error.Source & "</td></tr>" & _
                "<tr><th>Description</th><td>" & obj_Error.Description & "</td></tr>" & _
                "</table>"
              Verif_coll_Errors = True
            End If
          Next
        Else
        Verif_coll_Errors = False
        End If
      End Function

      On Error Resume Next
    %>
  </head>
  <body>
    <%
      Dim Ch_SQL
      Ch_SQL = "SELECT Noms, Prenom, Age, Qualites," _
                  & " eMail, Adresse, Situation FROM Fiche"
      Set obj_Recordset = Server.CreateObject("ADODB.Recordset")
      obj_Recordset.Open Ch_SQL,"DSN=personnel"
        If Verif_coll_Errors(obj_Recordset.ActiveConnection) = False Then
    %>
      <table border="1" cellpadding="3" align="center">
        <tr>
          <td colspan="6">Fiches signalétiques des personnels</td>
        </tr>
        <tr>
          <td>Nom</td>
          <td>Prénom</td>
          <td>Age</td>
          <td>Qualité</td>
          <td>eMail</td>
          <td>Adresse</td>
        </tr>
    <%
        Do While Not obj_Recordset.EOF
    %>
        <tr>
          <td><%=obj_Recordset("Nom")%></td>
          <td><%=obj_Recordset("Prenom")%></td>
          <td><%=obj_Recordset("Age")%></td>
          <td><%=obj_Recordset("Qualite")%></td>
          <td><%=obj_Recordset("eMail")%></td>
          <td><%=obj_Recordset("Adresse")%></td>
        </tr>
    <%
          obj_Recordset.MoveNext
        Loop
      End If
      obj_Recordset.Close
      Set obj_Recordset = Nothing
    %>
      </tr>
    </table>
  </body>
</html>

14.3 / La gestion d'erreur sous JScript

D'aucuns affirment que la gestion des erreurs sous JScript se révèle plus performante que celle de VBScript. Cependant elle se révélerait plus difficle à mettre en oeuvre.

L'instruction try...catch permet un traitement des erreurs en désignant un bloc de code à essayer (try), un autre permettant de gérer les erreurs (catch) provenant du premier et un dernier est exécuté subséquemment au traitement des erreurs de façon non-conditionnelle.

try
{
  //Instructions à essayer;
  [throw Exception]
}
catch(Exception)
{
  //Instructions de gestion d'erreurs;
}
[finally
{
  //Instructions à exécuter suite au traitement des erreurs;
}]

L'instruction throw permet de déclencher une exception personnalisée dans le bloc d'instructions à essayer.

L'instruction try permet de tester un bloc d'instructions. Si ce dernier retourne une exception, c'est-à-dire a provoqué une erreur, alors l'instruction catch saisira le nom de l'exception par l'intermédiaire de son argument et la gérera, à l'aide de ses instructions.

L'objet Error permet de conserver diverses informations relatives à l'erreur. Ces informations sont accessibles à l'aide de deux propriétés, number et description indiquant respectivement le numéro et la description de l'erreur.

Le bloc de code de l'instruction finally est toujours exécuté, même si les blocs de try ou catch possèdent une instruction de renvoi ou que l'erreur a été regénéré dans ce-dernier. Toutefois, si une erreur d'exécution non traitée se produisait dans le bloc de catch notamment, alors le bloc de finally ne serait pas exécuté.

Objet_Error.Propriété

L'objet Error est utilisable dans le bloc de code de traitement des erreurs afin de connaître l'identité de l'erreur et éventuellement de lui appliquer en conséquence, une réponse adaptée.

Le langage JScript est sensible au niveau de la casse, ainsi, il faut veiller à rédiger systématiquement toutes les instructions en casse minuscule, pour le reste, il est possible de pratiquer selon les goûts et les couleurs de chacun.

...
catch(e)
{
  alert("Une erreur est survenue.\n Numéro : " + e.number 
           + " Description : " + e.description);
}
...
Exemple [voir]
<!-- METADATA type="typelib" 
             FILE="C:\Program Files\Fichiers communs\System\ado\msado15.dll" -->
<%@ LANGUAGE="JScript" %>
<html>
  <head>
    <%
      var ch_Connection;
      ch_Connection = "Provider=Microsoft.Jet.OLEDB.4.0;"
                 + " Data Source=H:\personnel.mdb";

      function Verif_Error (oConn)
      {
        if (oConn.Errors.Count > 0)
        {
          for(var oError = new Enumerator(oConn.Errors);
            !oError.atEnd(); oError.moveNext())
          {
            Response.Write("" 
                  + "<table border=1 cellpadding=1 cellspacing=2>"
                  + "<tr><th>Propriété</th><th>Valeur</th>"
                  + "</tr><tr><th>Numéro</th><td>" 
                          + oError.item().Number + "</td></tr>"
                  + "<tr><th>Erreur native</th><td>" 
                          + oError.item().NativeError + "</td></tr>"
                  + "<tr><th>Etat SQL</th><td>" 
                          + oError.item().SQLState + "</td></tr>"
                  + "<tr><th>Source</th><td>" 
                          + oError.item().Source + "</td></tr>"
                  + "<tr><th>Description</th><td>" 
                          + oError.item().Description + "</td></tr>"
                  + "</table>");
          }
        }
      }
    %>
  </head>
  <body>
    <%
      var obj_Error;
      var Objet_Connection;
      var Objet_Recordset;

      Objet_Connection = Server.CreateObject("ADODB.Connection");
      Objet_Recordset = Server.CreateObject("ADODB.Recordset");

      Objet_Connection.Open(ch_Connection);

      try
      {
        Objet_Recordset.Open("select *Nom from Fiche", Objet_Connection);
        Response.Write("<table border='1' cellpadding='3' align='center'>"
         + "<tr>"
         + "  <td colspan='6'>Fiches signalétiques des personnels</td>"
         + "</tr>"
         + "<tr>"
         + "  <td>Nom</td>"
         + "  <td>Prénom</td>"
         + "  <td>Age</td>"
         + "  <td>Qualité</td>"
         + "  <td>eMail</td>"
         + "  <td>Adresse</td>"
         + "</tr>");
        while (!Objet_Recordset.EOF)
        {
          Response.Write("<tr>"
           +  "<td>" + Objet_Recordset("Nom") + "</td>"
           +  "<td>" + Objet_Recordset("Prenom") + "</td>"
           +  "<td>" + Objet_Recordset("Age") + "</td>"
           +  "<td>" + Objet_Recordset("Qualite") + "</td>"
           +  "<td>" + Objet_Recordset("eMail") + "</td>"
           +  "<td>" + Objet_Recordset("Adresse") + "</td>"
           + "</tr>");
          Objet_Recordset.MoveNext();
        }
        Response.Write("</table>");
      }
    catch (e)
      {
        Verif_Error(Objet_Connection);
      }
    finally
      {
        if (Objet_Recordset.State == adStateOpen)
        Objet_Recordset.Close();
        Objet_Connection.Close();
        Objet_Recordset = null;
        Objet_Connection = null;
      }
    %>
  </body>
</html>

14.4 / Personnalisation des pages d'erreurs

Le langage ASP permet une personnalisation des pages d'erreur. Plutôt que d'utiliser celles fournies par défaut, il est possible de créer sa propre page d'erreur contenant des informations identiques.

En effet, l'objet ASPError a la fonction de fournir par l'intermédiaire de ses propriétés, les informations relatives à l'erreur qui s'est produite dans une application ASP.

ASPError.propriété

L'objet ASPError possède neuf propriétés dont quatre permettent de localiser le fichier, la ligne, la colonne et le code source où l'erreur s'est produite, et les autres identifient et décrivent l'erreur.

La création de l'objet ASPError s'effectue par l'intermédiaire de la méthode GetLastError de l'objet Server.

Set objet_ASPError = Server.GetLastError()

Il suffit, désormais de créer une page capable d'extraire les informations relative à l'erreur à partir de l'objet ASPError et de ses propriétés en prenant toutefois certaines précautions de formatage ou dispositions conditionnelles.

La propriété ASPCode retourne régulièrement une valeur lorsque des composants COM externes sont impliqués dans des erreurs. Sinon pour la plupart des erreurs de script, cette valeur reste indéfinie.

A l'instar de ASPCode, la propriété ASPDescription retourne une valeur indéfinie pour la plupart des erreurs de script, sauf celles impliquant un appel de méthode non-valide vers un objet ASP intrinsèque.

La valeur retournée par la propriété Number étant de type hexadécimal, son formatage devrait ressembler à la ligne de code ci-dessous.

Response.Write "0x" & Hex(Objet_ASPError.Number)

Enfin, la propriété Source retourne une chaîne de caractères représentant le code source de l'erreur. Mais ce-dernier pouvant contenir des éléments HTML, il est recommandé d'appliquer à cette valeur la méthode HTMLEconde de l'objet Server.

Response.Write Server.HTMLEncode(Objet_ASPError.Description)

La page d'erreur réalisée, il faut maintenant configurer le serveur IIS afin qu'à chaque erreur HTTP de type 500;100 (code d'erreur 500 : sous-code d'erreur 100) la page d'erreur personnalisée apparaisse à la place de celle par défaut.

Pour cela, il suffit de sélectionner un répertoire dans le Gestionnaire de services Internet (IIS) (Démarrer -> Programmes -> Outils d'administration), puis d'actionner le bouton droit de la souris, afin d'afficher le menu contextuel, d'effectuer un clic sur Propriétés pour voir apparaître une boîte à onglet Propriétés [du répertoire] sur laquelle il faut, enfin, cliquer sur Messages d'erreur personnalisés.

Configuration pour la personnalisation des pages d'erreur de type 500-100.

A partir de cet onglet, il faut sélectionner tout en bas de la liste déroulante, la ligne 500;100 URL /iisHelp/common/500-100.asp, puis cliquer sur Modifier les propriétés... pour voir une boîte de dialogue Propriétés du mappage des erreurs invitant à saisir une adresse URL vers la page d'erreur personnalisée dans le champ URL.

Un clic sur le bouton OK valide le changement, et à partir de ce moment, la page d'erreur 500-100 personnalisée sera affichée en cas d'erreur de syntaxe ou d'exécution dans une application Active Server Pages fonctionnant dans le répertoire sélectionné dans le Gestionnaire de services Internet (IIS).

Il est possible de revenir à la configuration initiale en cliquant sur le bouton Utiliser les valeurs par défaut de l'onglet Messages d'erreur personnalisés.

La page d'erreur de type 500;100 par défaut reste le meilleur moyen d'apprendre comment construire correctement son propre fichier personnalisé. Elle se trouve à l'adresse physique suivante :

C:\WINNT\Help\iisHelp\common\500-100.asp

14.5 / Les erreurs Active Server Pages

Les erreurs ASP surviennent en général lorsqu'un objet ou un composant est responsable de dysfonctionnement.

La liste des erreurs ci-dessous exposent les erreurs les plus courantes générées dans une application ASP.

Les codes d'erreurs
Code Message Description
ASP 0100 Out of memory indique une incapacité d'alloué la mémoire requise.
ASP 0101 Unexpected error indique que la fonction retourne une erreur inattendue.
ASP 0102 Expecting string input indique qu'une fonction attend une chaîne de caractères comme entrée.
ASP 0103 Expecting numeric input indique qu'une fonction attend un nombre comme entrée.
ASP 0104 Operation not Allowed indique qu'une opération n'est pas allouée.
ASP 0105 Index out of range indique qu'un index de tableau est en dehors des limites.
ASP 0106 Type Mismatch indique que le type de donnée rencontré est impossible à gérer.
ASP 0107 Stack Overflow indique que les données traitées sont au-dessus des limites autorisées.
ASP 0115 Unexpected error indique qu'une erreur exception_name récupérable s'est produite dans un objet externe, le script ne pouvant poursuivre son exécution.
ASP 0177 Unexpected error indique un échec de Server.CreateObject provoqué par un ProgID invalide.
ASP 0190 Unexpected error indique qu'une erreur récupérable s'est produite au moment de la libération d'un objet externe.
ASP 0191 Unexpected error indique qu'une erreur récupérable s'est produite dans la méthode OnStartPage d'un objet externe.
ASP 0192 Unexpected error indique qu'une erreur récupérable s'est produite dans la méthode OnEndPage d'un objet externe.
ASP 0193 OnStartPage Failed indique qu'une erreur s'est produite dans la méthode OnStartPage d'un objet externe.
ASP 0194 OnEndPage Failed indique qu'une erreur s'est produite dans la méthode OnEndPage d'un objet externe.
ASP 0240 Script Engine Exception indique qu'un moteur de script a lancé une exception exception_name dans un object_name provenant d'un object_name.
ASP 0241 CreateObject Exception indique que la méthode CreateObject d'un object_name a provoqué une exception exception_name.
ASP 0242 Query OnStartPage Interface Exception La méthode OnStartPage ou OnEndPage d'un objet de requête object_name a provoqué une exception exception_name.

15 / Interaction avec XML

Le Modèle d'Objet de Document (DOM) est une interface de programmation d'applications (API : Applications Programming Interface) permettant à l'Active Server Pages de traiter des documents XML.

Le modèle d'objet de document de Microsoft fournit pusieurs outils destinés à l'analyse, l'élaboration et la déconstruction d'un document XML.

Objet Description
DOMDocument représente le noeud racine du document XML.
IXMLDOMDocument2 représente une extension de DOMDocument qui supporte le schema caching, la validation en cours d'exécution, et une manière de changer le support de langage XPath.
IXMLDOMNamedNodeMap fournit une itération et un accès par nom vers la collection d'attributs.
IXMLDOMNode représente un noeud unique dans l'arborescence d'un document.
IXMLDOMNodeList supporte des opérations d'accès itératives et indexées sur la collection active d'objets IXMLDOMNode.
IXMLDOMParseError retourne les informations détaillées à propos de la dernière erreur en incluant le numéro, la ligne, la colonne et une description de l'erreur.
IXMLHTTPRequest fournit le support de protocole côté client pour les communications avec les serveurs HTTP.
IXTLRuntime exécute des méthodes qui peuvent ête appelées depuis des feuilles de style XSL.
ServerXMLHTTP
IServerXMLHTTPRequest
dérivé de IXMLHTTPREQUEST, fournit les méthodes et les propriétés permettant d'établir une connexion HTTP entre des fichiers ou des objets sur des serveurs différents du Web.
IXMLDOMAttribute représente un attribut.
IXMLDOMCDATASection représente un bloc de données de caractères non-analysées.
IXMLDOMCharacterData fournit des méthodes de manipulation de texte utilisées par plusieurs objets.
IXMLDOMComment représente le contenu d'un commentaire XML.
IXMLDOMDocumentFragment représente un objet d'un poids léger qui est utile pour des opérations d'insertions d'arborescences.
IXMLDOMDocumentType contient les informations associées au DTD.
IXMLDOMElement représente un élément.
IXMLDOMEntity représente une entité analysée ou non-analysée dans le document XML.
IXMLDOMEntityReference représente un noeud référence d'entité.
IXMLDOMImplementation fournit les méthodes qui sont indépendantes de n'importe quelles instances du DOM.
IXMLDOMNotation contient une notation délarée dans le DTD ou le Schéma.
IXMLDOMProcessingInstruction représente une instruction de traitement que XML définit pour conserver l'information spécifique du processeur dans le texte du document.
XMLSchemaCache représente un jeu d'URIs (Uniform Resource Identifiers) d'un espace de noms (namespace).
IXMLDOMSchemaCollection représente un objet SchemaCache.
IXMLDOMSelection représente une liste de noeuds qui correspondent à un modèle XSL ou à une expression XPath.
IXMLDOMText représente le contenu textuel d'un élément ou d'un attribut.
IXSLProcessor est utilisé pour l'exécution de tranformations avec les modèles de feuille de style XSL cachée.
IXSLTemplate représente une feuille de style XSL cachée.