Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабвсех

.doc
Скачиваний:
7
Добавлен:
14.02.2015
Размер:
4.03 Mб
Скачать

6.050103.4157з.01.04

Изм

Лист

№ Документа

Подпись

Дата

Создание динамичной ISAPI-страницы

Лит

Лист

Листов

Студент

1

5

Проподав.

НУК им. ад. Макарова

Лабораторная работа № 4

Тема: Создание динамичного веб-сайта ISAPI.

Цель: Закрепить навыки создания динамичного веб-сайта с использованием ISAPI.

Internet Server API, API для IIS Microsoft (Internet information server) веб-сервер. ISAPI позволяет

программистам разробатывать Web-приложения, которые работают намного быстрее, чем обычные программы CGI, потому что они более тесно интегрированы в веб-сервера. В дополнение к IIS, некоторые веб-серверы от компании Microsoft помимо поддержки ISAPI.

Архитектура ISAPI примерно аналогична архитектуре модулей Apache, и поддерживает не только веб-

приложения, но и фильтры, которые не более чем вносят изменения в контент, уже сгенерированный каким-то иным веб-приложением (например, поддержку разных кодировок кириллицы).

В версиях IIS4 и 5 ISAPI-приложения исполнялись технологией COM+ в процессе-загрузчике COM+

mtx.exe, запускалось по экземпляру этого многопоточного процесса на веб-приложение (директорию веб-сайта), процесс автоматически перезапускался при критических ошибках внутри веб-приложения и исполнялся от имени пользователя IWAM_ИмяМашины (WAM означает Web Application Manager – wam.dll, компоненту IIS, связывающую основной процесс с mtx.exe). Это повышало надежность и безопасность веб-сервера в целом.

Ход работы

Для создания Web-приложения из главного меню среды разработки C++Builder выберем пункт File / New

и в репозитарии объектов выберем пиктограмму 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, напоминающий обычный модуль данных.

Рассмотрим, как работает Web-приложение. Если Web-сервер получает от браузера запрос,

соответствующий спецификации CGI, он инициирует запуск CGI-приложения для его выполнения. Если запрос корректен, CGI-приложение обрабатывает его и генерирует HTML-документ, который отсылается протокол HTTP (Hyper Text Transfer Protocol).

Когда Web-приложение получает HTTP-запрос, оно создает объект TWebRequest для представления

запроса и объект TWebResponce для представления отклика, отправляемого в браузер пользователя. Затем оба объекта передаются объекту TWebModule.

Объект TWebModule содержит набор объектов TWebActionItems, хранящим информацию о том, как

обрабатывать различные пользовательские запросы. Опознав запрос, он выбирает нужный из них и выполняет соответствующий обработчик события OnAction, обрабатывающий запрос о динамически генерирующий ответ, который передается Web-сервером в браузер пользователя.

Для того чтобы приложение было работоспособным, создадим хотя бы один объект TWebActionItems,

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

Для отображения в браузере формы ввода данных пользователем создадим еще один компонент

TWebActionItem:

Установим свойство Default вновь созданного объекта TWebAction равным True. Теперь добавим в

WebModule 1 компонент TPageProducer, назначение которого – генерировать HTML-документ на основе заранее заданного шаблона.

Для создания шаблона документа можно воспользоваться любым HTML-редактором, поддерживающим

создание форм, например Microsoft FrontPage.

Исходный текст формы:

6.050103.4157з.01.04

Лист

2

Изм

Лист

№ Документа

Подпись

Дата

Index.html

<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”>

<form method=”POST”

action=”http://localhost/scripts/formproc.dll/t3”>

<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=”B1”

Value=”Reset”></font></p>

</font>

</body>

</html>

Тепрь создадим обработчик события OnAction сгенерированного нами компонента TWebActionItem2,

который находтся на веб-сервере Z://localhost/formproc.dll:

formproc.dll

void _fastcall TWebModule1:: WebModule1WebActionItem2Action(

TObject *Sender, TWebRequest *Request, TWebResponse *Response,

Bool &Handled)

{

Response->Content=PageProducer1->Content();

}

Void _fastcall TWebmodule::PageProducer2HTMLTag(

TObject *Sender, TTag Tag, constAnsiString TagString,

TStrings *TagParams, AnsiString &ReplaceText)

{

ReplaceText = Request->QueryFields->Values[TagString] +

Request->ContentFields-> Values[TagString];

}

Void _fastcall TWebModule1:: WebModule1WebActionItem3Action(

TObject *Sender, TWebRequest *Request, TWebResponse *Response,

Bool &Handled)

{

Response->Content=PageProducer2->Content();

}

Мы можем создать код, позволяющий добавлять записи в какую-нибудь таблицу, в созданный ранее

обработчик события WebModule1WebActionItem3Action (и таким образом действительно получить простейший список рассылки). Для этого необходимо добавить некоторые из компонентов доступа к данным в WebModule1 и установить соответствующие свойства:

6.050103.4157з.01.04

Лист

3

Изм

Лист

№ Документа

Подпись

Дата

Один и з способов решения этой проблемы – создание в таблице вычисляемого поля, содержащего

соответствующий HTML-тэг со ссылкой на графический файл, полученный на основе изображения, извлеченного из соответствующей записи. Именно так мы и поступим. Кроме того, необходимо учитывать, что несколько человек могут обратиться к одной и той же таблице с разными запросами одновременно, поэтому конкретный пользователь не должен видеть в своем браузере изображения, которые ему не предназначены. Этого можно достичь, например, присвоив файлам с изображениями уникальные имена:

Файл находится на веб-сервере Z://localhost/Table.dll

Table.dll

#include <vcl\jpeg.hpp>

Void _fastcall TWebModule1::TableCalcFields(

TDataSet *DataSet)

{

TDataTime 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;

}

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();

6.050103.4157з.01.04

Лист

4

Изм

Лист

№ Документа

Подпись

Дата

Результат работы:

Рисунок 1 – главная страница ввода имени и эмайла

Рисунок 2 – Результат обработки пользовательского ввода робота файла formproc.dll

Вывод:

В ходе даной лабороторной работы была создана динамическая HTML-страница, с помощью ISAPI/

6.050103.4157з.01.04

Лист

5

Изм

Лист

№ Документа

Подпись

Дата