Programování v prostředí.net ASP.NET 1 / 50
Obsah přednášky Dynamický web ASP.NET ASP.NET třídy Kontrolky Validace Stavy Bezpečnost 2 / 50
Dynamický web Stránka vytvořena programově na straně serveru poté odeslána klientovi Webové aplikace lehcí klienti většinu práce oddře server data driven web web řízený daty napojení na databáze 3 / 50
Webové aplikace Přístup k datům je vzdálený neznámý čas - záleží na mnoha faktorech fyzická vzdálenost od serveru kvalita sítě denní doba Přístup k datům je hromadný v jednu chvíli může k datům přistupovat mnoho uživatelů zajištění konzistence dat Přístup k datům je různorodý různí weboví klienti různé operační systémy různé HW platformy 4 / 50
Požadavek a odezva Request, Response Přístup k aplikaci probíhá pomocí webového prohlížeče požadavky předány pomocí HTTP HyperText Transfer Protocol Aplikace je spuštena na webovém serveru server přijme požadavek a rozhodne, která aplikace bude zodpovědná za odezvu Odezva odeslána ke klientovi opět prostřednictvím HTTP obsah je většinou HTML stránka HyperText Markup Language 5 / 50
HTTP Nezachovává připojení každý požadavek a odezva je izolovaný packet Problém s udržením stavu aplikace např. nákupní košík Není jednoznačné řešení ukládání informace na straně serveru pro velké servery může být paměťově velmi náročné není zaručeno (a většinou to tak ani není), že se klient odpojí nějak regulérně ukládání na straně klienta cookies musí se posílat s každým požadavkem musí být limitovaná velikost klient je může mít zakázané 6 / 50
Systémy pro tvorbu dynamických webů Rychlost vývoje dostupné knihovny a znovuvyužití kódu Výkonnost interpretované x kompilované Přehlednost míchání html a kódu Nástroje debuggery, profilery,... Skalabilita snadnost přenesení na web farmy Znalost jazyka... 7 / 50
Systémy pro tvorbu dynamických webů PHP Perl JSP ASP ASP.NET... 8 / 50
ASP.NET Server má k dispozici.net class library Stránka se kompiluje popis se přeloží do assembly při prvním spuštění prodleva, pak už rychlé Možnost separace kódu a vzhledu stránky code-behind dva oddělené soubory Možnost použití standardních nástrojů např. MSVS, včetně debuggeru... Možnost použít libovolný jazyk který má podporu.net 9 / 50
ASP.NET Uchovaní stavu cookies (klient) specialní služba ASP.NET State Service (server) SQL Server DB (server) Web kontrolky podobně jako kontrolky na winformech unifikace kontrolek množství předdefinovaných kontrolek možnost vytváření uživatelských kontrolek 10 / 50
Příklad <%@ Page language ="C#" %> <html > <head > < script runat =" server "> DateTime Now () { return DateTime. Now ; } </ script > </ head > <body > <h1 >Ahoj světe </h1 > <p>teď je: <% Response. Write ( Now (). ToString ());% > </p> </ body > </ html > 11 / 50
ASPX soubor Direktivy <%@ direktiva atributy %> Page Import ekvivalent using (zahrnuje NameSpace) Serverové kontrolky elementy s atributem runat=server Serverové skripty HTML script element s atributem runat=server 12 / 50
Code behind Oddělení kódu a designu stránek zvyšuje přehlednost Kód stránky lze uložit do separátního souboru Překladem projektu vznikne assembly, která se umístí do adresáře bin Stránka dědí od stránky Inherits ze souboru CodeFile <?@ Page language =C# CodeFile =" stranka. cs" Inherits =" stranka "?> 13 / 50
Příklad WebForm1.aspx <%@ Page language ="c#" CodeFile =" WebForm1. aspx.cs" Inherits =" WebForm1 " % > <html > <body > <h1 >Ahoj světe </h1 > <p>teď je: <input type =" Text " id=" Cas " runat =" server " value =" moc hodin "> </p> </ body > </ html > WebForm1.aspx.cs... public class WebForm1 : System. Web. UI. Page { private void Page_ Load ( object sender, System. EventArgs e) { Cas. Value = DateTime. Now. ToString (); }... } 14 / 50
System.Web.UI.Page Reprezentuje.ASPX soubor (Web Form) Soubor.ASPX se naparsuje, přeloží do potomka Page a uloží do assembly Je-li použit code-behind, dědí se od této třídy 15 / 50
Co se děje při generování Bloky skriptu s atributem runat= server se vloží přímo do definice třídy < script runat =" server "> DateTime Now () { return DateTime. Now ; } </ script > Každá serverová kontrolka se přidá do třídy jako atribut příslušného typu <asp : Label id=" Label1 " runat =" server ">Lable1 </ asp : Label > Bloky <% %> se vloží spolu s HTML do metody, která se volá při renderování stránky Teď je: <% Response. Write ( Now (). ToString ());% > 16 / 50
Události Init v okamžiku inicializace kontolky na začátku Load když je kontrolka nahrána do objektu Page stále začátek nedošlo ke zpracování událostí PreRender po obsluze událostí před vykreslením stránky Unload po vykreslení stránky před uvolněním z paměti 17 / 50
System.Web.HttpContext Zapouzdřuje všechny informace o jednom požadavku HttpRequest Request HttpResponse Response HttpApplicationState Application HttpSessionState Session... Snadno přístupná vlastnost Context 18 / 50
System.Web.HttpApplication Slučuje metody, vlastnosti a události, které jsou společné pro celou aplikaci Umožňuje změnit chování aplikace Lze oddědit Global.asax Application_Start Session_Start Application_BeginRequest... 19 / 50
Web formuláře Formuláře jsou jednou z možností, jak na stránky umístit aktivní obsah (tlačítka, textboxy,...) Příklad <%@ Page language ="C#" %> <html > < script runat =" server " > void Page_Load () { text2. Value = text1. Value ; text1. Value = DateTime. Now. ToString (); } </ script > <body > <form runat =" server " > <h1 >Ahoj světe </h1 > Teď je : <input type =" text " id=" text1 " runat =" server " ><br/ > Předtím bylo : <input type =" text " id=" text2 " runat =" server " ><br/ > <input type =" submit " runat =" server " ID=" Submit1 " NAME =" Submit1 "> </ form > </ body > </ html > 20 / 50
Kontrolky Elementy označené atributem runat="server" existují i na serveru serverové kontrolky Každá kontrolka je na serveru reprezentovaná proměnnou název lze určit atributem ID Atribut runat="server" lze nastavit pro každý html element příklad... h1. Attributes. Add (" style "," color : red ");... <h1 runat =" server " id="h1">ahoj světe </h1 > 21 / 50
HTML kontrolky Reprezentují HTML elementy označené atributem runat="server" Ke každému elementu vytvořen v.netu datový typ těsně kopíruje vlastnosti elementu těsně kopíruje interface elementu Problém s přístupem k takovýmto objektům vytvoření jednotného přístupu Web kontrolky 22 / 50
Web kontrolky Ucelenější hierarchie kontrolek Jednotné rozhraní Systém vázání dat Kontrolky se renderují jako jeden či více html elementů uživatel je odstíněn Možnost vytvářet vlastní kontrolky Existence několika složitějších kontrolek Calendar DataGrid DataList 23 / 50
Příklad Zdroják <%@ Page language ="C#" %> <html > < script runat =" server " > void Page_Load () { text2. Text = text1. Text ; text1. Text = DateTime. Now. ToString (); } </ script > <body > <form id=" Form1 " method =" post " runat =" server "> <h1 >Ahoj světe </h1 > Teď je : <asp : Label id=" text1 " runat =" server " ></ asp : Label > <br/> Předtím bylo : <asp : Label id=" text2 " runat =" server " ></ asp : Label ><br/> <asp : Button Text =" Obnov " runat =" server " ID=" Button1 "></ asp : Button > </ form > </ body > </ html > 24 / 50
Příklad HTML výstup <html > <body > <form name =" Form1 " method =" post " action =" index1. aspx " id=" Form1 "> <input type =" hidden " name =" VIEWSTATE " value =" ddwtmtyp... " <h1 >Ahoj světe </h1 > Teď je: <span id=" text1 ">20.11.2005 23:42:50 </ span ><br/> Předtím bylo : <span id=" text2 ">20.11.2005 23:36:33 </ span ><br/> <input type =" submit " name =" _ctl0 " value =" Obnov "/> <input type =" hidden " name =" EVENTVALIDATION " value ="/ wew.. </ form > </ body > </ html > 25 / 50
Web formuláře Kontrolky na formuláři označené atributem runat="server" HTML kontrolky těsně kopírují rozhraní dané HTML specifikací příklad <input type =" text " runat =" server "></ input > Web kontrolky unifikované rozhraní pro práci s web formuláři příklad <asp : TextBox runat =" server "></ asp : TextBox > 26 / 50
Uživatelské kontrolky Jednoduchá kontrolka oddědit od Control nebo WebControl přidat data a logiku kontrolky překrýt metodu Render zkompilovat do assembly nakopírovat assembly do adresáře bin zaregistrovat kontrolku <%@ Register TagPrefix =" Custom " Namespace =" CustomControls " Assembly = " CustomControls " % > 27 / 50
Uživatelské kontrolky Komponované kontrolky celá stránka lze převést na kontrolku odstranit elementy form, body, head, html změnit @Page na @Control změnit příponu na.ascx při použití code-behind dědit od UserControl 28 / 50
Validace na straně serveru Událost se provede teprve po odeslání stránky zpět na server Možnost nastavit vlastnost AutoPostBack, odeslání na server se provede automaticky při změně textu Po odeslání na server provést validaci a případné chyby odeslat zpět klientovi Vhodné pro složité kontroly porovnání proti DB Nevhodné pro jednoduché kontroly zbytečné zatížení spojení 29 / 50
Validace na straně klienta Použití validátorů RequiredFieldValidator požaduje vyplněný text CompareValidator porovnání vůči konstantě Operace Equal, NotEqual,... RangeValidator kontroluje rozsah vstupu RegularExpressionValidator porovnává s regulárním výrazem CustomValidator libovolná obsluha validace vlasnost IsValid 30 / 50
Validace na straně klienta Vlastnosti validátorů ControlToValidate nastavení vstupní kontrolky, která se má validovat ErrorMessage zpráva, která se má zobrazit při chybě EnableClientScript pokusit se o validaci na straně klienta Funkce validátorů validace na straně klienta proběhne pouze v případě že je nastaven EnableClientScript klient podporuje DHTML v opačném případě probíhá validace na serveru 31 / 50
Validace na straně klienta ValidationSummary možnost zobrazit chyby z validátorů na jednom místě vše se nastavuje automaticky možnost zobrazit text nebo dialog u validátorů vhodné nastavit Text na * a umístit je k odpovídajícím kontrolkám zobrazení se provede až po stisku tlačítka, nemusí dojít k odeslání na server 32 / 50
Stavy Důležité pro dynamiku stránek Umožňuje zásah uživatele do aplikace V ASP.NET následující kategorie stavů stav aplikace (application state) stav relace (session state) stav zobrazení (view state) stav koláčků (cookie state) 33 / 50
Stavy Stav je informace, která přetrvává Obvykle je informace složena z názvu (klíče) a hodnoty Např. CenaZboží = 300 VybranáLokalita = České Budějovice Login = Superuživatel 34 / 50
Stav aplikace Týká se celé aplikace (všech stránek, které jsou součástí projektu) Vytvoří se v okamžiku připojení prvního uživatele, přežívá dokud není služba zastavena či restartována Vhodné pro malá data často používaná data stabilní data 35 / 50
Stav aplikace Možnost získat stav z HttpApplicationState Application K jednotlivým položkám možno přistupovat pomocí stringového indexeru Příklad this. Application [" LibovolnyObjekt "] = new LibovolnyObjekt ; LibovolnyObjekt o = ( LibovolnyObjekt ) this. Application [" LibovolnyObjekt "]; 36 / 50
Stav aplikace Nutnost řešit přístupové konflikty (stav společný pro všechny uživatele) Může způsobit nekonzistenci dat Možnost/nutnost uzamknout přístup k proměnným Application.Lock() čeká, dokud si neuzme aplikaci pro sebe Application.UnLock() uvolní aplikaci pro další zájemce (nezapomenout zavolat!) 37 / 50
Stav relace Komunikace serveru s jedním uživatelem v jednom prohlížeči ASP.NET řeší do velké míry automaticky Při zahájení relace se vygeneruje session ID, které se předává mezi serverem a klientem jako cookies musí být povoleno v prohlížeči jako část adresy funguje jen pro relativní adresy http://localhost/aplikace/ (es5kdprrks1m3l55yqyvqw45)/webform1.aspx Nutno nastavit v souboru web.config <sessionstate cookieless="true"> 38 / 50
Stav relace Možnost získat z HttpSessionState Session Indexery string int Vlastnosti bool IsCookieless jak se předává (cookie/adresa) bool IsNewSession nová relace int Timeout (v minutách) jak dlouho má být relace platná při neaktivitě 39 / 50
Stav relace Ne každá stránka potřebuje posílat relaci Možnost nastavit přístup k relaci Atribut EnableSessionState direktivy Page <\%@ Page EnableSessionState=... True čtení i zápis (výchozí hodnota) Readonly pouze čtení False nenačte se, nelze ani zapsat Stav relace je možno ukládat i mimo proces serveru State service SQL server 40 / 50
Stav zobrazení ViewState Týká se jen po sobě jdoucích požadavků na tutéž stránku Obsahuje stavové informace všech kontrolek na stránce Realizováno jako skrytá položka formuláře name=" VIEWSTATE" value="ddwtmtm1... 41 / 50
Koláčkový stav Cookie state Cookie je technika pro uchování stavu Není standardizovaná Cookie (koláček) dvojice název, hodnota Přenáší se s každým požadavkem Je možné koláčky přidávat Chová se podobně jako session state 42 / 50
Koláčkový stav Možnost získat HttpCookieCollection Request.Cookies Indexery int string Ukládá jen stringy! Příklad string s = Request.Cookies["barva"].Value; 43 / 50
Koláčkový stav Přidání koláčku třída HttpCookie string Name string Value DateTime Expires Přidání do kolekce Response.Cookies 44 / 50
Bezpečnost Uživatel by se měl přesvědčit o identitě serveru Server by se měl přesvědčit o identitě uživatele zkontrolovat identitu uživatelů Authentication přidělit uživatelům práva Authorization 45 / 50
Bezpečnost Správce webu autorizuje uživatele Uživatelé se autentikují vytvoří se autentikační koláček okolnosti vytvoření určuje autor webu většinou na základě jména a hesla hodnota koláčku by neměla být triviální šifrování 46 / 50
Konfigurace < authentication mode =" Forms " > <forms loginurl = " login. aspx "> < credentials passwordformat =" Clear " > <user name =" admin " password =" adminovoheslo "/> </ credentials > </ forms > </ authentication > < authorization > <allow users =" admin " /> <deny users ="*" /> </ authorization > 47 / 50
Třída FormsAuthentication HttpCookie GetAuthCookie(string, bool) chci ověřit uživatele, ověření má přetrvat i po ukončení prohlížeče void RedirectFromLoginPage(string, bool) uživatel byl úspěšně ověřen, ověření ma přetrvat void SignOut() odhlášení uživatele string HashPasswordForStoringInConfigFile(string,string) vytvoří hashované heslo metody MD5, SHA1 48 / 50
Příklad <html > < script language ="C#" runat =" server "> void Login_ Click ( Object sender, EventArgs e) { if ( FormsAuthentication. Authenticate ( username. Text, password. Text )) FormsAuthentication. RedirectFromLoginPage ( username. Text, false ); } </ script > <body > <form runat =" server "> Jméno : <asp : textbox id= username runat =" Server "/><br/> Heslo : < asp : textbox id = password textmode = Password runat =" Server "/><br/> <asp : button id= button onclick =" Login_Click " text =" Login " runat =" Server "/> </ form > </ body > </ html > 49 / 50
Konec 50 / 50