Delphi __ Kompendium __ Roz18.pdf

(1544 KB) Pobierz
Delphi :: Kompendium :: Roz...
Delphi :: Kompendium :: Rozdział 18 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_18
Logowanie | Rejestracja | Forum | Pomoc | Reklama | Szukaj
Strona główna :: Delphi :: Kompendium
Rozdział 18
Edytuj
Historia
Delphi
Artykuły
Kompendium
Gotowce
FAQ
.NET
Turbo Pascal
FAQ
PHP
FAQ
Java
FAQ
C/C++
Artykuły
FAQ
C#
Wprowadzenie
Assembler
FAQ
(X)HTML
CSS
JavaScript
Z pogranicza
Algorytmy
WIĘCEJ »
Delphi a Internet
Tak, tak, o Internecie była mowa już w rozdziale 11., lecz wówczas podjąłem jedynie temat programowania
sieciowego z użyciem różnych protokołów internetowych. Tym razem sprawa wygląda nieco inaczej, bowiem
mowa będzie o internetowych zastosowaniach Delphi.
W dziedzinie informatyki postęp jest nieunikniony. Powstają nowe usługi, a języki programowania wciąż są
rozwijane. Firma Borland postanowiła udoskonalić swój produkt w zakresie internetowych zastosowań,
umożliwiając użytkownikom tworzenie programów działających w sieci Internet, tzw. weplikacji (zlepek słów
Web Application). Tworzenie aplikacji internetowych nie jest nowością wprowadzoną dopiero w Delphi 7,
istniało już w poprzednich wersjach tego produktu. Owe technologie umożliwiają tworzenie dynamicznych
stron WWW, nie wymagając od użytkownika znajomości języka HTML, nie mówiąc już o językach
programowania takich jak PHP, CGI, Java czy JavaScript.
Delphi
C/C++
Turbo Pascal
Assembler
PHP
Programy
Dokumentacja
Kursy
Komponenty
WIĘCEJ »
Spis treści
1 Z czego będziemy korzystali?
1.1 Serwer Personal Web Server
2 CGI, ISAPI, NSAPI
3 Tworzenie rozszerzeń serwera
4 Akcje serwera
5 Uruchamianie biblioteki
6 Kod źródłowy biblioteki ISAPI
7 TWebRequest i TWebResponse
8 Wykorzystanie szablonów
8.1 Tworzenie nowego szablonu
8.2 Szablony dynamiczne
8.2.1 Zdarzenie OnHTMLTag
8.3 Przykładowy program
8.4 Dodatkowe parametry
9 Wysyłanie i odbieranie cookies
9.1 Ustawianie pliku cookies
9.2 Odczyt cookies
10 Wysyłanie strumieni
11 Korzystanie z baz danych
12 WebSnap
13 Podsumowanie
W tym rozdziale:
poznasz znaczenie terminów ISAPI, NSAPI i CGI;
dowiesz się, w jaki sposób można tworzyć dynamiczne serwisy WWW;
nasze przykłady będą opierać się o tworzenie aplikacji z wykorzystaniem technologii ISAPI.
Z czego będziemy korzystali?
Do zrealizowania niektórzy zadań będziemy potrzebować serwera WWW obsługującego standard ISAPI . Co
prawda niektóre technologie w Delphi udostępniają własny serwer na potrzeby działania aplikacji, lecz chcąc
zaprezentować w pełni działanie programów, będę potrzebował prawdziwego serwera. Ze względu na łatwość
obsługi i dostępność na potrzeby tego rozdziału wybrałem serwer firmy Microsoft Personal Web Server, ale Ty
możesz skorzystać z dowolnego serwera obsługującego standard ISAPI np. IIS lub Apache.
Serwer Personal Web Server
Program Personal Web Serwer (PWS) jest dostarczany wraz z systemem operacyjnym Windows. W moim
przypadku (Windows 98) jest dostępny na płycie CD-ROM w katalogu add-one. Jego instalacja jest prosta -
wystarczy postępować zgodnie ze wskazówkami wyświetlanymi na ekranie. Po instalacji na pulpicie zostanie
utworzony skrót do owego serwera, a na dysku C: katalog Inetpub .
Program w trakcie działania przedstawiony jest na rysunku 18.1.
1 z 13
2009-03-14 15:54
77982421.008.png 77982421.009.png 77982421.010.png 77982421.011.png 77982421.001.png 77982421.002.png 77982421.003.png
Delphi :: Kompendium :: Rozdział 18 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_18
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.8991 sek. (zapytań SQL:
12)
Rysunek 18.1. Program Personal Web Server
Właściwe uruchomienie serwera nastąpi po naciśnięciu przycisku Uruchom . Od tego momentu po wpisaniu w
przeglądarce internetowej adresu http://127.0.0.1 wczytana zostanie strona z naszego serwera.
Program Personal Web Server można także pobrać z Internetu ? wystarczy skorzystać z jakieś popularnej
wyszukiwarki, np. www.google.pl.
CGI, ISAPI, NSAPI
Świat Internetu jest pełen niezrozumiałych pojęć, jak chociażby CGI czy ISAPI. Za chwilę postaram się
objaśnić, o co właściwie w tym wszystkim chodzi.
Kiedy powstał Internet, a wraz z nim strony WWW, ich wyświetlanie ograniczało się jedynie do statycznej
prezentacji obrazu lub tekstu (czyli stron zapisanych w języku HTML ? ang. HyperText Markup Language ). Z
czasem, wobec wciąż powiększającej się ?pajęczyny? stron WWW, statyczne strony przestały wystarczać.
Serwisy stawały się coraz bardziej rozbudowane, a każda np. grafika wymagała dokonania modyfikacji w
każdej podstronie. Zaczęto szukać rozwiązania polegającego na tworzeniu dynamicznych stron WWW, czyli
takich, których wygląd zależy od określonej czynności. Pierwszą specyfikacją tego typu było CGI (ang.
Common Gataway Interface ), które umożliwiało zapisywanie specjalnych skryptów (programów CGI), które
generowały dynamiczne strony WWW. Obecnie skrypty CGI są pisanie przeważnie w języku Perl, który jest
zwykłym językiem programowania ? dzięki niemu można w łatwy sposób stworzyć księgę gości, system
nowości oraz inne elementy interaktywnych stron WWW.
W tamtym okresie na rynku serwerów WWW dominowały dwie firmy ? Microsoft oraz Netscape. Obie doceniły
znaczenie tworzenia dynamicznych stron WWW i utworzyły podobne do siebie standardy ? ISAPI (Microsoft)
oraz NSAPI (Netscape). Zarówno ISAPI, jak i NSAPI to w rzeczywistości biblioteki DLL, umożliwiające
dynamiczne generowanie stron internetowych; nazywane są często rozszerzeniami serwerów WWW. Większą
popularność zyskała technologia ISAPI i to przede wszystkim nią zajmiemy się w tym rozdziale. Jednak ISAPI
potrzebuje do działania serwera WWW ? stąd potrzebny nam był chociażby najprostszy serwer, jakim jest
Personal Web Server.
Obecnie dominującą technologią tworzenia stron WWW jest PHP, lecz niektóre firmy (rzadziej prywatne osoby)
wciąż stosują ISAPI w celu zaprojektowania dynamicznych stron i dlatego zajmiemy się teraz ich tworzeniem.
W tym miejscu należy się jeszcze jedna, mała uwaga. W momencie wpisania w przeglądarce np. adresu
http://127.0.0.1/SCRIPTS/ISAPI.dll załadowana zostanie biblioteka DLL, która (niestety) będzie przebywać w
przestrzeni adresowej serwera aż do jego zamknięcia. Inaczej mówiąc, Windows nie pozwoli na usunięcie
takiej biblioteki ani jej zmodyfikowanie przed zakończeniem pracy serwera. To rozwiązanie ma jednak zalety w
postaci większej wydajności, w przeciwieństwie do programów CGI, które muszą być uruchamiane za każdym
wywołaniem.
Nie wszystkie serwery stosują takie praktyki ? w niektórych istnieje możliwość podmiany pliku w trakcie
działania serwera.
Tworzenie rozszerzeń serwera
Tworzenie biblioteki ISAPI zaczynamy jak zwykle w Repozytorium (rysunek 18.2). Po zaznaczeniu ikony Web
Server Application i kliknięciu OK Delphi otworzy okno, w którym będziemy musieli wybrać rodzaj rozszerzenia
serwera WWW ? patrz rysunek 18.3.
2 z 13
2009-03-14 15:54
RSS | Forum | Pastebin |
Regulamin | Pomoc | Usuń
cookies | Prawa autorskie |
Kontakt | Reklama
77982421.004.png
Delphi :: Kompendium :: Rozdział 18 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_18
Rysunek 18.2. Repozytorium z zaznaczoną ikoną Web Server Application
Rysunek 18.3. Nowa aplikacja serwera
Pierwsze domyślnie zaznaczone pole to projekt biblioteki ISAPI lub NSAPI (tym się zajmiemy); kolejna opcja
służy do tworzenia rozszerzenia typu CGI, które przebiega bardzo podobnie. Kolejne dwie pozycje związane są z
tworzeniem modułów najpopularniejszego serwera WWW ? Apache. Mamy do wyboru tworzenie modułu do
wersji 1.x tego serwera lub do wersji 2.x.
Ostatnia pozycja związana jest z tworzeniem rozszerzenia wykorzystującego specjalny debuger, który stanowi
także serwer dla tworzonego projektu.
W poprzednich wersjach Delphi możliwe było także tworzenie aplikacji rozszerzeń Win-CGI
(Common Gataway Interface for Windows), lecz obecnie Borland wycofał się z tej strategii,
uznając ją za przestarzałą.
Korzystanie z ISAPI (Internet Server API) jest możliwe jedynie na platformie Windows.
Po wybraniu typu rozszerzenia Delphi utworzy formularz oparty o klasę TWebModule , która stanowi jedynie
?pojemnik? na umieszczane komponenty. W rzeczywistości nie pozwala na umieszczanie komponentów
wizualnych, gdyż nie ma to w tym wypadku najmniejszego sensu. Jedyne komponenty mogące znaleźć się na
formularzu to komponenty niewidoczne ? w szczególności komponenty z zakładki Internet oraz komponenty do
obsługi baz danych.
Akcje serwera
Klasa TWebModule implementuje system obsługi protokołu HTTP, jednak wykorzystanie ISAPI opiera się na tzw.
akcjach, w ramach których program wykonuje pewne zadania. Sama ?akcja? dołączana jest do adresu w
przeglądarce ? np.:
http://127.0.0.1/isapi.dll/test
W tym wypadku akcję stanowi fragment /test .
Tworzenie akcji odbywa się poprzez właściwość Action klasy TWebModule (rysunek 18.4).
Rysunek 18.4. Edytowanie akcji modułu aplikacji
3 z 13
2009-03-14 15:54
77982421.005.png
Delphi :: Kompendium :: Rozdział 18 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_18
Całość odbywa się za pośrednictwem okna WebModule.Actions (rysunek 18.4). Okno to podzielone jest na
poszczególne kolumny: PathInfo jest właśnie fragmentem wstawianym na koniec adresu i identyfikującym
daną akcję. Pierwsza kolumna ? Name ? określa nazwę.
Utworzenie nowej akcji odbywa się poprzez naciśnięcie pierwszego przycisku z lewej lub naciśnięciu klawisza
Insert . Kod źródłowy, który ma zostać wykonany w wyniku wywołania takiego adresu, generowany jest za
pośrednictwem zdarzenia OnAction :
procedure TWebModule1. WebModule1WebActionItem1Action ( Sender: TObject ;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean ) ;
begin
end ;
Informacja zwrotna musi zostać zawarta w parametrze Response typu TWebResponse . W parametrze k zawarte
są informacje na temat żądania HTTP, co niesie ze sobą ciekawe informacje, jak nazwa protokołu i inne
nagłówki HTTP. W naszym przykładzie kod całego modułu prezentuje się tak, jak w listingu 18.1.
Listing 18.1. Kod źródłowy modułu
unit MainFrm;
interface
uses
SysUtils, Classes, HTTPApp;
type
TWebModule1 = class ( TWebModule )
procedure WebModule1WebActionItem1Action ( Sender: TObject ;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean ) ;
private
{ Private declarations }
public
{ Public declarations }
end ;
var
WebModule1: TWebModule1;
implementation
{$R *.dfm}
procedure TWebModule1. WebModule1WebActionItem1Action ( Sender: TObject ;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean ) ;
var
HTML : String ;
begin
HTML := '<html>' +
'<head>' +
'<title>Przykład wykorzystania ISAPI</title>' +
'</head>' +
'<body>' +
'<h1>Witaj, użytkowniku!</h1>' +
'<hr>' +
'<i>Copyright (c) 2003 by Adam Boduch</i>' +
'</body>' +
'</html>' ;
Response. Content := HTML;
end ;
end .
Na samym początku następuje formułowanie zawartości strony WWW zwracanej w wyniku wywołania biblioteki.
Kod HTML przypisywany jest do zmiennej HTML; zwracanie zawartości tej zmiennej następuje w momencie
przypisania jej do właściwości Content parametru Response .
Uruchamianie biblioteki
Jako że nasza biblioteka nie może działać samodzielnie, należy umieścić ją w odpowiednim katalogu serwera.
Zbuduj więc bibliotekę ( Project/Build ), w wyniku czego w katalogu z projektem utworzony zostanie plik
Isapi1.dll (w moim przypadku). Ów plik należy umieścić gdzieś w katalogu serwera ? niech będzie to
C:\Inetpub\scripts . Następnie uruchom przeglądarkę WWW i wpisz następujący adres: http://127.0.0.1/scripts
/isapi1.dll/default.
Rezultat działania takiej biblioteki przedstawiony jest na rysunku 18.5.
4 z 13
2009-03-14 15:54
77982421.006.png
Delphi :: Kompendium :: Rozdział 18 - 4programmers.net http://4programmers.net/Delphi/Kompendium/Rozdzia%C5%82_18
Rysunek 18.5. Rezultat działania biblioteki ISAPI
Nie zapominaj o ?doklejeniu? na końcu adresu WWW fragmentu /default.
Kod źródłowy biblioteki ISAPI
Spójrz na kod źródłowy głównego projektu *.dpr biblioteki ( Project/View Source ):
library isapi1;
uses
ActiveX,
ComObj,
WebBroker,
ISAPIThreadPool,
ISAPIApp,
MainFrm in 'MainFrm.pas' {WebModule1: TWebModule} ;
{$R *.res}
exports
GetExtensionVersion,
HttpExtensionProc,
TerminateExtension;
begin
CoInitFlags := COINIT_MULTITHREADED;
Application. Initialize ;
Application. CreateForm ( TWebModule1, WebModule1 ) ;
Application. Run ;
end .
Na pierwszy rzut oka główny plik *.dpr jest bardzo podobny do głównego pliku zwykłej aplikacji VCL. Zwróć
uwagę na trzy procedury eksportowane przez naszą bibliotekę ( GetExtensionVersion , HttpExtensionProc ,
TerminateExtension ). Pierwsza z nich zwraca serwerowi numer wersji rozszerzenia; kolejne polecenie
eksportuje rozszerzenia związane z obsługą protokołu HTTP. Ostatnia procedura jest związana z prawidłową
obsługą procesu zakończenia działania programu i zwolnienia biblioteki.
TWebRequest i TWebResponse
Obie klasy organizują komunikację pomiędzy serwerem WWW a rozszerzeniem, czyli biblioteką DLL. W
parametrze Request znajdują się żądania klienta, czyli także nagłówki HTTP, natomiast Response określa
zwracane przez bibliotekę wartości.
Klasa TWebRequest , a konkretnie jej właściwości, dostarczają wielu ciekawych informacji na temat naszego
rozszerzenia oraz na temat użytkownika ? np. dane o przeglądarce (nazwa i wersja), systemie operacyjnym,
metodzie wywołania strony, adresie itp. Najciekawsze informacje zgromadziłem w tabeli 18.1.
Tabela 18.1. Właściwości klasy TWebRequest
Nazwa Opis
Method Metoda wywołania strony (GET, POST)
ProtocolVersion Wersja protokołu HTTP
UserAgent Używana przeglądarka
URL Adres wywoływanego programu w katalogu serwera
ServerPort Numer portu serwera
ScriptName Nazwa wywoływanego skryptu (np. /skrpty/isapi.dll)
RemoteAddr Adres IP użytkownika korzystającego z programu
RemoteHost Nazwa hosta użytkownika (np. ppp.tpnet.pl).
Referer
Strona, z której użytkownik trafił na nasz program
Query
Dodatkowe parametry przekazane wraz z programem (np. imie=adam&
nazwisko=boduch)
5 z 13
2009-03-14 15:54
77982421.007.png
Zgłoś jeśli naruszono regulamin