
- •Завдання дій, оброблювальних запитів клієнта
- •Компіляція і тестування створеного додатка
- •Компоненти для формування відповіді у форматі html
- •Компонент tPageProducer
- •Компоненти для роботи з базами даних
- •Компонент tDatasetPageProducer
- •Компонент tDataSetTableProducer
- •Компоненти Indy
- •Приклад створення простого веб-сервера
- •Приклад клієнтського додатку
Компоненти для роботи з базами даних
Інформацію, опубліковану в Web, часто зручно зберігати в базах даних. Крім того, як уже зазначалося, іноді при роботі з базами даних в якості клієнтського додатку використовується веб-браузер. В обох випадках потрібно організувати вивід збереженої в базі даних інформації в HTML-документ. Для спрощення вирішення такого завдання в VCL Delphi 7 є ряд компонентів, спеціально призначених для генерації HTML-документів на основі інформації, що витягується з бази даних. Таких компонентів три: TDatasetPageProducer, TPatasetTabLeProducer і TQueryTabLeProducer.
Розглянемо кожен з них.
Компонент tDatasetPageProducer
Компонент TDatasetPageProducer має єдину відмінність від компонента TPageProducer. Воно полягає в тому, що з TDatasetPageProducer можна зв'язати набір даних за допомогою властивості DataSet. При обробці шаблону теги, імена яких збігаються з іменами полів набору даних, замінюються значеннями цих полів з поточного запису.
Таким чином, використовуючи цей компонент, можна дуже просто створювати HTML-документи, що містять інформацію, що зберігається в базі даних.
ПРИМІТКА------------------------------------------------------------------------------------------
Для використання компонента TDatasetPageProducer необхідно, щоб імена полів таблиці бази даних складалися лише з латинських літер і не містили пропусків.
Компонент tDataSetTableProducer
Компонент TDataSetTableProducer призначений для виведення у вікні веб-браузера інформації, що міститься в базі даних. Інформація представляється в табличній формі. Це свого роду генератор табличних звітів для публікації в Web. Перелічимо основні властивості компонента TDataSetTableProducer.
property DataSet: TDataSet - набір даних, на основі якого буде формуватися виведена таблиця.
property Dispatcher: TCustomWebDispatcher - компонент-диспетчер, виконує обробку HTTP-запитів. Зазвичай значення цієї властивості встановлюється автоматично - в ньому вказується ім'я компонента TWebModule, на формі якого розташовується TDataSetTableProducer.
property Caption: String - заголовок генерується HTML-документа.
property Caption Alignment: THTML CaptionAlignment - місце розташування заголовка. Може приймати наступні значення:
саDefault - місце розташування заголовка визначається веб-браузером;
саТор - заголовок розташовується над HTML-таблицею;
caBottom - заголовок розміщується під HTML-таблицею.
property Header: TStrings - текст, наявний перед таблицею.
property Footer: TStrings - текст, що виводиться після таблиці.
property Columns: THTMLTableColumns - поля, що включаються у формовану таблицю, а також атрибути відображення полів у таблиці. Для установки цієї властивості використовується спеціальний редактор, що відкривається при клацанні на кнопці з трьома крапками в полі введення властивості Columns вікна інспектора об'єктів або при подвійному натисканні на значку компонента TDataSetTableProducer, розміщеного на формі.
property MaxRows: Integer - максимальна кількість рядків (записів), що виводяться в таблиці.
property TableAttributes: THTML TableAttributes - атрибути відображення таблиці. Клас THTMLTableAttributes має наступні властивості:
property Align: THTML Align - спосіб вирівнювання таблиці щодо вікна браузера (доступні значення: haDefault - спосіб вирівнювання визначається браузером, haLeft - вирівнювання по лівому краю, haRight - вирівнювання по правому краю, haCenter - вирівнювання по центру);
property BgColor: ТНТМLBgColor - колір фону таблиці (доступні значення: Aqua, Black, Blue, Fuchsia, Gray, Green, Lime, Maroon, Navy, Olive, Purple, Red, Silver, Teal, White, Yellow);
property Border: Integer - товщина ліній в пікселях, які поділяють комірки таблиці (якщо задано значення -1, то лінії не відображаються);
property CellPadding: Integer - відстань між осередками таблиці в пікселях (якщо задано значення -1, то відстань визначається веб-браузером);
property CellSpacing: Integer - відстань від тексту до межі осередку в пікселях (якщо задано значення -1, то відстань визначається веб-браузером);
property Width: Integer - ширина таблиці у відсотках від ширини вікна браузера.
property RowAttributes: THTML TableRowAttributes - атрибути відображення рядків у таблиці. Клас THTML TableRowAttributes має чотири властивості, два з яких, Align і BgColor, повністю аналогічні відповідним властивостям класу THTML TableAttributes. Інші дві властивості:
property VAlign: THTML VAlign - вертикальне вирівнювання тексту в комірці таблиці (доступні значення: haVDefault - вирівнювання визначається браузером, haTop - вирівнювання по верхній межі осередку, haMiddle - вирівнювання по центру осередка, haBottom - вирівнювання по нижній межі комірки);
property Custom: String - додаткові атрибути виведення рядка. Розглянемо приклад виведення інформації з таблиці бази даних у вигляді HTML-таблиці. Виведемо дані з таблиці Фізичні особи бази даних sales.
Створіть новий веб-додаток.
Помістіть на форму TWebModule два компоненти: Таble і TDataSetTableProducer. За замовчуванням їм будуть присвоєні імена Tablel і DataSetTableProducerl.
Виконайте підключення компонента Tablel до таблиці Фізичні особи бази даних sales.
Встановіть властивість DataSet компонента DataSetTableProducerl рівним Tablel.
Задайте властивості Caption компонента DataSetTableProducerl таке значення: <Н2> Список співробітників </ Н2>
Задайте властивості Header компонента DataSetTableProducerl таке значення: <Р> Текст, що розміщується перед виведенням НТМ1_-таблиці </ Р>
Задайте властивості Footer компонента DataSetTableProducerl таке значення: <Р> Текст. розташовуваний після виведення НТМ1_-таблиці </ Р>
Відкрийте вікно редактора стовпців HTML-таблиці. Для цього виконайте подвійне клацання на значку компонента DataSetTableProducerl або клацніть на кнопці з трьома крапками в полі введення властивості Columns цього компонента.
Редактор стовпців дозволяє задати поля таблиці бази даних, які слід включити в результуючу HTML-таблицю, і встановити атрибути відображення таблиці. Результати зміни відображаються в області попереднього перегляду, розташованої в нижній частині вікна редактора стовпців (мал. 20.4). При вказівці полів таблиці бази даних, що включаються в HTML-таблицю, зручно спочатку підключити всі поля, а потім видалити зайві.
Для включення всіх полів таблиці бази даних, пов'язаної з компонентом DataSetTableProducerl, клацніть на кнопці Add All Fields на панелі інструментів редактора стовпців. Потім залиште тільки ті поля, які вказані на рис. 20.4. Змініть значення властивості Border, зробивши його рівним 1 (в цьому випадку при виведенні будуть відображатися лінії таблиці).
Рис. 20.4. Редактор стовпців компонента TDataSetTableProducer
Відкрийте вікно редактора дій компонента WebModule і створіть нову дію. Властивість Pathïnfo дії можна не задавати, інші параметри також можна залишити заданими за умовчанням. Вставте наступний обробник події OnAction для створеної дії:
procedu re TWebModulе1.WebModu1е1WebAct i onItemlAct i on (
Sender: TObject: Request: TWebRequest:
Response: TWebResponse; var Handled: Boolean): begin
Response.Content: = DatasetTableProducerl.Content: end:
Для отримання інформації з бази даних необхідно спочатку відкрити набір даних, а по завершенні роботи закрити його. Ці операції зручно виконувати в обробниках подій OnCreate і OnDestroy компонента TWebModule. У першому з них слід відкрити набір даних Tablel, у другому - закрити його:
procedure TWebModulel.WebModuleCreate (Sender: TObject):
begin Tablel.Open; end;
procedure TWebModulel.WebModuleDestroyCSender: TObject);
begin Tablel.Close: end:
Залишилося тільки відкомпілювати веб-додаток, що виводить інформацію з таблиці бази даних у вигляді HTML-таблиці, змінити розширення отриманого файлу на cgi і перенести його в каталог Scripts.
Для тестування отриманого сценарію слід створити просту HTML-форму. У найбільш простому випадку досить форми, що містить одну кнопку SUBMIT:
<HTML>
<HEAD>
<TITLE> Приклад виводу HTML-таблиці </ TITLE>
</ HEAD>
<B0DY>
<F0RM METHOD="GET" ACTION="/scripts/test.cgi">
<INPUT TYPE="SUBMIT">
</ F0RM>
</ B0DY>
</ HTML>
Результат виконання розробленого сценарію наведено на рис. 20.5.
Компонент TDatasetTableProducer може обробляти декілька подій, найбільший інтерес з яких представляють два.
type TCreateContentEvent = procedure (Sender: TObject; var Continue: Boolean) of object: property OnCreateContent: TCreateContentEvent:
Викликається перед початком генерації HTML-документа. Дозволяє заборонити генерацію документа, для чого параметру Continue слід присвоїти значення false. У обробнику цієї події можна, наприклад, перевіряти, чи відкритий набір даних, на основі якого створюється HTML-таблиця.
Рис. 20.5. Приклад висновку інформації з таблиці бази даних у вікні браузера.
THTMLFormatCel1 Event = procedure (Sender: TObject.
CellRow. CellColumn: Integer; var BgColor THTMLBgColor: var Align: THTMLAlign; var VAlign: THTMLVAlign; var CustomAttrs, Cel 1 Data: string) of object: property OnFormatCel1: THTMLFormatCel1 Event;
Викликається перед формуванням кожної комірки HTML-таблиці. Параметр CellData містить значення, яке буде поміщено в клітинку. Даний параметр можна змінювати в тексті процедури-обробника.
Шляхом обробки події OnFormatCell можна поліпшити зовнішній вигляд одержуваної таблиці. Наприклад, задавши для цієї події обробник наступного виду, ми отримаємо таблицю, колір фону рядків якої чергується: непарні рядки будуть відображатися на світло-сірому фоні, парні - на білому (рис. 20.6);
procedure TWebModulel.OataSetTableProducerlFormatCel1(
Sender: TObject: CellRow. CellColumn: Integer: var BgColor: THTMLBgColor; var Align: THTMLAlign: var VAlign: THTMLVAlign; var CustomAttrs.
CellData: String); begin if Odd(CellRow) then BgColor:='Silver' else BgColor:='': end:
Рис. 20.6. Приклад зміни зовнішнього виду таблиці шляхом обробки події OnFormatCell.
Компонент TQueryTableProducer має тільки одну істотну відмінність від компонента TDataSetTableProducer: він може зв'язуватися тільки з набором даних TQuery і дозволяє настроювати параметри заданого SQL-запиту у відповідності з отриманого з його допомогою рядком параметрів. За допомогою даного компонента можна надати користувачеві можливість задавати критерії вибірки даних, на основі яких буде формуватися HTML-таблиця.
На основі попереднього CGI-додатки розробимо сценарій, що виводить список тільки тих співробітників, які проживають у місті, вказаному користувачем.
Замініть у попередньому додатку компонент Таble компонентом TQuery, а компонент TDatasetTableProducer - компонентом TQueryTableProducer. Настрій-ка властивостей компонента TQueryTableProducer виконується точно так само, як і властивостей компонента TDatasetTableProducer, за винятком того, що набір даних підключається через властивість Query.
ПРИМІТКА-----------------------------------------------------------------------------------------------------------------
У властивості Query компонента TQueryTableProducer можна посилатися лише на компонентТОіегу. З наборами даних TADOQuery і TIBQuery. Компонент TQueryTableProducer не взаємодіє.
Оскільки ми змінили компонент, що генерує HTML-код, то слід внести зміни в обробник події OnAction дії, заданого в TWebModule. Крім того, необхідно внести зміни в оброблювачі подій OnCreate і On Destroy компонента TWebModule (так як ми використовуємо інший компонент набору даних):
procedure TWebModul el.WebModulelWebActionltemlAction(
Sender: TObject: Request: TWebRequest:
Response: TWebResponse: var Handled: Boolean);begin
Response. Content: =' <HEAD><TITLE>' +
‘Приклад використання TQueryTableProducer'+
'</TITLE></HEAD>'+QueryTableProducerl.Content: end;
procedure TWebModulel.WebModuleCreate(Sender: TObject):
begin Tablel.Open;
Query1.Open; end;
procedure TWebModulel.WebModuleDestroy(Sender: TObject);
begin Tablel.Close;
Query1.Close; end;
У властивості SQL задайте наступний запит:
SELECT *
FROM [Фізичні особи]
WHERE (Місто=:City)
Якщо тепер на HTML-формі, з якої здійснюється виклик CGI-додатки, розмістити текстове поле з ім'ям City, то дані, введені в це поле, будуть передаватися в SQL-запит. Відповідно, в таблицю будуть включатися лише ті записи, в яких значення, що міститься в полі Місто, виявиться рівним значенню, заданому користувачем у текстовому полі. Тому слід змінити код HTML-форми, з якої виконується виклик сценарію, додавши елемент управління TEXT з ім'ям CITY:
<HTML>
<HEAD>
<TITLE> Приклад вводу HTML-таблиці </TITLE>
</HEAD>
<B0DY>
<F0RM METHOD*"POST" ACTION=”/scripts/test.cgi"> ropOfl: <INPUT TYPE="TEXT” NAME-"CITY"><BR><BR>
<INPUT TYPE="SUBMIT">
</F0RM>
</B0DY>
</HTML>
Вид форми, з якої виконується запуск сценарію, наведено на рис. 20.7(а), а результат виконання сценарію - на рис. 20.7(б).
20.7(а).
20.7(б).
Рис. 20.7. HTML-форма, яка використовує компонент TQuery Table Producer, і результат.