Створення Web-додатків за допомогою C + + Builder 5

Дана стаття присвячена однієї із непогано зарекомендували себе технологій створення динамічних інтерактивних Web-сайтів – розробці CGI-і ISAPI-додатків. Будучи далеко не єдиною технологією створення таких Web-сайтів, вона тим не менше залишається досить популярною. У даній статті ми розглянемо приклади створення CGI-і ISAPI-додатків, що виконуються під управлінням Microsoft Internet Information Services, за допомогою C + + Builder 5. Про інші способи створення динамічних Web-сайтів, наприклад розробці ASP-додатків, ви можете прочитати в статті Сергія Трепаліна «Створення серверних компонентів для ASP-додатків »на цьому ж CD-ROM.


Web-додатки (звані також скриптами) представляють собою виконувані файли або бібліотеки, що виконуються під управлінням Web-сервера. Їх призначення – у відповідь на запити користувача динамічно генерувати HTML-сторінки, які будуть інтерпретуватися Web-браузером.


Застосування Інтернету в широкому сенсі означає доступ до ресурсів, що містяться в Мережі. Будь-який ресурс Інтернету однозначно ідентифікується за допомогою адреси URL (Uniform Resource Locators), який можна ввести у відповідному полі браузера або вибрати, клацнувши мишею на гіпертекстове посилання Web-сторінки або іншого документа. Прикладами Інтернет-ресурсів є HTML-сторінки, документи різних форматів, Java-аплети, елементи управління ActiveX та інші файли. Результат виконання будь-якої програми, керованого Web-сервером, також є ресурсом Інтернету, і якщо налаштування рівня безпеки браузера дозволяють використовувати цей ресурс, він також буде інтерпретований браузером. Відзначимо, що додатки, що виконуються під управлінням Web-серверів і є джерелом подібних ресурсів, здатні обробляти параметри, що містяться в запиті користувача, і результат їхньої роботи може залежати від цих параметрів.


Створити Web-додаток, динамічно генерує подібні ресурси (зазвичай HTML-документи), можна за допомогою практично будь-якого засобу розробки – лише б воно дозволяло створювати додатки для тієї операційної системи, в якій працює Web-сервер. Однак якщо ви хочете знизити трудовитрати, пов'язані зі створенням таких додатків, то має сенс звернути увагу на засоби розробки, що дозволяють їх мінімізувати. З цієї точки зору досить вдалим вибором є Borland Delphi 5 і Borland C + + Builder 5 (редакції Enterprise і Professional), а також Delphi 4 і C + + Builder 4 Enterprise, так як ці засоби розробки містять непогані візуальні інструменти і компоненти для створення подібних програм.


Розглянуті в цій статті приклади або їх аналоги, якщо це не обумовлено, можна створювати за допомогою будь-якого з перерахованих вище засобів розробки. Самі приклади створені за допомогою C + + Builder 5 Enterprise, але, думаю, користувачам Delphi не складе особливих труднощів перенести їх код на Object Pascal.


Вивчення розробки Web-додатків ми почнемо зі створення найпростішого прикладу.


Найпростіше Web-додаток


Для створення найпростішого Web-додатки з головного меню середовища розробки C + + Builder виберемо пункт File / New і в репозитарії об'єктів виберемо піктограму Web Server Application.

Рис. 1. Вибір піктограми Web Server Application з репозитарія об'єктів


Далі потрібно вибрати тип програми (виконуваний файл CGI або Win-CGI або бібліотеку ISAPI / NSAPI DLL, що представляє собою функціональне розширення для Microsoft Internet Information Services або Netscape FastTrack). CGI-скрипт (CGI-Common Gateway Interface), будучи виконуваним файлом, запускається в окремому процесі, в той час як ISAPI / NSAPI DLL (бібліотеку – виконується в адресному просторі Web-сервера. Тому ISAPI / NSAPI DLL вимагають менше ресурсів, ніж CGI-скрипти. До того ж такі бібліотеки після завантаження залишаються в пам'яті сервера, що зменшує час їхню реакцію на подальші звернення до них. Однак це заважає їх відладці: після внесення до бібліотеки будь-яких змін необхідний перезапуск Web-сервера. У зв'язку з цим при розробці Web-додатків нерідко спочатку створюється CGI-скрипт, який потім відладжується, після чого на основі наявних модулів створюється ISAPI / NSAPI DLL. Так ми і поступимо: виберемо опцію CGI Stand-alone executable і створимо Win32-консольний додаток для генерації HTML-документів. У результаті отримаємо об'єкт TWebModule, що нагадує звичайний модуль даних.

Рис. 2. Об'єкт TWebModule


Розглянемо, як працює Web-додаток. Якщо Web-сервер отримує від браузера запит, відповідний специфікації CGI, він ініціює запуск CGI застосунків для його виконання. Якщо запит коректний, CGI-додаток обробляє його і генерує HTML-документ, який надсилається Web-сервером назад в браузер. Для обміну даними між браузером і сервером використовується протокол HTTP (HyperText Transfer Protocol).


Коли Web-додаток отримує HTTP-запит, воно створює об'єкт TWebRequest для подання запиту і об'єкт TWebResponce для подання відгуку, що відправляється в браузер користувача. Потім обидва об'єкти передаються об'єкту TWebModule.

Рис. 3. Структура Web-додатки


Об'єкт TWebModule містить набір об'єктів TWebActionItems, що зберігають інформацію про те, як обробляти різні запити користувачів. Пізнавши запит, він вибирає потрібний із них і виконує відповідний обробник події OnAction, обробляє запит і динамічно генерує відповідь, який передається Web-сервером в браузер користувача.


Для того щоб додаток був працездатним, створимо хоча б один об'єкт TWebActionItem, який реалізує відгук на запит. З цією метою з контекстного меню об'єкта TWebModule треба вибрати пункт Action Editor і натиснути кнопку Add у формі, що з'явилася. Далі можна встановити властивості PathInfo і Default об'єкта WebActionItem1. Перше властивість є частиною URL (Uniform Resource Locator) – повного опису доступу до ресурсу.

Рис. 4. Структура URL


Властивість Default вказує, чи виконується даний відгук, якщо параметр PathInfo у запиті залишився порожнім.

Рис. 5. Action Editor


Тепер створимо обробник події OnAction компонента TWebActionItem:

void __fastcall TWebModule1::WebModule1WebActionItem1Action(
TObject * Sender, TWebRequest * Request, TWebResponse * Response,
   bool &Handled)
{
AnsiString cont = AnsiString ("<HTML> <BODY> <H3> Hello! </ H3>");
   cont = cont + AnsiString(“<BR>”);
cont = cont + AnsiString ("<H2> Now is") + TimeToStr (Time ()) +
             AnsiString(”   </H2>”);
   cont = cont + AnsiString(“</BODY></HTML>”);
   Response->Content = cont;
}

У цьому обробнику події генерується містить поточний час HTML-сторінка приблизно наступного вигляду:

Рис. 6. Динамічно генерується HTML-сторінка


Зробимо одне невелике, але важливе зауваження. Перед компіляцією такого додатка в С + + Builder в опціях проекту слід відключити опцію Use dynamic RTL на сторінці Linker. Крім того, варто відключити і опцію Build with runtime packages на сторінці Packages або помістити всі ці бібліотеки в той же каталог, що й сам додаток.

Рис. 7. Діалогова панель Project Options


Справа в тому, що запустити такий додаток з командного рядка можна без проблем, при цьому воно звертається до RTL і «пакетів», що знаходиться за межами каталогів Web-сервера. Однак запустити його з допомогою Web-сервера швидше за все не вдасться – всі ці файли опиняться недоступні. У цьому випадку замість очікуваного результату виконання програми буде отримано повідомлення про помилку приблизно такого вигляду:


CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are: …


Відзначимо, що при створенні ISAPI DLL з використанням Delphi 4 або C + + Builder 4 в такій бібліотеці не повинно бути «пакетів» – вона обов'язково повинна складатися з одного файлу.


Після компіляції програми можна зберегти отриманий виконуваний файл в каталозі, призначеному для Web-додатків (у разі MS Internet Information Services за замовчуванням це каталог C: Inetpubscripts). Потім можна звернутися до додатка через Web-браузер, вказавши URL-додатки. Зверніть увагу: зовнішньому користувачеві, що звертається до створеного додатком через браузер, не видно (і не повинна бути видна) структура каталогів комп'ютера, що містить Web-сервер, – замість цього йому слід вводити їх псевдоніми. Такий підхід до використання каталогів Web-сервера необхідний для забезпечення безпеки – зовнішній користувач нічого не повинен знати про файли і каталогах комп'ютера, що містить Web-сервер, крім того що йому належить.


Запустивши додаток, можна натиснути кнопку Reload і переконатися, що текст в браузері змінюється. Це означає, що сторінка генерується динамічно.

Рис. 8. Динамічно генерується HTML-сторінка


З цього CGI-скрипта ми можемо створити ISAPI DLL. Для цього слід створити нове Web-додаток у вигляді ISAPI DLL, видалити з нього об'єкт TWebModule, а замість нього додати інший об'єкт TWebModule з попереднього проекту.


Створення форм і обробка користувача введення


Зазначимо, що об'єкт TWebModule істотно полегшує створення CGI-додатків, пов'язаних з обробкою користувальницького введення (наприклад, в HTML-формах), що полягає у зміні або додавання даних. Типовими прикладами таких додатків є анкети, які удосталь зустрічаються на багатьох Web-серверах. Доповнимо наш додаток такий анкетою.


Для відображення в браузері форми введення даних користувачем створимо ще один компонент TWebActionItem:

Рис. 9. Додавання об'єкта TWebActionItem для створення HTML-форми


Встановимо властивість Default новоствореного об'єкта TWebAction рівним True. Тепер додамо в WebModule1 компонент TPageProducer, призначення якого – генерувати HTML-документ на основі заздалегідь заданого шаблону.

Рис. 10. Додавання в WebModule1 компонента TPageProducer


Для створення шаблону документа можна скористатися будь-яким HTML-редактором, що підтримує створення форм, наприклад Microsoft FrontPage.

Рис. 11. Створення шаблону HTML-форми за допомогою Microsoft FrontPage


Оригінальний текст форми, представленої на рис., Має вигляд:

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html;
   charset=windows-1251″>
<meta name=”GENERATOR” content=”Microsoft FrontPage 2.0″>
<title>Untitled Normal Page</title></head>
<body bgcolor=”#FFFFFF”>
<p> </p>
<form method=”GET”>
<p>What is Your name?<font size=”4″>
<input type="text" size="20" name="T1"> </ font> </ p>
<p>What is Your e-mail?<font size=”4″>
<input type="text" size="20" name="T2"> </ font> </ p>
<p><font size=”4″><input type=”submit” name=”B1″
   value=”Submit”><input type=”reset” name=”B2″
   value=”Reset”></font></p>
</form>
</body>
</html>

Створений документ можна зберегти у вигляді файлу (і вказати його ім'я в якості властивості HTMLFile компонента TPageProducer). Можна також скопіювати HTML-текст в буфер обміну і помістити його в редактор властивості HTMLDoc цього компоненту.


Тепер створимо обробник події OnAction згенерованого нами компонента TWebActionItem2:

void __fastcall TWebModule1::WebModule1WebActionItem2Action(
TObject * Sender, TWebRequest * Request, TWebResponse * Response,
   bool &Handled)
{
   Response->Content=PageProducer1->Content();
}

Відзначимо, що в Delphi 5 і C + + Builder 5 компонент TWebAction має властивість Producer, що дозволяє безпосередньо вказати, яку саме HTML-сторінку потрібно генерувати при зверненні. Це у багатьох випадках позбавляє від необхідності створювати обробник події OnAction даного компонента.


Зберігши проект, можна знову звернутися до нього за допомогою браузера, вказавши значення PathInfo в URL:

Рис. 12. Тестування HTML-форми у браузері


Тепер залишилося обробити користувальницький введення, наприклад, динамічно згенерувавши сторінку з введеними користувачем значеннями. З цією метою додамо ще один компонент – TPageProducer: сторінки, яка містить результати обробки для користувача введення

Рис. 13. Додавання компонента PageProducer2 для генерації


Як значення властивості HTMLDoc новоствореного компонента PageProducer2 введемо наступний текст:

<html>
<head>
<title>Thank You!</title>
</head>
<body >
<p>Dear   <#T1>!</p>
<p> Thank you for completing this form. We have included your
e-mail address <# T2> in our mailing list. You will receive a
lot of spam from us!</p>
</body>
</html>

Даний текст являє собою шаблон документа. Він містить спеціальні теги, які замінюються в процесі формування HTML-сторінки рядками, які, у свою чергу, можуть бути введені користувачем у створену вище форму. У нашому випадку це теги <# T1> і <# T2>. Вони представляють собою імена полів введення в створеній раніше формі, у чому можна переконатися, переглянувши HTML-текст форми.


Для заміни спеціальних тегів слід створити обробник події OnHTMLTag компонента PageProducer2:

void __fastcall TWebModule1::PageProducer2HTMLTag(
   TObject *Sender, TTag Tag, const AnsiString TagString,
   TStrings *TagParams,   AnsiString &ReplaceText)
{
ReplaceText = Request-> QueryFields-> Values [TagString] +
      Request->ContentFields->Values[TagString];
}

Тут Request – об'єкт TWebRequest, згенерований додатком у результаті користувальницького запиту. У властивості QueryFields (об'єкт TStrings) цього об'єкта містяться імена параметрів і значення, введені користувачем, у вигляді Name = Value (реально вони містяться у змінній оточення QUERY_STRING, створеної Web-сервером, у вигляді Name1 = Value1 & Name2 = Value2 & …). Параметр TagString – рядок, що міститься в тегу, підметі заміні. Властивість Values об'єкта TStrings використовується, якщо рядки, що містяться у цьому об'єкті, представимо у вигляді Name = Value (що і відбувається в даному випадку).


Відзначимо, що якщо в тегу <form>, що міститься в тексті форми, замість методу GET вказаний метод POST, то замість властивості QueryFields слід використовувати властивість ContentField.


Тепер створимо ще один компонент TWebAction (із значенням властивості PathInfo, рівним / test3) для відображення сторінки, згенерованої за допомогою PageProducer2, і додамо ще один обробник події OnAction :

void __fastcall TWebModule1::WebModule1WebActionItem3Action(
TObject * Sender, TWebRequest * Request, TWebResponse * Response,
   bool &Handled)
{
   Response->Content=PageProducer2->Content();
}

Виникає питання: яким чином можна ініціювати генерацію цієї сторінки після натиснення користувачем кнопки Submit у формі введення? З цією метою слід описати реакцію на її натиснення в HTML-тексті форми, тобто відредагувати властивість HTMLDoc компонента PageProducer1:

<form method=”POST”
   action=”http://mywebserver/scripts/formproc.exe/t3″>

У пункті action вказується URL ресурсу, надаваного при натисканні кнопки Submit. У даному випадку це наш додаток зі значенням PathInfo, рівним / test3 (природно, ім'я Web-сервера, так само як і інші частини URL, може бути іншим).


Тепер можна знову скомпілювати і зберегти додаток. Звернувшись до нього за допомогою браузера і заповнивши форму, натиснемо на кнопку Submit. У результаті отримаємо сторінку, що згенерувала динамічно на основі введених у форму даних:

Рис. 14. Результат обробки для користувача введення


З цього CGI-скрипта, як і в попередньому випадку, можна створити ISAPI DLL.


Застосування баз даних в Web-додатках


Ми можемо створити код, що дозволяє додавати записи в яку-небудь таблицю, до створеного раніше обробник події WebModule1WebActionItem3Action (і таким чином дійсно отримати найпростіший список розсилки). Для цього необхідно додати деякі з компонентів доступу до даних у WebModule1 і встановити відповідні властивості:

Рис. 15. Об'єкт TWebModule з компонентами доступу до даних


Перепишемо створений раніше обробник події WebModule1WebActionItem3Action:

void __fastcall TWebModule1::WebModule1WebActionItem3Action(
   TObject *Sender, TWebRequest *Request,
   TWebResponse *Response, bool &Handled)
{
AnsiString CustName = Request-> QueryFields-> Values ["T1"] +
      Request->ContentFields->Values[“T1”];
AnsiString CustEmail = Request-> QueryFields-> Values ["T2"] +
      Request->ContentFields->Values[“T2”];
   Table1->Open();
   Table1->Append();
   Table1->FieldByName(“Name”)->Value=CustName;
   Table1->FieldByName(“E-mail”)->Value=CustEmail;
   Table1->Post();
   Table1->Close();
   Response->Content=PageProducer2->Content();
}

Тепер наш додаток зберігає користувальницький введення в таблиці бази даних. Щоб переконатися в цьому, можна скомпілювати, а потім протестувати програму.


Ми розглянули найпростіший приклад використання баз даних в Web-додатках. Але, як правило, потрібно публікація даних в Інтернеті і представлення їх в браузері. Для цієї мети використовуються компоненти TDataSetTableProducer і TQueryTableProducer, які отримують дані якого з компонентів TDataSet, або c допомогою запиту до бази даних і представляють їх у вигляді HTML-документа в табличному вигляді.


Для створення додатків, що здійснюють публікацію даних в Інтернеті, можна скористатися "майстром" DB Web Application Wizard зі сторінки Business репозитарія об'єктів.

Рис. 16. Вибір DB Web Application Wizard з репозитарія об'єктів


DB Web Application Wizard представляє собою послідовність діалогових панелей, в яких слід вибирати базу даних, таблицю і публікуються поля.

Рис. 17. Вибір полів таблиці або запиту, які відображаються в браузері


Після заповнення всіх форм ми отримаємо компонент TWebModule, в який входяткомпоненти TTable (або TQuery), TSession і TDataSetPageProducer. Цього достатньо для створення найпростішого програми для публікації даних. Виглядати воно буде приблизно так, як показано на рис.

Рис. 18. Найпростіше Web-додаток, що публікує дані в Інтернеті


Таблиця, обрана для цього прикладу (biolife.db з бази даних BCDEMOS), містить графічні поля. Розглянемо варіанти відображення їх у таблиці.


Один із способів вирішення цієї проблеми – створення в таблиці обчислюваного поля, що містить відповідний HTML-тег з посиланням на графічний файл, отриманий на основі зображення, витягнутого з відповідної запису. Саме так ми і зробимо. Крім того, необхідно враховувати, що кілька людей можуть звернутися до однієї і тієї ж таблиці з різними запитами одночасно, тому конкретний користувач не повинен бачити в своєму браузері зображення, які йому не призначені. Цього можна досягти, наприклад, присвоївши файлів із зображеннями унікальні імена. Оброблювач події OnCalcField для компонента Table1, який реалізує цей прийом, може виглядати, наприклад, так:

void __fastcall TWebModule1::Table1CalcFields(
   TDataSet *DataSet)
{
TDateTime DT = Now();
   Word hour,min,sec,msec;
   DecodeTime(DT,hour,min,sec,msec);
/ / Створимо унікальний ID, заснований на поточному значенні часу
UserID = IntToStr (hour) + IntToStr (min) + IntToStr (sec) + IntToStr (msec);
/ / Створимо унікальне ім'я для файлу з зображенням
   int i=random(1000000000);
   AnsiString FileName=UserID+”_”+IntToStr(i)+”.JPG”;
   //Save an image to a file
   TJPEGImage *JPG= new TJPEGImage;
   TPicture *P = new TPicture();
   P->Assign(Table1->FieldByName(“Graphic”));
   JPG->Assign(P->Graphic);
   JPG->SaveToFile(FileName);
   Table1Picture->Value=”<IMG SRC=””+FileName+””>”;
   &P->Free;
   &JPG->Free;
}

Необхідно також послатися на відповідний h-файл:

#include <vcljpeg.hpp>

Мабуть, наведений вище код потребує деяких коментарів. При написанні передбачалося, що ймовірність вилучення будь-якого зображення двома користувачами одночасно протягом однієї і тієї ж мілісекунди мізерно мала. У цьому випадку можна згенерувати імена файлів видобутих зображень, комбінуючи величину, засновану на значенні часу з точністю до мілісекунди, з випадковим числом, яке унікально для кожного запису в даному сеансі роботи користувача, але, на жаль, не унікально для декількох користувачів одночасно.


Може виникнути питання: чому файл з графічним зображенням не віддаляється в обробнику події OnCalcFields? Справа в тому, що зображення може бути додано в браузер набагато пізніше, ніж додаток завершить свою роботу (особливо якщо користувач має доступ в Інтернет по звичайній телефонній лінії за допомогою модемного з'єднання). Це означає, що файли з зображеннями після закінчення роботи програми повинні зберігатися на жорсткому диску Web-сервера. Тому віддалятися вони повинні іншим додатком або просто іншим примірником того ж самого додатка, запущеним пізніше. Приклад коду, що реалізує видалення непотрібних файлів із графічними зображеннями у припущенні, що для завантаження всіх зображень в браузер конкретного користувача достатньо десяти хвилин, наведено нижче:

void __fastcall TWebModule1::WebModuleCreate(TObject *Sender)
{
//Delete old *.JPG files
   TSearchRec sr;
if (FindFirst(“*.JPG”, faAnyFile, sr) == 0)
{
   do
      {
if (Double (Now ())-Double (FileDateToDateTime (sr.Time))> 0.00694)
/ / 10 хвилин – це приблизно 0.00694 частину дня
         DeleteFile(sr.Name);
      } while (FindNext(sr) == 0);
      FindClose(sr);
}
/ / Инициализируем генератор випадкових чисел
Randomize();
}

У обробнику події OnCrerate нашого об'єкта TWebModule видаляємо всі зображення, що зберігаються в каталозі Web-додатки більше десяти хвилин, і ініціалізували генератор випадкових чисел.


Відзначимо, що каталог, в якому розміщені файли з графічними зображеннями, повинен бути доступний для читання користувачами Інтернету. Оскільки в нашому прикладі це той же самий каталог, де знаходиться виконуваний файл, не виключено, що для працездатності цього додатка потрібно внести відповідні зміни в налаштування каталогів Web-сервера – наприклад, каталог Scripts Internet Information Services, де зазвичай поміщають Web-додатки, за замовчуванням такого дозволу не має. Однак з точки зору безпеки більш виправдано розміщення файлів з зображеннями в іншому каталозі.


Нарешті, клацнемо правою кнопкою миші на компоненті TDataSetTableProducer, виберемо опцію Response Editor і змінимо вигляд HTML-таблиці.

Рис. 19. Response editor


Можна, наприклад, змінити властивості Cellpadding, Cellspacing, Border, BgColor HTML-таблиці, що відповідають за відстань між осередками, їх колір, товщину ліній сітки. Крім того, ми можемо згенерувати об'єкти THTMLTableColumn і змінити їх властивості, що дозволить встановити свої правила відображення колонок таблиці та їх заголовків.


Тепер можна зберегти, скомпілювати і протестувати програму. Результат зображений на рис.

Рис. 20. Публікація в Інтернеті таблиці, яка містить графічні поля


Виконання всіх розглянутих вище прикладів можливо за допомогою Delphi 5 і C + + Builder 5 Enterprise і Professional, а також Delphi 4 і C + + Builder 4 Enterprise. Приклад, який буде розглянуто в наступному частини статті, можна виконати тільки за допомогою Delphi 5 і C + + Builder 5 Enterprise, оскільки в ньому використовуються компоненти InternetExpress, відсутні в інших версіях цих засобів розробки.


Інтерактивні форми для редагування даних


Повернемося ненадовго до прикладу, в якому реалізована форма введення даних в таблицю, яка містить список розсилки. Якщо при роботі з цими додатками користувач введе в будь-які поля форми некоректні дані, дізнається він про це тільки після відправки даних форми на Web-сервер та одержання результату їх обробки. Іншими словами, інтерактивність цього додатка невелика.


Трохи інакше йде справа з більш інтерактивним Web-додатком, що дозволяє, як мінімум, не звертатися до сервера для перевірки відповідності введених даних яких-небудь банальним вимогам типу відсутність літери в числовому полі, а також контролює коректність введених даних в момент, коли фокус введення залишає на цьому полі, а не коли вся запис відправляється на сервер. Шляхи досягнення цієї мети відомі, і найбільш поширеним з них є застосування скриптових мов (VBScript або JavaScript). Фрагменти коду на цих мовах, містять логіку перевірки коректності даних, можуть перебувати в HTML-сторінці, і при відображенні у браузері вони інтерпретуються їм, дозволяючи провести таку перевірку без звертання до сервера. У цьому випадку наше CGI-або ISAPI-додаток повинен «вміти» генерувати сторінки, що містять код на одному з цих мов.


У принципі, при наявності часу і знань однієї з скриптових мов створити інтерактивний аналог наведених вище прикладів не так вже й складно. Однак при наявності Delphi 5 або C + + Builder 5 Enterprise домогтися інтерактивності можна більш простим способом. Цей спосіб полягає у застосуванні компонентів InternetExpress, які призначені для створення MIDAS-клієнтів, які є Web-додатками. Подібні програми обмінюються XML-даними з браузерами, що підтримують інтерпретацію коду JavaScript. Подробиці про MIDAS-додатках подібного типу можна дізнатися зі статті «MIDAS3: нові можливості» (КомпьютерПресс, № 1’2000).


Зазначимо, що застосування компонентів InternetExpress не обмежене тільки «істинними» MIDAS-додатками з окремим сервером доступу до даних – за допомогою цих компонентів можна створити Web-додаток, що є звичайним клієнтом серверної СУБД. Проте подібний додаток більш інтерактивно, ніж традиційне HTML-додаток, і нижче ми побачимо, в чому це виражається.


Отже, створимо просте застосування, що ілюструє застосування компонентів InternetExpress. У цьому прикладі ми помістимо MIDAS-сервер і MIDAS-клієнт в один і той же додаток. Для цього створимо нове CGI-додаток і помістимо компоненти TTable і TDataSetProvider в об'єкт TWebModule – вони являють собою «серверну» частина цього додатка. Тепер необхідно встановити значення властивостей DatabaseName і TableName компонента Table1 (наприклад, BCDEMOS і Customers.db). Далі слід встановити значення властивості DataSet компонента DataSetProvider1 рівним Table1 – це означає, що компонент Table1 тепер доступний для майбутніх MIDAS-клієнтів.


Тепер помістимо в той же самий об'єкт TWebModule компоненти TXMLBroker і TmidasPageProducer, що представляють собою «клієнтську» частину нашегоWeb-додатки. Перший з них відповідає за отримання пакетів даних від MIDAS-сервера, а другий – за генерацію Web-сторінки, що спрямовується в браузер. У даному прикладі MIDAS-сервер знаходиться всередині нашого ж додатки, тому встановимо значення властивості ProviderName компонента XMLBroker1 рівним DataSetProvider1, залишивши властивість RemoteServer порожнім.

Рис. 21. Компоненти InternetExpress в об'єкті TWebModule


Далі необхідно вибрати пункт Web Page Editor з контекстного меню компонента MidasPageProducer1. Цей редактор властивостей дозволяє вказати, які інтерфейсні елементи для відображення та редагування даних потрібно відображати в браузері. Наприклад, додамо в нього компонент DataForm з вкладеними в нього компонентами FiedlGroup і DataNavigator. Встановимо значення властивості XMLBroker компонента FieldGroup1 рівним XMLBroker1, а властивості XMLComponent компонента DataNavigator1 – FieldGroup1.

Рис. 22. Створення користувальницького інтерфейсу за допомогою Web Page Editor


Наступним кроком буде встановлення значення властивості IncludePathURL компонента MidasPageProducer1. Це URL, де наше Web-додаток повинен знайти JavaScript-і HTML-файли, використовувані для генерації Web-сторінок. Файли *. js та *. html слід скопіювати з каталогу Cbuilder5SourceWebmidas в каталог, що відповідає цьому URL.


Слід зауважити, що каталог InetpubScripts, що є за замовчуванням каталогом для Web-додатків Microsoft Internet Information Services і, отже, потенційним місцем для розміщення нашого Web-додатки, – не найкраще місце для даних файлів. Справа в тому, що за замовчуванням файли з цього каталогу можна запускати на виконання, але вони недоступні для читання. Тому потрібно змінити настройки цього каталогу або, що більш переважно, використовувати інший каталог.


Нарешті, слід створити об'єкт TWebActionItem, встановити значення його властивості Default рівним true, а значення властивості Producer – MidasPageProducer1. Наше застосування готове.


Тепер можна зберегти проект, скомпілювати його і перенести виконуваний файл у відповідний каталог Web-сервера. Результат виконання цього додатка зображений на рис.

Рис. 23. Результат виконання програми з компонентами InternetExpress


Тепер залишилося розглянути, чому отримане додаток більш інтерактивно, ніж додаток, результат виконання якого зображений на рис. 12. Аналіз поведінки останнього програми показує, що воно дозволяє редагувати одночасно кілька записів, переміщатися між ними, використовувати кнопки Undo або Post, додавати і видаляти записи – і все це без звернення до Web-сервера. Тільки натискання кнопки ApplyUpdates ініціює новий запуск Web-додатки для того, щоб зберегти внесені користувачем зміни в базі даних. Якщо уважно розглянути текст Web-сторінки, що генерується цим додатком, можна побачити фрагменти коду JavaScript, а також XML-дані, відповідні вмісту таблиці або запиту (їх обсяг можна обмежити властивістю MaxRecords компонента TXMLBroker). Оскільки код JavaScript інтерпретується браузером, а всі необхідні дані містяться всередині Web-сторінки, при переміщенні по записах та їх редагуванні немає необхідності звертатися до Web-сервера, поки користувачеві не потрібно нова порція записів з бази даних. Це означає, що InternetExpress-програми більш інтерактивні, ніж HTML-додатки.


Висновок


У даній статті ми розглянули створення найбільш часто зустрічаються типів Web-додатків за допомогою C + + Builder. Вивчили, як динамічно генерувати Web-сторінки, обробляти користувальницький введення і зберігати його в базі даних, як публікувати дані в Інтернеті і організувати виведення графічних зображень. Нарешті, ми обговорили, як створити інтерактивне Web-додаток для редагування даних.


Слід зауважити, що створення додатків подібного класу можливо за допомогою не тільки засобів розробки Borland, але і більшості інших (Microsoft Visual Basic, Sybase PowerBuilder, Microsoft Visual FoxPro і т.д.). Назви класів, застосовуваних при генеруванні таких додатків, що можуть бути іншими, але основні принципи залишаються приблизно тими ж, що й у наведених прикладах.


На закінчення відзначимо, що CGI / ISAPI – не єдина технологія створення Web-додатків, які містять код, що виконується на Web-сервері. В даний час все більш популярною стає технологія ASP (Active Server Pages), що дозволяє включати результат виконання серверного коду в Web-сторінки. Детальніше про це можна прочитати в інших статтях, зокрема в статті Сергія Трепаліна «Створення серверних компонентів для ASP-додатків »на нашому CD-ROM.

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*