Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Aplikacje WWW Prowadzący: Dr inż. Tomasz Molik Materiały dostępne na stronie: Hasło:...........

Podobne prezentacje


Prezentacja na temat: "Aplikacje WWW Prowadzący: Dr inż. Tomasz Molik Materiały dostępne na stronie: Hasło:..........."— Zapis prezentacji:

1 Aplikacje WWW Prowadzący: Dr inż. Tomasz Molik Materiały dostępne na stronie: Hasło:

2 Przekazywanie parametrów żądania HTTP Często w przypadku gdy żądanie klienta HTTP dotyczy uruchomienia aplikacji znajdującej się po stronie serwera HTTP, klient HTTP przekazuje parametry wywołania takiej aplikacji. Parametry wywołania mogą być przekazane za pośrednictwem protokołu HTTP na dwa sposoby: 1. Rozkaz GET, parametry dołączone do adresu URL skojarzonego z aplikacją. 2. Rozkaz POST, parametry przekazywane w ciele żądania HTTP. Na slajdzie przedstawiono obie metody przekazywania parametrów wywołania aplikacji znajdującej się po stronie serwera HTTP. W pierwszym przypadku zależnie od klienta HTTP zwykle istnieje ograniczenie na łączny rozmiar łańcucha znakowego zawierającego parametry żądania HTTP. W drugim przypadku rozmiary parametrów nie są ograniczone.

3 Uwierzytelnianie w HTTP – Basic Authentication Nie wszystkie dokumenty zgromadzone po stronie serwera HTTP powinny być udostępniane każdemu użytkownikowi. Jedną z najprostszych metod ochrony dostępu jest uwierzytelnianie użytkowników za pomocą nazwy i hasła. Protokół HTTP obsługuje prostą metodę uwierzytelniania użytkowników nazwaną Basic Authentication. Jeżeli serwer HTTP wymaga uwierzytelnienia użytkownika, wtedy odpowiedź na żądanie HTTP zawiera kod zwrotny 401 (Authorization Required), oznaczający, że klient HTTP powinien zażądać od użytkownika wprowadzenia nazwy i hasła. W takiej sytuacji klient HTTP pobiera od użytkownika jego nazwę i hasło, łączy je w jeden łańcuch znakowy, koduje za pomocą algorytmu Base64, a następnie zapisuje w polu nagłówka Authorization ponowionego żądania HTTP. Jeżeli wynik weryfikacji nazwy/hasła użytkownika przez serwer HTTP jest negatywny, serwer HTTP ponownie przesyła kod zwrotny 401 (Authorization Required) – aż do skutku. Wprowadzone przez użytkownika dane uwierzytelniające są przez klienta HTTP automatycznie dołączane do kolejnych żądań HTTP. Należy zauważyć, że metoda HTTP Basic Authentication nie zapewnia ochrony przekazywanych danych uwierzytelniających. Kodowanie Base64 jest odwracalne, dzięki czemu ewentualny podsłuch połączenia HTTP umożliwia intruzowi przejęcie nazwy i hasła użytkownika. Pewniejsze metody uwierzytelniania użytkowników opierają się na formularzach HTML, których dane są przekazywane za pośrednictwem szyfrowanego protokołu HTTPS.

4 HTTPS Wadą podstawowego protokołu HTTP jest brak zabezpieczenia poufności komunikacji pomiędzy klientem HTTP a serwerem HTTP. Komendy, parametry, dane z formularzy, zmienne Cookie i dokumenty są przesyłane w postaci czytelnego tekstu. Hasła uwierzytelniające są kodowane w prymitywny sposób. W celu zapewnienia bezpieczeństwa komunikacji w środowisku WWW powszechnie stosuje się protokół HTTPS, który w przeciwieństwie do HTTP, opartego bezpośrednio na TCP, wykorzystuje warstwę komunikacyjną SSL. SSL obsługuje szyfrowanie transmisji, kontrolę jej integralności oraz uwierzytelnianie serwera, a opcjonalnie także klienta. Dzięki temu komunikaty żądań HTTP i odpowiedzi HTTP nie są narażone na łatwy podsłuch lub ingerencję osób trzecich. Podczas nawiązywania połączenia HTTPS klient HTTP otrzymuje od serwera HTTP certyfikat klucza publicznego, na podstawie którego potwierdza się tożsamość serwera HTTP. Aby certyfikat ten został uznany przez klienta HTTP, wystawiający go urząd certyfikacyjny powinien zostać uprzednio zarejestrowany w aplikacji klienta HTTP. W przeciwnym razie certyfikat serwera HTTP będzie uznany za nielegalny.

5 HTTPS W pewnym uproszczeniu, połączenie HTTPS przebiega w następujących krokach: 1. Klient HTTP wysyła do serwera HTTP sygnał otwarcia połączenia SSL. W tym celu użytkownik końcowy posługuje się symbolem "https" (zamiast "http") w adresie URL. 2. Serwer HTTP wysyła do klienta HTTP swój certyfikat klucza publicznego, stanowiący poświadczenie tożsamości serwera. 3. Klient HTTP dokonuje weryfikacji otrzymanego certyfikatu: czy nazwa właściciela zgadza się z nazwą DNS serwera HTTP? czy wystawca certyfikatu należy do zbioru zaufanych urzędów certyfikacyjnych? czy data ważności certyfikatu nie wygasła? Jeżeli wynik weryfikacji certyfikatu jest negatywny, aplikacja klienta HTTP zwraca się do użytkownika końcowego z pytaniem o kontynuowanie połączenia. 4. Klient HTTP wymienia z serwerem HTTP klucz szyfrujący. 5. Klient HTTP szyfruje komunikat żądania HTTP i przesyła go do serwera HTTP. 6. Serwer HTTP szyfruje komunikat odpowiedzi HTTP i przesyła go do klienta HTTP. Połączenie jest zamykane.

6 Zmienne Cookies Protokół HTTP został zaprojektowany jako bezstanowy, co oznacza, że serwer HTTP nie potrafi rozpoznać czy określone żądania HTTP pochodzą od tego samego użytkownika końcowego, czy od użytkowników niezależnych. Ponieważ wiele zastosowań aplikacyjnych wymaga korelowania żądań HTTP, dlatego zaproponowano rozszerzenie funkcjonalności protokołu o obsługę niewielkich zmiennych o czasie życia dłuższym od czasu trwania połączenia HTTP. Zmienne te nazwano Cookies. Zmienna Cookie jest powoływana do życia przez aplikację pracującą po stronie serwera HTTP, a następnie przesyłana do klienta HTTP. Zadaniem klienta HTTP jest przechować tę zmienną, a następnie wysyłać ją do serwera HTTP wraz z kolejnymi żądaniami HTTP. Dzięki temu serwer HTTP ma możliwość tymczasowego przechowywania zmiennych w pamięci klienta HTTP, a co się z tym wiąże, podtrzymywać stan aplikacji obsługującej klienta. Każda zmienna Cookie posiada nazwę, wartość będącą łańcuchem znakowym, wartość, czas życia określający jak długo klient HTTP powinien ją przechowywać, oraz zasięg rozumiany jako dziedzinę adresów URL (domena+ścieżka), którym zmienna ta będzie udostępniana. Jeżeli czas życia zmiennej Cookie wynosi 0, to zmienna jest przechowywana do momentu zamknięcia przeglądarki. Zmienne Cookies są zapisywana na dysku przez klienta HTTP.

7 Zmienne Cookies Przesyłanie Cookies pomiędzy klientem a serwerem HTTP przebiega następująco: 1. Klient HTTP wysyła do serwera HTTP żądanie uruchomienia aplikacji. 2. Serwer HTTP wysyła do klienta HTTP odpowiedź wygenerowaną przez aplikację. W nagłówku odpowiedzi HTTP znajduje się pole Set-Cookie, zawierające m.in. nazwę i wartość zmiennej Cookie: v1=ABC. Przekazywane zmienne oddzielone są średnikiem. 3. Klient HTTP pobiera zmienną Cookie z otrzymanego nagłówka odpowiedzi HTTP i zapisuje na dysku lokalnym. 4. Podczas wysyłania każdego następnego żądania HTTP klient umieszcza w jego nagłówku pole Cookie, zawierające nazwę i wartość zmiennej Cookie. W ten sposób zmienna powraca do serwera HTTP i może być wykorzystywana przez jego aplikacje.

8 Buforowanie dokumentów W celu skrócenia czasu odpowiedzi na żądanie użytkownika, a także w celu redukcji obciążenia serwerów HTTP i łączy, klient HTTP buforuje pobierane dokumenty na dysku i wykorzystuje je do uproszczonej obsługi nowych żądań. Gdy użytkownik formułuje nowe żądanie, bufor ten jest przeszukiwany w celu znalezienia kopii żądanego dokumentu. Jeżeli taka kopia zostanie znaleziona, klient HTTP rezygnuje z połączenia z serwerem HTTP i natychmiast przedstawia posiadaną kopię użytkownikowi. Ten rodzaj buforowania stwarza zagrożenie, iż kopia dokumentu znajdująca się w buforze nie jest już identyczna z oryginalnym dokumentem znajdującym się po stronie serwera HTTP, który mógł ulec modyfikacjom. Aby uniknąć ryzyka niespójności, klient HTTP stosuje jeden z algorytmów kontroli spójności bufora: 1. Kopie dokumentów są przechowywane w buforze wyłącznie przez czas ważności zadeklarowany przez serwer HTTP. 2. Klient HTTP każdorazowo odpytuje serwer HTTP, czy kopia dokumentu utworzona w podanym momencie czasowym jest nadal identyczna z oryginałem. 3. Klient HTTP każdorazowo odpytuje serwer HTTP, czy identyfikator wersji kopii dokumentu jest nadal identyczny z identyfikatorem wersji oryginału.

9 Formularze HTML Formularz HTML jest fragmentem dokumentu HTML zawierającym kontrolki umożliwiające wprowadzanie danych. Formularz HTML jest de facto jedynym mechanizmem umożliwiającym użytkownikowi przekazanie danych do aplikacji internetowej. Dane przekazywane z formularza mogą mieć różne zastosowanie, mogą to być np. kryteria wyszukiwania przekazane do wyszukiwarki, dane osobowe rejestrowane w formularzu zgłoszeniowym, czy numer konta i hasło podawane podczas logowania do banku internetowego. Kontrolki umieszczane w formularzach HTML obejmują: pola tekstowe, pola haseł, pola wyboru, listy rozwijane i przyciski. Dodatkowo, formularz może zawierać pola ukryte. Dzięki bogatemu zestawowi kontrolek użytkownik wprowadza dane w sposób przypominający pracę z tradycyjnymi aplikacjami. Formularz przesyła dane wprowadzone przez użytkownika do aplikacji działającej po stronie serwera HTTP. W zależności od wybranej metody przesłania formularza dane mogą być jeszcze dodatkowo zakodowane za pomocą kodowania URL (ang. URL-encoding).

10 Formularze HTML – przykład

11 Elementy formularza w HTML Cała zawartość formularza jest ujęta w znaczniki.... Najczęściej do konstruowania elementów formularza wykorzystujemy znacznik. W zależności od wartości atrybutu type możemy utworzyć następujące elementy formularza: type="text": pole tekstowe type="radio": element grupy przycisków radiowych, do jednej grupy trafiają wszystkie przyciski o tej samej wartości atrybutu name type="password": pole z hasłem, znaki wpisywane do pola nie są widoczne type="checkbox": pole wyboru type="file": pole służące do wyboru pliku i jego wysłania na serwer type="submit": przycisk służący do wysyłania formularza type="reset": przycisk służący do czyszczenia zawartości formularza type="button": przycisk type="image": graficzny przycisk wysłania formularza Oprócz znacznika elementy formularza można również utworzyć za pomocą następujących znaczników: : tworzy pole tekstowe typu memo o podanej liczbie wierszy i kolumn : tworzy listę rozwijaną, kolejne pozycje na liście są tworzone za pomocą znaczników : tworzy element ukryty, który nie jest wyświetlany w formularzu

12 Atrybuty elementów formularza w HTML Wygląd i zachowanie formularza można modyfikować za pomocą atrybutów elementów formularza. Do najczęściej używanych atrybutów należą: name: nazwa elementu formularza, wymagany dla wszystkich elementów poza przyciskami typu submit i reset value: dla pól tekstowych i pól z hasłami zawiera domyślną wartość pola, dla przycisków zawiera etykietę przycisku, dla pól wyboru i przycisków radiowych zawiera wartość elementu przesyłaną do aplikacji size: rozmiar elementu readonly: flaga oznaczająca, czy dany element może być modyfikowany checked: flaga oznaczająca, czy dany element jest początkowo wyświetlony jako zaznaczony (dotyczy przycisków radiowych i pól wyboru), np. checked="checked" disabled: element wyłączony, np. disabled="disabled"

13 Wysłanie formularza Atrybut action znacznika określa adres URI (ang. Uniform Resource Identifier) serwera/skryptu, który zajmie się przetwarzaniem danych wysłanych z formularza. Zawartość formularza jest przesyłana za pomocą protokołu HTTP do serwera HTTP i tam przetwarzana. Dane z formularza mogą być przesłane wg. jednej z dwóch metod: method="GET": dane są kodowane w postaci łańcucha znaków i doklejane do adresu URL podanego w atrybucie action w postaci par: nazwa atrybutu=wartość atrybutu, poszczególne atrybuty są odseparowane od siebie znakiem &, a spacje są reprezentowane przez znak +, np. method="POST": dane są przesyłane wewnątrz komunikatu protokołu HTTP

14 PHP PHP (ang. Hypertext Preprocessor) to język skryptowy ogólnego przeznaczenia, ale opracowany z myślą o aplikacjach WWW do dynamicznej generacji stron WWW po stronie serwera. PHP jest bardzo łatwy do opanowania w stopniu umożliwiającym tworzenie rzeczywistych aplikacji. Stąd m.in. jego bardzo duża popularność. Składnia PHP przypomina składnię języka C z elementami Perla. PHP jest szybki i oszczędza zasoby serwera. Jest szczególnie popularny w systemie Linux, w połączeniu z serwerem HTTP Apache, ale dostępny jest dla wielu systemów operacyjnych (w tym MS Windows) i serwerów HTTP. PHP jest rozwijany na zasadach Open Source. Jest darmowy, rozszerzalny, pojawiające się w nim błędy są szybko wykrywane i poprawiane. Wsparcie, rozwiązania typowych problemów i przykłady kodu można bez problemu znaleźć w Internecie.

15 PHP PHP jest językiem zaprojektowanym z myślą o zagnieżdżaniu w HTML. Przejście do trybu PHP jest określane jako wyskakiwanie z HTML. Cztery sposoby wyskakiwania z HTML zilustrowane na slajdzie: 1. Podstawowy i zalecany sposób zagnieżdżania kodu PHP. 2. Sposób, który umożliwia pracę z edytorami HTML, które nie wspierają PHP. 3. Składnia z krótkim znacznikiem otwierającym. Nie może być stosowana przy generacji dokumentów XML i XHTML ze względu na kolizję z instrukcjami przetwarzania XML. 4. Składnia wypisująca wartość zmiennej. Dwa pierwsze sposoby zagnieżdżania kodu PHP w HTML są zawsze automatycznie dostępne. Dwa ostatnie trzeba jawnie uaktywnić w pliku konfiguracyjnym PHP (php.ini).

16 PHP Serwer HTTP otrzymując żądanie, odwołujące się do pliku o rozszerzeniu.php wskazującym, że jest to dokument PHP, zleca przetworzenie tego pliku modułowi PHP. PHP przetwarzając plik, w niezmienionej postaci wysyła na wyjście kod HTML, a po napotkaniu znacznika przejścia w tryb PHP interpretuje zagnieżdżone instrukcje PHP. W przypadku przykładowego dokumentu test.php, w trybie PHP funkcją echo() wypisany na wyjście jest tekst Hi. PHP works!. Z prawej strony pokazany jest fragment dokumentu PHP w pełni ilustrujący swobodę przeplatania kodu HTML i PHP. W blokach kodu instrukcji if PHP następuje powrót do trybu HTML. Taki przeplot jest poprawny, ponieważ PHP traktuje tekst pomiędzy ?> i

17 PHP – zmienne Nazwy zmiennych w PHP poprzedzane są znakiem $. Wielkość liter w nazwach ma znaczenie. Podobnie jak w wielu innych językach skryptowych, w PHP zmiennych nie deklaruje się przed użyciem. Nie ma konieczności ustalania typu zmiennej, choć wewnętrznie PHP pamięta dla zmiennej jej typ. Zmienne mogą być typów prostych (boolean, integer, float, string) albo złożonych (tablice, obiekty). Typ zmiennych nie jest deklarowany, PHP ustala go na podstawie kontekstu, w miarę potrzeby dokonując automatycznych konwersji typów. U dołu slajdu pokazano przykład przypisania wartości zmiennej, a następnie jej wyświetlenia. Podwójny ukośnik rozpoczyna komentarz jednoliniowy.

18 PHP – łańcuchy znaków Łańcuchy znaków w PHP mogą być ograniczone apostrofami lub cudzysłowami. To jaki ogranicznik zostanie użyty ma znaczenie. W łańcuchach ograniczonych apostrofami nie są rozwijane odwołania do zmiennych, nie obowiązują też tzw. sekwencje specjalne jak np. znak nowej linii. W łańcuchach ograniczonych cudzysłowami przy ich przetwarzaniu napotkane nazwy zmiennych są zastępowane aktualną wartością, można też w nich stosować sekwencje specjalne. Różnice między obydwoma notacjami ilustruje przykład na slajdzie. PHP umożliwia konkatenację łańcuchów znaków operatorem kropki, posiada wsparcie dla wyrażeń regularnych, a także bogaty zestaw funkcji bibliotecznych do przetwarzania łańcuchów znaków.

19 PHP – tablice Tablica w PHP jest uporządkowaną mapą przyporządkowującą wartości do kluczy. Kluczami w tablicach PHP mogą być nieujemne liczby całkowite lub łańcuchy znaków. Tablice w PHP mogą bezpośrednio być używane jako tablice indeksowane liczbowo i tablice asocjacyjne, co ilustruje przykład na slajdzie. Można też wykorzystywać tablice jako listy, kolejki, czy stosy dzięki funkcjom bibliotecznym umożliwiającym np. dodawanie elementu na początku lub na końcu tablicy oraz usuwanie elementu z początku lub końca tablicy.

20 PHP – instrukcje sterujące Slajd pokazuje instrukcje sterujące dostępne w PHP. W miejscu gdzie spodziewana jest w danej konstrukcji składniowej instrukcja, może wystąpić pojedyncza instrukcja lub blok instrukcji w nawiasach klamrowych. Większość konstrukcji przypomina te znane z języka C. W instrukcjach pętli można używać instrukcji break i continue. Instrukcją, której nie ma w języku C a jest w PHP jest pętla foreach, umożliwiająca przejście po wszystkich elementach tablicy niezależnie od tego w jaki sposób jest ona indeksowana. Forma pętli foreach u dołu różni się od tej powyżej tym, że podczas iteracji po elementach udostępnia nie tylko wartość, ale również i klucz elementu.

21 PHP – zmienne predefiniowane PHP każdemu działającemu skryptowi udostępnia wiele zmiennych pochodzących z zewnątrz, czyli np. ze środowiska serwera, z formularzy HTML itp. Zmienne te są zorganizowane w tablice o nazwach rozpoczynających się od $_. Tablice te są superglobalne tzn. automatycznie dostępne w każdym zasięgu (każdym miejscu kodu PHP). Jest to istotne, gdyż zwykłe zmienne globalne w PHP nie są automatycznie widoczne w funkcjach i muszą być w nich zadeklarowane słowem kluczowym global. Superglobalne tablice PHP to: $GLOBALS – referencje do zmiennych globalnych skryptu (nazwa wyjątkowo bez _), $_SERVER – zmienne tworzone przez serwer, $_GET – zmienne dostarczone do skryptu metodą GET protokołu HTTP, $_POST – zmienne dostarczone do skryptu metodą POST protokołu HTTP, $_COOKIE – zmienne cookies dostarczone do skryptu, $_FILES – zmienne dostarczone do skryptu przez przesłanie plików do serwera (file upload) metodą POST protokołu HTTP, $_ENV – zmienne dostarczone do skryptu przez środowisko systemu operacyjnego, $_REQUEST – zmienne z tablic $_GET, $_POST i $_COOKIE zebrane w jednej tablicy, $_SESSION – zmienne aktualnie zarejestrowane jako sesyjne. W starszych wersjach PHP zmienne przychodzące z zewnątrz były automatycznie rejestrowane jako zmienne globalne w skrypcie bez pośrednictwa tablic. Później rozwiązanie to zarzucono ze względów bezpieczeństwa. Choć nie jest to zalecane, można takie zachowanie przywrócić włączając opcję konfiguracyjną PHP register_globals.

22 PHP – przetwarzanie danych z formularzy HTML Na slajdzie pokazano przykład prostej aplikacji ilustrującej przetwarzanie danych z formularzy HTML w PHP. Aplikacja składa się z formularza HTML (mnoz.html) służącego do wprowadzenia pary liczb, które mają być przemnożone i dokumentu PHP (mnoz.php), który ma za zadanie wykonać mnożenie po stronie serwera i wygenerować stronę HTML z wynikiem. Formularz HTML wywołuje skrypt PHP metodą GET (1), więc skrypt odczytuje parametry z tablicy superglobalnej $_GET (2). Nazwy parametrów odpowiadają oczywiście nazwom pól w formularzu (3 i 4).

23 PHP – sesje Sesja umożliwia zachowywanie danych na czas wykraczający poza obsługę jednego żądania. Protokół HTTP jest bezsesyjny, więc PHP emuluje sesję dla użytkownika. Sesja jest identyfikowana przez identyfikator propagowany domyślnie przez zmienną cookie lub zakodowany w adresie URL gdy zmienne cookie są niedostępne. Zmienne sesji są dostępne poprzez tablicę superglobalną $_SESSION. Rejestracja nowej zmiennej w sesji polega na dodaniu nowego klucza do tej tablicy. Dane sesji są inicjalizowane funkcją session_start(). Funkcja ta kontynuuje bieżącą sesję lub rozpoczyna nową gdy nie ma bieżącej sesji. Wszystkie dane sesji można usunąć funkcją session_destroy().

24 PHP – sesje Zmienne sesyjne mogą być wykorzystane do przekazywania informacji między kolejnymi wywołaniami tej samej strony (jak w przykładzie na slajdzie) lub różnych stron, pozwalając na implementację złożonej logiki aplikacji, obejmującej sekwencję żądań. Przykład przedstawiony na slajdzie zlicza odwiedziny użytkownika na stronie (w czasie bieżącej sesji). Znaczenie wyróżnionych fragmentów kodu jest następujące: 1. Rozpoczęcie lub kontynuacja sesji. Funkcja session_start() musi być wywołana przed wysłaniem jakiejkolwiek zawartości HTML. 2. Sprawdzenie czy zmienna sesyjna licznik jest ustawiona. 3. Jeśli zmienna sesyjna licznik nie jest ustawiona, jej wartość jest ustawiana na 0, gdyż oznacza to, że strona musiała być wywołana po raz pierwszy w sesji. 4. Jeśli zmienna sesyjna licznik jest ustawiona, jej wartość jest zwiększana o jeden. 5. Wyświetlenie wartości zmiennej sesyjnej licznik.

25 PHP – organizacja kodu aplikacji WWW W przypadku tworzenia w PHP złożonych aplikacji, zawierających duże ilości wykonywalnego kodu, pojawia się się potrzeba sensownej organizacji kodu. PHP umożliwia programowanie strukturalne poprzez tworzenie funkcji, a od wersji PHP 4 również programowanie obiektowe oparte o klasy. Mechanizmy programowania obiektowego w wersji PHP 5 obejmują m.in. dziedziczenie, konstruktory, destruktor, składowe statyczne i możliwość specyfikowania widzialności składowych (public, protected i private). Zdefiniowane w aplikacji funkcje i klasy mogą być zachowane w odrębnych plikach i włączane tam, gdzie są potrzebne instrukcją include(). Instrukcja ta włącza fragment kodu źródłowego (HTML i/lub PHP), umożliwiając również np. włączanie standardowych nagłówków i stopek.

26 PHP – organizacja kodu aplikacji WWW Znaczenie wyróżnionych fragmentów kodu ilustrującego programowanie obiektowe w PHP jest następujące: 1. Definicja klasy Konto. 2. Definicja zmiennej prywatne klasy reprezentującej numer konta, z podaniem wartości początkowej. 3. Definicja funkcji składowej klasy (metody) wyświetlającej numer konta. 4. Utworzenie obiektu (instancji) klasy Konto. 5. Wywołanie metody utworzonego obiektu. 6. Przypisanie wartości null do zmiennej reprezentującej obiekt. Ponieważ jest to jedyne odwołanie do obiektu, to obiekt jest niszczony.


Pobierz ppt "Aplikacje WWW Prowadzący: Dr inż. Tomasz Molik Materiały dostępne na stronie: Hasło:..........."

Podobne prezentacje


Reklamy Google