7. Datafiler på tjenersiden



Like dokumenter
9. ASP med databasekopling, del II

Innføring i bruk av CGI4VB

Innføring i bruk av CGI4VB

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

HØGSKOLEN I SØR-TRØNDELAG

8. ASP med databasekopling, del I

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

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

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

Plan for dagen. Vprg 4. Dagens tema - filbehandling! Strømmer. Klassen FilLeser.java. Tekstfiler

Web-programmering med JSP Løsningsforslag leksjon 3

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

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

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

Oblig 5 Webutvikling. Av Thomas Gitlevaag

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak (exceptions) Utgave 3: Kap. 6. Terje Rydland - IDI/NTNU

lagring med HTML5 Offline lagring Offline Informasjonsteknologi 2 Gløer Olav Langslet Sandvika VGS

Repetisjon Novice Videregående Python PDF

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.

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

1 ASP og VBScript. 1.1 Om denne leksjonen

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

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

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

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

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 Avdeling for informatikk og e-læring - AITeL

som blanker skjermen (clear screen). Du får en oversikt over alle kommandoene ved å skrive,

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

en hjemmeside Lesson Introduksjon Du kjenner en del HTML tagger, så nå er det på tide å lage din første hjemmeside! La oss begynne med en gang.

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

CASCADING STYLESHEETS (CSS)

HØGSKOLEN I SØR-TRØNDELAG

En enkel while-løkke. 1 of :28. 2 of :28. while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt

Betinget eksekvering og logiske tester i shell

the web Introduksjon Lesson

Shellscripting I. Innhold

EndNote referansehåndteringsprogram. HiVe biblioteket

2. Lage ASP.NET sider

TOD063 Datastrukturer og algoritmer

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

Hangman. Level. Introduksjon

TDT4110 Informasjonsteknologi grunnkurs: Tema: Filer og unntak ( exceptions ) - 3rd edition: Kapittel 6. Professor Alf Inge Wang

Læringsmål og pensum. Inn- og utoperasjoner 21/10/16

HØGSKOLEN I SØR-TRØNDELAG

6105 Windows Server og datanett

1. Profiler og variabler

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

1: Steng ned alle MAB på alle maskiner før dere starter oppdateringen. Dette gjelder også MAB Schedule som dere vil finne på serveren.

Sprettball Erfaren ComputerCraft PDF

Bruk av NetBeans i JSP-delen av Web-applikasjoner med JSP og JSF

Argumenter fra kommandolinjen

Tilgjegelighet av XHTML-forms

Løse reelle problemer

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

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

Et forsøk på definisjon

Start et nytt Scratch-prosjekt. Slett kattefiguren, for eksempel ved å høyreklikke på den og velge slett.

1. Rullende navn, s 3 2. Smilefjes, s 5 3. Skritteller, s 7 4. Orakel, s 9 5. Stein, saks og papir, s Kompass, s 14

HØGSKOLEN I SØR-TRØNDELAG

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

Web-programmering med JSP Løsningsforslag leksjon 4

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Introduksjon til beslutningsstrukturer

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

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

INF120: Oblig 3. Yngve Mardal Moe

INF1000 HashMap. Marit Nybakken 2. november 2003

1. Tilstandsinformasjon på klientsiden

Et forsøk på definisjon. Eksempel 1

JavaServer Pages (JSP)

Kanter, kanter, mange mangekanter

HØGSKOLEN I SØR-TRØNDELAG

Debugging. Tore Berg Hansen, TISIP

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

Å lese tall fra en fil, klassen Scanner

En enkel innføring i ASP

6105 Windows Server og datanett

Erlend Oftedal. Risiko og sikkerhet i IKT-systemer, Tekna

while-løkker while-løkker gjentar instruksjonene så lenge en betingelse er oppfylt Eksempel 1: en enkel while-løkke

Løse reelle problemer

1. Å lage programmer i C++

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

1. Installasjon av supportpack

}?> <!DOCTYPE... <html xmlns=" <head>... </head> <body> <p>nå skal vi printe hallo:</p> <?php //funksjonskall

Enkle generiske klasser i Java

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

MAT1030 Plenumsregning 1

Forsvunnet katt webside

Mattespill Nybegynner Python PDF

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Legg bort skilpaddene dine, i dag skal vi lære hvordan vi kan sende hemmelige beskjeder!

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

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

HØGSKOLEN I SØR-TRØNDELAG

Python: Filer og unntak Gaddis: Kapittel 6

Transaksjonshåndtering. Skalerbarhet.

2 Om statiske variable/konstanter og statiske metoder.

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

Transkript:

Else Lervik 09.03.2004 Opphavsrett: Forfatter og Stiftelsen TISIP Lærestoffet er utviklet for faget LV192D Web-programmering med ASP 7. Resymé: I denne leksjonen er kommunikasjon med datafiler sentralt. Vi skal se hvordan en ASP skriver til og leser fra datafiler. Vi behandler filene sekvensielt, det vil si at vi ikke forflytter oss vekselvis framover og bakover. Som eksempel skal vi lagre resultater fra en evaluering av spisesteder. Leksjonen avsluttes med et forsøk på begrepsavklaring når det gjelder objekt, klasse, instans etc. Dette er sentrale begrep som det fort kan bli forvirring rundt. Innhold 7.1. KOMMUNIKASJON MED DATAFILER... 2 7.1.1. Åpning og lukking av datastrømmer...2 7.1.2. Lesing fra og skriving til datafiler... 3 7.2. ET EKSEMPEL: LOGGING AV BRUKEREVALUERING... 4 7.3. PROBLEMET MED OPPDATERING HOS KLIENTEN... 8 7.4. ET FORSØK PÅ BEGREPSAVKLARING... 9 Referanse til læreboka Leksjonen dekker side 412-433 i læreboka med hovedvekt på de siste 12 sidene. Mulige problemer Det har tidligere dukket opp en del problemer angående bruk av datafiler. Jeg velger å summere opp dette her, da det vel ikke er usannsynlig at tilsvarende problemer inntreffer nå også: 1. Det virker som kun IE kan brukes som nettleser dersom ASP en jobber mot datafiler. 2. Dersom en ASP skal kunne skrive til en fil, må mappen der filen ligger være skrivbar. Dette kan du sette ved å velge Start/ Kontrollpanel/Administrative verktøy/internett Services (eller bruk knappen Avansert der du stopper og starter IIS). Finn den aktuelle mappen, høyreklikk og spesifiser under egenskaper hvilke rettigheter du vil gi. 3. Bruker du Norton Antivirus? Av og til kan ASP-problemer skyldes scriptblokking. Prøv derfor med å slå av (disable) denne.

7.1. Kommunikasjon med datafiler Filbehandlingen som du kjenner fra Visual Basic er ikke en del av VBScript. VBScript er et scriptspråk som kan benyttes på klientsiden, på tilsvarende måte som JavaScript slik du så i leksjon 3. Imidlertid er det få (om noen i det hele tatt?) nettlesere andre enn Microsoft Internet Explorer som støtter dette scriptspråket. Vi husker fra leksjon 3 at kode skrevet inni HTML-elementet <SCRIPT> </SCRIPT> sendes til klienten, og nettleseren tolker og utfører koden. Av sikkerhetsgrunner bør denne koden ikke inneholde instruksjoner som håndterer filer på klientsiden. Det er lett å tenke seg at det ville være risikabelt. I verste fall kan viktige systemfiler ødelegges på denne måten. Filbehandling på tjenersiden er imidlertid ikke forbundet med denne risikoen. Våre ASP er kan både lese fra og skrive til filer hos tjeneren. Som øving denne gangen skal du som sagt lage en gjestebok der de som besøker nettstedet ditt kan legge inn kommentarer. Ved å lagre boka på en fil, sikrer vi at den lever videre selv om for eksempel web-tjeneren går ned. Objekter for filbehandling er ikke en del av VBScript. I stedet ligger ferdige objekter for filbehandling i The Scripting Runtime Library. Dette biblioteket finnes på filen scrrun.dll og består av seks objekter: Dictionary, Drive, Drives, File, Files og FileSystemObject. Alle unntatt det første tilbyr tjenester i forbindelse med filbehandling. Du bruker disse objektene på samme måte som andre objekter. Grunnlaget for all filbehandling er FileSystemObject. Det gir oss adgang til filsystemet, og vi kan undersøke katalogstrukturer og innholdet i filer. En oversikt over metodene finner du på side 735. Flere eksempler på bruk finner du på side 412-421. Vi vil i denne leksjonen vektlegge kommunikasjon med sekvensielle filer. Som du kjenner fra Visual Basic, en fil må åpnes før et program kan kommunisere med den. Det vil si at det må knyttes en forbindelse mellom den fysiske filen og programmet. Egentlig snakker vi helst om strømmer og ikke filer. Programmet vårt forholder seg til en datastrøm. Forbindelsen til den fysiske filen ligger gjemt inni strøm-objektene. Dersom vi leser fra datafilen, strømmer dataene fra filen til programmet. Og omvendt, dersom vi skriver til datafilen, strømmer dataene fra programmet til filen. Vi vil alltid åpne for enten skriving eller lesing, aldri begge deler på en gang. Verken vann eller data kan strømme begge veier samtidig. Lesing skjer alltid fra begynnelsen av filen, mens skriving kan skje fra begynnelsen eller etter det som måtte stå på filen fra før. Etter at vi er ferdig med å lese eller skrive, lukker vi strømmen, vi stenger krana. Filsystemet sørger for at ikke flere kan skrive til en fil samtidig. Vi bør passe på at kommunikasjonen med filen skjer i små, kompakte programbiter. Og vi må alltid huske på å lukke strømmen, ellers holder vi forbindelsen unødig lenge. Det fins også en annen viktig grunn til å lukke en datastrøm: Ved skriving til filen mellomlagres data ofte i et buffer. Dersom vi glemmer å lukke strømmen, kan det hende at ikke alle dataene er overført fra bufferet til filen. 7.1.1. Åpning og lukking av datastrømmer For i det hele tatt å kunne kommunisere med en datafil må vi ha tilgang til en instans av FileSystemObject. Det lager vi på følgende måte: Set objfso = Server.CreateObject("Scripting.FileSystemObject") side 2 av 10

Hva er Server? Server er et ASP-objekt (se side 163) som blant annet gjør det mulig for oss å instansiere såkalte server-komponenter. Komponenter er pakker med objekter, ofte i form av en DLL. Objektet vi skal bruke ligger i en komponent med navn Scripting (jfr. navnet på biblioteket The Scripting Runtime Library) Et FileSystemObject gir oss muligheten til å åpne en datastrøm knyttet til filen minedata.txt : Set objfil = objfso.opentextfile(server.mappath( minedata.txt ), ForReading, True) Igjen bruker vi en metode i Server-objektet: MapPath() konverterer en virtuell sti til en fysisk. I vårt eksempel ligger filen minedata.txt på samme katalog som ASP en. ForReading er en navngitt konstant med verdi 1. Andre aktuelle måter å åpne filen på er ForWriting (verdi 2) og ForAppending (verdi 8). Konstantene har innarbeidete navn, men vi må definere dem, de er altså ikke ferdig-definerte. Alternativt kan vi bruke tallverdiene (1, 2 eller 8), men dette gjør programmet vanskeligere å lese. Siste argument sier hvorvidt filen skal genereres dersom den ikke eksisterer. OpenTextFile() kan også ta et fjerde argument, dette er lite aktuelt for oss å bruke. Se eventuelt læreboka side 422. På disse sidene (side 421-424) finner du også flere eksempler og alternative måter å åpne datastrømmer på. Spesielt er OpenAsTextStream() aktuell å bruke dersom du skal åpne og lukke en strøm til samme datafil flere ganger: Set objfil = objfso.getfile(server.mappath(filnavn)) Set objfilopen = objfil.openastextstream(forreading) OpenTextFile() og OpenAsTextStream() returnerer begge et TextStream-objekt. Vi lukker strømmen med close(): objfilopen.close() samme variabelnavn som er brukt i open-setningen 7.1.2. Lesing fra og skriving til datafiler Som forklart foran, metodene som åpner en strøm returnerer et TextStream-objekt. Vi kommuniserer altså med datafilen via dette objektet. Vi overfører data fra filen til programmet ved å bruke ulike varianter av Read()-metoden: Read(antallTegn) ReadLine() ReadAll() Eksempel: leser inn et antall tegn leser data fram til neste linjeskift-tegn leser inn resten av strømmen linje = objfil.readline() ettegn = objfil.read(1) leser ett tegn resten = objfil.readall() Vi overfører data motsatt vei med ulike varianter av Write()-metoden: Write(tekst) WriteLine(tekst) WriteBlankLines(antall) Eksempel: objfil.write( Hallo! ) objfil.writeline("********************") objfil.writeblanklines(5) skriver teksten til filen, linjeskift legges ikke inn skriver teksten til filen, etterfulgt av linjeskift skriver et visst antall blanke linjer til filen side 3 av 10

Når programmet vårt jobber med en strøm, vedlikeholdes en intern peker som holder orden på hvor langt vi til enhver tid er kommet. Viktige egenskaper ved TextStream-objektet følger denne lese/skrivepekeren: AtEndOfLine AtEndOfStream Column Line True dersom neste tegn er linjeskift-tegnet True dersom vi er ved slutten av filen Gir kolonnenummer Gir linjenummer 7.2. Et eksempel: Logging av brukerevaluering Vi skal se på et eksempel der restaurant-gjester presenteres for et skjema (figuren nedenfor). Gjestene fyller ut skjemaet og sender det av gårde. Dette medfører at evalueringen lagres på en fil på tjenermaskinen. Vi gjør det enkelt, og lagrer evalueringene fortløpende. Vi lar en ASP presentere evalueringene i nettleseren. På grunn av skjemaets størrelse får vi også repetert hvordan vi tolker de ulike inputelementene. En typisk evaluering kan se slik ut på datafilen: Restaurant: ABC Fornøyd med: mat Ikke fornøyd med: pris Gjesten spiste: Stekte sjøkrepshaler med appelsinsaus Kommentarer: Nyydelig Kjønn: kvinne Alder: under20 ************************************************************** side 4 av 10

Figur 1: Skjema for evaluering av spisesteder Datafilen inneholder etter hvert mange slike evalueringer etter hverandre. Vi begynner med ASP en som leser alle evalueringene og presenterer dem på skjermen: <% ' ' AlleEvalueringer.asp E.L. 2001-10-12 ' ' Denne asp-filen leser alle restaurant-evalueringene fra datafilen, ' og viser dem fram i nettleseren. Option Explicit %> <HTML><HEAD><TITLE>Alle evalueringer hittil</title></head> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <P><STRONG>Alle evalueringer pr <%=Date%></STRONG> <P> <% Const filnavn = "evalrest.txt" side 5 av 10

Const ForReading = 1 Dim objfso, objfil, linje 'Åpner en strøm knyttet til filen Set objfso = Server.CreateObject("Scripting.FileSystemObject") Set objfil = objfso.opentextfile(server.mappath(filnavn), ForReading, True) 'Leser en og en linje og viser fram på skjermen Do While Not objfil.atendofstream linje = objfil.readline() Response.Write linje & "<BR>" Loop Lukker strømmen objfil.close() %> </BODY></HTML> Legg merke til hvordan vi bruker AtEndOfStream som stoppkriterium i løkka. Vi leser en og en linje så lenge det er noe å lese. Hver linje som leses inn skrives ut i nettleservinduet. Merk at vi må skrive ut HTML-tag en <BR> for å få linjeskift på skjermen. La oss så se på skjemaet og ASP ene som behandler dette. Kildekoden til skjemaet er ren HTML og ser slik ut: <!-- Restaurant.html E.L. 2001-10-12 --> <HTML><HEAD><TITLE>Evalueringsskjema for spisesteder</title></head> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <H1>Evaluering av spisesteder</h1> <FORM ACTION="Restaurant0.asp" METHOD="post"> <P><STRONG>Navn på spisested:</strong> <INPUT NAME="navn" TYPE="text" SIZE="20"> </P> <P><STRONG>Ting du er fornøyd med:</strong><br> Mat<INPUT NAME="fornoyd" TYPE="checkbox" VALUE="mat"> Beliggenhet<INPUT NAME="fornoyd" TYPE="checkbox" VALUE="beliggenhet"> Service<INPUT NAME="fornoyd" TYPE="checkbox" VALUE="service"> Pris<INPUT NAME="fornoyd" TYPE="checkbox" VALUE="pris"> <P><STRONG>Ting du ikke er fornøyd med:</strong><br> Mat<INPUT NAME="ikkeFornoyd" TYPE="checkbox" VALUE="mat"> Beliggenhet<INPUT NAME="ikkeFornoyd" TYPE="checkbox" VALUE="beliggenhet"> Service<INPUT NAME="ikkeFornoyd" TYPE="checkbox" VALUE="service"> Pris<INPUT NAME="ikkeFornoyd" TYPE="checkbox" VALUE="pris"> <P><STRONG>Hva spiste du?</strong><br> <SELECT NAME="mat" MULTIPLE> <OPTION>Kalvemince med ris <OPTION>Gresk lammegryte side 6 av 10

<OPTION>Paella <OPTION>Pølse- og ostefylte auberginer <OPTION>Lett, varm grønnsakssalat med pasta og bacon <OPTION>Sennepsstekt lammecarré <OPTION>Kyllingfrikassé med tomat og estragon <OPTION>Stekte sjøkrepshaler med appelsinsaus </SELECT> <P><STRONG>Andre kommentarer:</strong><br> <TEXTAREA NAME="kommentarer" TYPE="textarea" ROWS="4" COLS="40"></TEXTAREA> <P><STRONG>Kjønn:</STRONG><BR> Kvinne<INPUT NAME="kjonn" TYPE="radio" VALUE="kvinne" CHECKED> Mann<INPUT NAME="kjonn" TYPE="radio" VALUE="mann"> <P><STRONG>Alder:</STRONG><BR> Under 20 år<input NAME="alder" TYPE="radio" VALUE="under20" CHECKED> 20-29 år<input NAME="alder" TYPE="radio" VALUE="tjue"> 30-39 år<input NAME="alder" TYPE="radio" VALUE="tretti"> 40-49 år<input NAME="alder" TYPE="radio" VALUE="førti"> 50-59 år<input NAME="alder" TYPE="radio" VALUE="femti"> Over 60 år<input NAME="alder" TYPE="radio" VALUE="seksti"> <P> <INPUT TYPE="submit" NAME="bekreft" VALUE="Send data"> <INPUT TYPE="reset" NAME="avbryt" VALUE="Blank ut feltene"> </FORM> </BODY></HTML> Behandlingen av skjemaet ligger i filen Restaurant0.asp: <% ' ' Restaurant0.asp E.L. 2001-10-12 ' ' Denne asp-filen aktiviseres av Restaurant.html. Den henter data som er lagt inn i ' feltene der, og skriver disse til en tekstfil. Nye evalueringer skrives ' etter de som ligger der fra før. Option Explicit %> <HTML><HEAD><TITLE>Evalueringsskjema for spisesteder</title></head> <BODY BGCOLOR="wheat" TEXT="darkgreen" LINK="brown" VLINK="steelblue" ALINK="darkblue"> <% Const strfilnavn = "evalrest.txt" Const ForAppending = 8 Dim objfso, objfil 'Åpner filen Set objfso = Server.CreateObject("Scripting.FileSystemObject") Set objfil = objfso.opentextfile(server.mappath(strfilnavn), ForAppending, True) 'Skriver evalueringen til objfil side 7 av 10

objfil.write("restaurant: " & Request.Form("navn") & chr(13) & chr(10) & _ "Fornøyd med: " & Request.Form("fornoyd") & chr(13) & chr(10) & _ "Ikke fornøyd med: " & Request.Form("ikkeFornoyd") & chr(13) & chr(10) & _ "Gjesten spiste: " & Request.Form("mat") & chr(13) & chr(10) & _ "Kommentarer: " & Request.Form("kommentarer") & chr(13) & chr(10) & _ "Kjønn: " & Request.Form("kjonn") & chr(13) & chr(10) & _ "Alder: " & Request.Form("alder") & chr(13) & chr(10) & _ "**************************************************************" _ & chr(13) & chr(10) & chr(13) & chr(10)) 'Lukker filen og skriver en melding til klienten objfil.close() Response.Write "Din evaluering er lagret" %> <P>Ønsker å se <A HREF = "AlleEvalueringer.asp">alle evalueringene</a> </BODY></HTML> Evalueringene skrives fortløpende til datafilen. Merk at vi skriver hele evalueringen i en Write()-setning. Årsaken til dette er at det er viktig at alt skrives ut på en gang. Ellers kan vi risikere at klienter som leser evalueringene får tak i deler av en evaluering fordi de leser fra filen innimellom to Write()-setninger. Selv om alt skrives ut med én Write()-setning er det likevel viktig å få linjeskift på passende steder i datafilen (se utskrift av datafilen foran). I Windows/MS-DOS består et linjeskift av to tegn: tegnene med ASCII-verdi 13 ( carriage return ) og 10 ( line feed ). Så hver gang vi vil ha linjeskift må vi legge inn disse to tegnene i strengen vår. chr(13) betyr at vi skal ha det ene tegnet som har nr 13 og ikke tallet 13. Du legger kanskje også merke til understrekingstegnet i slutten av hver linje unntatt den siste i Write()-setningen. Det betyr at setningen fortsetter på neste linje. 7.3. Problemet med oppdatering hos klienten Kjør eksemplet foran. Trykk på Oppdater-knappen når du har siden RestaurantEvaluering1.jsp framme i nettleseren. Sjekk innholdet av datafilen. Hva skjer? De samme dataene lagres gang på gang. Dette er selvfølgelig ikke ønskelig. Vi vil kun lagre én evaluering pr besøk. Dette løser vi ved å bruke en sesjonsvariabel (se forrige leksjon). Vi setter variabelen etter at dataene er lagret første gang. Ved inngang til siden sjekker vi om variabelen er satt, dersom den er det, lagrer vi ikke på nytt. Vi kaller den reviderte utgaven av filen for RestaurantEvaluering.jsp, og den har følgende kropp (fullstendig utgave lastes ned i tilknytning til leksjonen): <% If Request.Form("bekreft") <> "" And Session("lagret") = "" Then Const strfilnavn = "evalrest.txt" Const ForAppending = 8 Dim objfso, objfil 'Åpner filen Set objfso = Server.CreateObject("Scripting.FileSystemObject") Set objfil = objfso.opentextfile(server.mappath(strfilnavn), ForAppending, True) side 8 av 10

'Skriver evalueringen til objfil objfil.write(.) 'Lukker filen og skriver en melding til klienten objfil.close() Session("lagret") = "ok" Response.Write "Din evaluering er lagret" End If %> 7.4. Et forsøk på begrepsavklaring Et tillegg til leksjonen Hva er en klasse, hva er et objekt, og er det noe som heter instans? Og hva i all verden er en komponent? Er du begrepsforvirret? Det er i tilfelle en riktig reaksjon. For det viser seg at disse begrepene delvis brukes om hverandre. I denne leksjonen har vi brukt alle (eller nesten alle) disse begrepene, og vi skal derfor repetere hva som ligger i dem. Et objekt i et program er (som oftest) en modell av en ting i den virkelige verden. Vi kan modellere Karis bil, byen Trondheim eller fotball-laget. En klasse er en beskrivelse av en mengde objekter med samme egenskaper og oppførsel. Vi kan for eksempel lage en klasse som beskriver biler. Da vil Karis bil være et objekt som tilhører denne klassen. En klasse-erklæring begynner med det reserverte ordet Class. I leksjon 3, kapittel 3.2 finner du et eksempel på en klasse. Vi kan også si at Karis bil er en instans av den klassen som beskriver biler. Instans er en fornorskning av det engelske ordet instance som betyr bl.a. eksempel. Karis bil er med andre ord et eksempel på en bil. Du har ikke laget mange klasser i dette kurset. Du har derimot brukt en del ferdige klasser. Se på følgende setning: Response.Write( <H1>Dette blir en overskrift</h1> ) Response er et objekt. Det er en instans av en klasse som du ikke ser. Objektet inneholder informasjon som nettleseren tolker. Imidlertid snakker boka (og den er ikke alene!) om instances of objects, for eksempel side 161. Da er det meningen at du skal bli litt forvirret. For her burde det i stedet stått instances of classes eller objects of classes. Saken er den, og nå siterer jeg fra en meget ryddig bok på området 1 : One of the reason that the term class has been overrun by the term object is that a large precentage of the objects that people use were not written by themselves. Instead, they are binary objects distributed in the form of components. So they do not think of them as classes. Men her dukket ordet komponent opp. En komponent er en samling klasser, gjerne i form av en DLL-fil. Vi har i denne leksjonen brukt en komponent som heter Scripting. Og vi følger den allmenne ordbruken og sier at denne komponenten består av seks objekter (selv om vi egentlig burde sagt seks klasser ). Også den refererte ryddige boka gjør det samme. Vi må 1 Susanne Clark, et.al.: VBScript Programmer s Reference. Wrox Press Ltd. 1999, ISBN 1-861002-71-8 side 9 av 10

bare ha i bakhodet at det ikke blir objekter før vi tar dem i bruk i programmet vårt, for eksempel slik: Set filobjekt = filsystemobjekt.openastextstream(forreading) Metoden OpenAsTextStream() genererer et objekt av klassen TextStream. Det er dette objektet variabelnavnet filobjekt gir oss adgang til. side 10 av 10