Лабвсех
.doc
|
|||||||||||
|
|
|
|
|
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 |
||||||
Изм |
Лист |
№ Документа |
Подпись |
Дата |