Przedmiot: Programowanie usług internetowych - Delphi Przygotował: K. Strzałkowski Rok V. Semestr IX. Wydział ZiMK Ćwiczenie 4 Technologia WebBroker 1. Proste usługi udostępniane za pomocą akcji komponentu WebBroker. Wygeneruj w Delphi nową aplikację wykorzystującą technologię WebBroker. Zainicjuj opcję menu: File New... Other... Delphi Projects WebBroker a następnie wybierz: Web Server Application. W wyświetlonym okienku New Web Server Application wybierz opcję Web App Debugger Executable, a w polu Class Name wpisz: P1. Delphi wygeneruje 3 modułową aplikację, w której dwa pierwsze moduły odpowiadają za organizację współpracy modułów wykonawczych z serwerem Web App Debugger ułatwiającym testowanie aplikacji. Odpowiednich uzupełnień aplikacji należy dokonywać w module Unit2.Pas zawierającym definicję formatki-kontenera WebModule. Zdefiniuj w komponencie WebModule2 dwie nowe akcje. Jedna będzie wyświetlała stronę z bieżącą datą i czasem, a druga wartości parametrów zapytania odebranego od klienta. Dla realizacji akcji pierwszej należy: - rozwinąć edytor właściwości Actions komponentu-kontenera WebModule1 i w wyświetlonym okienku edytora dołączyć nowy obiekt akcji. - dla nowego obiektu akcji zdefiniować (w Inspektorze Obiektów) właściwość PathInfo wpisując: Data - wygenerować dla akcji szkielet metody obsługi zdarzenia OnAction i uzupełnić ją zapisem: procedure TwebModule2.WebModule1WebActionItem1Action(Sender: TObject; + FormatDateTime('"Dzis jest " dddd, mmmm d, yyyy,' + '"<br> Godzina: " hh:mm:ss AM/PM', Now); Dla realizacji akcji drugiej należy: - wygenerować nową akcję (przy pomocy edytora właściwości Actions komponentu WebModule) - ustawić dla niej PathInfo=Parametry - wygenerować metodę zdarzenia OnAction nowej akcji i zapełnić ją zapisem: procedure TwebModule2.WebModule1WebActionItem2Action(Sender: TObject; Response.Content:= Response.Content + '<H1>Wartosci parametrow</h1>' 1
+'URL='+Request.URL+'<BR>' +'ScriptName='+Request.ScriptName+'<BR>' +'RemoteAddr='+Request.RemoteAddr+'<BR>' +'RemoteHost='+Request.RemoteHost+'<BR>' +'Referer='+Request.Referer+'<BR>' +'Query='+Request.Query+'<BR>' +'PathInfo='+Request.PathInfo+'<BR>' +'Host='+Request.Host+'<BR>'; Obie wygenerowane akcje dołączają do właściwości Response.Content zapisy zasadniczych treści wyświetlanych na stronach. Dla dokonania niezbędnych uzupełnień w zapisie HTMLowym stron należy dołączyć jeszcze dwie metody wg następnego punktu. Dla komponentu WebModule dołącz metody obsługi zdarzeń OnBeforeDispatch oraz OnAfterDispatch. Metoda OnBeforeDispatch powinna umieszczać we właściwości Response.Content zapis początkowych znaczników strony, a metoda OnAfterDispatch powinna dołączać do właściwości Response.Content zapis końcowych znaczników strony. Proponowane zapisy metod: procedure TWebModule1.WebModuleBeforeDispatch(Sender: TObject; Response.Content := '<HTML><HEAD><TITLE>Aplikacja WebModule</TITLE>' +'</HEAD><BODY><H1>Aplikacja WebModule</H1>' +'<H2>Akcja: '+Request.PathInfo+'</H2>'; procedure TWebModule1.WebModuleAfterDispatch(Sender: TObject; +'<I>Strona wygenerowana przez Delphi</I><BR>' +'<A HREF="'+Request.Referer+'">Powrot</A></BODY></HTML>'; Przed rozpoczęciem testowania aplikacji zmień nazwę pliku projektu na Proste.Dpr. Przetestuj opracowaną aplikację z wykorzystaniem aplikacji serwera Web App Debugger. Kroki testowania aplikacji: a. Uruchomienie aplikacji opcja Run Run. Pierwsze uruchomienie aplikacji powoduje zarejestrowanie jej w systemie dzięki czemu staje się ona widoczna dla innych. b. Uruchomienie Debuggera: opcja Tools Web App Debugger. W wyświetlonym oknie aplikacji Web App Debugger można startować i zatrzymywać serwer symulujący WWW i ustawiać jego opcje oraz śledzić informacje o działaniu serwera wyświetlane w postaci zwięzłego logu. c. Wystartowanie serwera przyciskiem Start, a następnie kliknięcie domyślnego odnośnika URL postaci: http://localhost:8081/serverinfo.serverinfo. Odsyłacz powoduje uruchomienie jeszcze jednej aplikacji o nazwie ServerInfo.Exe. Aplikacja ta jest reprezentowana na ekranie przez kolejną pustą formatkę. Powoduje wyświetlenie (w domyślnej przeglądarce internetowej) strony zawierającej listę zarejestrowanych w systemie aplikacji testowanych tzn. tych wszystkich które 2
wyprodukowano za pomocą opcji Web App Debbuger executable. Na wyświetlanej stronie poszczególne aplikacje można: - wybierać z listy (wywoływać) poprzez zaznaczenie odpowiedniej pozycji listy i kliknięcie przycisku Go oraz - usuwać z rejestracji poprzez wyświetlenie strony View Details i zainicjowanie operacji Clean. Uwaga: Aplikacja SerwerInfo.Exe dla prawidłowego działania również wymaga rejestrowania, które odbywa się automatycznie przy pierwszym uruchomieniu. Z tego powodu początkowo strona może być wyświetlana niepoprawnie. Należy ponownie zainicjować odnośnik (lub uruchomić wcześniej SerwerInfo.Exe z poziomu wiersza poleceń). Uwaga 2: na liście aplikacji wyświetlanej na stronie znajduje się też SerwerInfo.Exe nie należy jej usuwać z rejestracji. W razie pomyłkowego wyrejestrowania należy ją ponownie uruchomić co spowoduje powtórną rejestrację. d. Zainicjowanie testowanej aplikacji. Można tego dokonać poprzez wybranie z listy odpowiedniej pozycji: Proste.P1 oraz kliknięcie przycisku Go jednak wtedy zainicjowana będzie akcja domyślna. Dla bezpośredniego uruchomienia akcji innej niż domyślna należy wpisać w przeglądarce odpowiedni adres np.: http:\\localhost:8081\proste.p1\parametry e. Przetestowanie działania poszczególnych stron. 2. Inicjowanie akcji-stron z pliku HTML i za pośrednictwem akcji wyświetlającej menu Przygotuj plik Proste.HTML zawierający odsyłacze do akcji-stron opracowanej aplikacji. Proponowany zapis: <HTML> <HEAD> <TITLE>Aplikacja WebModule</TITLE> </HEAD> <BODY> <H1><CENTER>Wybieranie akcji</center></h1> <A href="http://localhost:8081/proste.p1/parametry">parametry</a> <A href="http://localhost:8081/proste.p1/data">data</a> Strona wygenerowana przez HTML </BODY> </HTML> Plik zapisz w swoim katalogu, a następnie wyświetl go w przeglądarce i przetestuj działanie odsyłaczy. Dodaj do opracowanej aplikacji nową akcję i ustaw dla niej: PathInfo=Menu Default=True Metoda obsługująca zdarzenie OnAction w postaci: 3
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject; var i:integer; Response.Content:=Response.Content+'<H3>Menu</H3>'+#13+'<UL> +#13; for i:=0 to Actions.Count - 1 do +'<LI><A HREF="'+Request.ScriptName + Action[i].PathInfo+'"> '+Action[i].PathInfo+'</A>'#13; Response.Content:=Response.Content+'</UL>'; Przetestuj wyświetlanie menu i wybieranie poszczególnych stron za jego pośrednictwem. 3. Aplikacja wyświetlająca tabele bazy danych. Opracuj z wykorzystaniem opcji Web App Debbuger executable aplikację o nazwie Tabele.Dpr. Aplikacja powinna umożliwiać wyświetlanie trzech stron za pośrednictwem trzech akcji. Dwie akcje powinny wyświetlać strony z tabelami bazy danych Katalog i Stany (uzupełnioną nazwą towaru), a trzecia (domyślna) menu odsyłaczy do pozostałych stron. Dla połączenia z bazą danych wykorzystaj komponenty z zakładki dbexpress: SQLConnection i SQLDataSet, a dla wyświetlania tabel komponent DataSetTableProducer z zakładki Internet. Wyświetlanie odpowiednich tabel zorganizuj poprzez dynamiczną wymianę (w kodzie programu) tekstu zapytania we właściwości CommandText komponentu SQLDataSet. Wskazówka: Proponowany kod metody zdarzenia OnAction dla akcji wyświetlającej tabelę Stany: procedure TWebModule2.WebModule1WebActionItem2Action(Sender: TObject; SQLDataSet1.CommandText:='Select Nazwa, Opak, Termin, Ilosc, Cena ' + ' From Katalog, Stany ' + ' Where Katalog.Kod=Stany.Kod_Tow'; SQLDataSet1.Open; DataSetTableProducer1.Columns.Clear; + DataSetTableProducer1.Content; SQLDataSet1.Close; 4. Aktualizacja tabeli Uzytkownicy Opracuj w trybie Web App Debbuger executable aplikację ZmienU.Dpr zawierającą jedną akcję (domyślną) pozwalającą aktualizować dane użytkownika w zakresie uprawnień do tabel Katalog i Stany. Przetestuj działanie aplikacji wykorzystując formularz: <HTML> <HEAD> <TITLE>Zmiana uprawnien uzytkownika </TITLE> </HEAD><BODY> <H1> Zmiana uprawnien uzytkownika </H1> <FORM ACTION="http://localhost:8081/ZmienU.z1" METHOD="GET"> Nazwa uzytkownika: <INPUT TYPE="TEXT" NAME="Login"> <p> Katalog (T/N): <INPUT TYPE="TEXT" NAME="Katalog"> 4
<p> Stany (T/N): <INPUT TYPE="TEXT" NAME="Stany"> <p> <INPUT TYPE="SUBMIT" VALUE="Zmien uprawnienia uzytkownika"> </FORM> <I>Strona wygenerowana przez HTML<I> </BODY></HTML> Aplikacja powinna pobierać dane z właściwości Request.QueryFields. Np. dla odebrania wartości pola Login należy zastosować instrukcję: Login1:= Request.QueryFields.Values['Login']; W przypadku niekompletnych danych aplikacja powinna wyświetlać stronę z komunikatem błędu. Dla poprawnych danych aplikacja powinna aktualizować odpowiedni zapis w tabeli i wyświetlać stronę z komunikatem o powodzeniu operacji. Do zapisywania zmian w odpowiednim rekordzie tabeli Uzytkownicy zastosuj: zapytanie SQL: SQLDataSet1.CommandText:='UPDATE Uzytkownicy SET Katalog=' +#39+Katalog1+#39+ ',Stany='+#39+Stany1+#39 +' WHERE Login='+#39+Login1+#39; gdzie Login1, Katalog1 i Stany1 wartości przekazane z pól formularza. ZADANIA 1. Napisz aplikację wyświetlającą tabele Katalog i Stany ze sprawdzeniem uprawnień użytkownika. Aplikacja przed każdorazowym wyświetleniem tabeli powinna wyświetlać formularz do wprowadzenia danych użytkownika: Login i Hasło. Tabela powinna być wyświetlana dopiero po stwierdzeniu obecności wpisu użytkownika w tabeli Uzytkownicy oraz po potwierdzeniu że użytkownik ma prawo dostępu do tabeli. 2. Zmodyfikuj aplikację Tabele.Dpr poprzez dodanie nowej akcji która wyświetla tabelę Uzytkownicy w zakresie kolumn: Login, Katalog i Stany oraz umożliwia aktualizację danych dla wybranego użytkownika. Wartości w kolumnie Login powinny być odsyłaczami do programu wyświetlającego formularz edycyjny pozwalający na określenie nowych wartości pól Katalog i Stany. Wartości w tych polach równe T lub N precyzują uprawnienia użytkownika do dostępu do odpowiednich tabel bazy danych. Program wyświetlający w/w formularz powinien być napisany w postaci nowej akcji. Przycisk Submit formularza powinien inicjować kolejną nową akcję wpisującą dane z formularza do odpowiedniego wiersza tabeli Uzytkownicy oraz wyświetlającą stosowny komunikat. 5