Ćwiczenie 6
Temat:
Wprowadzenie do
skryptów
serwerowych
Cel ćwiczenia:
W ramach ćwiczenia student zapozna się z zasadami osadzania skryptów
serwerowych ASP.NET. Nauczy się wykorzystywać je do dynamicznej generacji
zawartości strony internetowej oraz do przetwarzania danych nadesłanych z
formularza HTML.
Język C#
Język C# wywodzi podobnie jak JavaScript wywodzi się z języka C. Z tego powodu posługuje
się tym samym zestawem operatorów i instrukcji, jednak w przeciwieństwie do JS wymaga
deklaracji zmiennych i jawnego typowania.
Zmienne
Podstawowe typy zmiennych C# to:
Typ Opis
sbyte Liczba całkowita 8-bitowa ze znakiem
byte Liczba całkowita 8-bitowa bez znaku
short Liczba całkowita 16-bitowa ze znakiem
ushort Liczba całkowita 16-bitowa bez znaku
int Liczba całkowita 32-bitowa ze znakiem
uint Liczba całkowita 32-bitowa bez znaku
long Liczba całkowita 64-bitowa ze znakiem
ulong Liczba całkowita 64-bitowa bez znaku
float Liczba rzeczywista pojedynczej precyzji
double Liczba rzeczywista podwójnej precyzji
decimal Liczba rzeczywista wysokiej precyzji, mniejszego zakresu
char Pojedynczy znak Unicode
string Aańcuch tekstowy
bool Wartość boolowska
Zmienne deklarujemy analogicznie do języków C, C++.
typ_zmiennej nazwa_zmiennej
Przykład
int x,y=4;
double z = 4.3;
string t = "Ola";
Zmienne 41
Instrukcje
1. Instrukcja warunkowa wykonująca jeden z dwóch bloków poleceń w zależności od wartości
logicznej warunku.
if (warunek)
polecenia wykonywane, je\eli warunek jest spełniony
else
polecenia wykonywane je\eli warunek nie jest spełniony
Przykład:
if (a>0)
Response.Write("Wartość przekroczona");
if (b>0)
{
// blok instrukcji
Response.Write('Wartość przekroczona');
}
else
Response.Write('Wartość poprawna');
2. Instrukcja wyboru wykonująca jeden z wielu bloków poleceń w zależności od wartości
zmiennej:
switch (zmienna) {
case wartość1: polecenia wykonywane, je\eli zmienna=wartość1
break;
case wartość1: polecenia wykonywane, je\eli zmienna=wartość1
break;
:
:
default: polecenia wykonywane, je\eli zmienna ma inną wartość
break;
}
Przykład:
switch (liczba) {
case 1: Response.Write("jeden");
break;
case 2: Response.Write("dwa");
break;
case 3: Response.Write("trzy");
break;
default: Response.Write("liczba "+liczba);
break;
Instrukcje 42
}
3. Pętla for stosowana najczęściej w przypadku znanej przy jej rozpoczęciu liczbie powtórzeń,
nieskomplikowanej metodzie inkrementacji zmiennej i warunku ograniczającym. Wykonuje
się, jeżeli warunek jest spełniony.
for (inicjalizacja; warunek; inkrementacja)
polecenia wielokrotnie wykonywane w pętli
Przykład:
for (int i=10;i>=1;i--)
Response.Write(i+'
');
4. Pętla while wykonywana, jeżeli warunek jest spełniony. W wypadku początkowego
niespełnienia warunku pętla nie wykona się ani razu. Zakres zastosowań tej pętli jest
identyczny z pętlą for. Pętle while stosuje się przy bardziej skomplikowanej logice iteracji trudne
do opisania w nagłówku pętli for.
while (warunek)
polecenia wielokrotnie wykonywane w pętli
Przykład:
int i=10;
while (i>=1)
{
Response.Write(i+"
");
i--;
}
5. Pętla do..while wykonywana, jeżeli warunek jest spełniony. W wypadku początkowego
niespełnienia warunku pętla nie wykona się raz, ponieważ warunek jest sprawdzany na
końcu pętli;
do
polecenia wielokrotnie wykonywane w pętli
while (warunek)
Przykład:
int i=10;
do
{
Response.Write(i+'
');
i--;
}
Instrukcje 43
while (i>=1)
6. Pętla foreach nie występuje w JavaScipt. Jest wykonywana dla każdego elementu kolekcji
(tablicy). Zmienne sterująca w kolejnych iteracjach reprezentuje element tej kolekcji.
foreach(typ_elementu zmienna in kolekcja
polecenia wielokrotnie wykonywane w pętli
Przykład:
string[] imiona=new string[]{"Ala","Ola","Ela"}; // tablic string ów
foreach(string imie in imiona)
Respone.Wrtie(imie+"
");
Metody
Metody (odpowiednik funkcji w JavaScript) także definiujemy z jawną podaniem typu
zwracanego i typów parametrów. W przypadku metody proceduralnej (niezwracającej
wartości) określamy typ zwracany, jako void
Przykład
void WyswietlSume(double a, double b) //nagłówek metody
{
double wynik = a + b;
Response.Write("Suma=" + wynik);
}
WyswietlSume(3, 4); //wywołanie metody
W przypadku metod zwracających wartość obowiązkowe jest użycie w ciele takiej metody
słowa kluczowego return.
Przykład
double ObliczSume(double a, double b) //nagłówek metody
{
double wynik = a + b;
return wynik;
}
double s = ObliczSume(3, 4); //wywołanie metody
Response.Write("Wynik=" + s);
Metody 44
Konwersja typów
Ponieważ język C# wymaga jawnego typowania, dlatego w często wymaga także jawnej konwersji
typów. Wyjątek stanowi konwersja z typu o mniejszej pojemności (np. byte) na typ o pojemności
większej (np. int). W platformie .NET istnieje przydatna klasa Convert, która zawiera zestaw metod
konwersji na podstawowe typy.
Metoda Opis
ToSByte Konwersja wartości x na sbyte (typ C#)
ToByte(x) Konwersja wartości x na byte (typ C#)
ToInt16(x) Konwersja wartości x na short (typ C#)
ToUInt16(x) Konwersja wartości x na ushort (typ C#)
ToInt32(x) Konwersja wartości x na int (typ C#)
ToUInt32(x) Konwersja wartości x na uint (typ C#)
ToInt64(x) Konwersja wartości x na long (typ C#)
ToUInt64(x) Konwersja wartości x na ulong (typ C#)
ToSingle(x) Konwersja wartości x na float (typ C#)
ToDouble(x) Konwersja wartości x na double (typ C#)
ToDecimal(x) Konwersja wartości x na decimal (typ C#)
ToString(x) Konwersja wartości x na string (typ C#)
Metodą ToString dysponują także wszystkie typy .NET. W przypadku typów numerycznych daje ona
duże możliwości formatowania.
W poniżej tabelce zamieszczono przykłady dla zmiennej x typu double i wartości 1234,1234.
Przykład Opis Wynik
x.ToString() Konwersja bez formatowania 1234,1234
x.ToString("F2 ) Konwersja z dokładnością do 2 cyfr po przecinku 1234,12
x.ToString("F6 ) Konwersja z dokładnością do 6 cyfr po przecinku 1234,123400
x.ToString("E2 ) Konwersja na postać naukową z dokładnością do 2 cyfr 1,23E+003
x.ToString("G2 ) Konwersja na najbardziej zwartą postać (notacja standardowa lub 1,2E+003
naukowa) przy 2 cyfrach znaczących
x.ToString("N3 ) Konwersja z dokładnością do 3 cyfr po przecinku i rozdziałem tysięcy 1 234,123
123 412,34 %
x.ToString("P ) Konwersja z na procenty
x.ToString("C ) Konwersja na aktualną walutę 1,23 zł
Osadzanie skryptów serwerowych ASP.NET
Przed osadzeniem skryptu serwerowego należy na początku strony aspx w dyrektywie Page określić,
jakim językiem programowania będziemy się posługiwali w skryptach.
<%@ Page Language="C#" %>
Następnie mamy kilka metod osadzenia skryptu serwerowego. Najbardziej lokalną jest metoda inline,
stosowana gdy tylko pojedynczą informację chcemy wygenerować przy pomocy skryptu
Przykład 45
serwerowego. Skrypt osadzamy wówczas wewnątrz symboli <% %>, a wartość generowaną
poprzedzamy znakiem =.
Przykład
<%@ Page Language="C#" %>
Skrypty Iloczy 5 razy 4 wynosi <%=(5*4) %>
Kolejną metodą jest utworzenie całego bloku skryptowego przy pomocy symboli <% %>. W jego
wnętrzu możemy stosować dowolne konstrukcje programistyczne. Blok tego typu powinien być
osadzany jedynie we wnętrzu sekcji body i służy zwykle do dynamicznej generacji treści strony.
Przykład
<%@ Page Language="C#" %>
Skrypty <%
for (int i = 1; i <= 10; i++)
Response.Write(i + "
");
%>
Kolejną możliwością jest zdefiniowanie bloku skryptowego na początku strony w bloku . W celu odróżnienia tego bloku od bloku skryptu klienckiego znacznik skrypt uzupełniany
jest o atrybut runat= server . W bloku tym powinny się znalezć definicje metod.
Przykład
<%@ Page Language="C#" %>
Przykład 46
Skrypty Suma liczb 5 i 4 wynosi <%=ObliczSume(5,4) %>
Ostatnią możliwością jest całkowite rozdzielenie skryptu serwerowego i kodu HTML do odrębnych
plików. W tym celu należy uzupełnić dyrektywę Page o w wskazanie, w którym pliku znajduje się kod
skryptowy powiązany ze stroną i zdefiniować wspólną nazwę klasy dla elementów strony i skryptu.
Przykład
<%@ Page Language="C#" CodeFile="Skrypty.aspx.cs" Inherits="Skrypty" %>
W pliku aspx znajdują się wówczas tylko odwołania do metod zdefiniowanych w pliku kodu.
Końcówka nazwy pliku kodu zależy od używanego języka skrypu. Plik ten zawiera jedynie definicje
odpowiednich klas oraz wypełniające je definicje metod, pól lub właściwości.
Przykład
using System;
public partial class Skrypty : System.Web.UI.Page
{
public double ObliczSume(double a, double b)
{
return a + b;
}
}
Przykład 47
Dynamiczna generacja kodu HTML
W chwili nadejścia z przeglądarki żądania pobrania strony w pamięci serwera tworzony jest dla tego
żądania obiekt klasy Page (niszczony po zakończeniu obsługi żądania).
Obiekt Page zawiera w sobie zagnieżdżony obiekt Response odpowiedzialny za wszystkie dane
przekazywane z serwera do przeglądarki.
Jego najważniejsze metody zwiera poniższa tabela:
Metoda Opis
Write(x) Pisze wartość x do kodu HTML wysyłanej strony
WriteFile(nazwa) Dopisuje zawartość pliku do wysyłanej strony
End() Natychmiast kończy przetwarzanie i wysyła stronę
Redirect(url) Wysyła do przeglądarki żądanie przekierowania po
adres url
Do dynamicznej generacji zawartości strony będziemy używać metody Write,
Przykład
<%@ Page Language="C#"%>
Liczby <%
for (int i = 1; i <= 7; i++)
{
Response.Write("
");
Response.Write("Tekst1");
Response.Write("");
}
%>
Symbol \ pozwala wygenerować cudzysłowy wokół atrybutu HTML z wnętrza łańcucha tekstowego
C#.
Obsługa daty i czasu
Przykład 48
Platforma .NET udostępnia klasę DateTime, która pozwala pozyskać informacje o aktualnej dacie i
czasie. Żeby skorzystać z jej funkcjonalności należy utworzyć przy jej pomocy zmienną obiektową
reprezentującą aktualny czas.
DateTime czas = DateTime.Now;
Po utworzeniu takiego obiektu możemy skorzystać z zestawu jego metod i właściwości.
Metoda, właściwość Opis
ToString() Konwersja na tekst daty i czasu
ToLongTimeString() Konwersja na pełny tekst czasu
ToShortTimeString() Konwersja na skrócony tekst czasu
ToLongDateString() Konwersja na pełny tekst czasu
ToShortDateString() Konwersja na skrócony tekst czasu
Hor Godzina
Minute Minuta
Second Sekunda
Year Rok
Month Miesiąc
Day Dzień miesiąca
DayOfWeek Angielska nazwa dnia tygodnia
DayOfYear Numer dnia roku
Przykład
<%@ Page Language="C#"%>
Czas <%
DateTime czas = DateTime.Now;
Response.Write("Dzisiaj mamy: "+czas.ToLongDateString()+"
");
if (czas.Hour > 16) Response.Write("Pora kończyć !");
%>
Przykład 49
Zadanie 1
1. Wyświetl na stronie aktualny czas w formie skróconej.
2. Wyświetl poziomą, jednowierszową tabelę z liczbami od 1 do numeru akutalnego dnia
miesiąca. Wewnątrz komórek użyj wielkości czcionki 6px.
1 2 3 4 5
3. Wyświetl nazwę dnia tygodnia, a jeżeli jest to niedziela to automatycznie przejdz na stronę
http://www.polsl.pl.
Przetwarzanie danych przesłanych z formularza
Obiekt Page, oprócz obiektu zagnieżdżonego Response, który jest odpowiedzialny za informacje
wysyłane z serwera do przeglądarki, dysponuje także obiektem Request pozwalającym przetwarzać
wszelkie informacje płynące z przeglądarki do serwera, takie jak dane formularza czy parametry
przeglądarki. Poniższa tabela zawiera najważniejsze właściwości tego obiektu.
Właściwość Opis
Browser Obiekt zawierający informacje o nazwie, wersji i
możliwościach przeglądarki użytkownika
QueryString Kolekcja wartości pól formularza wysłanego metodą
GET
Form Kolekcja wartości pól formularza wysłanego metodą
POST
Najczęściej obiekt Request będziemy wykorzystywać do odbierania danych formularza, tak jak
prezentuje to poniższy przykład dla formularza wysyłanego metodą GET.
Przykład
<%@ Page Language="C#" %>
Prostokąt <%
Przykład 50
if (Request.QueryString["szer"] != null && Request.QueryString["wys"] !=
null)
//sprawdzenie czy dane z formularza nadeszły
{
double a = Convert.ToDouble(Request.QueryString["szer"]);
double b = Convert.ToDouble(Request.QueryString["wys"]);
double P = a * b;
Response.Write("Pole=" + (a * b).ToString("F2"));
}
%>
Podobnie będziemy obsługiwać formularz wysyłany metodą POST. Zmieniamy tylko wykorzystywaną
kolekcję z QueryString na Form.
Przykład
<%@ Page Language="C#" %>
Prostokat <%
if (Request.Form["szer"] != null && Request.Form["wys"] != null)
//sprawdzenie czy dane z formularza nadeszły
{
double a = Convert.ToDouble(Request.Form["szer"]);
double b = Convert.ToDouble(Request.Form["szer"]);
double P = a * b;
Response.Write("Pole=" + (a * b).ToString("F2"));
}
%>
Przykład
<%@ Page Language="C#" %>
Przeglądarka
Właściwość |
Wartość |
Przeglądarka |
Przykład 51
<%= Request.Browser.Browser %> |
Pliki Cookie |
<%= Request.Browser.Cookies %> |
Ramki |
<%= Request.Browser.Frames %> |
JavaScript |
<%= Request.Browser.JavaScript %> |
Wersja |
<%= Request.Browser.Version %> |
Operacje matematyczne
Podobnie, jak w wypadku JavaScript mamy w C# do dyspozycji klasę Math udostępniającą zestaw
metod i właściwości przydatnych w obliczeniach matematycznych.
Metoda, Właściwość Opis
Sqrt(x) Pierwiastek drugiego stopnia z x
Abs(x) Wartość bezwzględna z x
Pow(a,n) Potęga an
Round(x) Zaokrąglenie do najbliższej liczby całkowitej
, Ceiling(x) Zaokrąglenie w górę
Floor(x) Zaokrąglenie w dół
Sin(rad),Cos(rad), Tan(rad),
Funkcje trygonometryczne, stopnie podawane w
Sinh(rad), Cosh(rad), Tanh(rad),
radianach
Asin(x),Acos(x),Atan(x), Atan2(x,y)
Log(a,p) logp(n)
Log10(x) log10(n)
Max(x1,x2) Wartość maksymalna z dwóch liczb
Min(x1,x2) Wartość minimalna z dwóch liczb
Exp(n) en
PI
Ą
E e
Przykład
<%@ Page Language="C#" %>
Kula <%
if (Request.QueryString["promien"] != null)
{
double r = Convert.ToDouble(Request.QueryString["promien"]);
double V = 4.0/3.0*Math.PI*Math.Pow(r,3);
Response.Write("Objętość="+V.ToString("F2"));
}
%>
W powyższym przykładzie należy zwrócić uwagę na pozornie nielogiczny zapis 4.0/3.0. Jest to
spowodowane różną realizacją działań matematycznych dla różnych typów. Zapis 4/3 oznaczałby
dzielenie dwóch liczb całkowitych, co w C# daje wynik całkowity, czyli 1, co zafałszowałoby obliczenia.
Skrajnym przykładem jest wzór na objętość stożka, w przypadku którego zapis
V=1/3*Math.PI*Math.Pow(r,3) zawsze dałby wynik równy 0.
Wyrażenia regularne
Także po stronie serwerowej możemy wykorzystywać wyrażenia regularne, czyli wzorce,
które opisują łańcuchy symboli. Szczególnie przydatne będą one do kontroli danych
wprowadzonych przez użytkownika do formularza. Zarówno w języku JavaScript (po stronie
klienckiej), w języku C# (po stronie serwerowej), jak i w każdym innym języku
programowania stosujemy ten sam, standardowy zastaw symboli wyrażeń regularnych:
Symbol Opis Przykład Ciągi zgodne Ciągi niezgodne
^ Początek ciągu ^kot kot, kotka, kotwa pies, pokot
$ Koniec ciągu $a Ania, kotka Jan, kot
. Jeden dowolny znak .asia Kasia,Basia Ela, Joasia
[& ] Jeden z wymie-nionych k[oa]t kot,kat kit, koat, kotek
znaków
Z[0-5] Z2,Z4 Zx,Z9
[^& ] Jeden z k[^oa]t kit,ket kat, kot, kotek
niewymienionych
[& |...] Jeden z ciągów [B||Jo|Mich] Basia, Michasia Kasia, Ela
Przykład 53
? Zero lub jeden znak list?owy lisowy, listowy listy, lisa
+ Jeden lub wiele znaków [A-Z][a-z]+ Joanna, Kamil anna, 123, kot
* Zero lub wiele znaków ko*t kt,kot,koooot lot,gyy
{n} Dokładnie n znaków [0-9]{2}-[0-9]{7} 32-6034111 32-603, 997
{n,} Co najmniej n znaków [A-Z][a-z]{3,} Janek,Ania Ola, Ela
{n,m} Pomiędzy n i m znaków [0-9]{2,4} 12, 432, 4223 4, 12345
\d Cyfra \d{3} 123, 223 A21, 1234
\D Znak niebędący cyfrą \D+ Asad, ada Sdd1, 123
\w Litera, cyfra, _ \w{3} A12,123, 1_2 1+3
\W Znak niebędący literą, \W{3} +!!, --- Ala, 123
cyfrą, _
\s Spacja, tabulacja, nowa Jan\sKowalski Jan Kowalski Jan-Kowalski
linia
\S Każdy znak niebędący \S+ Jan, 1234, Jaks Jan Kowalski
spacją, tabulacją i nl
(& ) Blok znaków ([A-Z][a-z]+)(-[A- Kowalski, Kowalski- Kow2,
Z][a-z]+)* Nowak
Kowalski Nowak
I ten sam zestaw znaków specjalnych:
\. \* \ / \\ \? \: \^ \+ \\ \= \|
W języku C# zmienia się jednak sposób wykorzystania mechanizmu wyrażeń regularnych. W
tym celu wykorzystujemy klasę Regex z przestrzeni nazw System.Text.RegularExpressions.
Ponieważ jest to przestrzeń niestandardowa należy ją jawnie dołączyć przez dyrektywę
Import. Poniższa tabela prezentuje podstawowe metody udostępnianie przez obiekty klasy
Regex.
Metody Opis
Sprawdza, czy łańcuch jest zgodny ze wzorcem
IsMatch
opisanym wyrażeniem regularnym
Matches Zwraca kolekcję wystąpień wzorca
Replace Zastępuje wystąpienia wzorca łańcuchem tekstowym
Przykład 54
Przykład
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Text.RegularExpressions" %>
Osoba <%
if (Request.QueryString["imie"] != null &&
Request.QueryString["nazwisko"] != null)
{
Regex wzorzecImienia = new Regex("^[A-Z][a-z]+$");
if (wzorzecImienia.IsMatch(Request.QueryString["imie"]))
Response.Write("Imię poprawne
");
else
Response.Write("Imię niepoprawne
");
Regex wzorzecNazwiska = new Regex(@"^[A-Z][a-z]+(-[A-Z][a-z]+)*$");
if (wzorzecNazwiska.IsMatch(Request.QueryString["nazwisko"]))
Response.Write("Nazwisko poprawne
");
else
Response.Write("Nazwisko niepoprawne
");
}
%>
Zadanie 2
1. Przygotuj formularz, jak na rysunku poniżej. Formularz ma być wysyłany metodą
GET..
Przykład 55
2. Zaimplementuj w skrypcie serwerowym wyznaczanie masy walca na podstawie jego
wymiarów i zastosowanego materiału.
Gęstość [kg/m3]
Materiał
7860
Stal
2700
Aluminium
4507
Tytan
3. W oparciu o skrypt serwerowy zablokuj obliczenia i wyświetl komunikat, jeżeli
podano wartość wysokości inną niż liczba całkowita.
4. W oparciu o skrypt serwerowy zablokuj obliczenia i wyświetl komunikat, jeżeli
podano wartość promienia inną niż liczba rzeczywista z dokładnością do dwóch cyfr
po przecinku (np. 2,35).
5. Uzupełnij weryfikację formularza o sprawdzenie, czy wysokość i promień są większe od 0.
Zadanie 3 (fakultatywne)
1. Przygotuj test wiadomości z zakresu C# składający się z 15 pytań (otwartych, jednokrotnego i
wielokrotnego wyboru) przesyłany metodą POST.
2. Stwórz skrypt serwerowy oceniający odpowiedzi na poszczególne pytania.
3. Uzupełnij system testujący o zliczanie punktów i wystawianie ocen.
Przykład 56
Wyszukiwarka
Podobne podstrony:
technologie internetowe cw HTMLtechnologie internetowe cw MasterPage Sitemap themestechnologie internetowe cw CSStechnologie internetowe cw UCtechnologie internetowe cw JS2technologie internetowe cw WStechnologie internetowe cw KontrolkiSerw1technologie internetowe cw Formularze Htmltechnologie internetowe cw KontrolkiSerw2technologie internetowe cw JSTechnologie Internetowe 2Technologie Internetowe 1Technologie InternetoweInternational trade by technology intensityLab technologii ćw 5Lab technologii ćw 2 ogarnijtemat comwięcej podobnych podstron