Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра АСУ
Лабораторна робота №9
Середовище програмування DELPHI
Львів 2010
Мета роботи: Вивчення можливостей системи програмування Delphi по створенню динамічних HTML-сторінок.
Порядок роботи:
Ознайомитись з теоретичними відомостями по роботі.
Створити проект Delphi, який реалізує наведений у тексті приклад.
Змінити текст програми так, щоб він відповідав індивідуальному завданню.
Оформити звіт для захисту лабораторної роботи за зразком
назва роботи
мета роботи
порядок роботи
короткі теоретичні відомості
алгоритм розв’язку задачі
тексти відповідних модулів проекту
аналіз отриманих результатів та висновки
Питання для самоконтролю
Як відбувається взаємодія між Web-клієнтом та Web-сервером?
У чому полягає різниця між статичними та динамічними HTML-сторінками?
Для чого призначені інтерфейси CGI, ISAPI та NSAPI? Які відмінності існують між ними?
Як створити Web-ужиток засобами Delphi? Які компоненти та класи використовуються при цьому?
Що таке користувацькі дескриптори в HTML-коді? Яке їх призначення?
Як запустити створений Web-ужиток на виконання?
Теоретичні відомості
Технологія доступу до Web-ресурсів полягає в наступному. Два агенти - Web-клієнт та Web-сервер установлюють між собою зв'язок для обміну інформацією. Стандартним засобом взаємодії у Web-середовищі є протокол передачі гіпертексту (HTTP). Під поняттям протокол розуміють угоду про порядок виконання певних дій, а HTTP - це протокол, розроблений для передачі інформації від клієнта до сервера (запит) та від сервера до клієнта (відповідь на запит). Інформація, що передається, є потоком байтів (ASCII-символів). Протокол HTTP дозволяє пересилати у браузер потрібні Web-сторінки, створені на мові розмітки гіпертексту HTML.
Перші Web-сервери були здатні лише зчитувати та надсилати клієнту вже існуючі статичні HTML-сторінки. Для вищого рівня взаємодії між клієнтом та сервером був розроблений загальний інтерфейс маршрутизації (Common Gateway Interface - CGI). Інтерфейс CGI дозволяє Web-серверу запускати незалежний процес на основі вхідних даних, отриманих від користувача, опрацьовувати цю інформацію та повертати клієнту динамічно створену Web-сторінку. Таким чином сервери можуть надавати опрацьовані, унікальні відповіді на запити користувачів.
Ужиткам CGI притаманні певні недоліки. Оскільки кожен запит запускає на сервері власний процес, декілька запитів можуть суттєво уповільнити роботу сервера. Тому компанії Microsoft та Netscape розробили власні інтерфейси API для Web-серверів: Internet Server Application Programming Interface (ISAPI) та Netscape Application Programming Interface (NSAPI), які дозволяють розширити їх можливості за допомогою функцій бібліотек DLL. Ці бібліотеки з інтерфейсними функціями можна завантажити один раз, після чого вони будуть готові відповідати на будь-яку кількість запитів. Тому Web-ужитки стали працювати швидше, ефективніше та з меншим споживанням ресурсів. Проте для використання нової версії бібліотеки DLL слід перевантажити Web-сервер.
Створення Web-ужитку. За допомогою системи програмування Delphi і компонентів WebBroker можна створити розширення Web-серверів, які забезпечують створення динамічних HTML-сторінок.
Розглянемо приклад створення Web-ужитку для перевірки знання таблиці множення.
При виборі в меню Delphi команди File | New відкривається вікно New Items. Оберіть у ньому піктограму Web Server Application. Надалі оберіть розширення Web-сервера, наприклад, CGI.
Після цього Delphi створює проект на базі класу TWebModule, який призначений для отримання HTML-запиту та відповіді на нього. Клас TWebModule може містити лише невізуальні компоненти, зокрема, елементи сторінки Internet палітри компонент. Властивість Action цього класу містить колекцію елементів TWebActionItem. Кожен елемент TWebActionItem має власне ім'я, і коли клієнт надсилає запит, заснований на цьому імені, виконується підготовлений код та формується певна відповідь.
Виберіть компоненту TWebModule, так щоб її властивості були відображені в інспекторі об'єктів. Через властивість Action та діалогове вікно WebModule Actions створіть два елементи: WebActionItem1 та WebActionItem2. У вікні інспектора об'єктів задайте для цих елементів такі значення властивостей:
WebActionItem1: PathInfo=/1, Enabled=True, Default=False
WebActionItem2: Enabled=True, Default=True.
На сторінці Events інспектора об'єктів створіть нові обробники подій OnAction та визначить їх наступним чином:
procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
// обчислюємо добуток двох чисел, порівнюємо його з відповіддю користувача
// та формуємо сторінку з результатом
if Request.ContentFields.Values['result']=
IntToStr(StrToInt(Request.ContentFields.Values['num1'])*
StrToInt(Request.ContentFields.Values['num2']))
then
Response.Content:=
'<b>Вiтаю!!!</b><p><p>Ви блискучий математик!'
else
Response.Content:=
'Ви можливо забули таблицю множення<p>'+
'<a HREF="http://127.0.0.1/cgi-bin/mult.exe">'+
'<p>Спробуйте ще раз</a></p>';
Handled:=True;
end;
procedure TWebModule1.WebModule1WebActionItem2Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
// генеруємо два множники
Randomize;
Num1:=Random(8)+1; // змінні Num1 та Num2 оголошуються як глобальні !
Num2:=Random(8)+1;
Response.Content:=PageProducer1.Content;
Handled:=True;
end;
Параметр Request типу TWebRequest містить інформацію про запит, що згенерував цю дію. Параметр Response типу TWebResponse використовується для відправлення інформації до клієнта. Властивість Content є рядком, який зберігає HTML-сторінку, яка повертається до клієнта. Для динамічного формування такої сторінки використовується компонента TPageProducer сторінки Internet палітри компонент.
Розмістіть компоненту TPageProducer у модулі WebModule та задайте відповідний HTML-код, який розміщується або у властивості HTMLDoc (у вигляді текстового рядка) або у властивості HTMLFile (якщо існує файл із таким кодом):
<html>
<head>
<title>Таблиця множення</title>
</head>
<body>
<h1>Перевiрте знання таблицi множення!</h1>
<p>Запишiть у вiкнi добуток
i натиснiть кнопку "Вiдповiдь"
<form method="POST" action="http://127.0.0.1/cgi-bin/mult.exe/1">
<table>
<tr><td><input type="text" name="num1" size="1" value="<#TNum1>"</td>
<td>x</td>
<td><input type="text" name="num2" size="1" value="<#TNum2>"</td>
<td><input type="text" name="result" size="3"></td>
<td><input type="submit" name="post" value="Вiдповiдь"></td>
</tr>
</table>
</form>
<form method="POST" action="http://127.0.0.1/cgi-bin/mult.exe">
<p><input type="submit" value="Новi числа" name="New"></p>
</form>
</body>
</html>
Цей HTML-код є шаблоном, який містить спеціальні користувацькі дескриптори, які ігноруються в стандартній мові HTML: <#TNum1> та <#TNum2>. Об'єкт класу TPageProducer здатний виявляти ці дескриптори та заміняти їх відповідною інформацією. Кожен такий дескриптор обмежується дужками (< та >), а його ім'я починається із символу #.
Після призначення властивості Content іншій змінній, наприклад, Response.Content, виконується сканування HTML-коду. При виявленні в цьому коді будь-якого користувацького дескриптора генерується подія OnHTMLTag.
Визначить обробник події OnHTMLTag наступним чином:
procedure TWebModule1.PageProducer1HTMLTag(Sender: TObject; Tag: TTag;
const TagString: String; TagParams: TStrings; var ReplaceText: String);
begin
if (TagString='TNum1') then
ReplaceText:=IntToStr(Num1)
else
if (TagString='TNum2') then
ReplaceText:=IntToStr(Num2);
end;
Параметр TagString містить значення самого дескриптора, параметр ReplaceText - це рядок, який заповнюється новим значенням, призначеним для заміщення дескриптора (замість TNum1 підставляється перший множник, замість TNum2 - другий). В HTML-коді весь текст дескриптора заміняється тим значенням, яке передається назад цьому параметру.
Таким чином формується HTML-форма, яка призначена для введення значень множників та добутку. Для визначення форми та дії при натисканні користувачем кнопки "Відповідь" використовується наступний рядок:
<form method="POST" action="http://127.0.0.1/cgi-bin/mult.exe/1">
Цей код змушує форму надіслати ("post") свої дані та викликати потрібну CGI-програму у якості обробника події OnAction. На Web-сервері об'єкт класу TWebActionItem з указаним іменем (/1) зберігає отримані дані у властивості Request.ContentFields. Надалі ці дані перетворюються до цілочисельних значень, обчислюється добуток двох множників, який порівнюється з уведеним користувачем значенням після чого створюється HTML-відповідь, де користувачу повідомляється про оцінку його знання таблиці множення.
Для перевірки створеного ужитку, збережіть його під назвою mult.dpr, скомпілюйте, та перепишіть створений файл mult.exe у відповідний каталог Web-сервера (cgi-bin). Зауважте, що у коді, наведеному вище, вказана IP-адреса сервера 127.0.0.1, яка відповідає, серверу розміщеному на комп'ютері, звідки здійснюється запит. Дізнайтеся у викладача місце знаходження та назву сервера, на якому будуть запускатися створені ужитки! Після розміщення ужитку на Web-сервері, завантажте браузер Microsoft Internet Explorer та зверніться до ужитку за потрібною адресою, наприклад,
http://127.0.0.1/cgi-bin/mult.exe,
та перевірте коректність його роботи.
Завдання
Створити Web-ужиток який формує динамічні HTML-сторінки для виконання наступних задач:
Візуалізація кольору в системі RGB.
Перетворення числа з 10-ї системи числення у двійкову.
Перетворення числа з 10-ї системи числення у 16-у.
Перетворення числа з двійкової системи числення у 10-у.
Перетворення числа з 16-ї системи числення у 10-у.
Розв'язок квадратного рівняння.
Створення двомовного словника (мови вибрати самостійно).
Визначення чи число є простим.
Визначення чи два числа є взаємно простими.
Визначення поточної дати та часу.
Визначення можливості побудови трикутника за трьома сторонами
Перетворення "суми цифрами" у "суму прописом"
Перетворення "суми прописом" у "суму цифрами"
Перетворення числа з двійкової системи числення у 16-у.
Перетворення числа з 16-ї системи числення у двійкову.
Розв'язок біквадратного рівняння.
Перевірка, чи рядок є паліндромом.
Перевірка, чи число є досконалим (дорівнює сумі своїх дільників).
Перетворення числа з 2-ї системи числення у 8-у.
Перетворення числа з 8-ї системи числення у 2-у.