Skrypty serwerowe
Transkrypt
Skrypty serwerowe
Ć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 byte short ushort int uint long ulong float double decimal char string bool Liczba całkowita 8-bitowa ze znakiem Liczba całkowita 8-bitowa bez znaku Liczba całkowita 16-bitowa ze znakiem Liczba całkowita 16-bitowa bez znaku Liczba całkowita 32-bitowa ze znakiem Liczba całkowita 32-bitowa bez znaku Liczba całkowita 64-bitowa ze znakiem Liczba całkowita 64-bitowa bez znaku Liczba rzeczywista pojedynczej precyzji Liczba rzeczywista podwójnej precyzji Liczba rzeczywista wysokiej precyzji, mniejszego zakresu Pojedynczy znak Unicode Łańcuch tekstowy 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+'<br />'); 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+"<br />"); 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+'<br />'); 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+"<br />"); 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 ToSByte ToByte(x) ToInt16(x) ToUInt16(x) ToInt32(x) ToUInt32(x) ToInt64(x) ToUInt64(x) ToSingle(x) ToDouble(x) ToDecimal(x) ToString(x) Opis Konwersja wartości x na sbyte (typ C#) Konwersja wartości x na byte (typ C#) Konwersja wartości x na short (typ C#) Konwersja wartości x na ushort (typ C#) Konwersja wartości x na int (typ C#) Konwersja wartości x na uint (typ C#) Konwersja wartości x na long (typ C#) Konwersja wartości x na ulong (typ C#) Konwersja wartości x na float (typ C#) Konwersja wartości x na double (typ C#) Konwersja wartości x na decimal (typ C#) 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 x.ToString() x.ToString("F2”) x.ToString("F6”) x.ToString("E2”) x.ToString("G2”) x.ToString("N3”) x.ToString("P”) x.ToString("C”) Opis Konwersja bez formatowania Konwersja z dokładnością do 2 cyfr po przecinku Konwersja z dokładnością do 6 cyfr po przecinku Konwersja na postać naukową z dokładnością do 2 cyfr Konwersja na najbardziej zwartą postać (notacja standardowa lub naukowa) przy 2 cyfrach znaczących Konwersja z dokładnością do 3 cyfr po przecinku i rozdziałem „tysięcy” Konwersja z na procenty Konwersja na aktualną walutę Wynik 1234,1234 1234,12 1234,123400 1,23E+003 1,2E+003 1 234,123 123 412,34 % 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#" %> <html> <head> <title>Skrypty</title> </head> <body> Iloczy 5 razy 4 wynosi <%=(5*4) %> </body> </html> 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#" %> <html> <head> <title>Skrypty</title> </head> <body> <% for (int i = 1; i <= 10; i++) Response.Write(i + "<br />"); %> </body> </html> Kolejną możliwością jest zdefiniowanie bloku skryptowego na początku strony w bloku <script> .. </script>. W celu odróżnienia tego bloku od bloku skryptu klienckiego znacznik skrypt uzupełniany jest o atrybut runat=”server”. W bloku tym powinny się znaleźć definicje metod. Przykład <%@ Page Language="C#" %> <script runat="server"> double ObliczSume(double a, double b) { return a + b; } </script> <html> <head> Przykład 46 <title>Skrypty</title> </head> <body> Suma liczb 5 i 4 wynosi <%=ObliczSume(5,4) %> </body> </html> 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" %> <html> <head> <title></title> </head> <body> <form id="form1" runat="server"> <div> Suma liczb 4 i 5 wynosi <% =ObliczSume(4,5) %> </div> </form> </body> </html> 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 Write(x) WriteFile(nazwa) End() Redirect(url) Opis Pisze wartość x do kodu HTML wysyłanej strony Dopisuje zawartość pliku do wysyłanej strony Natychmiast kończy przetwarzanie i wysyła stronę 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#"%> <html> <head> <title>Liczby</title> </head> <body> <% for (int i = 1; i <= 7; i++) { Response.Write("<font size=\"" + i + "\">"); Response.Write("Tekst1"); Response.Write("</font>"); } %> </body> </html> 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ść ToString() ToLongTimeString() ToShortTimeString() ToLongDateString() ToShortDateString() Hor Minute Second Year Month Day DayOfWeek DayOfYear Opis Konwersja na tekst daty i czasu Konwersja na pełny tekst czasu Konwersja na skrócony tekst czasu Konwersja na pełny tekst czasu Konwersja na skrócony tekst czasu Godzina Minuta Sekunda Rok Miesiąc Dzień miesiąca Angielska nazwa dnia tygodnia Numer dnia roku Przykład <%@ Page Language="C#"%> <html> <head> <title>Czas</title> </head> <body> <% DateTime czas = DateTime.Now; Response.Write("Dzisiaj mamy: "+czas.ToLongDateString()+"<br />"); if (czas.Hour > 16) Response.Write("Pora kończyć !"); %> </body> </html> 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 przejdź 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 Kolekcja wartości pól formularza wysłanego metodą GET Kolekcja wartości pól formularza wysłanego metodą POST QueryString Form 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#" %> <html> <head> <title>Prostokąt</title> </head> <body> <form action="Prostokat.aspx" method="get"> Szerokość <input name="szer" type="text" /><br /> Wysokość <input name="wys" type="text" /><br /> <input type="submit" value="Oblicz" /> </form> <% 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")); } %> </body> </html> Podobnie będziemy obsługiwać formularz wysyłany metodą POST. Zmieniamy tylko wykorzystywaną kolekcję z QueryString na Form. Przykład <%@ Page Language="C#" %> <html> <head> <title>Prostokat</title> </head> <body> <form action="Prostokat.aspx" method="post"> Szerokość <input name="szer" type="text" /><br /> Wysokość <input name="wys" type="text" /><br /> <input type="submit" value="Oblicz" /> </form> <% 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")); } %> </body> </html> Przykład <%@ Page Language="C#" %> <html> <head> <title>Przeglądarka</title> </head> <body> <table border=1 cellpadding=10 cellspacing=0> <tr> <td width="30%"><b>Właściwość</b></td> <td><b>Wartość</b></td> </tr> <tr> <td>Przeglądarka</td> Przykład 51 <td> <%= Request.Browser.Browser %></td> </tr> <tr> <td>Pliki Cookie</td> <td> <%= Request.Browser.Cookies %></td> </tr> <tr> <td>Ramki</td> <td> <%= Request.Browser.Frames %></td> </tr> <tr> <td>JavaScript </td> <td> <%= Request.Browser.JavaScript %></td> </tr> <tr> <td>Wersja</td> <td> <%= Request.Browser.Version %></td> </tr> </table></body></html> 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ść Sqrt(x) Abs(x) Pow(a,n) Round(x) , Ceiling(x) Floor(x) Sin(rad),Cos(rad), Tan(rad), Sinh(rad), Cosh(rad), Tanh(rad), Asin(x),Acos(x),Atan(x), Atan2(x,y) Log(a,p) Log10(x) Max(x1,x2) Min(x1,x2) Exp(n) PI E Opis Pierwiastek drugiego stopnia z x Wartość bezwzględna z x n Potęga a Zaokrąglenie do najbliższej liczby całkowitej Zaokrąglenie w górę Zaokrąglenie w dół Funkcje trygonometryczne, stopnie podawane w radianach logp(n) log10(n) Wartość maksymalna z dwóch liczb Wartość minimalna z dwóch liczb n e π e Przykład <%@ Page Language="C#" %> <html> <head> <title>Kula</title> </head> <body> <form method="get"> Przykład 52 Promień <input name="promien" type="text" /><br /> <input type="submit" value="Oblicz" /> </form> <% 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")); } %> </body> </html> 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 Z[0-5] Z2,Z4 Zx,Z9 k[^oa]t kit,ket kat, kot, kotek [B||Jo|Mich] Basia, Michasia Kasia, Ela znaków [^…] Jeden z niewymienionych […|...] Jeden z ciągów 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 Jan\sKowalski Jan Kowalski Jan-Kowalski \S+ Jan, 1234, Jaks Jan Kowalski ([A-Z][a-z]+)(-[A- Kowalski, Kowalski- Kow2, Z][a-z]+)* Nowak cyfrą, _ \s Spacja, tabulacja, nowa linia \S Każdy znak niebędący spacją, tabulacją i nl (…) Blok znaków 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 IsMatch Sprawdza, czy łańcuch jest zgodny ze wzorcem 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" %> <html> <head> <title>Osoba</title> </head> <body> <form method="get"> Imię <input name="imie" type="text" /><br /> Nazwisko <input name="nazwisko" type="text" /><br /> <input type="submit" value="Oblicz" /> </form> <% 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 <br />"); else Response.Write("Imię niepoprawne <br />"); Regex wzorzecNazwiska = new Regex(@"^[A-Z][a-z]+(-[A-Z][a-z]+)*$"); if (wzorzecNazwiska.IsMatch(Request.QueryString["nazwisko"])) Response.Write("Nazwisko poprawne <br />"); else Response.Write("Nazwisko niepoprawne <br />"); } %> </body> </html> 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. 3 Materiał Gęstość [kg/m ] Stal 7860 Aluminium 2700 Tytan 4507 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