ASP.NET PARTIE1

45
Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUES TDI2 GB 2008/2009Sommaire Document Millésime Page OFPPT @ C-A-001.doc février 09 1 - 45 1. ntroduction ASP.NET 2.0 1.1. Principes L'interaction Client / Serveur est la base principale des applications web. Il est donc très important de bien comprendre le principe de fonctionnement d'ASP.NET dans l'environnement DotNet avec le serveur IIS (Internet Information Services). Un petit schéma très simplifié vous aidera peut être à y voir plus clair : Voici donc ce qui se passe lorsque vous, utilisateur désirant naviguer sur une page web, générez comme action si l'application que vous désirez atteindre est développée en ASP.NET 2.0 : 1 = vous tapez une url dans votre navigateur et donc, envoyez une requête pour une page aspx d'un client web vers le serveur IIS 2 = la requête est analysée et le traitement est transféré au runtime, un processus est créé pour exécuter l'application --> S'il s'agit de la première exécution du code de cette page, le compilateur JIT (Just In Time) compile le code en binaire natif et le stoque en mémoire. --> Si ce n'est pas la première exécution, le code binaire est chargé depuis le cache. 3 = ce code binaire est exécuté puis renvoyé vers le serveur IIS 4 = IIS renvoie la réponse sous la forme de code HTML strict vers l'utilisateur. Ce code HTML est affiché dans votre navigateur.

Transcript of ASP.NET PARTIE1

Page 1: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 1 - 45

1. ntroduction ASP.NET 2.01.1. Principes

L'interaction Client / Serveur est la base principale des applications web.Il est donc très important de bien comprendre le principe defonctionnement d'ASP.NET dans l'environnement DotNet avec le serveurIIS (Internet Information Services).Un petit schéma très simplifié vous aidera peut être à y voir plus clair :

Voici donc ce qui se passe lorsque vous, utilisateur désirant naviguer surune page web, générez comme action si l'application que vous désirezatteindre est développée en ASP.NET 2.0 :

• 1 = vous tapez une url dans votre navigateur et donc, envoyez unerequête pour une page aspx d'un client web vers le serveur IIS

• 2 = la requête est analysée et le traitement est transféré au runtime, unprocessus est créé pour exécuter l'application

• --> S'il s'agit de la première exécution du code de cette page, lecompilateur JIT (Just In Time) compile le code en binaire natif et lestoque en mémoire.

• --> Si ce n'est pas la première exécution, le code binaire est chargédepuis le cache.

• 3 = ce code binaire est exécuté puis renvoyé vers le serveur IIS• 4 = IIS renvoie la réponse sous la forme de code HTML strict vers

l'utilisateur. Ce code HTML est affiché dans votre navigateur.

Page 2: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 2 - 45

1.2. Environnement de développement

1.2.1. Un serveur WebPuisque nous allons créer du code utilisant une liaison Client / Serveur, ilest bien entendu nécessaire d'avoir un serveur à disposition dans notrecas, Nous allons utiliser le serveur IIS.IIS est disponible avec windows XP professionnel et windows 2003serverSous XP Home, il n'est pas aisé d'installer IIS, bien que cela soitpossible.

1.2.2. Framework 2.0

Si framework .NET n'a pas été installé après le serveur IIS, vous aurez desproblèmes d'exécution des pages aspx.Pour remédier à cet inconvénient à postériori, vous pouvez exécuter unecommande du type :C:\Windows\Microsoft.Net\Framework\v2.0.xx\aspnet_regiis.exe -i ou xx est laversion du Framework 2.0 présente sur votre ordinateur.

1.2.3. Un EDI, c'est nécessaire ?Nous avons tous l'habitude de travailler dans un environnement dedéveloppement intégré bien que cela ne soit pas toujours nécessairemais plutôt bien pratique. Il en est de même avec le développementASP.NET. Vous pouvez, comme pour des applications Winforms, écriredu code dans un éditeur de texte. Voici, en quelques étapes, laréalisation et l'exécution d'une page aspx créée avec le bloc-note :

1.2.3.1. Etape 1

Créez un site virtuel sur votre IIS et nommez-le, par exemple,"PremierePage". Si vous n'avez jamais réalisé cette opération, voicicomment procéder :

a. Allez dans le panneau de contrôle de Services Internet (IIS) : Outilsd'administration dans le panneau de configuration puis choisissezInternet Informations Services

b. Déroulez les options jusqu'à trouver Site Web par défaut et faites unclic droit

c. Choisissez Nouveau -> Répertoire virtuel ...d. Créez votre répertoire

Voici en images et sur XP Pro en anglais les étapes décrites ci-dessus :

Page 3: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 3 - 45

Page 4: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 4 - 45

Terminer votre création en laissant les paramètres par défaut.

1.2.3.2. Etape 2Ouvrez le bloc-notes et créez un fichier avec ce code :

<%@ Page Language="VB" %><html> <body>

<h1>Bonjour</h1> <br /> <h2>Nous sommes le <%= DateTime.Now.ToString() %>.</h2>

</body></html>

Sauvegardez-le à la racine du site que vous avez créé en le nommantpar exemple "bonjour.aspx".

1.2.3.3. Etape 3

Exécutez cette page aspx dans votre navigateur en tapant son adressedans la barre de navigation :http://localhost/PremierePage/bonjour.aspx

et vous devez avoir une page web comme suit :

Page 5: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 5 - 45

Vous venez donc de créer votre première page ASP.NET s'exécutant surun serveur IIS sans avoir ouvert Visual Studio comme support deprogrammation.

1.2.4. Visual Studio ou Visual Web Developper

Il est bien évident qu'un EDI digne de ce nom vous offre une multituded'avantages comme la complétion du code, l'initialisation automatiquede vos pages, les contrôles utilisateurs, ... malgré que, dans quelquescas, il est parfois plus avantageux de coder directement son contrôledans la page HTML plutôt que de passer par le Designer de l'EDI.Que vous utilisiez Visual Studio ou Visual Web Developper (EDI gratuitet téléchargeable sur le site de Microsoft France), le démarrage de votreapplication sera presque le même. La seule différence vient du fait queVisual Studio étant un EDI qui regroupe plusieurs possibilités dedéveloppement, vous devrez spécifier que vous désirez travailler avecun nouveau projet web avant d'arriver sur cette page de configuration :

Page 6: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 6 - 45

Il est primordial de bien configurer les informations dans Emplacement(Location) et Langage (Language) ainsi que l'adresse du site que vousdésirez développer sur votre serveur IIS local (localhost).

Visual Web Developper comporte un serveur "intégré". Si vous necomptez l'utiliser qu'en développement, ce serveur Visual Studio estlargement suffisant.

1.3. La gestion d’Etat

1.3.1. Première pageEnfin ! Un petit exemple en utilisant Visual Studio ou Visual WebDévelopper pour se familiariser avec l'environnement ASP.NET. Si vousêtes familier avec le "designer" des applications Visual Studio ou VisualExpress Edition, ceci vous paraîtra très simple mais on se permet toutde même de détailler un peu l'interface pour ceux qui abordent ce thèmepour la première fois.

Page 7: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 7 - 45

Reprenons notre EDI et, après avoir bien configuré les données auniveau du serveur et du nom de l'application, l'interface doit maintenantressembler à ceci :

Vous pouvez remarquer que l'interface des applications ASP.NET diffère desapplications Winforms mais nous y retrouvons quand même pas mal de pointscommuns, notamment :

l'explorateur de solution contenant notre projet "WebApp", salocalisation "http://localhost/WebApp" et la page par défaut"Default.aspx", que nous pouvons bien évidemment renommer.les propriétés des contrôles et pages grâce auxquelles nous allonspouvoir définir des comportements graphiques ou autres.la page de code où une partie de codage est générée automatiquementpar l'environnement de développement.deux boutons "design" et "source" nous permettant de passeraisément d'un mode à l'autre dans notre page aspx. Remarquez aussique, si vous déplacez votre curseur dans la partie code, à droite dubouton "source", vous apercevez l'endroit exact où se situe le curseurdans l'arborescence des balises HTML.la boite à outils, ancrée ou non, contenant les contrôles utilisablespour votre application web :

Page 8: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 8 - 45

Passons maintenant en mode "design". Faites glisser sur la page lescontrôles suivant et changez leurs propriétés en suivant le tableau ci-après :

Contrôle Propriété ContenuUn "label" : Label1 Text "Nom :"

Un "textbox" à droite de Label1 : TextBox1 BorderWidth 2Un "button" sous Label1 : Button1 Text "Cliquez"Un "label" sous le bouton : Label2 Text "Bonjour"

Remarque : dans la propriété BorderWidth, par défaut, l'unité de mesureest en "px" (pixel). Cela correspond bien aux normes HTML.

Votre page doit ressembler à ceci :

Page 9: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 9 - 45

Si vous retournez en mode "source", vous constatez que le code HTMLs'est enrichi automatiquement des contrôles que vous avez intégrés àvotre page ainsi que des propriétés modifiées via la page de propriétés.Rien ne vous empêche, au fil de l'expérience acquise dans ledéveloppement ASP.NET, de taper immédiatement le code de voscontrôles dans la page HTML, vous verrez que le "design" se met aussi àjour de la même manière. L'avantage de coder directement dans l'HTMLse trouve dans le libre choix que vous avez du type de contrôle placé.Par exemple, vous voyez dans notre application que le TextBox1 estconsidéré comme un "asp:textbox" ce qui, niveau exécution du codeprend plus de place et de temps qu'un simple "asp:inputbox" alors quele résultat, ici, est exactement le même. Pour les utilisateurs avertisayant déjà réalisé des sites web en HTML, il peut aussi être plus aisé decoder directement dans la page source.

A ce point, nous avons des contrôles placés sur une page aspx, maisencore aucune action n'est définie. Vous avez beau taper un nom dans"TextBox1" et cliquer sur le "Button1", rien ne se passe. En effet, il fautassocier un événement au bouton "Cliquez". Pour ce faire, double-cliquez sur le bouton en mode design et l'environnement dedéveloppement va créer une méthode associée à l'événement "Click" dubouton :

Remarquez qu'une nouvelle page est apparue "Default.aspx.vb" quicontient le code associé aux méthodes et événements. Dans votreévénement "Button1_Click", tapez cette ligne :

label2.text=label2.text & " " & textbox1.text

Vous verrez en cours de frappe que l'aide à la complétion existe aussi,exactement comme dans les applications winforms. Maintenant, vouspouvez exécuter votre page aspx (F5). Lors d'une première exécutionvous allez certainement obtenir ce message :

Page 10: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 10 - 45

Par défaut, le débogage n'est pas activé au niveau des applications web.On vous conseille fortement de l'activer en répondant OK avec lapremière option cochée.

Ensuite, testez en tapant un nom et en cliquant sur votre bouton.

1.3.2. Des événements particuliersASP.NET possède des événements mais, certains sont assez particulierset très importants pour le déroulement et le contrôle de ce genred'application.

1.3.2.1. Application

Evénement Description

Application_StartExécuté lors du premier appel à une page du sitedepuis le démarrage de IIS

Application_EndAppelé lorsque l'application se termine, cela nesignifie pas que IIS s'arrête mais est d'office appelési, pour une raison quelconque IIS est arrêté

1.3.2.2. Session

Evénement Description

Session_Start appelé lors de chaque nouvelle sessiond'un navigateur client

Session_End

fin de session : lors d'un timeout oulors d'une destruction explicite(Session.Abandon()) via un lien "LogOut" par exemple

Il faut aussi savoir qu'une session peut stocker ses données en mode"InProc" (dans le process en mémoire) ou en mode "Sql..." (dans uneBD SqlServer) via la base de données "AspNetState".Application et Session sont des notions très importantes en ASP.NET.

Page 11: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 11 - 45

Elles jouent en effet un rôle très actif au niveau de la vie d'un site et,notamment, au niveau de la pérennité des données véhiculées dans lesite lui-même.

Un petit schéma pour mieux visualiser la différence entre "Application"et "Session" :

Soit trois utilisateurs U1, U2 et U3 qui envoient une requête vers leserveur IIS. Il y aura un seul objet "Application" commun à tous lesutilisateurs du site mais trois objets "Session" correspondant chacun àun utilisateur précis.Si U2 quitte son poste de travail sans couper son navigateur :

• s'il n'y a pas de timeout, les autres utilisateurs peuvent accéder à S2• S'il y a timeout et que U2 revient visiter le site, une nouvelle session

S4 sera créée

Par contre, si U2 coupe son navigateur, S2, persiste jusqu'à un éventueltimeout ou jusqu'à la fin de l'application

1.3.2.3. PostBack

IsPostBackUne page ASP.NET est généralement utilisée plusieurs fois à la suite, dans une séried'échanges avec l'utilisateur.

Supposons qu'une page d'accueil (accuei 1. htm) soit affichée. L'utilisateur cliquesur un lien qui conduit à la page saisie.aspx. Comme l'extension de la page est

Page 12: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 12 - 45

aspx, celle-ci est traitée par ASP.NET. Il s'agit alors de la première fois que la pageest appelée.

Cette page de saisie peut comprendre des contrôles qui provoquent un appel auserveur, par exemple des boutons de type asp:Button.

Quand l'utilisateur clique sur un bouton, la même page est appelée mais là ce n'estpas la première fois : la page précédente était la même.

Une propriété de la classe Page indique si la page est appelée la première fois ou non: IsPostBack.

Si la valeur de cette propriété est False. il s'agit du premier appel de la page.

Si la valeur de IsPostBack est True, la page est appelée par elle-même.

Page 13: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 13 - 45

Pour créer une application qui met en évidence la propriété IsPostBack, vouspouvez effectuer les manipulations suivantes :

o Créez un nouveau projet Application Web ASP.NET.

o Supprimez la page initiale Default.aspx et ajoutez un nouveau formulaire Webappelé Saisie.

o Ajoutez au projet une page HTML appelée accueil.htm.

o Cliquez à droite sur Accuei 1 dans l'explorateur de solutions et sélectionnezDéfinir comme page de démarrage dans le menu contextuel.

o Placez un lien sur la page Accueil dont l'URL de destination est Saisie.aspx

Dans la page Saisie, placez un contrôle Web Form Label appeléIblIsPostBack et un contrôle Button

« Vous pouvez maintenant ajouter le code suivant dans l'événementPage_Load de la page Saisie:

Private Sub Page_Load(...) Handles MyBase.Load

If IsPostBack Then

IblIsPostBack.Text = "IsPostBack est vrai"

IblIsPostBack.ForeColor = Col or.Red El se

IblIsPostBack.Text = "IsPostBack est faux"

IblIsPostBack.ForeColor = Color.Green

End If

End Sub

Page 14: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 14 - 45

Page 15: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 15 - 45

1.3.3. Les Server ControlsUn petit mot sur les types de contrôles présents dans ASP.NET. Il existedeux jeux de contrôles s'exécutant côté serveur :Les Web Controls, gérés par des événements, ils ressemblent plus auxobjets utilisés dans du développement winforms c'est-à-dire qu'ilspossèdent des propriétés ("font", "backcolor", ...) facilitant la mise enforme. Ils dépendent de "System.Web.UI.WebControls".Les HTML Controls qui correspondent directement aux balises HTML.Les attributs des balises correspondantes sont accessibles via lespropriétés de ces contrôles. Pour faire une analogie avec les"WebControls", ceux-ci ne possèdent qu'une balise "Style" pour la miseen forme, cela est plutôt limitatif.Ces derniers dépendent eux de "System.Web.UI.HtmlControls".

Gestion de l'état, la session, les cookies

• Mise en évidence du problème

• Stockage des données sur le client• Stockage des données sur le serveur

On a vu que chacune des pages effectuait un travail spécifique, lesseules relations entre une page et une autre étant un appel avec unhyperlien.

La question qui se pose est comment effectuer un traitement surplusieurs pages et particulièrement comment retrouver dans le codeassocié à une page les données d'une autre page.

le Web est par essence un système sans état: l'utilisateur demandeune page, celle-ci est renvoyée par le serveur, puis tout est oublié !Lors de la prochaine demande de l'utilisateur, le serveur ne se «rappellera » de rien. En d'autres termes, le serveur ne fait querépondre à des demandes ponctuelles de l'utilisateur, une par une,sans aucune connexion entre elles.

Pour resoudre de probleme on peut distinguer plusieurs situationset systèmes pour gérer l'état, c'est-à-dire faire passer la valeur dedonnées d'une page à une autre.

Les quatre premières techniques se servent du client pour stocker lesdonnées :

v Utiliser le ViewState, l'état d'affichage des pages Web mis enuvre dans des sacs d'état (state bags).

v Utiliser des champs

cachés.

Page 16: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 16 - 45

v Passer les données par

l'URL.

v Placer les données dans des cookies sur le poste de

l'utilisateur.

Les techniques suivantes stockent les données sur le serveur :

v Stocker les données dans des variables de session.

v Faire de même avec des variables d'application.

v Utiliser le contexte.

v Placer les données dans le cache.

La gestion de l'état concerne deux catégories de données :

v Les valeurs des variables de l'application, principalement lesvariables de la classe associée à la page.

v Les valeurs des propriétés des contrôles de la page.

TRAVEAUX PRATIQUES :

Mise en évidence du problèmePrenons un exemple simple pour montrer comment la gestion

de l'état diffère dans les applications Web de ce qu'elle est

dans les applications classiques.

La page PageEtat1 présente un contrôle TextBox (txtNom) et

un bouton OK (btnOK). Quand l'utilisateur clique sur le

bouton, le contenu de la zone de saisie est recopié dans une

variable de classe appelée Nom (il s'agit d'un membre de la

classe associée à la page) :

' Variable contenant

le nom Private Nom

As Stn'ng

Private Sub btnOK_Click(...)

Handles btnOK.Click

‘ Stocke le nom dans une variable

Nom = txtNom. Text

End Sub

Page 17: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 17 - 45

Un second bouton sur la page (btnAfficheNom) permet d'afficher

dans un contrôle Label (IblNom) le contenu de la variable Nom

Private Sub

btnAfficheNom_Click(...)

Handles btnAfficheNom.Click

' Affiche le contenu de la variable

IblNom.Text = Nom End Sub

1.3.4. ViewStatePrenons un peu le temps de voir le code HTML de la page exécutée :

Page 18: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 18 - 45

Vous constatez que des champs cachés ont été générés. Le champnommé _VIEWSTATE .

Les données d'état de la page

À chaque page est associé un état d'affichage (View State), qui stockel'ensemble des données de la page et de ses contrôles. Cet étatd'affichage est implémenté dans un objet de classe StateBag(littéralement, sac d'état), qui enregistre les données sous la forme depaires de clés et de valeurs, dans un dictionnaire.

NOTE :Pour que l état d affichage soit opérationnel, il faut que la propriété EnableviewState de lapage soit True.

Ces données sont transportées du serveur à une page sur le poste del'utilisateur, puis de celle-| ci au serveur à nouveau, dans un champ cachédu formulaire (un champ de type <input type=hidden>). Le contenu de cechamp correspond à l'ensemble des valeurs qui se trouvent dans l'objetStateBag, codées de tette façon qu'elles soient transportables sur leprotocole HTTP et qu'il ne soit pas facile de les décoder ou de lesmodifier.L'état d'affichage n'est utilisable que sur la même page appeléeplusieurs fois, pas entre plusieurs pages différentes.

ViewState("Nom") = Value

On peut accéder à l'objet StateBag associé à une page grâce à la propriétéViewState de l'objet Page. La clé associée à une donnée estautomatiquement créée si celle-ci n'existe pas, ou elle est remplacée dans le

Page 19: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 19 - 45

pour stocker le contenu de Value sous le nom Nom. On pourra ensuite relire cettedonnée

Nom = ViewState("Nom")

On peut ainsi transformer la page de l'exemple précédent afin de stocker le nom,non plus dans une variable de la classe, mais dans l'objet StateBag de la page.

on peut remplacer la déclaration de la variable Nom par une propriété de même nom etqui utilise l'objet StateBag :

Private Property Nom() As String GetNom = ViewState("Nom")End GetSet(ByVal Value As String) ViewState("Nom") = ValueEnd Set End Property

Ainsi, le code qui utilise la donnée Nom reste le même :

Private Sub btnOK_Click(...) Handles btnOK.Click' Stocke le nom dans une variable

Nom = txtNom.TextEnd Sub

Private Sub btnAfficheNom_Click(...) Handles btnAfficheNom.Click' Affiche le contenu de la variable

IblNom.Text = NomEnd Sub

Avec cette nouvelle version, le nom s'affiche bien quand on clique sur lebouton.

1.3.5. Cookies

Stockage des données dans des cookies

Page 20: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 20 - 45

Un cookie est du texte stocké sur le poste du client. Il est généralement enregistré à lademande du serveur, par l'intermédiaire de la propriété Cookies de l'objet HttpResponseretourné par la propriété Response de la page. Il peut être lu à travers la propriété Cookies del'objet HttpRequest retourné par la propriété Request de la page.

Pour écrire un cookie, qui est un couple nom-valeur, il suffit de lui donner une valeur, en indiquantson nom comme paramètre de la collection Cookies. Si le cookie existait déjà, il est remplacé,dans le cas contraire, il est créé :

I Response.Cookies(''MonCookie").Value = "La valeur"

Un cookie écrit de cette façon n'est pas permanent : il n'existe qu'en mémoire, donc pendant ladurée de l'application. Il disparaîtra quand celle-ci s'arrêtera.Pour rendre un cookie permanent, il faut indiquer une date d'expiration. Par exemple :

Response.Cookies("MonCookie").Value = "La valeur"Response.Cookies("MonCookie").Expires =#1/1/2030#

Le cookie sera alors écrit sur le disque de l'utilisateur et y restera jusqu'à la date d'expirationou jusqu'à ce qu'il soit effacé.

On peut lire un cookie en utilisant la même collection Cookies, maie appliquée à l'objetHttpRequest. Voici le code qui relit le cookie écrit précédemment :

| MonCookie = Request.Cookies("MonCookie"). Value

Si le cookie existait dans cette application, sa valeur est retournée. Dans le cas contraire, la valeurde retour est une chaîne de caractères vide.L'ensemble des cookies d'une application est transmis avec chaque demande de l'utilisateur. Il estdonc préférable de ne placer que de petites quantités de données dans les cookies, afin de ne pasgrossir la trame HTTP circulant sur le réseau, d'autant plus que la taille d'un cookie est elle-mêmelimitée.

La page exemple SaisieNom dispose d'un bouton Affiche avec cookie. Quand l'utilisateurclique dessus, le contenu du champ de saisie est placé dans un cookie temporaire appeléNom. L'application est ensuite redirigée vers une autre page, à l'aide de la méthode Redi -rect del'objet HttpResponse :

Private Sub btnOKCookie_Click(...) Handles btnOKCookie.ClickResponse.Cookies("Nom").Value = txtNom.Text' Supprimez le commentaire de la ligne suivante pour rendre le cookie permanent'Response.Cookies("Nom").Expires = #1/1/2030*

Response.Redirect("AfficheNomCookie.aspx")End Sub

La page Af fiacheNomCookie affiche le texte lu dans le cookie.

Page 21: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 21 - 45

Private Sub Page_Load(...) Handles MyBase.LoadIblNom.Text = Request.Cookies("Nom").Value End Sub

Page 22: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 22 - 45

Stockage des données sur le serveurToutes les techniques présentées précédemment stockent les données sur le poste du client.Celles de cette section les placent sur le serveur.

Cela présente quelques avantages :

• Les données ne sont jamais visibles par le client.

• Elles ne circulent pas sur le réseau et ne l'encombrent donc pas.

• Elles ne sont pas liées au poste utilisé par le client, comme c'est le cas pour lescookies (si l'utilisateur utilise un autre poste, il ne dispose pas de ses cookies).

• Leur accès est plus rapide, puisqu'elles se trouvent déjà sur le serveur.

Le stockage des données sur le serveur présente également quelques inconvénients :• Les données occupent de la place sur le serveur, ce qui peut devenir ennuyeux si

beaucoup d'utilisateurs accèdent à l'application.• L'utilisateur peut être lié au serveur sur lequel se trouvent les données, bien

qu'ASP.NET propose des solutions pour cela.

Les variables d'applicationUne variable d'application est conservée dans un objet particulier, de classeHttpApplication, retourné par la propriété Application de la page.

Cet objet comprend des données liées à une application.

Au fait, qu'est-ce qu'une application Web?

Il s'agit de l'ensemble des fichiers, pages, gestionnaires, modules et code situés dans unrépertoire virtuel et ses sous-répertoires sur un serveur Web donné.Pour créer une variable d'application, il suffit de la nommer et de lui donner une valeur, unpeu comme pour les cookies présentés plus haut :

| Application("NomVariable") = "Valeur variable"

Si la variable du nom indiqué existait déjà, sa valeur est remplacée, sinon elle est créée.L'utilisation de variables d'application est donc extrêmement simple.

Il faut cependant faire quelques remarques :• Une variable d'application est vue par tous les utilisateurs de l'application. Il ne

faut donc pas y stocker des données spécifiques à un utilisateur, mais plutôt des

Page 23: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 23 - 45

données communes à toute l'application, par exemple le nom de la société ou unetable de taux de TVA ou compter le nombre des utilisateurs connectes.

• Les variables d'application sont stockées dans le serveur Web qui les crée. Dans le casd'une ferme de serveurs (plusieurs serveurs qui jouent des rôles semblables), lademande d'un utilisateur peut être dirigée vers un serveur ou un autre selon leurcharge. Une application peut donc ne pas disposer des données créées par la mêmeapplication sur un autre serveur.

• Lors de la modification de la valeur d'une variable d'application, il existe un risque qued'autres utilisateurs effectuent un changement de la même variable au mêmemoment. Il convient donc de synchroniser l'accès à ces variables, comme cela estmontré dans l'exemple suivant.

•On place donc généralement dans les variables d'application des données en lectureseule. Ces variables sont alors utilisées comme une sorte de cache pour desdonnées qui ne varient pas ou peu pendant la durée de vie de l'application.

Il faut cependant bien initialiser les variables d'application quelque part. Cela peut être faitquand l'application démarre, en plaçant du code spécifique dans le fichier global.asax del'application qui est ajouté à un projet Web par Visual Studio .NET lors de sa création. Cefichier comprend des données et du code globaux à l'application. On peut notamment yajouter des procédures qui seront appelées par le serveur Internet quand certainsévénements se produiront. Il suffit, pour cela, de dériver une classe de la classeHttpApplication et d'y écrire les programmes nécessaires.Pour gérer les variables application, on peut écrire du code dans les procédures suivantes :

• Init et Application_OnStart sont appelées au démarrage de l'application. On y insèredonc généralement le code d'initialisation des variables.

• Dispose et Application_OnEnd sont appelées quand l'application se termine.

Une application démarre la première fois qu'un utilisateur appelle une page qui enfait partie. Si le serveurWeb est arrêté, elle l'est aussi. D'autre part, si le fichier global .asax est modifié,l'application est arrêtée puis redémarrée.

On peut remarquer qu'il existe deux procédures pour le démarrage et l'arrêt del'application.Les constructeurs et destructeurs Init et Dispose sont appelés pour chaque objetHttpApplication créé, tandis que les procédures Application_OnStart etApplication_OnEnd sont appelées à la première création. Il est donc généralementpréférable d'initialiser les données dans le constructeur Init.

La page AfficheNomApplication affiche une donnée placée dans une variable Applicationappelée Nom par la page appelante, SaisieNom. Celle-ci exécute le code suivant lors du clicsurle bouton Affiche avec application:

Private Sub btnOKApplication_Click(...) Handles btnOKApplication.Click

Application.Lock()

Application("Nom") = txtNom.Text -

Page 24: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 24 - 45

Application.Unlock()Response.Redirect("AfficheNomApplication.aspx")End Sub

On peut remarquer dans ce code que l'affectation de la valeur à la variable Application estaccompagnée d'un appel aux méthodes Lock puis UnLock. Lock verrouille l'objet Applicationafin d'éviter qu'une modification y soit effectuée en même temps par un autre thread.

La page AfficheNomAppl i cati on affiche la valeur stockée dans la variable Applicationlors de son chargement :

Private Sub Page_Load(...) Handles MyBase.Load' Donnée initial née par la page appelanteIblNom.Text = Application("Nom")' Données initialisées dans Global.asaxIblInit.Text = Application("Init")IblOnStart.Text = Application("OnStart")End Sub

Vous pouvez remarquer que le code de traitement de l'événement Load affiche également lesvaleurs de deux autres variables (figure 7-10). Celles-ci ont été initialisées dans des procéduresévénement de Global .asax :

Public Class GlobalInheri ts System.Web.HttpApplicationPublic Overrides Sub Init()

Application("Init") = "Donnée initialisée dans Init"

Page 25: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 25 - 45

End SubSub Application_OnStart(ByVal sendèr As Object, ByVal e As EventArgs)Application(“OnStart") = "Donnée initialisée dans Application_OnStart"

End SubEnd Class

Les variables partagées

L'utilisation de l'objet Application pour conserver des données était courante dans lesversions précédentes d'ASP. Elle présente cependant quelques inconvénients,particulièrement le fait que les données n'y sont pas typées, ce qui allonge les temps detraitement lorsqu'on y accède.

On pourrait être tenté d'utiliser des variables d'instance de l'objet Application

(appelé Global par défaut) déclaré dans Global .asax. Cela n'est cependant

pas possible, car il peut exister plusieurs objets Application créés à partir de la

classe Global. Quand une page est appelée sur le serveur, ASP.NET peut, soit

fabriquer un nouvel objet Global, soit utiliser un objet existant. On ne peut donc

pas avoir de certitude sur l'objet Global employé par une page, et ses variables

d'instance ne peuvent donc pas être mémorisées d'un appel à l'autre.

Il est cependant possible de déclarer des variables partagées dans la classe Global avec lemot-clé Shared. Une telle variable s'utilise indépendamment de la création d'un objet, elleest donc globale à l'application.

Voici, par exemple, une variable déclarée dans Global .asax, dans la classe Global

Public Class GlobalInherits System.Web.HttpApplication

Public Shared Nom As String

La variable Nom peut alors être valorisée dans une page, comme dans la page SaisieNomà la suite d'un clic sur le bouton Affiche avec variable Shared:

Private Sub btnOKShared__Click(...) Handles btnOKShared.ClickSyncLock Me

Global.Nom = txtNom.TextEnd SyncLockResponse.Redirect("AfficheNomShare.aspx")End Sub

Page 26: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 26 - 45

Le problème de l'accès simultané à la donnée par plusieurs threads se pose ànouveau. Il est réglé ici en plaçant le code qui accède à la donnée dans une section desynchronisation, ce qui garantit qu'un seul thread peut exécuter la section à la fois.L'utilisation de la donnée se fait dans une autre page, Af fi cheNomShared (il n'est pasnécessaire de synchroniser l'accès à la donnée en lecture seule :

Affichage du nom après passage par une variable partagée

Private Sub Page_Load(...) Handles MyBase.Load

IblNom.Text = Global.NomEnd Sub

Les variables de session

Si les variables d'application sont intéressantes pour stocker lesdonnées d'une application, elles ne permettent pas de distinguer unutilisateur d'un autre. Les variables de session répondent à cetteinsuffisance, car elles sont associées à l'utilisateur courant.

La notion de sessionPour mettre en uvre les variables de session, ASP.NET définit unenotion de session qui comprend l'ensemble des actions d'un utilisateurdans une application. Une session est reconnue par un identificateurde session créé par ASP.NET. Il s'agit d'une chaîne de caractères de120 bits (par exemple, 302dvbynpstxl3iOrugglb45), dont l'unicité estgarantie grâce à l'utilisation d'un algorithme spécifique. De plus, lastructure de cette chaîne est non triviale, ce qui évite qu'elle soitmanipulée à l'insu du système (par exemple, pour se faire passerpour quelqu'un d'autre).Quand un nouvel utilisateur appelle une page d'une applicationASP.NET pour la première fois, un nouvel identificateur lui est attribué.Celui-ci accompagne ensuite toutes les réponses du système et les

Page 27: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 27 - 45

demandes de l'usager, ce qui permet de l'identifier. Deux techniquespeuvent être utilisées pour cela : un cookie particulier enregistré surle poste de l'utilisateur, ou l'inclusion de l'identificateur dans l'URL,essentiellement si les cookies ne sont pas autorisés par le navigateurde l'utilisateur.Pour accéder aux informations d'une session, la classe Page exposeune propriété, Session, qui retourne une référence à un objetHttpSessionState. Celui-ci dispose de propriétés et de méthodes,dont la propriété SessionID qui renvoie l'identificateur de sessioncourant. On peut écrire, pour placer l'identificateur de session dansun contrôle label appelé IblSessionID :

| IbISessionID.Text = Session.SessionID

Le résultat est une chaîne de caractères comprenant l'identificateurde session (voir l'exemple suivant).

La configuration de la façon dont la session fonctionne se fait

dans le fichier Web.config, situé dans le répertoire d'une

application Web. Il s'agit d'un fichier XML comprenant, entre

autres, une balise appelée sessionState qui fait partie de la section

System.web du fichier. Cette balise comprend plusieurs attributs

qui définissent les caractéristiques de la session

Les attributs de la section System.web du fichier de configuration web.config

Voici le contenu de cette cette

section:

Page 28: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 28 - 45

<configuration>

<system.web

>

<sessionState

mode="InProc"

stateConnectionString="tcpi p=12 7 . 0 . 0 . 1 : 42424"

sqlConnectionString="datasource=127.0.0.1;user

id=sa;password="

cookieless="false"

timeout="20"

/>

</system.web>

</configuration>

Quand l'attribut cookieless a sa valeur par défaut False, le SessionID esttransmis sur le poste de l'utilisateur par l'intermédiaire d'un cookie. Enrevanche, si on donne à cookieless la valeur True, le SessionID esttransmis dans l'URL, sous la forme d'un pseudo-répertoire dont le nomest la valeur de l'identificateur.

Page 29: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 29 - 45

L'attribut mode indique l'emplacement de stockage des variables. La modification de lavaleur de cet attribut peut avoir une influence sur les performances et sur la disponibilité desdonnées de session. Les valeurs possibles sont les suivantes :

• Of f, les données de session ne sont pas gardées. Les variables de session ne doiventdonc pas être utilisées si mode a cette valeur.

« InProc, les données de session sont stockées en mémoire sur le serveur. Cette valeurdonne les meilleures performances (il s'agit d'ailleurs de la valeur par défaut), mais nepermet pas de conserver les données en cas de panne ou d'utilisation de plusieurs ser-veurs ou processus.

« StateServer, les données de session sont gardées sur le serveur identifié par la valeurde stateConnectionString. Cette chaîne doit comprendre l'adresse du serveur suiviedu port à utiliser, qui est par défaut 42424. La valeur par défaut,tcpip=127.0.0.1:42424, indique que les données sont stockées sur le serveur local(l'adresse IP 127.0.0.1 identifie le serveur local).

• SQLServer, les données de session sont stockées sur le serveur SQL Server identifié parla valeur de sqlConnectionString. Il s'agit d'une chaîne de connexion à SQL Server.

Les deux dernières options sont particulièrement intéressantes et n'existaient pas dans lesversions précédentes d'ASP. Elles permettent de partager les données de session entreplusieurs processus.La valeur StateServer indique que les données de la session sont placées sur le serveurspécifié par stateConnectionString (un serveur d'état). On peut alors envisager deuxconfigurations :

• II n'existe qu'un serveur Web, mais plusieurs processus peuvent faire fonctionner lamême application. L'utilisation de cette valeur permet de ne pas lier un utilisateur à unprocessus particulier. La valeur InProc ferait que, si l'utilisateur était connecté à unprocessus différent d'une page à l'autre, les valeurs de ses variables de sessionseraient perdues.

• Quand plusieurs serveurs Web sont utilisés pour la même application (on parle deferme de serveurs), le serveur d'état peut être commun à l'ensemble des serveursWeb. De cette façon, les demandes d'un utilisateur ne sont pas liées à un serveurphysique particulier et la répartition de charge entre les serveurs peut être pleinementexploitée.

Page 30: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 30 - 45

La valeur SQLState de l'attribut mode permet d'aller encore plus loin, puisque lesdonnées des variables d'application sont placées sur un serveur SQL Server. Decette façon, même si un serveur Web tombe en panne, les données ne sont pasperdues.

Le dernier attribut de la balise sessionState, timeout, indique le temps d'inactivité, enminutes, après lequel la session est fermée. Par défaut, cette valeur est de vingt minutes.La fermeture d'une session permet de libérer toutes les données qui lui sont associées. Sil'application gère des données sensibles, comme un compte en banque, il peut êtrepréférable de diminuer cette valeur, afin de ne pas garder en mémoire des donnéesconcernant un utilisateur qui n'utilise plus l'application. On peut d'ailleurs forcer une fin desession, en appelant la méthode Abandon :

| Session.Abandon

Cela peut être effectué, par exemple, en réponse à un clic de l'utilisateur sur un bouton dedéconnexion placé sur la page. Après la fermeture d'une session, automatiquement oumanuellement, toutes ses données sont détruites.

Les variables de session

Comme les variables d'application, les variables de session sont simplement fabriquées enles nommant : si la variable existe, elle est utilisée, sinon efle est créée. Pour donner unevaleur à la variable de session Nom, on peut simplement écrire :

Session(‘'Nom") = "Nouvelle valeur" -

I II n'est pas nécessaire de mettre en uvre un mécanisme de synchronisation pour les variables de session,| car elles ne sont normalement rejointes que par un seul thread, n'étant liées qu'à un seul utilisateur.

L'initialisation des variables de session peut se faire dans une procédure Session_OnStart (ouSession_Start) et Session_OnEnd permet d'effectuer les traitements de fin de session. Cesdeux procédures doivent être écrites dans le fichier global .asax, comme cela a été expliquédans la section relative aux variables d'application.

La page AfficheNomSession affiche une variable de session initialisée lors de la saisie du nomde l'utilisateur dans la page Sai si eNom. Elle affiche également la valeur d'une variableinitialisée dans la procédure Session_OnStart .

Page 31: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 31 - 45

Page 32: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 32 - 45

La valorisation de la variable à la suite de la saisie du nom est effectuée par le code suivantPrivate Sub btnOKSession_Click(...) Handles btnOKSession.Click

Session("Nom") = txtNom.TextResponse.Redi rect("AfficheNomSessi

on.aspx")End Sub

L'initialisation des variables dans global .asax est :Sub Application_OnStart(ByVal sender As Object, ByVal e As EventArgs)

Application("OnStart") = "Donnée initiaïisée dansApplication_OnStart"

End SubSub Session_Start(ByVal sender As Object, ByVal e As EventArgs)

Session("Start") = "Donnée initialisée dansSession_Start" End Sub

Enfin, l'affichage des variables est réalisé par le code suivantPrivate Sub Page_Load(...) Handles MyBase.LoadIblNom.Text = Session("Nom")IbISessionID.Text = Session.SessionIDIblSession.Text = Session("Start")IblSessionl.Text = Session("OnStart")End Sub

Page 33: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 33 - 45

Le contexteLa propriété Context d'une page retourne l'objet HttpContext associé à la page. Celui-ci fournitdes informations sur la requête HTTP ayant provoqué son appel. Parmi les membres de la classeHttpContext, la propriété Handler donne accès à un objet HttpHandler qui représente la page àl'origine de l'appel. Cela permet d'accéder à ses données.Pour que le contexte permette de récupérer les données de la page précédente, il faut que l'appel dela page se fasse à l'aide de la méthode Server.Transfer et non pas Response.Redirect.

|les données du contexte ne sont valides que pour la requête en cours. Elles sont donc perdues lors de la kequêtesuivante.

L'utilisation du contexte peut se faire en « castant » la propriété Handler en un type correspondantà la page appelante. La ligne suivante permet d'accéder à la propriété Nom définie dans la pageSaisieNom:

Private Sub PageJ_oad(...) Handles MyBase.LoadIblNom.Text = CType(context.Handler, Saisi eNom). Nom End Sub

Voici le code de la page SaisieNom

' Propriété Nom pour le contexte Public ReadOnlyProperty NomQ As String

CetReturn txtNom.Text

End Cet EndProperty

Private Sub btnOKContext_Click(...) Handles btnOKContext.Click ' UtiliseServer.Transfer au lieu de Response.RedirectServer.TransferC'AfficheNomContext.aspx")

End Sub

Page 34: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 34 - 45

Le cacheLe cache d'ASP.NET est un lieu de stockage de données qui peut être utilisé à la foispour cacher des pages, c'est-à-dire les mémoriser afin d'éviter de les régénérer àchaque demande, et pour enregistrer des données. Pour le stockage de données, lecache ressemble donc à l'objet Application dans la mesure où les valeurs qui y sontplacées sont privées à l'application. Mais le cache dispose également demécanismes complémentaires qui permettent de contrôler la durée de vie desdonnées qu'il contient en libérant la mémoire quand elle n'est pas utilisée, ou deconditionner les données à des ressources externes.

Placer des données dans le cache se fait très simplement, comme pour l'objetApplication :

Private Sub btnOKCache_Click(...) Handles btnOKCache.ClickCacheC'Nom") = txtNom.TextResponse.Redirect("AfficheNomCache.aspx")

End Sub

On peut également utiliser les méthodes Insert et Add de l'objet Cache pour ajouterdes données dans le cache. Ces méthodes peuvent recevoir des paramètrescomplémentaires permettant de définir, notamment, la durée de vie des données.

L'obtention des données du cache se fait tout aussi simplement (figure 7-14) :

Private Sub Page_Load(...) Handles MyBase.LoadIblNom.Text = CacheC'Nom") End

Sub

Page 35: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 35 - 45

RésuméNous avons vu que si la gestion de l'état est un véritable problème pour lesapplications Web, elle dispose également de nombreuses solutions. Plusieursmécanismes permettent de stocker les données d'une page sur le client, ou sur leserveur. Des techniques nouvelles dans ASP.NET permettent même de stocker lesdonnées sur un serveur partagé par plusieurs serveurs Web.

Page 36: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 36 - 45

1.3.6. Variable de session

"Session" est un objet qui s'utilise un peu comme le ViewState,c'est-à-dire avec une clé mais se comporte plutôt comme une table dehachage. Prenons deux pages aspx :

page1.aspx : page dans laquelle nous encodons, par l'intermédiaire d'uneTextBox, un nom de sociétépage2.aspx : page dans laquelle nous affichons le nom de la société(vous comprenez que le but est d'avoir une page d'affichage de donnéesde société se trouvant par exemple dans une base de données)

Protected Sub cmdAfficheSoc (Byval sender As Object, ByVal eAs System.EventArgs) Handles cmdAfficheSoc.Click Session("NomSoc") = txtNomSoc.Text Response.Redirect("page2.aspx")

End Sub

Code de la page1.aspx : L'utilisateur introduit un nom de société dans laTextBox nommée "txtNomSoc". Cette information est sauvée en Sessionavant de passer à la page2.aspx

Protected Sub Page_Load (Byval sender As Object, ByVal e AsSystem.EventArgs) Handles Me.Load If Session("NomSoc") IsNot Nothing Then lblNomSoc.Text = CType(Session("NomSoc"), String) Else Response.Write("Aucune société n'a été choisie !") End IfEnd Sub

Code de la page2.aspx : Un test est effectué pour savoir si la variable desession contient bien une donnée. Celle-ci est affichée en passant par untranstypage.

Il est évident que cet exemple est très simpliste et que l'objet Sessionpermet bien d'autres utilisations. Voici quelques points liés à l'objetSession (liste non exhaustive) :

• Initialisation de l'objet Session : événements Session_Start etSession_End déclenchés par le serveur et accessibles via le fichierGlobal.asax

• Expiration de la session• Session avec ou sans cookies• Session sécurisée

1.3.7. Variable d'application

Page 37: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 37 - 45

La grande différence avec l'objet Session se situe dans le fait qu'un objetApplication conserve des données pour l'ensemble des utilisateursd'un même site web. Il s'utilise de la même manière que l'objet Session.

Protected Sub Page_Load (Byval sender As Object, ByVal eAs System.EventArgs) Handles Me.Load Dim cpt As Integer = 0 Application.Lock() If Application("Compteur") IsNot Nothing Then cpt = CType(Application("Compteur"), Integer) End If cpt = cpt + 1 Application("Compteur") = cpt Application.UnLock() lblVisite.Text = "Page vue : " & cpt & " fois."End Sub

L'objet Application étant commun à tous les utilisateurs du site, il estpréférable de bloquer l'accès lors de l'écriture et, bien entendu, de ne pasoublier l'action inverse.

1.3.8. L'objet Cache

Comme l'objet Application, il conserve aussi des données accessibles àtous les utilisateurs mais il possède quelques avantages non négligeables:

• Gestion interne de locking• Plus rapide• Gestion des dépendances

En ce qui concerne les dépendances, on peut en citer quelques-unestrès succinctement car ce genre de programmation demanderaitpresque un tutoriel à elle toute seule !

§ Dépendances de temps : permet de faire expirer automatiquementune donnée à une date/heure absolue

• Dépendances fichiers : le serveur d'application peut mettre à jourdes données lorsque celles-ci sont modifiées dans le fichier associé

• Dépendances SQL : sous SqlServer 2000 et 2005. Agit de la mêmemanière avec une base de données grâce au "poling" (interrogationdu serveur vers la BD).

• le callback : association d'une procédure qui est rappelée, non pasdès que la donnée est supprimée mais à la prochaine exécution dela page qui contient la procédure

1.3.9. Caching (ou cache HTML)

Un autre aspect de la mise en cache des données suivant diversesméthodes. Ici aussi, il serait trop long d'étendre leur mode d'utilisation.

Page 38: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 38 - 45

• Cache de sortie (output cache) : prend une "copie" instantanée duflux HTML puis supplante toute action de requête en imposant sa"copie" gardée en cache

• substitution : ce contrôle permet de ne pas mettre en cache unepartie de la page même si le cache est activé

• profils de cache : peuvent être créés dans le Web.Config et associépar leur nom aux pages qui en ont besoin

• fragments de cache : fonctionne comme le cache de sortie mais donnela possibilité au programmeur de ne mettre en cache qu'une partie dela page HTML. Le frament caching peut se faire grâce aux usercontrolsqui disposent eux-mêmes d'une directive Output

1.3.10. QueryString

QueryString permet de faire passer des informations via l'URI d'une pageà une autre.En reprenant l'exemple d'un ID de société sélectionné dans une pagedont les données sont présentées dans une autre page, on aurait trèsbien pu indiquer cet ID via l'URI lors de l'appel à la deuxième page.

Vous avez choisi la société ayant un ID = 1235, voici comment passerl'identifiant à la page suivante :<A href="page2.aspx?idsoc=1235"></A>

Pour récupérer l'ID dans la seconde page, il vous suffira de coder commesuit :<p>Vous avez choisi la société : &Request.QueryString("idsoc")</p>

Vous comprenez maintenant le pourquoi de certaines url complexes dugenre :http://www.monsite.com/repertoire/liste.asp?id=1257&lng=fr&action=del&[email protected]

1.4. Contrôles utilisateur ASP.NETIl peut arriver que vous ayez besoin dans un contrôle de fonctionnalitésdont les contrôles serveur Web ASP.NET intégrés ne disposent pas. Vouspouvez alors créer vos propres contrôles. Pour ce faire, vous disposez dedeux options : Vous pouvez créer :

o Des contrôles utilisateur. Les contrôles utilisateur sont desconteneurs dans lesquels vous pouvez placer des balises et descontrôles serveur Web. Vous pouvez ensuite traiter le contrôleutilisateur comme une unité et lui assigner des propriétés et desméthodes.

o Des contrôles personnalisés. Un contrôle personnalisé est uneclasse que vous écrivez et qui dérive de Control ou de WebControl.

Page 39: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 39 - 45

Les contrôles utilisateur sont beaucoup plus faciles à créer que lescontrôles personnalisés, dans la mesure où vous pouvez réutiliser descontrôles existants. Il est donc particulièrement facile de créer descontrôles comportant des éléments d'interface utilisateur complexes.Cette rubrique fournit une vue d'ensemble de l'utilisation des contrôlesutilisateur ASP.NET.

1.4.1. Structure de contrôle utilisateur

Un contrôle Web ASP.NET ressemble à une page ASP.NET complète (fichier.aspx), avec à la fois une page d'interface utilisateur et du code. Un contrôleutilisateur se crée de façon très semblable à une page ASP.NET. On lui ajoute parla suite le balisage et les contrôles enfants nécessaires. Tout comme une page,un contrôle utilisateur peut inclure du code servant à manipuler son contenu, etnotamment à effectuer des tâches telles que des liaisons de données.Un contrôle utilisateur présente les différences suivantes par rapport à une pageWeb ASP.NET :

• L'extension du nom de fichier du contrôle utilisateur est .ascx.

• Au lieu d'une directive @ Page, le contrôle utilisateur contient une directive

@ Control qui définit la configuration et d'autres propriétés.

• Les contrôles utilisateur ne peuvent pas s'exécuter comme des fichiers

autonomes. Vous devez au lieu de cela les ajouter à des pages ASP.NET,

comme vous le feriez pour n'importe quel contrôle.

• Le contrôle utilisateur ne contient pas d'élément html body ou form. Ces

éléments doivent se trouver dans la page d'hébergement.

Vous pouvez utiliser sur un contrôle utilisateur les mêmes éléments HTML (sauf

les éléments html, body ou form) et les mêmes contrôles Web que dans une

page Web ASP.NET. Par exemple, si vous créez un contrôle utilisateur afin de

l'utiliser comme barre d'outils, vous pouvez placer dessus une série de contrôles

serveur Web Button et créer des gestionnaires d'événements pour les boutons.

L'exemple suivant montre un contrôle utilisateur qui implémente un contrôle

Spinner dans lequel les utilisateurs peuvent cliquer à leur guise sur des boutons

pour naviguer dans une série de choix au sein d'une zone de texte.

Page 40: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 40 - 45

<%@ Control Language="VB" ClassName="UserControl1" %>

<script runat="server">

Protected colors As String() = {"Red", "Green", "Blue", "Yellow"}

Protected currentColorIndex As Integer = 0

Protected Sub Page_Load(ByVal sender As Object, _

ByVal e As System.EventArgs)

If IsPostBack Then

currentColorIndex = CInt(ViewState("currentColorIndex"))

Else

currentColorIndex = 0

DisplayColor()

End If

End Sub

Protected Sub DisplayColor()

textColor.Text = colors(currentColorIndex)

ViewState("currentColorIndex") = currentColorIndex.ToString()

End Sub

Protected Sub buttonUp_Click(ByVal sender As Object, _

ByVal e As System.EventArgs)

If currentColorIndex = 0 Then

currentColorIndex = colors.Length - 1

Else

currentColorIndex -= 1

End If

DisplayColor()

End Sub

Protected Sub buttonDown_Click(ByVal sender As Object, _

ByVal e As System.EventArgs)

If currentColorIndex = colors.Length - 1 Then

currentColorIndex = 0

Else

currentColorIndex += 1

End If

DisplayColor()

End Sub

</script>

<asp:TextBox ID="textColor" runat="server"

ReadOnly="True" />

<asp:Button Font-Bold="True" ID="buttonUp" runat="server"

Text="^" OnClick="buttonUp_Click" />

<asp:Button Font-Bold="True" ID="buttonDown" runat="server"

Text="v" OnClick="buttonDown_Click" />

1.4.2. Ajout d'un contrôle utilisateur à une pagePour utiliser un contrôle utilisateur, vous devez l'inclure dans une page WebASP.NET. Lorsqu'une demande est soumise concernant une page et que cette

Page 41: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 41 - 45

page contient un contrôle utilisateur, celui-ci passe par toutes les étapes dutraitement qu'effectuent tous les contrôles serveur ASP.NET.

Pour insérer un contrôle utilisateur dans une page Web Forms

1. Dans la page Web ASP.NET conteneur, créez une directive @ Register

comprenant :

• Un attribut TagPrefix, qui associe un préfixe au contrôle utilisateur.

Ce préfixe sera inclus dans la balise d'ouverture de l'élément du

contrôle utilisateur.

• Un attribut TagName, qui associe un nom au contrôle utilisateur.

Ce nom sera inclus dans la balise d'ouverture de l'élément du contrôle

utilisateur.

• Un attribut Src, qui définit le chemin d'accès virtuel au fichier

contrôle utilisateur que vous incluez.

2. Dans le corps de la page Web, déclarez l'élément contrôle utilisateur à

l'intérieur de l'élément form.

3. Éventuellement, si le contrôle utilisateur expose des propriétés publiques,

définissez-les de façon déclarative.

1.5. Validation des donnéesLa validation des données est en général la chose la plus importante dans un siteweb. Ici, nous allons pouvoir travailler côté client et côté serveur, c'estindispensable pour prévenir au plus tôt l'utilisateur d'une erreur éventuelle. Eneffet, il est inutile d'envoyer une demande au serveur si l'information transmiseest erronée : cela génère une perte de temps et un encombrement inutile duserveur.

La validation côté client est donc celle qui intervient la première et se fait engénéral en JavaScript. ASP.NET fournit des contrôles de validation qui génèrentle code javascript associé, vous évitant de connaître à fond le langage et dedevoir taper le code.

Les principaux contrôles de validation sont :

• RequiredFieldValidator• RangeValidator• CompareValidator• RegularExpressionValidator• CustomValidator• ValidationSummary

Page 42: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 42 - 45

Voyons un peu les caractéristiques générales de chacun.

1.5.1. RequiredFieldValidator

Le plus fréquemment utilisé car il est le seul qui peut s'assurer qu'un champn'est pas vide. En effet, tous les autres contrôles de validation acceptent unchamp vide donc, associer ce contrôle de validation aux autres contrôles permetcette vérification essentielle.Le RequiredFieldValidator a donc pour fonction de vérifier qu'un champ a étémodifié. Ses propriétés principales à renseigner sont :

Nom de lapropriété

Utilisation

ControlToValidate doit contenir le nom du contrôle à valider

ErrorMessagemessage à afficher en cas d'erreur dans lecontrôle ValidationSummary

InitialValuecontient une valeur qui invalide le contrôle sicelui-ci est égal à cette valeur précise

Text texte affiché en cas de non validation

Exemple de RequiredFieldValidator sur une TextBox nommée TxtNom :

<asp:RequiredFieldValidator ID="RequiredFieldValidator1"runat="server" ControlToValidate="TxtNom" ErrorMessage="Adminn'est pas un nom valide" SetFocusOnError="True"InitialValue="Admin"></asp:RequiredFieldValidator><asp:RequiredFieldValidator ID="RequiredFieldValidator2"runat="server" ControlToValidate="TxtNom" ErrorMessage="Lechamp nom est obligatoire" / >

Vous remarquez que pour valider le nom qui est obligatoire, il nous faut 2contrôles RequiredFieldValidator.Un pour signaler que le nom ne peut pas être un champ vide, l'autre pourinterdire l'utilisation du nom "Admin".

1.5.2. RangeValidator

Comme son nom l'indique, il sera utilisé pour valider l'encodage entre desbornes données. Par exemple, encoder un nombre entre 1 et 10.Les propriétés sont pratiquemment identiques à celles du contrôleprécédent :

Nom de la propriété UtilisationControlToValidate doit contenir le nom du contrôle à valider

ErrorMessagemessage à afficher en cas d'erreur dans lecontrôle ValidationSummary

Page 43: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 43 - 45

MinimumValue valeur minimale de la plage de données

MaximumValue valeur maximale de la plage de données

Text texte affiché en cas de non validation

Exemple de validation entre 1 et 10 :

<asp:Label ID="Label1" runat="server" Text="Entrez une valeurcomprise entre 1 et 10 :"</asp:Label><asp:TextBox ID="TxtValeur" runat="server"></asp:TextBox><asp:RangeValidator ID="RangeValidator1" runat="server"ErrorMessage="RangeValidator" MaximumValue="10" MinimumValue="1"Type="Integer" ControlToValidate="TxtValue">Valeur entre 1 et 10requise !</asp:RangeValidator>

1.5.3. CompareValidator

Il utilise un opérateur pour comparer les valeurs en présence et valider leurconcordance. La situation la plus courante d'utilisation est, bien entendu, lorsd'une deuxième saisie d'un mot de passe.Les propriétés restent aussi dans les mêmes normes. Par contre, vous pouvezavoir plusieurs types de validation :

Comparaison à un type.

<asp:CompareValidator runat="server" ID="CompareValidator1"ControlToValidate="TxtValeur" Type="Integer"Operator="DataTypeCheck" ErrorMessage="Doit être un chiffre entierde type integer !"</asp:CompareValidator>

Comparaison à une valeur.

<asp:CompareValidator runat="server" ID="CompareValidator1"ControlToValidate="TxtValeur" Type="Integer"Operator="GreaterThan" ValueToCompare="0" ErrorMessage="Un chiffrepositif est requis !"</asp:CompareValidator>

Comparaison à un autre champ.

<asp:CompareValidator runat="server" ID="CompareValidator1"ControlToValidate="TxtMotPasse2" Type="String"Operator="Equal" ControlToCompare="TxtMotPasse1"ErrorMessage="Les mots de passe ne correspondent pas!"</asp:CompareValidator>

1.5.4. RegularExpressionValidator

Ce contrôle valide un champ suivant une expression régulière. Il convient pourdes tests de validation très complexes mais demande beaucoup de ressourcesdonc, ne l'utilisez pas pour des validations qui peuvent se faire aisément avecplusieurs autres contrôles de validation.Il utilise les mêmes propriétés que les contrôles précédents avec en plus unepropriété ValidationExpression qui correspond évidemment à l'expressionrégulière de test.Un petit exemple de validation d'un numéro de compte bancaire pour en voirl'application :

Page 44: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 44 - 45

<asp:Label ID="Label1" runat="server" Text="Entrer votre numéro decompte :"</asp:Label> <td><asp:TextBox ID="TxtCptBancaire"runat="server"></asp:TextBox> <td><asp:RegularExpressionValidatorID="RegularExpressionValidator1" runat="server" ErrorMessage="RegularExpressionValidator"ControlToValidate="TxtCptBancaire" ValidationExpression="^\d{3}-\d{7}-\d{2}$">Formatincorrect</asp:RegularExpressionValidator>

1.5.5. CustomValidator

L'utilisateur définit lui-même une fonction pour effectuer la validation lorsque lescontrôles standards ne peuvent pas assumer ce rôle.Dans ce cas, les propriétés sont un peu différentes :

Dans le cas d'une validation côté client :

• La propriété ClientValidationFunction contient le nom de la fonction• La fonction doit être sous la forme : Function ValidationPersonnelle (source,

arguments)• la source est l'objet CustomValidator côté client• arguments est un objet comportant deux propriétés : Value et IsValid• La propriété Value est la valeur à valider• La propriété IsValid est un booléen retournant le résultat de la validation

La validation côté client s'effectue avec du code javascript soit entre les balisesad hoc, soit dans un fichier ".js" séparé.Ce genre de code est bien connu des développeurs javascript :

<script language="javascript">function Validation (obj, args){}

</script>Dans le cas d'une validation côté serveur :Placez le code de validation dans l'événement OnServerValidate

1.5.6. ValidationSummary

Ce contrôle n'est pas un contrôle de validation à proprement parler, ilsert à afficher sous différentes formes le résultat de tous les contrôles devalidation sur la page aspx si une erreur est survenue. Il est bien évidentque vous pouvez l'omettre et gérer vous-même un affichage d'erreur.

Le contrôle ValidationSummary s'affiche dès que la propriété IsValid de lapage est à False.Il interroge les différents contrôles non valides et récupère la valeur deleur propriété ErrorMessage.Pour afficher le résultat, vous avez les DisplayMode suivants à votredisposition :

Page 45: ASP.NET PARTIE1

Module 25 DEVELOPPEMENT DES APPLICATIONS WEB DYNAMIQUESTDI2 GB 2008/2009Sommaire

Document Millésime PageOFPPT @ C-A-001.doc février 09 45 - 45

• List : simple liste• BulletList : liste avec puces• SingleParagraph : les messages d'erreur sont concaténés les uns à la suite

des autres, séparés par une virgule

L'emplacement de l'affichage peut s'effectuer de deux manières :

• à l'emplacement du contrôle ValidationSummary : mettre sa propriétéShowSummary = True

• dans une boite de dialogue : mettre sa propriété ShowDialog = True

Il est aussi intéressant de s'arrêter un peu à la propriété ValidationGroup

des contrôles utilisateurs. En effet, regrouper certains contrôles sous un

même nom dans la propriété ValidationGroup permet de valider d'abord

une série de champs puis une autre suivant le résultat de la première

validation.