| Adatküldés a HTTP
                          protokoll segítségévelA
                          dinamizmus, az interaktivitás egyik mozgatórugója
                          természetesen az, ha menet közben adatokat kapunk az
                          ügyfél oldaláról. Ezeket az adatokat a Request
                          objektum segítségével érhetjük el.
 Adatok átadása az
                          URL-ben (QueryString)A klasszikus
                          adatbeviteli módszer, amikor az adatokat a kérés
                          URL-jéhez csatoljuk, ilymódon:
 http://localhost/qs.asp?input1=val1&input2=val2 Ekkor ilyen HTTP kérés
                          indul a kiszolgáló felé: GET
                          /request.asp?input1=value1&input2=value2&submit=Submit
                          HTTP/1.1 Ennek a
                          módszernek több hátránya is van: egyrészt, a
                          bemenő adatok növelik az URL hosszát, a kiszolgálónak
                          elküldhető URL-ek mérete pedig biztonsági okokból
                          általában korlátozva van. (Próbáljunk meg az
                          IIS-nek elküldeni egy többszáz bájt hosszú címet!
                          – A válasz szabványos HTTP hibaüzenet: “404 –
                          Request – URI too long"). Másrészt
                          nemcsak kényelmetlen, de nem is igazán biztonságos,
                          hogy az átadott adatok (amelyeket esetleg nem is
                          mi írtunk be, hanem mondjuk egy kérdőív rejtett részei
                          voltak) megjelennek a böngésző címsorában. Az
                          átadott adatmezők név=adat formájúak (ld.
                          fent: input1=val1), az egyes adatmezőket &
                          jel választja el egymástól, az egészet pedig kérdőjel
                          a fájlnévtől. Egy adott mező értékét a Request.QueryString(“mezőnév“)
                          függvény adja vissza. Ha az adatok között
                          ilyen mező nem szerepel, a visszaadott érték
                          (““). Lássunk egy példát: <%If Len(
                          Request.QueryString("nev") ) Then
 Response.Write(
                          "Szia " &
                          Request.QueryString("nev")
                          & "!" )
 End If
 %>
 Ha nevünket
                          megadjuk az URL-ben (pl. request.asp?nev=kati),
                          akkor az oldal köszönt minket. Egy mező “meglétét“
                          a legegyszerűbben úgy ellenőrizhetjük, ha lekérdezzük
                          a hosszát (ezt teszi a Len() függvény a példában).
                          Ha ez nem 0, lehet dolgozni. Egy mezőnek azonban nem
                          csak egy értéke lehet, a HTTP kérésben egy mezőnév
                          egynél többször is szerepelhet: http://localhost/qs2.asp?nev=Piroska&nev=Farkas Ezt az alábbi módon
                          lehet feldolgozni: <%Response.Write("Nevek
                          száma: " &
                          Request.QueryString("nev").Count
                          & "<br>")
 For i=1 To
                          Request.QueryString("nev").Count
 Response.Write(
                          i & ": " &
                          Request.QueryString("nev")(i)
                          & "<br>")
 Next
 %>
 A Request.QueryString(“mezőnév“).Count
                          érték visszaadja az adott nevű mezők számát.
                          Ha a sok közül egy konkrét értékre vagyunk kíváncsiak,
                          akkor átadhatjuk az indexet is (a számozás 1-től
                          kezdődik). Maradjunk a fenti példánál, a
                          Farkas-ra így hivatkozhatunk: Request.QueryString("nev")(2) Ha egy
                          mezőnek több értéke van, és mi mégis közvetlenül
                          kérdezzük le (pl. Request.QueryString(“nev")),
                          akkor az értékek vesszővel elválasztott listáját
                          kapjuk válaszként: “Piroska, Farkas“. Ha pedig
                          egyszerűen csak Request.QueryString-re
                          hivatkozunk, akkor visszakapjuk a teljes kérdést: “nev=Piroska&nev=Farkas“. Ez volt
                          tehát az URL-be ágyazott lekérdezés feldolgozása.
                          Fontos azonban még megemlíteni, hogy az URL-ek formátuma
                          kötött, és mivel a lekérdezés (és főleg az
                          átadott adatok) ilyenkor az URL részét képezik,
                          ezeknek az adatoknak is meg kell felelniük bizonyos
                          szabályoknak: például, minden írásjel, illetve ékezetes
                          karakter, csakis kódolt formában (pl. egyenlőségjel:
                          %3D) szerepelhet az URL-ben. Ez a kódolás
                          pedig sokszor körülményes és kényelmetlen. 
                            
                              | Adatfeltöltés
                                a  POST HTTP paranccsal | 
 |  Szerencsére
                    a HTTP protokoll tartalmaz egy, a fentinél fejlettebb
                    megoldást is. A POST parancs használata esetén a feltöltendő
                    adatok a HTTP üzenet törzsrészébe kerülnek. Az adatok kódolását
                    persze így sem ússzuk meg, de az esetek többségében ezt
                    a munkát nem mi, hanem a böngésző végzi. Kérdőív (Form)
                    kitöltése esetén például, ha a FORM elem method
                    attribútumát postra állítottuk, a következő kérés
                    indul a kiszolgáló felé: POST /request.asp
                    HTTP/1.1Content-Type:
                    application/x-www-form-urlencoded
 Content-Length: 41
 Connection: Keep-Alive
 input1=value1&input2=value2&submit=Submit
 Láthatjuk, hogy a kiszolgálónak
                    szánt adatok nem a POST parancs paraméterében, hanem a
                    HTTP üzenet törzsrészében utaznak. Érdemes megfigyelni
                    a törzs kódolására vonatkozó Content-Type HTTP fejléc
                    értékét is. A HTML kérdőív
                    elemének (FORM) method attribútuma határozza meg
                    az adatok küldésének módját. Ha method attribútum értéke
                    “get“, a kérdőív tartalmát az URLbe ágyazva,
                    ha viszont az attribútum értéke “post“, akkor
                    HTTP kérés törzsében küldi el a böngésző a kiszolgálónak.
                    Lehetőség szerint használjuk tehát a post módot! A kérdőív
                    egyes mezőinek értékét a Request.Form kollekció
                    tartalmazza. Az előző példához hasonlóan minden mező
                    értékét lekérdezhetjük, ha a mezőnek több értéke
                    van, akkor itt is használhatjuk a .Count jellemzőt
                    és az indexeket is, pl.: Request.Form("nev")Request.Form("nev").Count
 Request.Form("nev")(5)
 A kérdőív
                    feldolgozása esetén a Submit nyomógomb értéke (felirata)
                    is eljut a kiszolgálóhoz, de ha több ilyen van, akkor
                    csak annak az egynek, amelyikre kattintottunk. Így
                    megtehetjük azt, hogy ha egy kérdőívbe két Submit
                    nyomógombot teszünk: <INPUT
                    type="submit" name="submit" value="elso"><INPUT type="submit" name="submit"
                    value="masodik">
 A feldolgozás során könnyen
                    megállapítható, melyik Submit gomb lett megnyomva: <%If
                    Request.Form("submit") = "elso" Then
 ’ Első
 Else
 ’ Második
 End If
 %>
 A For
                    Each utasítás segítségével (a többi kollekcióhoz
                    hasonlóan) a .Form kollekció elemeit is kilistázhatjuk: <%For Each mezo In
                    Request.Form
 ‘ a mezo-be a mezonev kerul
 Response.Write(
                    "<b>" & mezo & " = </b>"
                    & Request.Form(mezo)
                    & "<br>" )
 Next
 %>
 A Response objektum
                          egy HTTP kérésre adott válasz. A Response objektum
                          legegyszerűbb (és leggyakoribb) alkalmazását
                          már láthattuk korábban: a Response.Write() metódus
                          segítségével állítottuk elő az oldal tartalmát.
                          A Write() használata egyszerű: minden, amit
                          paraméterként átadunk neki, bekerül a válaszként
                          visszaküldött adatcsomagba. A Write() metódusról
                          egyetlen dolgot kell tudni: a kiírt szöveg nem
                          tartalmazhatja a %> jelsorozatot, helyette
                          ezt kell írni: %\> Az ezt tartalmazó szöveget
                          IIS automatikusan visszaalakítja majd az eredeti formára. Az .asp oldal előállítása
                          természetesen több lépésben történik, az
                          oldalban található scripttől függően előfordulhat
                          az is, hogy az oldal tartalmának egy része csak
                          bizonyos várakozási idő után áll rendelkezésre.
                          Ilyenkor dönthetünk, hogy a már kész tartalmat elküldjük-e
                          az ügyfélnek, majd várunk a folytatásra, vagy kivárjuk,
                          amíg a teljes oldal elkészül, és csak a munka legvégén
                          küldjük a komplett választ. Ez utóbbi esetben a
                          “kimenet“ egy pufferbe kerül. A pufferelés az
                          IIS5-ben alapértelmezésben működik, míg az
                          IIS4-ben alapértelmezésben ki van kapcsolva.A Response objektum segítségével mi magunk is
                          kezelhetjük a puffert: mindenekelőtt, a Response.Buffer
                          property-nek False értéket adva
                          letilthatjuk, True segítségével pedig engedélyezhetjük
                          a puffer használatát. A Clear() metódus kiüríti
                          a puffert (A “külső“ HTML kód is a pufferbe
                          kerül, törléskor az is elveszik!), a Flush()
                          pedig elküldi azt, ami addig a pufferbe került, majd
                          csak azután törli a tartalmát. Az oldal feldolgozását
                          bármikor megszakíthatjuk a Response.End() meghívásával.
                          Ha az oldal végrehajtása befejeződik, természetesen
                          a puffer teljes tartalma az ügyfélhez kerül.
 A cookie kis adatcsomag, amit a
              kiszolgáló kérésére a böngésző az ügyfél számítógépén
              tárol, és szükség esetén visszaküldi azt. Alapjában véve két
              különböző típusú cookie létezik: az első típus csak addig
              “él“, amíg a böngészővel egy kiszolgálónál tartózkodunk.
              A böngésző bezárásával az ilyen cookie tartalma elveszik.
              Ezeket a cookie-kat elsősorban átmeneti célra használjuk (például
              az ASP Session fenntartására). A másik fajta, felhasználói
              szemmel gyakrabban megfigyelt cookie annyiban különbözik az előzőtől,
              hogy a böngésző bezárásakor nem veszik el, hanem a számítógép
              lemezére kerül. Az ilyen cookie-knak érvényességi idejük
              van. Amíg ez az érvényességi idő le nem jár, addig a böngésző
              megőrzi az értéküket, és tartalmukat minden egyes látogatáskor
              visszaküldi a kiszolgálónak. A két cookie-fajtát csak a lejárati
              idő különbözteti meg egymástól. Lássuk tehát, hogyan küldhetünk
              egyszerű, átmeneti célra használható cookie-t a böngészőnek: <%Response.Cookies("nev")
                    = "ertek"
 %>
 Ha a felhasználó
                          legközelebb felénk jár, ezt az adatot így
                          olvashatjuk ki: <%s = Request.Cookies("nev")
 %>
 Egy cookie nem csak
                          egy szöveget tartalmazhat, hanem
                          többet is, egyfajta táblázatot,
                          almezőket: <%Response.Cookies("nev")("mezo1")
                    = "ertek1"
 Response.Cookies("nev")("mezo2") =
                    "ertek2"
 %>
 A .HasKeys metódus
                          segítségével eldönthetjük, hogy egy cookie
                          egyszerű szöveg, vagy almezők gyűjteménye, és
                          ettől függően kezelhetjük is: <%If
                          Request.Cookies("nev").HasKeys Then
 For Each mezo In Request.Cookies("nev")
 Response.Write(
                          Request.Cookies("nev")(mezo))
 Next
 Else
 Response.Write(
                          Request.Cookies("nev") )
 End If
 %>
 A .HasKeys elérhető
                          a Response objektumon keresztül is. Erre azért van
                          szükség, mert ha egy szöveges típusú cookieban
                          almezőket hozunk létre, elveszik a szöveges érték
                          – és fordítva, ha almezőkkel rendelkező
                          cookie-nak szöveges értéket adnánk, elvesznének
                          az almezők és azok értékei. A cookie érvényességét
                          a Response objektum segítségével korlátozhatjuk időben
                          és “térben“: <%Response.Cookies("nev").Expires
                    = "01-Jan-2003"
 Response.Cookies("nev").Domain =
                    "www.domain.net"
 Response.Cookies("nev").Path
                    = "/dir1/dir2"
 %>
 Az .Expires jellemző
                          értéke határozza meg, hogy az cookie meddig marad
                          életben. Ha nem adjuk meg, a böngésző lezárásakor
                          elveszik.az utóbbit fogjuk viszontlátni.A .Domain jellemző segítségével beállíthatjuk,
                          hogy a böngésző milyen domainek elérése esetén küldje
                          vissza a cookie-t.
 A .Path pedig kiszolgálón belüli részletezést
                          jelent: ha két azonos nevű cookie létezik,
                          ugyanarra a domain-re, akkor annak az értékét
                          fogjuk visszakapni, ahol a .Path értéke közelebb
                          van a valósághoz. Ha tehát az oldal a /dir1/dir2 könyvtárak
                          mélyén található, a két cookie .Path értéke
                          pedig a /dir1 és a /dir1/dir2, akkor
 Ha azt szeretnénk, hogy egy cookie az adott pillanattól
                          számított egy évig legyen érvényes, használjuk a
                          DateAdd() és a Now függvényt:
 <%Response.Cookies("egyevigjo").Expires
                    = DateAdd(
                    "yyyy", 1, Now)
 %>
     |