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)