Systemy zarządzania relacyjnymi bazami danych (Dostęp do baz danych w Internecie) Wykł. prof. W. Khadzhynov p. 310 _____________________________________________________________ _________ Literatura: 1. Scott Mitchell. Active Server Pages 3.0 , SAMS Publishing, Helion, Warszawa, 2001. 2. Greg Buczek. ASP Kompedium programisty HELION, 2002. 3. C.J.Date. Wprowadzenie do systemów baz danych, Klasyka Informatyki,Wydawnictwa Naukowo-Techniczne, Warszawa, 2000. 4. Maria Chałon. Systemy baz danych. Wprowadzenie, Oficyna Wydawnicza Politechniki Wrocławskiej,Wrocław 2001. 1 Technologii dostępu do baz danych w Internecie .......................................... 4 Serwery WWW ............................................................................................... 5 Model programowania klient-serwer aplikacji w Internecie. ......................................... 5 Serwery WWW firmy Microsoft .................................................................................. 11 Personal WEB Server ................................................................................................... 13 Internet Information Server (IIS) .................................................................................. 16 Przykład strony ASP ..................................................................................................... 18 Podstawy HTML ........................................................................................... 19 Podstawowe znaczniki: <html>, <head>, <body> ....................................................... 20 Znaczniki informacyjne i formatowania tekstu ............................................................ 21 Adresacja....................................................................................................................... 24 Grafika .......................................................................................................................... 24 Język VBScript ............................................................................................. 25 Typy danych.................................................................................................................. 25 Funkcję określenia typu danych.................................................................................... 27 Rekomendacji dotyczące stylu tworzenia nazw zmiennych ....................................... 29 Operatory dostępne w VBScript ................................................................................... 30 Operator przypisania ................................................................................................. 30 Operatory matematyczne .......................................................................................... 30 Struktury sterujące języka VBScript ............................................................................. 31 Logika warunkowa.................................................................................................... 31 Logika pętli ............................................................................................................... 33 Procedury i funkcji ........................................................................................................ 37 Funkcje wbudowane ..................................................................................................... 38 Wbudowane obiekty ASP ............................................................................. 39 Wykorzystanie formularzy ........................................................................... 43 Kolekcja ServerVariables obiektu Request .................................................. 49 Wykoryzstanie cookies ................................................................................. 51 Przechowywanie informacji w obiektach Session oraz Application ............ 53 Dostęp do plików i folderów ........................................................................ 58 Wykorzystanie obiektu FileSystemObject ................................................................... 59 Wykorzystanie obiektów File i Folder .......................................................................... 62 Otwieranie plików ......................................................................................................... 66 Stworzenie plików ........................................................................................................ 69 Odczytywanie zawartości plików ................................................................................. 70 Zapisywanie plików na serwerze .................................................................................. 71 Dostęp do baz danych ................................................................................... 73 Standard ODBC (Open Database Connectivity)........................................................... 73 Uniwersalna strategia dostępu OLE DB ....................................................................... 75 Dostęp do baz danych przy użyciu ADO ...................................................................... 77 Otwieranie oraz zamykanie połączenia z bazą danych(Obiekt CONNECTION) .... 77 Obiekt RECORDSET ............................................................................................... 81 2 Użycie pliku adovbs.inc ............................................................................................ 87 Wykorzystanie metody EXECUTE obiektu CONNECTION .................................. 87 Sterowanie transakcjami ........................................................................................... 90 Filtrowanie rekordów w obiekcie Recordset ............................................................ 92 Obiekt COMMAND ................................................................................................. 94 Grupowa modyfikacja rekordów bazy danych ......................................................... 97 Wstawianie rekordów do bazy danych ..................................................................... 99 Dodawanie rekordów do bazy danych przez formularza ........................................ 103 Realizacja skryptów na stronie klienta ....................................................... 106 Zastosowania obiektów ASP oraz ADO dla połączenia z bazą danych ..... 110 Przesyłanie plików pomiędzy klientem a serwerem................................... 113 Przykład projektu aplikacji bazodanowej w środowisku INTERNET ....... 124 Opis procesów biznesowych. ...................................................................................... 124 Opis struktury bazy danych ........................................................................................ 124 Opis kodu źródłowego stron aplikacji ........................................................................ 125 Przykład realizacji. Baza danych dokumentów w środowisku Internet .... 130 Przykład realizacji. Czasopismo elektroniczne. ....................................... 139 Wymogi do projektu aplikacji bazodanowej .............................................. 148 Pytania kontrolne po kursu „Systemy zarządzania relacyjnymi bazami danych”. ...................................................................................................... 149 3 Technologii dostępu do baz danych w Internecie Ostatnio można zaobserwować wzrost prezentacji różnego typu informacji w Internecie. Możliwość prezentacji różnego typu materiałów na graficznych stronach WWW przyczyniła się do integracją baz danych z serwerami WWW. Ma to podstawowe znaczenie przy budowie szerokiej gamy usług internetowych i intranetowych ( intranetowa sieć to jest sieć Internet, która działa tylko w zasięgu przedsiębiorstwa) . Integracja baz danych z serwerami WWW dozwoli otrzymać następne możliwości: Wyszukiwanie tekstowej informacji w archiwach danych; Prezentację tabel z danymi tekstowymi i liczbowymi poprzez systemy ogłoszeń; Stworzenia i prezentację systemów śledzenia zamówień; Stworzenia i prezentację elektronicznych multimedialnych katalogów; Realizacja sklepów internetowych. Internet ma największy i praktyczne nieograniczony zasięg. Użytkownik może w nim korzystać z wielu usług. Bardzo prężnie rozwijają się usługi, dające możliwość zaprezentowania swojej informacji na stronach WWW. Ogromną zaletą jest niezależność od stosowanej platformy sprzętowej i systemowej. WWW stwarza możliwość prezentacji swoich danych oraz odczytywania informacji udostępnianych przez ogromną liczbę jej użytkowników. Aby przedstawić dane w WWW, trzeba stworzyć dokument i umieścić go na serwerze WWW. Odczytywanie odbywa się przy pomocy specjalnych programów nawigacyjnych zwanych przeglądarkami. Ich zadaniem jest nawiązanie komunikacji z serwerem i odpowiednia interpretacja znajdujących się tam dokumentów. Na potrzeby prezentacji dokumentów w sieci Internet powstał język programowania HTML(ang. HyperText Markup Language). Dokument HTML jest zwykłym plikiem tekstowym, w którym znajdują się polecenia HTML. Oznacza to, że w dokumencie jest opisywana struktura a nie wygląd, który zależy od używanego przez klienta programu przetwarzającego, tzw. przeglądarki. Wynika z tego, że dokument taki można utworzyć za pomocą najprostszego edytora tekstów. Jednak na rynku pojawiło się już wiele specjalizowanych edytorów, które wydatnie ułatwiają konstruowanie dokumentu, wspomagając wprowadzenie poleceń. Internet miał początkowo służyć udostępnianiu wielu danych w formie ściśle sprecyzowanej przez standardy HTML. Kolejnym krokiem w rozwoju 4 Internet była możliwość przedstawienia zawartości baz danych bezpośrednio na stronach WWW. Dzięki temu, od odwzorowywania czysto statycznych stron HTML, Internet teraz dynamiczne aktualizuje wiadomości, które są zawarte w bazach danych. Standard HTML przy tym nie uległ wielkim przeobrażeniom. Serwery WWW Dla udostępnienia użytkownikom danych, niezależnie od tego czy będą to dokumenty w formacie HTML, czy informacje zawarte w bazach danych, inne pliki, teksty, obrazki czy animacje, jest niezbędne korzystanie usługami serwera WWW. Serwer WWW to komputer z oprogramowaniem, na którym są przechowywane wszystkie strony wchodzące w skład witryny internetowej i wyposażony w specjalne oprogramowanie umożliwiające przesyłanie tych stron do przeglądarek, które ich żądają. Oprogramowanie serwera WWW sprawia, że osoba korzystająca go usługami może skorzystać z udostępnionych zasobów, nie wnikając w szczegóły dotyczące ich lokalizacji i metod dostępu do nich. Jedyną istotną kwestią jest uwzględnienie ich w zasobach przez administratora. Serwer WEB, to znaczy, że bez względu na to skąd łączy się użytkownik do serwera WWW to jest narzędzie, które zapewni przezroczystość dostępu do resursów, nie musi on dokładnie wiedzieć gdzie znajdują się potrzebne emu dane. Użytkownik pragnąc skorzystać z zasobów znajdujących się na serwerze generuje żądanie przesłania danych. Serwer odbiera zgłoszenie przeglądarki, przesyła żądany plik i kończy połączenie. Model programowania klient-serwer aplikacji w Internecie. W pierwszy roki swego istnienia Internet służył jako medium komunikacyjne wykorzystywane przez członków organizacji rządowych i edukacyjnych. Początkowo Internet służył jedynie entuzjastom jako miejsce tworzenia „stron domowych”, jednak wraz ze wzrostem ilości osób korzystających z niego, stał on źródłem wszelkiego typu informacji. Internetem teraz zaczęły interesować liczne firmy sprzedające towary i usługi. Firmy te nie istnieją fizyczno, a jedynie wirtualnie. Na przykład, można kupić oprogramowanie, komputer czy inne towary przez witryny internetowe firmy sprzedawca . W początkowym okresie istnienia WWW dla tworzenia stron WWW był wykorzystany język HTML. Strony WWW byli statycznymi. Jednak dziś, informacja na stronach bardzo szybko staje przestarzałą oraz ilość danych osiąga dużych rozmiarów. Rozpatrzymy technologię obrabiania informacji w Internet. 5 W modelu klient-serwer dwa komputery współpracują ze sobą w celu wykonania określonego zadania. Komputer pełniący rolę klienta żąda potrzebnych informacji od komputera pełniącego rolę serwera. Serwer zwraca informacje, na których klient może operować. W Internecie klientami są przeglądarki WWW. Podczas wyświetlania w przeglądarce statycznej strony WWW realizowane są następujące czynności (Rys.1): 1. Klient (czyli przeglądarka) szuka na wyznaczonym serwerze DNS (Domain Name Server) adres IP komputera po nazwisku domen, określonych w pierwszej części wirtualnego adresu URL (Uniform Resource Locator) (np.: www.ie.tu.koszalin.pl) 2. Klient lokalizuje serwer WWW określony za pomocą fizycznego IP adresu (np.199.170.179.237) oraz posyła adres potrzebnej WEB – strony, która musi być rozmieszona na serwerze WWW. 3. Web – serwer czyta adres strony, szuka ją i posyła do klienta. 4. Klient odbiera kod HTML-a przesłany z serwera, a następnie analizuje go i wyświetla. Serwer WWW działa w tym trybie pasywnie, nie wykonuje żadnych czynności, oczekując na nadsyłanie przez klientów żądania przesłania statycznych stron WWW. Po otrzymaniu takiego żądania serwer przesyła stronę klientowi i znów przechodzi w stan oczekiwania na następne żądania. Przedstawiona powyżej sekwencja czynności umożliwia przesyłanie klientom wyłącznie statycznych stron WWW. Dla przechowywania danych na stronach internetowych wykorzystają bazy danych. Dostęp do baz danych potrzebuje bardziej aktywną roli serwera. Dla dynamicznego tworzenia stron internetowych oraz dostępu do danych istnieją różne technologii od różnych producentów. Główne pomiędzy nimi to są: 1. Active Server Pages – (ASP) (aktywne strony serwera) 2. PHP 3. Java Server Pages. ASP są rozwiązaniem firmy Microsoft. Dokumenty ASP składają się z dwóch elementów: kodu programu oraz kodu HTML. Kod programu może być napisany w kilku różnych językach skryptowych. Język skryptowy to ściśle określona składnia poleceń przeznaczonych do uruchamiania na komputerze. Program składający się z poleceń zapisanych w określonym języku skryptowym jest określany mianem skryptu. 6 DNS-Server 1 WEB-Server 2 HTML Pages 4 WEB Browser (klient) 3 FIG 1. 7 Bazowym językiem skryptowym ASP może być VBScript lub JScript. Najwięcej rozpowszechnianym językiem skryptowym w ASP jest VBScript. Będziemy rozpatrzyć przykłady realizacji kodów skryptowych za dopomogą VBScript. Strony ASP to są kombinacja kodu HTML oraz skryptu VBScript. WWW musi przetworzyć tą kombinację do kodu HTML, potem przesłać kod HTML do klienta. Poniżej przedstawiona została sekwencja czynności wykonywanych podczas zgłoszenia żądania dostępu do strony ASP (Rys.2): 1. Klient (czyli przeglądarka) szuka na wyznaczonym serwerze DNS (Domain Name Server) adres IP . 2. Klient lokalizuje serwer WWW określony za pomocą IP - adresu oraz posyła adres potrzebnej WEB – strony(HTML lub ASP), która musi być rozmieszona na serwerze WWW. 3. Web – serwer odczytuje stronę ASP i przetwarza umieszczone w niej kody skryptów. 4. Po całkowitym przetworzeniu strony ASP przez Serwer wynikowy kod HTML jest przesyłany do klienta. 5. Klient odbiera kod HTML-a przesłany z serwera, a następnie analizuje go i wyświetla. Klient nie w stanie zauważyć żadnej różnicy pomiędzy stroną ASP a statyczną stroną WWW, gdyż w obu przypadkach otrzymuje z serwera wyłącznie kod HTML. 8 DNS-Server 1 WEB-Server 2 WEB Browser (klient) 3 HTML Pages 5 ASP Pages 4 ASP Processing FIG 2. 9 Przetwarzając stronę ASP serwer interpretuje i wykonuje umieszczony w niej program. Kod tego programu nie jest przesyłany do klienta. Żeby serwer mógłby określić czy klient żąda przesłania statycznego dokumentu HTML, czy strony ASP, trzeba nadać odpowiednie rozszerzenie pliku tego dokumentu: *.htm lub *.asp. Przykład 1. Rozpatrzymy prosty kod ASP wyświetlający aktualną godzinę (listing1). Listing 1. 1. <%@ Language=VBScript %> 2. <HTML> 3. <BODY> 4. Aktualna godzina to: 5. <% Response.Write Time()%> 6. </BODY> 7. </HTML> Przy przetwarzaniu tego kodu na serwerze ten kod będzie mieć następny wygląd: Listing 1a. 1. <HTML> 2. <BODY> 3. Aktualna godzina to: 4. 18:16:12 5. </BODY> 6. </HTML> W listingu 1 kod skryptu ASP (czyli prosto kod ASP) jest zapisany pomiędzy znaczkami <% oraz %>. Kiedy zostaje zgłoszone żądanie przesłania strony ASP, serwer WWW przed przesłaniem jakichkolwiek wyników do klienta, wykonuje wszystkie fragmenty kodu zapisane pomiędzy tymi znacznikami. Kod przedstawiony na listingu 1 prawdopodobnie bardzo przypomina normalny dokument HTML. Kody obiektów oraz instrukcji HTML są umieszczone na stronie ASP w liniach : 2.,3.,4.,6. oraz 7. Kod ASP jest umieszczony w liniach 1 oraz 5. Linia numer 1 informuje serwer WWW o tym, jaki język skryptowy będzie wykorzystany na konkretnej stronie. Do określenia języka skryptowego używanego na danej stronie ASP służy dyrektywa @ Language=VBScript. Linia 5 kodu ASP wyświetla aktualny czas. Funkcja Time() jest funkcją języka VBScript. Metoda Response.Write przesyła wyniki wywołania 10 funkcji Time() do klienta. Obiekt Response jest wewnętrznym obiektem ASP. Dla uruchomienia pliku listing 1 trzeba wykonać następne kroki: 1. Zainstalować na komputerze serwer WWW firmy Microsoft(Personal WEB Server lub Internet Information Server). 2. Utworzyć zasobami serwera WWW katalog aspwyklady. 3. Utworzyć plik o nazwie aktualnyczas.asp i umieść go w katalogu aspwyklady serwera. 4. Uruchomić przez przeglądarkę ten plik. W tym celu mogą być wykorzystywane następne adresy URL: http://had/aspwyklady/aktualnyczas.asp http://localhost/aspwyklady/aktualnyczas.asp http://127.0.0.1/aspwyklady/aktualnyczas.asp Listing 2 zawiera źródłowy kod HTML otrzymany przez przeglądarkę. Przetworzenie poleceń ASP powoduje wygenerowanie kodu HTML. Do przeglądarki przesyłany jest wyłączne kod HTML. Serwery WWW firmy Microsoft Serwer WWW umożliwiający obsługę stron ASP przetwarza żądaną stronę zanim prześle ją do klienta. Podczas tego przetwarzania wykonywane są następujące czynności: 1. Kod programu umieszczony na stronie ASP jest interpretowany przez serwer. 2. Serwer WWW informuje przeglądarkę o fakcie przesyłania informacji w postaci kodu HTML, a następnie przesyła wyniki wykonania strony ASP. Przeglądarka odczytuje nadesłany kod HTML i wyświetla go. Jeśli nie jest zainstalowany serwer WWW , to te czynności nie będą realizowane. Technologia ASP jest realizowana w następnych serwerach WWW firmy Microsoft: 1. Personal Web Server ( w skrócie PWS) 2. Internet Information Server (w skrócie IIS). Personal Web Server jest „okrojona” wersję profesjonalnego serwera WWW firmy Microsoft. Ten produkt jest przeznaczony do współpracy z systemami operacyjnymi: Windows 95, Windows 98, oraz Windows NT Workstation. Personal Web Server można bezpłatnie pobrać z witryny WWW firmy Microsoft. Internet Information Server (IIS) jest profesjonalnym serwerem WWW. Ostatnia wersja tego serwera nosi numer 5.0 i jest rozprowadzana wraz z systemem WINDOWS 2000. Technologia ASP 3.0 jest właśnie fragmentem tego serwera i wraz z nim jest automatyczne instalowana. 11 W WINDOWS NT SERWER (lub WORKSTATION) można korzystać z serwera IIS 4.0. Ten serwer jest pakiecie „WINDOWS NT OPTION PACK”, który można bezpłatnie pobrać z witryny WWW firmy Microsoft. Serwer IIS 4.0 nie pozwala na korzystanie z technologii ASP 3.0., automatyczne jest instalowana obsługa ASP 2.0. Przy instalacji systemu operacyjnego komputera musi być instalowany protokół TCP/IP. Każdy komputer ma IP – adres oraz swoje nazwisko, które odpowiada temu IP –adresu. Na rys.3 jest pokazana zakładka „Identifikation” okna „Network” paneli sterowania komputera. Pole „COMPUTER NAME” zawiera nazwisko komputera. Rys.3 Zakładka „protokół” zawiera IP adres komputera (rys.4.) 12 Adresem wirtualnym nazywa się katalog oraz nazwę pliku żądanego za pośrednictwem adresu URL. Serwer WWW musi odwzorować adres wirtualny na adres fizyczny. Adresem fizycznym nazywa się jednoznaczną ścieżkę dostępu do konkretnego pliku. Katalog wirtualny to jest wskaźnik na katalog fizyczny. Rys.4 Personal WEB Server Po wybraniu standardową instalację Personal WEB Servera na ekranie wyświetlane jest okno dialogowe umożliwiające określenie katalogu, który będzie używany jako domyślny katalog macierzysty serwera (home directory). Można podać dowolną ścieżkę adresu fizycznego, jednak 13 zwyczajowo przyjęło się że adresem fizycznym korzenia jest katalog c:\InetPub\wwwroot. Ten adres fizyczny jednoznaczne odpowiada nazwisku komputera serwera oraz go IP adresu. Wszystkie zapytania stron WWW do serwera protokół HTTP będzie szukać w katalogu fizycznym InetPub\wwwroot. To znaczy, że wszystkie strony WWW musi być tam rozmieszone. Po wybraniu adresu fizycznego korzenia program instalacyjny zaczyna kopiować na komputer wszystkie konieczne pliki. Kiedy instalacja zostanie zakończona, trzeba będzie ponownie uruchomić komputer. Po uruchomieniu komputera trzeba kliknięć na ikonką PWM(Personal WEB Manager). Okno PWM składa się z pięciu (albo trzech w innych wersjach) paneli. Na rys.5. jest pokazane panel „MAIN” już zainstalowanego Personal WEB Servera, gdzie jest wyświetlone nazwisko komputera oraz fizyczny adres katalogu macierzystego. Rys.5 14 Następne adresy wirtualne : http:// had/aspwyklady/aktualnyczas.asp http:// had/default.asp htpp:// had/magazyn/default.htm zostaną zamienione przez serwer WWW na następujące adresy fizyczne: d:\Inetpub\wwwroot\ aspwyklady/aktualnyczas.asp d:\Inetpub\wwwroot\default.asp d:\Inetpub\wwwroot\magazyn\ default.htm Oprócz nazwiska, które jest wyznaczone w oknie MAIN (rys.5), każdy komputer WINDOWS rozpoznaje nazwisko „LOCALHOST”, mające IP adres 127.0.0.1. To jest adres specjalny po któremu komputer odwoła do sobie. Można wykorzystywać następny adres URL dla odwołania do stron na własnym komputerze: http:// localhost/aspwyklady/aktualnyczas.asp http:// 127.0.0.1/aspwyklady/aktualnyczas.asp Serwer można zatrzymać, klikając przycisk STOP. Jeśli przeglądarka będzie próbować wyświetlić stronę w momencie, gdy serwer WWW jest nieczynny, to zostanie wyświetlony komunikat o niemożliwości zestawienia połączenia z serwerem. Panel MAIN zawiera także informację statystyczne o aktywności serwera. Można wyświetlić następujące informacje: ilość żądań na godzinę, ilość żądań na dzień, ilość gości na dzień oraz ilość gości na godzinę. Bardzo przydatnym panelem w oknie dialogowym PWM jest panel o nazwie Zaawansowanie (Adwanced), przedstawiony na rys. 6. W panele tym można modyfikować właściwości dotyczące całej witryny. Pierwsza z nich o nazwie DEFAULT DOCUMENTS określa, czy serwer ma wyświetlać dokument domyślny w sytuacji, gdy użytkownik nie określi adresu dokumentu w zadaniu. Jeśli dokumentami domyślnymi będą pliki o nazwiskach Default.htm oraz Default.asp , to gdy użytkownik poda adres URL o postaci: http: // had/ serwer sprawdzi, czy w katalogu głównym serwera jest umieszczony plik o nazwie Default.htm lub Default.asp . Jeśli plik nie zostanie znaleziony, to serwer zwróci do przeglądarki błąd o numerze 404 oznaczający, że poszukiwanego pliku nie można było odnależć. Kolejną opcją dostępną na panelu Zaawansowanie (Adwanced) jest opcja Zezwalaj na przeglądanie katalogów (Allow Directory Browsing). Jeśli opcja ta zostanie zaznaczona I użytkownik poda adres URL, w którym nie będzie określona nazwa pliku oraz jeśli serwer nie odnajdzie plików, to w 15 przeglądarce zostanie wyświetlona zawartość podanego katalogu. Standardowa ta opcja jest wyłączona. Opcja Save Web Site Aktivity Log (Zapisuj dziennik aktywności Web stron) tworzy raporty, dotyczące pracy serwera. Rys.6 Internet Information Server (IIS) Internet Information Server (IIS) jest profesjonalnym serwerem WWW. IIS4.0 może być instalowany w Windows NT, IIS 5.0 – w Windows 2000. IIS składa się nie tylko z samego serwera WWW lecz także z kilku innych elementów, takich jak serwer FTP oraz SMTP. Aby wybrać jakie elementy mają zostać zainstalowane, trzeba zaznaczyć te komponenty przyciskiem Details. Jeśli do edycji stron WWW trzeba korzystać z programów Microsoft InterDev lub FrontPage, to trzeba zainstalować także komponenty o nazwie FrontPage 2000(98 dla NT) Server Extensions. Głównym narzędziem IIS jest program Internet Services Manager . Ten program można uruchomić z menu startowego. Na rys 7. Przedstawione 16 zostało okno programu Internet Services Manager (ISM). W Windows NT ten program ma nazwisko Microsoft Management Console (MMC), w Windows 2000 – IIS. Internet Services Manager pozwala na konfiguracje serwera WWW, serwera FTP, usług SMTP oraz Microsoft Transaction Servera. Program ten wyświetla strukturę katalogów wirtualnych serwera WWW. Rys. 7 Konfiguracja opcji korzeniowego węzła WWW jest możliwa po kliknięciu Default Web Site prawym przyciskiem myszy i wybraniem opcji Properties z menu kontekstowego (rys.8). Po wybraniu tej opcji na ekranie zostanie wyświetlone okno dialogowe WEB Site Properties, które zawiera wiele zakładek, na których dostępnych jest bardzo dużo różnego rodzaju opcji. Zakładka Home Directory (katalog macirzysty) zawiera różne opcji. W opcję Local Path (ścieżka lokalna) jest podana ścieżka dostępu adresu fizycznego korzenia WWW. Poniżej opcji Local Path umieszczona jest grupa pól wyboru. Opcje te są takie same jak opcje dostępne w PWS. 17 Rys.8 Przykład strony ASP Po zainstalowaniu serwera WWW można tworzyć strony ASP i zapisywać je w katalogu głównym lub w go podkatalogach. Przykład 2. Przepuśćmy, że na stronie WWW trzeba wyświetlić komunikaty o treści zależnej od pory dnia. Do godziny 19.00 musi być wyświetlony komunikat „Dzień dobry”, a po niej – „Dobry wieczór”. Na listingu 2 został przedstawiony kod strony ASP wyświetlającej komunikat o treści zależnej od pory dnia. Listing 2(Komunikat1.asp). 1. <%@ Language=VBScript %> 2. <% Option Explicit %> 18 3. <HTML> 4. <BODY> 5. Teraz jest <% =Time() %> 6. <P> 7. <% 8. If DatePart ("h",Time()) >= 19 then 9. ' czy jest wieczor 10. Response.Write "Dobry wieczor!" 11. Else 12. ' Czy jest dzien 13. Response.Write "Dzien dobry!" 14. End If 15. %> 16. </BODY> 17. </HTML> Aby zobaczyć wyniki wykonania powyższego skryptu, trzeba stworzyć stronę ASP i nadać jej nazwę komunikat1.asp , po tym zapisać w katalogu wirtualnym(lub głównym) serwera. Następne umieścić w niej kod podany na listingu i wyświetlić stronę za pomocą przeglądarki. Przyjrzyjmy się dokładniej kodowi przedstawionemu na listingu 2. Linia1 zawiera dyrektywę @ Language, informującą serwer WWW, jaki język skryptowy jest domyślnie używany na danej stronie. Linia 2 zawiera instrukcję Option Explicit, dzięki której wszystkie zmienne muszą być jawnie deklarowane. Linię 3,4,6,16 oraz 17 zawierają kody HTML. Linia 5 zawiera tekst „Teraz jest” który będzie wyświetlony oraz funkcję języka VBScript Time(), która wyznacza aktualny czas. Znak „=” ma takie same działanie, jak wywołanie metody Response.Write – czyli powoduje przesłanie informacji do przeglądarki. Linie od 7 do 15 stanowią blok kodu ASP umieszczony pomiędzy znacznikami <% oraz %>. Linia 8 zawiera instrukcję IF. Dzięki niej można sprawdzić aktualny czas systemowy I określić, czy jest dzień, czy wieczór. Funkcja DatePart() jest wykorzystywana dla pobrania aktualnej godziny. Podstawy HTML HTML – to jest skrót od Hypertext Markup Language . HTML dokument zawiera kod dokumentu oraz kody formatowania. Przeglądarka interpretuje te kody formatowania i odwzorowuje stronę WEB. Kody formatowania są zanurzone w znaczniki lub deskryptory HTML. 19 Na etapie planowania witryn sieciowych należy poświęcić czas na zastanowienie się nad tym, kto będzie czytał tworzone strony, w jaki sposób odbiorcy widzą i rozumieją informacje, jakiego typu komputerów używają, jakie mają oprogramowanie do przeglądania sieci i jak szybkie są ich połączenia. Po określeniu typu odbiorcy trzeba zastanowić się nad komunikatami, które mają być mu przesyłane za pośrednictwem witryny oraz nad najlepszymi sposobami ich przekazywania. Projektując witrynę, projektant musi podjąć decyzję, jak spełnić bardzo różne oczekiwania odbiorców. Najwięcej rozpowszechnione znaczniki są przedstawione w następnej tabeli. Deskryptor (znacznik) <HR> <BR> <B> oraz </B> <I> oraz </I> <U> oraz </U> <center> oraz </center> <A HREF =url> tekst odwołania </A> <!-- komentarz --> <IMG SRC = plik ALT = tekst> <HTML> oraz </HTML <HEAD> oraz </HEAD> <BODY> oraz </BODY> <TABLE> oraz </TABLE> <TR> oraz </TR> <TD> oraz </TD> Opis Rozdzielenie poziomowe Koniec linii Czcionka typu „BOLD” Czcionka typu „ITALIC” Czcionka typu „UNDERLINE” Centrowania tekstu Wstawi odwalania do hyper tekstu (Hyper reference) Znaczniki komentarza Wstawi zdjęcie Początek oraz koniec dokumentu Początek oraz koniec nagłówku dokumentu Początek oraz koniec ciała dokumentu Początek oraz koniec tabeli Wewnątrz znacznika <TABLE> wyznaczy linię Wewnątrz znacznika <TR> wyznaczy kolumnę Podstawowe znaczniki: <html>, <head>, <body> W HTML'u zdefiniowane są trzy główne znaczniki opisujące ogólną strukturę strony: 1. Znacznik <html>, </html> mówi o tym, że zawartość odczytywanego w danej chwili pliku o rozszerzeniu html lub htm jest kodem, napisanym 20 właśnie w HTML'u. Pomiędzy początkowym <html> a końcowym znacznikiem </html> powinna znaleźć się cała zawartość kodu. 2. Znacznik <head>,</head> wyznacza odpowiednio początek i koniec nagłówka strony. W jego obrębie może znajdować się kilka innych znaczników (np.<title>). Nie można umieszczać w nim treści strony. 3. W obrębie znaczników <body>, </body> znajduje się cała zawartość witryny czyli tekst, łącza, grafika itp. Znaczniki informacyjne i formatowania tekstu Tytuł Znacznik <title> znajduje się zawsze wewnątrz nagłówka strony. Ma on za zadanie skrótowe opisanie jej treści: Nagłówki Służą do wyróżniania tytułów poszczególnych działów. W opisywanym języku jest zdefiniowane sześć poziomów nagłówków (od H1 do H6). Różnią się one miedzy sobą wielkością i atrybutami czcionki. Użyć nagłówka można umieszczając pomiędzy znacznikiem <Hn> i </Hn> tekst przeznaczony do wyróżnienia (n jest wartością z przedziału od 1 do 6). Akapity Początek akapitu wyznacza znacznik <p> zaś jego koniec </p>. Listy Istnieje kilka rodzajów list, które mają niektóre elementy wspólne: Cała lista zawsze jest objęta przez znaczniki: początkowy i końcowy odpowiednio dla jej rodzaju. Każdy jej element posiada swój własny znacznik Istnieją następujące rodzaje list: Listy wypunktowane W tym typie listy, poszczególne jej podpunkty rozpoczynają się od <li>. Cała lista jest umieszczona pomiędzy znacznikami. <ul> i </ul>. Można również określić wygląd wypunktowania, poprzez zdefiniowanie parametru (type). Wartość (disc) tego atrybutu spowoduje wyświetlenie kółka, zaś jego wartość (square) - kwadratu. Parametr (type) wyznacza się przy określaniu znacznika początkowego np: <ul type="square"> Listy menu Ograniczają je znaczniki <menu> oraz </menu>. Elementy poprzedzane są znacznikiem <li>. Ten rodzaj list jest bardzo podobny do 21 serii akapitów z tą różnicą, że niektóre przeglądarki potrafią go inaczej sformatować. Listy numerowane Objęte są znacznikami głównymi <ol> i </ol>, a każdy podpunkt listy podobnie jak powyżej rozpoczyna się od znacznika <li>. Przeglądarka internetowa wyświetlając jej elementy numeruje je kolejno. Można określić własny schemat numeracji za pomocą atrybutu (type) np. <ol type="1"> - 1.2.3.4 <ol type="a"> - a,b,c,d <ol type="A"> - A,B,C,D <ol type="I"> - I,II,III,IV Listy definicji Cała lista definicji objęta jest znacznikami <dl> i </dl>. Każdy jej podpunkt składa się z dwóch części oznaczonych w następujący sposób: <dt> - znacznik pojęcia <dd> - znacznik definicji Listy katalogów Stworzone zostały dla krótszych elementów niż listy menu i są wyświetlane w postaci kolumn. Są one zlokalizowane w obrębie znaczników <dir> i </dir>, a każdy element poprzedzony jest znacznikiem <li> Kolor tła Żeby zmienić kolor tła strony WWW, należy jego nazwę lub wartość przypisać atrybutowi (bgcolor) wewnątrz znacznika <body> np. <body bgcolor=#ff0000"> <body bgcolor=red> Kolory na stronie Kolor tekstu i łączy Do zmiany kolorów tekstu i połączeń używane są atrybuty: 22 (text) -określa kolor każdego fragmentu tekstu na stronie, który nie jest połączeniem (link) -określa kolor połączeń, które nie zostały jeszcze uruchomione (vlink) -określa kolor tekstu połączenia, które zostało chociaż raz użyte (alink) -określa kolor aktywnego połączenia Powyższe atrybuty należy umieszczać wewnątrz znacznika <body>: <body text=green vlink=#6666ff> Łącza internetowe Do tworzenia łączy internetowych na inne strony WWW służy znacznik <a>i </a>. Może on być również używany do tworzenia specjalnych miejsc wewnątrz stron, do których prowadzą inne połączenia. Łączenie dwóch stron Dla uzyskania połączenie na inną stronę należy w obrębie początkowego znacznika łącza <a> zdefiniować parametr (href.) (przypisać mu dany plik) <a href="Index.html"> Łącze</a>. W celu uzyskania połączenia z jednej strony internetowej na inną umieszczoną w sieci WWW, atrybutowi (href) należy przypisać pełen adres <a href="http://www.interia.pl>Portal</a>. Tworzenie i użycie odnośników Odnośniki to specjalnie oznaczone miejsca w dokumencie HTML, do których można tworzyć połączenia. Odnośniki są wykorzystywane nie tylko do tworzenia połączeń wewnątrz tej samej strony, ale także do innych stron. Do tworzenia odnośników używany jest znacznik <a> z określonym atrybutem (name) <a name="Paragraf1">Paragraf nr 1</a>. Jeśli pożądane jest połączenie w ramach tej samej strony, należy parametrowi href przypisać etykietkę odnośnika, pod którą dany odnośnik ma skoczyć np href=#Paragraf1. Poniżej przykład zdefiniowania łącza: <a href=#Paragraf1>Paragraf nr 1</a>. Łączenie dwóch stron do odnośnika Aby utworzyć łącze do innej strony w określone odnośnikiem miejsce, należy parametrowi href przypisać nazwę pliku, a po haszu także etykietkę jego odnośnika. Tego typu połączenie mówi przeglądarce, aby po wczytaniu strony rozpoczęte było jej wyświetlanie w części, na którą wskazuje etykietka na łączu <a href="jakasstrona.html#Paragraf1">Paragraf nr 1 na innej stronie</a>. 23 Łącze pocztowe Do wysyłania poczty elektronicznej służy (mailto). Przeglądarka po wybraniu takiego rodzaju połączenia uruchamia procedurę edycji i wysyłania poczty lub też, wywołuje program pocztowy <a href=mailto:[email protected]>Adres</a>. Adresacja Adresacja bezwzględna Ścieżki bezwzględne tworzone są w oparciu o pozycje pliku w drzewie katalogów. Zawierają w sobie nazwy wszystkich katalogów znajdujących się po drodze do żądanego pliku <a href="/katalog/Index.htm."> Strona </a>. Adresacja względna Adres względny określa położenie pliku z punktu widzenia bieżącej pozycji w hierarchii katalogów. Dwie kropki (..) wskazują na katalog znajdujący się bezpośrednio powyżej bieżącego <a href="../../../katalog/Index.html”> Strona </a>. Grafika Umieszczanie obrazka na stronie Aby umieścić plik graficzny na witrynie WWW, należy użyć znacznika <img> z atrybutem (src). Służy on do określenia ujętej w cudzysłów nazwy i adresu pliku (obrazu), który w danym miejscu ma zostać wstawiony <img src="../../Grafika/Rysunek.jpg">. Obramowanie grafiki Za pomocą atrybutu <border> można zmienić szerokość ramki wokół obrazka, a nawet usunąć ją <img src="Rysunek.jpg" border=5>. Wzajemne położenie grafiki i tekstu Atrybut (aligin) umieszczony wewnątrz znacznika <img> umożliwia ułożenie obrazu względem tekstu. Może on przyjmować wartości: (top) - wyrównuje górną krawędź obrazu względem górnej krawędzi tekstu (middle) – w tym wypadku środek obrazu znajdzie się dokładnie pośrodku linii (bottom) - wyrównuje dolną krawędź obrazu względem dolnej krawędzi tekstu (textop) - wyrównuje najwyższą część obrazu względem górnej krawędzi najwyższej litery w linii. 24 (asmiddle) - wyrównuje grafiki w taki sposób, żeby jego środek leżał pośrodku największego elementu linii (asbottom) - wyrównuje dolną krawędź obrazu względem dolnej krawędzi największego elementu w linii (left) - pozwala na ułożenie obrazu przy lewym marginesie strony (right) - umieszcza grafikę przy prawym marginesie strony. Język VBScript Typy danych Istnieją następne typy danych, które można umieszczać w zmiennych VBScript: Liczby całkowite (Integer); Liczby zmiennoprzecinkowe (Single lub Double) Łańcuchy znaków (String) Daty (Date) Dane logiczne (Boolean) Wartości monetarne (Currency) Obiekty. W większości jeżyków programowania konieczne jest jawne określanie typów zmiennych. Przy tym zmienna używana do przechowywania łańcuchów znaków nie może posłużyć do przechowywania liczb. Ograniczenie to nie występuje w języku VBScript. W tym języku są wykorzystywane zmienne typu VARIANT, które pozwalają na przechowywania w zmiennej wartości dowolnego typu. Instrukcja DIM służy do deklarowania zmiennych. Dyrektywa OPTION EXPLICIT umieszczana jest zazwyczaj na samym początku programu, aby wymusić jawne deklarowanie wszystkich zmiennych. W odróżnieniu od języka C++, język VBScript używany przy tworzeniu stron ASP nie rozróżnia wielkości liter. Przykład (listing vbscr_1.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim iVar ivar = 2 %> <html> <BODY> Zmienna o iVar ma wartosc 25 <% Response.Write(ivar) %> </BODY> </html> Istnieje specjalny typ danych – zmienna tablicowa. Zmienna tablicowa to jest sekwencja zmiennych, które mają tę samą nazwę i są rozróżniane za pomocą indeksu. Przykład (listing vbscr_2.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim arrDays (6), iIndeks %> <html> <BODY> <% iIndeks = 3 arrDays (0) = "Poniedzialek" arrDays (1) = "Wtorek" arrDays (2) = "Sroda" arrDays (3) = "Czwartek" arrDays (4) = "Piatek" arrDays (5) = "Sobota" arrDays (6) = "Niedziela" Response.Write("iIndeks ma wartosc ") Response.Write(iIndeks) %> <BR> arrDays(<% Response.Write iIndeks %>) ma wartosc <% Response.Write(arrDays(iIndeks)) iIndeks = 0 %> <BR> <% Response.Write("iIndeks ma wartosc ") Response.Write(iIndeks) %> <BR> arrDays(<% Response.Write iIndeks %>) <% Response.Write(arrDays(iIndeks)) ma wartosc 26 %> </BODY> </html> Istnieje możliwość deklarowania stałych. W odróżnieniu od zmiennych wartości stałych są określone podczas ich tworzenia, po czym nie można ich już zmienić. Język VBScript dysponuje wbudowanymi stałymi, które mają wyznaczone wartości. Wykorzystanie takich stałych poułatwiają czytelność kodu programu. Stała jest deklarowana przy pomocy słowa kluczowego CONST: Const PODATEK =0.22 Funkcję określenia typu danych W języku VBScript są dostępne dwie funkcje umożliwiające określenie typu danych przechowywanych w zmiennej: VarType(nazwa_zmiennej) oraz TypeName(nazwa_zmienej). Pierwsza funkcja zwraca liczbę całkowitą stanowiącą kod określający typ zmiennej, druga zwraca nazwę tego typu. Przykład (listing vbscr_3.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim strName, iAge %> <html> <BODY> <% Response.Write("Przed przypisaniem wartowartosci, zmienna strName jest typu") Response.Write(TypeName(strName)) Response.Write(", ktoremu odpowiada kod ") Response.Write(VarType(strName)) %> <BR> <% strName = "Janek" iAge = 21 Response.Write("Teraz zmienna strName jest typu ") Response.Write(TypeName(strName)) Response.Write(", ktoremu odpowiada kod ") Response.Write(VarType(strName)) %> <BR> 27 <% Response.Write("Teraz zmienna iAge jest typu ") Response.Write(TypeName(iAge)) Response.Write(", ktoremu odpowiada kod ") Response.Write(VarType(iAge)) %> </BODY> </html> Kody typów danych stosowane przez funkcję Vartype Wartość Stała Typ danych 0 vbEmpty Empty 1 vbNull Null 2 vbInteger Integer 3 vbLong Long 4 vbSinglle Single 5 vbDouble Double 6 vbCurrency Currency 7 vbDate Date 8 vbString String 9 vbObject Object 10 vbError Error 11 vbBoolean Boolean 12 vbVariant Variant 13 vbDataObject Data Access Object 14 vbDecimal Decimal 17 vbByte Byte 8192 vbArray Array W listingu Okresltyp.asp pokazany jest przykład zastosowania funkcji VarType oraz TypeName. 28 Listing http://localhost/aspwyklady/Okresltyp.asp 1. <%@ Language=VBScript %> 2. <% option explicit 3. Dim strName, iAge 4. %> 5. <HTML> 6. <BODY> 7. <% 8. Response.Write ("Przed przypisaniem wartosci,zmienna strName jest typu ") 9. Response.Write (TypeName (strName)) 10.Response.Write (", ktoremu odpowiada kod ") 11.Response.Write (VarType(strName)) 12.%> 13.<BR> 14.<% 15.StrName = "Janek" 16.iAge = 21 17.Response.Write("Teraz zmienna strName jest typu ") 18.Response.Write (TypeName(strName)) 19.Response.Write (" - ") 20.Response.Write(VarType(strName)) 21.%> 22.<BR> 23.<% 24.Response.Write("Teraz zmienna iAge jest typu ") 25.Response.Write (TypeName(iAge)) 26.Response.Write (" - ") 27.Response.Write(VarType(iAge)) 28.%> 29.</BODY> 30.</HTML> Rekomendacji dotyczące stylu tworzenia nazw zmiennych W celu ułatwienia pisania programu oraz ułatwienia innym osobom jego późniejszej analizy i wprowadzania ewentualnych poprawek, trzeba realizować przy napisaniu programu następne wytyczenia: 1.Nazwa zmiennej musi zawierać zmysł opisowy. 2.Do nazw zmiennej trzeba dodawać prefiks, zawierający informację o jej typie. Przykłady prefiksów są w następnej tabeli: 29 Typ zmiennej Liczba całkowita (integer) Liczba zmiennoprzecinkowa o pojedynczej precyzji (single) Liczba zmiennoprzecinkowa o podwójnej precyzji (double) Łańcuch znaków (string) Data (Date) Wartość logiczna (boolean) Wartość walutowa (currency) Obiekt (object) Prefiks i sng dbl str dt bol cur obj 3. Nazwy stałych trzeba zapisywać dużymi literami, dzięki temu łatwiej będzie odróżnić stałe od zmiennych. 4. Wszystkie zmienne trzeba deklarować na początku skryptu. Operatory dostępne w VBScript Operatory służą do manipulowania danymi – pozwalają na łączenia danych, zmienianie ich oraz modyfikowanie. Operator przypisania Operator przypisania „=” kopiuje dowolną wartość podaną z jego prawej strony, umieszczając ją w zmiennej podanej ze strony lewej. Przykład. <% Dim iVar, strName, dtUrodziny IVar = 3 strName = „Janek” dtUrodziny = #03/06/1990# %> Umieszczenie daty pomiędzy znakami „#” zapewnia, że nie zostaną one potraktowane jako wyrażenie, którego wartość trzeba obliczyć (obecność znaków „/”). Operatory matematyczne Operatory matematyczne zgodnie z ich priorytetami są przedstawione w następnej tablice: Priorytet operacji Najwyższy Operator () ^ Opis operatora nawiasy wykładniczy 30 Najniższy *, / \ % +,& = <> < > <= >= Not And Or Xor Eqv Imp negacja mnożenie i dzielenie dzielenie całkowite reszta z dzielenia dodawanie i odejmowanie konkatenacja łańcuchów znaków równy różny mniejszy większy mniejszy lub większy większy lub równy Struktury sterujące języka VBScript Struktura sterująca to jest konstrukcja programową pozwalająca programowi komputerowemu na podjecie decyzji w oparciu o podane informacje. Logika warunkowa Logika warunkowa sprawdza warunek lub grupę warunków i na podstawie wyniku wybiera fragment kodu, który ma zostać wykonany. Instrukcja If ... Then Format: If warunek Then Blok kodu End If Warunek jest wyrażeniem logicznym (boolowskim) .Gdy warunek będzie miał wartość True, zostaje wykonane polecenie wykonawcze reprezentowane przez blok kodu, po czym program realizuje kolejne polecenia podane po End If. Jeśli natomiast warunek będzie miał wartość False, to blok kodu zostaje pominięty i program wykona polecenia umieszczone za End If. Instrukcja If ...Then ...Else Format: 31 If warunek Then Blok kodu 1 Else Blok kodu 2 End If W tym przypadku, jeśli warunek zostanie spełniony (będzie miał wartość True), program wykona Blok kodu 1. W przeciwnym przypadku – jeśli warunek nie zostanie spełniony – program wykona Blok kodu 2. Instrukcja ElseIf Ta instrukcja upraszcza zapisywanie zagnieżdżonych instrukcji warunkowych. Instrukcję If o następującej postaci: If warunek1 Then Blok kodu 1 Else If warunek2 Then Blok kodu 2 Else If warunek3 Then Blok kodu 3 End If End If Blok kodu 4 End If Można zapisać w poniższy sposób: If warunek1 Then Blok kodu 1 ElseIf warunek2 Then Blok kodu 2 ElseIf warunek3 Then Blok kodu 3 Else Blok kodu 4 End If Instrukcja ElseIf działa jak połączenie instrukcji Else oraz If. Przy używaniu jej w programach trzeba pamiętać następne szczegóły: Instrukcji ElseIf nie można używać po instrukcji Else. Bez problemów można zapisywać wiele instrukcji ElseIf jedna za drugą, a na ich końcu umieścić instrukcję Else. Jednak po instrukcji Else nie można już umieścić żadnej instrukcji ElseIf. 32 Instrukcja ElseIf nie wymaga zapisywania dodatkowej instrukcji End If. Trzeba jednak po niej umieścić instrukcję End If zamykającą If. Instrukcje Select Case Wiele zagnieżdżonych instrukcji If są trudne do analizy programu. Jeśli trzeba porównywać wartość jednej zmiennej z wieloma różnymi wartościami , trzeba używać instrukcję Select Case. Ta instrukcja pozwala na określenie grupy bloków kodu, z których w zależności od wartości wyrażenia numerycznego lub łańcuchowego jedna zostanie wykonana. Format: Select Case wyrażenie Case wartość1 Kod1 Case wartość2 Kod2 … Case wartośćN KodN Case Else Kod0 End Select Logika pętli W logice pętli blok kodu wykonywany jest sekwencyjne, aż do momentu spełnienia określonych warunków lub tak długo, aż określony warunek jest spełniony. Instrukcja Do While ...Loop Format: Do While warunek Blok kodu Loop Przykład (listing vbscr_4.asp). %@ Language = VBScript %> <% Option Explicit %> <% Dim iVar iVar = 1 %> <html> <BODY> <% Do While iVar <=10 33 %> Zmienna o iVar ma wartosc <% Response.Write(ivar) %> <BR> <% iVar = iVar + 1 Loop %> </BODY> </html> Instrukcja Do Until…Loop Ta instrukcja jest bardzo podobna do poprzedniej instrukcji. Jedyna różnica pomiędzy nimi polega na tym, iż kod umieszczony w instrukcji Do Until…Loop jest wykonywany aż do chwili, gdy warunek uzyska wartość True (a nie False). Przykład (listing vbscr_5.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim iVar iVar = 1 %> <html> <BODY> <% Do Until iVar >10 %> Zmienna o iVar ma wartosc <% Response.Write(ivar) %> <BR> <% iVar = iVar + 1 Loop %> </BODY> </html> Instrukcja While ...Wend Ta instrukcja działa identyczne jak instrukcję Do While...Loop. W instrukcję słowa kluczowe Do While zastępowane są słowem While, a słowo Loop – zastępowane jest przez Wend. 34 Przykład (listing vbscr_6.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim iVar iVar = 1 %> <html> <BODY> <% While iVar =< 10 %> Zmienna o iVar ma wartosc <% Response.Write(ivar) %> <BR> <% iVar = iVar + 1 Wend %> </BODY> </html> Instrukcja For ... Next Ta instrukcja jest używana w tych sytuacjach, gdy przed rozpoczęciem pętli wiadomo ile razy należy wykonać umieszczony w niej kod. Instrukcja wykonuje umieszczony w niej kod określoną ilość razy, inkrementując jednoczesne specjalną zmienną nazywaną licznikiem pętli. Format: For licznik_pętli =wartość_początkowa to wartość_końcowa Step krok Blok kodu Next Licznik_pętli jest zmienną numeryczną określającą, ile razy zawartość pętli została już wykonana. Na samym początku wykonywania pętli zmiennej licznik_pętli przypisywana jest wartość_poszątkowa. Podczas kolejnego wykonywania pętli zmienna ta będzie miała wartoś_początkowa + krok. Zakładając, że wartość_poszątkowa jest większa od zera, pętla będzie wykonywana aż do momentu, gdy wartość licznika_pętli stanie się większa od wartości_końcowej. Po każdym wykonaniu pętli, zmienna licznik_pętli jest powiększana o krok . 35 W przypadku prostych pętli, instrukcja For ... Next jest wygodniejsza od instrukcji DoWhile...Loop, bowiem obsługuję inicjalizację i inkrementację licznika pętli. Wartość kroku może być liczbą ujemną. Także w takim przypadku liczba ta jest dodawana do licznika_pętli, ale wykonanie pętli kończy się w momencie, gdy wartość licznika_pętli będzie mniejsza od wartości_końcowej. Określanie wartości kroku jest opcjonalne. Jeśli zarówno słowo kluczowe Step, jak i wartość kroku nie zostaną podane, to automatycznie przyjmuje się, iż krok ma wartość 1. Jeśli wartość_poszątkowa jest większa od wartości_końcowej, a krok jest liczbą dodatnią, to blok kodu umieszczony wewnątrz pętli w ogóle nie zostanie wykonany. Dla nagłego przerwania pętli For...Next może posłużyć instrukcja Exit For. Przykład (listing vbscr_7.asp). <%@ Language = VBScript %> <% Option Explicit %> <% Dim iSum, iCounter iSum = 0 %> <html> <BODY> <% For iCounter =1 to 10 iSum = iSum + iCounter %> Zmienna o iSum ma wartosc <% Response.Write(iSum) %> <BR> <% Next %> </BODY> </html> Instrukcja For Each…Next Instrukcja ta jest używana do wykonania podanego bloku kodu dla każdego elementu wskazanego zbioru. Jeśli w pętlach użyć instrukcję Exit (Exit Do lub Exit For), to spowoduje ona zakończenie pętli. 36 Procedury i funkcji Procedury i funkcje są strukturami, sterującymi logiką rozgałęziania: procedury wykonują czynności , natomiast funkcje obliczają wartości. Format procedury: Sub nazwa(argument1,argument2,...argumentN) blok kodu End Sub Żeby wywołać procedurę trzeba w potrzebnym miejscu programu, w osobnej linii napisać: Nazwa (wartość1,wartość2,...wartośćN) Procedury nie zwracają żadnych wartości. Funkcje zwracają wartości. Format funkcji: Function nazwa(argument1,argument2,...argumentN) blok kodu End Function Wywołania funkcji mogą być umieszczane w wyrażeniach. Jeśli trzeba wywołać funkcję i unieważnić zwrócony przez nią wynik, to trzeba poprzedzić nazwę funkcji słowem kluczowym Call: Call nazwa_funkcji (argumenty) Jeśli przy tworzeniu funkcję nie będziemy korzystać ze zwracanych przez nią wartości, to zamiast funkcji trzeba lepiej stworzyć procedurę. Przykład procedury (listing vbscr_8.asp). <%@ Language = VBScript %> <% Option Explicit %> <html> <BODY> <% Dim arrPrimeNos, arrNames Sub subPrintArray (arrToPrint, istartValue, iStopValue) Dim iCounter For iCounter = istartValue to iStopValue Response.Write (arrToPrint(iCounter)) Response.Write ("<BR>") Next End Sub arrPrimeNos = Array (2,3,5,7,11,13,17,19) arrNames = Array ("Janek","Maria","Franek","Zenek") subPrintArray arrNames, 2,3 subPrintArray arrPrimeNos,0,4 subPrintArray arrNames, 1,3 %> 37 </BODY> </html> Przykład funkcji (listing vbscr_9.asp). <%@ Language = VBScript %> <% Option Explicit %> <html> <BODY> <% Function iFactorial (iNumber) Dim iCounter iFactorial=1 For iCounter=1 to iNumber iFactorial=iFactorial * iCounter Next End Function Response.Write ("4! = ") Response.Write (iFactorial(4)) Response.Write ("<BR>") Response.Write ("5! = ") Response.Write (iFactorial(5)) Response.Write ("<BR>") Response.Write ("6! = ") Response.Write (iFactorial(6)) Response.Write ("<BR>") Response.Write ("7! = ") Response.Write (iFactorial(7)) Response.Write ("<BR>") %> </BODY> </html> Funkcje wbudowane Funkcje wbudowane rozszerzają możliwości języka VBScript. Te funkcje zawierają : rzutowania typów formatujące matematyczne obsługi dat obsługi łańcuchów znaków. Funkcje rzutowania typów Rzutowania typów zmienia typ danych. Przykłady: 38 Cint (“33”) daje w wyniku wartość 33 Cint (True) daje w wyniku wartość –1 Cbyte (“45”) daje w wyniku wartość 45 Csng (“0.000000556”) zwraca wartość 5.56E-07 Cdate(“4-5-02”) zwraca datę 5.04.02 Cdate(“April-6-02”) zwraca datę 6.04.02 Funkcje formatujące Funkcje formatujące służą do nadania danym żądanej postaci. Wszystkie te funkcje zwracają łańcuchy znaków. FormatDateTime - używana jest do formatowania godzin i dat FormatCurrency – Używana jest do formatowania danych walutowych Funkcje matematyczne obliczają różne wyrazy matematyczne: Abs(), Atn(), Cos(), Exp(), Fix(), Hex(),Int(), Log(), Rnd, Round(),Sgn(),Sin(),Sqr(),Tan(). Funkcje obsługi dat służą dla określenia i manipulowania datami oraz godzinami. Przykłady: Date Time Now DateAdd (odstęp, liczba, data) DateDiff (...) Funkcje obsługi łańcuchów znaków Funkcje te pozwalają na pobieranie i zamianę części lub całej zawartości jednego lub wielu grup łańcuchów. Przykłady: Trim(łańcuch) Ucase(łańcuch) Len (łańcuch) Replace(...) Wbudowane obiekty ASP Obiekty ASP stosowane w programach, składają się z elementów, które je opisują oraz z czynności, które można na nich wykonać. Elementy opisujące obiekty są nazywane właściwościami, natomiast czynności, które można wykonać na obiektach – metodami. ASP zawiera 6 wbudowanych obiektów: Response Request Application 39 Session Server ObjectContext. Obiekt Response jest stosowany do przesyłania danych ze skryptu ASP do przeglądarki. Obiekt ten pozwala także na kontrolę sposobu przesyłania danych oraz określanie momentu, kiedy to ma nastąpić, jak również na przesyłanie cookies, służących do przechowywania informacji w przeglądarce użytkownika. Obiekt zawiera zawiera właściwości, metody i kolekcję. Właściwości: Buffer Expires Metody: Clear End Flush Redirect Write Kolekcja: Cookies Najczęstszym zastosowaniem obiektu Response jest przesyłanie danych do przeglądarki użytkownika w celu wyświetlenia fragmentu strony WWW. Można to zrobić na dwa sposoby. Pierwszym z nich jest wykorzystanie metody Response.Write. Druga metoda polega na użyciu specjalnych znaczników <%= … %>. Kod <%= wyrażenie %> ma dokładnie takie samo działania, co wywołanie metody <% Response.Write (wyrażenie) %>. Przykład użycia tego sposobu jest pokazany w listingu AKTCZAS_wr.ASP. Listing AKTCZAS_wr.ASP <%@ Language = VBSCRIPT %> <html> <body> <p>Akyualna godzina to: <% = Time()%> </p> </body> </html> Parametrem metody Write może być łańcuch znaków, zawierający cudzysłów. Cudzysłów wewnątrz łańcucha znaków trzeba zamieniać na symbol apostrofa lub dublować go dwukrotne. Na przykład, łańcuch znaków zawiera tekst: 40 “Metoda “Response.Write” wyświetla tekst”. Dla wyświetlania tego tekstu mogą być wykorzystane następne instrukcji: 1. Response.Write “Metoda ““Response.Write”” wyświetla tekst” 2. Response.Write “Metoda `Response.Write` wyświetla tekst” Prócz samego przesyłania danych obiekt Response może kontrolować jak oraz kiedy dane są przesyłane. Właściwość Buffer określa, czy dane wyjściowe są gromadzone w buforze, czy też bezpośrednio przesyłane do klienta. Jeśli są one gromadzone w buforze, to przesyłanie następuje po wykonaniu całego skryptu. Przykład zadania trybu buforowania: <% Response.Buffer =True %> Istnieje także możliwość natychmiastowego przesłania danych – służy do tego metoda Response.Flush. Ta metoda opróżnia bufor i przesyła jego zawartość do przeglądarki. Przykład wykorzystania Flush: … <% Response.Buffer =True %> … <% Response.Write (“Przed Flush”) Response.Flush %> Metoda Response.Clear opróżnia się bufor bez przesyłania danych. Metoda Response.End powoduje opróżnienie bufora i natychmiastowe zakończenie działania skryptu. Właściwość Response.Expires wyznacza, jak długo strona ma być przechowywana w pamięci podręcznej. Obiekt Request służy do pobierania danych przesyłanych na serwer przez przeglądarkę użytkownika. Gdy przeglądarka zgłasza żądanie przesłania wybranej strony, to wraz z żądaniem przesyła na serwer pewne informacje. Informacje te zostają zapisane właśnie w obiekcie Request. Niektóre z tych informacji mogą być przydatne dla żądanej strony, a niektóre nie. Obiekt Request pozwala żądanej stronie na pobranie wszelkich informacji, których strona ta potrzebuje – wartość cookies, danych przesłanych z formularza, łańcucha zapytania, itd. Łańcuch zapytania to dodatkowe informacje dołączane czasami do adresu URL. Łańcuch zapytania może być sformowany przez następne metody: Wykorzystania metody GET w formularze Wykorzystania znacznika <A> 41 Podania pełnego adresu URL wraz z łańcuchem zapytania w przeglądarce. Pierwsza metoda polega na wykorzystaniu formularza, w którym atrybutowi METHOD przypisana zostaje wartość GET. Drugą metodą jest wykorzystanie atrybutu HREF znacznika <A>, służącego do tworzenia połączeń pomiędzy stronami WWW. Wartości pól które są przekazywane jako łańcuch zapytania muszą składać się z par nazwawartość oddzielonych od siebie znakiem „&”. Przykład tej metody : <A HREF = "Strona.asp?Name=Kowalski&Wiek=25&telefon=3333222">tekst Trzecia metoda polega na podaniu pełnego adresu URL wraz z łańcuchem zapytania w przeglądarce. Wartości pól formularzy odczytywane są za pośrednictwem obiektu Request. Obiekt ten posiada dwie kolekcje pozwalające na pobieranie danych : QueryString – ta kolekcja służy do pobierania par nazwa-wartość przekazanych w lańcuchu zapytania. Form – ta kolekcja służy do pobierania par nazwa-wartość przesłanych na stronę ASP za pomocą metody POST. Kolekcja to jest zbiór par nazwa-wartość (dwukolumnowa macierz). Wszystkie dani, które są przekazywane do strony WWW, są rozmieszczone w tych kolekcjach. Format pobierania danych z kolekcji QueryString: Request.QueryString("nazwa") lub prosto Request ("nazwa"). Format pobierania danych z kolekcji Form: Request.Form("nazwa") . Obiekt Application służy do współużytkowania danych przez większą ilość użytkowników przeglądających tę samą grupę stron. W ASP terminem „aplikacja” określana jest grupa stron .asp znajdujących się w jednym katalogu oraz we wszystkich jego podkatalogach. Dla każdej aplikacji tworzony jest tylko jeden egzemplarz obiektu Application. Obiekt ten jest wspólnie używany przez wszystkich użytkowników korzystających z tej samej aplikacji. Obiekt Session dotyczy jednego użytkownika korzystającego z aplikacji w czasie swojej aktywności. Sesja to jest termin aktywności jednego użytkownika . Dla każdej sesji tworzony jest nowy egzemplarz obiektu Session. Obiekt ten odgrywa bardzo ważną rolę przy śledzeniu przemieszczania się użytkownika pomiędzy stronami, gdyż jego właściwości zachowują swoją wartość przez cały czas trwania sesji. Pewne 42 strony mogą zapisywać wartości we właściwościach obiektu Session, a inne strony mogą je pobierać. Obiekt Server udostępnia kilka prostych metod i właściwości. Zapewne najważniejszą z nich jest metoda CreateObject służąca do tworzenia nowych egzemplarzy komponentów serwera. Komponenty są pakietami obiektów powiązanych ze sobą tematyczne, które używają się na stronach aplikacji internetowej. Komponenty ułatwiają wykonywanie najczęściej spotykanych zadań i zwiększają możliwości tworzonych stron. Obiekt ObjectContext służy do łączenia ASP z Microsoft Transaction Serverem(MTS). MTS jest przeznaczony dla poprawienia efektywności działania innych komponentów. Wykorzystanie formularzy Formularze służą dla zebrania informacji od użytkownika oraz dla przesyłania tej informacji do wyznaczonej strony ASP na serwerze w celu je przetworzenia. Dzięki zastosowaniu formularzy, strona ASP może zażądać otrzymania danych od użytkownika i wykorzystać te dane do podejmowania decyzji. Formularze są kodem HTML. Najprostsza postać formularza ma następny wygląd: <FORM METHOD = GET ACTION = „NazwaSkryptu.asp”> </FORM> Znacznik <FORM> posiada dwa atrybuty: METHOD oraz ACTION. Atrybut METHOD wyznaczy sposób przesyłania danych do wyznaczonej strony aplikacji. Atrybut ten może przybierać jedną z dwóch wartości: GET lub POST. Pierwsza z nich (GET) powoduje przesłanie informacji w postaci łańcucha zapytania , który jest dopisany do adresu URL strony aplikacji. Łańcuch zapytania może zawierać dowolną ilość par nazwa – wartość zapisanych w następującej postaci: NazwaZmiennej = wartośćZmiennej. Od adresu URL łańcuch jest oddzielony znakiem „?”, na przykład: http://www.serwer.com.pl./strona.asp?imie=Wojtek Oddzielne zmienne w łańcuchu zapytania są oddzielone jeden od jednego przez symbol „&”, na przykład: http://www.serwer.com.pl./strona.asp?imie=Wojtek&dzial=techniczny Druga wartość atrybutu METHOD – POST – nie wykorzystuje łańcucha zapytania, przez co ukrywa przesyłane informacje. Wadami wykorzystywania metody GET są następne: 43 przesyłane informacje są widoczne na pasku adresu przeglądarki; niektóre starsze wersje przeglądarek nie są w stanie obsługiwać adresów URL o długości przekraczającej 255 znaków. Atrybut ACTION określa, jaka strona zostanie wywołana po wysłaniu formularza. Ta strona zazwyczaj służy do przetwarzania danych wprowadzonych przez użytkownika. Przedstawiony wyżej formularz nie zawiera żadnych pól tekstowych, w których użytkownik mógłby wpisać informacje oraz także ani list, ani przycisków opcji, ani pól wyboru. Każde pole tekstowe, lista, przycisk opcji oraz pole wyboru umieszczone w formularzu jest polem formularza. Wszystkie te obiekty tworzone są przy wykorzystaniu znacznika <INPUT>. Znacznik ten posiada kilka atrybutów , główne z nich są następne: NAME – ten atrybut w unikatowy sposób identyfikuje każdy element formularza. TYPE – ten atrybut określa typ danego pola formularza. Dla pola tekstowego trzeba przypisać temu atrybutu wartość TEXT, dla pola wyboru trzeba użyć wartość CHECKBOX, dla uzyskania przycisku opcji - trzeba przypisać temu atrybutu wartość RADIO. VALUE – ten atrybut określa z kolei domyślną wartość danego pola formularza. Przykład listingu, który zawiera formularz jest w pliku REGISTER.ASP. Listing REGISTER.ASP 1. <%@ LANGUAGE="VBSCRIPT" %> 2. <HTML> 3. <BODY> 4. Uzupelni ten formularz : 5. <P> 6. <FORM ACTION="/aspFormularzy/take_registration.asp" method="get"> 7. <TABLE > 8. <TR> 9. <TD>Identyfikator: </TD> 10.<TD><INPUT TYPE="TEXT" NAME="p_ident" SIZE=40 MAXLENGTH =25> </TD> 11. </TR> 12. <TR> 13. <TD>Haslo: </TD> 14. <TD><INPUT TYPE="password" NAME="p_pass"></TD> 15. </TR> 16. <TR> 44 17. <TD>Nazwisko: </TD> 18. <TD><INPUT NAME="p_nazw" ></TD> 19. </TR> 20. <TR> 21. <TD>Imie: </TD> 22. <TD><INPUT NAME="p_imie" ></TD> 23. </TR> 24. <TR> 25. <TD>Adresa: </TD> 26. <TD><INPUT NAME="p_adr"></TD> 27. </TR> 28. </TABLE> 29. <P>&nbsp;</P> 30. Masz Konto w banku? 31. <INPUT TYPE="radio" NAME="p_konto" VALUE="yes" CHECKED>tak 32. <INPUT TYPE="radio" NAME="p_konto" VALUE="no">nie 33. <P>&nbsp;</P> 34. <TABLE > 35. <TR> 36. <TD ><INPUT TYPE="submit" VALUE="Submit Registration" 37. id=submit1 name=submit1></TD> 38. <TD ><INPUT TYPE="reset" VALUE="Start Over" id=reset1 39. name=reset1></TD> 40. </TR> 41. </TABLE> 42. <P></FORM></P> 43. </BODY> 44. </HTML> W linii 6 jest określony znacznik <FORM> formularza oprócz tego w tej linii są wyznaczone: w atrybutu METHOD - metod GET oraz w atrybutu ACTION strona, która zostanie wywołana po wysłaniu formularza. W linii 7,28,34,41 w znacznikach <TABLE> oraz </TABLE> zostały definiowane dwie tablicy, w których będą rozmieszczone pola formularza. W liniach 8,11,12,15,16,19,20,23,24,27,35,40 są definiowane wierszy tych tablic z elementami formularza. W liniach 9,10,13,14,17,18,21,22,25,26,36,37,38,39 są definiowane kolumny odpowiadanych wierszy z elementami formularzy. Za dopomogą znacznika INPUT w liniach 10,14,18,22,26,31,32,36,38 są wyznaczone pola w których użytkownik może wpisać informację oraz przyciski dla uruchomiania procesów wpisania na serwerze. W linii 10 jest 45 wyznaczone pole z typem TEXT, imię tego pola „p_ident”. Atrybut SIZE w linii 10 określa szerokość pola - czyli ilość znaków, jaka będzie w nim w danej chwili widoczna. Ten atrybut nie ogranicza ilości znaków, jakie użytkownik może wpisać w polu. Ograniczyć tę ilość znaków można za dopomogą atrybutu MAXLENGTH. W linii 14 jest wyznaczone pole typu PASSWORD. W liniach 18,22,26 są wyznaczone tekstowe pola. Nieobecność atrybutów TYPE w tych liniach wyznacza typy tekstowe po domyśleniu. W liniach 31,32 jest wyznaczony typ RADIO dla elementu danych formularza, który ma imię „p_konto”. Element RADIO zawiera tu dwa komponenty: „yes” oraz „no”, które są wyznaczone w liniach 31 oraz 32. Atrybut CHECKED w linii 31 wyznacza wartość „yes” po domyśleniu. W liniach 36-39 są wyznaczone przyciski SUBMIT oraz RESET. Przycisk SUBMIT przesyła dani pól formularza do strony, która jest wyznaczona w atrybutu ACTION. Przykład listingu strony, która otrzymuje dane z formularza jest w listingu take_registration.asp. Listing take_registration.asp 1. <%@ LANGUAGE="VBSCRIPT" %> 2. <% Option Explicit %> 3. <H1>Rezultaty otrzymane z formy:</H1> 4. <% 5. On Error Resume Next 6. Dim p_ident,p_pass,p_nazw,p_imie,p_adr,p_konto 7. p_ident = Request("p_ident") 8. p_pass = Request("p_pass") 9. p_nazw = Request("p_nazw") 10. p_imie = Request("p_imie") 11. p_adr = Request("p_adr") 12. %> 13. <H2>Identyfikator: 14. <% 15. Response.Write (p_ident) 16. Response.Write ("<BR>") 17. %> 18. </H2> 19. <H2>HASLO: 20. <% 21. Response.Write (p_pass) 22. Response.Write ("<BR>") 46 23. %> 24. </H2> 25. <H2>Nazwisko: 26. <% 27. Response.Write (p_nazw) 28. Response.Write ("<BR>") 29. %> 30. </H2> 31. <H2>Imie: 32. <% 33. Response.Write (p_imie) 34. Response.Write ("<BR>") 35. %> 36. </H2> 37. <H2>Adresa: 38. <% 38. Response.Write (p_adr) 40. Response.Write ("<BR>") 41. %> 42. </H2> 43. <H2> 44. <% 45. IF Request("p_konto") = "yes" then 46. Response.Write ("Klient ma konto w banku") 47. Else 48. Response.Write ("Klient ni ma konta") 49. End if 50. %> 51. </H2> 52. </BODY> 53. </HTML> W linii 1 jest wyznaczony typ skryptu. Dyrektywa w linii 2 nie pozwoli wykorzystać zmienni skryptu bez ich poprzedniego deklarowania. Instrukcja w linii 3: „On Error Resume Next” – informuje interpreter języka VBScript, że w przypadku natrafienia na błąd, należy pominąć linię i przejść do następnej. W linii 6 są deklarowane zmienni skryptu. W liniach 7-11 za dopomogą obiektu REQUEST czyta się informację pro wartości pól formularza bezpośrednio w zmienni skryptu. W liniach 15 - 40 za dopomogą obiektu RESPONSE pisze się otrzymana informacja z formularza do 47 przeglądarki użytkownika. W liniach 45-49 pisze się rezultat otrzymany od elementu RADIO formularza. W listingu select.asp jest pokazany przykład formularza , zawierającego listę pól. Kod HTML definiujący listę został przedstawiony w liniach 11 – 16. Te linii są rozmieszczone wewnątrz znaczników <FORM> oraz </FORM> w liniach 9 i 18. Rezultaty wyboru pola listy przesyła do strony z adresem wyznaczonym w atrybutu ACTION w linii 9. Listing select.asp 1. <%@ Language=VBScript %> 2. <HTML> 3. <HEAD> 4. <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> 5. </HEAD> 6. <BODY> 7. Wyznacz kraj ! 8. <P> 9. <FORM ACTION="/aspwyklady/select_registration.asp" method="get" 10. id=form1 name=form1> 11. <SELECT NAME = COUNTRY> 12. <OPTION VALUE = "POLSKA" > POLSKA 13. <OPTION VALUE = "UKRAINA" > UKRAINA 14. <OPTION VALUE = "DANIA" > DANIA 15. <OPTION VALUE = "Iran" > IRAN 16. </SELECT> 17. <INPUT TYPE="submit" VALUE="Submit Registration" > 18. </FORM> 19. </BODY 20. </HTML> Kod skryptu odbierającego rezultaty formularza jest pokazany w listingu Listing select_registration.asp: <%@ Language=VBScript %> <HTML> <HEAD> </HEAD> <BODY> <H1>Rezultaty otrzymane z formy:</H1> <% 48 = Request("COUNTRY") %> </BODY> </HTML> Kolekcja ServerVariables obiektu Request Kolekcja ta pozwala na odczytywanie zmiennych środowiskowych serwera WWW. Kiedy klient żąda od serwera przesłania strony WWW, to przesyła nie tylko adres URL żądanego dokumentu, lecz także wiele dodatkowych informacji. Informacje te mogą określać typ używanej przeglądarki, rodzaj systemu operacyjnego na jakim działa oraz URL strony, która aktualnie jest wyświetlona. Każdy dodatkowy element informacji nosi nazwę nagłówka żądania. Kiedy serwer przesyła do przeglądarki kod strony, to wraz z nim przysyłana jest także grupa nagłówków określanych jako nagłówki odpowiedzi. Oba rodzaje tych nagłówków określane jako nagłówki HTTP. Wszystkie nagłówki są przechowywane w kolekcji ServerVariables. Przykład odczytania zawartości elementów tej kolekcji jest pokazany na listingu Naglowki.asp. Listing Naglowki.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 5. <p>Wyswietlanie wszystkich naglowkow od klienta (bez formatowania): 6. <br> 7. <%=Request.ServerVariables("ALL_RAW")%> 8. <br> 9. </p> 10.<pre> 11.Wyswietlanie rezultatow wszystkich naglowkow od klienta (z formatowaniem) : 12.<%=Request.ServerVariables("ALL_RAW")%> 13.</pre> 14.<pre> 15.Wyswietlanie rezultatow wszystkich naglowkow do klienta : 16.<%=Request.ServerVariables("ALL_HTTP")%> 17.</pre> 18.</body> 49 19.</html> Zmienna ALL_RAW w kolekcji ServerVariables zawiera wszystkie nagłówki żądania. W liniach 7 oraz 12 jest wywołana wartość zmiennej ALL_RAW. W pierwszemu wypadku (linia 7) rezultaty na stronie nie są sformatowane, w drugim przypadku (linia 12) są wykorzystywane znaczki <PRE>, </PRE> w liniach 10 i 13 dla formatowania rezultatów. Zmienna ALL_HTTP w kolekcji ServerVariables zawiera wszystkie nagłówki odpowiedzi. W linii 16 są wyświetlane te nagłówki. Dla wyświetlania oddzielnego nagłówka trzeba sformować polecenie : Request.ServerVariables("nazwa nagłówka"). Nazwy nagłówków są wyświetlane w listingu Naglowki.asp. Nagłówki HTTP umożliwiają zdobycie informacji dotyczących klienta, jednak nie mówią niczego, ani o serwerze WWW, ani o żądanej stronie ASP. Na przykład, nie zawierają URL żądanej strony, je adres fizyczny. Ta informacja może być odczytana w zmiennych środowiskowych serwera WWW. Zmienne środowiskowe to informacje, które serwer WWW udostępnia programom. Zmienne te zawierają takie informacje, jak: nazwa serwera WWW, adres URL aktualnie przetwarzanej strony ASP, nazwę używanego oprogramowania serwera WWW i in. Zmienne środowiskowe pobiera się tak samo, jak nagłówki HTTP. Przykład wyświetlania wszystkich elementów kolekcji ServerVariables jest pokazany w listingu ServerVariables.asp. Listing ServerVariables.asp. 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 5. <% 6. Dim strName 7. For Each strName in Request.ServerVariables 8. Response.Write strName &": " &_ 9. Request.ServerVariables(strName) &"<BR>" 10.Next 11.%> 12.</body> 13.</html> 50 Kod przedstawiony na tym listingu wyświetla wszystkie zmienne środowiskowe oraz nagłówki HTTP zapisane w kolekcji ServerVariables. Informacje te są zapisane w kolekcji, a zatem są wyświetlane przy użyciu pętli For Each… Next (linii 7-10). Wykoryzstanie cookies Cookies są niewielkimi fragmentami informacji – łańcuchami znaków lub wartościami numerycznymi – przechowywanymi na komputerze użytkownika przez ściśle określony czas. Cookies są zapisywane oraz odczytywane przy wykorzystaniu nagłówków HTTP. Cookies są zapisywane na komputerze użytkownika przez kolekcje Response.Cookies, natomiast kolekcja Request.Cookies odczytuje je. Cookies mogą zawierać informacje dowolnego, prostego typu danych – czyli dowolne dane oprócz tablic i obiektów. Wynika z tego, że w Cookies można zapisywać łańcuchy znaków, liczby, daty, wartości walutowe oraz logiczne. Najbardziej często Cookies stwarzają się w postaci „klucz – wartość”. Okres ważności Cookies można określić podczas przez go właściwość Expires , np.: Response.Cookies ("UserInformation").Expires = #December 1, 2002# Jeśli ta wartość nie będę ustalona, to ważność Cookies uplyne, gdy użytkownik zamknie przeglądarkę. Przykład zapisywania Cookies jest pokazany w listingu WriteCookies.asp. Listing WriteCookies.asp 1. 2. 3. 4. 5. 6. 7. 8. <%@ Language = VBScript %> <% Option Explicit %> <% Response.Cookies("UserInformation")("LastVisit") = Now Response.Cookies("UserInformation")("Name") = "Volodymir" Response.Cookies("UserInformation")("UserAgentString") =_ Request.ServerVariables("HTTP_USER_AGENT") Response.Redirect "ListaCookies.asp" 9. %> 10.<html> 11.<body> 12.</body> 13.</html> Kod przedstawiony na listingu tworzy Cookies o nazwie "UserInformation" zawierające trzy klucze: LastVisit, Name, UserAgentString w liniach 4-7. W 51 linii 8 użytkownik jest kierowany na stronę ListaCookies.asp. Kod tej strony zostal przedstawiony w listingu ListaCookies.asp. Cookies są częścią nagłówka HTTP, dlatego instrukcje Response.Cookies muszą być zapisane w przeglądarkę wcześniej do przesyłania pozostałego kodu tej strony. To znaczy, kod zapisywania Cookies musi być rozmieszczony przed znacznikami <HTML>,</HTML> oraz <BODY>,</BODY>. W Przeciwnym przypadku PWS oraz IIS 4.0 sformują komunikaty pro błędy. IIS 5.0 jednak już nie będzie formować tego komunikatu. Listing ListaCookies.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. 5. 6. 7. 8. <body> <% Dim strCookieName, strKeyName For Each strCookieName in Request.Cookies If Request.Cookies (strCookieName).HasKeys then For Each strKeyName in Request.Cookies (strCookieName) Response.Write strCookieName &"(" &_ strKeyName & ") = " &_ Request.Cookies(strCookieName) (strKeyName) Response.Write "<BR>" Next 9. Else Response.Write strCookieName & " = " &_ Request.Cookies(strCookieName) 10.End If 11.Response.Write "<BR>" 12.Next 13.%> 14.</body> 15.</html> W linii 8 określamy, czy aktualnie analizowane Cookies ma jakieś klucze, czy nie. W tym celu używana jest właściwość HasKeys. Jeśli Cookies ma klucze, to skrypt pobiera po kolei ich nazwy, posługuje przy tym pętla For Each ...Next . Jeśli jednak Cookies nie ma żadnych kluczy, skrypt wyświetli nazwę oraz wartość Cookies. Główne zalety przechowywania informacji w Cookies: 52 Informacja stosowne użytkownika jest przechowywana na komputerze użytkownika. Informacja może być przechowywana na czas określony – dni, tygodni, miesiące oraz lata. Zawartości stron użytkownika można formować w zależności od treści Cookies. Wady Cookies: Użytkownik może tak skonfigurować przeglądarkę, aby nie akceptowała Cookies. W Cookies nie można zapisywać obiektów, tablic . W Cookies można zapisywać jedynie łańcuchy znaków, daty oraz wartości liczbowe różnych typów. Przechowywanie informacji w obiektach Session oraz Application Cookies pozwalają przechowywać informację w bardzo prosty sposób, ale jednak nie można ich wykorzystywać dla zachowania zmiennych i stałych programu. Podstawowym pojęciem technologii ASP jest sesja. Sesja poczyna się zapytaniem oddzielnej strony aplikacji użytkownikiem przez przeglądarkę i zakończy się kiedy użytkownik znów już nie ma związków z aplikacją. Czas aktywności aplikacji z jakikolwiek użytkownikiem nazywa się sesją. W czasie sesji wartości zmiennych każdej strony ASP są dostępne tylko skryptu tej strony. Jednak istnieje potrzeba przechowywania wartości zmiennych dla wspólnego wykorzystania skryptami różnych stron ASP. ASP udostępnia dwa wbudowane obiekty: Session oraz Application. Obiekt Session stworzy się w celu przechowywania stanu zmiennych i obiektów dla każdego z użytkowników na czas ich aktywności w Internecie i działa tylko podczas sesji. Obiekt Session może być wykorzystywany tylko przez jednego użytkownika. Przykład przechowywania tablicy w obiekcie Session jest pokazany w listingu SessionWrite.asp Listing SessionWrite.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 53 5. <% 6. Dim aSentence(4) 7. aSentence(0) = "Politechnika" 8. aSentence(1) = "Koszalinska" 9. aSentence(2) = "Widzial" 10.aSentence(3) = "Elektroniki" 11.aSentence(4) = "Ul Partyzantow 17" 12.Dim iLoop 13.For iLoop = LBound (aSentence) to UBound(aSentence) 14. Response.Write aSentence(iLoop) 15. Response.Write (" - ") 16.Next 17.Session ("Sentence") =aSentence 18.%> 19.</body> 20.</html> W linii 6 jest stworzona tablica aSentence. Tablica ta zawiera pięć elementów o indeksach od 0 do 4. W liniach 7-11 są określone wartości poszczególnych elementów tablicy. W liniach 13 –16 są wyświetlane zawartości elementów tablicy na stronie wynikowej. W linii 13 są określone wartości licznika pętli, w tym celu są użyte funkcje Lbound oraz Ubound. W linii 17 jest stworzona zmienna sesyjna o nazwie Sentence i zapisana w niej tablicę aSentence. Wartości zmiennych sesyjnych można odczytać z innej strony ASP. Przykład tej strony jest pokazany w listingu SessionRead.asp. Listing SessionRead.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 5. <% 6. Dim iLoop 7. If IsArray (Session("Sentence")) then 8. For iLoop = LBound (Session("Sentence")) to _ 9. UBound(Session("Sentence")) 10. Response.Write Session("Sentence")(iLoop) 11. Response.Write ("<br>") 12.Next 54 13.Else 14.Response.Write "Brak danych!" 15.End if 16.%> 17.</body> 18.</html> W linii 6 jest wyznaczona zmienna iLoop licznika pętli. Przed odczytaniem wartości zmiennej sesyjnej Sentence sprawdzają się warunek iż zmienna o tej nazwie istnieje (linia 7). Jeśli przed uruchomieniem tego skryptu użytkownik nie odwiedził strony SessionWrite.asp, zmienna sesyjna Sentence nie będzie istnieć. W tym przypadku będzie sformowany komunikat w linii 14. Obiekt Application może być stworzony przez pierwszego użytkownika, który otworzył swoje sesję, i zostawać aktywnym w czasie pozostałych sesji różnych użytkowników dopóki jest aktywną sama aplikacja. Obiekt Application udostępnia mechanizm pozwalający na długotrwałe przechowywanie informacji nie związanych z poszczególnymi użytkownikami. Obiekt Application to jest miejsce dla przechowywania globalnych zmiennych. Ten obiekt zawiera zmienne oraz obiekty, które mogą być wspólnie wykorzystywane różnymi użytkownikami. Obiekt Application zawiera zasoby kolejnego dostępu dla różnych użytkowników. W listingu ApplicationWrite.asp pokazany przykład zapisywania zmiennych obiektu aplikacji. Listing ApplicationWrite.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 5. <% 6. Dim aSentence(4) 7. aSentence(0) = "Politechnika" 8. aSentence(1) = "Koszalinska" 9. aSentence(2) = "Widzial" 10.aSentence(3) = "Elektroniki" 11.aSentence(4) = "Ul Partyzantow, 17" 12.Dim iLoop 13.Response.Write ("Zapisywanie zmiennych obiektu ""Application"": ") 14.Response.Write ("<BR>") 55 15.For iLoop = LBound (aSentence) to UBound(aSentence) 16.Response.Write aSentence(iLoop) 17.Response.Write (" - ") 18.Next 19.Application.lock 20.Application ("Sentence") =aSentence 21.Application.Unlock 22.%> 23.</body> 24.</html> Technologia zapisywania danych potrzebuje poprzedniego blokowania zmiennych od czytania lub zapisywania przez innych użytkowników. Blokowanie i odblokowanie są realizowane w liniach 19 -21. Przykład czytania zmiennych obiektu Application jest pokazany w listingu ApplicationRead.asp. Listing ApplicationRead.asp 1. <%@ Language = VBScript %> 2. <% Option Explicit %> 3. <html> 4. <body> 5. <% 6. Dim iLoop 7. Response.Write "Czytanie zmiennych obiektu ""Application"":" 8. Response.Write ("<BR>") 9. If IsArray (Application("Sentence")) then 10.For iLoop = LBound (Application("Sentence")) to _ 11. UBound(Application("Sentence")) 12. Response.Write Application("Sentence")(iLoop) 13. Response.Write ("<br>") 14.Next 15.Else 16.Response.Write "Brak danych!" 17.End if 18.%> 19.</body> 20.</html> 56 Obiekty Session oraz Application dysponują dwoma zdarzeniami :OnStart oraz OnEnd. W przypadku obiektów Session zdarzenie OnStart generowane jest, gdy użytkownik poczyna nową sesję, czyli wtedy, gdy tworzony jest, przeznaczony dla niego, nowy egzemplarz obiektu Session. W procedurze obsługi tego zdarzenia można stworzyć zmienne sesyjne oraz nadać im początkowe wartości. Zdarzenie OnStart dla obiektu Application jest generowane w momencie początku pierwszej sesji, czyli utworzenia pierwszego egzemplarza obiektu Session. Aby stworzyć i zainstalować zmienne sesyjne oraz aplikacyjne, trzeba napisać procedury obsługi zdarzeń obiektów Session i Application. Te procedury muszą być rozmieszczony w pliku specjalnym, mającym nazwisko Global.asa. Ten plik musi być tylko jeden w aplikacji. Przykład tego pliku jest pokazany w listingu global.asa. Listing global.asa 1. <SCRIPT LANGUAGE=VBScript RUNAT=Server> 2. Sub Application_OnStart 3. '--Project Data Connection 4. Application("Connection1_ConnectionString") = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=dokuments;Extended Properties=""DSN=dokuments;DBQ=F:\asp\Databases\dokuments.mdb; DriverId=281;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"";" 5. Application("Connection1_ConnectionTimeout") = 15 6. Application("Connection1_CommandTimeout") = 30 7. Application("Connection1_CursorLocation") = 3 8. Application("Connection1_RuntimeUserName") = "" 9. Application("Connection1_RuntimePassword") = "" 10.'-- Paths to directories and pages 11.Application("ftppub") = "ftp://had/doc/" 12.Application ("aspcall") ="/dok1/documentlist.asp?rid=" 13.End Sub 14.</SCRIPT> Plik global.asa nie zawiera znaczników <HTML>, <BODY> oraz innych znaczników kodu HTML. Skrypt jest rozmieszczony w znacznikach <script>, </script>. Atrybut LANGUAGE znacznika <script> określa język programowania, atrybut RUNAT określa, że skrypt będzie wykonywany na 57 serwerze WWW. Procedura obsługi zdarzeń obiektu Application musi mieć nazwisko Application_OnStart lub Application_OnEnd. Natomiast procedura obsługi zdarzeń obiektu Session musi mieć nazwisko Session_OnStart lub Session_OnEnd. W liniach 2-13 jest wyznaczona procedura Application_OnStart. W linii 4 jest wyznaczona zmienna „Connection1_ConnectionString”, która wyznaczy parametry podłączenia do bazy danych. W pozostałych zmiennych są wyznaczone parametry czasowe, ścieżki dostępu do katalogów i plików. Dostęp do plików i folderów Tworzenie stron ASP potrzebuje możliwości zapisania informacji do plików na serwerze i późniejszego ich odczytania. Ta możliwość jest realizowana przez wykorzystanie specjalnego obiektu FileSystemObject udostępnionego przez ASP. Obiekt FileSystemObject pozwala stworzyć inne obiekty dla dostępu do katalogów i plików. Wszystkie te obiekty z ich metodami oraz kolekcjami składają się „Obiektowy model FSO”. Do składu FSO mogą wchodzić następnie obiekty: FileSystemObject – to jest bazowy obiekt FSO który jest niezbędny dla dostępu do innych obiektów FSO. Metody obiektu FileSystemObject często dublują metody innych obiektów. Takie dublowanie pozwala projektować strony ASP bez wywalania wielu obiektów FSO. Folder – ten obiekt realizuje dostęp do katalogów. Metody obiektu Folder pozwalają stworzyć katalogi, usuwać katalogi, przemieszczać ich w inne miejsca, otrzymać dani pro właściwości katalogów. File – ten obiekt realizuje dostęp do plików. Metody obiektu File pozwalają stworzyć pliki, przemieszczać pliki, otrzymać dani pro właściwości plików. TextStream – ten obiekt realizuje operacji czytania oraz zapisywania do tekstowych plików. Drive – ten obiekt realizuje dostęp do informacji pro wszystkie dyski serwera. Do składu FSO mogą wchodzić następnie kolekcji: Folders – ta kolekcja zawiera wszystkie katalogi w obiekcie Folder. Files – ta kolekcja zawiera wszystkie pliki w wyznaczonym katalogu. Drives – ta kolekcja zawiera listę wszystkich dysków serwera. 58 Wykorzystanie obiektu FileSystemObject Obiekt FileSystemObject zawiera następne metody. Metody obiektu FileSystemObject Metoda Opis BuildPath (ścieżka, nazwa) CopyFile plikŻródłowy, plikDocelowy, zastąpić Dodaje nazwę pliku do ścieżki, gwarantując przy tym odpowiednie wykorzystanie znaku separatora ścieżki Kopiuje plikŻródłowy zapisująć go jako plikDocelowy. Jeśli plikDocelowy już istnieje oraz jeśli argument zastąpić ma wartość TRUE, to kopiowany plik zastąpi istniejący plik o tej samej nazwie. Kopiuje katalogŻródłowy zapisująć go jako katalogDocelowy. Jeśli CopyFolder katalogŻródlowy, katalogDocelowy już istnieje oraz jeśli argument zastąpić ma wartość katalogDocelowy, TRUE, to kopiowany katalog zastąpi istniejący katalog o tej samej zastąpić nazwie. CreateFolder (nazwa) Tworzy katalog o podanej nazwie CreateTextFile (nazwa, Tworzy plik tekstowy i zwraca egzemplarz obiektu TextStream zastąpić, unicode) skojarzony z tym plikiem. Argument zastąpić jest opcjonalną wartością logiczną określającą, czy należy zastąpić istniejącą już wersję pliku. Domyślenie argument ten ma wartość FALSE. Argument unicode jest opcjonalną wartością logiczną określającą, czy plik ma być zapisany w kodzie Unicode (TRUE), czy w kodzie ASCII(FALSE) DeleteFile (ścieżka, Usuwa plik określony przy użyciu ścieżki. Na końcu ścieżki może być wymuś) znak wieloznaczny. Wymuś jest argumentem opcjonalnym, przypisując mu wartość TRUE, wymuszamy usunięcie plików DeleteFolder (ścieżka, Usuwa katalog określony przy użyciu ścieżki. Na końcu ścieżki może wymuś) być znak wieloznaczny. Wymuś jest argumentem opcjonalnym, przypisując mu wartość TRUE, wymuszamy usunięcie katalogu DriveExists (ścieżka) Zwraca wartość logiczną informującą, czy istnieje napęd określony przez podaną ścieżkę FileExists (ścieżka) Zwraca wartość logiczną informującą, czy istnieje plik określony przez podaną ścieżkę FolderExists (ścieżka) Zwraca wartość logiczną informującą, czy istnieje katalog określony przez podaną ścieżkę GetAbsolutePathName Zwraca pełną ścieżkę na podstawie podanej specyfikacji: Jeśli (określenieŚcieżki) argument będzie miał wartość „c:” , to zostanie zwrócona pełna ścieżka dostępu do katalogu aktualnego na dysku C. Jeśli natomiast argument będzie miał wartość „c:..”, to zostanie zwrócona ścieżka do katalogu nadrzędnego względem aktualnego katalogu. GetBaseName (ścieżka) Zwraca samą nazwę (bez rozszerzenia) pliku określonego za pomocą podanej ścieżki. GetDrive (ścieżka) Zwraca egzemplarz obiektu Drive reprezentujący napęd, na którym znajduje się plik określony za pomocą podanej ścieżki. Zwraca łańcuch znaków zawierający nazwę napędu dla określonej GetDriveName (ścieżka) ścieżki. 59 GetExtensionName (ścieżka) GetFile (ścieżka) Zwraca rozszerzenie pliku określonego za pomocą podanej ścieżki. Zwraca egzemplarz obiektu File reprezentujący plik określony przez podaną ścieżkę. GetFileName (ścieżka) Zwraca nazwę pliku lub katalogu. A zatem wywołanie GetFileName („c:\Inetpub\wwwroot\default.asp”) zwróci łańcuch znaków „default.asp”. GetFolder (ścieżka) Zwraca egzemplarz obiektu Folder reprezentujący katalog określony przez podaną ścieżkę. Zwraca egzemplarz obiektu reprezentujący Folder nadrzędny w ParentFolder stosunku do podanego foldera. Zwraca ścieżkę do określonego katalogu specjalnego. Argument GetSpecjalFolder (określenie) określenie można określić za pomocą następujących stałych: WindowsFolder, SystemFolder oraz TemporaryFolder. Stałym tym odpowiadają wartości: 0,1 oraz 2. MoveFile plikŻródlowy, Przenosi plikŻródlowy , zapisując go jako plikDocelowy. plikDocelowy Przenosi katalogŻródlowy, zapisując go jako katalogDocelowy MoveFolder katalogŻródlowy, katalogDocelowy OpenTextFile (nazwa, Zwraca egzemplarz obiektu TextStream skojarzony z plikiem o podanej tryb, utworz, format) nazwie. Argument tryb określa, czy plik powinien być otwarty w trybie do odczytu(1), do zapisu (2), czy też w trybie do dopisywania (8). Argument utworz określa, czy w razie gdyby plik nie istniał, to należy go utworzyć. Jeśli argument format ma wartość -1, to zawartość pliku będzie zapisywana w kodzie Unicode. Jeśli argument ten będzie miał wartość 0, to zawartość pliku zostanie zapisywana w kodzie ASCII. Wartość -2 tego argumentu oznacza, że zawartość pliku powinna być zapisywana w kodzie określonym przez ustawienia systemowe. Obiekt FileSystemObject zawiera kolekcję Drives, która zawiera egzemplarze obiektów reprezentujących wszystkie napędy na serwerze. Obiekt FileSystemObject posiada dwie metody pozwalające na sprawdzenie, czy podany plik lub katalog istnieje na serwerze: FolderExists oraz FileExists. Metoda FolderExists wymaga podania jednego argumentu – nazwy katalogu oraz fizycznej ścieżki dostępu do niej. Jeśli podany katalog istnieje, to metoda zwraca wartość True. W przeciwnym przypadku zwracana jest wartość False. Przykład strony ASP, która sprawdzi się, czy jest na dysku „C:\” katalog "C:\Inetpub\wwwroot\bookstore", jest pokazany w listingu FolderExist1.asp: 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 60 6. Dim objFSO 7. Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 8. If objFSO.FolderExists ("C:\Inetpub\wwwroot\bookstore") Then 9. Response.Write "Katalog 'bookstore' istnieje!" 10.Else 11. Response.Write "Katalog 'bookstore' nie istnieje!" 12.End If 13.Set objFSO = Nothing 14.%> 15.</BODY> 16.</HTML> W linii 6 jest deklarowana zmienna, w której będzie przechowywany egzemplarz obiektu FileSystemObject. W linii 7 ten obiekt jest stworzony za dopomogą metody CreateObiect wbudowanego obiektu Server. W linii 8 rozpoczyna się instrukcja IF...Then, w której warunku jest umieszczona metoda FolderExists. Argument tej metody jest zadany przez zmienną typu STRING: "C:\Inetpub\wwwroot\bookstore". Jeśli wywołanie metody FolderExists zwróci wartość TRUE, to będzie w linii 9 informujący o tym, iż katalog „bookstore” istnieje. W przeciwnym razie – jeśli wywołanie metody zwróci wartość FALSE – to w linii 11 wyświetlany komunikat informujący o tym, iż katalog „bookstore” nie istnieje. W linii 13 usuwa się obiekt FileSystemObject. Fizyczny dostęp do plików aplikacji można wyznaczyć za dopomogą kolekcji Request.ServerVariables. Związki pomiędzy katalogiem wirtualnym oraz katalogiem fizycznym można ustalić za dopomogą metody Server.MapPath. Te dwa sposoby pozwalają nie wykorzystać ścieżki fizyczne w kodzie programu i aplikacja zostanie niezależna od środowiska komputerowego. Ścieżki fizyczne mogą być zapisane w zmienne aplikacji do pliku global.asa. Argumentem metody FolderExist może być rezultat zwracany przez metodę MapPath. Metoda MapPath jest metodą obiektu Server oraz przekształca ścieżkę wirtualną na fizyczną. Przykład wykorzystania metody MapPath jest pokazany w listingu Folderexist.asp: 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 6. Dim objFSO 61 7. Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 8. If objFSO.FolderExists (Server.MapPath ("folderdata")) Then 9. Response.Write "Katalog folderdata istnieje!" 10.Else 11. Response.Write "Katalog folderdata nie istnieje!" 12.End If 13.Set objFSO = Nothing 14.%> 15.</BODY> 16.</HTML> W linii 8 jest wykorzystana metoda MapPath. Ta metoda szuka katalog „folderdata” we wszystkich podkatalogach, dla których katalog z plikiem „Folderexist.asp” jest macierzystym. Dla poszukiwania w katalogach górnego poziomu trzeba wykorzystać skrót „..\nazwa_katalogu”. Przykład takogo poszuku jest pokazany w listingu Folderexist2.asp: 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 6. Dim objFSO 7. Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 8. If objFSO.FolderExists (Server.MapPath ("..\bookstore")) Then 9. Response.Write "Katalog bookstore istnieje!" 10.Else 11. Response.Write "Katalog bookstore nie istnieje!" 12.End If 13.Set objFSO = Nothing 14.%> 15.</BODY> 16.</HTML> W linii 8 jest zadane poszukiwanie katalogu "bookstore” we wszystkich ścieżkach katalogu macierzystego. Wykorzystanie obiektów File i Folder Właściwości obiektu FILE 62 Właściwość Opis Attributes Służy od pobierania oraz określania wartości poszczególnych atrybutów pliku Zwraca datę oraz godzinę utworzenia pliku Zwraca datę oraz godzinę ostatniego dostępu do pliku Zwraca datę oraz godzinę ostatniej modyfikacji pliku Zwraca literę określającą napęd, na którym zapisany jest plik Służy do pobrania lub określenia nazwy pliku Zwraca egzemplarz obiektu reprezentujący folder nadrzędny w stosunku do podanego pliku Zwraca pełną ścieżkę dostępu do pliku, włącznie z jego nazwą Zwraca nazwę, z której mogą korzystać programy nie obslugujące długich nazw plików. Zwraca ścieżkę dostępu do pliku, z której mogą korzystać programy nie obslugujące długich nazw plików. Zwraca wielkość pliku wyrażoną w bajtach Zwraca dostępne informację na temat typu pliku („Text File) DateCread DateLastAccessed DateLastModified Drive Name ParentFolder Path ShortName ShortPath Size Type Metody obiektu FILE Metody Copy (docelowy, zastąpić) Opis Kopiuje plik, zapisując go w miejscu określonym przez argument docelowy. Jeśli plik o podanej nazwie istnieje oraz jeśli wartość argumentu zastąpić wynosi TRUE, to istniejący plik jest zastępowany plikiem kopiowanym Usuwa plik. Jeśli argument wymuś ma wartość TRUE, to plik zostanie usunięty nawet wtedy, gdy jest oznaczony tylko dla odczytu. Przenosi plik w miejsce określone przez argument docelowy. Zwraca egzemplarz obiektu TextStream skojarzonego z danym plikiem. Argument tryb określa, czy plik powinien być otwarty do odczytu(1), do zapisu(2), czy też w trybie do dopisywania (8). Jeśli argument format ma wartość -1, to zawartość pliku będzie zapisywana w kodzie Unicode. Wartość -2 tego argumentu oznacza, że zawartość pliku zostanie zapisana w kodzie określonym przez ustawienia systemowe. Delete (wymuś) Move (docelowy) OpenAsTextStream (tryb, format) Właściwości obiektu Folder Właściwości Opis Służy od pobierania oraz określania wartości poszczególnych atrybutów pliku Zwraca datę oraz godzinę utworzenia katalogu DateCread DateLastAccessed Zwraca datę oraz godzinę ostatniego dostępu do katalogu Attributes 63 DateLastModified Zwraca datę oraz godzinę ostatniej modyfikacji katalogu Zwraca literę określającą napęd, na którym zapisany jest katalog Drive Zwraca kolekcje reprezentującą wszystkie pliki znajdujące się w Files danym katalogu. Dla każdego pliku katalogu kolekcja ta zawiera odrębny egzemplarz obiektu File. Zawiera TRUE jeśli aktualny katalog wchodzi do jakikolwiek IsRootFolder katalogu nadrzędnego Zawiera egzemplarz obiektu Folder reprezentujący katalog ParentFolder nadrzędny względem aktualnego Służy do pobrania lub określenia nazwy pliku Name Zwraca egzemplarz obiektu reprezentujący folder nadrzędny w ParentFolder stosunku do podanego pliku Zwraca pełną ścieżkę dostępu do pliku, włącznie z jego nazwą Path Zwraca nazwę, z której mogą korzystać programy nie obsługujące ShortName długich nazw plików. Zwraca ścieżkę dostępu do katalogu, z której mogą korzystać ShortPath programy nie obsługujące długich nazw plików. Zwraca wielkość pliku wyrażoną w bajtach Size Zawiera kolekcję zawierającą obiekty Folder reprezentujące Subfolders wszystkie katalogi zapisane w aktualnym katalogu . Zwraca dostępne informację na temat typu katalogu („ File Folder”, Type „Recycle Bin”) Metody obiektu Folder Metody Copy (docelowy, zastąpić) CreateTextFile (nazwa, zastąpić, unicode) Delete (wymuś) Move (docelowy) Opis Kopiuje katalog, zapisując go w miejscu określonym przez argument docelowy. Jeśli katalog o podanej nazwie istnieje oraz jeśli wartość argumentu zastąpić wynosi TRUE, to istniejący katalog jest zastępowany katalogiem kopiowanym Tworzy plik tekstowy i zwraca egzemplarz obiektu TextStream skojarzony z tym plikiem. Argument zastąpić jest opcjonalną wartością logiczną określającą, czy należy zastąpić istniejącą już wersję pliku. Domyślenie argument ten ma wartość FALSE. Argument unicode jest opcjonalną wartością logiczną określającą, czy plik ma być zapisany w kodzie Unicode (TRUE), czy w kodzie ASCII(FALSE) Usuwa katalog. Jeśli argument wymuś ma wartość TRUE, to katalog zostanie usunięty nawet wtedy, gdy jest oznaczony tylko dla odczytu. Przenosi katalog w miejsce określone przez argument docelowy. W listingu ReadKatalog.asp jest pokazany kod pozwalający wyświetlić na stronie internetowej treść katalogów i plików dysku komputera, na którym jest uruchomiony serwer WWW. Listing ReadKatalog.ASP 64 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 6. Const DEFAULT_PATH = "c:\" 7. Dim objFSO,objSubfolder,objFolder,objFile 8. Dim strCurrentPath, strPath 9. strCurrentPath = Request.QueryString ("path") 10.If strCurrentPath ="" Then 11. strCurrentPath = DEFAULT_PATH 12.End If 13.Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 14.Set objFolder = objFSO.GetFolder (strCurrentPath) 15.Response.Write "Zawartosc katalogu" 16.Response.Write objfolder.Path & "<p>" 17.If Not objFolder.IsRootFolder Then 18. strPath = objFolder.ParentFolder.Path 19. strPath = Server.URLEncode (strPath) 20.%> 21.<A HREF = "ReadKatalog.asp?path=<%=strPath%>">..</A><BR> 22.<% 23.End If 24.For Each objSubfolder in objFolder.Subfolders 25. strPath = Server.URLEncode(objSubfolder.Path) 26.%> 27.<A HREF="ReadKatalog.asp?path=<% =strPath %>"> 28. <%= objSubfolder.Name %></A><BR> 29.<% 30.Next 31.Response.Write "<p>" 32.For Each objFile in objFolder.Files 33. Response.Write objFile.Name 34. Response.Write "<BR>" 35.Next 36.Set objFolder = Nothing 37.Set objFSO = Nothing 38.%> 39.</BODY> 40. </HTML> 65 W linii 6 jest stworzona stała, określającą katalog początkowy, od którego trzeba zaczynać przeglądanie dysku. W liniach 7 i 8 są deklarowane zmienne dla obiektów oraz łańcuchów znaków. W linii 9 jest pobierana ścieżka, która mogła zostać przekazana do skryptu ReadKatalog.asp w łańcuchu zapytania. Wartość ta będę używana do określenia nazwy przeglądanego katalogu. Jeśli wartość zmiennej path nie została określona, to będę używana wartość domyślna zapisana w stałej DEFAULT_PATH (linie 10 -12). W następnej kolejności są stworzone egzemplarzy obiektów FileSystemObject (linie 13) , Folder (linie 14). Przy pobieraniu katalogu wykorzysta się wartość zmiennej strCurrentPath. W liniach 15-16 jest wyświetlony nagłówek zawierający ścieżkę dostępu do aktualnego katalogu. Dla oznaczenia katalogu nadrzędnego używany jest symbol dwóch kropek:”..”. ten sam symbol wyświetlany jest przez kod umieszczony w liniach 17 do 23. Jeśli użytkownik znajduje się aktualnie w głównym katalogu, to symbol „..” nie powinien być wyświetlany. Stosowny warunek umieszczony jest w instrukcji If...Then zapisanej w linii 17 skryptu. Jeśli jednak użytkownik nie będzie wyświetlał zawartości katalogów głównego, to symbol „..” powinien się pojawić – pozwoli on użytkownikowi na wyświetlenie zawartości katalogu wyższego poziomu. Tworzone połączenie wywołuje tę samą stronę, przekazując do niej nową ścieżkę. W przypadku tego konkretnego połączenia będzie to ścieżka dostępu do katalogu nadrzędnego względem katalogu aktualnego. Ścieżka ta jest najpierw zapisywana w zmiennej strPath (linia 18), następne kodowana przy użyciu metody URLEncoded (linia 19), i wreszcie umieszczana jako część połączenia (linia 21). Metoda URLEncoded koduje podany łańcuch znaków w taki sposób, aby można go było bez problemu przesłać za pośrednictwem łańcucha zapytania (dla przykładu znaki „\” są znakami „/” w adresie URL). W następnej kolejności są utworzone połączenia do każdego z podkatalogów aktualnego katalogu. Do tego celu jest używana pętla For Each ...Next pobierająca poszczególne elementy kolekcji Subfolders objektu katalogu (linia 24). Obiekty odpowiadające poszczególnym podkatalogom są kolejnozapisywane w zmiennej objSubfolder. W liniach 25, 27,28 jest wyświetlane połączenie z aktualnie analizowanym podkatalogiem. W ostatnie części skryptu jest wyświetlana listę plików przechowywanych w aktualnym katalogu. W tym celu jest pobierana zawartość kolekcji Files. Otwieranie plików W plikach tekstowych można rejestrować oraz odczytywać pewne informacje. Aby wykonać każdą z tych operacji, w pierwszej kolejności trzeba otworzyć plik. Można to zrobić dwoma sposobami: 66 1. Za pomocą obiektu FileSystemObiect oraz go metod. 2. Przy stworzeniu obiektu TextStream (strumienia tekstowego). Pierwszy sposób jest wywołanie metody OpenTextFile obiektu FileSystemObiect . Te wywołanie ma następującą składnię: obiektFSO.OpenTextFile (nazwaPliku, tryb, twórz, format) Ostatnie trzy argumenty są opcjonalne. Dla użycia któregoś z nich, trzeba podać także wszystkie te, które znajdują się przed nim. NazwaPliku - to jest nazwa pliku, który trzeba otworzyć. Wartość tego argumentu powinna być fizyczną ścieżką dostępu do pliku. Przy określaniu tej ścieżki może być używana metoda Server.MapPath. Argument tryb może przyjąć jedną z trzech wartości: ForReading – lub prosto wartość – (1) ForWriting – lub prosto wartość – (2) ForAppending – lub prosto wartość – (8) Wartości te określają, czy trzeba odczytywać z pliku dane, pisać dane, dodawać dane. Po domyśleniu jest ustalona wartość ForReading(1).Wszystkie te konstanty muszą być definiowane w skryptu. Jeśli pliku określonego przy użyciu argumentu nazwaPliku nie ma, to istnieją dwie możliwości: stworzyć nowy pusty plik lub wygenerować komunikat o błędzie. Argument twórz pozwoli wybrać tę możliwości. Jeśli argument ma wartość TRUE, to tworzony jest nowy plik. W przeciwnym przypadku (FALSE) – generowany jest komunikat o błędzie. Po domyśleniu jest ustalona wartość TRUE. Argument Format określa, czy zawartość pliku powinna być zapisywana w kodzie ASCI, czy też w Unicode. Wartość 0 oznaczy, iż zawartość pliku ma być zapisywana w kodzie ASCII. Wartość 1 oznaczy, iż zawartość pliku ma być zapisywana w Unicode. Wartość 2 oznacza, iż należy użyć domyślnej wartości systemowej. Obiekt TextStream realizuje konsekwentny dostęp do plików. Metody tego obiektu mogą pracować tylko z tekstowymi plikami. Dla dostępu do plików binarnych trzeba stworzyć swój nowy obiekt COM z odpowiednimi metodami. Właściwości oraz metody tego obiektu są pokazane w tablicach niżej. Właściwości obiektu TextStream Właściwość Opis Jest równa „True”, kiedy wskaźnik AtEndOfLine 67 AtEndOfStream Column Lines Metody obiektu TextStream Metoda Close Read (n) ReadAll(strZmienna) ReadLine Skip(n) SkipLine Write(strZmienna) WriteLine(strZmienna) umieszczony jest w koncie linii pliku Jest równa „True”, kiedy wskaźnik umieszczony jest w koncie pliku Jest równa pozycji wskaźnika w linii Jest równa pozycji wskaźnika w pliku Opis Zamykanie pliku Czytanie znaków z pliku Czytanie całej zawartości pliku Czytanie jednej linii pliku Przeniesienie wskaźnika na „n” znaków w pliku Przeniesienie wskaźnika na jedną linię w pliku Zapisywanie łańcucha znaków do pliku z pozycji wskaźnika Zapisywanie linii Obiekt TextStream może być stworzony za dopomogą następnych metod obiektu FileSystemObject: OpenTextFile oraz OpenAsTextStream. Fragment kodu otwierania pliku za dopomogą metody OpenTextFile obiektu FSO pokazany niżej: ... Dim objOpenFile,objFSO,strPath strPath = Server.MapPath(„text.txt”) Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”) SetobjOpenFile = objFSO.OpenTextFile(strPath,1) … Istnieje jeście inny sposób otwierania stworzenia obiektu TextStream. Ten obiekt może być stworzony za dopomogą metody OpenAsTextStream obiektu File. Metoda OpenAsTextStream wymaga podania dwóch argumentów. Pierwszym z nich jest określenie trybu: ForReading (1), ForWriting(2) lub ForAppending(8). Drugi argument określa format otwieranego pliku i jest analogiczny poprzedniemu przypadku. Fragment kodu dla tego sposobu może mieć następny wygląd: ... 68 Dim objOpenFile,objFSO,strPath Const ForReading = 1 Set objFSO = Server.CreateObject(“Scripting.FileSystemObject”) Set objFile = objFSO.GetFile(“Server.MapPath(“text.txt”)) Set objOpenFile = objFile.OpenAsTextStream(ForReading) … Stworzenie plików Przykład stworzenia pliku jest pokazany w listingu CreateFile.asp. Listing CreateFile.asp 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 6. Dim objFSO,objNewFile 7. Set objFSO = Server.CreateObject("Scripting.FileSystemObject") 8. If objFSO.FileExists (Server.MapPath("Folderdata\Nowy.txt") )Then 9. Response.Write "plik 'Nowy.txt' juz istnieje!" 10.Else 11. Set objNewFile = objFso.CreateTextFile _ 12. (Server.MapPath("Folderdata\Nowy.txt")) 13. Response.Write "plik 'Nowy.txt' jest stworzony!" 14. objNewFile.Close 15. Set objNewFile = Nothing 16.End If 17.Set objFSO = Nothing 18.%> 19.<br> 20.<br> 21.<br> 22.<br> 23.<A href="ReadZrodlo.asp?URL=<% =Request.ServerVariables("URL")%>"> 24.Wyswietli kod zrodlowy ASP tej strony</A> 25.</BODY> 26.</HTML> 69 Odczytywanie zawartości plików Jeżeli plik jest otworzony, można odczytać go zawartość na stronę asp. Dostęp do znaków i rekordów plików jest realizowany przez metody obiektu strumienia tekstowego. Istnieje trzy metody tego obiektu: Read (ilość znaków) ReadLine ReadAll Pierwsza metoda pozwala na odczytywanie określonej ilości znaków. Druga metoda pozwala na odczytywania całą linię znaków. Trzecia metoda zwraca łańcuch znaków, na który składa się cała zawartość pliku. Odczytywanie całego pliku zabiera sporo pamięci, dlatego metody tej należy używać wyłącznie stosowne małych plików. Przykład odczytywania zawartości plików ASP pokazany niżej. Dla uruchomienia tego pliku trzeba uruchomić stronę createfile.asp Na tej stronę trzeba kliknięć do tekstu „Wyświetli kod źródłowy ASP tej strony”, który odwoła do strony ReadZrodlo.asp. Listing ReadZrodlo.asp: 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <HTML> 4. <BODY> 5. <% 6. Const ForReading = 1 7. Dim objFSO,objOpenFile,strPath,strText 8. strPath = Request.QueryString("URL") 9. strPath = Server.MapPath(strPath) 10.Set objFSO = _ 11. Server.CreateObject("Scripting.FileSystemObject") 12.Set objOpenFile = _ 13. objFso.OpenTextFile(strPath, ForReading) 14.Response.Write "<PRE>" 15.Do While Not objOpenFile.AtEndOfStream 16. strText = objOpenFile.ReadLine 17. Response.Write Server.HTMLEncode(strText) 18. Response.Write "<BR>" 19.Loop 20.objOpenFile.Close 70 21.Set objOpenFile = Nothing 22.Set objFSO = Nothing 23.Response.Write "</PRE>" 24.%> 25.</BODY> 26.</HTML> W linii 6 jest stworzona stałą ForReading. W następnej linii są deklarowane zmienne. W linii 8 z łańcucha zapytania jest pobierany adres URL, który w linii 9 jest przekształcony do postaci fizycznej ścieżki dostępu, używana do tego jest metoda Server.MapPath. W liniach 10 – 13 jest stworzony egzemplarz obiektu FileSystemObject oraz obiektu TextStream. W liniach 14 i 23 są wyświetlanie parę znaczników <PRE> i </PRE>, która gwarantuje poprawne wyświetlanie odstępów. Poprawne wyświetlanie kodu HTML bez jego interpretacji jest uzyskane dzięki wykorzystaniu metody Server.HTMLEncode w linii 17. W liniach 15 – 19 jest pętla dla czytania informacji z pliku. Koniec pliku wyznaczy się przez wartość TRUE właściwości AtEndOfStream obiektu TextStream (linia 15). Gdy jest osiągnięty koniec pliku, realizacja pętli zostaje zakończona. Wtedy zamyka się plik i są usuwane z pamięci wszystkie obiekty (linii 20-22). Strona ASP, którą trzeba wyświetlić musi mieć następny kod dla połączenia ze stroną ReadZrodlo.asp: <A href="ReadZrodlo.asp?URL=<% =Request.ServerVariables("URL")%>"> Wyswietli kod zrodlowy ASP tej strony</A> Zapisywanie plików na serwerze Do zapisywania łańcucha znaków w pliku służy metoda Write obiektu TextStream. Poniżej przedstawiony jest sposób jej użycia: ObjTextStream.Write („łancuchznaków”). Metoda WriteLine zapisuje w pliku łańcuch znaków, dodając na jego końcu znak nowej linii i powrotu karetki. Jeśli żaden argument nie zostanie przekazany, to metoda dopisze do pliku znak nowej linii I powrotu karetki. Przykład wykorzystania sposobów zapisywania danych pokazany w listingu Write1.asp. Listing write1.asp <%@ Language = VBScript %> 4. <% Option Explicit %> 71 5. <html> 6. <body> 7. <% 8. Const ForWriting = 2 9. Dim objOpenFile, objFSO,strPath 10.strPath = Server.MapPath ("folderdata\test.txt") 11.Set objFSO =_ 12.Server.CreateObject ("Scripting.FileSystemObject") 13.If Not objFSO.FileExists (strPath) Then 14.Set objOpenFile = objFSO.CreateTextFile(strPath,false) 15.objOpenFile.Close 16.%> 17.<p><br> 18.<%Response.write ("Plik 'folderdata\test.txt' jest stworzony!") %><br> 19.<% 20.End if 21.Set objOpenFile =objFSO.OpenTextFile(strPath, ForWriting) 22.objOpenFile.Write("abcde") 23.objOpenFile.Write("fgh") 24.objOpenFile.Write("ijklm") 25.objOpenFile.WriteLine ("1234567890") 26.objOpenFile.Write("nopq") 27.objOpenFile.WriteLine 28.objOpenFile.Write("rstuv") 29.objOpenFile.Close 30.Set objOpenFile = Nothing 31.%><br> 32.<%Response.write ("Plik jest zapisany!")%><br> 33.</p> 34.</body> 35.</html> 72 Dostęp do baz danych Standard ODBC (Open Database Connectivity) Różne DBMS mogą realizować różne formaty zapisu danych. Interfejsy bezpośredniego dostępu do tych DBMS, stworzone przez różnych producentów, też mogą się różnić. Wykorzystanie każdego z tych interfejsów jest związane z koniecznością znajomości specjalnych narzędzi programistycznych określanych jako API (Application Programming Interface) służących do obsługi konkretnej bazy. API każdej bazy może zawierać różne funkcje oraz obiekty. Wskutek tego konsekwentności zapytań do różnych baz danych, różnych serwerów baz danych mogą też się różnić. To znaczy, np., że dla bazy danych w środowisku „ORACLE” trzeba konstruować inne konsekwentności funkcji i obiektów połączenia i zapytań SQL niż dla tej samej bazy w środowisku „INFORMIX”. W celu usunięcia tej wady firma MICROSOFT w 1992r opracowała standard ODBC (Open Database Connectivity). Technologia ODBC wprowadza jedyny interfejs API dostępu do różnych typów baz danych. Język SQL jest wykorzystywany jako główny uniwersalny dialekt wszystkich baz danych. Standard ODBC pozwala realizować technologię „Klient – Serwer”, która realizuje główne operacji przetwarzania danych na serwerze, a klient tylko otrzymuje rezultaty. Bazy danych potrafiące korzystać z ODBC nazywają się bazami zgodnymi z ODBC. Architektura ODBC jest pokazana na rys. 9. Aplikacje nie są połączone z konkretnym interfejsem (API) jakikolwiek DBMS, a realizują jedyny standard zapytań do menedżera ODBC – sterowników (ODBC-drivers). Menedżer ODBC podłącza potrzebny ODBC – sterownik, który jest stworzony przez producenta konkretnej DBMS. Dla podłączenia ODBC – sterownika trzeba stworzyć profile ODBC w trybie (Source ODBC…) panelu sterowania systemu operacyjnego. Teraz istnieją ponad 50 typów ODBC – sterowników dla różnych DBMS. Standard ODBS pozwala realizować zapytania SQL bezpośrednio z programów użytkownika. W tym celu można wykorzystywać dynamiczny SQL. Główne wady technologii dostępu do baz danych przez ODBC: Aplikacje są przystosowane do platformy MS Windows Wzrasta czas obróbki zapytań dzięki dodatkowej warstwie programów. 73 Jest potrzebna uprzednia instalacja ODBC – sterownika, profile ODBC dla każdej stacji. Parametry tej instalacji jest statyczne i użytkownik nie może ich zmienić. Konieczność stosowania wielu odwołań do procedur niskiego poziomu . Application 1 Application 2 ... Application N The manager of drivers ODBC Driver ODBC ACCESS Source of data ODBC ACCESS Driver ODBC SYBASE Source of data ODBC SYBASE ... Driver ODBC ORACLE Source of data ODBC ORACLE ... Fig. 9 74 Uniwersalna strategia dostępu OLE DB Technologia ODBC firmy Microsoft zaopatrzy ogólny interfejs dostępu do baz danych, które są kompatybilne przez SQL. Każda baza danych mająca interfejs ODBC zawiera sterownik (driver) , który realizuje bezpośrednio ten interfejs. Interfejs zawiera bibliotekę funkcji specjalnych napisanych w języku C++ . Zastosowanie tej biblioteki może być wadą przy realizacji dostępu aplikacji stworzonych w innym środowisku języków oprogramowania. Żeby usuwać te wady różne producenci stwarzają specjalne komponenty obiektowe dostępu do baz danych. Obiektowy model DAO (Data Access Objects) jest pierwszy uniwersalny interfejs API, zawierający instrukcji dostępu do danych na wysokiem poziomu. DAO zawiera obiekty baz danych (component DataBase), obiekty tabel(component TableDef), obiekty definicji kwerend (komponent QueryDef), obiekty rezultatów zapytań do bazy danych (komponent RecordSet) oraz inne obiekty. Model DAO jest przeznaczony przede wszystkim dla dostępu do baz danych Access. Ten model nie odpowiada wszystkim standardom oraz specyfikacjom SQL . Ten model teraz jest zamieniony nowym modelem RDO (Remote Data Obiekt). Technologia RDO jest przeznaczona przede wszystkim do tworzenia programów korzystających z baz danych i działających w architekturze rozproszonej. RDO wchodzi do Visual Basica, Visual FoxPro oraz do Microsoft SQL Servera. Technologia RDO została z kolei zastąpiona przez technologię ADO (ActiveX Data Objekts). Wszystkie te rozwiązania mają jednak swoje wady. Firma Microsoft zaproponowała zbiór obiektów OLE DB( Object Linking and Embedding for DataBase), który pozwalają aplikacjom wykorzystać oraz sterować danymi w bazach danych przez swoje obiekty. Technologia OLE DB gwarantuje dostęp do jakikolwiek baz danych włącznie nie relacyjne modeli danych. Oprócz tego przez OLE DB można udostępnić do plikowych oraz pocztowych systemów, tablic EXEL, graficznych plików, innych obiektów stworzonych w różnych aplikacjach. Technologia OLE DB jest obiektowo - orientowana specyfikacja na podstawie C++ API. W pewnym stopniu OLEDB zastępuje ODBC. OLEDB zawiera odpowiednie sterowniki, dzięki czemu jest w pełni zgodny ze wszystkimi źródłami danych ODBC. Technologia ADO (Active Data Obiects) to jest rozwiązanie technologii ASP dostępu do baz danych, które jest realizowane we WWW serwerze IIS (Internet Information Server) firmy Microsoft. Technologia ADO zawiera wszystkie lepsze cechy technologii RDO oraz DAO i musi zamienić te ostanie technologii. Technologia ADO zawiera następne funkcje: 75 Stworzenia niezależnych obiektów baz danych Wsparcie zapamiętanych procedur baz danych Stworzenia kursorów dostępu do danych Wsparcie mechanizmów transakcji. Głównymi zaletami technologii ADO są nie komplikowane wykorzystanie, ASP page ActiveX Data Objects (ADO) OLEDB ODBC Manager Sybase Access Oracle 8i MS SQL Server Other source of DataBase INFORMIX Fig.10 prędkość, małe obciągi RAM oraz dysku. Na Rys.10 jest przedstawiony schemat współpracy różnymi technologii dostępu do danych. technologii ASP z 76 Dostęp do baz danych przy użyciu ADO ADO (ActiveX Data Objects) dostarczane jest wraz z ASP i daje projektantom możliwość podłączania się do baz danych. ADO współpracuje ze wszystkimi źródłami danych OLEDB, czyli także ze źródłami zgodnymi z ODBC. A zatem ADO jest w stanie współpracować niemal ze wszystkimi wykorzystywanymi aktualnie bazami danych. Na rys.11 jest przedstawiony diagram prezentujący wzajemne relacje występujące pomiędzy poszczególnymi obiektami modelu obiektowego ADO. ADO zawiera 6 głównych klasy obiektów: CONNECTION COMMAND PARAMETERS RECORDSET FIELDS ERRORS. Model ADO może tworzyć kolekcje nowych obiektów: PARAMETRS, FIELDS, ERRORS. Otwieranie oraz zamykanie połączenia z bazą danych(Obiekt CONNECTION) Obiekt CONNECTION połączy związek pomiędzy skryptem strony ASP oraz źródłem danych. Utworzenia takiego połączenia zawsze jest pierwszym etapem obsługi bazy. Ten obiekt pozwala także uruchomić instrukcje SQL. Dla zachowywania rezultatów instrukcji trzeba stworzyć obiekt klasy RECORDSET. Klasa CONNECTION zawiera następne metody: Open( ) , Close( ) – połączenie lub wyłączenia ze źródłem danych Execute( ) – uruchomienie instrukcji dla wyznaczonego połączenia. Ta metoda może być wykorzystana dla uruchomienia zapamiętanych procedur, które nie mają parametrów. Procedury z parametrami mogą być uruchomiane przez metody obiektu Command. BeginTrans( ), CommitTrans( ) oraz RollbackTrans( ) – sterowanie transakcjami dla danego połączenia. 77 Connect Open(), Close() Execute( ) BeginTrans() CommitTrans( ) RollbackTrans ( ) Errors Error Command Execute ( ) CreateParametr () Parameters Recordset BOF EOF RecordCount MoveFirst ( ) MoveLast ( ) MoveNext () MovePrevious () Move() AddNew () UpDate () Delete () Open() Close() Append ( ) Delete ( ) Item () Refresh () Parameter Fields Fig 11 Field 78 Obiekt CONNECTION przechowuje informację o źródle danych, z którym trzeba połączyć się. Obiekt ten trzeba stworzyć tak, jak wszelkie inne komponenty – przy użyciu metody Server.CreateObject: Dim objConn Set objConn = Server.CreateObject(“ADODB.Connection”) Skrót „ADODB” oznaczy bazę wszystkich obiektów ADO. ”Connection” – to jest komponent tej bazy. Mogą się zdarzyć takie sytuację , gdy jednocześnie trzeba otworzyć kilka połączeń z różnymi źródłami danych. W takich wypadkach będą potrzebować kilku egzemplarzy obiektu CONNECTION. Do bazy danych można połączyć się dwoma sposobami: przez DSN oraz bez pomocy DSN (Data Source Name). DSN systemu to jest plik zawierający informację o bazach danych (rodzaj bazy , jej położenie oraz inną informację). DSN jest niezbędny dla ODBC sterownika. DSN stwarzają się przez tryb „Źródła danych ODBC” systemu operacyjnego. Obiekt CONNECTION musi być poinformowany, którego DSN ma użyć. To może być realizowane np. w taki sposób: ObjConn.ConnectionString = ”DSN = NazwaZrodla.dsn” Dla połączenia bez pomocy DSN trzeba stworzyć łańcuch znaków nazywany łańcuchem połączenia. Łańcuch połączenia musi zawierać właściwości bazy danych, sterownika ODBC oraz położenia bazy. Stworzenie egzemplarzy obiektu CONNECTION i podanie informację dotyczące bazy danych jeszcze nie może otworzyć samego połączenia. Aby to zrobić , trzeba wykorzystać się metodą OPEN() obiektu CONNECTION: <% Dim objConn Set objConn = Server.CreateObject(“ADODB.Connection”) ObjConn.ConnectionString = ”DSN = NazwaZrodla.dsn” ObjConn.Open %> lub w taki sposób: <% Dim objConn Set objConn = Server.CreateObject(“ADODB.Connection”) ObjConn.Open(”NazwaZrodla”) %> Jeśli baza danych wymaga podania nazwy użytkownika oraz hasła dostępu, to informację te można podać w wywołaniu metody OPEN(): ObjConn.Open strLancuchPolaczenia, strUzytkownik, strHaslo 79 Egzemplarz obiektu CONNECTION, podobne jak każdy inny egzemplarz jakiegokolwiek obiektu używanego w skryptach ASP, należy usunąć z pamięci, gdy nie będzie już potrzebny. Najpierw należy zamknąć połączenie, a dopiero potem usunąć egzemplarz obiektu CONNECTION z pamięci: ObjConn.Close Set objConn = Nothing Przed zamknięciem połączenia i usunięciem z pamięci egzemplarza obiektu CONNECTION należy zamknąć i usunąć z pamięci wszystkie egzemplarze obiektów RECORDSET skojarzone z tym połączeniem. Przykład wykorzystania obiektu CONNECTION jest pokazany w listingu DBConnectProperties.ASP Listing DBConnectProperties.ASP <%@ Language=VBScript %> <% option explicit %> <!--The references to ADO objects and constants--> <!--#INCLUDE virtual = "adovbs.inc" --> <html> <body> <% Dim objConn, objProp Set objConn = Server.CreateObject("ADODB.Connection") objConn.open("samochody") for each objProp in objConn.Properties Response.Write objProp.Name &": "& objProp.Value & "<BR>" next Response.Write "<BR>"&"ConnectionString: "& objConn.connectionString & "<BR>" objConn.Close set objConn = nothing %> </body> </html> Kolekcja ERRORS jest stworzona dla zachowywania informacji pro jakikolwiek błędy. Obiekt ERROR reprezentuje błąd wygenerowany przez źródło danych. Kolekcja ERRORS jest używana w sytuacji, gdy jedno wywołanie metody może wygenerować większą ilość błędów. 80 Obiekt RECORDSET Obiekt RECORDSET („Set” po angielsku „zbior”) pozwala na operowania danymi przechowywanymi w tabeli lub z różnych tabel bazy danych przez polecenie SQL. Obiekt ten zawiera zbiór rekordów pobranych z jednej tabeli lub z wielu tabel. Pozwala on na odczytywanie danych przechowanych w tabelach, modyfikowanie ich oraz gromadzenie informacji, jakie mają być dodane do bazy. Aktualne analizowany rekord oraz jego położenie względem pozostałych rekordów zbioru określane przez kursor bazy danych. Kursor to jest postać obiektu RECORDSET zawierający rezultat polecenia do bazy danych. Rezultat polecenia SQL zawiera treść i wartości rekordów tabel relacyjnej bazy danych. Kursor bazy danych przechowuje informacje o aktualnym położeniu w zbiorze rekordów pobranych w tabeli bazy. Przy stworzeniu obiektu RECORDSET wskaźnik rekordu bieżącego kursora odwzorowuje pierwszy rekord zbioru, a atrybuty BOF oraz EOF otrzymają wartości FALSE. Kiedy zbiór jest pusty atrybut RecordCount otrzyma wartość 0 (zero), lecz BOF oraz EOF – wartości TRUE. Klasa RECORDSET zawiera następne metody: MoveFirst(), MoveLast(), MoveNext(), MovePrevious() , Move() – przesuwają wskaźnik rekordu bieżącego. Metoda MoveFirst() pozwala na przeniesienie wskaźnika na pierwszy rekord zbioru. Obiektami RECORDSET są kursory, które mogą być sterowanymi tylko w jednym kierunku lub w dwóch kierunkach zbioru rekordów. W przypadku jednokierunkowego kursora można przechodzić jedynie do następnego rekordu zbioru, nie istnieje możliwości cofania się do poprzedniego wiersza lub przeskakiwania o kilka rekordów do przodu lub do tylu zbioru. Wykorzystanie metody MoveFirst() w przypadku jednokierunkowego kursora powoduje wywołanie metody Open(). W przypadku jednokierunkowego kursora może być wykorzystywana tylko metoda MoveNext(), która powoduje przesunięcie wskaźnika do następnego rekordu zbioru. Dla wyznaczenia końca lub początku rekordów trzeba wykorzystać właściwości BOF oraz EOF obiektu RECORDSET. Właściwość BOF będzie miała wartość TRUE, jeśli aktualnie wskaźnik położenia kursora znajduje się na pierwszym rekordzie zbioru. Właściwość EOF będzie miała wartość TRUE, jeśli aktualnie wskaźnik położenia kursora znajduje się na ostatnim rekordzie zbioru. Metoda MoveLast() powoduje przesunięcie wskaźnika na ostatni rekord zbioru. Metoda Move(liczba) powoduje przesunięcie wskaźnika o 81 podaną ilość rekordów względem jego aktualnego położenia. Metoda MovePrevious() pozwala na przesunięcie wskaźnika na poprzedni rekord. Ta metoda nie może być wykorzystywana razem z kursorem jednokierunkowym. AddNew(), Update() oraz Delete() – dodawanie nowych rekordów, aktualizacja oraz usuwanie istniejących rekordów, które jest związane z obiektem REKORDSET. Open(), oraz Close() – uruchomienie (Zamknięcie ) kursora, który reprezentuje rezultaty instrukcji, która jest poprzednio stworzona przez obiekt COMMAND. Metoda Open() odsyła na już stworzony obiekt CONNECT. Każdy obiekt RECORDSET zawiera kolekcję FILDS, która są zbiorem obiektów klasy FIELD. Kolekcja FILD reprezentuje jedną wierzę tabeli danych. Każdy obiekt FIELD w tej kolekcję reprezentuje jedną kolumnę tabeli danych. Na każdy obiekt FIELD w kolekcji FIELDS można odwalać przez nazwę lub liczbę numeryczną. Kolekcja FIELDS jest domyślną właściwością obiektu RECORDSET. Dla odwołań do elementów tej kolekcji mogą wykorzystywać równoznaczne się następne kody: 1. ObjRecordset (nazwaKolumny) 2. ObjRecordset (nazwaKolumny).Value 3. ObjRecordset.Fields(nazwaKolumny) 4. ObjRecordset.Fields(nazwaKolumny).Value W pierwszym wierszu jest odwołania do kolekcji FIELDS w sposób niejawny, jak i do właściwości VALUE kolekcji FIELDS. W wierszu 2 w niejawny sposób jest odwołania do kolekcji FIELDS, a w sposób jawny do właściwości VALUE tej kolekcji. W wierszu 3 jest umieszczone jawne odwołanie do kolekcji FIELDS oraz niejawne odwołanie do właściwości VALUE. W wierszu 4 umieszczone zostało jawne odwołanie zarówno do kolekcji FIELDS, jak i do właściwości VALUE. Obiekt FIELDS może zawierać właściwości które są pokazane w następnej tablice: Właściwość Opis VALUE To jest wartość pola tabeli NAME To jest nazwa kolumny tabeli TYPE To jest typ danej przechowywanej w komórce PRECISION Ilość cyfr, jaką można zapisać w danej numerycznej NUMERICSCALE Ilość cyfr przed przecinkiem 82 dziesiętnym, jaką można zapisać w danej numerycznej DEFINEDSIZE Maksymalna wielkość danej, jaką można zapisać w komórce, wyrażoną w bajtach ACTUALSIZE Faktyczna wielkość danej zapisanej w komórce wyrażoną w bajtach Na rysunku 12 jest przedstawiona reprezentację graficzną obiektu RECORDSET uwzględniającą właściwości każdego z elementów kolekcji FIELDS. Recordset Object Collections Fields Field object Field object ... Field object Field object Field object NAME VALUE TYPE PRECISION NUMERICSCALE DEFINEDSIZE ACTUALSIZE fig.12 83 Rekordy tabeli zapisywane są w obiekcie RECORDSET dopiero w wyniku wykonania metody OPEN(). Wywołanie metody OPEN() obiektu RECORDSET ma następującą postać: Set ObjRecordSet = Server.CreateObject(“ADODB.RecordSet”) ObjRecordset.Open CommandText, Connection/ConnectionString, CursorType, LockType, Options Argument CommandText ( źródło) - to jest łańcuch znaków (kod SQL), zawierający polecenie, które baza danych może wykonać. Argumentem może być także egzemplarz obiektu COMMAND. Argument Connection (połączenie) jest egzemplarzem obiektu CONNECTION lub łańcuchem znaków zawierającym informacje dotyczące połączenia. W przypadku użycia łańcucha znaków, będzie on musiał zawierać wszystkie informacje konieczne do zestawienia połączenia, które normalnie są podane we właściwości ConnectionString obiektu CONNECTION. Argument CursorType (typKursora) określa, w jaki sposób można poruszać się po zbiorze rekordów. Ten argument może mieć następne wartości: adOpenForwardOnly adOpenStatic adOpenKeyset adOpenDynamic Ten argument można także bezpośrednio wyznaczyć konstantami. Wartości tych konstant następne: Const adOpenForwardOnly =0 Const adOpenKeyset =1 Const adOpenDynamic =2 Const adOpenStatic = 3. Przy stworzeniu obiektu RECORDSET można wykorzystać dwa typy kursorów: jednokierunkowy lub dwukierunkowy. Podczas wywołania metody Open() obiektu RECORDSET domyślnie tworzony jest kursor jednokierunkowy (nazwa stałej ADO jest adOpenForwardOnly). Kursor tego typu jest najbardziej efektywny, jednak oferuje się ograniczone możliwości poszukiwania po zbiorze rekordów. Pozwala on na zmianę aktualnego rekordu tylko w jeden sposób – poprzez przejście do następnego rekordu. Przejście do kolejnych rekordów realizują się metodą MoveNext(). Kursor tego typu nazywają się kursorem „typu węża strażackiego”, gdyż, podobnie jak woda w wężu strażackim może poruszyć się tylko w jednym kierunku. Dwukierunkowe kursory zawierają następne typy: 84 Statyczny - nazwa stałej ADO jest adOpenStatic. Wyniki wykonania zapytania są przechowywane w tabeli tymczasowej, której wierszy nie są modyfikowane w momencie, gdy kursor był otwarty. To znaczy, że wszystkie zmiany przez innych użytkowników bazy danych w momencie, gdy kursor był otwarty, będą widoczne tylko po dodatkowym uruchomianiu obiektu RECORDSET. Zbiór kluczy - nazwa stałej ADO jest adOpenKeyset. Kursory tego typu zapisują w tymczasowej bazie danych klucze wszystkich wierszy zwróconych w wyniku wykonania polecenia. Dzięki przechowywaniu jedynie kluczy, są wykonane wszystkie modyfikację rekordów przez innych użytkowników bazy danych w momencie, gdy kursor jest otwarty, będą widoczne. Kiedy inny użytkownik usunie jakikolwiek rekord mający klucz w kursorze „Zbiór kluczy”, ten rekord nie będzie widoczny. Ten typ kursora nie pozwoli odwzorowywać nowe wierszy, które są zapisane przez innych użytkowników w momencie, gdy kursor był otwarty. Dynamiczny - nazwa stałej ADO jest adOpenDinamic. W przypadku użycia kursora dynamicznego za każdym razem, gdy zażądamy nowego rekordu, polecenie określające zawartość zwracanych wyników jest ponownie wykonywane. Oznacza to, że wszelkie modyfikacje wprowadzane w tabeli bazy danych będą widoczne, a co więcej, dodanie nowego rekordu może mieć wpływ na zawartość wynikowego zbioru rekordów. Ten kursor potrzebuje dużo resursów RAM. Argument LockType (blokowanie) określa, czy będzie zapisywanie danych w tabeli, a jeśli tak, to w jaki sposób. Określenie właściwości LockType jest konieczne, gdyż w tej samej chwili z bazy danych może korzystać większa ilość osób. W tym wypadku może być sytuacja, gdy dwie lub więcej osoby będą próbowały jednocześnie zmienić zawartość tego samego rekordu. Dla usuwania konfliktów trzeba zablokować rekord, żeby nikt inny nie mógłby go zmodyfikować, aż do momentu, gdy rekord zostanie odblokowany. Są dopuszczalne następne wartości argumentu LockType: adLockReadOnly adLockPessimistic adLockOptimistic adLockBatchOptimistic Argument LockType może być bezpośrednio zadany przez konstanty. Wartości tych konstant następne: 85 Const adLockReadOnly = 1 Const adLockPessimistic = 2 Const adLockOptimistic = 3 Const adLockBatchOptimistic = 4 Domyślne argument LockType ma wartość odpowiadającą stałej ADO adLockReadOnly, to znaczy, że można jedynie odczytywać informacje pobrane z bazy danych – nie można ich modyfikować, ani dodawać. Przy tym argumencie niema blokowania rekordów bazy danych. Pesymistyczne blokowanie. Wartość adLockPessimistic oznaczy się, że rekordy są blokowane w momencie rozpoczynania edycji do momentu zamknięcia obiektu RECORDSET. Blokowane rekordy są niedostępne dla innych użytkowników. Ma to na celu uniknięcie sytuacji, w której wartości pól rekordu zmieniają się w czasie pomiędzy rozpoczęciem wpisywania wartości, a wywołaniem metody UPDATE. Trzeba unikać tego blokowania we WWW aplikacjach z dużej ilości użytkowników. Optymistyczne blokowanie. Wartość adLockOptimistic oznaczy się, że rekordy są blokowane wyłącznie w czasie wykonywania metody UPDATE. Istnieje prawdopodobieństwo że kilka użytkowników będą modyfikować ten samy rekord. W tym przypadku będzie plątanina. Optymistyczne grupowe blokowanie. Wartość adLockBatchOptimistic jest potrzebna przy jednoczesnym modyfikowaniu wielu rekordów. Te blokowanie jest analogiczne optymistycznemu, ale działa w trybie grupowych modyfikacji UPDATE, kiedy jest niezbędna jednoczesna modyfikacja w wielu różnych tabeli lub różnych bazach danych. Oddzielnie modyfikacje przy tym blokowaniu są zatrzymane oraz realizują się razem ze wszystkimi innymi. Oprócz możliwości określenia typu kursora, można określić także miejsce, gdzie ten kursor ma być umieszczony. Internet działa według modelu klient – serwer, a zatem kursor musi się znajdować , bądź to na serwerze, bądź po stronie klienta. Aby kursor był umieszczony po stronie klienta, właściwości CursorLocation obiektu RECORDSET trzeba przypisać wartość adUseClient. Jeśli właściwości CursorLocation przypisać wartość adUseServer lub w ogóle nie określić ją, to kursor będzie przechowywany na serwerze ( co jest jego domyślnym położeniem). Właściwość CursorLocation może być zadana także bezpośrednio konstantami: Const adUseServer = 2 Const adUseClient = 3 Kursor, który jest stworzony na serwerze chroni wszystkie swoi dane na serwerze. Przy dużym obciągu informacji kursor przesyła informację do klienta małymi porcjami . Zaletą tego sposobu rozmieszczenia kursora jest 86 możliwość początku przesyłania informacji do klienta do ostatecznego otrzymania wszystkiej informacji kursorem od bazy danych. Wadą jest niemożliwość stworzenia więcej jednego kursora w aplikacji WWW przez ograniczenia ADO. Kursor, który jest stworzony na kliencie będzie powolnie inicjalizować się . Natomiast mogą być stworzone wiele kursorów. Argument Option (typ Polecenia) określa sposób przetworzenia argumentu CommandText ( źródło). W przypadku kiedy „źródło” jest łańcuchem znaków dla polecenia SQL do bazy danych, argument Option musi mieć wartość adCmdText. W przypadku kiedy „źródło” jest nazwą tabeli bazy danych argument Option musi mieć wartość adCmdTable. Użycie pliku adovbs.inc Podczas omawiania obiektu Recordset mogą być użyte zamiast wartości stałych ich deklarowane nazwiska. Tym stałym odpowiadają się konkretnie wartości, np.: Const adUseServer = 2 Const adUseClient = 3 Definicji nazw tych stałych nie są wbudowane w ASP. Aby z nich skorzystać trzeba dołączyć do stworzonych stron pliku adovbs.inc, który zawiera definicje wszystkich stałych ADO. Plik ten jest dostarczany wraz z IIS oraz PWS i domyślnie znajduje się w katalogu: C:\Program Files\Common Files\System\ado\. Aby z niego korzystać, trzeba skopiować go do głównego katalogu serwera WWW i dołączać do stron za pomocą dyrektywy include o postaci: <!--#INCLUDE virtual = "adovbs.inc" --> Ten plik może być podłączony także za pomocą następnej linii: <! -- #INCLUDE FILE= „dysk:\ ścieżka \adovbs.inc” -- > . Program Visual InterDev automatyczne stworzy się w pliku global.asa odwołanie do definiowania stałych w znaczniku <!--METADATA…-- > . Wykorzystanie metody EXECUTE obiektu CONNECTION Istnieją następne sposoby dostępu do baz danych za pomocą ADO: 1. Nie jawne stworzenie obiektu RECORDSET przez metodę Execute obiektu CONNECT . 2. Jawne stworzenie obiektów CONNECT i RECORDSET. 3. Dostęp za pomocą obiektu COMMAND. 87 Wszystkie te sposoby potrzebują odwołania do stworzonego już obiektu CONNECT. Przy nie jawnym sposobie stworzenia obiektu RECORDSET kursor bazy danych stworzy się nie przez metodę Server.CreateObject, lecz przez metodę Execute obiektu CONNECT. Metoda Execute może wrócić się obiekt RECORDSET z kursorem tylko dla „czytania naprzód” (adOpenForwardOnly). To jest najszybszy kursor obiektu RECORDSET. Przykład tego sposobu dostępu do bazy danych jest pokazany w listingu ConnExecute.asp. W tym przykładzie stworzy się strona z rezultatami dwóch poleceń do bazy danych „samochody”. Pierwsze polecenie to jest średnia pensja pracowników firmy. Drugie polecenie to jest lista pracowników firmy, pensja których jest większa od średniej pensji na firmie. Listing ConnExecute.asp 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <!--The references to ADO objects and constants--> 4. <!--#INCLUDE virtual = "adovbs.inc" --> 5. <html> 6. <body> 7. <% 8. Dim objConn, objRS,strConnectionString,strSQL, str2SQL 9. strSQL = "SELECT P.IMIE, P.NAZWISKO, P.PENSJA, P.STANOWISKO " 10.strSQL = strSQL + "FROM PRACOWNICY P " 11.strSQL = strSQL + "WHERE P.PENSJA > (SELECT AVG(P.PENSJA) " 12.strSQL = strSQL + "FROM PRACOWNICY P);" 13.str2SQL = "SELECT AVG(PENSJA) FROM PRACOWNICY;" 14.strConnectionString = "Provider=MSDASQL.1 Data Source = samochody; " 15.strConnectionString = strConnectionString +"Extended Properties =""DSN=samochody""" 16.Set objConn = Server.CreateObject("ADODB.Connection") 17.objConn.ConnectionString = strConnectionString 18.objConn.Mode = adModeRead 19.objConn.CursorLocation = adUseClient 88 20.objConn.open 21.'Metoda execute wruci si&#281; obiekt RS tylko typu adOpenForwardOnly! 22.Set objRS = objConn.execute(str2SQL,,adCmdText) 23.%> 24.<b>&#346;renia pensja na firmie =<%=objRS("AVG(PENSJA)")%></b> 25.<br> 26.<b>Pracownicy pensja których jest wiele od &#347;redniej pensji:</b> 27.<table align='left' border='1'> 28. <tr> 29. <td>IMIE</td> 30. <td>NAZWISKO</td> 31. <td>PENSJA</td> 32. <td>STANOWISKO</td> 33. </tr> 34.<% 35.Set objRS = objConn.execute(strSQL,,adCmdText) 36.while not objRS.EOF 37. Response.Write "<tr>" 38. Response.Write "<td>" & objRS("IMIE")&"</td>" 39. Response.Write "<td>" & objRS("NAZWISKO")&"</td>" 40. Response.Write "<td>" & objRS("PENSJA")&"</td>" 41. Response.Write "<td>" & objRS("STANOWISKO")&"</td>" 42. Response.Write "</tr>" 43. objRS.MoveNext 44.wend 45.Response.Write "</table>" 46.objRS.Close 47.set objRS = nothing 48.objConn.Close 49.set objConn = nothing 50.%> 51.</body> 52.</html> W linii 8 są definiowane zmienne. W liniach 9-12 jest wyznaczona znakowa zmienna z kodem SQL dla otrzymania listy pracowników firmy, których pensja jest większa od średniej pensji na firmie. Ten kod SQL zawiera zanurzone polecenie SELECT. W linii 13 jest wyznaczona znakowa 89 zmienna dla otrzymania średniej pensji na firmie. W liniach 14,15 jest wyznaczony łańcuch znaków dla połączenia z bazą danych „ Samochody”. W linii 16 jest stworzony obiekt CONNECTION. W linii 17 jest ustalona właściwość ConnectionString obiektu CONNECTION. W linii 18 jest ustalona właściwość Mode obiektu CONNECTION. Ta właściwość ma wartość adModeRead ( tzn. tylko dla czytania). Ta linia nie jest potrzebna (jest zbyteczna), ponieważ metoda EXECUTE może stworzyć obiekt RECORDSET tylko w tym trybie. Linia 19 wyznaczy się miejsce kursora po stronie klienta. W linii 20 jest uruchomiany obiekt CONNECTION. W linii 22 jest wywołana metoda Execute obiektu CONNECTION. Ta metoda stworzy obiekt RECORDSET, zawierający wartość średniej pensji w firmie. Drugi parametr tej metody Ececute jest opcjonalny, tzn. zawiera zmienną, która będzie miała ilość rekordów obiektu RECORDSET. Kursor tego typu (adOpenForwardOnly) nie wróci się ilość rekordów, dlatego drugi parametr jest zbyteczny. Trzeci parametr ma wartość adCmdText, tzn. polecenie SQL do bazy danych. Dla połączenia z tabelą trzeba było zapisać trzeci parametr jako adCmdTable. W linii 24 jest wyświetlana wartość średniej pensji w firmie na stronie WWW. W liniach 26 -33 jest definiowana tabela oraz nagłówek dla pozostałych rezultatów. W linii 35 jest stworzony nowy obiekt RECORDSET z tym samym obiektem objConn dla wyświetlania rezultatów pro pracowników firmy. W liniach 36 – 44 jest pętla dla wyświetlania rezultatów na stronę WWW. W liniach 46-49 są usuwanie obiektów. Sterowanie transakcjami Obiekt CONNECTION może być wykorzystywany w następnych celach: Dla otworzenia oraz zamknięcia seansów połączenia z bazami danych. Na ten obiekt połączenia będą odwołać się inne obiekty ADO (RECORDSET lub COMMAND); Dla realizacji poleceń do bazy danych przez swoje metodę Execute. Ta metoda stworzy obiekty RECORDSET z kursorem tylko dla „czytania naprzód”(adOpenForwardOnly); Sterowania transakcjami. Sterowanie transakcjami może być realizowane się za dopomogą metod BeginTrans, CommitTrans, RollbackTrans obiektu CONNECTION. Przykład wykorzystania metod obiektu CONNECTION dla sterowania transakcjami jest pokazany w listingu Conntrans.asp. Ten skrypt zawiera kod dla wstawiania danych pro nowego pracownika wypożyczalni samochodów. Dla tego wstawiania musi być realizowana transakcja z 90 dwóch operacji: pierwsza powinna zapisać dani pro nowe miejsce do tabeli „Miejsca”, druga – dani pro nowego pracownika do tabeli „Pracownicy”. W przypadku błędów przy realizacji jakikolwiek operacji transakcja musi być wycofana. Listing conntrans.asp 1. 2. 3. 4. 5. <%@ Language=VBScript %> <% option explicit %> <!--The references to ADO objects and constants--> <!--#INCLUDE virtual = "adovbs.inc" --> <html> 6. 7. 8. 9. <body> <% On Error Resume Next Dim objConn, str1SQL, str2SQL 10.str1SQL = "INSERT INTO PRACOWNICY " 11.str1SQL = str1SQL + "VALUES ('0020', 'OLIVER', 'KAHN', " 12.str1SQL = str1SQL + "'2002-11-06', 'TECHNICZNY', 'MECHANIK', " 13.str1SQL = str1SQL + "1300, 200, '000011', '357-357-357'); " 14.str2SQL = "INSERT INTO MIEJSCA " 15.str2SQL = str2SQL + "VALUES ('000011', 'PARTYZANTOW', '17', 'KOSZALIN', " 16.str2SQL = str2SQL + "'75-411', '343-32-11', NULL);" 17.Set objConn = Server.CreateObject("ADODB.Connection") 18.objConn.Mode = adModeReadWrite 19.objConn.open("samochody") 20.objConn.BeginTrans 21.objConn.Execute str2SQL,,adCmdText 22.objConn.Execute str1SQL,,adCmdText 23.If objConn.Errors.Count = 0 Then 24. objConn.CommitTrans 25. Response.write "<b> Recordy s&#261; wpisane do bazy danych !<B>" 26.Else 91 27. 28. objConn.RollbackTrans Response.write "<b> !!! Recordy nie zostali wpisane do bazy danych !!!<B>" 29.End if 30.%> 31.</body> 32.</html> Linia 8 zawiera kod instrukcji, pozwalającej skryptu samodzielne analizować błędy w linii 23 bez komunikatów systemy. W linii 9 definiowane zmienny. W liniach 10-13 jest definiowane polecenie SQL dla wpisania danych pro pracownika do tabeli „Pracownicy”. W liniach 14 -16 jest definiowane polecenie SQL dla wpisania danych pro nowe miejsce pracownika do tabeli „Miejsca”. W linii 17 jest stworzony obiekt CONNECTION. Po domyśleniu nowy obiekt połączenia może być w trybie „ tylko dla czytania”, dlatego w linii 18 właściwości Mode jest przypisana wartość „adModeReadWrite”. To pozwoli czytać oraz wpisywać rekordy w operacjach transakcji do bazy danych. W linii 19 jest otworzona baza danych „Samochody”. Linii 20 – 29 zawierają transakcję. W linii 20 jest wyznaczony początek transakcji. W liniach 21,22 są operacji transakcji. W liniach 23 – 20 transakcja będzie zatwierdzona (linia 24) lub wycofana (linia 27). Filtrowanie rekordów w obiekcie Recordset W obiekcie Recordset są pobierane wszystkie rekordy tabeli bazy danych lub polecenia SQL do różnych tabel. Wszystkie te rekordy można filtrować po wartości ich pól. Istnieją różne możliwości filtracji: Bezpośrednio w poleceniu SQL (np. przez klauzuli WHERE, HAVING) Za dopomogą instrukcji If ... Then, która jest umieszczona wewnątrz pętli Do While...Loop Za dopomogą właściwości Filter obiektu Recordset. Aby wyświetlić jedynie te rekordy, w których wartość pól zadowoli warunkom filtracji, trzeba wykonać następujące czynności: 1. Stworzyć egzemplarz obiektu Recordset i pobrać zawartość tabeli lub polecenia SQL przy użyciu metody Open. 2. Określić wartość właściwości Filter umieszczając w niej warunek filtracji. 92 3. Pobrać wszystkie rekordy dosępne w obiekcie Recordset, posługując się w tym celu pętlą Do While Not objRS.EOF ...Loop. Przykład wykorzystania właściwości Filter dla filtracji rekordów jest pokazany w listingu FiltrRS.asp. Ten skrypt wywoła polecenie do bazy danych „Samochody” dla otrzymania rekordów, zawierających samochody, które jeszcze nie są wypożyczone przez klienta. Jednoczesne te rekordy trzeba filtrować , żeby otrzymać tylko samochody, przebieg których mniej 60000 km . Listing FiltrRS.asp 1. 2. 3. 4. 5. 6. 7. 8. 9. <%@ Language=VBScript %> <% option explicit %> <!--The references to ADO objects and constants--> <!--#INCLUDE virtual = "adovbs.inc" --> <html> <body> <% Dim objConn, objRS,strSQL strSQL = "SELECT NR_SAMOCHODU, MARKA, TYP, PRZEBIEG " 10.strSQL = strSQL & "FROM SAMOCHODY S " 11.strSQL = strSQL & "WHERE S.NR_SAMOCHODU " 12.strSQL = strSQL & "NOT IN (SELECT W.NR_SAMOCHODU " 13.strSQL = strSQL & "FROM WYPOZYCZENIA W); " 14.Set objConn = Server.CreateObject("ADODB.Connection") 15.objConn.open("samochody") 16.Set objRS = Server.CreateObject ("ADODB.Recordset") 17.objRS.Open strSQL, objConn, adOpenForwardOnly,,adCmdText 18.objRS.Filter ="Przebieg<60000" 19.%> 20.<h2> Rezultat filtracji: </h2> 21.<h3>Samochody nie wypozyczone oraz przebieg < 60000</h3> 22.<table BORDER ="1" width="100%"> 23.<tr> 24.<th width="25%"> Numer samochodu </th> 25.<th width="25%"> Marka </th> 26.<th width="25%"> Typ </th> 93 27.<th width="25%"> Przebieg </th> 28.</tr> 29.<% Do While Not objRS.EOF 30.Response.Write "<tr>" 31.Response.Write "<td>"&objRS("NR_SAMOCHODU")&"</td>" 32.Response.Write "<td>"&objRS("MARKA")&"</td>" 33.Response.Write "<td>"&objRS("TYP") &"</td>" 34.Response.Write "<td>"&objRS("Przebieg") &"</td>" 35.Response.Write "</tr>" 36.objRS.MoveNext 37.Loop 38.%> 39.</Table> 40.<% 41.objRS.Close 42.Set objRS = Nothing 43.objConn.Close 44.Set objConn = Nothing 45.%> 46.</body> 47.</html> Obiekt COMMAND Obiekt COMMAND stanowi alternatywny sposób tworzenia obiektów RECORDSET. Łączy on w sobie dwa obiekty – RECORDSET oraz CONNECTION. Obiekt COMMAND umożliwia niejawne utworzenie egzemplarza obiektu RECORDSET. Ten obiekt może mieć kolekcję parametrów, które mogą być zadane przez obiekty klasy PARAMETER. Klasa COMMAND zawiera następne metody: Execute( ) – uruchomianie instrukcji dla danego połączenia CreateParameter( ) – tworzenie nowego parametru(obiektu klasy PARAMETER) 94 Kolekcja PARAMETERS zawiera wszystkie parametry, które są wykorzystywane razem z danym obiektem COMMAND. Parametry mogą zawierać instrukcję SQL lub wywołanie zapamiętanej procedury. Parametry są przechowywane w obiektach klasy PARAMETER. Klasa PARAMETERS zawiera następne metody: Append(), Delete() – dodawanie (usuwanie) parametru dla danej kolekcji Item() – wywołanie wyznaczonego obiektu PARAMETR Refresh() – wywołanie informacji pro parametry właściciela zapamiętanej procedury. Metoda Execute obiektu CONNECTION może być wykorzystywana tylko dla uruchomiania zapamiętanych procedur, które nie mają parametrów. Metody oraz właściwości obiektu COMMAND pozwalają uruchomić procedury z wejściowymi oraz wyjściowymi parametrami. Dla obiektu COMMAND także jako dla obiektu RECORDSET, jest niezbędny obiekt CONNECTION dla połączenia z bazą danych. Związek z obiektem CONNECTION może być przez właściwość ActiveConnection obiektu COMMAND. Ta właściwość zawiera odwołanie do obiektowej zmiennej obiektu CONNECTION. Ona może być ustalona bez słowa kluczowego SET, ponieważ może zawierać się odwołanie do łańcucha znaków połączenia z bazą danych. W tym przypadku, kiedy obiekt CONNECTION nie istnieje, ADO stworzy go automatyczne po łańcuchu znaków, a potem usuwa go przy usunięciu obiektu COMMAND. Wywołanie zapamiętanych procedur przez obiekt COMMAND zawiera następne czynności: 1. Otworzenie obiektu CONNECTION 2. Stworzenie obiektu COMMAND 3. Ustalenie właściwości CommandType,CommandText oraz ActiveConnection obiektu COMMAND 4. Stworzenie oraz zapisywanie parametrów do kolekcji obiektu COMMAND 5. Wywołanie metody Execute obiektu COMMAND. Przykład wykorzystania obiektu COMMAND dla wywołania zapamiętanych procedur jest pokazany w listingu ProcedureCommand.asp. Skrypt dla stworzenia procedury jest pokazany w listingu PROC01.sql. Ta procedura pozwoli otrzymać ilość pracowników, pensja oraz dodatek których są w wyznaczonym zasięgu wynagrodzenia. Baza danych „Samochody” zawiera procedurę Proc01, która otrzyma dwa wejściowe parametry oraz wróci jeden wyjściowy. Wejściowe parametry wyznaczają zasięgi wynagrodzenia pracowników. Wyjściowy parametr jest 95 rezultat procedury, zawierający ilość pracowników, wynagrodzenia których są w tym zasięgu. Listing Proc01.SQL if exists(select 1 from sys.sysprocedure where proc_name ='PROC01') then drop procedure PROC01 end if; Create procedure PROC01(in dol integer,in gora integer,out ilosc integer) /* parameters,... */ on exception resume /*umozliwia wykonanie w wypadku bledu*/ begin select(select COUNT(NR_PRACOWNIKA) from pracownicy where(((Pensja+DODATEK) between dol and gora) and DODATEK is not null) or ((Pensja between dol and gora) and DODATEK is null)) into ilosc end listing ProcedureCommand.asp 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <!--The references to ADO objects and constants--> 4. <!--#INCLUDE virtual = "adovbs.inc" --> 5. <html> 6. <body> 7. <% 8. Dim objConn, objCM,iparam1,iparam2 9. iparam1=1300 10.iparam2=1900 11.Set objConn = Server.CreateObject("ADODB.Connection") 12.objConn.CursorLocation = adUseClient 13.objConn.open("samochody") 14.Set objCM = Server.CreateObject("ADODB.Command") 15.objCM.ActiveConnection = objConn 16.objCM.Parameters.Append objCM.CreateParameter(_ 17. "Par1",adInteger,adParamInput,4,iparam1) 18.objCM.Parameters.Append objCM.CreateParameter(_ 19. "Par2",adInteger,adParamInput,4,iparam2) 20.objCM.Parameters.Append objCM.CreateParameter(_ 21. "Rezult",adInteger,adParamOutput,2,0) 96 22.objCM.CommandText = "PROC01" 23.objCM.CommandType = adCmdStoredProc 24.call objCM.Execute 25.%> 26.<b>W zasi&#281;gu wynagrod&#380;e&#324; ( 27.<%=iparam1%> , <%=iparam2%>) ilo&#347;&#263; pracowników = </b> 28.<% 29.Response.Write objCM.Parameters("Rezult") 30.Set objCm = Nothing 31.objConn.Close 32.Set objConn = nothing 33.%> 34.</body> 35.</html> Grupowa modyfikacja rekordów bazy danych Dla modyfikacji rekordów bazy danych obiekt RECORDSET może być otwarty z warunkiem blokowania adLockOptimistic lub adLockPessimistic. Jeśli modyfikować rekordy oraz potem wywołać metodę Update, to obiekt RECORDSET natychmiast przesyła wszystkie zmiany do bazy danych. Obiekt RECORDSET odwoła się do bazy danych po modyfikacji każdego rekordu. Kiedy takich rekordów są za dużo trzeba odtwarzać obiekt RECORDSET z warunkiem blokowania adLockBatOptimistic. Ten warunek definiuje grupową modyfikację. Tryb „grupowa modyfikacja” pozwoli się realizować wszystkie zmiany tylko jedynie w kursorze obiektu RECORDSET z zatrzymaniem tych zmian w bazie danych. W bazie danych te zmiany będą wprowadzone tylko po wywalaniu metody BatchUpdate. Przykład wykorzystania grupowej modyfikacji jest pokazany w listingu GrModif.asp. W tym skryptu czytają się rekordy tabeli „WYPOZYCZENIA” bazy danych „Samochody”. W tych rekordach do wartości daty pola „DATA_ODD” trzeba dodać dwa dni oraz zmodyfikować te pole. Listing GrModif.asp. 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <!--The references to ADO objects and constants--> 4. <!--#INCLUDE virtual = "adovbs.inc" --> 97 5. 6. 7. 8. <html> <body> <% Dim objConn, objRS,strSQL,dtData_Odd 9. strSQL = "SELECT NR_WYPOZYCZENIA, DATA_ODD " 10.strSQL = strSQL + " FROM wypozyczenia " 11.strSQL = strSQL + "WHERE DATA_ODD IS NOT NULL " 12.strSQL = strSQL + "ORDER BY NR_WYPOZYCZENIA; " 13.Set objConn = Server.CreateObject("ADODB.Connection") 14.objConn.CursorLocation = adUseClient 15.objConn.open("samochody") 16.Set objRS = Server.CreateObject ("ADODB.Recordset") 17.objRS.Open strSQL,objConn, adOpenStatic, adLockBatchOptimistic,_ 18.adCmdText 19.%> 20.<b>Rezultaty modifikacji bazy danych</b> 21.<table align='left' border='1'> 22.<tr> 23.<td>NR_Wypo&#380;yczenia</td> 24.<td>Data_odd(stara)</td> 25.<td>Data_odd(nowa)</td> 26.</tr> 27.<% 28.If Not (objRS.EOF AND objRS.BOF) Then 29. Do While NOT objRS.EOF 30. dtData_Odd = objRS ("DATA_ODD") 31. dtData_Odd = DateAdd ("d",2,dtData_Odd) 32. Response.Write "<tr>" 33. Response.Write "<td>" &objRS("NR_WYPOZYCZENIA")&"</td>" 34. Response.Write "<td>" & objRS("DATA_ODD")&"</td>" 35. Response.Write "<td>" & dtData_Odd &"</td>" 36. Response.Write "</tr>" 37. objRS("DATA_ODD")=dtData_Odd 38. objRS.Update 39. objRS.MoveNext 40. Loop 98 41. objRS.UpdateBatch 42.End If 43.Response.Write "</table>" 44.objRS.Close 45.Set objRS = Nothing 46.ObjConn.Close 47.Set objConn = Nothing 48.%> 49.</body> 50.</html> Wstawianie rekordów do bazy danych Wstawianie rekordów jest niezbędną operacją przy rejestrowaniu nowego użytkownika, przyjęcia przesyłki, dodania nowych informacji oraz wykonania wielu innych czynności. Udostępnienie bazy danych na WWW pozwoli jednocześnie korzystać z niej wielu użytkownikom. Nie ma to większego znaczenia, jeśli wszystkie te osoby jedynie odczytują informację zapisane w bazie. Przy wstawianiu oraz modyfikacji rekordów różnymi osobami mogą być konflikty. Właśnie z tego względu, pierwsza osoba, które próbuje zmienić zawartość rekordu musi „blokować” go. Kiedy rekord jest zablokowany, żaden inny użytkownik nie jest w stanie zmienić jego zawartości. Gdy tylko pierwszy użytkownik zakończy wprowadzanie modyfikacji, blokada jest usuwana. Przy tylko odczytywaniu informacji z kursorem typu adOpenForwardOnly może być skojarzony argument blokowania(LockType), mający wartość adLockReadOnly. W takim przypadku blokowanie rekordów nie ma żadnego sensu. Przy dostępu do bazy danych, pozwalającym na zapis danych, taki sposób blokowania nie będzie słusznym. Dostępne są następne sposoby blokowania z takimi wartościami stałej blokowania: adLockPessimistic oznaczy się, że rekordy są blokowane w momencie rozpoczynania edycji. Ma to na celu uniknięcie sytuacji, w której wartości pól rekordu zmieniają się w czasie pomiędzy rozpoczęciem wpisywania wartości, a wywołaniem metody UPDATE. adLockOptimistic oznaczy się, że rekordy są blokowane wyłącznie w czasie wykonywania metody UPDATE. adLockBatchOptimistic jest potrzebna przy jednoczesnym modyfikowaniu wielu rekordów. Sposoby te odróżnia od siebie moment , w którym rekord jest blokowany. 99 Obiekt Recordset udostępia dwie metody pozwalające na modyfikowanie zawartoścci bazy danych: AddNew oraz Update. Metoda AddNew tworzy nowy rekord i dodaje go do zbioru rekordów. Ten nowy rekord nie jest jednak zapisywany w bazie danych, aż do momentu wywołania metody Update. W wyniku nowego wywołania metody AddNew (bez Update), nowy rekord staje się aktualnym rekordem zbioru i pozostaje nim nawet po wywołaniu metody Update. Poniżej jest pokazany przykład wykorzystania tych metod. … objRS.AddNew objRS.(“Name”) = “ Jacek” objRS.(“Adres”)=”Koszalin” objRS.Update … Jeśli w rekordzie są wprowadzone zmiany, które nie wolno zapisywać w bazie danych, to można odrzucić je przy użyciu metody CancelUpdate. Metodę tę można wywołać tylko wtedy, jeśli wcześniej nie została wywołana metoda Update. Przykład anulowania zmian jest pokazany na listingu niżej. … objRS.AddNew objRS.(“Name”) = “ Jacek” objRS.(“Adres”)=”Koszalin” objRS.CancelUpdate W listingu http://had/aspwyklady/addnew.asp jest pokazany przykład wykorzystania metod AddNew oraz Update. W tym przykładu jest używane blokowanie tworzone poprzez użycie stałej adLockOptimistic, której odpowiada wartość 3. Kod w tym listingu pozwała połączyć się do bazy danych „BIBL”. Dla połączenia z bazą danych trzeba stworzyć profile ODBC tej bazy z nazwiskom „BIBL”. Aplikacja dodaje rekord do tabeli „Authors” tej bazy danych, potem wydrukuje wszystkie rekordy tabeli. Listing http://had/aspwyklady/addnew.asp 1. 2. 3. 4. <%@ Language=VBScript %> <% option explicit %> <!--The references to ADO objects and constants--> <!--#INCLUDE virtual = "adovbs.inc" --> 100 5. <HTML> 6. <BODY> 7. <% 8. Dim objCn 9. Dim objRs 10.Set objCn = Server.CreateObject("ADODB.Connection") 11.objCn.open("BIBL") 12.Set objRs = Server.CreateObject("ADODB.Recordset") 13.objRs.Open "Authors", objCn, adOpenForwardOnly, adLockOptimistic, adCmdTable 14.objRs.AddNew 15.objRs("Author") ="Scott Mitchel" 16.objRs("Year") = 1948 17.objRs.Update 18.objRs.MoveFirst 19.%> 20.<B> Zawartosc tabeli </B> 21.<P> 22.<TABLE> 23.<TR> <td>author</td> <td>Rok</td> 24.</TR> 25.<% Do While Not objRs.EOF %> 26.<TR> <td><% = objRs("Author") %>,<td/> <td> <% =objRs("Year")%></td> 27.</TR> 28.<% 29.objRS.MoveNext 30.Loop 31.objRs.Close 32.set objRs = nothing 33.objCn.Close 34.set objCn = nothing 35.%> 36.</table> 37.</BODY> 38.</HTML> 101 Linia 1 wyznacza typ interpretatora ASP. Kod w linii 2 nie pozwoli wykorzystać definiowanie zmiennych skryptu po domyśleniu, wszystkie zmieni oraz konstanty muszą być wcześnie deklarowane. Linia 3 zawiera komentarz w kodu HTML. Linia 4 zawiera instrukcję HTML #INCLUDE, która połączy do skryptu plik „adovbs.inc”, zawierający deklarowania konstant obiektów ADO. Linii 7-19, 25,26, 28-35 zawierają kod skryptu ASP. W linii 10 jest stworzony obiekt ADO CONNECTION, za pomocą metody CreateObject() wbudowanego obiektu ASP Serwer. W linii 11 obiekt ADO CONNECTION jest połączony z bazą danych „BIBL”. W linii 12 jest stworzony obiekt RECORDSET za pomocą metody CreateObject() obiektu Server. Kod w linii 13 uruchomi obiekt RECORDSET. W tej linii są wyznaczone typ kursora adOpenForwardOnly, typ blokowania adLockOptimistic, typ polecenia adCmdTable , żrodło dla polecenia w bazie danych - tabela „Authors”, obiekt Connection. Linia 14 dodaje nowy pusty rekord do tabeli „Authors”. W liniach 15,16 są wyznaczone wartości pól nowego rekordu. W linii 17 aktualizuje się nowy rekord za dopomogą metody UPDATE. W liniach 18 – 30 wydrukują się wszystkie rekordy tabeli. W listingu tabeli_dani_bibl.sql jest pokazany kod SQL dla stworzenia i uzupełniania bazy danych BIBL. Listing tabeli_dani_bibl.sql if exists(select 1 from sys.systable where table_name='Authors' and table_type='BASE') then drop table Authors end if; create table Authors( Author varchar(50) , Year integer ); INSERT INTO Authors VALUES ('Grady Booch', 1950); INSERT INTO Authors VALUES ('James Rumbaugh', 1952); INSERT INTO Authors VALUES ('Ivar Jacobson', 1948); INSERT INTO Authors VALUES ('Brian Siler', 1960); 102 INSERT INTO Authors VALUES ('Jeff Spotts', 1963); INSERT INTO Authors VALUES ('Wendy Boggs', 1947); INSERT INTO Authors VALUES ('Michael Boggs', 1971); Dodawanie rekordów do bazy danych przez formularza Aplikacja w tym przykładu czyta dani pro użytkownika w formularz i potem pisze te dani do bazy . Strona z formularzem jest zwyczajnym dokumentem HTML (listing rejestracja.htm). Formularz składa się z pięciu pól tekstowych. Kiedy użytkownik kliknie przycisk przesyłający, dane podane w polach formularza zostaną przesłane do skryptu o nazwie uyztkownik_registration.asp (patrz linia 4). Skrypt przetwarzający dane z formularza został przedstawiony w listingu niżej. Listing http://had/aspwyklady/rejestracja.htm 1. <HTML> 2. <BODY> 3. Uzupelni ten formularz : 4. <FORM ACTION="/aspwyklady/uyztkownik_registration.asp" method="post"> 5. <TABLE> 6. <TR> 7. <TD align = right>Imie: </TD> 8. <TD align = right><INPUT NAME="firstname" size="30" ></TD> 9. </TR> 10.<TR> 11.<TD align = right>Nazwisko: </TD> 12.<TD align = right><INPUT NAME="lastname" size="30" ></TD> 13.</TR> 14.<TR> 15.<TD align = right> Email: </TD> 16.<TD align = right><INPUT NAME="email" size="30"></TD> 17.</TR> 18.<TR> 19.<TD align = right> Nazwa uzytkownika: </TD> 20.<TD align = right><INPUT NAME="username" size="30"></TD> 103 21.</TR> 22.<TR> 23.<TD align = right>Haslo: </TD> 24.<TD align = right><INPUT TYPE="password" NAME="password" size="30"></TD> 25.</TR> 26.</TABLE> 27.<TABLE > 28.<TR> 29.<TD ><INPUT TYPE="submit" VALUE="Submit Registration" ></TD> 30.<TD ><INPUT TYPE="reset" VALUE="Start Over" ></TD> 31.</TR> 32.</TABLE> 33.</FORM> 34.</BODY> 35.</HTML> Listing http://had/aspwyklady/uyztkownik_registration.asp W linii 4 jest dołączony do skryptu plik adobs.inc. W liniach 10,11 zostało realizowane połączenie z bazą danych. Profil ODBC tej bazy ma nazwisko „REGISTRATION”. W liniach 9 i 12 jest stworzony egzemplarz obiektu Recordset. W linii 13 otwiera się zbiór rekordów. Źródłem obiektu Recordset jest tabela "tblUsers" . Typ kursora jest dwukierunkowy (statyczny), typ blokowania adLockOptimistic. W linii 14 jest dodany do tabeli bazy danych pusty rekord. W liniach 15 -19 jest zapisana informacja z odpowiednich pól formularza do obiektów kolekcji Filds obiektu Recordset. W linii 20 rekord staje aktualnym. W pozostałych liniach można zamknąć i usunąć z pamięci egzemplarzy obiektów Connection i Recordset. W linii 26 jest generowane podziękowanie za rejestrację. 1. <%@ Language=VBScript %> 2. <% option explicit %> 3. <!--The references to ADO objects and constants--> 4. <!--#INCLUDE virtual = "adovbs.inc" --> 5. <HTML> 6. <BODY> 7. <% 8. Dim objCn 9. Dim objRs 10.Set objCn = Server.CreateObject("ADODB.Connection") 104 11.objCn.open("REGISTRATION") 12.Set objRs = Server.CreateObject("ADODB.Recordset") 13.objRs.Open "tblUsers",objCn,adOpenStatic,adLockOptimistic,adCmdTable 14.objRs.AddNew 15.objRs("FirstName") = Request.Form ("firstname") 16.objRs("LastName") = Request.Form ("lastname") 17.objRs("Email") = Request.Form ("email") 18.objRs("Username") = Request.Form ("username") 19.objRs("Password") = Request.Form ("password") 20.objRs.Update 21.objRs.Close 22.set objRs = nothing 23.objCn.Close 24.set objCn = nothing 25.%> 26.<B> Thank you for registration!</B> 27.</BODY> 28.</HTML> Listing users.sql zawiera skrypt dla stworzenia bazy REJESTRACJA tego przykładu: %%================================================ %% Database name: ConceptualDataModel_1 %% DBMS name: Sybase SQL Anywhere 5.5 %% Created on: 2002-09-29 23:50:04 %%============================================= if exists(select 1 from sys.systable where table_name='tblUsers' and table_type='BASE') then drop table tblUsers end if; %%============================================== %% Table: tblUsers %%============================================== create table tblUsers ( FirstName varchar(25), LastName varchar(25), Email varchar(30), Username varchar(20), 105 Password ); varchar(10) Realizacja skryptów na stronie klienta Współcześni przeglądarki mogą realizować na stronie klienta kody skryptowe w VBSCRIPT lub JAVASCRIPT. Skrypt może być stworzony na stronie serwera i przesłany do klienta. Skrypt klienta musi być w znacznikach <script>: <script language= „VBScript”> kod klienta </script> Te same znaczniki wykorzystują się dla skryptów serwera w plikach global.asa, ale dla realizacji na stronie serwera znacznik <script> musi zawierać atrybut : runat=server Skrypt klienta może nie zawierać atrybut runat=client, ten atrybut jest ustalony po domyśleniu. Na stronie klienta przeglądarka realizuje obiektowy model DOM(Document Object Model). Wbudowane obiekty VBScript oraz obiekty ADO nie są dostępne w przeglądarce. DOM umożliwi dostęp do jakikolwiek obiektu dokumentu HTML, to znaczy do jakikolwiek znacznika oraz go komponenty bieżącej strony internetowej. Dla identyfikacji obiektów odpowiedni znaczniki muszą mieć wyznaczone właściwości NAME oraz ID. Przykład analizy danych formy na stronie klienta jest pokazany w listingu REJESTR_scr.htm . Ten skrypt realizuje analogiczną formę poprzedniego skryptu rejestracja.htm dla pobierania danych pro klienta. Oprócz tego te dani analizują się na zawieranie pustych łańcuchów znaków. Listing REJESTR_scr.htm 1. <script LANGUAGE="VBScript"> 2. <html> 3. <head> 4. Function Form_Validator() 5. If (Document.frmReg.firstname.Value)="" Then 6. MsgBox "Pole 'imie' nie moze byc puste!" 7. document.all("firstname").focus 8. Form_Validator = false 9. ElseIf (Document.frmReg.lastname.Value)="" Then 106 10. MsgBox "Pole 'nazwisko' nie moze byc puste!" 11. document.all("lastname").focus 12. Form_Validator = false 13.ElseIf (Document.frmReg.username.Value)="" Then 14. MsgBox "Pole 'Nazwa Uzytkownika' nie moze byc puste!" 15. document.all("username").focus 16. Form_Validator = false 17.ElseIf (Document.frmReg.password.Value)="" Then 18. MsgBox "Pole 'haslo' nie moze byc puste!" 19. document.all("password").focus 20. Form_Validator = false 21.Else 22. document.frmReg.submit 23. Form_Validator = true 24.End If 25.End Function 26.</script> 27.</head> 28.<body> 29.<p>Uzupelni ten formularz : </p> 30.<form NAME="frmReg" method="post" ACTION="uyztkownik_registration.asp" 31.onsubmit="Form_Validator()"> 32.<table> 33.<tr> 34. <td align="right">Imie: </td> 35. <td align="right"><input NAME="firstname" size="30"></td> 36.</tr> 37.<tr> 38. <td align="right">Nazwisko: </td> 39. <td align="right"><input NAME="lastname" size="30"></td> 40.</tr> 41.<tr> 42. <td align="right">Email: </td> 43. <td align="right"><input NAME="email" size="30"></td> 44.</tr> 107 45.<tr> 46. <td align="right">Nazwa uzytkownika: </td> 47. <td align="right"><input NAME="username" size="30"></td> 48.</tr> 49.<tr> 50. <td align="right">Haslo: </td> 51. <td align="right"><input TYPE="password" NAME="password" size="30"></td> 52.</tr> 53.</table> 54.<table> 55.<tr> 56. <td><input TYPE="button" NAME="btn" VALUE="Submit Registration" onClick="Form_Validator()"></td> 57. <td><input TYPE="reset" Name="start" VALUE="Start Over"></td> 58.</tr> 59.</table> 60.</form> 61.</body> 62.</html> W liniach 4-25 jest wyznaczona funkcja Form_Validator(). Wywołanie tej funkcji będzie po clickneniu przyciska „Submit Registration”. W linii 56 zdefiniowany warunek wywołania : onClick="Form_Validator()". Przykład analizy daty jest pokazany w listingu ch25i8.asp. Listing ch25i8.asp. <%@ Language=VBScript %> <HTML> <HEAD> <script language="VBScript"> dim errMsg dim submitVal function frmDate_onSubmit() frmDate_onSubmit = doSubmit() end function function setErrorMsg(s) errMsg = s document.all("txtDate").focus call window.setTimeout("showErrorMsg", 100) 108 end function function clearErrorMsg() errMsg = "" document.all("errMsg").innerText = "Please re-enter the date in the form 'mm/dd/yyyy'." end function function showErrorMsg() document.all("errMsg").innerText = errMsg call window.setTimeout("clearErrorMsg", 2000) end function function doSubmit() dim dateVal dim aDate dim el dim parts dateVal = document.all("txtDate").value on error resume next aDate = cdate(dateVal) if err.number <> 0 then on error goto 0 call setErrorMsg("That doesn't appear to be a valid date.") doSubmit = false Exit Function elseif instr(1, dateVal, "/", vbBinaryCompare) = 0 then call setErrorMsg("You entered a date in the incorrect format. Use the format 'mm/dd/yyyy'.") doSubmit = False exit function end if parts = split(dateVal, "/") if ubound(parts) < 2 then call setErrorMessage("You must enter a month, a day, and a year.") doSubmit=False Exit function elseif (clng(parts(0)) <> clng(month(dateVal))) or clng(parts(1)) <> clng(day(dateVal)) or clng(parts(2)) <> clng(year(dateVal)) then call setErrorMsg("You entered an invalid date. Use the format 'mm/dd/yyyy'.") doSubmit = False exit function 109 end if document.frmDate.submit doSubmit = True end function </script> </HEAD> <BODY> <% if request.form("txtDate") <> "" then response.write "You entered the valid date " & request.form("txtDate") & "." response.end end if %> <form name="frmDate" method="post" action="ch25i8.asp"> <div id="errMsg" style="color: red">&nbsp;</div><br> Enter a date in the form "mm/dd/yyyy" <input id="txtDate" type="text" name="txtDate" maxLength="10" size="20"></input>&nbsp; <input type="button" name="btnSubmit" value="Submit" onClick="doSubmit()"> </form> </BODY> </HTML> Zastosowania obiektów ASP oraz ADO dla połączenia z bazą danych Przykład zastosowania obiektów ASP oraz ADO jest przedstawiony w listingu http://had/aspwyklady/DBsamoch1.asp. Kod w tym listingu pozwała połączyć się do bazy danych „SAMOCHODY”, stworzyć obiekt „kursor” z zapytaniem SQL do bazy. Skrypt listingu zawiera także instrukcji sterowania kursorem oraz czytania informacji pro pracowników firmy wypożyczającej samochody. Dla połączenia z bazą danych trzeba stworzyć profile ODBC tej bazy z nazwiskom „SAMOCHODY”. Listing http://had/aspwyklady/DBsamoch1.asp 1. <%@ Language=VBScript %> 110 2. <% option explicit %> 3. <!--The references to ADO objects and constants--> 4. <!--#INCLUDE virtual = "adovbs.inc" --> 5. <% 6. Dim conn 7. Dim SQL 8. Dim R 9. Dim F 10.' Dim RecsAffected 11.Dim aConnectionString 12.'aConnectionString ="Provider=MSDASQL.1;" _ 13.' & "User ID=dba;Data Source=samochody;" _ 14.' & "Extended Properties=""DSN=samochody;UID=dba"";User Id=dba;" 15.Set conn = Server.CreateObject("ADODB.Connection") 16.'Only reading DataBase 17.'conn.Mode = adModeRead 18.'conn.ConnectionString = aConnectionString 19.'The cursor on the clients computer 20.conn.CursorLocation=adUseClient 21.conn.open("samochody") 22.SQL = "SELECT PRACOWNICY.NAZWISKO,PRACOWNICY.STANOWISKO," 23.SQL = SQL & "PRACOWNICY.DZIAL,MIEJSCA.MIASTO,MIEJSCA.ULICA " 24.SQL = SQL & "FROM PRACOWNICY, MIEJSCA " 25.SQL = SQL & "WHERE PRACOWNICY.NR_MIEJSCA = MIEJSCA.NR_MIEJSCA " 26.SQL = SQL & "ORDER BY PRACOWNICY.NAZWISKO;" 27.'Response.Write SQL 28.Set R = Server.CreateObject("ADODB.Recordset") 29.R.Open SQL, conn 30.Response.Write "<b>By default, when you first open a Recordset object, it's positioned at the first record.</b><br>" 31.Response.Write "First Record: " & R("NAZWISKO") & ", " & R("STANOWISKO") & "<br>" 32.Response.Write "<b>Moved to the last record.</b><br>" 33.R.moveLast 34.Response.Write "Last Record: " & R("NAZWISKO") & ", " & R("STANOWISKO") & "<br>" 111 35.Response.Write "<b>Moved to the previous record.</b><br>" 36.R.MovePrevious 37.Response.Write "Next-To-Last Record: " & R("NAZWISKO") & ", " & R("STANOWISKO") & "<br>" 38.R.MoveFirst 39.Response.Write "<b>Moved to the first record.</b><br>" 40.R.MoveNext 41.Response.Write "<b>Moved to the next record.</b><br>" 42.Response.Write "Second Record: " & R("NAZWISKO") & ", " & R("STANOWISKO") & "<br>" 43.Response.Write "<br>" 44.Response.Write "<h3>All Records</h3>" 45.R.MoveFirst 46.Response.Write "<table align='left' border='1'>" 47.Response.Write "<tr>" 48.for each F in R.Fields 49.Response.Write "<td>" & F.name & "</td>" 50.next 51.Response.Write "</tr>" 52.while not R.EOF 53.Response.Write "<tr>" 54.for each F in R.Fields 55.Response.Write "<td>" & F.value & "</td>" 56.next 57.Response.Write "</tr>" 58.r.MoveNext 59.wend 60.Response.Write "</table>" 61.R.Close 62.set R = nothing 63.conn.Close 64.set conn = nothing 65.%> Linia 1 wyznacza typ interpretatora ASP. Kod w linii 2 nie pozwoli wykorzystać definiowanie zmiennych skryptu po domyśleniu, wszystkie zmieni oraz konstanty muszą być wcześnie deklarowane. Linia 3 zawiera komentarz w kodu HTML. Linia 4 zawiera instrukcję HTML #INCLUDE, która połączy do skryptu plik „adovbs.inc”, zawierający deklarowania 112 konstant obiektów ADO. Linii 5-65 zawierają kod skryptu ASP. W liniach 6-11 są deklarowane zmienne. Linii 12-14 zawierają komentarz, który pokazuje sposób połączenia do bazy danych bez DSN systemu. W linii 15 jest stworzony obiekt ADO CONNECTION, za pomocą metody CreateObject() wbudowanego obiektu ASP Serwer. Linii 16-19 zawierają komentarz z przykładem instrukcji dla innego trybu kursora. W linii 20 jest ustalona właściwość „CursorLocation” obiektu CONNECT. Wartość „adUseClient” ustali kursor na stronie klienta. W linii 21 dokonywa się połączenie z bazą danych za pomocą metody OPEN() obiektu CONNECTION. W liniach 22-26 jest otrzymana tekstowa zmienna, która zawiera kod polecenia SQL do bazy danych. Linia 27 zawiera kod, który był wykorzystany przy usuwaniu błędów. W linii 28 jest stworzony obiekt RECORDSET za pomocą metody CreateObject() obiektu Server. Kod w linii 29 uruchomi obiekt RECORDSET. W liniach 31,34,37,42 są pokazane przykłady czytania pól bieżących rekordów obiektu RECORDSET. W liniach 33,36,38,40,45 są wykorzystane różne metody sterowania kursorem. W liniach 46-60 jest pokazany przykład poszeregowania tabeli, zawierające rezultaty polecenia SQL. W linii 61 obiekt RECORDSET jest zamknięty. W linii 62 obiekt RECORDSET jest usunięty z pamięci. W liniach 62,63 jest zamknięty oraz usunięty obiekt CONNECTION. Przesyłanie plików pomiędzy klientem a serwerem Wbudowane obiekty VBScript , obiekty ADO oraz obiekty DOM nie zawierają możliwości przesyłania plików pomiędzy klientem a serwerem. Pliki mogą być przesłane przez protokół HTTP lub przez protokół FTP. Dla przesyłania plików przez HTTP mogą być wykorzystane obiekty FORM, które są zapisane w przeglądarce. Możliwość przesyłania plików do serwera WWW jest realizowana przez protokół RFC1867, który ma nazwisko: „ Form-based file Upload in HTML” – typowy plik HTML dla zapisywania na serwerze. Zgodnie z tym protokołem trzeba w dokumencie HTML rozmieścić formę HTML, zawierające znacznik <INPUT>. Dla tego znacznika trzeba wyznaczyć parametr TYPE=FILE. Jednocześnie dla znacznika <FORM> trzeba wyznaczyć format danych w parametrze ENCTYPE=multipart/form-data. W pole ACTION trzeba wyznaczyć adres strony WWW, która będzie obrabiać dani w formacie multipart/form-data. Kiedy ta forma jest uruchomiana w przeglądarce automatyczne są sformowane dodatkowe przyciski dla poszukiwania plików na komputerze klienta. Dla przesyłania plików trzeba wcisnąć przycisk SUBMIT. Przykład formy jest pokazany w listingu Sampl1.htm 113 Listing Sampl1.htm <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 1</H1> <HR> <FORM METHOD="POST" ACTION="/scripts/aspSmartUpload/Sample1.asp" ENCTYPE="multipart/form-data"> <INPUT TYPE="FILE" NAME="FILE1" SIZE="50"><BR> <INPUT TYPE="FILE" NAME="FILE2" SIZE="50"><BR> <INPUT TYPE="FILE" NAME="FILE3" SIZE="50"><BR> <INPUT TYPE="FILE" NAME="FILE4" SIZE="50"><BR> <INPUT TYPE="SUBMIT" VALUE="Upload"> </FORM> </BODY> </HTML> Dla zapisywania plików na serwerze można wykorzystać oprogramowanie firmy SMART (http://www.aspsmart.com) które może być pobierane za darmo ze strony firmy. Oprogramowanie te zawiera komponent ActiveX, który musi być ustalony w rejestru systemu operacyjnego. Dokumentacja na stronie WWW informuje pro czynności dla aktywacji tego komponentu ActiveX. Głównym elementem tego oprogramowania jest obiekt SmartUpload który zawiera dwie kolekcje (Files oraz Form), właściwości obiektu oraz metody. Właściwości obiektu SmartUpload są pokazane w następnej tabeli. Właściwości obiektu SmartUpload. Parametr Opis CodePage Kod strony dla wszystkich przesyłanych plików TotalmaxFileSize Maksymalny rozmiar wszystkich przesyłanych plików MaxFileSize Maksymalny rozmiar jednego pliku AllowedFilesList Lista rozszerzeń plików które są dopuszczalnymi DeniedFilesList Lista rozszerzeń plików które nie są dopuszczalnymi DenyPhysicalPath Zapobiega zapisywanie pliku w tym katalogu ContentDisposition Ustali właściwość content-disposition w nagłówku 114 DownloadBlockSize TotalBytes BinaryData Ilość bajtów w bloku przy czytaniu danych Ilość bajtów w formie POST Bajt z indeksem tabeli, zawierającą pliki Metody obiektu SmartUpload są pokazane w następnej tabeli. Metoda Opis Upload Otrzymać formę POST z plikami od klienta Save Zapisać wszystkie pliki na serwerze DownloadFile Otrzymać plik z serwera DownloadField Otrzymać plik z bazy danych serwera FieldToFile Stworzyć plik z pola bazy danych UploadInFile Zapisać dani formy POST w plik Kolekcja Files zawiera obiekty File, właściwości oraz jedną metodę. Właściwości kolekcji Files. Parametr Opis Count Ilość obiektów typu File w kolekcji TotalBytes Ilość bajtów dla wszystkich plików w kolekcji Metodą Item(ID) kolekcji Files wróci obiekt typu File, który ma wyznaczony identyfikator(ID). Obiekt File kolekcji Files zawiera właściwości oraz metody. Właściwości obiektu File. Parametr Opis Name Imię elementu formy POST FileName Imię pliku, które jest wpisane przez klienta FileExt Rozszerzenie pliku FilePathName Ścieżka pliku ContentType Typ pliku dokumentu(content) ContentDisp Dyspozycja pliku w dokumencie(content) Size Rozmiar pliku ContentString Łańcuch znaków tego pliku TypeMIME Typ MIME od klienta SubTypeMIME Podtyp MIME IsMissing Jest TRUE, kiedy klient nie wyznaczył plik BynaryData Bajt z indeksem tabeli, zawierającą przesłane dani Metody obiektu File. Metoda Opis 115 SaveAs FileToField Zapisuje plik na dysk. Kiedy plik już istnieje pisze go po nową. Zapisuje plik do bazy danych Kolekcja Form zawiera obiekty Item, właściwość Count oraz metodę Item() . Właściwość Count wyznacza ilość obiektów ITEM w kolekcji. Metoda Item(ID) wróci się obiekt Item, mający wyznaczony ID w formie. Właściwości obiektu Item. Parametr Opis Count Ilość wartości tego elementu Item Name Imię elementu Item formy POST Values Wartość elementu Item Przykład skryptu który otrzyma rezultaty formy jest pokazany w listingu Sampl1.asp. Listing Sampl1.asp <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 1</H1> <HR> <% ' Variables ' ********* Dim mySmartUpload Dim intCount ' Object creation ' *************** Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Upload ' ****** mySmartUpload.Upload ' Save the files with their original names in a virtual path of the web server intCount = mySmartUpload.Save("/aspSmartUpload/Upload") ' sample with a physical path ' intCount = mySmartUpload.Save("c:\temp\") ' Display the number of files uploaded ' ************************************ 116 Response.Write(intCount & " file(s) uploaded.") %> </BODY> </HTML> Przykład pliku, który operuje oraz wyświetla właściwości otrzymanych plików jest pokazany w listingu Sample2.asp. Listing Sample2.asp. <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 2</H1> <HR> <% ' Variables ' ********* Dim mySmartUpload Dim file Dim intCount intCount=0 ' Object creation ' *************** Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Upload ' ****** mySmartUpload.Upload ' Select each file ' **************** For each file In mySmartUpload.Files ' Only if the file exist ' ********************** If not file.IsMissing Then ' Save the files with his original names in a virtual path of the web server file.SaveAs("/aspSmartUpload/Upload/" & file.FileName) ' sample with a physical path ' file.SaveAs("c:\temp\" & file.FileName) ' Display the properties of the current file ' ****************************************** 117 Response.Write("Name = " & file.Name & "<BR>") Response.Write("Size = " & file.Size & "<BR>") Response.Write("FileName = " & file.FileName & "<BR>") Response.Write("FileExt = " & file.FileExt & "<BR>") Response.Write("FilePathName = " & file.FilePathName & "<BR>") Response.Write("ContentType = " & file.ContentType & "<BR>") Response.Write("ContentDisp = " & file.ContentDisp & "<BR>") Response.Write("TypeMIME = " & file.TypeMIME & "<BR>") Response.Write("SubTypeMIME = " & file.SubTypeMIME & "<BR>") intCount = intCount + 1 End If Next ' Display the number of files which could be uploaded ' *************************************************** Response.Write("<BR>" & mySmartUpload.Files.Count & " files could be uploaded.<BR>") ' Display the number of files uploaded ' ************************************ Response.Write(intCount & " file(s) uploaded.<BR>") %> </BODY> </HTML> Przykład skryptu który ustali ograniczenia na przesyłane pliki jest pokazany w listingu Sample3.asp. Listing Sample3.asp. <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 3</H1> <HR> <% On Error Resume Next ' Variables ' ********* Dim mySmartUpload Dim intCount ' Object creation ' *************** 118 Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Only allow txt or htm files ' *************************** mySmartUpload.AllowedFilesList = "htm,txt" ' DeniedFilesList can also be used : ' Allow all files except exe, bat and asp ' *************************************** ' mySmartUpload.DeniedFilesList = "exe,bat,asp" ' Deny physical path ' ******************* mySmartUpload.DenyPhysicalPath = True ' Only allow files smaller than 50000 bytes ' ***************************************** mySmartUpload.MaxFileSize = 50000 ' Deny upload if the total fila size is greater than 200000 bytes ' ************************************************************* ** mySmartUpload.TotalMaxFileSize = 200000 ' Upload ' ****** mySmartUpload.Upload ' Save the files with their original names in a virtual path of the web server intCount = mySmartUpload.Save("/aspSmartUpload/Upload") ' sample with a physical path ' intCount = mySmartUpload.Save("c:\temp\") ' Trap errors ' *********** If Err Then Response.Write("<b>Wrong selection : </b>" & Err.description) 119 Else ' Display the number of files uploaded ' ************************************ Response.Write(intCount & " file(s) uploaded.") End If %> </BODY> </HTML> Przykład pliku, który pisze przesłane pliki do bazy danych jest pokazany w listingu Sample4.asp. Listing Sample4.asp. <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 4</H1> <HR> <% ' Variables ' ********* Dim mySmartUpload Dim file Dim oConn Dim oRs Dim intCount intCount=0 ' Object creation ' *************** Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Upload ' ****** mySmartUpload.Upload ' Connect to the DB ' ***************** Set oConn = Server.CreateObject("ADODB.Connection") curDir = Server.MapPath("\scripts\aspSmartUpload\Sample.mdb") 120 oConn.Open "DBQ="& curDir &";Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;" ' Open a recordset ' **************** strSQL = "SELECT FILENAME,FILE FROM TFILES" Set oRs = Server.CreateObject("ADODB.recordset") Set oRs.ActiveConnection = oConn oRs.Source = strSQL oRs.LockType = 3 oRs.Open ' Select each file ' **************** For each file In mySmartUpload.Files ' Only if the file exist ' ********************** If not file.IsMissing Then ' Add the current file in a DB field ' ********************************** oRs.AddNew file.FileToField oRs.Fields("FILE") oRs("FILENAME") = file.FileName oRs.Update intCount = intCount + 1 End If Next ' Display the number of files uploaded ' ************************************ Response.Write(intCount & " file(s) uploaded.<BR>") ' Destruction ' *********** oRs.Close oConn.Close Set oRs = Nothing Set oConn = Nothing 121 %> </BODY> </HTML> Przykład pliku, który otrzymuje jednocześnie pliki i dani z form jest pokazany w listingu Sample5.asp. Listing Sample5.asp. <HTML> <BODY BGCOLOR="white"> <H1>aspSmartUpload : Sample 5</H1> <HR> <% ' Variables ' ********* Dim mySmartUpload Dim item Dim value Dim file ' Object creation ' *************** Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Upload ' ****** mySmartUpload.Upload ' FILES Collection ' **************** Response.Write("<BR><STRONG>Files Collection</STRONG><BR>") ' Informations about files ' ************************ Response.Write("Number of files =" & mySmartUpload.Files.count &"<BR>") Response.Write("Total bytes of files =" & mySmartUpload.Files.TotalBytes &"<BR>") ' Select each file ' **************** 122 For each file In mySmartUpload.Files Response.Write(file.FileName & " (" & file.Size & "bytes)<BR>") Next ' FORM Collection ' *************** Response.Write("<BR><STRONG>Form Collection</STRONG><BR>") ' Select each item ' **************** For each item In mySmartUpload.Form ' Select each value of the current item ' ************************************* For each value In mySmartUpload.Form(item) Response.Write(item & " = " & value & "<BR>") Next Next %> </BODY> </HTML> Przykład wyładowania plików do klienta jest pokazany w listingu Sampl6.asp. Listing Sampl6.asp. <% ' Variables ' ********* Dim mySmartUpload ' Object creation ' *************** Set mySmartUpload = Server.CreateObject("aspSmartUpload.SmartUpload") ' Download ' ******** mySmartUpload.DownloadFile("/aspSmartUpload/Upload/sample.zip") ' sample with a physical path ' mySmartUpload.DownloadFile("c:\temp\sample.zip") ' sample with optionnals 123 ' Call mySmartUpload.DownloadFile("/aspSmartUpload/Upload/sample.zip", "application/x-zip-compressed", "downloaded.zip") %> Przykład projektu aplikacji bazodanowej w środowisku INTERNET Opis procesów biznesowych. Księgarnia dokonywa sprzedaż książek przez INTERNET. Aplikacja bazodanowa realizuje technologię ASP i jest rozmieszona na serwerze WWW (IIS). Aplikacja realizuje następne funkcje: Zadanie przez formularzy warunków poszukiwanej książki Poszukiwanie książki w bazie danych Formowania listy, zawierającej wszystkie książki, które odpowiadają warunkom poszukiwania Wybór potrzebnej książki z listy Formowanie zamawiania klienta Formowania listy zamówień wszystkich klientów w ciąże terminu wyznaczonego. Baza danych księgarni jest rozmieszona na serwerze firmy. Serwer WWW firmy zawiera ASP i HTML strony, które mają dostęp do relacyjnej bazy danych księgarni. Klient musi uruchomić przez przeglądarkę stronę początkową WWW. Na tej stronie klient musi uzupełnić formę dla zamówienia książki. Ta forma zawiera pola z danymi pro tytuł książki, je autora oraz wydawnictwo. Klient może nie wiedzieć wszystkie pola dla identyfikowania potrzebnej książki (np. może wiedzieć tylko tytuł książki lub tylko je autora lub je wydawnictwo). W temu wypadku można uzupełnić tylko pola wyznaczone. Wyniki zamawiania będą zawierać zbiór rekordów, które odpowiadają warunkom zapytania. To może być zbiór rekordów książek z identycznymi łańcuchami znaków w tytułach, lub rekordy z wszystkimi książkami jednego autora, lub wszystkie książki wyznaczonego wydawnictwa. Ten zbiór rekordów będzie wyświetlony na stronie WWW klienta. Każdy rekord ma odwołanie typu hyper tekst (Hyper reference) Klient może popatrzyć rezultaty zapytania oraz zamówić potrzebną książkę przyciskiem na odwołaniu hyper tekst. Opis struktury bazy danych Baza danych zawiera 5 tabel, które są połączone pomiędzy sobą. 124 Opis kodu źródłowego stron aplikacji Struktura aplikacji jest pokazana na rys. niżej. <<submit>>> <<link>> OrderForm.asp Locate.asp Default.htm <<redirect>> Order.asp The diagram of components Kod HTML stronę początkową jest pokazany w listingu default.htm. W linii 3 jest rozmieszczony graficzny obiekt. W liniach 7 - 17 jest wyznaczony formularz dla zadania warunków poszukiwanej książki. W linii 7 jest wyznaczona strona ASP , do której będzie posyłane dani formularza. W linii 8 jest wyznaczona metoda „POST”. W liniach 9 - 13 są wyznaczone pola formularza. Listing http://had/bookstore/default.htm 1. <html> 2. <body bgcolor="#FFFFFF"> 3. <p align="center"><img src="../Bookstore/images/banner.gif" 4. width="576" height="128"></p> 5. <p>&nbsp;</p> 6. <hr> 7. <form action="/Bookstore/locate.asp" 8. method="POST" name="frmLocate"> 9. <p><input type="text" size="20" name="txtTitle"> 10.Title</p> 11.<p><input type="text" size="20" name="txtAuthor"> 12.Author</p> 125 13.<p><input type="text" size="20" name="Publisher"> 14.Publisher</p> 15.<p><input type="submit" name="B1" value="Go!"><input 16.type="reset" name="B2" value="Reset"></p> 17.</form> 18.<hr> 19.</body> 20.</html> Strona Locate.asp będzie aktywna przy przesyłaniu rezultatów formularza ze strony początkowej. W liniach 9,10 są deklarowane zmienne dla obiektów ASP oraz ADO: CONNECTION, RECORDSET. W linii 11 deklarowana zmienna dla przechowywania kodu SQL. W linii 13 za pomocą metody CreateObject() obiektu Server stwarza się obiekt Connection. W linii 14 jest otworzona baza danych za pomocą metody Open() obiektu Connection. Baza danych ma profil ODBC z nazwiskom „WebPages”. W liniach 16 – 31 stwarza się kod SQL dla polecenia z bazą danych. W linii 33 jest stworzony obiekt RECORDSET. W linii 34 jest wyznaczony kursor statyczny ( konstanta adOpenStatic = 3). To znaczy, że wyniki wykonania zapytania SQL są przechowywane w tabeli tymczasowej, której wierszy nie są modyfikowane w momencie, gdy kursor był otwarty oraz wszystkie zmiany przez innych użytkowników bazy danych w momencie, gdy kursor był otwarty, będą widoczne tylko po dodatkowym uruchomianiu obiektu RECORDSET. W liniach 38 – 51 jest sformowany komunikat w wypadkach kiedy dani jest nieobecne lub danych są za dużo. W liniach 52 – 84 jest stworzone kolumny tabeli: „Autor”, „Title”, „Publisher”. W wierszach tabeli są rezultaty poszuka w bazie danych. Kolejne wierszy czytają się z obiektu RECORDSET przez metodę MOVENEXT(). Tytuł każdej książki jest zanurzony do znacznika <A> </A>. Ten znacznik realizuje odwołanie typu HYPERTEXT do strony z formularzem zamówienia książki. Listing http://had/bookstore/locate.asp 1. 2. 3. 4. 5. 6. 7. <%@ LANGUAGE="VBSCRIPT" %> <%Response.Expires=0%> <HTML> <HEAD> <TITLE>Document Title</TITLE> </HEAD> <BODY> 126 8. <% 9. Public dbBooks 10.Public rsBooks 11.Dim strSQL 12.' Open a connection to Biblio 13.Set dbBooks = Server.CreateObject("ADODB.Connection") 14.dbBooks.Open("WebPages") 15.' Build SQL statement 16.strSQL = "SELECT Authors.Author, Titles.Title, Publishers.`Company Name` " 17.strSQL = strSQL & "FROM Authors, `Title Author`, Titles, Publishers " 18.strSQL = strSQL & "WHERE (Authors.Au_ID = `Title Author`.Au_ID AND " 19.strSQL = strSQL & "`Title Author`.ISBN = Titles.ISBN AND " 20.strSQL = strSQL & "Titles.PubID = Publishers.PubID)" 21.If Request.Form("txtTitle") <> "" Then 22.strSQL = strSQL & " AND Title LIKE '%" & Request.Form("txtTitle") & "%'" 23.End If 24.If Request.Form("txtAuthor") <> "" Then 25.strSQL = strSQL & " AND Author LIKE '%" & _ 26.Request.Form("txtAuthor") & "%'" 27.End If 28.If Request.Form("txtPublisher") <> "" Then 29.strSQL = strSQL & " AND `Company Name` LIKE '%" & _ 30.Request.Form("txtPublisher") & "%'" 31.End If 32.' Run the query 33.Set rsBooks = Server.CreateObject("ADODB.Recordset") 34.rsBooks.Open strSQL, dbBooks, 3 35.%> 36.<!-- Build the results table --> 37.<% 38.If rsBooks.BOF and rsBooks.EOF Then%> 39.<H2><CENTER>Sorry, no results! Please try again!</CENTER></H2> 40.<%Else 41.' Populate the cursor 42.rsBooks.MoveLast 43.rsBooks.MoveFirst 44.End If 127 45.If rsBooks.RecordCount > 200 Then%> 46.<H2><CENTER> 47.Sorry, too many results. Please narrow your search 48.</CENTER></H2> 49.<%Else%> 50.<%If Not rsBooks.BOF Then%> 51.<H2>Here are the results of your search:</H2> 52.<TABLE BORDER> 53.<TR> 54.<TH> 55.Author 56.</TH> 57.<TH> 58.Title 59.</TH> 60.<TH> 61.Publisher 62.</TH> 63.</TR> 64.<% 65.Do While Not rsBooks.EOF 66.%> 67.<TR> 68.<TD> 69.<%=rsBooks("Author")%> 70.</TD> 71.<TD> 72.<A HREF="/Bookstore/OrderForm.asp?Title=<%=Server.URLEncode(rsBo oks("Title"))%>"> 73.<%=rsBooks("Title")%> 74.</A> 75.</TD> 76.<TD> 77.<%=rsBooks("Company Name")%> 78.</TD> 79.</TR> 80.<% 81.rsBooks.MoveNext 82.Loop 128 83.%> 84.</TABLE> 85.<%End If%> 86.<%End If%> 87.<% 88.' Close database 89.rsBooks.Close 90.dbBooks.Close 91.Set rsBooks = Nothing 92.Set dbBooks = Nothing 93.%> 94.</BODY> 95.</HTML> Listing http://had/bookstore/orderform.asp 1. 2. 3. 4. 5. 6. 7. <%@ LANGUAGE="VBSCRIPT" %> <html> <head> <title>Document Title</title> </head> <body bgcolor="#FFFFFF"> <!-- Insert HTML here --><img src="../Bookstore/images/order.gif" width="360" height="96"> 8. <form action="Order.asp" method="POST" id=form1 name=form1> 9. <p><input type="text" size="20" name="txtName"> Name</p> 10.<p><input type="text" size="20" name="txtAddress1"> Address</p> 11.<p><input type="text" size="20" name="txtAddress2"></p> 12.<p><input type="text" size="20" name="txtCity"> City</p> 13.<p><input type="text" size="20" name="txtState"> State</p> 14.<p><input type="text" size="20" name="txtZip"> Zip</p> 15.<p><input type="text" size="20" name="txtCreditCard"> Credit 16.Card</p> 17.<p><textarea name="txtBookTitle" rows="2" cols="20"> 18.<%=Request.QueryString("Title")%> 19.</textarea> Book Title </p> 20.<p><input type="submit" name="cmdSubmit" value="Submit"><input 21.type="reset" name="cmdReset" value="Reset"></p> 22.</form> 129 23.</body> 24.</html> Listing http://had/bookstore/order.asp 1. <%@ LANGUAGE="VBSCRIPT" %> 2. <HTML> 3. <HEAD> 4. <TITLE>Document Title</TITLE> 5. </HEAD> 6. <BODY> 7. <H2><CENTER>Thanks for your order!</CENTER></H2> 8. <% 9. Dim objFile 10.Dim objStream 11.' Open ORDER.TXT for writing 12.Set objFile = Server.CreateObject("Scripting.FileSystemObject") 13.Set objStream = objFile.OpenTextFile(Server.MapPath("/Bookstore") + _ 14."\order.txt", 8, True) 15.objStream.WriteLine Request.Form("txtName") 16.objStream.WriteLine Request.Form("txtAddress1") 17.objStream.WriteLine Request.Form("txtAddress2") 18.objStream.WriteLine Request.Form("txtCity") 19.objStream.WriteLine Request.Form("txtState") 20.objStream.WriteLine Request.Form("txtZip") 21.objStream.WriteLine Request.Form("txtCreditCard") 22.objStream.WriteLine Request.Form("txtBookTitle") 23.objStream.Close 24.Set objStream = Nothing 25.Set objFile = Nothing 26.%> 27.</BODY> 28.</HTML> Przykład realizacji. Baza danych dokumentów w środowisku Internet Listing C:\Inetpub\wwwroot\dok1\default.htm 1. <html> 2. <head> 130 3. <meta NAME="GENERATOR" Content="Microsoft FrontPage 3.0"> 4. <title> System of search of the documents</title> 5. </head> 6. <body> 7. <h1>System of information search of the documents</h1> 8. <hr> 9. <h2>Choose a type of search:</h2> 10.<h3><A href="locate.asp">1.To search in headings</A> - Viewing of the documents under the names of the documents in headings </h3> 11.<h3><A href="locate1.htm">2.To search under the names </A> Viewing of the documents under the names of the documents under the names</h3> 12.<p>&nbsp;</p></A> 13.</body> 14.</html> Listing Dokumentlist.asp 1. <%@ Language=VBScript %> 2. <HTML> 3. <HEAD> 4. <META NAME="GENERATOR" Content="Microsoft FrontPage 5.0"> 5. </HEAD> 6. <BODY> 7. <% 8. Public dbDocuments 9. Public rsDocuments 10.Dim strSQL 11.' Open a connection to dokuments 12.Set dbDocuments = Server.CreateObject("ADODB.Connection") 13.dbDocuments.Open("dokuments") 14.strSQL = "SELECT rubric.rid, files.Fid, files.Fdescr, files.FName, files.FPath" 15.strSQL = strSQL & " FROM rubric INNER JOIN files ON rubric.rid = files.rid" 16.strSQL = strSQL & " WHERE ((rubric.rid)= " & Request.QueryString("rid")& ")" 17.strSQL = strSQL & " ORDER BY files.Fid;" 131 18.%> 19.<!--strSQL=<br> 20.<% Response.Write strSQL%>--> 21.<% 22.' Run the query 23.Set rsDocuments = Server.CreateObject("ADODB.Recordset") 24.rsDocuments.Open strSQL, dbDocuments, 3 25.%> 26.<!-- We build the table with the documents --> 27.<% 28.If rsDocuments.BOF and rsDocuments.EOF Then%> 29.<H2><CENTER>The documents in a heading are absent!</CENTER></H2> 30.<%Else 31.' install the cursor 32.rsDocuments.MoveLast 33.rsDocuments.MoveFirst 34.End If 35.%> 36.<%If Not rsDocuments.BOF Then%> 37.<H2>There are following documents in a heading:</H2> 38.<TABLE BORDER width="100%"> <TR> <TH width="50%"> Name of the document </TH> <TH width="50%"> File of the document </TH> </TR> 39.<% 40.Do While Not rsDocuments.EOF 41.%> <TR> <TD width="50%"> 42.<A HREF="<%Response.Write Application.Value("ftppub")& trim(rsDocuments("FPath"))&trim(rsDocuments("FName"))%>"> 132 <%=rsDocuments("Fdescr")%> </A> </TD> <TD width="50%"> <%=rsDocuments("FName")%> </TD> </TR> 43.<% rsDocuments.MoveNext 44.Loop 45.%> 46.</TABLE> 47.<%End If%> 48.<P>&nbsp;</P> 49.<% 50.' Close database 51.rsDocuments.Close 52.dbDocuments.Close 53.Set rsDocuments = Nothing 54.Set dbDocuments = Nothing 55.%> 56.</BODY> 57.</HTML> Listing locate.asp 1. 2. 3. 4. 5. 6. 7. 8. 9. <%@ Language=VBScript %> <%Response.Expires=0%> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft FrontPage 5.0"> <META HTTP-EQUIV="Content-Type" content="text/html; charset=windows-1251"> </HEAD> <BODY> <% 10.Public dbRubric 11.Public rsRubric 133 12.Dim strSQL 13.' Open a connection to DB "dokuments" 14.Set dbRubric = Server.CreateObject("ADODB.Connection") 15.dbRubric.Open("dokuments") 16.strSQL = "SELECT rName , rDescr , rid FROM rubric;"%> 17.<!--strSQL =<br> 18.<%=strSQL %>--> 19.<% 20.' Run the query 21.Set rsRubric = Server.CreateObject("ADODB.Recordset") 22.rsRubric.Open strSQL, dbRubric, 3 23.%> 24.<!-- We build the table with headings --> 25.<% 26.If rsRubric.BOF and rsRubric.EOF Then%> 27.<H2><CENTER>The data on headings are absent!</CENTER></H2> 28.<%Else 29.' install the cursor 30.rsRubric.MoveLast 31.rsRubric.MoveFirst 32.End If 33.%> 34.<%If Not rsRubric.BOF Then%> 35.<H2>There are following documents in a database of the documents:</H2> 36.<TABLE BORDER width="100%"> <TR> <TH width="50%"> Name of a heading </TH> <TH width="50%"> Description of a heading </TH> </TR> 37.<% 38.Do While Not rsRubric.EOF 39.%> 134 <TR> <TD width="50%"> <A HREF="<%Response.Write Application.Value("aspcall")& Server.URLEncode(rsRubric("rid"))%>"> <%=rsRubric("rName")%> </A> </TD> <TD width="50%"> <%=rsRubric("rDescr")%> </TD> </TR> 40.<% rsRubric.MoveNext 41.Loop 42.%> 43.</TABLE> 44.<%End If%> 45.<P>&nbsp;</P> 46.<% 47.' Close database 48.rsRubric.Close 49.dbRubric.Close 50.Set rsRubric = Nothing 51.Set dbRubric = Nothing 52.%> 53.</BODY> 54.</HTML> Listing locate1.asp 1. 2. 3. 4. <%@ Language=VBScript %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft FrontPage 5.0"> 5. </HEAD> 6. <BODY> 7. <% 135 8. Public dbDocuments 9. Public rsDocuments 10.Dim strSQL 11.' Open a connection to DB "dokuments" 12.Set dbDocuments = Server.CreateObject("ADODB.Connection") 13.dbDocuments.Open("dokuments") 14.strSQL = "SELECT Fid, Fdescr, FName,FPath FROM files" 15.If Request.Form("txtTitle") <> "" Then 16.strSQL = strSQL & " Where Fdescr LIKE '%" & Request.Form("txtTitle") & "%'" 17.End If 18.'Run the query 19.Set rsDocuments = Server.CreateObject("ADODB.Recordset") 20.rsDocuments.Open strSQL, dbDocuments, 3 21.%> 22.<!-- We build the table with the documents --> 23.<% 24.If rsDocuments.BOF and rsDocuments.EOF Then%> 25.<H2><CENTER>Such documents are absent!</CENTER></H2> 26.<%Else 27.' install the cursor 28.rsDocuments.MoveLast 29.rsDocuments.MoveFirst 30.End If %> 31.<%If rsDocuments.RecordCount >300 Then%> 32.<H2><CENTER> 33.It is too much the documents! Specify inquiry! 34.</CENTER></H2> 35.<%Else 36.If Not rsDocuments.BOF Then%> 37.<H2><CENTER>There are such documents : 38.</CENTER></H2> 39.<TABLE BORDER width="100%"> <TR> <TH width="50%"> Name of the document </TH> <TH width="50%"> File of the document 136 </TH> </TR> 40.<% 41.Do While Not rsDocuments.EOF 42.%> <TR> <TD width="50%"> <A HREF="<%Response.Write Application.Value("ftppub")& trim(rsDocuments("FPath"))&trim(rsDocuments("FName" ))%>"> <%=rsDocuments("Fdescr")%> </A> </TD> <TD width="50%"> <%=rsDocuments("FName")%> </TD> </TR> 43.<% rsDocuments.MoveNext 44.Loop 45.%> 46.</TABLE> 47.<%End If%> 48.<%End If%> 49.<P>&nbsp;</P> 50.<% 51.' Close database 52.rsDocuments.Close 53.dbDocuments.Close 54.Set rsDocuments = Nothing 55.Set dbDocuments = Nothing 56.%> 57.<P>&nbsp;</P> 58.</BODY> 59.</HTML> Listing locate1.htm 137 1. <HTML> 2. <HEAD> 3. <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> 4. <TITLE></TITLE> 5. </HEAD> 6. <BODY> 7. <h1>Definition conditions of search</h1> 8. <h2>Enter a name of the document or characteristic words, 9. click Key.</h2> 10.<P>&nbsp;</P> 11.<form action="/dok1/locate1.asp" 12.method="post" name="frmLocate"> <p style="BORDER-TOP-WIDTH: 400px; BORDER-LEFTWIDTH: 400px; BORDER-BOTTOM-WIDTH: 400px; BORDERRIGHT-WIDTH: 400px"> 13.<input name="txtTitle" style="WIDTH: 331px; HEIGHT: 25px" size=36> 14.Name of the document</p> <p><input type="submit" name="B1" value="Press!"><input type="reset" name="B2" value="Clear"></p> 15.</form> 16.<P>&nbsp;</P> 17.<P>&nbsp;</P> 18.</BODY> 19.</HTML> Listing global.asa 1. <SCRIPT LANGUAGE=VBScript RUNAT=Server> 2. Sub Application_OnStart 3. '==Visual InterDev Generated - startspan== 4. '--Project Data Connection Application("Connection1_ConnectionString") = "Provider=MSDASQL.1;Persist Security Info=False;Data Source=dokuments;Extended Properties=""DSN=dokuments;DBQ=F:\asp\Databases\doku ments.mdb;DriverId=281;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"";" Application("Connection1_ConnectionTimeout") = 15 138 5. 6. 7. 8. Application("Connection1_CommandTimeout") = 30 Application("Connection1_CursorLocation") = 3 Application("Connection1_RuntimeUserName") = "" Application("Connection1_RuntimePassword") = "" '-- Пути к директориям и страницам Application("ftppub") = "ftp://had/doc/" Application ("aspcall") ="/dok1/documentlist.asp?rid=" '-- Project Data Environment 'Set DE = Server.CreateObject("DERuntime.DERuntime") 'Application("DE") = DE.Load(Server.MapPath("Global.ASA"), "_private/DataEnvironment/DataEnvironment.asa") '==Visual InterDev Generated - endspan== End Sub </SCRIPT> Przykład realizacji. Czasopismo elektroniczne. Ten projekt wykorzysta komponent ASP, mający nazwisko „Content Linking”. Content Linking pozwala na połączenia stron w taki sposób, aby mogły być przeglądane w seriach, sekwencyjnie. Przykładowo czasopismo składa się z artykułów oraz sekcji tych artykułów ułożonych sekwencyjne. Realizacja czasopisma potrzebuje wyznaczenia stron (*.htm lub *.asp) które dynamiczne przenosiłyby użytkownika do strony następnej lub z powrotem, do poprzedniej. Komponent Content Linking łączy w sobie metody umożliwiające realizację takich zadań. Komponent Content Linking jest częścią standartowej instalacji IIS. Jego plik biblioteki nosi nazwę nextlink.dll. Podstawą działania tego komponentu jest plik tekstowy, zawierający informacje o wszystkich stronach, które trzeba połączyć, oraz o kolejności, w jakiej te strony mają być połączone. W tym specjalnym pliku tekstowym muszą być podane nie tylko nazwę strony, ale również jej adres URL. Plik nie musi nosić jakiejś określonej specjalnej nazwy – musi być jedynie dostępny w strukturze katalogu wirtualnego, który będzie wykorzystany. Każdy wiersz pliku tekstowego ma następującą strukturę: PageURL Description Comment Każde pole oddzielone jest od siebie znakiem tabulacji, a każda pozycja musi być umieszczona w osobnym wierszu tekstowego pliku indeksu. Pierwsze pole każdego wiersza przechowuje adres URL danej strony. Drugie pole jest nazwą lub opisem strony. Trzecie, które nie jest wymagane, może zawierać dowolny komentarz, który po prostu jest ignorowany przez komponent. Przykład tego pliku jest pokazany w listingu Magazine.txt. 139 Listing magazine/magazine.txt /Magazine/Content.asp?ArticleID=1 Create ActiveX Controls /Magazine/Content.asp?ArticleID=2 Developer Days Information /Magazine/Content.asp?ArticleID=3 CTVBSIG Information Wszystkie artykuły są rozmieszczone w bazie danych aplikacji, dlatego połączenia do strony zawiera indeks rekordu ArtikleID. Metody komponentu Content Linking Metoda Opis GetListCount Zwraca liczbę pozycji w pliku indeksu GetListIndeks Zwraca numer pozycji bieżącej strony w pliku indeksu GetNextUrl Zwraca adres URL strony następnej względem strony bieżącej GetNextDescription Zwraca opis strony następnej względem strony bieżącej GetPreviosURL Zwraca adres URL strony poprzedniej względem strony bieżącej GetPreviosDescription Zwraca opis strony poprzedniej względem strony bieżącej GetNthURL Zwraca URL pozycji indeksu na podstawie liczby przekazanej metodzie GetNthDescription Zwraca opis pozycji indeksu na podstawie liczby przekazanej metodzie Projekt realizuje połączone tabeli stylu (linked style sheets). W tym przypadku tabela stylów dokumentu jest wyznaczona w innym dokumencie. Na tą tabelę mogą odwołać inne strony aplikacji, które będą miały jedyny standard formatowania rezultatów. Połączona tabela realizowana się w wyglądzie pliku tekstowego w listingu Magazine.css. listing magazine/magazine.css BODY { margin-left:10px; font:12pt/14pt "Garamond"; color:black; text-align:left; background:transparent; } P{ margin-left:10px; font:12pt/14pt "Garamond"; color:black; text-align:left; background:transparent; } H1 { margin-left:10px; font:18pt/20pt "Arial Black"; color:black; text-align:left; 140 background:transparent; } H2 { margin-left:10px; font:12pt/14pt "Arial Black"; color:black; text-align:left; background:gray; } H3 { margin-left:10px; font:12pt/14pt "Garamond"; color:black; text-align:left; background:transparent; } H4 { margin-left:10px; font:14pt/16pt "Garamond"; font-style:italic color:black; text-align:left; background:transparent; } Dla odwołania do wyznaczonego stylu znacznik <LINK> rozdziału <HEAD> musi zawierać nazwę tego pliku. Ten projekt wykorzysta bazę danych magazine.mdb. Schemat bazy oraz treść tabel są pokazane na rysunku niżej. Baza danych Magazine.mdb 141 Początkowa strona aplikacji jest pokazana w listingu default.asp. Listing magazine/default.asp 1. <%@ LANGUAGE="VBSCRIPT" %> 2. <% Option Explicit %> 3. <html> 4. <head> 5. <title>Document Title</title> 6. <LINK REL=STYLESHEET HREF="Magazine.css"> 7. </head> 8. <body bgcolor="#FFFFFF"> 9. <% 10. ' Variables 11. Dim objLinker 12. Dim i 13. ' Create Content Linking component 14. Set objLinker = Server.CreateObject("MSWC.NextLink") 15. %> 16. <!-- Generate table of contents 17. from content linking list --> 18. <H1>Table of Contents</H1> 19. <TABLE> 142 20. <% 21. For i = 1 to objLinker.GetListCount("Magazine.txt") 22. %> 23. <TR> 24. <TD><IMG SRC="/Magazine/Images/Bullet.gif"></TD> 25. <TD><H3><A HREF="<%=objLinker.GetNthURL("Magazine.txt", i)%>"> <%=objLinker.GetNthDescription("Magazine.txt", i)%></A></H3> 26. </TD> 27. </TR> 28. <%Next%> 29. </TABLE> 30. <!-- Index search form --> 31. <DIV STYLE="position:absolute; top:370px; left:400px; width:200;"> 32. <CENTER> 33. <BR> 34. <FORM ACTION="/Magazine/Search.asp" METHOD="POST"> 35. <INPUT NAME="SearchString" size="20"><BR> 36. <INPUT TYPE="SUBMIT" VALUE="Search!"> 37. </FORM> 38. </CENTER> 39. </DIV> 40. <hr> 41. <p><img src="../Magazine/Images/banner.gif" width="467" 42. height="175"></p> 43. </body> 44. </html> Pozostałe strony aplikacji (content.asp oraz search.asp) są pokazane niżej. Listing magazine/content.asp 1. 2. 3. 4. 5. <%@ LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <HTML> <HEAD> <LINK REL=STYLESHEET HREF="Magazine.css"> 6. <SCRIPT LANGUAGE="VBScript"> 7. <!-8. Sub imgBack_OnMouseOver() 9. txtBack.Style.Visibility = "Visible" 10. End Sub 11. Sub imgBack_OnMouseOut() 143 12. txtBack.Style.Visibility = "Hidden" 13. End Sub 14. Sub imgNext_OnMouseOver() 15. txtNext.Style.Visibility = "Visible" 16. End Sub 17. Sub imgNext_OnMouseOut() 18. txtNext.Style.Visibility = "Hidden" 19. End Sub 20. --> 21. </SCRIPT> 22. </HEAD> 23. <BODY LINK="White" VLINK="White" ALINK="White"> 24. <% 25. ' This code creates navigational tools for the site 26. ' Variables 27. Public objLinker 28. Public intArticleID 29. Public intArticles 30. ' Get Content Linking object info 31. Set objLinker = Server.CreateObject("MSWC.NextLink") 32. ' Get ArticleID 33. intArticleID = CInt(Request.QueryString("ArticleID")) 34. intArticles = CInt(objLinker.GetListCount("Magazine.txt")) 35. %> 36. <!-- Navigational tools --> 37. <DIV> 38. <!-- Next Article --> 39. <%If intArticleID > 1 Then%> 40. <A HREF=<%=objLinker.GetNthURL("Magazine.txt", intArticleID - 1)%>> 41. <IMG ID="imgBack" SRC="/Magazine/Images/Back.gif"> 42. </A> 43. <%End If%> 44. <!-- Previous Article --> 45. <%If intArticleID < intArticles Then%> 46. <A HREF=<%=objLinker.GetNthURL("Magazine.txt", intArticleID + 1)%>> 144 47. <IMG ID="imgNext" SRC="/Magazine/Images/Next.gif"> 48. </A> 49. <%End If%> 50. <!-- Article descriptions --> 51. <%If intArticleID > 1 Then%> 52. <FONT FACE="Verdana" ID="txtBack" SIZE=4 53. STYLE="position:relative;visibility:hidden;color:red;margin-left:20px"> 54. <%=objLinker.GetNthDescription("Magazine.txt", intArticleID - 1)%> 55. </FONT><BR> 56. <%End If%> 57. <%If intArticleID < intArticles Then%> 58. <FONT FACE="Verdana" ID="txtNext" SIZE=4 59. STYLE="position:relative;visibility:hidden;color:red;margin-left:20px"> 60. <%=objLinker.GetNthDescription("Magazine.txt", intArticleID + 1)%> 61. </FONT> 62. <%End If%> 63. <% 64. ' Variables 65. Dim objConnection 66. Dim objRecordset 67. Dim strSQL 68. ' Open data source 69. Set objConnection = Server.CreateObject("ADODB.Connection") 70. objConnection.Open "Magazine" 71. ' Build SQL statement 72. strSQL = "SELECT * FROM Articles,Sections " 73. strSQL = strSQL & "WHERE Sections.ArticleID = Articles.ArticleID " 74. strSQL = strSQL & "AND Articles.ArticleID = " & _ 75. Request.QueryString("ArticleID") 76. ' Get records 77. Set objRecordset = Server.CreateObject("ADODB.Recordset") 78. objRecordset.Open strSQL, objConnection 79. ' Get article information 80. Dim strTitle 81. Dim strSubTitle 82. Dim strNote 83. strTitle = objRecordset("ArticleTitle") & "" 84. strSubTitle = objRecordset("ArticleSubTitle") & "" 145 85. strNote = objRecordset("ArticleNote") & "" 86. ' Article title 87. If strTitle <> "" Then 88. %> 89. <H1><%=strTitle%></H1><% 90. End If 91. ' Article subtitle 92. If strSubTitle <> "" Then 93. %> 94. <H4><%=strSubTitle%></H4><% 95. End If 96. ' Build article body 97. ' Variables 98. Dim strSection 99. Dim strText 100. Do While Not objRecordset.EOF 101. 102. 103. 104. 105. 106. ' Get section header strSection = objRecordset("SectionTitle") & "" If strSection <> "" Then %> <H2><%=strSection%></H2><% End If 107. 108. 109. 110. 111. 112. 113. ' Get section text strText = objRecordset("SectionText") & "" If strText <> "" Then %> <%=strText%> <% End if 114. 115. 116. ' Get next section objRecordset.MoveNext Loop 117. 118. 119. 120. 121. ' Close database objRecordset.Close objConnection.Close Set objRecordset = Nothing Set objConnection = Nothing 146 122. %> 123. 124. </BODY> </HTML> listing magazine/search.asp 1. 2. 3. 4. 5. <%@ LANGUAGE="VBSCRIPT" %> <% Option Explicit %> <HTML> <LINK REL=STYLESHEET HREF="Magazine.css"> <BODY> 6. <H1>Here are the results of your search...</H1> 7. <% 8. ' Variables 9. Dim objConnection 10. Dim objRecordset 11. Dim strSQL 12. ' Open data source 13. Set objConnection = Server.CreateObject("ADODB.Connection") 14. objConnection.Open "Magazine" 15. ' Build SQL statement 16. strSQL = "SELECT * FROM Articles,Sections " 17. strSQL = strSQL & "WHERE Sections.ArticleID = Articles.ArticleID " 18. strSQL = strSQL & "AND Sections.SectionText LIKE '%" & _ 19. Request.Form("SearchString") & "%'" 20. ' Get records 21. Set objRecordset = Server.CreateObject("ADODB.Recordset") 22. objRecordset.Open strSQL,objConnection%> 23. <TABLE> 24. <% Do While Not objRecordset.EOF %> 25. <TR> 26. <TD> 27. <A HREF="Content.asp?ArticleID=<%=objRecordset("ArticleID")%>"> 28. <H3><%=objRecordset("ArticleTitle")%></H3> </A> 147 29. </TD> 30. </TR> 31. <% 32. ' Get next record 33. objRecordset.MoveNext 34. Loop 35. %> 36. </TABLE> 37. <H1>Tip of the Day...</H1> 38. <% 39. ' Tip of the day 40. ' Variables 41. Dim objFile, objStream 42. Dim TextNumber, strText, i 43. Set objFile = Server.CreateObject("Scripting.FileSystemObject") 44. Set objStream = objFile.OpenTextFile(Server.MapPath ("/Magazine") _ 45. + "\tips.txt") 46. Randomize Timer 47. TextNumber = Int(Rnd*30) 48. For i = 0 to TextNumber 49. objStream.SkipLine 50. Next 51. strText= objStream.ReadLine 52. objStream.Close 53. %> 54. <H4><%=strText%></H4> 55. </BODY> 56. </HTML> Wymogi do projektu aplikacji bazodanowej Etapy projektu: 148 1. Stworzenie bazy danych 1.1. Stworzenia modelu konceptualnego bazy danych aplikacji w środowisku PowerDesigner Treść podetapu: Model musi zawierać nie mniej niż 5 encji. Schemat modelu konceptualnego 1.2 Stworzenia modelu fizycznego w środowisku PowerDesigner Treść podetapu: Wybór typu DBMS (Sybase SQL Anywhere lub MS ACCESS) Schemat modelu fizycznego 1.3 Stworzenia tabel bazy danych Treść podetapu: Stworzenia kodu SQL w środowisku PowerDesigner Stworzenia tabel bazy w środowisku serwera Uzupełnienie bazy testową informacją 1.4. Stworzenia zapytań SQL do bazy danych Treść podetapu: Stworzenie zapytań SQL dla wpisu informacji do tabel bazy danych Stworzenie zapytań SQL dla czytania informacji (4-5 zapytań) 2. Stworzenia lokalnej aplikacji bazodanowej Treść podetapu: Aplikacja bazodanowa, która jest stworzona w jednym z środowisk: C++, Java lub PowerBuilder. 3. Stworzenia zdalnej Internet- aplikacji Treść podetapu: Internet aplikacja (ASP – aplikacja) Kody stron ASP Pytania kontrolne po kursu „Systemy zarządzania relacyjnymi bazami danych”. 1.Technologia dostępu do baz danych w Internecie. Serwery WWW. Technologia ASP. Wbudowane obiekty ASP. Przykłady. 2.Funkcje wbudowane w VBScript. Wykorzystanie Formularzy. Metody Post i Get. Wykorzystanie cookies. Przesyłanie plików pomiędzy klientem a serwerem. Przykłady. 3.Dostęp do plików i folderów. Obiekty FileSystemObject, File i Folder. Wykorzystanie tych obiektów. Przykłady. 4.Standardy ODBC, OLE DB. Dostęp do baz danych przy użyciu ADO. 149 5.Obiekty CONNECTION i RECORDSET. Typy kursorów, tryby blokowania. Modyfikacja, wstawianie i dodawanie rekordów do baz danych. Przykłady. 6.Sterowanie transakcjami bazy danych. Filtrowanie rekordów. Obiekt COMMAND. Przykłady. 7.Realizacja skryptów na stronie klienta. Przykłady. 8. Przykład projektu księgarni Internetowej. 9.Przykład projektu czasopisma elektronicznego. 10.Przykład projektu bazy danych dokumentów. 150