1 základy asp strana 1/25 Základy ASP Ilja Kraval, r. 2000, Tento dokument podléhá autorskému zákonu. Všechna práva vyhrazena, šíření tohoto dokument...
Co bylo před ASP......................................................................................................................2 Princip dynamicky vytvořených stránek ASP............................................................................2 Server-side a client-side scripting .............................................................................................3 ASP jako GUI a ASP jako část aplikace ...................................................................................5 Základem ASP - vestavěné objekty ASP.................................................................................6 První část konceptu ASP - Session a Application objekty ........................................................6 Druhá část konceptu ASP - komunikace v daném session pomocí Request a Response objektů.......................................................................................................................................7 Transakce ve skriptu ASP.........................................................................................................7 Request objekt ..........................................................................................................................7 Použití kolekce ServerVariables .............................................................................................11 Získání názvu serveru .....................................................................................................11 Získání typu browseru .....................................................................................................12 Získání nastaveného rozlišení browseru.........................................................................12 Získání nastaveného jazyka na klientovi.........................................................................12 Použití kolekce Cookies - zápis a čtení ..................................................................................12 Response objekt .....................................................................................................................13 Rozdělení funkcionality objektu Response .............................................................................14 vložení informace do stránky...........................................................................................14 zaslání cookie..................................................................................................................14 redirect browseru.............................................................................................................14 bufferování.......................................................................................................................14 nastavení property stránky ..............................................................................................14 check konetku klienta ......................................................................................................15 Rozdíl mezi Response.Write a <% =
Buffering v ASP.......................................................................................................................16
1
základy asp autor: Ilja Kraval
strana 2/25
Postupné nebo okamžité zobrazování mezivýsledků v ASP ..........................................16 Větvení programu a buffering v ASP...............................................................................17 COM objekty v ASP ................................................................................................................18 Objekt Server ..........................................................................................................................18 Použití metody Server.CreateObject ......................................................................................18 Příklad 1 na tvorbu instance COM objektu v ASP...........................................................19 Oblasti viditelnosti proměnných v ASP ...................................................................................20 Application objekt ....................................................................................................................20 Význam kolekce Contents objektu Application a StaticObject................................................21 Události objektu Application ....................................................................................................21 Použití metody Lock a Unlock.................................................................................................21 Příklad na globální viditelnost proměnné ................................................................................22 Session objekt.........................................................................................................................22 Session a property SessionID.................................................................................................22 Proměnné a objekty v oblasti viditelnosti Session ..................................................................23 Příklad na login do aplikace v ASP .........................................................................................23 Další objekty v ASP.................................................................................................................24 Scripting ..................................................................................................................................24 Server komponenty .................................................................................................................24 Objekty MS Samples...............................................................................................................25
Co bylo před ASP Internetu se nejprve používaly pouze statické stránky HTML. Technologií statických stránek nebylo možné zavést aplikační prvky - stránky se pouze prohlížely bez interakce se systémem. Postupem času se začal zdokonalovat samotný jazyk HTML. Stránky získaly dynamiku na straně klienta. Dalším vývojem vznikla technologie DHTML - Dynamic HTML. Tato technologie sice přinesla dynamiku na stránky HTML, avšak jedná se pouze o dynamiku na straně klienta (formulářovou dynamiku). Nelze hovořit o aplikační dynamice, pouze klientské. V současné době je DHTML jedním ze základních prvků Internetovských formulářů a dynamických stránek a dále se rozvíjí. Prvním případem použití aplikační dynamiky byla technologie Common GateWay Interface (CGI). Tato technologie umožňuje dynamicky vytvořit stránku pomocí C nebo Perlu. Brzy se však projevila nevýhoda této technologie - každý HTTP požadavek dává vzniknout novému procesu a po obsluze tohoto požadavku proces opět zaniká. Další technologií, která vznikla jako alternativa k CGI, je ISAPI technologie. Zde je logika aplikace natažena do procesu pouze jednou a nedochází tak k takové zátěži jako u CGI. Tato technologie je také základem technologie ASP - Active Server Pages. Technologie Active Server Pages je technologií běžící pod MS Internet Information Serverem.
Princip dynamicky vytvořených stránek ASP Základní princip ukazuje následující obrázek:
2
základy asp autor: Ilja Kraval
strana 3/25
Princip ASP - dynamicky tvořené stránky Web server
Web browser
ASP stránka např. default.asp HTML kód
HTML zobrazení
obrázek 1 Princip ASP - dynamicky vytvořené stránky Požadavek ze strany klienta na stažení stránky vede k dynamickému vytvoření stránky, která je poté stažena a zobrazena.
Server-side a client-side scripting Je třeba rozlišovat mezi dynamicky tvořenými stránkami (například pomocí ASP) a mezi dynamickým HTML. Dynamicky tvořené stránky v ASP se vytvářejí na serveru, tj. před jejich vytvořením není známa konečná podoba stránky. Záleží na aplikaci, jak bude výsledná stránka nakonec vypadat. Teprve až když nastává proces „stažení stránky“ browserem a teprve tehdy vstupuje role DHTML na straně klienta.
DHTML a ASP dvě různé dynamiky ClientClient-side scripting a DHTML
Web server Server-side Server-side scripting - ASP ASP stránka např. default.asp
Web browser
HTML kód
HTML zobrazení
obrázek 2 Pozice server-side scriptingu a client-side scriptingu
3
základy asp autor: Ilja Kraval
strana 4/25
Následující příklad ukazuje na rozdíl mezi dynamikou DHTML a ASP dynamikou. Kód dynamiky na straně klienta - DHTML : (stránka .../pr1/pr1_2.asp)
ukázka client-side scriptingu pozor browser musí umět VB script
<SCRIPT Language = "VBScript"> sub hello() msgbox "Toto je Vb script na klientovi" end sub Tento jednoduchý kód umožňuje pomocí kliknutí na button spustit procedury na straně klienta, tato procedura je součástí client-side skriptu. Oproti tomu následující jednoduchý server-side skript se na straně klienta chová staticky, ale stránka ASP je dynamicky vytvořena na straně serveru před stažením. Některé části stránky jsou statické, jiné se dynamicky vytvářejí ve skriptu na serveru. Tato „serverová část“ skriptu je syntakticky v ASP oddělena pomocí <% ...%>. Části mimo tuto sekci jsou klasickými HTML kódem, části uvnitř odpovídají server-side syntaxi (v tomto případě VBScriptu). (stránka .../pr1/pr1_3.asp)
příklad na server side scripting
dnes je : <% = Date %> a čas je <% = Time %>
ale pozor, to je čas na serveru a ne na klientovi (na Internetu hraje roli)
V tomto příkladu byla použita syntaxe výstupu do HTML kódu pomocí rovnítka, tj. do místa označeném rovnítkem se do HTML dosazuje hodnota uvedená za rovnítkem. Výsledná stránka v kódu vypadá (pokud ten den bylo na serveru 18.1.2000 a čas byl zrovna 21:46:06) takto: <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
příklad na server side scripting
dnes je :
4
základy asp autor: Ilja Kraval
strana 5/25
18.1.2000 a čas je 21:14:06
ale pozor, to je čas na serveru a ne na klientovi (na Internetu hraje roli)
což se zobrazí u klienta takto:
příklad na server side scripting dnes je : 18.1.2000 a čas je 21:14:06 ale pozor, to je čas na serveru a ne na klientovi (na Internetu hraje roli) Do místa v „hotovém“ HTML kódu se dosadily hodnoty za rovnítkem (konkrétní datum a konkrétní čas). Je zřejmé, že klient při prohlídce HTML kódu již nepozná, která část stránky byla generována dynamicky a která staticky. Rozdíl mezi DHTML a ASP také zodpovídá otázku, která zazněla na jednom ze seminářů, jak se řeší obecně tisk z Internetovské aplikace založené na ASP. Ve chvíli, kdy je stránka stažena, tak ASP již „ztratilo svou moc cokoli ovlivnit“ - na straně klienta ASP již nemá smysl, protože ASP je technologie pro tvorbu dynamickou stránek na straně serveru před stažením ke klientovi. Otázka tisku z Internetovských aplikací je obecně (pokud chceme řešit problém pro libovolný browser) dost složitá a je to otázka samotného DHTML. Například pro IE5 lze použít pro řízení tisku následující konstrukce: <style> .myBreak {page-break-before: always} a pro novou stránku vložit tag:
V případě, že řídíme nové stránky z aplikace v ASP, potom vložení tagu
provedeme pomocí příkazu Response.Write.
ASP jako GUI a ASP jako část aplikace Dynamicky vytvořené stránky mají zvláštnost v tom, že na jedné straně jsou prezentovány na straně klienta jako stránky (formulář, výstup apod.), na straně druhé protože obsahují skripty, nesou také určitou část aplikační logiky. Například výstupem pro dynamicky vytvořenou stránku může být přímo část HTML kódu, například takto: (stránka .../pr1/pr1_4.asp)
příklad na výstup přes proměnnou (resp. operaci)
5
základy asp autor: Ilja Kraval
strana 6/25
<% s = "nyní je " & Date & " a čas je " & Time & "" %> <% = s %>
všimněte si, že výstup je interpretován i s tagem fontu...
V příkladu je v proměnné s uschována část HTML kódu a výstupem je interpretována i s tagem.
Základem ASP - vestavěné objekty ASP ASP obsahuje scripting na straně serveru, většinou se používá VBScript, ale je možné zavést i jiný jazyk (například Perl). Pro funkcionalitu ASP jsou podstatné vestavěné objekty, které umožňují vytvořit přes svou funkcionalitu plnohodnotnou Internetovskou aplikaci. Tyto objekty vytvářejí objektový model ASP (název model je trochu nadnesený, protože se jedná o nezávislé objekty):
Objektový model ASP - přehled Request object
Klient
Server object
Response object
Server Application object N krát
ObjectContext object
Session object
obrázek 3 Přehled objektů ASP
Existuje celkem pouze 6 objektů, které jsou součástí ASP technologie, z toho tři objekty, které umožňují komunikaci mezi klientem a serverem - Request, Response a ObjectContext objekt a tři objekty, které jsou v kompetenci aplikace na serveru Server, Application a Session objekt.
První část konceptu ASP - Session a Application objekty Prvním konceptem ASP je viditelnost v rámci celé aplikace a viditelnost v rámci jednoho „session“ klienta. K tomuto konceptu jsou zavedené objekty Application a Session. Objekt Application má pouze jednu instanci v celé aplikaci a Session objekt se vyskytuje na serveru N krát - tolikrát, kolik je přihlášených klientů. Každý Session objekt patří k danému přihlášenému klientovi. Protože je kód aplikace napsaný z pohledu jednoho klienta (i když se jich hlásí několik), pracuje se v kódu pouze s jedním objektem Session, který jediný je v dosahu viditelnosti kódu, klient nemá přístupné Session objekty jiných klientů.
6
základy asp autor: Ilja Kraval
strana 7/25
Objekt Session je v dosahu viditelnosti daného session klienta, objekt Application je ve viditelnosti celé aplikace a lze pomocí něj sdílet informace společné pro celou aplikaci.
Druhá část konceptu ASP - komunikace v daném session pomocí Request a Response objektů Druhý koncept ASP spočívá v komunikaci mezi klientem a aplikací v rámci daného session pomocí objektů Request a Response. Komunikace na nejnižší úrovni pomocí HTPP je „obalena“ vyšším přístupem pomocí objektů Request a Response, čímž se tato komunikace skrývá za jednoduchou práci s těmito dvěma objekty. Jednotlivé HTTP požadavky ze strany klienta se do aplikace dostávají přes objekt Request. Navíc tento objekt zpřístupňuje informace o klientovi. Odpovědi HTTP se klientovi z aplikace zasílají pomocí objektu Response. Tento objekt umožňuje také redirect - přesměrování požadavku na jinou stránku.
Transakce ve skriptu ASP Jako vcelku nová věc se v ASP 2.0 objevuje možnost transakčního zpracování stránky. Pokud stránka obsahuje directivu @TRANSACTION, bude tato stránka zpracována transakčně. Objekt ObjectContext zpřístupňuje dvě metody SetComplete a SetAbort. Zavedení transakčního zpracování u ASP stránky není nic jiného, než aplikování MTS na VBscript stránky ASP. Blíže o transakčním zpracování pod MTS v semináři o třívrstvové architektuře a její nástroje.
Request objekt Request objekt zprostředkuje převzetí požadavku od klienta a přenese jej do aplikace. Výčet jeho kolekcí, property a metody ukazuje obrázek:
Request object Collections • QueryString
Properties
Methods
• TotalBytes
• BinaryRead
• Form • ServerVariables • Cookies • ClientCertficate
obrázek 4 Kolekce, property a metody objektu Request
7
základy asp autor: Ilja Kraval
strana 8/25
Hodnoty převzaté od klienta z formuláře se vyskytují v objektu Request buď v kolekci QueryString anebo v kolekci Form. Záleží na jedné konstrukci ve formuláři, který vyplňuje klient. Tuto situaci zobrazuje následující obrázek:
Základní scénář - FORM, GET, POST URL
browser
HTTP header
....
METHOD = GET
METHOD = POST
Čtení dat pomocí Request. Request.QueryString collection
Čtení dat pomocí Request. Request.Form collection
ASP Aplikace
obrázek 5 Rozdíl metody GET a POST ve formuláři Výchozím bodem scénáře je formulář, který vyplňuje klient. Tento formulář ve tvaru HTML má podobu Tag a v answer.asp kód (stránka .../pr4/answer.asp)
vybráno: <%=Request.Form("Pohlavi")%>
Použití kolekce ServerVariables Kolekce ServerVariables obsahuje velké množství informací od údajů z HTTP (header apod., údajů spojených s certifikací, s klientem , IP adresy apod. Ukažme si některé příklady pro získání těchto informací: Získání názvu serveru (stránka .../pr5/pr5_1.asp)
Získání nastaveného rozlišení browseru Nejprve se pomocí jednoduchého skriptu na straně klienta získají hodnoty „výška“ a „šířka“, které se předají pomocí otazníkové konvence (pro parsing QueryString) do URL a provede se redirect na takto získané URL: (stránka .../pr7/pr7_1.asp) <SCRIPT LANGUAGE="JAVASCRIPT"> s="?W=" + screen.width + "&H=" + screen.height location.href="answer.asp" + s Na stránce kam došlo k automatickému přesměrování se mohou hodnoty přečíst pomocí kolekce QueryString, například: (stránka .../pr7/answer.asp)
width= <% =Request.QueryString("W")%>
height= <% =Request.QueryString("H")%>
Získání nastaveného jazyka na klientovi (stránka .../pr8/pr8_1.asp)
lang = <% = Request.ServerVariables("HTTP_ACCEPT_LANGUAGE")%>
Použití kolekce Cookies - zápis a čtení Jedno cookie je „malá informace“, kterou si klient na žádost serveru může uschovat a použít později. Většinou se jedná o přednastavení položek v editačních polích apod. (Je třeba vzít na vědomí, že klient si může použití cookies vypnout). Samotné cookie jako objekt může mít další své atributy, které lze nastavit (doba expirace apod.) Jednoduchý příklad na demonstraci cookie: (stránka .../pr9/pr9_1.asp)
Příklad na cookie. V úvodu stránky došlo k zápisu cookie pomocí Response.Cookie... Druhá stránka převezme cookie od klienta a ukáže hodnotu
ukaž cookie... Při načtení této stránky dojde k zápisu cookie u klienta. Na jiné stránce si převzaté cookie můžeme zobrazit: (stránka .../pr9/answer.asp)
cookie "mycook" má hodonotu
<% = Request.Cookies("mycook") %>
Response objekt Objekt Request sloužil k převzetí informací ze strany klienta. Objekt Response slouží k opačnému účelu - k řízení přenosu informace od serveru ke klientovi. Použití obou objketů vytváří základní koncept komunikace přes ASP. Seznam kolekcí, properties a metod objektu Response ukazuje následující obrázek:
13
základy asp autor: Ilja Kraval
strana 14/25
Response objekt Collections • Cookies
Properties
Methods
• Buffer
• AddHeader
• CacheControl
• AppendToLog
• Charset
• BinaryWrite
• ContentType
• Clear
• Expires
• End
• ExpiresAbsolute
• Flush
• IsClientConnected
• Redirect
• PICS
• Write
• Status
obrázek 6 Objekt Response a jeho kolekce, properties a metody
Rozdělení funkcionality objektu Response vložení informace do stránky write, zapisuje proměnnou do současného HTTP binarywrite zapisuje proměnnou do současného HTTP bez konverze zaslání cookie cookies předává cookie klientovi redirect browseru redirect přesměruje browser na jiné URL bufferování buffer nastaví možnost bufferingu stránky flush vyprázdní buffer a pošle jeho obsah klientovi clear vyprázdní buffer (a nic víc) end vyprázdní buffer a ukončí plnění a přenos nastavení property stránky expires specifikuje délku času za jak dlouho dojde k expiraci stránky cachované na browseru expiresabsolute specifikuje absolutně datum a čas expirace cachované na browserou contenttype specifikuje HTTP contenttype addheader nastavuje název HTML headeru na hodnotu status nastavuje status line serveru, například 401 Unauthorized cachecontrol nastavuje informaci pro proxy server a chachování
14
základy asp autor: Ilja Kraval
strana 15/25
PICS nastavuje PICS label charset nastavuje charset do headeru check konetku klienta isclientconnected vrací zda je klient konektován
Rozdíl mezi Response.Write a <% =
%>
Jsou možné dvě syntaxe pro výstup proměnné s konverzí HTML, buď se použije „rovnítková“ konvence anebo Response.Write. Z hlediska výstupu jsou si obě syntaxe rovnocenné, avšak v některých případech je výhodnější použít Response.Write namísto rovnítka. Nechejme provést výstup z cyklu pomocí rovnítka například takto: (file .../pr10/pr10_1.asp) <% for i = 1 to 6 %> result: <% = i %>
<%next%> Všimněte si, že statické části stránky jsou po částech result: a poté Mezi tyto části je vložen skript serveru, přičemž pouze v části <% = i %> dojde k výstupu do dynamicky tvořené stránky ASP. Stejného výsledku výstupu z cyklu můžeme dosáhnout tímto kódem: (viz stejný file .../pr10/pr10_1.asp) <% for i=1 to 6 Response.Write ("result : " & i & " ") next %> Tento zápis je do jisté míry přehlednější - skript je celistvý. Z tohoto příkladu vyplývá jeden zajímavý závěr: Response.Write má podobný význam jako syntaxe <% %>, ale inverzně. Zatímco <% %> vkládá skript serveru do výstupu (streamu HTML), Response.Write vkládá výstup streamu HTML do server skriptu. Metoda BinaryWrite na rozdíl od Write neprovádí konverzi a provede výstup jako binární balík dat bez ohledu na jeho obsah (obrázky apod.).
15
základy asp autor: Ilja Kraval
strana 16/25
Buffering v ASP Pomocí Response objektu lze řídit výstup do browseru klienta pomocí bufferování. Pokud se na začátku stránky nastaví povolení bufferování, může se provádět postupný a řízený výstup na browser klienta. Postupné nebo okamžité zobrazování mezivýsledků v ASP Pomocí metody flush můžeme vypustit držený obsah bufferu ke klientovi až v okamžiku, kdy je to třeba, například: viz file ...pr11/pr11_1.asp <%@ Language=VBScript %> <%Response.Buffer= true %> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
Příklad na buffering 1, všimněte prosím v úvodu, že ve skriptu je nastaveno na buffering na true
Čekejte...
<% Response.Flush for i=1 to 6 for j=1 to 600000 j=j+1 next Response.Write("result: " & i & " ") Response.Flush next %> poznámka: Příklad obsahuje zpožďovací smyčku. V tomto případě je flush umístěn za každý zápis do bufferu proměnné i (a nový řádek) Response.Write("result: " & i & " "), čímž dojde k okamžitému zobrazení výsledku již v průběhu cyklu. Pokud příkaz Response.Flush umísítme až za next, tj. takto: ...
16
základy asp autor: Ilja Kraval
strana 17/25
Response.Write("result: " & i & " ") next Response.Flush %> dojde k zobrazení výsledku až po proběhnutí celého operace (celého cyklu). Větvení programu a buffering v ASP Buffering se používá také pro větvení programu, kdy v určité větvi se má výsledek zobrazení podstatně změnit od začátku oproti jiné větvi. Použije se proto vyčištění bufferu a „začne se nanovo“. Podobného účinku se dá docílit poněkud kostrbatěji pomocí proměnné, která drží obsah stránky (tato proměnná nahrazuje vlastně buffer). Příkladem takovéto situace je chybový stav, který ruší již připravené zobrazení a musí se zobrazit něco úplně jiného (například error hlášení apod.). Následující kód simuluje sekvenci operací. Pokud je výsledek funkce simulovaný proměnnou operace false, dojde k zobrazení chybového hlášení, v opačném případě se zobrazí všechny OK sekvence: viz file ...pr11/pr11_2.asp
Buffering lze použít pro větvení programu, kdy se změní výsledek a nemusíme si výstup z ASP do HTML uschovávat do proměnné, ale je v bufferu, který se buď vyčistí anebo zobrazí
Provádíme nějaké výpočty...
Chodíme do DB apod.
<% Response.Flush %> <% Response.Write("zatím je mezivýsledek OK! ") Response.Write("další mezivýsledek OK! ") Response.Write("další mezivýsledek OK! ") Response.Write("další mezivýsledek OK! ") 'operace = false operace = true if operace = true then Response.Write("další mezivýsledek OK! ") Response.Write("Všechno OK!") else Response.Clear Response.Write ("Všechno špatně ") end if %>
17
základy asp autor: Ilja Kraval
strana 18/25
Změňte hodnotu proměnné operace = true na operace = false pomocí přepnutí apostrofu a sledujte výsledek.
COM objekty v ASP Základem ASP je skript technologie. Znamená to ve svém důsledku, že lze použít vlastnoručně vytvářené objekty COM a volat je stejně jako v každém jiném skriptu (například VBskcipt u VBS filu, makro aplikace u aplikací Office - VBA apod). Poloha ASP se takto dostává do jiné roviny - pokud totiž business logiku přeneseme pouze do objektů COM, samotný skript ztrácí business logiku a stává se pouze pojítkem mezi klientem a business objektem. Tento stav je z hlediska návrhu architektury ideální, dochází k re-use binárních objektů na síti přes ASP Internetem nebo Intranetem. Poznámka: Může nastat případ, kdy se tato technologie takto nemůže použít z organizačně obchodních důvodů. Pokud je například WEB server pouze pronajatý, potom vám provider ze samozřejmých důvodů nedovolí použít vaše vlastní (a pro něj neznámé) COM objekty.
Objekt Server Vlastnosti objektu Server ukazuje následující obrázek
Objekt Server jak vidět „nedrží“ žádné kolekce. Vlastnost ScriptTimeOut nastavuje délku time-out pro výkon scriptu (například při chybě apod.). Tato časová délka nemůže být kratší než administrativně nastavená implicitní hodnota (bez administrativního zásahu je implicitní hodnota 90 s).
Použití metody Server.CreateObject Podobně jako v jiných prostředí skriptu volání CreateObject slouží k zavedení instance objektu- COM v prostředí daného skriptu. Existují dva podstatné rozdíly v ASP oproti „klasickému“ CreateObject v jiných skript prostředích:
18
základy asp autor: Ilja Kraval
strana 19/25
1. Musí být vždy v syntaxi uvedeno Server.CreateObject - nestačí pouze CreateObject jako např. ve VBScriptu 2. Viditelnost daného objektu je závislá na tom, jak a kde tento objekt vzniká a jakému druhu proměnné je přiřazen. O viditelnosti (tzv. scope) bude pojednáno dále u objektů Session a Application Jinak je použití COM objektu stejné, jako u jiných skript prostředí. Příklad 1 na tvorbu instance COM objektu v ASP Vzhledem k tomu, že v předešlých kapitolách máme již zavedenu komponentu Barvy ActiveX DLL, použijeme právě tuto COM komponentu pro ukázku vytvoření instance: (viz file pr12/pr12_1.asp)
Musíte mít zaregistrovánu komponentu BarvyDLL (viz předešlé semináře), v kódu změňte cestu k souboru UDL
<% set colB = Server.CreateObject("BarvyDLL.ccolBarvy") colB.NaplnZDatabaze ("file name=d:/barvy.udl") for each it in colB Response.Write(it.text & " ") next %>
Podobný příklad můžeme převést na výběr barvy: (viz file pr13/pr13_1.asp) <SELECT NAME="Barvy"> <% set colB = CreateObject("BarvyDLL.ccolBarvy") colB.NaplnZDatabaze ("file name=d:/barvy.udl") for each it in colB Response.Write("