4. VBScript ASP-is
Nagu esimeses peatükis mainitud, kasutatakse ASP-is vaikimisi
skriprikeelt VBScript (Microsoft® Visual Basic® Scripting Edition).
Nagu nimigi ütleb, kuulub see skriptikeel Microsoft® Visual Basic
programmeerimiskeelte perekonda. VBScript loob võimalused skriptide
kirjutamiseks mitmetes keskkondades, hõlmates HTML-skriptid Microsoft®
Internet Exploreris ja WWW-serveri skriptid Microsoft® Internet
Information Serveris.
ASP-skript koosneb käskude jadast, mida ASP järjest käivitab.
Käskudeks võivad olla näiteks muutujate omistamised, tingimuslaused,
tsüklite kirjeldused, Visual Basic funktsioonid. Järgnevas antaksegi
lühiülevaade VBScripti põhilistest juhtimisstruktuuridest ja
mõningatest stringitöötluskäskudest (peatüki koostamisel on aluseks
võetud allikas [2]).
4.1 Juhtimisstruktuurid
Juhtimisstruktuuridena mõeldakse lauseid, mis juhivad programmi tööd.
Siia alla kuuluvad funktsioonide väljakutsed, tingimused, tsüklid,
vigadele reageerimislaused jm.
4.1.1 Muutujad
Muutujate eeldefineerimine ei ole VBScriptis kohustuslik. Seega võib
suvalises kohas programmis (skriptis) luua muutuja lihtsalt sellele
mingi väärtuse omistamisega. Muutujate nimedele erilisi piiranguid ei
seata, kehtivad samad reeglid, mis enamuses programmeerimiskeeltes.
Kuigi muutujaid ei pea eeldefineerima, on siiski hea komme muutujaid
eeldefineerida see annab skriptist parema ülevaate ja lihtsustab ka
vigade leidmist. Samas on võimalik nõuda muutujate eeldefineerimist,
nimelt tuleb selleks skripti algusse (kindlasti peab see olema enne
muutujate ja protseduuride defineerimist) kirjutada lause Option
Explicit. Sellega nõutakse skripti käivitamisel/kompileerimisel
kõikide muutujate eeldefineeritust. Kui mõni muutuja on
eeldefineerimata (nt. muutuja on valesti kirjutatud), tekib viga.
Muutujate defineerimine toimub VBScriptis järgmiste lausetega:
* Dim defineerib muutuja. Kui muutuja defineeritakse skripti
tasemel, siis on see kättesaadav kõikidele selles skriptis
olevatele protseduuridele; protseduuri tasemel (protseduuris)
defineeritud muutuja on kättesaadav ainult protseduuris.
* Public või Private muutujate defineerimiseks skriptitasemel. ASP-i
puhul neil erilist tähendust pole, aga üldiselt lubab Public
muutuja poole pöörduda ka teiste skriptide protseduuridel ja
Private ainult skripti protseduuridel, milles muutuja
defineeritakse.
Muutujateks võivad olla tavamuutujad, massiivid või objektid.
Massiivil saab defineerimisel määrata suuruse (andes selle sulgudes
muutujanime järel), kui seda aga tehtud pole, siis saab skriptis
massiivide suurused määrata lausega ReDim, mille süntaks on järgmine:
ReDim [Preserve] massiiv(uus_suurus)
Võtmesõna Preserve kasutatakse massiivi väärtuste säilitamiseks. Kui
suurust vähendatakse, siis ellimineeritud massiivi liikmetes olevad
väärtused lähevad kaduma.
Objekti väärtustamisel kasutatakse lauset Set, mille süntaks on
järgmine:
Set objektimuutuja = {objekti_loomine | Nothing}
objekti_loomine võib olla sama objekti tüüpi muutuja või objekti
loomise funktsioon. Kui muutujale omistatakse väärtus Nothing, siis
vabastatakse kõik ressursid, mis selle objektiga seotud olid (objekt
hävitatakse).
4.1.2 Protseduurid
Protseduure defineeritakse VBScriptis kahe lausega: Sub ja Function.
Nende põhiliseks erinevuseks on see, et Function-lausega defineeritud
protseduur võib tagastada väärtuse. Protseduuridele saab ette anda
argumente (ka muutuva väärtusega argumente st. protseduur võib
argumentide väärtusi muuta ja see kajastub ka väljakutsujas).
Protseduuri saab suvalises kohas protseduuri sees lõpetada lausega
Exit, mille järele kirjutatakse vastavalt kas Sub või Function.
Protseduuride väljakutsumine toimub lausega Call, millele järgneb
protseduuri nimi. Samas saab Function-lausega defineeritud protseduuri
välja kutsuda kui tavalist funktsiooni (nt. omistades muutujale
väärtust). Kui protseduuri väljakutsumine toimus lausega Call, siis
peavad protseduurile edastatavad argumendid olema sulgudes (tavaliselt
pole protseduuride väljakutsumisel VBScriptis argumente sulgudega
ümbritseda vaja).
4.1.3 Tingimuslaused
Tingimuslauseks VBScriptis on lause: If Then Else, mille süntaks on
järgmine:
If tingimus Then
[käsud]
[ElseIf tingimus-n Then
[käsud]] . . .
[Else
[käsud]]
End If
Kõigepealt kontrollitakse, kas tingimus on tõene ja kui ta seda on,
siis täidetakse If järel olevad käsud. Kui see tingimus on väär,
kontrollitakse tingimus-n tõesust (ElseIf lauset võib ka mitu olla) ja
kui see on tõene, siis täidetakse ElseIf-le järgnevad käsud; kui ka
ükski tingimus-n pole tõene, siis täidetakse Else järel olevad käsud.
ElseIf- ja Else-osad võivad puududa.
Kui tingimuslausele vastavad käsud on täidetud jätkub, töö peale End
If lauseosa.
4.1.4 Tsüklid
VBScriptis saab kasutada nelja tüüpi tsükleid:
* Do . . . Loop-tsükkel, mida täidetakse, kuni tsükli tingimus on
tõene (või kuni tsükli tingimus saab tõeseks). Tsükli süntaks on
järgmine:
Do [{While | Until} tingimus]
[käsud]
[Exit Do]
[käsud]
Loop
Kui määratud on While-lauseosa, siis täidetakse tsüklit kuni
tingimus on tõene; kui Until-lauseosa, siis seni, kuni tingimus
saab tõeseks. Tingimuse kontrolli võib panna ka tsükli
lõpetuslause (Loop) juurde. Exit Do lausega väljutakse tsüklist
ilma tsükli lõppu ootamata.
* While . . . Wend-tsükkel, mida täidetakse kuni tsükli tingimus on
tõene. Tsükli süntaks on järgmine:
While tingimus
[käsud]
Wend
* For . . . Next-tsükkel, millega korratakse käske teatud arv kordi.
Tsükli süntaks on järgmine:
For loendur = algväärtus To lõppväärtus [Step samm]
[käsud]
[Exit For]
[käsud]
Next
Tsüklit täidetakse, kuni loenduri väärtus muutub algväärtusest
lõppväärtuseni. Loendur'it muudetakse vastavalt etteantud sammule;
kui samm puudub, suurendatakse loenduri väärtus iga kord ühe
võrra. Tsükli samm võib olla ka negatiivne. Lause Exit For lõpetab
tsükli ilma loenduri väärtust kontrollimata.
* For Each . . . Next-tsükkel, mida täidetakse iga etteantud grupi
elemendi kohta. Tsükli süntaks on järgmine:
For Each element In grupp
[käsud]
[Exit For]
[käsud]
Next [element]
Grupina võib ette anda massiivi või kogumi.
Tsüklid võivad üksteist sisaldada. Kui tsükkel sisaldub sama tüüpi
tsüklis, siis Exit-lause lõpetab selle tsükli, milles ta välja
kutsuti.
4.1.5 Veatöötlus
Skripti töö käigus võib tekkida programmeerijast sõltuvaid või ka
programmeerijast sõltumatuid vigu. Kui skripti töö käigus tekib viga,
siis skripti töö lõpetatakse ja väljastatakse veateade. Et aga sellist
situatsiooni vältida, saab vea tekkimist ignoreerida. Selleks tuleb
koha ette, kus viga tekkida võib (või ka protseduuri algusse)
kirjutada järgmine lause:
On Error Resume Next
Kui peale seda lauset mõni käsk vea põhjustab, ignoreeritakse seda
viga ja täitmisele läheb veateate põhjustanud käsule järgnev käsk.
Sellisel viisil on võimalik koostada oma veatöötlust. Kui kuskil tekib
viga, siis initsialiseeritakse object Err. See objekt sisaldab infot
vea kohta (vea number, kirjeldus, vea põhjustanud rakendus ja abiinfo
saamise võimalused). Err-objektil on ka kaks meetodit:
* Clear sellega kustutatakse kõik Err-objekti atribuudid. VBScript
kutsub selle meetodi välja protseduuri lõppedes ja kui on antud
käsk vigu ignoreerida (On Error Resume Next).
* Raise sellega saab viga välja kutsuda (tekitada). Meetodile
antakse atribuutidena ette viga puudutav info.
Tuleb veel tähele panna, et vigade ignoreerimine ei kandu üle
väljakutsutud protseduuridesse, seega tuleb igas protseduuris see
eraldi defineerida.
4.1.6 Kommentaarid
Kommentaaride esitamiseks on VBScriptis kaks käsku: REM ja (ülakoma).
Kogu tekst, mis on kirjutatud nende lausete järele samal real,
loetakse kommentaariks ja jäetakse töötlemata. REM-lause erinevus
ülakomast on: kui ülakoma võib järgneda suvalisele VBScripti käsule,
siis REM-lause tuleb muudest käskudest samal real eraldada
käsueraldajaga :.
4.2 Stringitöötlus
Skriptide kirjutamisel on tähtis osa stringidel. Vahetevahel tuleb
stringe mõõta (pikkus), muuta, neist alamstringe võtta jne. ehk
teisisõnu stringe töödelda. Kõikide stringitöötlusfunktsioonide
atribuudiks on vajalik string (mõnel ka mitu) või string-tüüpi
muutuja.
4.2.1 Teisendamine
Stringide teisendamise alla kuuluvad üksikute sümbolite ja tervete
stringide teisendusfunktsioonid. Teisendamiseks kasutatakse järgnevaid
funktsioone:
* Asc(string) tagastab stringi esimesele sümbolile vastava koodi.
* Chr(kood) tagastab koodile vastava sümboli.
* LCase(string) tagastab stringi, milles on etteantud stringis
olevad suurtähed väiketähtedeks teisendatud.
* UCase(string) tagastab stringi, milles on etteantud stringis
olevad väiketähed suurtähtedeks teisendatud.
* Replace(string, mida, milleks, algus, mitu, võrdlus) asendab
etteantud stringis, alates positsioonist algus, kõik alamstringid
mida stringiga milleks. Seda tehakse mitu korda. Võrdlusega
määratakse stringide võrdlemise meetod. Algus, mitu ja võrdlus
võivad puududa.
* StrReverse(string) tagastab stringi, milles on etteantud stringi
sümbolid tagurpidi järjekorras (ehk pöörab stringi tagurpidi).
4.2.2 Alamstringid
Alamstringidega töö alla kuuluvad stringide lõhkumine (alamstringideks
jagamine) ja stringide ühendamine. Alamstringidega tööks on järgmised
funktsioonid:
* Left(string, pikkus) tagastab pikkus arvu sümboleid stringi
algusest; nt Left(Tere hommikust,4) tagastab Tere.
* Right(string, pikkus) tagastab pikkus arvu sümboleid stringi
lõpust.
* Mid(string, algus, pikkus) tagastab pikkus arvu sümboleid alates
stringi positsioonist algus.
Kui ülaltoodud funktsioonde puhul etteantud string on lühem, kui sealt
sümboleid nõutakse, tagastatakse kõik sümbolid etteantud stringi
lõpuni.
* Split(string, eraldaja, mitu, võrdlus) tagastab massiivi
stringidest, mis on saadud etteantud stringi jagamisel eraldaja
kohalt. Kui eraldajat pole antud, võetakse eraldajaks tühik ( ).
Kui on antud atribuut mitu, siis pannakse massiivi ainult esimesed
alamstringid (vastavalt, kui palju küsiti).
* Join(massiiv, eraldaja) ühendab massiivis olevad stringid üheks
stringiks ja paneb nende vahele eraldaja. Kui eraldaja puudub
võetakse selleks tühik ( ).
Stringide ühendamiseks on veel teine võimalus: nimelt võib kahe
stringi ühendamisel kasutada operaatorit & või operaatorit +.
Operaatori + kasutamisel tuleb ettevaatlik olla numbrite ja stringide
ühendamisel, sest operaatoriga + tähistatakse ka numbrite liitmist
(kuna see on tema primaarne tähendus, võib tekkida viga). Samas
kasutades operaatorit &, teisendatakse mõlemad konkatenatsiooni pooled
stringiks ja seega viga ei teki. Seda illustreerib järgnev näide:
Esimene = 46 defineerime stringi
Teine = 4 defineerime täisarvu
Tulemus1 = Esimene + Teine Tulemus1 saab väärtuseks 50
Tulemus2 = Esimene & Teine Tulemus2 saab väärtuseks 464
4.2.3 Võrdlemine
Stringide võrdlemise all mõeldakse ühe stringi teisest leidmist ja
kahe stringi omavahelist võrdlemist. Stringide võrdlemisel kasutatakse
järgmisi funktsioone:
* InStr(algus, string1, string2, võrdlus) tagastab esimese
positsiooni (alates positsioonist algus) stringis string1, kus
string2 sisaldub string1-s. Kui algust pole antud, siis
alustatakse esimesest positsioonist.
* InStrRev(string1, string2, algus, võrdlus) tagastab positsiooni,
kus string2 sisaldub string1-s. Siin alustatakse otsimist stringi
lõpust ja seega tagastatakse viimane positsioon, kus string2
string1-s sisaldub. Kui on antud parameeter algus, võetakse see
alguspositsiooniks (mitte stringi lõpp).
* StrComp(string1, string2, võrdlus) tagastab stringide võrdlemise
tulemuse.
4.2.4 Pikkus
Stringi pikkuse all mõeldakse stringis sisalduvate sümbolite arvu ja
seda saab teada funktsiooniga Len, mille süntaks on järgmine:
Len(string)