IntraWeb за разработка на уеб приложения

Четейки forum.xakep.ru попаднах на една интересна тема. Начинаещ програмист попита: "Как да направя форум, онлайн магазин в Delphi или нещо друго?!" Отговорите ме изненадаха, въпреки че, разбира се, въпросът беше някак странно формулиран. Но Borland винаги е обръщала специално внимание на средствата за създаване на уеб приложения. Такъв много популярен продукт на тази компания като Delphi не е изключение. Той включва в различни версии такива доста мощни инструменти за създаване на уеб приложения като Web Broker, Web Snap и Web Services. Тези инструменти позволиха на разработчиците да се възползват напълно от възможностите на Delphi за внедряване на бизнес логика в уеб приложения. Това обаче предполага, че програмистът все още трябва да включва кодови фрагменти, написани на други езици (JScript или VBScript) в своите приложения, за да създава сложни динамични страници. Естествено, не всеки разработчик на GUI приложения има достатъчно умения за създаване и използване на скриптови структури. В същото време в момента задачата за внедряване на пълнофункционален уеб интерфейс за големи информационни системи става все по-важна.

И сега, започвайки от седмата версия, Delphi се попълни с друг инструмент за създаване на уеб приложения - IntraWeb от AtoZed Software. Искам да говоря за основите на работата с този продукт в статията.

Въпросният продукт значително опростява процеса на разработка, спестявайки програмиста на Delphi от необходимостта да въвежда фрагменти, написани на други езици за програмиране, в изходния код. Сега уеб приложенията могат да се разработват само с помощта на езика Delphi, ако е необходимо, IntraWeb автоматично ще конвертира програмните елементи вскриптове или HTML код. Нека се опитаме да разгледаме работата на IntraWeb малко по-подробно и да идентифицираме предимствата, които предоставя тази технология.

IntraWeb поддържа два режима на разработка – режим на приложение (Application Mode) и режим на страница (Page Mode). В режим на страница приложенията могат да се създават във формати ISAPI, Apache DSO, NSAPI, CGI или Win-CGI. В режим на приложение, само формати ISAPI, NSAPI и Apache DSO. Въпреки че режимът на страница е малко по-гъвкав, в тази статия ще се съсредоточим върху работата в режим на приложение, тъй като е по-лесно да научите общите концепции на IntraWeb.

За да създадете нов проект, изберете елемента от менюто FileNewOther и отидете на раздела IntraWeb. От многото предлагани опции ще изберем Stand Alone Application. Такова приложение ще бъде самостоятелен сървър. Потребителят може да получи достъп до него от браузър, като напише URL, съответстващ на приложението в командния ред.

След като изберете типа на проекта, трябва да посочите директорията, в която ще бъде записано приложението. След като всички горни стъпки са изпълнени, ще получим мъниче за кандидатстване. Заготовката включва три модула - IWProject, IWUnit1 и ServerController.

IWProject е директно основният модул на проекта, приложението се инициализира и формите, които са част от проекта, се свързват. Както можете да видите от списъка по-долу, който съдържа текста на модула IWProject, структурата на IntraWeb проект е основно подобна на структурата на обикновено приложение.

програма IWProject; използва IWInitStandAlone, ServerController в 'ServerController.pas' , IWUnit1 в 'IWUnit1.pas' ; започнете IWRun(TFormMain, TIWServerController); край.

TUserSession=клас публичен Потребителско име: низ; Парола: низ; край; тогава в бъдеще от всеки приложен модул ще бъде възможно да се извика синтактична конструкция от този вид:

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

Ето как разработчиците на IntraWeb препоръчват организирането на глобални променливи в приложение. Ако просто ги декларирате в публичната секция на определен модул, както се прави в обикновените приложения, тогава такива променливи ще бъдат общи за всички сесии, което съответно може да доведе до конфликти, свързани с опит за промяна на техните стойности едновременно от различни потребители.

Сега нека да разгледаме последния модул, който е част от нашия проект - IWUnit1. Той описва формата formMain. Разглеждайки обектния инспектор, веднага става ясно, че този формуляр има значителни разлики от обичайния формуляр за приложение на Delphi - TForm. Именно тази форма е шаблонът за главната страница на нашето приложение и трябва да се показва в браузъра. Нека се опитаме да поставим върху формата няколко компонента от набора IW Standard - IWLabel, IWEdit и IWButton.

За да видите как ще изглежда само създадената форма в действие, нека стартираме приложението за изпълнение. Във формата, която се появява на екрана, натиснете първия бутон вляво (Стартиране на избрания браузър и изпълнение на приложение). Страница с поставени върху нея контроли ще се появи в прозореца на браузъра, с други думи формулярът, който създадохме, вече се показва като HTML страница. За да избегнем такава относително дълга процедура за стартиране в бъдеще, ще добавим параметъра „/LaunchBrowser“ към нашето приложение. За да направите това, използвайте елемента от менюто “RunParameters”.

Нека се опитаме да добавим малко функционалност към проекта. Назад към режим на редактиранеприложение и напишете манипулатора на събитие OnClick за компонента IWButton1:

процедура TformMain.IWButton1Click(Подател: TObject); започнете IWLabel1.Caption:=IWEdit1.Text; край; Не е трудно да се познае какво ще се случи. Наистина, като стартирате приложението, можете да видите, че когато щракнете върху бутона, етикетът IWLabel1 ще покаже текста, който е въведен в полето за въвеждане на IWEdit1.

Можете също да добавите фрагменти от HTML код към генерирания формуляр. Чрез поставяне на компонента TIWText във формуляра. По подразбиране този компонент ви позволява просто да показвате статичен текст на страницата. Ако обаче зададете стойността на свойството RawText на true и свойството WantReturns на false, тогава текстът, въведен от Инспектора на обекти в свойството Lines, ще се третира от приложението като HTML код. Преди да преминем към работа с бази данни в IntraWeb, нека разгледаме механизмите на взаимодействие между отделните форми на приложението. За да добавим друга форма към нашия проект, активираме елемента от менюто FileNewOther, отиваме в раздела IntraWeb и избираме Формуляр за приложение. Нека да запазим получения модул на диск. Ако след това погледнем изходния код на самия проект (ProjectView Source), ще видим, че формите, които са част от IntraWeb приложението, не се създават автоматично, както е в обикновеното приложение. Както споменахме по-рано, в изходния код на нашия проект няма редове за инициализация на формуляри като следните.

Вместо това формулярите ще трябва да се създават ръчно. Когато щракнете върху бутона IWButton1 в нашето приложение, ние ще отворим нов формуляр. За да направите това, добавете името на модула, съдържащ новата форма, към списъка с използвани модули за основната форма на приложението. Добавете следното описание към публичната секция на формуляра за повикване:

Събитието OnCreate ще бъде обработено по следния начин:

процедура TformMain.IWAppFormCreate(Подател: TObject); започнете FNewForm:=TFormMain1.Create(WebApplication); край;.

И накрая, когато се щракне върху бутона, ще извикаме нов формуляр, като променим кода на манипулатора на събитие OnClick:

процедура TformMain.IWButton1Click(Подател: TObject); започнете FNewForm.Show; край; След стартиране на приложението се уверете, че когато щракнете върху бутона IWButton1, браузърът ще покаже празна страница на екрана. След това добавете компонента IWLabel към втория формуляр (formMain1). Нашата задача ще бъде да покажем текста, въведен в полето за въвеждане IWEdit1. За да направите това, преди да извикате формуляра, е достатъчно да вмъкнете следния ред:

FNewForm.IWLabel1.Caption:= IWEdit1.Text; По този начин виждаме, че стойностите на свойствата на хостваните компоненти могат да се предават между формулярите на приложения IntraWeb, без да се използва обектът TUserSession. Това се случва, защото компонентите на формулярите са членове на класовете на самите IntraWeb формуляри и съответно се инициализират отделно за всяка потребителска сесия.

Сега нека се опитаме да изведем данните от таблицата на главната страница на приложението. Както обикновено, в такива случаи ще използваме таблицата customer.db от базата данни DBDEMOS. Нека създадем ново приложение Stand Alone with Data Module. Нека поставим компонентите TDatabase, TTable, TSession и TDataSource в DataModule1. Задайте следните свойства за компонентите:

ИмотЗначение
Сесия1
AutoSessionNameВярно
Маса 1
Име на база данниDBDEMOS
име на таблицаcustomer.db
DataSource1
набор от данниМаса 1

Всъщност аз рядкоПопаднах на уеб страници, които ви позволяват да редактирате данни директно в показаната таблица. Не е лесно да се реализира тази възможност технически. Компонентът IWDBGrid обаче ви позволява да постигнете този ефект. Няма да навлизам в подробности как се прави това, ако желаете, можете да се обърнете към демото. Вместо това бих искал да разгледам по-отблизо поведението на някои компоненти за показване на данни. И така, за формиране на списъци от набор от данни в обикновени приложения доста често се използват компонентите DBLookupComboBox и DBLookupListBox. В случай, че е важно само да изберете стойност, без да я въвеждате в друг набор от данни, на свойството DataSource не се присвоява стойност. Всичко, което трябва да направите, е да дефинирате свойствата ListSource, ListField и KeyField. Според мен е особено удобно, когато изберете конкретна стойност от такъв списък, текущият запис се променя съответно, което позволява лесно да се определи стойността на ключовото поле. Компонентите IWDBLookupComboBox и IWDBLookupListBox очевидно не ви позволяват да направите това. За да получите стойността на ключовото поле на избрания запис, трябва да зададете стойността на свойството DataField.

Когато работите с данни, трябва да обърнете внимание и на поведението на сървъра, когато щракнете върху бутона „Назад“ на браузъра. Факт е, че в този случай синхронизирането на приложението може да бъде нарушено и потребителят ще получи съобщение със следното съдържание: „Опитахте се да изпратите или актуализирате данни от страница, чиято информация вече не се поддържа от сървърното приложение. Опит за извършване на промени ще бъде игнориран. Ще бъдете синхронизирани с текущото местоположение на приложението" (Опитали сте да публикувате или опресните данни от страница, която зависи отинформация, която вече не е достъпна за сървърното приложение. Вашите опити за промени ще бъдат игнорирани. Сега ще бъдете повторно синхронизирани към текущото място в приложението). След показване на това съобщение, приложението ще се върне в състоянието, в което е било преди натискане на бутона „Назад“. Въпреки това, ако се наложи да се върнете към предишната страница, тогава промяната на стойността на свойството .HistoryEnabled ще ви позволи да персонализирате поведението на приложението при натискане на бутона „Назад“. Предупредителното съобщение може също да бъде деактивирано чрез задаване на свойството .ShowResyncWarning на false.

И все пак, за да не изкушавам отново потребителя, предпочитам да извиквам приложенията на InterWeb в отделен прозорец на браузъра с деактивиран команден ред.

Както се вижда от разгледаните примери, използването на технологията IntraWeb може значително да улесни процеса на писане на уеб приложения. Програмистът на Delphi в процеса на разработка, образно казано, попада в родната си среда, т.е. върши работата, която е свикнал да върши.

В допълнение, въпреки факта, че уеб приложенията имат много неоспорими предимства пред конвенционалните, "десктоп" приложения, те не винаги могат да осигурят на потребителя гъвкавостта, която може да бъде реализирана в GUI програми. Това според мен се дължи преди всичко на факта, че е много по-трудно да се организира пълнофункционален уеб интерфейс. Разработчикът на сървърно приложение трябва да отдели много време за писане на необходимите контроли и свързването им с данни или за максимално опростяване на потребителския интерфейс, което може да доведе до загуба на функционалност на приложението. Може би появата на IntraWeb като част от Delphi 7 и развитието на тази технология в следващите три версии на продукта,може наистина да допринесе за решаването на този проблем и да отвори много интересни технически решения.