Az ASP .NET programozási nyelv

Az ASP nyelv VBScripttel

Bevezető

Miért kell kiemelni, hogy Visual Basic Scripttel használjuk az ASP-t?

Azért kell kiemelni, hogy "ASP a Visual Basic Scripttel", mert az ASP nem egy programozási nyelv, hanem egy HTML-be ágyazott programozási módszer (a Microsoft Internet Information Server, azaz IIS része), így muszáj egy nyelvet választani hozzá és ez a Visual Basic Script azaz az ASP anyanyelve, tekintve, hogy a példák döntő többségét VBScriptben fogalmazzák meg. Az ASP (egyszerűsített) elve a következő: egy asp (.NET-nél ez aspx) kiterjesztésű html fileban a <% %> közé írt (vagy bonyolultabb esetben: <%@ Language=VBScript %>) kódot lefordítja és futtatja egyben, azaz a ASP / VBScript (de bármely más nyelvvel is használva) egy interpretált nyelv (az ASP .NET lehetőséget ad többféle cache-elésre is, sőt arra is, hogy csak egyszer, az első futtatásnál fordulj le a kód). Erre már csak azért is szükség van, mert a szervert újra kéne indítani, ha fordított programot akarnánk használni, így az interpretáció itt a szükséges rossz.

Fontos megjegyezni, hogy megszakíthatjuk a kódunkat HTML tagekkel Pl.:

<% If int(Rnd()*10) >5 Then %>
A random függvény értéke nagyobb mint 5: <% = int(Rnd()*10)%>
<% Else %>
A random függvény értéke kisebb, mint 4: <% = int(Rnd()*10)%>
<% End if %>

Változók

Minden változó egy Variant típusba tartozik (lásd Visual Basic). Egyszerű deklaráció: Szintaxisa:

Dim valtozo_nev[(tömbindex)] [AS data_type] [= kifejezés]
Pl.:
Dim valtozo Dim darabszam AS integer = 25 Dim myarray (13) 'egy 14(!!!) hosszú tömböt hoz létre
Konstans deklaráció: Szintaxis:
Const Valtozo [AS data_type] = kif.
Pl.
Const SZERVERID = 65535

Rekord deklaráció (TYPE utasítással):

A felhasználó által definiált, egy vagy több elemet tartalmazó, rekord adattípus létrehozásához használt utasítás. Szintaxis:
TYPE változónév elemnév [(tömbindex)] AS data_type [elemnév [(tömbindex)] AS data_type] . . . END TYPE
Pl.:
TYPE Személy Név AS String Beosztás AS String END TYPE DIM Dolgozók(1 To 100) AS Személy

Objektum deklaráció (Set utasítással):

Objektum és annak tulajdonságainak változóhoz történő hozzárendelése. Ezt a változót nevezzük objektumváltozónak. Szintaxis:
SET objektumváltozó = {objektumkifejezés | Nothing} `Nothing az inicializátlan értéket jelöli
Pl.:
<%SET Conn = Server.CreateObject("ADODB.Connection")%>

Láthatóság, életciklus

Függvényekben, eljárások deklarált változók csak az alprogramon belül élnek és láthatóságuk is erre korlátozódik. A scriptben deklarált változók azonban az egész scripten belül láthatóak, elérhetőek, ezért (a scriptre nézve) globális a láthatóságuk. Az alprogramból kilépve a változók megsemmisülnek.

Tömbváltozók

A VBScriptben maximálisan 60 dimenziós tömböket hozhatunk létre. A tömbök indexelése 0-tól kezdődik. Pl.
Dim A(10)
Egy 11 elemű tömböt hoz létre (vö. 0-tól indexel a VBScript). Innentől a szokásos módon hivatkozhatunk a tömbelemekre:
A(3) = 15
Több változós tömböket a következőképpen hozhatunk létre:
Dim tömbnév(maxindex1, [maxindex2], ..., [maxindex60])
Pl.
Dim Koord(100, 100)
ReDim kulcsszóval dinamikus tömböket hozhatunk létre (de a Dimmel létrehozott tömbökön már nem változtathatunk). Ekkor megváltoztathatjuk a tömb maximális méretét, sőt van lehetőség arra is, hogy a Preserve kulcsszó segítségével megőrizzük az eddigi elemeinket. Pl.
ReDim A(20) ReDim Preserve A(25)

Option Explicit parancs

VBScriptben létrehozhatunk változót úgyis, hogy csak leírunk egy változó nevet. Elgépelésnél azonban ez veszélyes lehet (pl. cikluson belül a ciklus_valtozo helyett a kiclus_valtozot inkrementáljuk), így az Option Explicit paranccsal letilthatjuk a változók ilyetén deklarálását!

Megjegyzések:

Az újabb VBScriptekben már van konstansokat deklaráló utasítás, bár ez viszonylag az utóbbi időkig nem így volt, így régebbi példáknál találkozhat az ember csupa nagybetűvel írt változókkal.

Utolsó példában már hivatkoztunk egy Server nevű objektumra. Ez az objektum az ASP egy beépített objektuma, amire mindig hivatkozhatunk, globális láthatóságú. Ebből is látszik, hogy nem választhatjuk szét az ASP-t és a VBScriptet. Ugyanakkor más szkriptnyelvekkel is elérhetjük ezeket a beépített objektumokat.

Alprogramok

VBScriptben megkülönböztetünk mind eljárásokat, mind függvényeket. Utóbbi visszatérési értéke mindig egy Variant típus.

Eljárás/függvény meghívása:

Az eljárások meghívása kétféleképpen lehetséges:
proc_nev param1, param2, param3, ...
Nem kell zárójel! vagy:
call proc_nev(param1,param2, ...)
Ez utóbbi esetben viszont ki kell tenni a zárójelet. Lehet keverni a két szintaxist, de ekkor a függvény visszatérési értékét lenyeli az interpreter. Pl.:
Megnyit Call Megnyit() 'kötelező ilyenkor a zárójel használat! Sub Hello_World(text) MsgBox text End Sub Call Hello_world("Hello World")
Illetve:
Hello_world "Hello World!"

Eljárás:

Szintaxis:
SUB név [(paraméterek)] [utasítások] [EXIT SUB] [utasítások] END SUB
Pl.:
SUB Megnyit Set Conn = Server.CreateObject("ADODB.Connection") Conn.ConnectionString ="File Name=" & Server.MapPath("db.udl") & ";" Conn.Open END SUB

Függvény:

Szintaxis:
FUNCTION név [(paraméterek)] [AS típus] [utasítások] [név = kifejezés] [EXIT FUNCTION] [utasítások] [név = kifejezés] END FUNCTION
A név = kifejezés utasítással határozzuk meg a visszatérési értéket (return valami helyett). Pl.:
function GetDataConnection() dim oConn, strConn Set oConn = Server.CreateObject("ADODB.Connection") strConn = "Provider=SQLOLEDB; Data Source=adspm; Initial Catalog=TeamWeb; " strConn = strConn & "User Id=TeamWeb; Password=x" oConn.Open strConn set GetDataConnection = oConn end function

Vezérlési szerkezetek

Feltételes vezérlés átadás:

If..Then..Else..
Szintaxis:
If felt Then utasítások [Else elseutasítások ]
Ennél az egy-soros szintaxisnál az utasításoknak egy sorba kell kerülnie és el kell őket választani kettősponttal!! Pl.:
If A > 10 Then A = A + 1 : B = B + A : C = C + B
De lehet blokkformátumban is írni (ilyenkor nincs szükség kettőspontra)
If feltétel Then [utasítások] [ElseIf feltételek Then [elseifutasítások]] . . . [Else [elseutasítások]] End If
Az End If használata kötelező. A csellengő else problémáját úgyanúgy oldja meg, mint a Visual Basic (mindig az End If előtti részre vonatkozik).

Ciklusok:

For... Next ciklus
For számláló = start To end [Step lépésszám] [utasítások] [Exit For - kiléphetünk a ciklusból explicit is] [utasítások] Next 'vissza ugrik az elejére, és megváltoztatja a lépésszám alapján a számlálót
Pl.:
<% For I = 1 To 10 Step 1 %> A számláló értéke: <% = I %>
<% Next .... %>
For Each .. Next ciklus
A VBScript lehetőséget ad tömbökön és gyűjtemény típusokon való iterációra is.
For Each elem In csoport [utasítások] [Exit For] [utasítások] Next [elem]
Fontos megjegyezni, hogy a blokkot csak akkor lehet lefuttatni, ha legalább egy elem van a tömbben/gyujteményben. Pl.:
Function ShowFolderList(folderspec) Dim fso, f, f1, fc, s Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.GetFolder(folderspec) Set fc = f.Files For Each f1 in fc s = s & f1.name s = s & "
" Next ShowFolderList = s End Function
Do...Loop ciklus:
Elöl- és hátultesztelős változatban is van. A kettő szintaxisa:
Do [{While | Until} feltétel] [utasítások] [Exit Do] [utasítások] Loop
Hátultesztelős:
Do [utasítások] [Exit Do] [utasítások] Loop [{While | Until} feltétel]
Egymásba ágyazott esetben az eggyel feljebb levő szinten levő ciklusba tér vissza az Exit Do parancs hatására. Pl.:
Do Until DefResp = vbNo MyNum = Int (6 * Rnd + 1) ' Egy véletlen egészet generál 1 és 6 hat között. DefResp = MsgBox (MyNum & "Egy másik számot szeretne?", vbYesNo) Loop Dim Check, Counter Check = True: Counter = 0 ' inicializáljuk a változóinkat Do 'Külső ciklus. Do While Counter < 20 ' belső ciklus. Counter = Counter + 1 If Counter = 10 Then Check = False Exit Do ' Belső ciklusból kilépünk End If Loop Loop Until Check = False ' Exit outer loop immediately
While...Wend ciklus
Sokkal egyszerűbb, mint a Do..Loop - azaz nincs Exit utasításunk. A referenciakönyv a Do..Loop ciklusokat ajánlja, hiszen azok flexibilisebb megoldásokat kínálnak. Szintaxis:
While feltétel [utasítások] Wend
Pl.:
While Counter < 20 Counter = Counter + 1 Alert Counter 'ellenőrizzük a Counter értékét Wend ' End While loop when Counter > 19.
Megj.: Bármennyi While..Wendet egymásba ágyazhatunk, ekkor a Wend, mindig a legbelső ciklust zárja le.
A With utasítás
A With utasítás a kód rövidítésére használhatjuk, célja, hogy ha egy objektumon egymás után több utasítást végzünk el, akkor ne kelljen az objektum nevét többször leírni. Szintaxis:
With objektum utasítások End With
Pl.:
With Cimke .Height = 2000 .Width = 2000 .Caption = "Ez a címkém" End With

Objektum Orientált Programozás

Objektumokat a CreateObject paranccsal hozhatunk létre: A CreateObject létrehozza az objektumot és egy referenciát ad vissza. Szintaxis:

CreateObject(szervernév.típusnév [, hely])
Megj.: A szerver nevet kötelező megadni, de a hálózati szerver nevét (hely) már nem. Ez utóbbi DNS névvel vagy IP címmel is meg lehet adni. Pl.:
Dim ExcelSheet Set ExcelSheet = CreateObject("Excel.Sheet") Function GetVersion Dim XLApp Set XLApp = CreateObject("Excel.Application", "MyServer") GetVersion = XLApp.Version End Function
Végül az objektum változót a Set obj_valt = Nothing paranccsal ereszthetjük el.

Classok

Osztályokat a következő szintaxissal hozhatunk létre:
Class név Utasítások (legalább 1) End név
A Visual Basichez hasonlóan itt is írhatunk metódusokat, tulajdonokat (property), amiket a Property Get, Property Set és a Property Let parancsokon (amiket nekünk kell implementálnunk) érhetjük el. Ezeket deklarálva kódot rendelhetünk olyan eseményekhez, mint tulajdonhoz új objektum létrehozása (Property Set), a tulajdon értéket kap (Property Let) és a tulajdon olvasása (Property Get). A tulajdonok és metódusok láthatósága a két klasszikus láthatóság a Public és a Private (Classon belül a Dimet helyettesítik). Amennyiben nem deklaráljuk egy változó/alprogram láthatóságát az defaultból Public lesz. A VBScriptben nincs klasszikus értelemben vett öröklődés. Azonban a beépített objektum által legyártott saját objektumaink örökölnek egy csomó tulajdonságot. Példányosítani egyedül a következő szintaxissal lehet:
Dim objValtozoNev Set objValtozoNev = new classnév

Hibakezelés

A Visual Basic kivételkezelési lehetőségei közül csak nagyon keveset implementáltak, a VBScriptben. Gyakorlatilag csak az On Error Resume Next parancsot. Ennek a szintaxisa:

On Error Resume Next utasítások
Ekkor hiba esetén az első utasításnál folytatja a kód végrehajtását az interpreter (erre utal a Resume Next). A hibákat a VBScriptben (nem ASP-féle COM objektum) beépített Err objektumon keresztül tudjuk kezelni. Az Err objektum globális láthatóságú a kivétel kiváltásának a teljes szintaxis pedig a következő:
Err.Raise id[, forrás, leírás, helpfile, helpcontext]
Ahol az id egy integer 0..65535 között (pl. 6 az overflow error), a forrás egy string (melyik utasítás váltotta ki), a hiba leírása (string), a helpfile helye és a helpfilenak küldött üzenet (általában az azonosítás miatt küldött id). A kivételkezelést az On Error GoTo 0 paranccsal lehet kikapcsolni. Példa:
On Error Resume Next Err.Raise 6 ' overflow errort váltunk ki MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description Err.Clear ' a beépített Err objektum flagjeit törölhetjük ezzel a paranncsal
Mivel az ASP-ben egy script futhat a szerveren avagy a felhasználónál
SCRIPT RUNAT="server" tag HTML-ben
ennél komplexebb esetek is előfordulhatnak. A kliensnél a hibát a használt nyelvtől független window objektum segítségével window.onerror segítségével kezelhetjük. HTML taghez rendelt hibakezelésre egy példa:
STYLE onerror="object.Error()"

Beépített Objektumok

Az ASP-ben hozzáférhetünk globális láthatóságú beépített objektumhoz (az esetek 90%-ában ezeket használják, mint pl. a Response objektum kiíratásra). Ezeket COM (azaz Component Object Modelling) objektumoknak hívja a referencia. Ezeket nem szabad összetéveszteni a VBScript saját beépített objektumaival, mint pl. az Err objektum. "Ha a tranzakciós műveletekhez használt ObjectContext objektumot nem számítjuk, az objektummodell hat (Windows NT 4.0-n öt) objektumból áll. A Windows 2000-ben megjelent új objektum az ASPError, ami egy bekövetkezett hiba leírását tartalmazza, az .asp-be ágyazott, saját hibakezelést segíti. A Server objektum magát az IIS-t képviseli, néhány kiszolgálószintű beállítással és szolgáltatással. Az Application objektum egy webalkalmazást jelképez. A webalkalmazás különálló egység, általában egy könyvtárban és annak alkönyvtáraiban található .asp kódok összessége, közös objektumokkal és beállításokkal. A Session objektum egy ügyfél és a kiszolgáló között "fennálló" kapcsolatot, munkamenetet jelképez. A "fennálló" kapcsolatot azért írtuk így, mert valójában nem egy kapcsolatról van szó. Az IIS (a háttérben cookie-k segítségével) azonosítja a felhasználót és a böngészőt, így az a böngésző bezárásáig saját munkamenetébe térhet vissza. A Request objektum egy HTTP kérést jelképez, segítségével kódból hozzáférhetünk a kérés minden eleméhez, legyen az HTTP fejléc értéke, a böngészőben tárolt cookie, vagy kérdőív tartama. A Response objektum pedig értelemszeruen a kérdésre küldendő választ jelképezi. Természetesen a Response objektum segítségével sem csak a válasz tartalmát, hanem a HTTP protokoll fejrészét is kezelhetjük. Egy IIS kiszolgálón belül Server és ASPError objektumból egy-egy létezik (utóbbi csak akkor érhető el, ha hiba történt). Application objektum minden webalkalmazás egyedi, globális objektuma, Session objektum minden munkamenethez (ügyfélhez) egy jön létre, egyidejuleg tehát több is létezhet. Request és Response objektum pedig mindig az adott kérésre és válaszra vonatkozik, újabb kérés esetén új példány jön létre belőlük is."

Irodalom

[1] MSDN Library - ASP és VBScript anyagok [2] http://www.archiweb.hu/aspseged/tankonyv/page2.htm [3] ...egyéb feljegyezetlen internetes segédanyagok