
- •Завдання дій, оброблювальних запитів клієнта
- •Компіляція і тестування створеного додатка
- •Компоненти для формування відповіді у форматі html
- •Компонент tPageProducer
- •Компоненти для роботи з базами даних
- •Компонент tDatasetPageProducer
- •Компонент tDataSetTableProducer
- •Компоненти Indy
- •Приклад створення простого веб-сервера
- •Приклад клієнтського додатку
Компіляція і тестування створеного додатка
Для компіляції проекту виберіть в меню IDE Delphi команду Project ► Compile (або натисніть клавіші Ctrl + F9). Якщо в тексті програми не міститься помилок, то проект буде відкомпільований і в результаті компіляції створений виконаний файл, що має розширення ехе. Змініть розширення на cgi і перепишіть файл в каталог Scripts.
Для перевірки розробленого сценарію необхідно підготувати HTML-документ, з якого буде проводитися виклик сценарію. Документ повинен містити форму з двома полями для введення імені та пароля. Так як створений додаток може обробляти дані, передані як методом GET, так і методом POST, то має сенс включити в документ дві форми, одна з яких буде виковати метод GET, друга - POST. Вихідний HTML-код такого документа міг би виглядати приблизно так:
<HTML>
<HEAD>
<TITLE> Приклад CGI-програми </ TITLE>
</ HEAD>
<B0DY>
<H2> Метод GET </ H2>
<F0RM METHOD="GET" ACTION="/scripts/test.cgi/validate">
Введіть HMfl: <INPUT TYPE="TEXT'' NAME="login''> <BR>
Введіть пароль: <INPUT TYPE =
"PASSWORD" NAME = "password"> <BR> <BR> сINPUT TYPE = "SUBMIT">
</ F0RM>
<BR> <BR>
<H2> Метод POST </ H2>
<F0RM METH0D="P0ST" ACTION=''/scripts/test.cgi/validate">
Введіть HMR: <INPUT TYPE="TEXT" NAME="login"> <BR>
Введіть пароль: <INPUT TYPE =
"PASSWORD" NAME = "password"> <BR> <BR> <INPUT TYPE="SUBMIT">
</ F0RM>
</ B0DY>
</ HTHL>
Файлу, що містить наведений код, надайте ім'я default.htm і помістіть його в каталог wwwroot. Після цього можна запустити веб-браузер і перевірити працездатність CGI-додатка.
Як видно з розглянутого прикладу, компонент TWebModule значно полегшує інтерпретацію даних, отриманих від користувача. Однак формувати відповідь доводиться вручну, задаючи рядок ResponseContent у форматі HTML. Якщо потрібно видавати складний відповідь (хоча б для того, щоб результат виконання сценарію естетично виглядав у вікні веб-браузера), то такий підхід не дуже зручний. Тому в Delphi є спеціальні компоненти, що спрощують формування складних HTML-документів.
Компоненти для формування відповіді у форматі html
Компоненти для формування HTML-документів розташовуються на сторінці Internet палітри компонентів IDE Delphi 7. Умовно їх можна розділити на дві групи:
Компоненти для генерування HTML-документа на основі даних, що зберігаються в базі даних;
Компоненти для генерування HTML-документів без використання баз даних.
Першу групу ми розглянемо трохи пізніше, а поки познайомимося з єдиним компонентом, що належать до другої групи.
Компонент tPageProducer
Компонент TPageProducer - це найпростіший компонент для генерації HTML-документа на основі деякого заданого шаблону. Шаблон задається за допомогою наступних властивостей:
property HTMLDoc: TStrings - містить код шаблону HTML-документа;
property HTMLFile: TFileName - задає ім'я файлу, в якому міститься шаблон HTML-документа.
Зазначені властивості є взаємовиключними, тому можна задати тільки одне з них.
Компонент TPageProducer обробляє документ за допомогою методу Content:
function Content: string: override:
Цей метод виконує обробку шаблону і повертає результат обробки у вигляді HTML-документа.
Шаблон являє собою звичайний HTML-документ, в який, крім звичайних HTML-тегів, можуть включатися спеціальні теги, які мають наступний формат:
<# Паші paraml = va1uel param2 = value2 ...>
Коли при обробці шаблону TPageProducer зустрічається з такими тегами, метушні ¬ кає подія OnHTMLTag (єдина подія TPageProducer). У обробнику цієї події можна визначити, який тег обробляється і чим його слід замінити.
Обробник події OnHTMLTag має наступний формат:
type
TTag - (tgCustom. tgLink, tglmage, tgTable. TglmageMap,
tgObject, tgEmbed):
THTMLTagEvent - procedure (Sender: TObject: Tag: TTag: const
TagString: string: TagParams: TStrings: var ReplaceText:
string) of object;
Тут параметр Tag визначає тип теги і може приймати одне з семи значень, залежно від імені теги:
tgLink - тег LINK (гіпертекстове посилання);
tglmage - тег IMAGE (зображення);
tgTable - тег TABLE (таблиця);
tglmageMap - тег IMAGEMAP (зображення з областями спрацьовування);
tgObject - тег OBJECT (об'єкт ActiveX);
tgEmbed - тег EMBED (вбудовувана бібліотека);
tgCustom - тег, який визначається користувачем (ім'я цього тегу не збігається з жодним із зумовлених).
Ім'я теги міститься в аргументі TagString. Параметри теги передаються через аргумент TagParams у вигляді рядків виду ім'я = значення. Через аргумент ReplaceText повертається рядок, на яку повинен бути замінений оброблюваний тег. Модифікуємо попередній приклад, використовуючи компонент TPageProducer. У відповіді додатково виведемо інформацію про IP-адресу клієнта, що послав запит, а також відобразимо ім'я, яке ввів користувач. Для цього буде потрібно внести в проект деякі зміни.
Помістіть на форму компонента TWebModule компонент TPageProducer.
У властивості HTMLDoc компонента TPageProducer задайте наступний шаблон:
<HTHL>
<HEAD>
<TITLE> Результат перевірки </ TITLE>
</ HEAD>
<B0DY>
<H3 ALIGN=LEFT> <# RESULT> </ H3>
<Р> Адреса: <# H0ST> </ P>
<Р> Ім'я: <# NAME> </ P>
</ B0DY>
</ HTML>
У розділі private опису класу TWebModulel задають дві рядкові змін-ні: ResultStr і LoginStr.
Змініть обробник події OnAction і задайте обробник події On HTMLTag так, як показано в наведеному нижче коді:
unit test_unit: i interface uses
Windows. Messages. SysUtils. Classes. HTTPApp; type
TWebModulel = class (TWebModule)
PageProducerl: TPageProducer: procedure
WebModulelWebActionItemlAction (
Sender: TObject: Request: TWebRequest:
Response: TWebResponse: var Handled: Boolean):
procedure PageProducerlHTMLTag (Sender: TObject:
Tag: TTag; const TagString:
String: TagParams: TStrings: var
ReplaceText: String): private
{Private declarations}
ResultStr: string:
LoginStr: string: public
{Public declarations} end:
Var
WebModulel: TWebModulel; implementation {$ R *. DFM}
procedure TWebModulel.WebModulelWebActionItemlAction (
Sender: TObject; Request: TWebRequest:
Response: TWebResponse: var Handled: Boolean); const
login: String = ■ 'test';
password: String = '123 ':
var
validate: Boolean; begin validate: = false: if
Request.Method * 'GET' then begin
Logi nStr: = Request.QueryF i elds.Va1ues ['1 ogi n'];
validate; = (LoginStr = login) and (Request.QueryFi
elds.Values ['password'] = password):
end:
if Request.Method = 'POST' then begin
Logi nStr: = Request.ContentFi elds.Values ['1 ogi n '];
validate: = (LoginStr = login) and (Request. ContentFi el ds.
Val ues [' password '> password):
end:
if validate
then Ре5і ^ 5 ^: = 'Ім'я / пароль введені правильно' else
Резіі5 ^: = 'Ім'я / пароль введені невірно';
Response.Content: = PageProducerl.Content: end;
procedure TWebModulel.PageProducerlHTMLTag (
Sender: TObject; Tag: TTag; const TagString: String;
TagParams: TStrings; var ReplaceText: String): begi n
if TagString = 'RESULT' then ReplaceText: = ResultStr: if
TagString = 'HOST' then ReplaceText: = (Sender as
TCustomContentProducer). Di spatcher.Request.RemoteHost: if
TagString = 'NAME' then ReplaceText: = LoginStr: end;
end.
Щоб перевірити отриманий додаток, немає необхідності вносити зміни в код HTML-документа, з якого здійснюється виклик сценарію.
ПРИМІТКА------------------------------------------------------------------------------------------------------------
Наведений приклад досить простий, тому з його допомогою важко оцінити достоїнства компонента TPageProducer. Тим не менш, він дає уявлення про особливості використання цього компонента та інтерпретації керуючих тегів.