Смекни!
smekni.com

Технологія WebSnap (стр. 2 из 3)

<% e = new Enumerator(Pages)

s = ''

c = 0

for (; !e.atEnd(); e.moveNext())

{

if (e.item().Published)

{

if (c>0) s += '&nbsp;|&nbsp;'

if (Page.Name != e.item().Name)

s += '<a href="' + e.item().HREF + '">' + e.item().Title + '</a>'

else

s += e.item().Title

c++

}

}

if (c>1) Response.Write(s)

%>

у файлі Unit1.html генерує панель навігації. Текст функції достатньо зрозумілий, деякі коментарі необхідні лише для останнього оператора Response.Write. Цей оператор виводить рядок з результатом роботи скрипта в HTML-файл сторінки. Ще один приклад можна побачити в тому ж Unit1.html:

<%= Application.Title %>


В результаті роботи цього скрипта на сторінку виводиться її заголовок.

Приклад 3. Використання адаптерів у WebSnap-сервері

Адаптерипризначені для зберігання різних параметрів і процедур; вони надають можливість звертатися до них зі скрипта. Сторінка WebSnapпалітри компонентів Borland C++ Builder 6 містить декілька видів адаптерів. Найбільш неспеціалізованим є адаптер класу TAdapter. Параметри адаптера зберігаються в так званих полях (AdapterFields), якінадають програмісту можливість задати оброблювачі для отримання значення поля та інших його параметрів. Клас TAdapterмає властивість Data для зберігання полів і керування ними. Процедури дозволяють викликати зі скрипта виконання яких-небудь дій; для керування ними клас TAdapter містить властивість Actions.

Розглянемо приклад створення сторінки для введення імені користувача. Розташуймо компонент Adapterв модулі PageProducerPage2. Визначимо поле, яке повертатиме ім'я користувача. Для цього з інспектора об'єктів викличемо редактора властивості Data адаптера Adapter1. У редакторі натиснемо кнопку New Item. Нам буде запропонований діалог вибору типу поля (мал. 13).

Малюнок 13


Оберімо тип AdapterField, оскільки він найбільш підходить для зберігання невеликих рядків. У діалозі при цьому з'явиться елемент AdapterField1, відповідний полю. Оберімо його. Тепер в інспекторі об'єктів перейдемо на закладку Eventsі визначимо текст оброблювача події OnGetValue. Дана подія виникає кожного разу, коли потрібно дізнатися значення поля. Значення поля, що зажадалося, необхідно повертати через параметр Value, передаваний в оброблювач. Код оброблювача:

void __fastcall TPageProducerPage2::AdapterField1GetValue(TObject *Sender,

Variant &Value)

{

Value = FValue;

}

Тут FValue - змінна, в якій запам'ятовується значення поля AdapterField1; необхідно визначити цю змінну в секції publicдекларації TPageProducerPage2 (файл Unit2.h) як AnsiString FValue;. Для ініціалізації значення FValue в оброблювачі події OnCreate модуля введемо код: FValue = “Неизвестный человек”;.

Тепер можна отримати доступ до даного поля зі скрипта. Спершу спробуємо виводити значення поля користувачу. Для цього в код шаблону HTML-сторінки Unit2.html треба додати після тега </table> наступний код:

<BR><BR> Здравствуйте, уважаемый <%=Adapter1.AdapterField1.DisplayText%>.

Скомпілюємо проект і розташуємо на Web-сервері файли Unit1.html, Unit2.html, Project1. dll на сервері в теці для скриптів. Запустимо Web-браузер Internet Explorerі в рядку адреси наберемо http://localhost/scripts/project1.dll. В результаті на сторінці PageProducerPage2 побачимо напис Здравствуйте, уважаемыйНеизвестный человек.

Далі створимо процедуру для зміни значення імені користувача. У інспекторі об'єктів для компоненту Adapter1 викличемо редактора властивості Actions, і натиснувши кнопку New Item з діалогу, що з'явився, оберімо тип процедури AdapterAction (мал. 15).

Буде створена нова процедура AdapterAction1. У інспекторі об'єктів встановимо властивості для процедури (табл 3.1).

Малюнок 14

Малюнок 15

Таблиця 1

Свойство Значение Описание
DisplayLabel OK Текст для отображения в HTML шаблоне
ActionName GetNameAction1 Имя процедуры для использования в скриптах

void __fastcall TPageProducerPage2::AdapterAction1Execute(TObject *Sender,

TStrings *Params)

{

FValue = AdapterField1->ActionValue->Values[0];

}

Цей код зберігає значення поля AdapterField1 у змінній FValue. Щоб надати користувачу можливість вводити своє ім'я, в текст Unit2.html після рядка Здравствуйте, уважаемый додамо визначення форми введення:

<FORM NAME="INPUT_NAME_FORM" METHOD=POST> <INPUT TYPE=HIDDEN NAME="__action"

VALUE = "<%=Adapter1.GetNameAction1.AsFieldValue%>"> Введите Ваше имя: <INPUT TYPE=INPUT VALUE="<%=Adapter1.AdapterField1.EditText%>"

NAME= "<%=Adapter1.AdapterField1.InputName%>"> <INPUT TYPE=SUBMIT VALUE="<%=Adapter1.GetNameAction1.DisplayLabel%>" onclick="'INPUT_NAME_FORM.__action.value=<%=Adapter1.GetNameAction1.AsFieldValue%>'"> </FORM>

Побудуємо проект, перенесемо файли Unit1.html, Unit2.html, Project1. dll на Web-сервер і привітаємо себе (мал. 16).


Малюнок 16

PagedAdapter дозволяє розділити великий обсяг інформації, що виводиться, по сторінках. Обсяг інформації, що розташовується на одній сторінці, задається у властивості PageSize.

Приклад 4. Парольний доступ до сторінки WebSnap-сервера

Часто потрібно забезпечити обмеження доступу до певних сторінок прикладення. Одним з методів розв’язання даної задачі є парольний захист. Технологія WebSnapдозволяє реалізувати доступ до сторінок за паролем. Для підтримки парольного доступу в головному модулі повинні бути присутніми наступні компоненти:

· WebUserList, який містить список користувачів, їх паролів і прав доступу;

· SessionsService, який містить інформацію про користувачів, що використовують прикладення в даний момент;

· EndUserSessionAdapter, який обробляє події підключення користувача.

Додати ці компоненти можна або на етапі створення модуля сторінки в діалозі Web App Components (див. мал. 3.5), або розташувати їх самостійно у вже створений модуль. Скористаймося другим способом і забезпечимо парольний захист сторінки PageProducerPage2, розташувавши вищезгадані компоненти в модулі PageProducerPage1 (мал. 17). Для властивості UserItems компоненту WebUserList1 з інспектора об'єктів викличемо редактора і введемо двох користувачів, яким буде дозволений доступ до сторінки: Ellen з паролем admin і Will без пароля (мал. 18).

Малюнок 3.17

Малюнок 18

Наступний крок припускає вказівку необхідності парольного захисту деякої сторінки. Для цього створимо нову сторінку PageProducerPage2 і в кінці файлу Unit2.cpp, що містить опис PageProducerPage2, знайдемо рядок:

static TWebPageInit WebInit(__classid(TPageProducerPage2), crOnDemand, caCache, PageAccess << wpPublished /* << wpLoginRequired */, ".html", "", "", "", "");


Розкоментуймо фрагмент << wpLoginRequierd. Крім того, тут можна виправити ще одну річ: зробити відображення національних назв сторінок в панелі навігації. Для цього необхідно в цьому ж конструкторі TWebPageInit вставити національну назву сторінки. Таким чином, остаточно рядок виглядатиме так:

static TWebPageInit WebInit(__classid(TPageProducerPage2), crOnDemand, caCache, PageAccess << wpPublished << wpLoginRequired, ".html", "Страница просмотра/редактирования данных", "", "", "");

Тепер потрібно зробити html-сторінку для введення імені і пароля користувача. Найбільш просто скористатися для цього компонентом AdapterPageProducer. Виконаємо команду File | New | Other | WebSnap | WebSnap Page Module. У діалозі параметрів сторінки змінюємо тип Type продюсера з PageProducer на AdapterPageProducer, а також знімаємо прапорець Published, оскільки за умовчанням сторінка для введення пароля не повинна відображатися в панелі навігації (мал. 19).

В результаті буде одержаний модуль сторінки з єдиним компонентом AdapterPageProducer (мал. 20).

Компонент AdapterPageProducer є спеціалізованим продюсером, що дозволяє генерувати HTML-сторінки для відображення полів адаптерів. Принцип створення сторінки в AdapterPageProducer простий. Весь документ являє собою набір Web-компонентів, які програміст додає в редакторі, а за допомогою інспектора об'єктів при необхідності налагоджує їх властивості і події. Web-компоненти можуть бути вкладені один в другий. Все це дозволяє комфортно і швидко проектувати HTML-документи.

Як адаптер для забезпечення доступу до імені користувача і його пароля використовуємо компонент LoginFormAdapter, який необхідно додати в модуль. Далі подвійним клацанням мишею по компоненту AdapterPageProducer викличемо візуального редактора HTML-сторінки. У ньому натиснемо кнопку New Item і додамо Web-компонент типу AdapterForm (т.е HTML-форму) (мал. 21).

Малюнок 19

Малюнок 20

Малюнок 21

Далі, ще раз натиснувши кнопку New Item (при обраному Web-компоненті AdapterForm1), додамо Web-компонент типу AdapterFieldGroup (набір полів для редагування полів адаптера) (мал. 22).

Малюнок 22

Для AdapterFieldGroup1 встановимо властивість Adapter рівним LoginFormAdapter1, таким чином вказавши адаптер, поля якого потрібно відображати. У контекстному меню цього керуючого елементу оберімо команду Add All Fields. Тепер для полів FieldUserName, FieldPasswordі FieldNextPageвластивістю Captionможна задати національні мітки. Стилі міток можна задати властивістю Styleіз значенням, наприклад, font-family: arial; font-weight: bold; font-size: 12px.

Далі оберімо Web-компонент AdapterForm1, ще раз натиснемо кнопку New Item і додамо Web-компонент типу AdapterCommandGroup (набір кнопок для виклику процедур адаптера). Для Web-компоненту AdapterCommandGroup1 задамо властивість DisplayComponent рівним AdapterFieldGroup1. Результат наших дій представлений на мал. 23.