3. Wysy│anie i odbieranie danych od u┐ytkownika.

3.1 Wysy│anie danych do u┐ytkownika

W tej czΩ╢ci zostanie pokazane jak po│▒czyµ VBScript z HTML oraz jak umie╢ciµ rezultat wykonania kodu VBScript w dokumencie HTML wys│anym do przegl▒darki (klienta). Pos│u┐Ω siΩ przyk│adem, kt≤ry informuje o godzinie na serwerze oraz o ilo╢ci godzin w stosunku do dnia 01-01-2000. Przyk│ad zawiera funkcje operuj▒ce na dacie i czasie.

Przyk│ad.

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
<% @LANGUAGE = VBScript %>
<%
Option Explicit
Response.Expires = 0
Dim czasTeraz, czasZaGodzine, czasRoznica
czasTeraz = Time
czasZaGodzine = DateAdd("h", 1, czasTeraz)
czasRoznica = ("h", Now, #1/1/2000#)

%>
<HTML>
<BODY>
Witaj U┐ytkowniku.<BR>
Godzina na serverze: <% =czasTeraz %>.<BR>
Za godzinΩ czas na serwerze bΩdzie: <% =czasZaGodzine %>.<BR>
<%
If czasRoznica > 0 Then
17:
18:
Response.Write "Jeszcze " & czasRoznica & " godzin "
Response.Write "do roku 2000.<BR>" & VbCrLf
19: ElseIf czasRoznica < 0 Then
20:
21:
Response.Write "Ju┐ " & Abs(czasRoznica) & " godzin minΩ│o od "
Response.Write "rozpoczΩcia roku 2000.<BR>" & VbCrLf
22: Else
23:
24:
Response.Write "Rok 2000 siΩ w│a╢nie rozpocz▒│.<BR>" & VbCrLf
Response.Write "<B>SZCZʦLIWEGO NOWEGO ROKU !</B><BR>" & VbCrLf
25:
26:
27:
28:
End If
%>
</BODY>
</HTML>

Kiedy zostanie otwarty ten plik w przegl▒darce, na stronie pojawi siΩ napis podobny do poni┐szego.

Witaj U┐ytkowniku.
Godzina na serverze: 10:17:34 AM.
Za godzinΩ czas na serwerze bΩdzie: 11:17:34 AM.
Ju┐ 8754 godzin minΩ│o od rozpoczΩcia roku 2000.

Je╢li podejrzy siΩ ╝r≤d│o, zostanie wy╢wietlony nastΩpuj▒cy kod:

<HTML>
<BODY>
Witaj U┐ytkowniku.<BR>
Godzina na serverze: 10:17:34 AM.<BR>
Za godzinΩ czas na serwerze bΩdzie: 11:17:34 AM.<BR>
Ju┐ 8754 godzin minΩ│o od rozpoczΩcia roku 2000.<BR>
</BODY>
</HTML>

Teraz zostan▒ opisane poszczeg≤lne linie kodu. Pierwsza z nich to:

<% @LANGUAGE = VBScript %>

Dyrektywa @LANGUAGE zosta│a u┐yta w celu okre╢lenia jΩzyka skryptu dla pliku ASP. Ta komenda musi znajdowaµ siΩ w pierwszej linii przed jakimikolwiek innymi blokami kodu. Dyrektywa @LANGUAGE informuje IIS o u┐ytym jΩzyku w skrypcie. Jej u┐ycie nie jest konieczne, lecz zalecane, gdy┐ w razie zmiany w ustawieniach IIS dotycz▒cych u┐ytego jΩzyka w plikach *.asp, np. z VBScript na JScript, wszystkie pliki kt≤re bΩd▒ zawiera│y komendy VBScript, a nie bΩd▒ posiada│y tej dytrektywy zwr≤c▒ b│Ωdy w sk│adni.

Poni┐ej przedstawiona komenda VBScript nakazuje deklaracjΩ ka┐dej u┐ytej zmiennej z skrypcie, u┐ywaj▒c instrukcji Dim, Private, Public oraz ReDim.

Option Explicit

Komenda powinna siΩ znajdowaµ tu┐ po linii zawieraj▒cej dyrektywΩ @LANGUAGE. Po jej wpisaniu nale┐y deklarowaµ wszystkie zmienne przed ich u┐yciem. Takie rozwi▒zanie jest bardzo pomocne, gdy w skrypcie u┐yje siΩ b│Ωdnie wpisanej zmiennej poniewa┐ w wyniku otrzyma siΩ b│▒d w postaci: Variable undefined, w momencie wywo│ania go spod przegl▒darki. W takim przypadku bΩdzie wiadomo, ┐e jaka╢ nazwa zmiennej zosta│a wpisana niepoprawnie. ZaoszczΩdzi to wielu godzin szukania b│Ωdu. Je╢li siΩ stwierdzi, ┐e skrypt dzia│a poprawnie mo┐na t▒ liniΩ usun▒µ, lecz w trakcie tworzenia i modyfikowania skryptu jest ona niemal nieodzowna. Na przyk│ad je╢li w programie u┐yta zostanie zmienna nazwa i w jakim╢ miejscu, przez zupe│ny przypadek, wpisana zostanie zamiast nazwa np. nawza, wtedy przy braku tej komendy program potraktuje zmienn▒ nawza jako now▒ zmienn▒, sformatuje j▒, czyli ustali jej warto╢µ na 0 lub ci▒g o zerowej d│ugo╢ci, a na stronie nie pojawi siΩ zamierzona informacja przechowywana w zmiennej nazwa.

W czwartej linii znajduje siΩ komenda

Response.Expires = 0

Informuje ona przegl▒darkΩ po jakim czasie zawarto╢µ strony traci wa┐no╢µ. Warto╢µ okre╢lana jest w minutach. W naszym przypadku wynosi ona zero. Je╢li jest potrzeba okre╢lenia daty up│ywu wa┐no╢ci nale┐a│oby wpisaµ na przyk│ad nastΩpuj▒c▒ komendΩ:

Response.ExpiresAbsolute = #January 1, 2000 00:00:00#

W przypadku obu komend musz▒ one znale╝µ siΩ przed ca│▒ zawarto╢ci▒ dokumentu formatu HTML oraz komendami Response.Write (chyba, ┐e u┐yto komendy Response.Buffer = TRUE, ale o tym za chwilΩ). W przeciwnym wypadku przegl▒darka poka┐e b│▒d w postaci: Response object error (Header error). B│▒d jest zwi▒zany z tym, i┐ komenda Response.Expires zosta│a wys│ana do przegl▒darki po wcze╢niejszym przes│aniu nag│≤wka HTTP.

Instrukcja

Dim czasTeraz, czasZaGodzine, czasRoznica

deklaruje u┐yte w skrypcie zmienne. S▒ one od siebie oddzielone przecinkiem. Kolenjne linie:

czasTeraz = Time
czasZaGodzine = DateAdd("h", 1, czasTeraz)
czasRoznica = ("h", Now, #1/1/2000#)

okre╢laj▒ warto╢ci zadeklarowanych zmiennych. Pierwsza linia ustala warto╢µ zmiennej czasTeraz na warto╢µ aktualnej godziny serwera, druga ustawia warto╢µ zmiennej czasZaGodzine na warto╢µ zmiennej czasTeraz zwiΩkszonej o jedn▒ godzinΩ, za╢ trzecia linia zapisuje do zmiennej czasRoznica warto╢µ r≤wn▒ r≤┐nicy czasu aktualnego i daty 1/1/2000 okre╢lon▒ w godzinach. Je╢li bie┐▒cy czas jest przed dat▒ 1/1/2000 to warto╢µ czasRoznica jest dodatnia, za╢ je╢li jest po tej dacie - zmienna przyjmuje warto╢µ ujemn▒.
Zmienne maj▒ ju┐ okre╢lone warto╢ci, teraz nale┐a│oby je pokazaµ u┐ytkownikowi w oknie przegl▒darki. Do tego s│u┐y instrukcja

<% Respone.Write(tekst) %>

lub inna r≤wnowa┐na, u┐yta w przyk│adzie

<% =tekst %>

Linia 9, tj. %>, zamyka blok kodu VBScriptu.

Linie 10-14 zawieraj▒ kod HTML z warto╢ciami zmiennych czasTeraz, czasZaGodzine oraz czasRoznica. W liniach 16-25 zosta│a u┐yta instrukcja warunkowa If. Instrukcja Response.Write wysy│a do przegl▒darki tekst. Mo┐e on zawieraµ zmienne i │a±cuchy. ú▒czenie tekstu ze zmiennymi odbywa siΩ za pomoc▒ znaku &. Je╢li chcemy wys│aµ sygna│ przej╢cia do nastΩpnej linii nale┐y do│▒czyµ sta│▒ VbCrLf, np.

Response.Write "Warto╢µ=" & wartosc & ".<BR>" & VbCrLf

Buforowanie

Bufor jest magazynem, kt≤ry przechowuje dane przez pewien czas. U┐ycie buforowania pozwala na umieszczenie komendy Response.Expires za kodem HTML lub instrukcj▒ Response.Write. Przyk│ad przedstawiaj▒cy buforowanie:

<% @LANGUAGE = VBScript %>
<%
Option Explicit
Response.Buffer = TRUE
Response.Expires = 60

%>
<HTML>
<BODY>
Witaj U┐ytkowniku.<BR>
Teraz widzisz wiadomo╢µ 1.
<%
Response.Clear
Response.Expires = 0

%>
<HTML>
<BODY>
To jest szybkowygasaj▒ca wiadomo╢µ.
<%
Response.Flush
%>
</BODY>
</HTML>
<%
Response.End
%>
Ta linia nigdy nie zostanie wys│ana do przegl▒darki.

Kiedy zostanie uruchomiony powy┐szy kod na ekranie przegl▒darki pojawi siΩ napis:

To jest szybkowygasaj▒ca wiadomo╢µ.

Dodatkowo przegl▒darka zostanie poinformowana, ┐e zawarto╢µ strony straci natychmiast wa┐no╢µ.
Linia zawieraj▒ca:

Response.Buffer = TRUE

sygnalizuje, ┐e strona bΩdzie buforowana na serwerze i nie zostanie wys│ana odpowied╝ do przegl▒darki klienta dop≤ki wszystkie instrukcje z bie┐▒cej strony ASP nie zostan▒ przes│ane lub dop≤ki nie zostan▒ wywo│ane metody Flash lub End obiektu Response. Komenda Response.Buffer musi znajdowaµ siΩ przed kodem HTML lub instrukcj▒ Response.Write.

Linia zawieraj▒ca:

Response.Expires = 60

okre╢la czas utraty wa┐no╢ci strony po 60 minutach. Takie rozwi▒zanie jest u┐yteczne w przypadku, gdy zawarto╢µ strony jest zmieniana co maksymalnie dwie godziny.

Linie zawieraj▒ce:

<HTML>
<BODY>
Witaj U┐ytkowniku.<BR>
Teraz widzisz wiadomo╢µ 1.

s▒ przechowywane w buforze (Respnse.Buffer = TRUE), ale nie zostan▒ nigdy wys│ane do przegl▒darki, poniewa┐ bufor jest czyszczony komend▒:

Response.Clear

Tak┐e w kolejnej linii, tj. Response.Expires=0, ustawione jest natychmiastowy up│yw wa┐no╢ci strony.
NastΩpnie, specjalna, szybkowygasaj▒ca wiadomo╢µ jest przechowywana w buforze. Nale┐y zauwa┐yµ, ┐e musisz zaopatrzyµ stronΩ we wszystkie znaczniki takie jak <HTML> lub <BODY> po tym, jak wyczyszczony zostanie bufor. Je╢li wymagane jest wys│anie w trybie natychmiastowym zawarto╢ci bufora do przegl▒darki nale┐y wykorzystaµ nastΩpuj▒c▒ instrukcjΩ:

Response.Flush

Kolejne linie:

</BODY>
</HTML>

zostaj▒ wys│ane do przegl▒darki i zamkn▒ dokument HTML.
Inn▒ metod▒ obiektu Response jest End. Komenda:

Response.End

nakazuje serwerowi WWW zako±czyµ przetwarzanie skryptu i wys│aµ bie┐▒cy rezultat. Wszystkie linie znajduj▒ce siΩ pod t▒ komend▒ nie zostan▒ wykonane (nie zostan▒ przes│ane do przegl▒darki).

Przekierowanie u┐ytkownika do innej strony

Przekierowanie u┐ytkownika do innej strony mo┐na zastosowaµ w przypadku:

-autoryzacji - kiedy u┐ytkownik nie jest zalogowany, mo┐e zostaµ przekierowany do strony, na kt≤rej mo┐e siΩ zalogowaµ.
-formularza - kiedy formularz na stronie ASP jest wys│any sam sobie i nastΩpuje sprawdzenie poprawno╢ci wprowadzonych danych. Je╢li dane s▒ niepoprawne, wtedy zostaje wys│any komunikat o b│Ωdzie wraz z oryginaln▒ form▒ formularza. Je╢li formularz zosta│ wype│niony poprawnie, wtedy u┐ytkownik zostaje przekierowany do innej strony.

W celu dokonania przekierowania nale┐y wywo│aµ metodΩ Redirect obiektu Response. Przyk│ad:

Response.Redirect "/katalog/nowastrona.asp"

lub r≤wnowa┐ne

Response.Redirect("/katalog/nowastrona.asp")

Uwaga! »adne dane wyj╢ciowe nie mog▒ znale╝µ siΩ przed metod▒ Redirect.

Formatowanie ustawie± regionalnych

Postaµ daty w r≤┐nych standardach wygl▒da odmiennie, czy to dla u┐ytkownik≤w anglojΩzycznych, czy niemieckich. Domy╢lne ustawienia regionalne serwera s▒ odpowiedzialne za jej wygl▒d. Ustawienia te mo┐na zmieniaµ korzystaj▒c z w│a╢ciwo╢ci LCID obiektu Session. Poni┐ej zosta│a przedstawina tabela z warto╢ciami dla r≤┐nych ustawie± regionalnych.

Nazwa regionu LCID Data i czas
angielski (australijski) 3081 26/01/99 2:37:46
angielski (kanadyjski) 4105 26/01/99 2:37:46 AM
angielski (UK) 2057 26/01/99 02:37:46
angielski (ameryka±ski) 1033 1/26/99 2:37:46 AM
francuski (standard) 1036 26/01/99 02:37:46
niemiecki (standard) 1031 26.01.99 02:37:46
japo±ski 1041 99/01/26 2:37:46
rosyjski 1049 26.01.99 2:37:46
hiszpa±ski (wsp≤│czesny) 3082  

3.2 Odbieranie danych od u┐ytkownika

Zmienne ╢rodowiskowe

Czasem jest potrzeba uzyskania informacji na temat typu przegl▒darki klienta, adresu IP, itp. W tym celu mo┐na pos│u┐yµ siΩ grup▒ ServerVariables obiektu Request. Przyk│adem wykorzystania (odczytania) zmiennej ╢rodowiskowej jest poni┐szy zapis:

sciezkaURL = Request.ServerVariables("SCRIPT_NAME")

W przyk│adzie do zmiennej sciezkaURL zostanie zapisana rzeczywista ╢cie┐ka wykonywanego skryptu.
Teraz zostan▒ om≤wione wa┐niejsze zmienne ╢rodowiskowe:

SCRIPT_NAME - rzeczywista ╢cie┐ka do wykonywanego skryptu
CONTENT_LENGTH - informacje jakie zosta│y wys│ane od klienta (u┐ytkownika) przy pomocy metody POST do serwera
ALL_RAW - wszystkie nag│≤wki HTTP wys│ane od przegl▒darki wywo│ane uruchomieniem skryptu
HTTP_HeaderName - nazwa nag│≤wka HTTP
HTTP_USER_AGENT - nazwa przegl▒darki, jej wersja i system operacyjny
HTTP_ACCEPT_LANGUAGE - preferowane jΩzyki
HTTP_REFERER - adres strony, kt≤ra wywo│a│a bie┐▒cy skrypt (stronΩ)
REMOTE_ADDR - adres IP klienta
SERVER_NAME - nazwa domeny serwera (np. www.nazwa.com), wykorzystywana w przypadku wielu domen na jednym serwerze
QUERY_STRING - zawarto╢µ wype│nionego i wys│anego formularza

Formularze

a) Metoda GET

U┐ycie metody GET sprawi, ┐e wszystkie dane umieszczone w wype│nionym formularzu zostan▒ do│▒czone do adresu URL i bΩd▒ odczytywalne od strony serwera poprzez u┐ycie grupy Request.QueryString. Przyk│adowy adres po wys│aniu formularza, kt≤rego metod▒ jest GET, mo┐e wygl▒daµ nastΩpuj▒co:

http://www.nazwa.com/plik.asp?pole1=wartosc1&pole2=w2&pole3=w3

Warto╢ci▒ zwr≤con▒ poprzez wywo│anie komendy Request.QueryString("pole2") bΩdzie wartosc2.

b) Metoda POST

W przeciwie±stwie do metody GET, metoda POST nie do│▒cza danych z formularza do adresu URL. Dane od strony serwera s▒ odczytywane przy pomocy zbioru Request.Form.

Przyk│ad odczytania zawatro╢ci pola tekstowego z formularza, kt≤ry u┐ywa metody POST. Fragment dokumentu HTML:

<FORM ACTION="plik.asp" METHOD="POST">
Podaj imiΩ: <INPUT TYPE="Text" NAME="imie"><BR>
Podaj nazwisko: <INPUT TYPE="Text" NAME="nazwisko"><BR>
<INPUT TYPE="Submit" NAME="submit" VALUE="Wyslij">
</FORM>

Odczytanie pola z imieniem odbywa siΩ poprzez wpisanie komendy:

Request.Form("imie")

za╢ odczytanie pola z nazwiskiem:

Request.Form("nazwisko")

Podobnie dzieje siΩ w przypadku metody GET, z t▒ r≤┐nic▒, ┐e zamiast Request.Form wpisaµ nale┐y Request.QueryString. Przydatne funkcje:

Trim(│a±cuch) - wycina wszystkie spacje znajduj▒ce siΩ na pocz▒tku │a±cucha do momentu napotkania innego znaku
Replace(│a±cuch, ci▒g1, ci▒g2) - zamienia ka┐dy ciag1 na ciag2 napotkany w │a±cuchu
isNumeric(dana) - zwraca warto╢µ TRUE je╢li dana jest liczb▒, w przeciwnym wypadku zwraca warto╢µ FALSE
CInt(liczba) - konwertuje liczbΩ na liczbΩ ca│kowit▒
CLng(liczba) - konwertuje liczbΩ na liczbΩ ca│kowit▒ d│ug▒
isDate(dana) - zwraca warto╢µ TRUE je╢li dana jest dat▒, w przeciwnym wypadku zwraca warto╢µ FALSE

 Kurs pochodzi z serwisu Programowanie wg Stelmika republika.pl/stelmik