Przedmiot: Programowanie usług internetowych - Delphi Przygotował: K. Strzałkowski Rok V. Semestr IX. Wydział ZiMK Ćwiczenie 2 Publikowanie stron w internecie technologia CGI 1. Publikacja prostej strony zapisanej w HTML. Przygotuj plik o nazwie Strona1.HTML i zawartości: <TITLE>Wyswietlanie daty i czasu miejscowego</title> <H1>Data lub czas miejscowy</h1> <A HREF="http://localhost/cgi-bin/data1.exe"> Data dzisiejsza</a> <P> <A HREF=" http://localhost/cgi-bin/czas1.exe"> Czas bieżący</a> <P> <I>Strona wygenerowana przez HTML</I> Skopiuj plik do katalogu macierzystego serwera Apache (C:/xampp/htdocs). Uruchom przeglądarkę i wpisz w polu adresowym następujący ciąg: http://localhost/strona1.html Zaobserwuj czy wyświetlana strona zawiera dwa odnośniki do innych stron. Obydwa odwołania na razie nie działają. 2. Przygotowanie prostej aplikacji CGI. Wygeneruj w Delphi nową aplikację konsolową: File New Other... i w okienku New Items wybierz: Delphi projects Console Application. Zmień nazwę projektu na Data1. W pliku Data1.DPR wpisz następujący kod: program Data1; {$APPTYPE CONSOLE} uses SysUtils; writeln('content-type: TEXT/HTML'); writeln; writeln(''); writeln('<title>czas miejscowy</title>'); writeln(''); writeln('<h1>czas miejscowy</h1>'); writeln(''); writeln('<h3>'); writeln(formatdatetime('"dzis jest " dddd, mmmm d, yyyy,', Now)); writeln('</h3>'); writeln(''); 1
writeln('<a HREF="http://localhost/Strona1.html"> Powrot </A><hr>'); writeln('<i>strona wygenerowana przez Delphi<I>'); writeln(''); readln; end. Po uruchomieniu program powinien wyświetlać w okienku MS-Dos poprawny zapis strony zawierającej datę systemową. Okienko jest zamykane po naciśnięciu Enter. Usuń z tekstu programu ostatnią linię zawierającą instrukcję readln i ponownie skompiluj program. Skopiuj plik Data1.Exe do katalogu \cgi-bin\ w katalogu macierzystym serwera (C:/xampp/cgi-bin). Sprawdź że na stronie Strona1.HTML wyświetlonej jak w punkcie 1 odsyłacz Data dzisiejsza działa poprawnie. Opracuj samodzielnie aplikację wyświetlającą bieżący czas. Postępuj jak w punkcie 2. Nadaj projektowi nazwę Czas1.DPR. Do wyświetlenia sformatowanego czasu wykorzystaj funkcję: FormatDateTime('"Jest godzina: " hh:mm:ss AM/PM', Now) Po skopiowaniu programu Czas1.Exe do właściwego katalogu wypróbuj działanie strony. 3. PageProducer w aplikacji CGI Wygeneruj nową aplikację konsolową. Nadaj projektowi nazwę DataICzas.DPR. Dołącz do projektu Moduł Danych: File New Other... Data module. Umieść na formatce nowego modułu komponent PageProducer, a następnie opracuj i wpisz w jego właściwości HTMLDoc szablon powodujący wyświetlanie strony jak w programie Czas1.DPR. Zamiast linii zawierającej instrukcję wyświetlania czasu wpisz znacznik <#dataiczas>. Wygeneruj metodę obsługi zdarzenia OnHTMLTag o zawartości: procedure TDataModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag; const TagString: String; TagParams: TStrings; var ReplaceText: String); if TagString='dataiczas' then ReplaceText:=FormatDateTime('"Dzis jest " dddd, mmmm d, yyyy,' + '"<br> godzina: " hh:mm:ss AM/PM', Now); end; Zapisany wyżej algorytm obsługi znacznika powoduje wpisanie w jego miejsce sformatowanej daty i czasu systemowego. W pliku projektu o nazwie DataICzas.DPR wpisz następujący kod: program DataICzas; {$APPTYPE CONSOLE} uses Forms, SysUtils, Unit1 in 'Unit1.pas' {DataModule1: TDataModule}; 2
{$R *.RES} Application.CreateForm(TDataModule1, DataModule1); writeln('content-type: TEXT/HTML'); writeln; writeln(datamodule1.pageproducer1.content); end. Przetestuj działanie aplikacji. Najpierw w okienku Ms-Dos sprawdź poprawność kodu HTML (dopisując przed ostatnim end instrukcję readln), a następnie skompiluj ponownie program (bez readln) i skopiuj go do podkatalogu /CGI-BIN serwera. Sprawdź poprawność wyświetlania strony na dwa sposoby: - wywołaj bezpośrednio program wpisując w przeglądarce adres URL: http://localhost/cgi-bin/dataiczas.exe - dokonaj odpowiednich zmian w pliku Strona1.HTML (dodaj odwołanie do nowego programu), a następnie sprawdź poprawność wyświetlania daty i czasu. 4. Publikowanie tabeli Katalog Opracuj plik Strona2.HTML zawierający dwa odnośniki powodujące wyświetlanie tabel bazy danych poprzez uruchomienie odpowiedniego programu CGI. Pierwszy odnośnik przeznaczony do wyświetlania tabeli Katalog powinien mieć postać: <A HREF="http://localhost/cgi-bin/katalog.exe"> Tabela Katalog </A> Drugi przeznaczony do wyświetlania wartości wszystkich towarów na podstawie tabeli Stany powinien być skonstruowany analogicznie. Proponowana nazwa odpowiedniego programu CGI: Wartosc.Exe. Wygeneruj nową aplikację konsolową i dołącz do niej Moduł Danych. Moduł projektu o nazwie Katalog.DPR powinien być zapełniony zawartością jak zamieszczona w punkcie poprzednim zawartość pliku DataICzas.DPR. Zastąp ostatnią instrukcję następującą: writeln(datamodule1.datasettableproducer1.content); Na formatce Modułu Danych rozmieść komponenty - z zakładki dbexpress: SQLConnection i SQLDataSet z zakładki Internet: DataSetTableProducer. Ustaw własności komponentów odpowiednio dla uzyskania obrazu tabeli Katalog: SQLConnection: ConnectionName: wybierz IBConnection Params: wpisz nazwę pliku bazy: localhost:d:\zip_5\hurt.gdb LoginPrompt: wybierz False Connected: wybierz True SQLDataSet: SQLConnection: CommandType: wybierz SQLConnection1 wybierz cttable 3
CommandText: Active: wybierz Katalog wybierz True DataSetTableProducer: DataSet wybierz: SQLDataSet1 Header wpisz: kod HTML odpowiedni dla początku strony np.: <TITLE>Tabela Katalog</TITLE> Footer wpisz: kod HTML dla końca strony np.: <A HREF="http://localhost/Strona2.html"> Powrot </A><hr> <I>Strona wygenerowana przez Delphi</I> MaxRow wpisz: 1 Caption wpisz: <H2>Tabela Katalog</H2> Przetestuj działanie strony i aplikacji. Wykorzystaj właściwości RowAttributes i TableAttributes oraz edytor właściwości Columns do uatrakcyjnienia wyglądu tabeli. 5. Wyświetlanie wartości towarów Opracuj aplikację konsolową zawierającą dwa moduły: moduł projektu i Moduł Danych. Moduł projektu o nazwie Wartosc.DPR powinien być zapełniony zawartością jak zamieszczona w punkcie poprzednim zawartość pliku Katalog.DPR. Zastąp ostatni wiersz pliku następującym: writeln(datamodule1.datasetpageproducer1.content); Na formatce Modułu Danych rozmieść komponenty - z zakładki dbexpress: SQLConnection i SQLDataSet z zakładki Internet: DataSetPageProducer. Ustaw własności komponentów odpowiednio dla realizacji zapytania SQL: SELECT Count(*) AS liczba, Sum(ILOSC* CENA) AS wartosc FROM STANY; Połącz komponent DataSetPageProducer ze źródłem bazy danych i wpisz we właściwości HTMLDoc szablon strony: <TITLE>Wyswietlanie danych z bazy</title> <H1>Wyswietlanie wartosci towarow na podstawie tabeli STANY</H1> Liczba asortymentów: <#liczba> <BR> Wartosc wszystkich towarów: <#wartosc> <A HREF="http://localhost/Strona2.html"> Powrot </A><hr> <I>Strona wygenerowana przez Delphi</I> Przetestuj działanie strony i aplikacji. 6. Wyświetlanie Katalogu i wartości towarów wg gatunków 4
Skopiuj projekt Katalog.DPR (wszystkie pliki) do nowego katalogu. Zmień działanie programu tak by w ostatniej kolumnie tabeli wyświetlane były odnośniki do programów obliczających wartość towarów w 1 i 2 gatunku postępując jak opisano niżej. Dla komponentu DataSetTableProducer dodaj metodę obsługi zdarzenia OnFormatCell: procedure TDataModule1.DataSetTableProducer1FormatCell(Sender: TObject; CellRow, CellColumn: Integer; var BgColor: THTMLBgColor; var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs, CellData: String); if CellRow=0 then Align:=haLeft else if CellColumn=3 then CellData:='<A HREF="gatunek'+CellData+'.exe">Gatunek '+CellData+'</A>'; end; Sprawdź czy dyrektywa uses modułu Unit1.Pas zawiera specyfikacje modułów (ew. dopisz moduły): SysUtils, Classes, DBXpress, FMTBcd, HTTPProd, HTTPApp, DBWeb, DB, SqlExpr; Opracuj dwa nowe programy o nazwach Gatunek1.DPR i Gatunek2.DPR, które powodują wyświetlanie strony zawierającej liczbę asortymentów i wartość towarów w 1 gatunku oraz odpowiednio liczbę asortymentów i wartość towarów w 2 gatunku. Wskazówka: do wyznaczania wartości towarów w 1 gatunku wykorzystaj zapytanie: ZADANIA SELECT Count(*) AS liczba, Sum(ILOSC* CENA) AS wartosc FROM STANY, KATALOG WHERE KOD=KOD_TOW AND GAT="1" Przetestuj działanie aplikacji. 1. Opracuj stronę i aplikację wyświetlającą zawartość tabeli STANY. Tabela powinna zawierać nazwy towarów, a nie ich kody. 2. Opracuj aplikację realizującą zadanie jak w punkcie 6 bez stosowania komponentu DataSetTableProducer. Zastosuj DataSetPageProducer oraz PageProducer. 5