IntraWeb для розробки Web-додатків

Читаючи forum

Читаючи forum.xakep.ru я натрапив на один цікавий топік. Програміст-запитав: «Як зробити форум, інтернет магазин на Delphi або на чомусь іншому ?!». Відповіді мене здивували, хоча звичайно і питання було трохи дивно сформульований. Проте, саме засобам створення Web-додатків Borland завжди приділяла особливу увагу. Не є винятком і такий, досить популярний продукт цієї компанії, як Delphi. До його складу, в різних версіях, були включені такі досить потужні інструменти створення Web-додатків, як Web Broker, Web Snap і Web Services. Ці інструменти дозволили розробникам в повній мірі використовувати можливості Delphi для реалізації бізнес логіки в Web-додатках. Проте, при цьому передбачається, що програміст для створення складних динамічних сторінок повинен все ж включати в свої додатки фрагменти коду, написані на інших мовах (JScript або VBScript). Природно, що далеко не кожен розробник GUI-додатків володіє достатніми навичками створення і використання скриптових конструкцій. Разом з тим в даний час, завдання реалізації повнофункціонального Web-інтерфейсу для великих інформаційних систем стає все більш актуальною.

І ось, починаючи з сьомої версії, Delphi поповнилася ще одним засобом створення Web-додатків - IntraWeb від компанії AtoZed Software. Про основи роботи з цим продуктом я і хочу розповісти в статті.

Розглянутий продукт істотно спрощує процес розробки, позбавляючи Delphi-програміста від необхідності впровадження в вихідний код фрагментів, написаних на інших мовах програмування. Тепер Web-додатки можна розробляти, використовуючи виключно мову Delphi, при необхідності IntraWeb автоматично зробить конвертування програмних елементів в скрипти або HTML-код. Спробуємо розглянути роботу IntraWeb трохи докладніше і виявити переваги, які дає ця технологія.

IntraWeb підтримує два режими розробки - режим додатки (Application Mode) і сторінковий режим (Page Mode). У сторінковому режимі, додатки можуть створюватися в форматах ISAPI, Apache DSO, NSAPI, CGI, або Win-CGI. У режимі додатки - тільки в форматах ISAPI, NSAPI і Apache DSO. Незважаючи на те, що сторінковий режим має дещо більшою гнучкістю, в рамках даної статті зупинимося на розгляді роботи в режимі додатки, як більш простому для вивчення загальних концепцій IntraWeb.

Для роботи нам знадобиться браузер, поддержітвающій JavaScript, бажано IE версії 5.5 або старше. Відразу обмовлюся, що IntraWeb додатки підтримують Netscape, Opera та інші браузери. Однак при роботі навіть зі стандартним HTML-кодом різні браузери можуть вести себе по різному. IntraWeb-додатки можуть автоматично визначати тип браузера, з яким працює користувач. Проте, найчастіше, для того, що б відображення було коректним, можуть знадобитися додаткові налаштування програми.

Для того щоб створити новий проект виберемо пункт меню File | New | Other і перейдемо на закладку IntraWeb. З безлічі запропонованих варіантів виберемо Stand Alone Application. Таке додаток буде самостійним сервером. Користувач може звернутися до нього з браузера, набравши в командному рядку відповідний додатком
URL.

Після вибору типу проекту необхідно вказати директорій, в якому додаток буде збережено. Після того, як всі перераховані вище дії виконані, ми отримаємо заготовку додатки. Заготівля включає в себе три модулі - IWProject, IWUnit1 і ServerController.

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

program IWProject;
{PUBDIST}
uses
IWInitStandAlone,
ServerController in 'ServerController.pas' {IWServerController: TDataModule},
IWUnit1 in 'IWUnit1.pas' {formMain: TIWForm1};
{$ R * .res}
begin
IWRun (TFormMain, TIWServerController);
end.

Істотною відмінністю є лише те, що в даному модулі не проводиться створення форм проекту, як це відбувається в звичайному додатку. Замість цього відразу викликається процедура IWRun, яка є IntraWeb`овскім аналогом методу Application.Run, використовуваного для запуску звичайних додатків. Трохи пізніше ми повернемося до розгляду цього питання, а тим часом звернімося до модулю
ServerController. Модуль ServerController повинен входити до складу будь-якого IntraWeb-проекту. Цей модуль дозволяє налаштувати загальні властивості програми та визначити особливості його поведінки під час роботи. Саме тут обробляється кожна, знову створювана сесія, при підключенні користувача до додатка.
Перейшовши в редактор коду, ми побачимо, що за замовчуванням в модуль ServerController включено опис спеціального класу TUserSession. Розробник може додавати власні атрибути в структуру даного класу. Кожен користувач IntraWeb-додатки, під час сесії буде звертатися до власного екземпляру TUserSession. Відповідно, кожен описаний всередині класу атрибут так само буде мати власне значення. Для спрощення доступу до об'єкта використовується функція UserSession. Так якщо описати об'єкт:

TUserSession = class
public
Username: string;
Password: string;
end;

то в подальшому з будь-якого модуля програми можна буде викликати синтаксичну конструкцію подібного виду:

UserSession.Username: = 'Joe';
LPassword: = UserSession.Password;

Саме таким чином розробники IntraWeb рекомендують організовувати глобальні змінні в додатку. Якщо ж просто оголосити їх в секції public деякого модуля, як це робиться в звичайних додатках, то такі змінні будуть загальними для всіх сесій, що, відповідно, може спричинити за собою конфлікти, пов'язані зі спробою змінювати їх значення одночасно різними користувачами.

Тепер розглянемо останній модуль, що входить до складу нашого проекту, - IWUnit1. У ньому описується форма formMain. Поглянувши на Object Inspector, одразу стає ясно, що дана форма має істотні відмінності від звичайної форми додатка Delphi - TForm. Саме ця форма і є заготівлею головної сторінки нашого застосування, і вона повинна відображатися в браузері. Спробуємо розмістити на формі кілька компонент з набору IW Standart - IWLabel, IWEdit і IWButton.

Що б побачити, як буде виглядати тільки, що створена форма в дії, запустимо додаток на виконання. У що з'явилася на екрані формі натиснемо першу зліва кнопку (Launch selected browser and execute application). У вікні браузера з'явиться сторінка з розміщеними на ній елементами управління, іншими словами створена нами форма тепер відображається як HTML сторінка. Щоб надалі уникнути подібної, щодо довгої процедури запуску додамо для нашого застосування параметр "/ LaunchBrowser". Для цього використовуйте пункт меню
"Run | Parameters".

Спробуємо додати в проект деяку функціональність. Повернемося в режим редагування програми та напишемо обробник події OnClick для компонента IWButton1:

procedure TformMain.IWButton1Click (Sender: TObject);
begin
IWLabel1.Caption: = IWEdit1.Text;
end;

Неважко здогадатися, що має статися. І дійсно, запустивши додаток можна побачити, що при натисканні на кнопку мітка IWLabel1 буде відображати той текст, який введений в поле введення IWEdit1.

У створювану форму можна додати і фрагменти HTML коду. Розмістивши на формі компонент TIWText. За замовчуванням цей компонент дозволяє просто відображати на сторінці статичний текст. Однак, якщо ви встановите значення властивості RawText - true, а властивості WantReturns - false, то текст, занесений з допомогою Object Inspector`а в властивість Lines буде сприйматися програмою як код HTML.
Перш ніж перейти до розгляду роботи з базами даних в IntraWeb, давайте розглянемо механізми взаємодії між окремими формами додатки.
Для того, щоб додати в наш проект ще одну форму активізуємо пункт меню File | New | Other, перейдемо на закладку IntraWeb і виберемо Application Form. Збережемо отриманий модуль на диску. Якщо після цього глянути на вихідний код самого проекту (Project | View Source), то ми побачимо, що форми, що входять до складу IntraWeb програми не створюються автоматично, як це відбувається в звичайному додатку. Як вже говорилося раніше, в вихідному коді нашого проекту відсутні рядки ініціалізації форм подібні нижченаведеної.

Application.CreateForm (TForm1, Form1);

Замість цього створювати форми доведеться вручну. При натисканні на кнопку IWButton1 в нашому додатку будемо відкривати нову форму. Для цього додамо назву модуля, в якому знаходиться нова форма, в список використовуваних модулів для основної форми програми. У секцію public викликає форми додамо наступний опис:

FNewForm: TFormMain1 ;.

Подія OnCreate опрацюємо наступним чином:

procedure TformMain.IWAppFormCreate (Sender: TObject);
begin
FNewForm: = TFormMain1.Create (WebApplication);
end ;.

І, нарешті, при натисканні кнопки викличемо нову форму, змінивши код обробника події OnClick:

procedure TformMain.IWButton1Click (Sender: TObject);
begin
FNewForm.Show;
end;

Запустивши додаток, переконайтеся, що при натисканні на кнопку IWButton1 браузер виведе на екран порожню сторінку. Далі додамо на второю форму (formMain1) компонент IWLabel. Нашим завданням буде відображення тексту, введеного в поле введення IWEdit1. Для цього перед викликом форми досить вставити рядок такого змісту:

FNewForm.IWLabel1.Caption: = IWEdit1.Text;

Таким чином, ми бачимо, що значення властивостей розміщуються компонент можна передавати між формами IntraWeb-додатків без використання об'єкта TUserSession. Це відбувається тому, що компоненти на формах є членами класів самих IntraWeb форм, і, відповідно, не започатковано окремо для кожної користувальницької сесії.

Тепер спробуємо відобразити на головній сторінці програми дані з таблиці. Як завжди, в таких випадках скористаємося таблицею customer.db з бази даних DBDEMOS. Створимо новий Stand Alone with Data Module додаток. У DataModule1 помістимо компоненти TDatabase, TTable, TSession і TDataSource. Встановимо для компонентів наступні властивості:

Властивість Значення Session1 AutoSessionName True Table1 DatabaseName DBDEMOS TableName customer.db DataSource1 DataSet Table1

На формі formMain розмістимо компоненти відображення даних IntraWeb - IWDBGrid, IWDBNavigator і кілька компонентів IWDBEdit. Зв'яжемо ці компоненти з компонентами представлення даних, подібно до того, як це робиться в звичайних проектах, привласнивши значення «DataModule1.DataSource1» властивості DataSource. Після того, як додаток запущено і в командному рядку браузера набраний відповідний адресу, ми зможемо побачити сторінку приблизно наступного вигляду. При цьому поведінка сторінки нагадує поведінку звичайного застосування, в якому властивість AutoEdit компонента DataSource має значення
false.

При цьому поведінка сторінки нагадує поведінку звичайного застосування, в якому властивість AutoEdit компонента DataSource має значення   false

Взагалі, мені досить рідко траплялися Web-сторінки, що дозволяють редагувати дані безпосередньо у видимій таблиці. Технічно реалізувати таку можливість непросто. Однак компонент IWDBGrid дозволяє домогтися такого ефекту. Я не буду детально розповідати, як це робиться, при бажанні ви можете звернутися до демонстраційного прикладу. Замість цього хотілося б трохи докладніше розглянути поведінку деяких компонентів відображення даних. Так для формування списків з набору даних в звичайних додатках досить часто використовуються компоненти DBLookupComboBox і DBLookupListBox. У тому випадку, якщо важливо лише здійснити вибір будь-якого значення, без занесення його в інший набір даних властивості DataSource значення присвоюють. Досить лише визначити властивості ListSource, ListField і KeyField. На мій погляд, особливо зручно те, що при виборі конкретного значення з такого списку відбувається, відповідно, зміна поточного запису, що дає можливість легко визначити значення ключового поля.
Компоненти IWDBLookupComboBox і IWDBLookupListBox, очевидно, не дозволяють виконати подібну операцію. Для того, що б отримати значення ключового поля обраної записи доводиться встановлювати значення властивості DataField.

При роботі з даними варто також звернути увагу на поведінку сервера при натисканні кнопки "Back" браузера. Справа в тому, що в цьому випадку може порушуватися синхронізація додатки, і користувач отримає повідомлення приблизно такого змісту: «Ви спробували переслати або оновити дані зі сторінки, інформація про яку вже не підтримується серверним додатком. Спроба внести зміни буде проігнорована. Ви будете синхронізовані з поточним місцем докладання »(You have attempted to post or refresh data from a page that depends on information that is no longer available to the server application. Your attempted changes will be ignored. You will now be resynchronized to the current place in the application). Після виведення даного повідомлення додаток буде повернуто в той стан, в якому воно прибувало до натискання кнопки "Back". Проте, якщо виникає необхідність здійснювати повернення на попередню сторінку, то налаштувати поведінку програми при натисканні кнопки "Back" дозволить зміна значення властивості .HistoryEnabled. Попередження так само може бути відключено, якщо встановити значення властивості .ShowResyncWarning -
false.

І все ж, щоб зайвий раз не спокушати користувача, я вважаю за краще викликати InterWeb додатки в окремому вікні браузера з відключеною командним рядком.

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

Крім того, незважаючи на те, що Web-додатки мають безліч незаперечних переваг перед звичайними, «настільними» додатками, вони далеко не завжди можуть надати користувачеві ту гнучкість, яка може бути реалізована в GUI-програмах. Пов'язано це, на мій погляд, перш за все з тим, що повнофункціональний Web-інтерфейс організувати значно складніше. Розробник серверних додатків повинен витрачати більшу кількість часу на написання необхідних елементів управління і їх прив'язку до даних, або максимально спрощувати призначений для користувача інтерфейс, що може привести до втрати функціональності додатку. Можливо, поява IntraWeb в складі Delphi 7 і розвиток цієї технології в трьох наступних версія продукту, реально може посприяти вирішенню цієї проблеми і відкрити багато цікавих технічних рішень.

література:

1. AtoZed Software. IntraWeb documentation.
2. AtoZed Software. Introduction to IntraWeb.
3. Матеріали Borland Community Network. http://bdn.borland.com
4. Bob Swart. IntraWeb And ActiveForms. Delphi Magazine. Issue 102

Програміст-запитав: «Як зробити форум, інтернет магазин на Delphi або на чомусь іншому ?