Active Server Pages Dynamic content in Microsoft Internet Information Server 4.0+
Mål Ha en oversikt over hvordan ASP passer inn i puslespillet Kunne skrive dynamiske sider ved hjelp av ASP Kunne aksessere COM komponenter ved hjelp av ASP Kunne skrive ATL COM komponenter for bruk med ASP sider
Krav ASP kjører på IIS 4.0 og høyere IIS finnes få Windows NT Server Option Pack For å bruke XML må en XML parser installeres. Msxml.dll følger med Internet Explorer 5.0 og høyere For å lære ASP bør man ha kjennskap til HTML JScript/JavaScript eller VBScript kunnskap er også en fordel, men disse språkene er lette å lære dersom man kan programmere
Hello ASP ASP 1: Hello world
Anatomien til en ASP side I utgangspunktet en vanlig HTML side Elementer som starter med <% angi ASP elementer ASP elementer behandles av serveren før svaret sendes til klienten ASP elementer er skrevet i et script-språk som JScript eller VBScript
Spesielle ASP Elementer er et ASP direktiv som angir hvilket språk (JScript eller VBScript) som skal brukes Andre direktiver er en forkortelse for
Eksempel 2 <% for ( var i=0; i<10; i++ ) { var line = "Iteration " + i + " "; Response.Write(line); } %>
Program-biter Vi kan ha programbiter i ASP siden. Program-bitene er i et element. Programbitene vil bli utført akkurat som en hvilket som helst script. Vi bruker Respose objektets Write metode for å skrive til resultatsiden.
Html i script i html ASP 2: Looping ASP script Iteration : Hello there
Mikse HTML og Script Kontrol-flyten fra scriptspråket inkluderer html som er mellom {} etc. fungerer som
Scriptobjekter ActiveX Server Pages 3: Time The time is.
Script-objekter Alle objekter og funksjoner tilgjengelige i scriptspråket er også tilgjengelige i ASP I tillegg definerer ASP fem objekter siden kan bruke: –Request – informasjon fra senderen –Response – svaret som vises i browseren –Server – Informasjon og metoder for serveren –Session – inneholder brukers sesjonsinfo –Application – brukes til å dele info mellom brukere
Forms
Form – oversikt Request objektet sendes med når vi mottar en web-side Dersom det eksisterer informasjon i en form fra senderen, kan ”form” metoden til Request returnere denne informasjonen Vi har laget et skjult element med navn ”inMessagePost” og verdi ”true” som sendes med når brukeren trykker ”post” i formen.
Form – user entry To: From: Subject: Message text Message Text
Form – user input Form elementet forteller at vi skal POST’e svaret til 05form.asp (som er samme dokument som formen selv) Vi har presentert følgende input-elementer i en tabell: –To, from, , subject og message I tillegg har vi et input element av type ”hidden”. Dette er for å sende med styreparameteren ”inMessagePost”
Form – echo back I got the following information: To: From: Subject: Message text
Form – echo back Vi bruker Request.Form for å finne verdiene som ble sent til formen. Vi bruker som en snarvei for Response.Write for at det ikke skal bli så mye å skrive og lese.
Forsinkelse <% function f(i) { var result = 1; while ( i > 0 ) result *= i--; return result; } for ( var i=0; i Hello there <% f( ); // simulate delay } %>
Forsinkelse Vi definerer en funksjon som gjør mye arbeid for å simulere forsinkelse. En og en linje kommer opp når den er ”klar” Legg også merke til funksjons-deklarasjonen. Dette er vanlig funksjons-deklarasjon i JScript, og kan også brukes i et ASP script
Bruk av COM - ADO <% var connection = Server.CreateObject("ADODB.Connection"); connection.Open("guestbook", "admin", ""); var recordset = Server.CreateObject("ADODB.Recordset"); recordset.Open("SELECT * FROM guestbook", connection); Response.Write(" "); for ( recordset.MoveFirst(); !recordset.EOF; recordset.MoveNext() ) { Response.Write(" "); var iter = new Enumerator(recordset.Fields); for ( ; !iter.atEnd(); iter.moveNext() ) { Response.Write(" " + iter.item() + " "); } Response.Write(" "); } Response.Write(" "); %>
COM Server.CreateObject brukes til å lage et (Inprocess) COM objekt på serveren COM Objektet kan aksesseres som fra ethvert script Legg merke til at Scriptet har fulle rettigheter, det regnes ikke som et utrygt script I JScript bruker vi en Enumerator for å gå gjennom en collection
Filsystem <% var fileSystem = Server.CreateObject("Scripting.FileSystemObject"); var folder = fileSystem.getFolder(Server.MapPath(”.")); var iter = new Enumerator(folder.Files); for ( ; !iter.atEnd(); iter.moveNext() ) { var fileName = iter.item().Name; if ( !fileName.match(".asp$") ) continue; %> "> <% } %>
Filsystem Et Scripting.FileSystemObject opprettes på serveren med Server.CreateObject Server.MapPath brukes til å få path’en til en virtuell (web) folder. I dette tilfellet returneres ”c:\InetPub\WwwRoot\asp-sample” FileSystemObject’s metode getFolder oppretter et Folder objekt Scripting.FileSystemObject er en komponent som er designet for å gi skript-språk tilgang til filsystemet.
Filsystem – forts. Kun ASP filer skrives ut Name.match(”.asp$”) bruker JScript string’s matching metode (regular expressions) Selve utskriften gjøres med en av-ASP’et linje Vi bruker et Enumerator objekt for å gå gjennom Files samlingen på Folder objektet
Prosessere XML <% var xmlFile = (Request.QueryString("xml").Count > 0 ? Request.QueryString("xml") : "Remit xml"); var xslFile = (Request.QueryString("xsl").Count > 0 ? Request.QueryString("xsl") : "PaymentLog-viewer.xsl"); var xml = Server.CreateObject("Microsoft.XMLDOM"); xml.load(Server.MapPath(xmlFile)); var xsl = Server.CreateObject("Microsoft.XMLDOM"); xsl.load(Server.MapPath(xslFile)); var html = xml.transformNode(xsl); Response.Write(html); %>
Prosessere XML QueryString henter ut argumenter gitt til URL’en til web-siden (f.eks. ”.../09Xml.asp?xml=Remit xml”) transformNode gjør hele arbeidet med å transformere xml-en til html ved hjelp av stylesheet’et Det eksisterer en mengde andre funksjoner på Microsoft.XMLDOM objektet. – – –
ATL og ASP COM komponenter for bruk i ASP sider
C++ COM ASP En ASP side kan aksessere ethvert objekt som implementerer IDispatch interfacet Aksessen skjer på samme måte som enhver script-basert aksess til en komponent Metoder som ikke er ”oleautomation” kompatible kan ikke kalles Det ser ut som om script-interpreteren ikke støtte VARIANT-records (ennå?)
Hello ATL - IDL import "oaidl.idl"; import "ocidl.idl"; [ object, uuid(B D4-A C785A717), dual, pointer_default(unique) ] interface ICaseTransform : IDispatch { HRESULT ToUpperCase([in] BSTR input, [out,retval] BSTR* upcase); }; [ uuid(4F63DF31-78E1-11D4-A C785A717), version(1.0) ] library ASPCOMPONENTLib { importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(B D4-A C785A717) ] coclass CaseTransform { [default] interface ICaseTransform; };
Hello ATL - Header class ATL_NO_VTABLE CoCaseTransform : public CComObjectRoot, public CComCoClass, public IDispatchImpl { public: DECLARE_REGISTRY_RESOURCEID(IDR_CASETRANSFORM) // ProgId ASPComponent.CaseTransform.1 // Clsid {B D4-A C785A717} BEGIN_COM_MAP(CoCaseTransform) COM_INTERFACE_ENTRY(ICaseTransform) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() STDMETHOD(ToUpperCase)(BSTR input, BSTR* upcaseString) { CComBSTR result(input); wcsupr(result); *upcase = result.Detach(); return S_OK; } };
Hello ATL - ASP <% var component = Server.CreateObject("ASPComponent.CaseTransform"); Response.Write(component.ToUpperCase("hello world")); %>
Hello ASP ASP scriptet bruker Server.CreateObject for å opprette det nye objektet Scriptet bruker ProgId for å angi hvilket objekt som skal opprettes (husk å registrere dll’en) Merk at IIS 4.0 kun støttet InProcess komponenter (dette kan påvirkes) IIS tar lock på dll’en. Denne locken blir ikke frigjort før serveren rebootes (?!?) sample/10AspComponentTest.asphttp://gnats/asp- sample/10AspComponentTest.asp
ATL – Bruk av ASP objekter Når et objekt opprettes på en side, vil metodene ”OnStartPage” og ”OnEndPage” kalles, dersom objektet implementerer dem OnStartPage – kalles når objektet opprettes, gir komponenten tilgang til ASP’s objektmodell OnEndPage – kalles når siden er ferdig presentert. Etter at OnEndPage er kalt, vil objektene fra OnStartPage være ugyldige
Eksempel OnStartPage – setter opp alle objekt-referansene vi trenger OnEndPage – slipper alle objektreferanser OutputPage – skriver ut en web-side ved å bruke Response objektet OutputPage er funksjonelt lik eksempel 5, som bruker Forms sample/11AspSecondCompontent.asphttp://gnats/asp- sample/11AspSecondCompontent.asp
OnStartPage STDMETHODIMP CoAspTestComponent::OnStartPage (IUnknown* pUnk) { CComPtr pContext; HRESULT hr = pUnk->QueryInterface(IID_IScriptingContext, (void **)&pContext); // Get all the scripting object references if ( SUCCEEDED(hr) ) hr = pContext->get_Request(&m_pRequest); if ( SUCCEEDED(hr) ) hr = pContext->get_Response(&m_pResponse); if ( SUCCEEDED(hr) ) hr = pContext->get_Server(&m_pServer); if ( SUCCEEDED(hr) ) hr = pContext->get_Session(&m_pSession); if ( SUCCEEDED(hr) ) hr = pContext->get_Application(&m_pApplication); if ( FAILED(hr) ) // Release all object references if something went wrong return S_OK; }
OnEndPage STDMETHODIMP CoAspTestComponent::OnEndPage () { // Release all interfaces m_pRequest.Release(); m_pResponse.Release(); m_pServer.Release(); m_pSession.Release(); m_pApplication.Release(); return S_OK; }
OutputPage STDMETHODIMP CoAspTestComponent::OutputPage() { CComPtr pForm; m_pRequest->get_Form(&pForm); int formCount = 0; pForm->get_Count(&formCount); if ( formCount == 0 ) { // means no post action return OutputFormPage(); } else { return OutputResultPage(pForm); }
OutputFormPage HRESULT CoAspTestComponent::OutputFormPage() { CComVariant vFormPage( L" \n" L" Please insert your message \n" L" \n" L" To: ” L” \n" L" From: ” L” \n" L" Message text \n” // OSV L" \n" L" "); return m_pResponse->Write(vFormPage); }
OutputResultPage HRESULT CoAspTestComponent::OutputResultPage(IRequestDictionary* pForm) { m_pResponse->Write( CComVariant(L" I got the following information: \n")); m_pResponse->Write(CComVariant(L" \n")); CComVariant fields[] = { L"to", L"from", L" ", L"subject" }; for ( int i=0; i<sizeof(fields)/sizeof(*fields); i++ ) OutputFieldValue(fields[i]); m_pResponse->Write( CComVariant(L" Message text \n" L" ")); CComVariant fieldValue; pForm->get_Item(CComVariant(L"message"), &fieldValue); m_pResponse->Write(fieldValue); m_pResponse->Write(CComVariant(L" \n \n")); return hr; }
OutputFieldValue HRESULT CoAspTestComponent::OutputFieldValue( IRequestDictionary* pForm, CComVariant fieldName) { CComVariant fieldValue; pForm->get_Item(fieldName, &fieldValue); m_pResponse->Write(CComVariant(L" ")); m_pResponse->Write(fieldName); m_pResponse->Write(CComVariant(L": ")); m_pResponse->Write(fieldValue); m_pResponse->Write(CComVariant(L" ")); return hr; }
Grenser for hva som kan gjøres På grunn av locking av dll er det vanskelig å bytte ut en dll Jeg har ikke forsøkt å bruke debuggeren mot et ASP script, men jeg tror det er vrient ASP kan ikke aksesser IUnknown komponenter eller Variant structer Konklusjon: ASP egner seg best som et tynt presentasjonslag over eksisterende funksjonalitet
ASP og IUnknown sample/12- 1AspStructs.asphttp://gnats/asp- sample/12- 1AspStructs.asp Det går ikke å aksessere funksjoner som ikke er oleauto. Eksempelet viser aksess av : HRESULT GetStruct([out, retval, ref] struct MyTestStruct** theStruct);
ASP og Variant Records sample/12- 2AspStructs.asphttp://gnats/asp- sample/12- 2AspStructs.asp Eksempelet viser kall på en metode som returnerer en struct i en VARIANT
Structwrapper Det er relativt enkelt å skrive en wrapper for structs i en IDispatch interface Bruken av denne wrapperen er nesten transparent fra Script klienter Dessverre ser det ut som om dette fremprovoserer en feil i script interpreter (?) Bruk vil få serveren til å bruke mer og mer ressurser på ”inetinfo.exe” prosessen inntil maskinen krasjer. Bruk vil også blokke alle andre web-requester
Eksempler Jeg skal gjøre tilgjengelig en samling med ASP script (eksemplene her) og et VC 6.0 prosjekt med ATL ASP-kode ATL koden inkluderer scriptwrapper. Det går fint ann å leke med den, men man må reboote serveren etterpå ;-)
Hva nå? Både JScript, og ASP er dokumentert i MSDN Scriptspråk –JScript - msdn.microsoft.com/scripting/jscript/ –VBScript - msdn.microsoft.com/scripting/vbscript/ –Generelt – –Se spesielt Language Reference ASPover.asphttp://msdn.microsoft.com/workshop/server/asp/ ASPover.asp
MSDN For orden skyld: Her er plasseringen i MSDN ASP Object Model: –Platform SDK/Web Services/Internet Information Services SDK/Active Server Pages Guide/Visual Basic Object Model Jscript –Plaform SDK/Tools and Languages/Scripting/Jscript VBScript –Plaform SDK/Tools and Languages/Scripting/Vbscript