ASP.NET Plan ASP.NET ASP.NET
Transcription
ASP.NET Plan ASP.NET ASP.NET
Plan ASP.NET 1. Développement 2. Contrôles 2.1 2.2 2.3 2.4 Lionel Seinturier Université des Sciences et Technologies de Lille Contrôles élémentaires Présentation de données Gestion des utilisateurs Pagelet [email protected] 3. Compléments sur l'API 26/11/07 ASP.NET 1 Lionel Seinturier ASP.NET ASP.NET 2 Lionel Seinturier ASP.NET Active Server Pages (ASP) ASP vs ASP.NET • du code Java embarqué dans une page HTML • mêmes principes JSP, PHP • évolution des ASP pour prendre en compte .NET • extension .asp (.aspx pour ASP.NET) • ASP : VBScript ou JScript • ASP: interprété/non typé • les fichiers .aspx sont 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 ASP.NET : VB, C#, … ∀ langages .NET ASP.NET : compilé/typé ASP.NET vs JSP 1 Client IE Firefox ... ASP.NET 2 Serveur prog.aspx • modèle de programmation similaire • ++ ASP.NET = composants graphiques (contrôles) 3 4 CLR 3 ASP.NET vs servlet .NET • pas d'équivalent de l'API servlet dans le monde ASP.NET • en interne, les ASP.NET sont traduites en classes et compilées Lionel Seinturier ASP.NET 4 Lionel Seinturier 1. Développement 1. Développement Illustration du fonctionnement 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> <%@ 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> invocation Ö exécution côté serveur ce qui est renvoyé au client ASP.NET 5 Lionel Seinturier résultat = HTML généré via l'objet prédéfini Response <HTML> <BODY> <H1>Table des factorielles</H1> 1! = 1<BR> 2! = 2<BR> 3! = 6<BR> </BODY> </HTML> ASP.NET 1. Développement du code C# 6 Lionel Seinturier 1. Développement Principe de fonctionnement Méthodes et variables d'instance • plusieurs zones <% ... %> possibles dans une même ASP.NET • exécutées dans leur ordre de définition Entre les balises <script runat="server"> et </script> <%@ Page Language="c#" %> <HTML> <BODY> <H1>Compteur</H1> <script runat="server"> • 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 static int compteur = 0; • pas de persistence de l'instance (objet) entre 2 invocations • besoin : conserver de l'information ¾ déclarer des attributs static int GetCompteur() { return compteur++; } </script> <H1> <% Response.Write(GetCpt()); %> </H1> </BODY> </HTML> ASP.NET 7 Lionel Seinturier ASP.NET 8 Lionel Seinturier 1. Développement 1. Développement Exemple Balise <script> Le code peut être défini dans un fichier externe 1ère invocation <%@ Page Language="c#" %> <HTML> <BODY> <H1>Compteur</H1> <script runat="server" src="url" /> <H1> <% Response.Write(GetCpt()); %> </H1> </BODY> </HTML> 2ème invocation Directive Import ≈ using <%@ Import Namespace = "..."> ASP.NET 9 Lionel Seinturier ASP.NET 1. Développement 10 Lionel Seinturier 1. Développement Les objets implicites Récupération des données d'un formulaire Objets prédéclarés utilisables dans le code Propriété Params de l'objet prédéfini Request Request Response la requête qui a provoqué le chargement la réponse à la requête de chargement Session suivi de session pour un même client Ö retourne le texte saisi Ö ou null si le nom de paramètre n'existe pas Session.Add( string name, object value ) Session[string name] Application espace de données partagé entre toutes les ASP.NET idem Session Cache Server Trace données gardées en cache par le serveur information sur le serveur, inclusion, délégation de pages générer des traces d'exécution ASP.NET 11 <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> </BODY> </HTML> Lionel Seinturier ASP.NET 12 Lionel Seinturier 1. Développement 1. Développement Récupération des données d'un formulaire Inclusion de pages ASP.NET 4 ASP.NET 1 • aggrégation des résultats fournis par plusieurs page Ö meilleure modularité Ö meilleure réutilisation <%@ 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> ASP.NET 5 ASP.NET ASP.NET 3 Méthode Server.Execute Fichier inc.aspx <%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET principale</H1> <% Server.Execute(" inc.aspx "); %> </BODY> </HTML> clic ASP.NET 2 <%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET incluse</H1> </BODY> </HTML> URL ASP.NET 13 Lionel Seinturier ASP.NET 1. Développement 14 Lionel Seinturier 1. Développement Délégation de page Gestion des erreurs 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 Erreur d'exécution du code ex. : NullReferenceException, DivideByZeroException, … Méthode Server.Transfer Tout ce qui est après Transfer est ignoré Ö dans tous les cas, erreur récupérée dans le navigateur client 2 possibilités <%@ Page Language="c#" %> <HTML> <BODY> <H1>ASP.NET principale</H1> <% Server.Transfer(" transf.aspx "); %> </BODY> </HTML> • conserver la page par défaut construite par le serveur Web • en concevoir une adaptée aux besoins particuliers de l'application URL ASP.NET 15 Lionel Seinturier ASP.NET 16 Lionel Seinturier 1. Développement 1. Développement Exemple de gestion d'erreur 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 <%@ Page Language="c#" ErrorPage="err.aspx" %> <HTML> <BODY> <H1>Pourvu ... !!</H1> <% Random r = ... %> <H1> <% ... (12/hasard) %> </H1> </BODY> </HTML> <%@ Page Language="c#" %> <HTML> <BODY> <h1>Le 0 est sorti !!</h1> </BODY> </HTML> Si hasard = 0 page d'erreur err.aspx ASP.NET 17 Lionel Seinturier ASP.NET 1. Développement 18 1. Développement Gestion des traces Activation des traces • debugger • contrôler/inspecter le déroulement d'une appli web Ö à la main : Response.Write : lourd, long à enlever pour passer en prod. <%@ Page Trace="true" %> Objet prédéfini Trace Lionel Seinturier Exemple factorielle À chaque itération : Trace.Write( "i=" + i + " / fact=" + fact ); 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 ASP.NET 19 Lionel Seinturier ASP.NET 20 Lionel Seinturier Plan 2. Contrôles Philosophie ASP.NET 1. Développement Séparer 2. Contrôles • rendu graphique • traitement 2.1 2.2 2.3 2.4 Contrôles élémentaires Présentation de données Autres contrôles Pagelet 2 fichiers • .aspx le code de présentation et celui des contrôles fichier XTHML (HTML 4.0 formulé en XML) Web form 3. Compléments sur l'API ASP.NET 21 • .aspx.cs , .aspx.vb , … fichier dit codebehind classe contenant les traitements Lionel Seinturier ASP.NET 2. Contrôles 22 Lionel Seinturier 2. Contrôles Les contrôles Les contrôles existants par défaut Composants graphiques pour l’écriture de pages ASP.NET • toutes les balises HTML standards (<input> <img> <p> …) • composants supplémentaires fournis par MS (redondants avec HTML mais + évolués) • pour agir avec l'utilisateur • pour réagir aux actions de l'utilisateur : lui présenter de l'information : 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 ASP.NET 23 • affichage • bouton • saisie • liste • validation • divers • données • login • …. : Label, Image, Panel, Tabel : Button, Hyperlink, ImageButton, LinkButton : TextBox, CheckBox, RadioButton, FileUpload, … : ListBox, DropDownList, … : CompareValidator, RequiredFieldValidator, RangeValidator, … : Calendar : DataList, GridView, DetailsView + de nouveaux contrôles peuvent être programmés par l’utilisateur Lionel Seinturier ASP.NET 24 Lionel Seinturier 2.1 Contrôles élémentaires 2.1 Contrôles élémentaires Exemple Exemple Contrôles TextBox et Button Contrôles TextBox et Button Fichier WebForm1.aspx <%@ 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> Fichier WebForm1.aspx.cs public partial class WebForm1 : System.Web.UI.Page { public void MyButton_Click(object sender, System.EventArgs e) { MyTextBox.Text = "Hello world!"; } } demo >> ASP.NET 25 Lionel Seinturier ASP.NET 2.1 Contrôles élémentaires 26 2.1 Contrôles élémentaires Contrôle TextBox Association page - code Propriétés principales 1ère solution : .aspx + codebehind + association (On…) déclarée dans .aspx • 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 ASP.NET : le texte change (méthode de réaction OnTextChanged) 27 Lionel Seinturier Lionel Seinturier 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 28 Lionel Seinturier 2.2 Présentation de données 2.2 Présentation de données Contrôle GridView Contrôle DataSource • présentation d'information sous forme de tableau • édition, suppression • pager automatique • tri • “source” des données à afficher • SqlDataSource : un SGBD (SQL Server, …) • AccessDataSource : un fichier Access • XmlDataSource : un fichier XML • ObjectDataSource : des objets (C#, VB, …) Exemple d'utilisation • édition des données d'une table SQL Définition d’une SqlDataSource • une connection string (~ chemin d’accès aux données) • 4 commandes SQL : SELECT, INSERT, DELETE, UPDATE Ö associé à un contrôle DataSource ASP.NET 29 Lionel Seinturier ASP.NET 2.2 Présentation de données 30 2.2 Présentation de données Exemples Contrôle GridView Exemple de DataSource Propriétés principales <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> • ID • AllowPaging, AllowSorting • AutoGenerateColumns • AutoGenerateDeleteButton (idem Edit, Select) 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 ASP.NET 31 Lionel Seinturier • 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 >> Lionel Seinturier • RowUpdating : juste avant de mettre à voir une ligne • RowUpdated : après avoir mis à jour une ligne • idem SelectedIndexChanging/ed, Sorting/ed, RowDeleting/ed, PageIndexChanging/ed ASP.NET 32 Lionel Seinturier 2.2 Présentation de données 2.2 Présentation de données Contrôle DetailsView Exemple • 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> demo >> ASP.NET 33 Lionel Seinturier ASP.NET 34 2.3 Autres contrôles Lionel Seinturier 2.3 Autres contrôles Autre exemple de contrôle Contrôle Login Contrôle Login Modification du fichier Web.Config • 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 <configuration xmlns="http://schemas.microsoft.com/.NETConfiguration/v2.0"> <appSettings/> <connectionStrings> La base de données dans laquelle <remove name="LocalSqlServer"/> vont être stockées les infos de login <add name="LocalSqlServer" connectionString="Data Source= localhost;Initial Catalog=aspnetdb; Integrated Security=True" providerName="System.Data.SqlClient"/> </connectionStrings> • Login • LoginStatus • CreateUserWizard • ChangePassword • PasswordRecovery ASP.NET : se connecter : affichage du statut (connecté/non connecté) : création d’un nouvel utilisateur : changer le mot de passe du compte : récupérer son mot de passe 35 <system.web> <authentication mode="Windows"/> <authentication mode="Forms"/> Lionel Seinturier ASP.NET 36 Lionel Seinturier 2.3 Autres contrôles 2.3 Autres contrôles Contrôle Login Contrôle Login Modification du fichier Web.Config 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 <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> La réf. sur la chaîne </system.web> de connexion </configuration> • au moins 7 caractères • au moins 1 caractère non alphanumérique Ö possibilité de réduire ces exigences ASP.NET 37 Lionel Seinturier ASP.NET 2.3 Autres contrôles 38 2.4 Pagelet Contrôle Login Contrôles définis par l'utilisateur Création de la base des utilisateurs • factorisation de code HTML et de scripts • fichier .ascx • programme aspnet_regsql.exe Ö base SQL Server aspnetdb Lionel Seinturier \WINDOWS\Microsoft.NET\Framework\v2.0.xxx <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> • alternativement fichier XML Rq: gestion des utilisateurs et des “membership provider” via le site web d’admin <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> </tr></table> ASP.NET 39 Lionel Seinturier ASP.NET 40 Lionel Seinturier 2.4 Pagelet 2.4 Pagelet Utilisation de pagelet <%@ Register TagPrefix TagName Src Utilisation de pagelet le namespace XML choisi le nom de la pagelet choisi 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> clic <script runat="server"> void Click(object sender, System.EventArgs e) { Label.Text = JMA.Jour; } </script></body></html> ASP.NET 41 Lionel Seinturier ASP.NET 2.4 Pagelet 42 2.4 Pagelet Utilisation de pagelet Autre façon de définir des contrôles utilisateur • chaque pagelet est compilée en une classe nompagelet_ascx (ex : Date_ascx) <foo:bar id="JMA" runat="server" /> • instanciée lorsqu'on les utilise • étendre System.Web.UI.WebControls.WebControl • redéfinir CreateChildControls Alternativement 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 • peut être instanciée par programme • ajoutée dynamiquement à une page LoadControl("Date.ascx") 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); } } <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"> ... ASP.NET Lionel Seinturier 43 Lionel Seinturier ASP.NET 44 Lionel Seinturier Plan 3. Compléments sur l'API Les objets prédéfinis ASP.NET 1. Développement Request la requête qui a provoqué le chargement System.Web.HttpRequest 2. Contrôles 2.1 Contrôles élémentaires 2.2 Présentation de données 2.3 Pagelet 45 les paramètres de la requêtes .RawUrl .FilePath .PhysicalPath l'URL complète le chemin du fichier dans l'URL le chemin ϕ du fichier sur disque /foobar/c2/WebForm1.aspx c:\Inetput\wwwroot\foobar\c2\WebForm1.aspx .PhysicalApplicationPath la racine de l'application c:\Inetput\wwwroot\foobar\ 3. Compléments sur l'API ASP.NET .Params .Headers .UserHostName .UserHostAddress .UserLanguages .Cookies Lionel Seinturier les en-têtes de la requête HTTP l'@ du client l'IP du client les préférences du client en terme de langues lecture d'un cookie ASP.NET 3. Compléments sur l'API 46 Lionel Seinturier 3. Compléments sur l'API Les objets prédéfinis ASP.NET Les objets prédéfinis ASP.NET Response Session la réponse à une requête System.Web.HttpResponse gestion d'une session client System.Web.SessionState.HttpSessionState .ContentType .Cache le type MIME du contenu retourné au client (text/html, image/gif, …) gestion de la politique de cache de la réponse (date expiration) .SetCookie positionnement d'un cookie chez le client Fonctionne comme une table de hachage indicée • Session["key"] = object • object res = Session["key"] • object res = Session[int] • Session.Count • Session.GetEnumerator() • Session.Remove("key") • Session.RemoveAt(int) • Session.RemoveAll() // null si la clé n'existe pas le i-ème élément de la session le # d'éléments dans la session un itérateur sur toutes les éléments de la session • 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 47 Lionel Seinturier ASP.NET 48 Lionel Seinturier 3. Compléments sur l'API 3. Compléments sur l'API Les objets prédéfinis ASP.NET Les objets prédéfinis ASP.NET Application Cache espace de données partagé par tous les clients System.Web.HttpApplicationState System.Web.Caching.Cache Fonctionne comme une table de hachage indicée Server • Application["key"] = object • object res = Application["key"] • object res = Application[int] • Application.Count • Application.GetEnumerator() • Application.Remove("key") • Application.RemoveAt(int) • Application.RemoveAll() ASP.NET espace de données partagé par tous les clients ≠ par rapport Application : peut avoir une durée de vie limitée informations sur le server System.Web.HttpServerUtility // null si la clé n'existe pas le i-ème élément de la session le # d'éléments dans la session un itérateur sur toutes les éléments de la session 49 www.cours-ofppt.com Lionel Seinturier ASP.NET 50 Lionel Seinturier www.cours-ofppt.com