1 ASP og VBScript. 1.1 Om denne leksjonen

Like dokumenter
JSP - 2. Fra sist. Hvordan fungerer web? Tjenerside script HTML. Installasjon av Web-tjener Et enkelt JSP-script. Ønsker dynamiske nettsider:

HØGSKOLEN I SØR-TRØNDELAG

9. ASP med databasekopling, del II

1. Tilstandsinformasjon på klientsiden

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

JavaServer Pages (JSP)

JavaScriptbibliotek. Introduksjon MVVC. Informasjonsteknologi 2. Gløer Olav Langslet Sandvika VGS

lage og bruke funksjoner som tar argumenter lage og bruke funksjoner med returverdier forklare forskjellen mellom globale og lokale variabler

Dette er en demonstrasjonsside som vi skal bruke for å se litt nærmere på HTTP protokollen. Eksemplet vil også illustrere et par ting i PHP.

Shellscripting I. Innhold

Verden - Del 2. Steg 0: Oppsummering fra introduksjonsoppgaven. Intro

Verdier, variabler og forms

HØGSKOLEN I SØR-TRØNDELAG

1. Installasjon av web-tjener og teori

Oblig 4 Undervisningshefte i grunnleggende JavaScript programmering

Verden. Steg 1: Vinduet. Introduksjon

1. Systemsikkerhet Innledning. Innhold

HTML5. Skjemaer på nettsider. Skjemaer med. Informasjonsteknologi 1 og 2. Gløer Olav Langslet Sandvika VGS

Bygg et Hus. Steg 1: Prøv selv først. Sjekkliste. Introduksjon. Prøv selv

if-tester Funksjoner, løkker og iftester Løkker og Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

HØGSKOLEN I SØR-TRØNDELAG

7. Datafiler på tjenersiden

Programmering i C++ Løsningsforslag Eksamen høsten 2005

HØGSKOLEN I SØR-TRØNDELAG

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

Innføring i bruk av CGI4VB

Et forsøk på definisjon

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

1. NetBeans IDE: Lage en enkel mobilapplikasjon

the web Introduksjon Lesson

Eksamen i emnet INF100 Grunnkurs i programmering (Programmering I) og i emnet INF100-F Objektorientert programmering i Java I

Forklaring til programmet AbstraktKontoTest.java med tilhørende filer Konto.java, KredittKonto.java, SpareKonto.java

Kan micro:biten vår brukes som en terning? Ja, det er faktisk ganske enkelt!

Et forsøk på definisjon. Eksempel 1

1 Introduksjon til web-programmering med JSP

1. Profiler og variabler

I denne oppgaven blir du introdusert for programmeringsspråket JavaScript. Du skal gjøre den klassiske oppgaven Hei verden, med en katt.

Bygge en kube. Introduksjon. Steg 1: Lage en ny mod. Skrevet av: Pål G. Solheim

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

notater Gule lapper Mine Et praktisk eksempel med objekter IT2 Læreplansmål Gløer Olav Langslet Sandvika VGS

Et forsøk på definisjon

INF Puslegruppa - Kom i gang med PusleChat

1 Installasjon av web-tjener

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

Utførelse av programmer, metoder og synlighet av variabler i JSP

Utførelse av programmer, funksjoner og synlighet av variabler (Matl.)

6105 Windows Server og datanett

10. ASP og SQL Innledning Recordset-objektet. Innhold. Referanse til læreboka Kapittel Se detaljer nedenfor.

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

UNIVERSITETET I OSLO

Bygg et Hus. Introduksjon. Steg 1: Prøv selv først. Skrevet av: Geir Arne Hjelle

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

praktiske eksempler DOM Document Object Model DOM og Høst 2013 Informasjonsteknologi 2 Læreplansmål Gløer Olav Langslet Sandvika VGS

HØGSKOLEN I SØR-TRØNDELAG

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

Bygge en kube. Steg 1: Lage en ny mod. Sjekkliste. Introduksjon

IN1000 Obligatorisk innlevering 7

Enkle generiske klasser i Java

INTRODUKSJON HVEM ER DETTE FAGET FOR?...

Uke 8 Eksamenseksempler + Ilan Villanger om studiestrategier. 11. okt Siri Moe Jensen Inst. for informatikk, UiO

INF109 - Uke 1b

Programmering Høst 2017

Web-programmering med JSP Løsningsforslag leksjon 4

12. Et større ASP-eksempel Innledning Beskrivelse av nett-butikken. Innhold

$antall_maaneder =12; Variablene $pris og $antall_maaneder i eksemplet ovenfor har

2 Om statiske variable/konstanter og statiske metoder.

Når en bruker skriver sitt navn ("Ole") i et form-element med name="fornavn" som attributt. klikker på submit-knappen

Et forsøk på definisjon. Eksempel 1

HØGSKOLEN I SØR-TRØNDELAG

Innføring i bruk av CGI4VB

OBJEKTER SOM EN PROGRAMMERINGS-TEKNIKK

Verden - Del 2. Intro. Skrevet av: Kine Gjerstad Eide

Objektorientering i VB en introduksjon

Om du allerede kjenner Scratch og har en Scratchbruker kan du gå videre til Steg 1.

Steg 1: Lag bildedeklarasjon

1.2 Dynamiske, tjenerbaserte og interaktive nettsteder

[Kurssidene] [ ABI - fagsider bibin ] Michael Preminger (michaelp@hio.no) 07/ Vi holder orden på verdier med hjelp av variabler

Introduksjon til beslutningsstrukturer

INF Uke 10. Ukesoppgaver oktober 2012

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

INF1000: Forelesning 6. Klasser og objekter del 1

INF1000: noen avsluttende ord

Test 2 OOP. - Prøveeksamen

(X)HTML, CSS og JavaScript HTML. Det første dokumentet Grunnleggende programmering i Java Monica Strand 26.

Sprettball Erfaren ComputerCraft PDF

JS: Grunnleggende JavaScript Nybegynner

Transaksjonshåndtering. Skalerbarhet.

Utvikling av dynamiske nettsteder med PHP og databaser, høsten 2006

2. Lage ASP.NET sider

HØGSKOLEN I SØR-TRØNDELAG

CASCADING STYLESHEETS (CSS)

HØGSKOLEN I SØR-TRØNDELAG

Kom forberedt til tirsdag. INF1000 Tips til obligatorisk oppgave 4. Noen generelle tips. Oblig4: Komme igang

HØGSKOLEN I SØR-TRØNDELAG

Seminaroppgaver IN1010, uke 2

TDT4110 Informasjonsteknologi grunnkurs: Tema: Betingelser og logiske uttrykk Utgave 3: Kap. 3

INF1000 HashMap. Marit Nybakken 2. november 2003

Transkript:

Stiftelsen TISIP i samarbeid med Avdeling for informatikk og e-læring, Høgskolen i Sør-Trøndelag Tomas Holt 02.02.2004 Opphavsrett: Tomas Holt og Stiftelsen TISIP Lærestoffet er utviklet for faget LV192D Web-programmering med ASP 1 Resymé: Leksjonen omhandler bruk av script-språket VBScript. Bruk av funksjoner og klasser er tema som blir tatt opp. Tilslutt ser vi på Response-objektet som er et av de sentrale objektene i ASP. Innhold 1.1 OM DENNE LEKSJONEN...1 1.2 LITT MER OM ASP-SCRIPT...2 1.2.1 Option Explicit...2 1.2.2 VBScript-kode og HTML-kode...2 1.2.3 Funksjoner...4 1.2.4 Innebygde funksjoner i VBScript...5 1.3 OBJEKTER...7 1.3.1 Koden for å lage klasser og objekter...8 1.3.2 Metoder i en klasse...9 1.3.3 Innebygde objekter i ASP...11 1.4 RESPONSE-OBJEKTET...11 1.4.1 Response.Write...11 1.4.2 Problemer med Response.Write...12 1.4.3 Bruk av Server.HTMLEncode...13 1.4.4 Response.Buffer...13 1.4.5 Response.Clear...14 1.4.6 Response.Flush...14 1.4.7 Response.End...15 1.4.8 Response.Redirect...15 1.4.9 Caching, Response.Expires og Response.ExpiresAbsolute...16 1.1 Om denne leksjonen I denne leksjonen går vi først raskt igjennom bruk av scriptspråket VBScript. Vi bruker VBScript når vi skal lage ASP er i dette kurset. Etter dette skal vi litt på klasser og objekter. Tilslutt skal vi bruke denne kunnskapen til å se på et meget nyttig objekt som er innbygget i ASP, nemlig Response-objektet. Denne leksjonen går igjennom det meste i kapittel 5,6 og 7 i boka.

Det bør også nevnes at HTML-koden i eksemplene ofte ikke er fullverdig HTML-kode. Grunnen til dette er at eksemplene skal være mest mulig oversiktlig. For å kjøre koden i leksjonene i dette faget må du kopiere koden fra leksjonen inn i en teksteditor. Du må så lagre koden og så kjøre koden gjennom din egen tjener. Acrobat Reader som du bruker til å lese leksjone har et valg for å klippe ut tekst. Dette gjør du ved å trykke på knappen med en T på. Du kan da markere teksten du er interessert i og kopiere denne. 1.2 Litt mer om ASP-script I forrige leksjon ble de grunnleggende elementene i et ASP-script gjennomgått. Vi skal i dette kapittelet se litt mer på hvordan et ASP-script bygges opp. 1.2.1 Option Explicit <%@ Language=VBScript %> <% Option Explicit Dim strvariabel %> strvariabel = test <BODY> <%= strvariabel %> </BODY> Linje to i koden over trenger ikke være med. Denne linjen sørger imidlertid for å gi deg feilmelding hvis du har skrivefeil i variabelnavn. La oss si at du lager en variabel mintext, men at du lenger ned i koden tror at variabelen heter mintxt. Hvis du da ikke har med Option Explicit i koden din vil du ikke få noen feilmelding. Variablen mintxt blir oppfattet som en ny variabel. Når du bruker Option Explicit vil du i dette tilfellet få en feilmelding om at variabelen ikke finnes. Grunnen er at du må deklarere en variabel før du bruker den. Dette gjøres med bruk av ordet Dim før variabelnavnet (se fet skrift i koden). Sørg for å bruke den ekstra kontrollen som ligger i Option Explicit. 1.2.2 VBScript-kode og HTML-kode <%@ Language=VBScript %> <% Option Explicit %> <BODY> <% VBScript-kode.. %> </BODY> side 2 av 17

VBScript-kode i kodesnutten over, er en eller flere linjer med VBScript-kode. Denne koden kan være både deklarering av variabler, bruk av kontrollstrukturer (if-setninger, løkker osv..) eller det kan være subrutiner eller funksjoner. Vi bruker VBScript-kode til å kontrollere hva som skjer i ASP en vår. Vi har sett at vi kan lage HTML-kode inne i script-koden med Response.Write. F.eks. har vi sett at koden <% Response.Write( <BODY> hei </BODY> ) %> gir samme resultat som <BODY> hei </BODY> Vi kan benytte oss av denne nære kontakten mellom script og HTMTL-kode ved å bruke script-koden til å styre HTML-koden. F.eks. <BODY> <% For i=1 to 2 %> <H1> If I were a </H1> <% Next %> RICH MAN </BODY> Resultatet av koden over blir slik: Figur 1: Script styrer HTML-kode side 3 av 17

Hva er det som skjer. Hvis du ser på koden så vil du se at for-løkka starter før <H1> If I were a </H1> og slutter med Next. Dette gjør at all HTML-kode i mellom vil utføres så mange ganger som løkka utføres. Her blir det to ganger. RICH MAN skrives ut kun en gang da det ikke er noen løkke som omslutter denne HTML-elementet. Se også figuren under. Tjener Klient forespørsel svar utfør ASP-fil <BODY> <% For i=1 to 2 %> <H1> If I were </H1> <% Next %> RICH MAN </BODY> Resulterende HTML-kode <BODY> <H1> If I were </H1> <H1> If I were </H1> RICH MAN 1.2.3 Funksjoner Bruk av variabler regner jeg med at dere kjenner til fra før. Temaet er tatt opp i kapittel 3 i boka. For de som føler seg usikker på temaet kan det være en fordel å skumme gjennom dette kapittelet. Kapittel 4 i boka går igjennom bruken av de forskjellige kontrollstrukturene som brukes i VBScript, samt subrutiner og funksjoner. Dette er også tema som bør være kjent fra før, men hvis du føler at du kan ha godt av en liten oppfriskning se igjennom dette kapittelet. Både kapittel 3 og 4 inneholder en del eksempler. Når man lager større programmer kan man fort miste oversikten. Bruk av subrutiner eller funksjoner gir oss muligheten til å samle sammenhørende kode på en logisk måte, slik at vi lettere kan holde oversikten. Funksjoner gir større muligheter enn det subrutiner gjør, da disse kan returnere verdier, og funksjoner omtales derfor i dette kapittelet. Eksempel Vi ønsker å ha et program som kan ta kvadratet av et tall. Koden kan være som følger: <%@ Language=VBScript%> <%Option Explicit %> side 4 av 17

<HEAD> <TITLE> Kvadratet av et tall </TITLE></HEAD> <BODY> Kvadratet av tallet 10 blir <%=Kvadrat(10) %> </BODY> <!-- her kommer funksjoner -- > <% Function Kvadrat(tall) Kvadrat= tall*tall End Function %> Legg merke til den fete skriften i koden over. Sist i koden lager vi en funksjon som heter kvadrat (merk at det ikke spiller noen rolle hvor i koden vi lager funksjonen, men det gir god oversikt å samle funksjoner i begynnelsen eller på slutten av filen). Funksjonen tar et tall som innargument og sørger for å ta kvadratet av dette tallet (kvadratet er tallet ganget med seg selv). Vi benytter oss av denne funksjonen med koden <%= kvadrat(10) %>. Dette sørger for å skrive ut resultatet som returneres av funksjonen. Resultatet blir som følger: Figur 2: Funksjonen kvadrat 1.2.4 Innebygde funksjoner i VBScript Som vi allerede har vært inne på finnes det ferdige funksjoner i VBScript. Vi har sett at funksjonen Sqr(tall) returnerer kvadratrota av tallet tall. Dette er en matematisk funksjon som er beskrevet i tabell 5.1 i boka. I denne tabellen finnes det også mange andre matematiske funksjoner som er klare til bruk. Vi har også sett på funksjonen Hour(Time) som returner hvilken time det er nå. Denne funksjonen er funnet på s. 139 i boka. side 5 av 17

Kapittel 5 i boka inneholder mange slike funksjoner. Funksjoner av interesse kan være er: 1.2.4.1 Typecasting Funksjoner for å typecaste en variabel. F.eks. vil funksjonen Cint(streng) returnere tallverdien som denne strengen inneholder. Dim strstreng, itall strstreng = 22 itall = Cint(streng) I koden over vil itall få verdien 22. For mer informasjon om slike funksjoner se s. 126-128. 1.2.4.2 Formateringsfunksjoner På s. 128-130 finnes informasjon om formateringsfunksjoner. Dette kan være funksjoner som sørger for å formattere datoen på ønsket form, tiden på ønsket form, formattere et tall (kanskje du vil ha kun et siffer etter komma) eller formatering av valuta. 1.2.4.3 Matematiske funksjoner Disse er beskrevet på side 130-133. 1.2.4.4 Datofunksjoner Å bruke datoer i programmer kan ofte være vanskelig. I VBScript finnes det mange funksjoner for å gjøre dette lettere. Det finnes her funksjoner som kan hjelpe deg med å holde styr på hvor mange dager det er i måneden, om det er skuddår, hvor lang tid det er i mellom to datoer osv. 1.2.4.5 Strengfunksjoner S. 139-149 inneholder informasjon om strengfunksjoner. Dette kan være funksjoner som gjør om en streng til store bokstaver, sjekker om strengen inneholder et spesielt ord, sjekker om to strenger er like osv. Dette er funksjoner som i mange sammenhenger vil være veldig nyttige. 1.2.4.6 Oppsummering av viktige funksjoner På s.150 inneholder boka en oversikt over de funksjonene som anses som mest verdifulle. På slutten av kapittel 5 er det spørsmål til kapittelet som det finnes svar på bakerst i boka. Det kan være lurt å gå igjennom disse oppgavene. side 6 av 17

1.3 Objekter Vi skal nå se nærmere på begrepet objekter. Dette omhandles i kapittel 6 i boka (se bort fra collections s. 164-166 og events s. 173-174). Dette kapitlet prøver å summere opp det som står om objekter i boka. Etter å ha lest disse sidene bør du ha skjønt at et objekt er noe mer enn en vanlig variabel. En variabel vil ha kun en verdi mens et objekt kan bestå av mange variabler. La oss si at vi ønsker å lagre data om en eller flere studenter. En student vil f.eks. ha et navn, et telefonnummer og en adresse. Hvis vi skal lage et program som tar vare på disse opplysningene kan vi lage en variabel for navn, en for telefonnummer og en for adresse. Dette kan fort bli litt tungvint når det er snakk om mange studenter, fordi det blir veldig mange variable. I slike tilfeller vil det ofte være greit å putte studentene inn i en tabell. Men i dette tilfellet er heller ikke dette like greit da vi ønsker å ta vare på tre verdier for hver student. Det blir fort rotete. Løsningen er å bruke klasser og objekter. Vi ønsker å ta vare på tre verdier. Vi lager oss derfor en klasse som gjør nettopp dette. La oss kalle denne klassen Student. Klassen ser slik ut: Figur 3: Klassen Student Nå har vi lyst til å fylle denne klassen med verdiene fra en aktuell student. En klasse fylt med verdier kalles ikke lenger en klasse, men et objekt. Altså en klasse er en tom mal for hva et objekt skal inneholde. Under vises et objekt laget av klassen Student. Dette objektet er kalt studentobjekt, og variablene har fått verdier. side 7 av 17

Figur 4: studentobjekt 1.3.1 Koden for å lage klasser og objekter Klassen Student kan lages med følgende kode: <% Class Student public Navn public Telefonnummer public Adresse End Class %> For at vi skal ha noen nytte av klassen over må den brukes. Dvs. vi må lage objekter som inneholder verdier. Dette kan gjøres på følgende måte (forutsetter at vi først har laget klassen Student som vist over): <% Dim studentobjekt Set studentobjekt = new Student studentobjekt.navn= Kåre Klo studentobjekt.telefonnummer=73342425 studentobjekt.adresse= Klobakken 23 %> Andre linje i koden over sørger for å lage et objekt basert på klassen Student. Objektet vi lager velger vi her å kalle studentobjekt. Vi kan imidlertid velge hvilket navn vi vil, og vi kan gjerne lage flere objekter basert på klassen Student. Vi må da gi dem ulikt navn (eller evt. putte dem i en tabell). Akkurat på samme måte som vi må gi to ulike variabler ulikt navn. Vi gir variablene i objektet vårt verdier med objektnavn.variabelnavn Koden side 8 av 17

studentobjekt.navn= Kåre Klo fører altså til at variabelen Navn, i objektet studentobjekt, får verdien Kåre Klo. Hvis vi skal bruke riktig terminologi heter nå variabelen Navn nå egenskapen Navn. Altså variabler i et objekt heter egenskaper i stedet for variabler. Å hente ut en verdi fra et objekt er også enkelt. Når vi har laget studentobjekt kan vi hente verdiene lagret i dette objektet med koden: <% Dim strnavn strnavn = studentobjekt.navn Response.Write(strNavn) Response.Write(studentObjekt.Adresse) %> Koden over skriver ut egenskapene Navn og Adresse for studentobjekt. 1.3.2 Metoder i en klasse En trenger ikke bare å ha variabler i en klasse, men en kan også ha funksjoner og sub-rutiner. Disse vil da kalles en metode. Vi kan f.eks. utvide klassen Student til også å inneholde metoder. La oss si at vi vil ha en metode for å skrive ut både navnet, telefonnummeret og adressen til studentene. I tillegg vil vi ha en metode for endre telefonnummeret til en student og en metode for å hente navnet til studenten. <% Class Student private Navn public Telefonnummer public Adresse public Sub SkrivUt() Response.Write(Navn) Response.Write(Telefonnummer) Response.Write(Adresse) End Sub public Funtction HentNavn() HentNavn = Navn End Function public Function EndreNavn(nyttNavn)I Navn= nyttnavn End Function End Class %> Metodene beskrevet over brukes på akkurat samme måte som variablene. Vi bruker objektnavn.metode(), side 9 av 17

f.eks. studentobjekt.skrivut(). <% Dim studentobjekt Set studentobjekt = new Student studentobjekt.endrenavn( Kåre Klo ) studentobjekt.telefonnummer=73342425 studentobjekt.adresse= Klobakken 23 %> studentobjekt.skrivut() Koden studentobjekt.skrivut() vil sørge for å skrive ut alle verdiene i dette objektet. Legg merke til at vi også benytter metoden studentobjekt.endrenavn( Kåre Klo ) for å sette navnet til dette objektet i stedet for studentobjekt.navn = Kåre Klo som vi brukte i forrige delkapittel. Vi kan altså forandre en egenskap (variabel) gjennom bruk av en metode på objektet. Hva er så poenget? Hvis du ser på klassen Student vil du se at variabelen navn har fått private foran seg. Dette vil si at variabelen kun kan brukes internt i klassen (i metoder) men man kan ikke bruke objektet til å kalle variabelen. Det er derfor nå ikke lovlig å gjøre studentobjekt.navn = Kåre Klo lenger. Men vi kan i stedet bruke den nye metoden vi lagde (endrenavn). Poenget med dette er at vi kan styre hva som kan gjøres med objektet vårt. F.eks. kan jeg lage en metode som kun henter navnet i en variabel, men jeg gir ingen mulighet til å forandre innholdet i variabelen. Jeg har dermed kontroll over hvordan objektene kan brukes. side 10 av 17

Forskjellen er dermed at variabler og metoder som det står public foran (i klassen) kan brukes med objektnavn.egenskap eller objektnavn.metode, mens hvis variabelen eller metoden har private foran kan ikke disse brukes utenfor klassen. Hvis du har problemer med å forstå denne forskjellen tenk slik: Det som er private kan kun brukes inne i klassen, dvs. i vårt eksempel så blir det mellom public Class Student og End Class. Alle andre steder er det forbudt å bruke variabler eller metoder som er private, kun de som er public. 1.3.3 Innebygde objekter i ASP Du har allerede brukt objekter. Tenk bare på bruken av Response.Write. Som vi ser er det et punktum mellom Response og Write. Dette antyder at Response faktisk er et objekt og at Write er en metode som kan brukes på dette objektet. Response er faktisk et ferdiglaget objekt som du kan bruke (boka bruker stor forbokstav på de ferdiglagde objektene så vi gjør også det i leksjonene). Som navnet tilsier så er dette et objekt som sørger for respons til klienten. Metoden Write sørger for å skrive til klienten. Hvorfor ikke bare ha en funksjon som heter write i stedet? Grunnen til dette er at Response-objektet faktisk inneholder flere muligheter enn kun å skrive til klienten. Vi kommer tilbake til dette. Sidene 162-164 omtaler de innebygde ASP-objektene. Disse objektene skal vi komme tilbake til i senere leksjoner. 1.4 Response-objektet Kapittel 7 i boka beskriver bruken av Response-objektet. Det er viktig at du leser kapitlet. Det kan også være fornuftig å gjøre quiz-oppgavene til slutt i dette kapitlet (svar finnes bakerst i boka). De neste delkapitlene inneholder essensen fra kapitel 7 i boka. 1.4.1 Response.Write Vi har tidligere sett at når vi bruker Response.Write(tekst) så sendes innholdet i variabelen tekst til klienten. Dette vil typisk være vanlig tekst sammen med HTML-tagg er som beskriver hvordan teksten skal presenteres i nettleseren. Eksempel side 11 av 17

<% Response.Write( <H1> dette blir overskrift </H1> ) %> Koden over vil sørge for at nettleseren presenterer teksten som overskrift type 1. 1.4.2 Problemer med Response.Write Vi kan få problemer i visse tilfeller med bruk av Response.Write. Tenk bare hvis vi vil lage en hyperlenke til en annen web-side. HTML-koden for dette blir: <A HREF= nesteside.html > Gå til neste side </A> Vi prøver å putte HTML-koden direkte inn i Response.Write slik: <% Response.Write( <A HREF= nesteside.html > Gå til neste side </A> %> Koden over vil føre til en feilmeldingen vist i figuren under. Figur 5: Feil bruk av hermetegn Grunnen til feilmeldingen over er at vi ikke kan bruke hermetegn inne i hermetegn. Dvs. at Response.Write( test ) er lovlig, mens Response.Write( test ) gir problemer da dette blir det samme som vi hadde skrevet Response.Write(test). (Test er her ikke ment å være en variabel men en streng). I HTML-kode er det det samme om vi bruker apostrof ( ) eller hermetegn. Dette betyr det samme så vi kan forandre koden som vist nedenfor, og det vil fungere. side 12 av 17

<% Response.Write( <A HREF= nesteside.html > Gå til neste side </A> %> En annen mulighet kan være å bruke to hermetegn etter hverandre. Koden over kunne derfor også ha vært skrevet slik: <% Response.Write( <A HREF= nesteside.html > Gå til neste side </A> %> 1.4.3 Bruk av Server.HTMLEncode Du vil også merke at du får problemer med å vise HTML-tagg er i nettleseren. F.eks. tenk at du vil skrive ut: Figur 6:Bruk av Server.HTMLEncode Hvordan er det mulig å få til å vise <H1> inne i nettleseren? Nettleseren tar jo vekk slike tagg er og formaterer etterfølgende tekst i forhold til tagg en. En skulle derfor forvente at også første linje ble presentert som en overskrift. Grunnen til at det ikke skjer er at det finnes et ferdiglaget objekt Server som har en metode som heter HTMLEncode. Denne sørger for at HTML-kode (tagg er) vil presenteres i nettleseren. Koden for figuren over er som følger: <BODY> <% Response.Write(Server.HTMLEncode("<H1> ")) Response.Write("er en tag som gir overskrift, denne ser slik ut") Response.Write("<H1> overskrift </H1>") %> </BODY> 1.4.4 Response.Buffer Når vi bruker Response.Write er det to muligheter for hva som skjer: 1. Web-tjeneren sender teksten til klienten med en gang 2. Web-tjeneren samler opp mye tekst før det sendes til klienten side 13 av 17

Tilfelle 1 har fordelen av at teksten dukker opp i klienten så og si med en gang. Imidlertid så er det en stor ulempe med denne metoden, og det er at det blir veldig mange forsendelser til klienten. Hver slik forsendelse må inneholde mye mer enn kun teksten for at klienten skal kunne behandle teksten. Dette kalles overhead, og denne er like stor uansett om vi sender et ord eller mye tekst. Vi utsetter derfor nettverket for unødig mye overhead ved å sende hver Response.Write for seg. I tilfelle 2 venter vi til vi har nok tekst før alt sendes samtidig til klienten. Vi sier at vi bufrer dataene. Dette gjør at det blir mindre last på nettverket. Vi er imidlertid avhengig av at tjeneren kan mellomlagre denne informasjonen før den sendes. Dette vil altså kreve lagringsplass på tjeneren. I utgangspunktet er det web-tjeneren som bestemmer om tilfelle 1 eller 2 blir brukt. Vi kan imidlertid spesifisere hvilken metode vi vil bruke, slik at web-tjeneren blir tvunget til å gjøre som vi vil. Dette gjøres gjennom <% Response.Buffer = true %> når vi vil ha samle opp før vi sender (i et buffer). Når vi vil at dataene skal sendes med en gang brukes false. NB! Husk at når du vil spesifisere hvilken metode som skal brukes så må Response.Buffer settes (til true eller false) før noe data sendes til klienten (med f.eks. Response.Write). Listing 7.2 i boka og figur 7.3 viser hvordan bufring oppfører seg. 1.4.5 Response.Clear Denne metoden sørger for å slette alt som ligger i bufferet. Dvs. at når vi bruker denne metoden så vil alle data som ennå ikke er sendt til klienten bli slettet. Listing 7.3 og figur 7.4 i boka viser et eksempel på dette. 1.4.6 Response.Flush Denne metoden sørger for at alt som ligger i bufferet blir sendt til klienten med en gang. Dette kan være nyttig i tilfeller der deler av koden tar lang tid å utføre, vi kan da sørge for at klienten får de data som er tilgjengelig. Brukeren kan f.eks. få en beskjed om at beregning foregår, dette kan ta litt tid og så kommer beregningen når den er ferdig. Listing 7.4 og 7.5 i boka viser eksempler på bruken. side 14 av 17

1.4.7 Response.End Denne metoden sørger for å stoppe utførelsen av scriptet. Klienten vil i dette tilfellet motta de dataene som ligger bufret, men scriptet vil ikke fortsette å utføres. Listing 7.6 og 7.7 viser bruk av denne metoden. 1.4.8 Response.Redirect Denne metoden sørger for å sende klienten til en annen web-side. Nærmere bestemt gjøres dette ved at klienten får beskjed om å koble seg opp mot en annen web-side. NB! For at dette skal fungere er det viktig at klienten ikke har mottatt data før vi sender Response.Redirect. Hvis så er tilfelle får klienten en feilmelding! Vi må altså sørge for at vi gjør Response.Redirect før vi bruker Response.Write. Response.Redirect kan enten ta en absolutt URL som argument eller en relativ URL som argument. I det første tilfellet vil dette være en fullstendig URL f.eks. kan koden være slik: <% Response.Redirect( http://www.idb.hist.no/index.html ) %> Vi ser at URL en over innholder både hvilken protokoll som brukes (http), hvilken tjenere det er snakk om (www.aitel.hist.no) og hvilken ressurs det er snakk om (index.html). Bruker vi derimot relativ URL så vil vi angi den ressursen vi er ute etter med utgangspunkt der vi er nå. La oss si at vi besøker web-siden www.aitel.hist.no/index.asp. For å sende brukeren til www.aitel.hist.no/fag/asp/index.html kan vi gjøre følgende: <% Response.Redirect( fag/asp/index.html ) %> Dette fungerer like godt som om vi hadde gjort <% Response.Redirect( http://www.aitel.hist.no/fag/asp/index.html ) %> Merk at relativ URL fungerer kun når du skal redirigeres til en ressurs på samme web-tjener. Skal du redirigere noen til en annen web-tjener så må absolutt URL brukes. Fordelen med å bruke relative URL er i forhold til absolutte URL er er særlig stor når vi har web-sider som henger sammen. Tenk bare på et web-sted der du først må bruke en innloggingsside for så å komme inn på siden du er ute etter. Disse to sidene vil begge være nødvendige og de er derfor knyttet sammen. I dette tilfellet vil det være en fordel å bruke relativ URL fra innloggingssiden til den neste.vi tenker oss at vi har innlogging.asp og side.asp. Begge disse filene ligger på www.aitel.hist.no/test/. Innlogging.asp inneholder blant annet koden side 15 av 17

<% Response.Redirect( side.asp ) %>. Hvis jeg velger å flytte disse to filene til en annen tjener så vil fortsatt redirigeringen fungere. Det eneste kravet er at filene ligger på samme katalog. Hvis jeg derimot bruker <% Response.Redirect( http://www.aitel.hist.no/test/side.html ) %> så vil jeg ikke kunne flytte disse filene verken til en annen tjener eller til en annen katalog på tjeneren de ligger på (www.idb.hist.no) uten å forandre på denne URL en. Relative URL er bør derfor brukes når vi har web-sider som tilsammen danner et websted. Eksempler på bruk av Response.Redirect finnes i s.191 og 192 i boka. 1.4.9 Caching, Response.Expires og Response.ExpiresAbsolute En cache er et mellomlager. Cache brukes av nettlesere for å mellomlagre web-sider. Du slipper da å laste en ned en web-side på nytt hvis du allerede har vært på denne web-siden før. Dette gjør at du ofte kan oppleve at en web-side lastes tregt første gang du går inn på den, for så i etterfølgende besøk å lastes så å si umiddelbart. Caching er som du skjønner en fin ting, men kan skape problemer når vi har dynamiske websider. La oss si at du har vært innom Norsk Tipping sine lottosider. En time senere har en ny lottotrekning funnet sted og du går inn på siden for å få de nye tallene. Det viser seg imidlertid at du får de samme tallene som du fikk en time tidligere. Du er likevel sikker på at nye lottotall er lagt ut da du har blitt fortalt dette. Det er nettleseren som sørger for dette problemet ved å cache web-siden første gang du er inne på web-siden, neste gang du går inn vil du få det som ligger i cache, i stedet for den oppdaterte web-siden. Som ASP-programmerer kan du gjøre noe med dette problemet. Vi kan bruke Response.Expires. Denne gjør det mulig å sette hvor mange minutter en web-side skal ligge i nettleserens cache før den slettes. <% Response.Expires = 5 %> Koden sørger for at web-siden skal slettes etter 5 minutter. Vær imidlertid klar over at dette blir beregnet fra web-tjenerens klokke. Dersom klokka på web-tjeneren er 12 så skal websiden slettes 1205. Dette kan gi problemer om klokka på klienten er ulik den på tjeneren. La oss si at klokka på klientmaskinen er bare 1100 når klokka på tjenermaskinen er 12. I dette tilfellet vil det ta 1 time og 5 minutter før web-siden slettes fra cache i stedet for 5 minutter! side 16 av 17

Grunnen er at nettleseren venter til klokka er 1205 før sletting skjer, fordi nettleseren forholder seg til klokka på klientmaskinen. For å være sikker på at web-siden ikke legges i cache kan du bruke (se boka for forklaring) Response.Expires = -1500 Hvis du vil oppgi at web-siden skal kunne ligge i cache i flere dager før den slettes kan du bruke Response.ExpiresAbsolute = Date Time. Date angir hvilken dato det er snakk om mens Time angir tidspunktet på dagen. side 17 av 17