ASP.NET 1 Lionel Seinturier
ASP.NET
Lionel Seinturier
Université des Sciences et Technologies de Lille
Lionel.Seinturier@lifl.fr
26/11/07
ASP.NET 2 Lionel Seinturier
Plan
1. Développement
2. Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Gestion des utilisateurs
2.4 Pagelet
3. Compléments sur l'API
ASP.NET
Active Server Pages (ASP)
• du code Java embarqué dans une page HTML • mêmes principes JSP, PHP
• les fichiers .aspxsont stockés sur le serveur (comme des docs)
• ils sont désignés par une URL http://www.lifl.fr/prog.aspx
• le chargement de l'URL provoque l'exécution de l'ASP côté serveur
Client Serveur IE Firefox ... prog.aspx 1 4 2 3 CLR .NET
ASP.NET
ASP vs ASP.NET
• évolution des ASP pour prendre en compte .NET • extension .asp (.aspx pour ASP.NET)
• ASP : VBScript ou JScript ASP.NET : VB, C#, … ∀ langages .NET • ASP: interprété/non typé ASP.NET : compilé/typé
ASP.NET vs JSP
• modèle de programmation similaire
• ++ ASP.NET = composants graphiques (contrôles)
ASP.NET vs servlet
• pas d'équivalent de l'API servlet dans le monde ASP.NET • en interne, les ASP.NET sont traduites en classes et compilées
ASP.NET 5 Lionel Seinturier
1. Développement
<%@ Page Language="c#" %><HTML> <BODY>
<H1>Table des factorielles</H1> <%
int i,fact;
for ( i=1,fact=1 ; i<4 ; i++, fact*=i ) { Response.Write( i + "! =" + fact + "<BR>" ); } %> </BODY> </HTML>
Illustration du fonctionnement
invocation Ö exécution côté serveurASP.NET 6 Lionel Seinturier
1. Développement
Principe de fonctionnement
<%@ Page Language="c#" %> <HTML> <BODY>
<H1>Table des factorielles</H1> <%
int i,fact;
for ( i=1,fact=1 ; i<4 ; i++, fact*=i ) { Response.Write( i + "! =" + fact + "<BR>" ); } %> </BODY> </HTML> résultat = HTML généré via l'objet prédéfini Response du code C# <HTML> <BODY>
<H1>Table des factorielles</H1> 1! = 1<BR> 2! = 2<BR> 3! = 6<BR> </BODY> </HTML> ce qui est renvoyé au client
1. Développement
Principe de fonctionnement
• plusieurs zones <%... %>possibles dans une même ASP.NET
• exécutées dans leur ordre de définition • une classe générée pour chaque ASP.NET
• ne change pas tant que le fichier .aspx n'est pas modifié • instanciée pour traiter une requête
• pas de persistence de l'instance (objet) entre 2 invocations • besoin : conserver de l'information
¾ déclarer des attributs static
1. Développement
Méthodes et variables d'instance
Entre les balises <script runat="server">et </script> <%@ Page Language="c#" %>
<HTML> <BODY> <H1>Compteur</H1> <script runat="server">
static int compteur = 0; int GetCompteur() { return compteur++; } </script> <H1> <% Response.Write(GetCpt()); %> </H1> </BODY> </HTML>
ASP.NET 9 Lionel Seinturier
1. Développement
Exemple
2ème invocation 1ère invocation
ASP.NET 10 Lionel Seinturier
1. Développement
Balise <script>
Le code peut être défini dans un fichier externe
<%@ Page Language="c#" %> <HTML> <BODY>
<H1>Compteur</H1>
<script runat="server" src="url" /> <H1> <% Response.Write(GetCpt()); %> </H1> </BODY> </HTML>
Directive Import
<%@ Import Namespace = "..."> ≈ using
1. Développement
Les objets implicites
Objets prédéclarés utilisables dans le code
Request la requête qui a provoqué le chargement Response la réponse à la requête de chargement Session suivi de session pour un même client
Session.Add( string name, object value ) Session[string name]
Application espace de données partagé entre toutes les ASP.NET
idem Session
Cache données gardées en cache par le serveur
Server information sur le serveur, inclusion, délégation de pages Trace générer des traces d'exécution
1. Développement
Récupération des données d'un formulaire
Propriété Paramsde l'objet prédéfini Request
Ö retourne le texte saisi
Ö ou nullsi le nom de paramètre n'existe pas
<HTML> <BODY>
<FORM ACTION="http://..." METHOD=POST>
Nom <INPUT NAME="nom"> <P> Prénom <INPUT NAME="prenom"> <P> <INPUT TYPE=SUBMIT VALUE="Envoi"> <INPUT TYPE=RESET
VALUE="Remise à zéro"> </FORM>
ASP.NET 13 Lionel Seinturier
1. Développement
<%@ Page Language="c#" %> <HTML> <BODY> <H1>Exemple de résultat</H1> Bonjour <% Response.Write( Request.Params.Get("prenom") ); %> <% Response.Write( Request.Params.Get("nom") ); %> </BODY> </HTML>Récupération des données d'un formulaire
clic
ASP.NET 14 Lionel Seinturier
1. Développement
Inclusion de pages
• aggrégation des résultats fournis par plusieurs page
Ö meilleure modularité Ö meilleure réutilisation Méthode Server.Execute ASP.NET ASP.NET 1 ASP.NET 2 ASP.NET 3 ASP.NET 4 ASP.NET 5 <%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET principale</H1> <% Server.Execute(" inc.aspx "); %> </BODY> </HTML> Fichier inc.aspx <%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET incluse</H1> </BODY> </HTML> URL
1. Développement
Délégation de page
Une page peut déléger le traitement d'une requête à une autre Ö prise en compte complète de la requête par la page déléguée Méthode Server.Transfer
Tout ce qui est après Transferest ignoré
<%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET principale</H1> <% Server.Transfer(" transf.aspx "); %> </BODY> </HTML> URL
1. Développement
Gestion des erreurs
Erreur d'exécution du code
ex. : NullReferenceException, DivideByZeroException, …
Ö dans tous les cas, erreur récupérée dans le navigateur client
2 possibilités
• conserver la page par défaut construite par le serveur Web • en concevoir une adaptée aux besoins particuliers de l'application
ASP.NET 17 Lionel Seinturier
1. Développement
Exemple de gestion d'erreur
<%@ Page Language="c#" %> <HTML> <BODY>
<H1>Pourvu ... !!</H1> <% Random r = new Random(); double h = (double)r.Next();
int hasard = (int) (h/Int32.MaxValue*5); %> <H1> <% Response.Write(12/hasard); %> </H1> </BODY> </HTML>
Si hasard = 0 page d'erreur par défaut
ASP.NET 18 Lionel Seinturier
1. Développement
Exemple de gestion d'erreur
<%@ Page Language="c#" %>
<HTML> <BODY>
<h1>Le 0 est sorti !!</h1>
</BODY> </HTML>
Si hasard = 0
page d'erreur err.aspx <%@ Page Language="c#" ErrorPage="err.aspx" %> <HTML> <BODY> <H1>Pourvu ... !!</H1> <% Random r = ... %> <H1> <% ... (12/hasard) %> </H1> </BODY> </HTML>
1. Développement
Gestion des traces
• debugger
• contrôler/inspecter le déroulement d'une appli web
Ö à la main : Response.Write : lourd, long à enlever pour passer en prod.
Objet prédéfini Trace System.Web.TraceContext
• Trace.Write(string message)
• Trace.Write(string categorie, string message)
• Trace.Write(string categorie, string message, Exception e)
• idem méthode Warn : les messages apparaissent en rouge dans les traces
1. Développement
Activation des traces
<%@ Page Trace="true" %>
Exemple factorielle À chaque itération :
ASP.NET 21 Lionel Seinturier
Plan
1. Développement
2. Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Autres contrôles
2.4 Pagelet
3. Compléments sur l'API
ASP.NET 22 Lionel Seinturier
2. Contrôles
Philosophie ASP.NET
Séparer • rendu graphique • traitement 2 fichiers • .aspxle code de présentation et celui des contrôles fichier XTHML (HTML 4.0 formulé en XML) Web form
• .aspx.cs , .aspx.vb , … fichier dit codebehind
classe contenant les traitements
2. Contrôles
Les contrôles
Composants graphiques pour l’écriture de pages ASP.NET
• pour agir avec l'utilisateur : lui présenter de l'information • pour réagir aux actions de l'utilisateur : déclencher des traitements • utilisation en drag-and-drop dans VS pour la conception page web
• analogue atelier conception IHM en client lourd • classe / objet
• propriétés : les caractéristiques d'affichage (ex. Text pour un TextBox) • événements: réactions (clic, frappe, changement, …)
• autant d'objets par page que de contrôles "déposés" sur la page • interaction avec la page ≡ interaction avec les objets • rendu HTML de la page à partir de l'état des objets
2. Contrôles
Les contrôles existants par défaut
• toutes les balises HTML standards (<input> <img> <p> …)
• composants supplémentaires fournis par MS (redondants avec HTML mais + évolués) • affichage : Label, Image, Panel, Tabel
• bouton : Button, Hyperlink, ImageButton, LinkButton • saisie : TextBox, CheckBox, RadioButton, FileUpload, … • liste : ListBox, DropDownList, …
• validation : CompareValidator, RequiredFieldValidator, RangeValidator, … • divers : Calendar
• données : DataList, GridView, DetailsView • login
• ….
ASP.NET 25 Lionel Seinturier
2.1 Contrôles élémentaires
Exemple
Contrôles TextBox et Button
demo >>
ASP.NET 26 Lionel Seinturier
2.1 Contrôles élémentaires
Exemple
Contrôles TextBox et Button
<%@ Page Language="c#" CodeFile="WebForm1.aspx.cs" Inherits="WebForm1" %> <html>
<body>
<form id="form1" runat="server">
<asp:TextBox ID="MyTextBox" runat="server" />
<asp:Button ID="MyButton" runat="server" OnClick="MyButton_Click" /> </form>
</body>
public partial class WebForm1 : System.Web.UI.Page {
public void MyButton_Click(object sender, System.EventArgs e) { MyTextBox.Text = "Hello world!";
} } Fichier WebForm1.aspx.cs Fichier WebForm1.aspx
2.1 Contrôles élémentaires
Contrôle TextBox
Propriétés principales• ID : identificateur unique (propriété présente pour tous les contrôles) • Text : le texte affiché
• MaxLength : taille max du texte
• TextMode : SingleLine | MultiLine | Password • ReadOnly : false | true
• Columns : le nombre de colonnes
• Rows : le nombre de lignes (MultiLine) • BackColor, BorderColor, ForeColor : couleurs • BorderStyle, BorderWidth, Font : affichage
Événement principal
• TextChanged : le texte change (méthode de réaction OnTextChanged)
2.1 Contrôles élémentaires
Association page - code
1ère solution : .aspx + codebehind + association (On…) déclarée dans .aspx 2ème solution : sans codebehind
• définir le code des méthodes de traitements des événements dans le fichier .aspx entre des balises <script runat="server">et </script>
Ö 1 seul fichier à gérer, moins modulaire
3ème solution : .aspx + codebehind + association (On…) déclarée dans codebehind • ne pas utiliser l'attribut OnClick dans le fichier .aspx
• ajouter un gestionnaire d'événement sur le bouton dans le code C# en redéfinissant la méthode exécutée lors du chargement (OnInit) Ö couplage moins fort entre le fichier .aspx et le codebehind Ö plus difficile à manipuler, moins intuitif
ASP.NET 29 Lionel Seinturier
2.2 Présentation de données
Contrôle GridView
• présentation d'information sous forme de tableau • édition, suppression
• pager automatique • tri
Exemple d'utilisation
• édition des données d'une table SQL
Ö associé à un contrôle DataSource
ASP.NET 30 Lionel Seinturier
2.2 Présentation de données
Contrôle DataSource
• “source” des données à afficher
• SqlDataSource : un SGBD (SQL Server, …) • AccessDataSource : un fichier Access
• XmlDataSource : un fichier XML • ObjectDataSource : des objets (C#, VB, …)
Définition d’une SqlDataSource
• une connection string (~ chemin d’accès aux données) • 4 commandes SQL : SELECT, INSERT, DELETE, UPDATE
2.2 Présentation de données
Exemples
Exemple de DataSource
<asp:SqlDataSource ID="SqlDataSource1" runat="server"
ConnectionString="Driver={SQL Server};server=localhost;database=master" ProviderName="System.Data.Odbc"
SelectCommand="SELECT * FROM [foo]"
DeleteCommand="DELETE FROM [foo] WHERE [nom] = ?"
InsertCommand="INSERT INTO [foo] ([nom], [age]) VALUES (?, ?)" UpdateCommand="UPDATE [foo] SET [age] = ? WHERE [nom] = ?"> </asp:SqlDataSource>
Exemple de GridView
<asp:GridView ID="GridView1" runat="server"
DataSourceID="SqlDataSource1" DataKeyNames="nom" AutoGenerateColumns="True"
AllowPaging="True" PageSize="4" AllowSorting="True"
AutoGenerateEditButton="true" AutoGenerateDeleteButton="true"> </asp:GridView> demo >>
2.2 Présentation de données
Contrôle GridView
Propriétés principales • ID • AllowPaging, AllowSorting • AutoGenerateColumns• AutoGenerateDeleteButton (idem Edit, Select) • Rows : les lignes affichées dans le GridView • SelectedIndex : l'indice de la ligne sélectionnée
• ex. utilisation : GridView1.Rows[GridView1.SelectedIndex].Cells[0].Text
• EditIndex, PageIndex Événements principaux
• RowUpdating : juste avant de mettre à voir une ligne • RowUpdated : après avoir mis à jour une ligne
ASP.NET 33 Lionel Seinturier
2.2 Présentation de données
Contrôle DetailsView
• présentation sous forme de fiches
• même action que GridView (édition, suppression) • action supplémentaire : ajout
<asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="SqlDataSource1" DataKeyNames="nom" AutoGenerateRows="true" AutoGenerateEditButton="True" AutoGenerateDeleteButton="True" AutoGenerateInsertButton="True" AllowPaging="True" > </asp:DetailsView>
ASP.NET 34 Lionel Seinturier
2.2 Présentation de données
Exemple
demo >>
2.3 Autres contrôles
Autre exemple de contrôle
Contrôle Login
• gérer les comptes utilisateurs sur un site • créer des comptes
• les stocker dans une base de données
• offrir un contenu différents selon que l’utilisateur est connecté ou non • Login : se connecter
• LoginStatus : affichage du statut (connecté/non connecté) • CreateUserWizard : création d’un nouvel utilisateur
• ChangePassword : changer le mot de passe du compte • PasswordRecovery : récupérer son mot de passe
2.3 Autres contrôles
Contrôle Login
Modification du fichier Web.Config
<configuration xmlns="http://schemas.microsoft.com/.NETConfiguration/v2.0"> <appSettings/> <connectionStrings> <remove name="LocalSqlServer"/> <add name="LocalSqlServer"
connectionString="Data Source= localhost;Initial Catalog=aspnetdb; Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> <system.web> <authentication mode="Windows"/> <authentication mode="Forms"/>
La base de données dans laquelle vont être stockées les infos de login
ASP.NET 37 Lionel Seinturier
2.3 Autres contrôles
Contrôle Login
Modification du fichier Web.Config
Par défaut le contrôle Login impose des règles strictes de sécurité sur les mots de passe • au moins 7 caractères
• au moins 1 caractère non alphanumérique Ö possibilité de réduire ces exigences
ASP.NET 38 Lionel Seinturier
2.3 Autres contrôles
Contrôle Login
Modification du fichier Web.Config
<system.web> <authentication mode="Forms"/> <membership defaultProvider="MyMembershipProvider" > <providers> <add name="MyMembershipProvider" type="System.Web.Security.SqlMembershipProvider" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="1" passwordStrengthRegularExpression="" connectionStringName=" LocalSqlServer " /> </providers> </membership> </system.web> </configuration> La réf. sur la chaîne de connexion
2.3 Autres contrôles
Contrôle Login
Création de la base des utilisateurs
• programme aspnet_regsql.exe \WINDOWS\Microsoft.NET\Framework\v2.0.xxx Ö base SQL Server aspnetdb
• alternativement fichier XML
Rq: gestion des utilisateurs et des “membership provider” via le site web d’admin
2.4 Pagelet
Contrôles définis par l'utilisateur
• factorisation de code HTML et de scripts • fichier .ascx
<table><tr>
<td><asp:textbox id="jour" runat="server" /></td><td>/</td> <td><asp:textbox id="mois" runat="server" /></td><td>/</td> <td><asp:textbox id="annee" runat="server" /></td>
<script language="c#" runat="server">
public string Jour { // les propriétés de la pagelet get { return jour.Text; }
set { jour.Text=value; } }
/* idem Mois, Annee */ </script>
ASP.NET 41 Lionel Seinturier
2.4 Pagelet
Utilisation de pagelet
<%@ Register
TagPrefix le namespace XML choisi TagName le nom de la pagelet choisi Src l'URL pour accéder au fichier .ascx
<%@ Register TagPrefix="foo" TagName="bar" Src="Date.ascx" %> <%@ Page Language="c#" %>
<html><body>
<form runat="server">
<foo:bar id="JMA" runat="server" /> <asp:label id="Label" runat="server" />
<asp:button id="Button" text="Go!" runat="server" onclick="Click" /> </form>
<script runat="server">
void Click(object sender, System.EventArgs e) { Label.Text = JMA.Jour;
}
</script></body></html>
ASP.NET 42 Lionel Seinturier
2.4 Pagelet
Utilisation de pagelet
clic
2.4 Pagelet
Utilisation de pagelet
• chaque pagelet est compilée en une classe nompagelet_ascx (ex : Date_ascx) • instanciée lorsqu'on les utilise <foo:bar id="JMA" runat="server" />
Alternativement
• peut être instanciée par programme LoadControl("Date.ascx")
• ajoutée dynamiquement à une page
<script runat="server"> void Page_Load() { Control dt = LoadControl("Date.ascx"); ((Date_ascx)dt).Jour = 12; Frm.Controls.Add(dt); } </script>
<form id="Frm" runat="server"> ...
2.4 Pagelet
Autre façon de définir des contrôles utilisateur
• étendre System.Web.UI.WebControls.WebControl
• redéfinir CreateChildControls
Avantage : le contrôle peut-etre défini à l'aide d'un DOM HTML Ö on ne se préoccupe pas d'écrire le code HTML
public class MyWebControl : WebControl {
protected override void CreateChildControls() { Table tbl = new Table();
TableRow row = new tableRow(); TableCell cell = new TableCell(); TextBox box = new TextBox(); box.ID = "jour"; cell.Controls.Add(box); row.Cells.Add(cell); table.Rows.Add(row); Controls.Add(table); } }
ASP.NET 45 Lionel Seinturier
Plan
1. Développement
2. Contrôles
2.1 Contrôles élémentaires
2.2 Présentation de données
2.3 Pagelet
3. Compléments sur l'API
ASP.NET 46 Lionel Seinturier
3. Compléments sur l'API
Les objets prédéfinis ASP.NET
Request la requête qui a provoqué le chargement
System.Web.HttpRequest
.Params les paramètres de la requêtes .RawUrl l'URL complète
.FilePath le chemin du fichier dans l'URL /foobar/c2/WebForm1.aspx
.PhysicalPath le chemin ϕ du fichier sur disque
c:\Inetput\wwwroot\foobar\c2\WebForm1.aspx
.PhysicalApplicationPath la racine de l'application
c:\Inetput\wwwroot\foobar\
.Headers les en-têtes de la requête HTTP .UserHostName l'@ du client
.UserHostAddress l'IP du client
.UserLanguages les préférences du client en terme de langues .Cookies lecture d'un cookie
3. Compléments sur l'API
Les objets prédéfinis ASP.NET
Response la réponse à une requête
System.Web.HttpResponse
.ContentType le type MIME du contenu retourné au client (text/html, image/gif, …) .Cache gestion de la politique de cache de la réponse (date expiration) .SetCookie positionnement d'un cookie chez le client
3. Compléments sur l'API
Les objets prédéfinis ASP.NET
Session gestion d'une session client
System.Web.SessionState.HttpSessionState
Fonctionne comme une table de hachage indicée • Session["key"] = object
• object res = Session["key"] // null si la clé n'existe pas • object res = Session[int] le i-ème élément de la session • Session.Count le # d'éléments dans la session
• Session.GetEnumerator() un itérateur sur toutes les éléments de la session • Session.Remove("key")
• Session.RemoveAt(int) • Session.RemoveAll()
• Session créée lors de la 1ère visite d'un client (Session.IsNewSession vaut true) • Session.Timeout délai d'inactivité (en minutes) au delà duquel la session expire
ASP.NET 49 Lionel Seinturier
3. Compléments sur l'API
Les objets prédéfinis ASP.NET
Application espace de données partagé par tous les clients
System.Web.HttpApplicationState
Fonctionne comme une table de hachage indicée • Application["key"] = object
• object res = Application["key"] // null si la clé n'existe pas • object res = Application[int] le i-ème élément de la session • Application.Count le # d'éléments dans la session
• Application.GetEnumerator() un itérateur sur toutes les éléments de la session • Application.Remove("key")
• Application.RemoveAt(int) • Application.RemoveAll()
ASP.NET 50 Lionel Seinturier
3. Compléments sur l'API
Les objets prédéfinis ASP.NET
Cache espace de données partagé par tous les clients
≠ par rapport Application : peut avoir une durée de vie limitée
System.Web.Caching.Cache
Server informations sur le server