V předchozím díle jsem popsal základní funkci počítadla - udržovat informaci o počtu zobrazení určité webové stránky.
Dnes po počítadlu budeme chtít, aby při jednom připojení evidovalo návštěvníka pouze jednou, i když ji navštívil několikrát. Jak to ale udělat?
Určitě si říkáte, že nejlehčí by to bylo, kdybychom mohli návštěvníka nějak identifikovat. V tom však tkví základní problém. Webový server totiž neví, kdo jste, ani když posíláte požadavek po druhé - tato informace se s HTTP hlavičkou neposílá.
Active Server Pages tento problém řeší pomocí objektu Session. Objekt Session vytvoří návštěvníkovi cookie, které jej jednoznačně identifikuje.
Pokud tedy budete chtít na svém webu udržovat informace o návštěvníku (jméno,...), použijte objekt Session. Informace v něm uložené jsou dostupné jen jednomu uživateli, jen v aplikaci, ve které byly vytvořeny, a jen při jednom připojení. Aplikace se v ASP chápe jako souhrn všech souborů v jednom virtuálním adresáři a jeho podadresářích. Nedoporučuje se do objektu Session ukládat mnoho informací, protože tak zbytečně zatěžujete server.
Objekt Session se vytvoří prvním uložením nějaké informace. Po uplynutí 20 minut, kdy návštěvník s aplikací nekomunikuje (což je základní nastavení, které lze samozřejmě měnit), se objekt zruší.
A nyní již přejdeme k tvorbě samotného kódu. Počítadlo zatím vypadá takto:
Set fso = Server.CreateObject("Scripting.FileSystemObject")
cesta = Server.MapPath("\pocitadlo.txt")
If fso.FileExists(cesta) Then
Set soubor = fso.OpenTextFile(cesta, 1)
cislo = Clng(soubor.ReadLine)
cislo = cislo + 1
soubor.Close
Set soubor = fso.OpenTextFile(cesta, 2)
soubor.WriteLine(cislo)
soubor.Close
Response.Write cislo
Else
Set soubor = fso.OpenTextFile(cesta, 2, true)
soubor.WriteLine("1")
response.write "1"
soubor.close
End If
set fso = Nothing
|
Při prvním zobrazení stránky návštěvníkem se o shlédnutí uloží do objektu Session informace; při jeho další návštěvě se stav počítadla již nemění. Použijeme přitom příkaz If:
Set fso = Server.CreateObject("Scripting.FileSystemObject")
cesta = Server.MapPath("\pocitadlo.txt")
If fso.FileExists(cesta) Then
Set soubor = fso.OpenTextFile(cesta, 1)
cislo = Clng(soubor.ReadLine)
soubor.Close
If Session("pocitadlo") = "" Then
Session("pocitadlo") = "1"
cislo = cislo + 1
Set soubor = fso.OpenTextFile(cesta, 2)
soubor.WriteLine(cislo)
soubor.Close
End If
Response.Write cislo
Else
Session("pocitadlo") = "1"
Set soubor = fso.OpenTextFile(cesta, 2, true)
soubor.WriteLine("1")
response.write "1"
soubor.close
End If
set fso = Nothing
|
Návštěvník přicházející na stránku poprvé má proměnnou pocitadlo prázdnou, takže se vykoná kód následující po podmínce If. Při další návštěvě během téhož připojení již nevyhovuje podmínce If, a proto se nic nepřičítá.
Mohlo by se zdát, že máme již celý kód aplikace hotový, ale není tomu tak. Při každé nové návštěvě otevíráme soubor a zapisujeme do něj. Tak ale zbytečně zatěžujeme server. Efektivnější by bylo ukládat informaci do souboru vždy po pěti návštěvách. Při tomto řešení by se soubor otevíral pětkrát méně než dříve a serveru bychom ulehčili. Zásadní problém ale je, jak uchovávat průběžnou hodnotu v rámci celé aplikace?
Od toho je v Active Server Pages objekt Application. Ten uchovává informace dostupné všem návštěvníkům v jedné aplikaci.
Problém však nastává při výpadku serveru, kdy se všechny informace v něm uložené ztratí. My však po pěti návštěvách tyto hodnoty ukládáme do souboru, takže je máme v případě těchto nehod archivované.
Kód tedy trochu pozměníme s použitím objektu Application:
Set fso = Server.CreateObject("Scripting.FileSystemObject")
cesta = Server.MapPath("\pocitadlo.txt")
If fso.FileExists(cesta) Then
Set soubor = fso.OpenTextFile(cesta, 1)
cislo = Clng(soubor.ReadLine)
soubor.Close
If Session("pocitadlo") = "" Then
Session("pocitadlo") = "1"
Application.Lock
Application("navstevniku") = Application("navstevniku") + 1
Application("ulozit") = Application("ulozit") +1
Application.Unlock
If Application("ulozit") = 5 Then
Set soubor = fso.OpenTextFile(cesta, 2)
soubor.WriteLine(Application("navstevniku"))
soubor.Close
Application("ulozit") = 0
End If
End If
Response.Write Application("navstevniku")
Else
Session("pocitadlo") = "1"
Application("navstevniku") = 1
Application("ulozit") = 1
Set soubor = fso.OpenTextFile(cesta, 2, true)
soubor.WriteLine("1")
response.write "1"
soubor.close
End If
set fso = Nothing
|
Jak vidíte, objekt Application se používá podobně jako objekt Session. Jen při ukládání informací je lepší použít příkazy Application.Lock a Application.Unlock. Ty zabrání tomu, aby dva uživatelé měnili hodnoty globální proměnné (proměnné na úrovni aplikace) najednou, což by pochopitelně zapříčinilo chybu. V kódu máme globální proměnnou ulozit, kterou počítáme, kolik návštěv bylo uskutečněno od posledního uložení. Když se rovná pěti, průběžný součet všech shlédnutí (proměnná nastevniku) se uloží do souboru a proměnná ulozit se nastaví na nulu.
Nyní máme doopravdy již celý kód počítadla hotový. V příštím díle vás seznámím se souborem Global.asa a vytvoříme aplikaci na počítání aktivních uživatelů.
Liška Adam
|