Мы уже знаем как настроить IIS (Internet Information Server) чтобы отображать свою страничку в сети, немного изучили ActiveX. Теперь пора написать какой-нибудь достойный пример по использованию всех этих знаний. Сегодня я раскажу тебе, как можно писать на Delphi приложения для WEB-сервера, для использования его с ASP.
Итак, для выполнения сегодняшней работы у тебя уже должен быть установлен Web-сервер с поддержкой ASP. Что такое ASP? Active Server Pages (ASP) - это сервер, который может выполнять спец сценарии и возвращать их клиенту. ASP чем-то похож на CGI, но есть несколько отличий.
В CGI клиентская часть написана на спец языке типа Perl. Клиент отправляет серверу CGI запрос и тот гененрирует на его основе HTML страничку. ASP-клиентская часть это простой HTML код с встроенным VB скриптами. ASP сервер выполняет эти скрипты и вставляет результат в ту же страницу.
Прелесть ASP в том, что клиентская часть может находится на компьютере любой платформы. Зато серверная часть может быть только на Windows NT. А почему нельзя реализовать ASP-сервер на другой платформе? Да потому что ASP использует COM технологию, реализация которой на других платформах связана с большими проблемами. Ещё одно приемущество - из одного HTML документа можно обратится сразу к нескольким ASP - серверам. Единственное ограничение - все они должны быть зарегестрированы на одном ISS сервере.
ASP - это тот же ActiveX и в нём реализовано два необходимых интерфейса - IResponse и IRequest. IResponse используется для заполнения содержимого страницы клиента. IRequest - нужен для получения переданных от клиента серверу необходимых данных. С IResponse мы вплотную познакомимся уже сегодня, а вот IRequest придётся оставить на следующий раз.
ASP сервер может быть реализован в в иде .exe или .dll файла. ASP в виде .ехе запускается на каждый запрос клиента и называется out-of-process (внешний сервер), а ASP в виде .dll загружается в память и способен обслуживать громадное количество запросов (называется он in-process, внутренный). Второй способ конечно же имеет свои приемущества, потому что после отправки запроса клиенту не приходится ждать пока загрузится ASP-сервер. Это значительно увеличивает время отклика, а значит и время загрузки клиентской части. Самое главное - .dll вариант ASP - сервера может обслуживать один все запросы, а может для каждого клиента запускать отдельную копию (как .exe вариант).
Рис 1. Создание новой ActiveX Library
Теперь перейдём к практике. Сегодня мы напишем внутренний для ASP-сервера вариант в виде dll. Щёлкни File->New и на закладке ActiveX выбери ActiveX Library (рис 1). щёлкай "OK".
Delphi приготовит для тебя заготовочку, кторая экспортирует необходимые функции:
Теперь создадим сам ASP-объект. Щёлкни File->New и на закладке ActiveX выбери Active Server Object . Перед тобой откроется окно создания нового Active Server объекта (рис 2)
Рис 2. Создание нового Active Server объекта
В качестве имени напиши "Tester", это не играет большой роли. Instancing тоже не влияет на работу нашего ASP-объекта, поэтому его оставим без изменений. А вот Threading Model очень важен. Он может иметь четыре значения:
Single - самая не эфективная, но самая защищённая модель. Сервер выполняет запросы последовательно и при одновременном обращении сразу нескольких клиентов им приходится ожидать в очереди, пока ASP - сервер не освободится. Хотя если запросы маленькие, то эта можель достаточно эффективна. Если запросы большие, то ожидание их выполнения бкдет слишком большим.
Apartment - более эффективная модель. Для каждого клиента создаётся свой экземпляр COM объекта. Мы оставим его. Недостаток - каждому объекту свой поток, а значит лишние затраты на инициализацию. При больших запросах это эффективно, но ради маленьких инициализировать новые подключения невыгодно. Слишком большие затраты на инициализацию.
Free Единственный экземпляр обслуживает кучу клиентов. При этом достигается максимальная скорость, но если пользователь работает с изменением данных, то они становятся незащищёнными. Приходится вручную изолировать данные от кождого пользователя, чтобы один запрос не испортил данные из другого запроса. Если твой объект только отправляет данные клиенту и не занимается модификацией данных, то эта модель твоя.
Both Смешанная модель. Её предпочтительность я не могу назвать. Я даже не знаю, где её эффективней использовать, потому что просто не знаю как точно она работает внутри. Знаю только, что она включает в себя сразу несколько моделей. Но какая из них и когда предпочтителней я не знаю, поэтому и не использую.
Далее идут два переключателя, с помощью которых выбирается тип работы сервера:
Page-level event methods - следует выбирать, если объект будет работать под управлением 3 или 4 версии IIS. Под пятой версией тоже работает, но под ней эфективней вторая опция.
Object Context - эта опция работает только под IIS 5.
Последний переключатель - Generate a tamplate test script for this object . Этот флажок заставляет Delphi создать HTML шаблон, который ты можешь потом использовать для тестирования сервера. Оставь её включённой, в любом случае тебе шаблон не помешает.
Жмём "ОК" и получаем уже знакомое окно с библиотекой типов:
Рис 3. Библиотека типов
Здесь мы создадим новый метод . Назовём его PrintTestText . Delphi слздаст процедуру PrintTestText в tlb модуле (уменя это ASPTester_TLB):
procedure TTester.PrintTestText;
begin
DefaultInterface.PrintTestText;
end;
А в модуле исходника (я его сохранил как TesterUnit) будет такая же функция PrintTestText, только пустая. В ней мы должны реализовать этот интерфейс:
procedure TTester.PrintTestText;
begin
Response.Write('<center><H2> Привет от ASP сервера </H2></center>');
end;
Здесь мы используем метод Write интерфейса Response для вывода HTML тегов. Если Delphi пролентяйничал и не создал заготовки, то заставь его насильно, нажав кнопку .
Скомпилируй проект. У тебя получится файл ASPTester.dll. Теперь зарегестрируй его в системе как простой ActiveX. Теперь открываем файл с расширением asp, который нам создал Delphi. Найди там строку:
<% Set DelphiASPObj = Server.CreateObject("ASPTester.Tester")
DelphiASPObj.{Insert Method name here}
%>
Замени текст {Insert Method name here} на имя нашей функции PrintTestText.
Теперь помести файл Tester.asp в директорию WEB-сервера и попробуй просмотреть его с помощью IE.
Рис 4. Результат
При тестировании ASP-сервера есть одна проблема. Один раз запученый объект (ASPTester.dll) не выгружается из памяти, поэтому ты не сможешь его удалить или перезаписать новой версией. Поэтому я тебе советую тестировать так:
Поместить ASPTester.dll в отдельную директорию. Желательно, чтобы она состояла из цифр, например "1".
Зарегестрировать его regsvr32.exe ASPTester.dll.
Протестировать.
Удалить объект из системы regsvr32.exe /u regsvr32.exe
Внести изменения и поместить новую версию в другой каталог "2".