Разработка ASP-приложений при помощи Delphi

Материал из DRKB


Разработка ASP-приложений в среде Borland Delphi 5.0

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

Все больше сайтов обзаводятся такими сервисами, как чаты, гостевые книги, голосования. Да и доступ к оперативным данным посетителям лучше предоставлять не посредством HTML-файлов, а с помощью специально разработанных программных средств. В качестве таких механизмов могут быть использованы программы, написанные на языках perl или php, а может применяться и технология Active Server Pages (ASP).

ASP-сервер обязан работать под управлением операционной системы Windows NT (Windows 98, 2000) с запущенным IIS или Microsoft Personal Web Server (PWS) и этот факт снижает возможности широкого использования ASP-серверов. По существу, ASP-сервер представляет собой внутреннюю разработку компании Microsoft, которая не была согласована с фактическими законодателями дальнейшего развития Internet-технологий (Sun, Netscape). В будущем не следует ожидать продвижения этой технологии на другие платформы, поскольку при реализации ASP-серверов использовалась COM-технология, записи в системный реестр, = а это эксклюзивные разработки компании Microsoft. И тем не менее уже сегодня существует большое количество крупных Интернет-ресурсов, использующих ASP в качестве базовой технологии.

Для начала я считаю необходимым сказать пару слов об IIS. Программное обеспечение Microsoft Internet Information Server изначально создавалось с целью сделать доступными файловые сервисы и сервисы приложений, клиентам интрасети (т. е. клиентам, работающим с универсальным средством просмотра ресурсов Интернета). Такая функциональность позволяет расширить возможности Web-клиента далеко за традиционные рамки совместного использования файлов и обеспечить поддержку ключевых бизнес-приложений. Практически все средства Windows NT Server, которые были ориентированы на создание приложений клиент/сервер, можно использовать и для разработки в среде Web. Высокая степень интеграции IIS в систему Windows NT Server обусловливает множество преимуществ данной среды перед конкурирующими решениями при использовании в качестве операционной системы Windows NT Server или Windows 2000 Server (Advanced Server).

Высокая производительность имеет большое значение для Web-серверов, находящихся как в Интернете, так и в корпоративных интрасетях. Эффективно функционирующий Web-сервер позволяет выделять больше ресурсов другим приложениям, работающим на том же компьютере. В качестве таких ресурсов могут выступать: бизнес-логика Web-приложения, системы управления базами данных или иные службы Windows NT Server. В создании IIS приняли участие разработчики и специалисты по тестированию ядра Windows NT Server, файловой системы и сетевого обеспечения. Сервер IIS дополняет возможности операционной системы по совместному использованию файлов. Будучи интегрированной службой операционной системы Windows NT Server, IIS работает совместно с системой безопасности операционной системы. Он позволяет не только сделать все каталоги, файлы, сценарии и приложения открытыми для анонимного доступа через Web, но и ограничить доступ к ним, разрешив его только определенным пользователям или их группам. Сервер использует информацию из каталога пользователей Windows NT Server, поэтому однажды созданная учетная запись откроет доступ к Web, приложениям, файлам, принтерам, электронной почте и удаленным ресурсам независимо от способа доступа. IIS поддерживает строгие правила защиты, ограничивающие несанкционированный доступ к содержимому сервера: к любому файлу следует обращаться в контексте защиты конкретного пользователя. Для защиты данных, передаваемых по сети (например, сведений о кредитных картах), используется принятая в Интернете стандартная процедура шифрования по протоколу SSL.

Сервером IIS можно управлять, используя хорошо знакомый GUI-интерфейс, HTML-интерфейс (любое средство просмотра ресурсов Интернета) или командную строку. Разработка Internet Information Server поддерживает модель программирования Windows в масштабах среды Web. Это означает, что создатели современных клиент-серверных Windows-приложений способны без переподготовки вести разработку программ для Интернета/интрасети. Благодаря интеграции серверов Microsoft Transaction Server и IIS разработчики, знакомые с клиентскими приложениями для однопользовательских систем, смогут писать программы с компонентной структурой для IIS и Active Server Pages. Сервер IIS обеспечивает автоматическое масштабирование этих программ, беря на себя такие функции, как организация множественных соединений с базами данных, управление пулами потоков и режимом конкуренции за доступ, контроль статуса общедоступных ресурсов и администрирование состояний соединений. Более того, используемые в среде Active Server Pages технологии компонентов и сценариев совместимы со средствами разработки, поддерживаемыми клиентским приложением Microsoft Internet Explorer.

Сервер IIS органично взаимодействует с другими сетевыми сервисами и службами приложений, имеющимися в составе Windows NT Server, например, со службами совместного использования файлов и принтеров, средствами удаленного доступа. Благодаря способности работать с файлами по нескольким протоколам операционная система Windows NT Server может поддерживать множество прикладных и клиентских сред. Так, разработчик приложений мультимедиа с помощью Windows NT Server может организовать общий доступ как к файлам с Windows-станций, так и с Macintosh-станций, по протоколам HTTP или FTP.

Интеграция IIS с операционной системой Windows NT Server означает, что IIS эффективно взаимодействует с серверными приложениями семейства Microsoft BackOffice. Механизм информационных объектов коллективного пользования (Collaboration Data Object) позволяет Web-приложениям непосредственно общаться, например, с Microsoft Exchange, в результате открывается возможность создания приложений электронной почты, коллективной работы и делопроизводства для среды World Wide Web. Microsoft SNA Server, опираясь на компонент Active Server Pages, обеспечивает доступ к информации, содержащейся в таких унаследованных хост-системах, как мэйнфреймы.

Но вернемся к вопросам разработки ASP-приложений. Работающее с ASP-сервером клиентское приложение представляет собой HTML-документ и может быть прочитано на любом Web-браузере. Соответственно, эти HTML-документы размещаются на каком-либо Web-сервере. Web-сервер, получив требование о предоставлении документа, считывает его из локального хранилища и передает клиенту, при этом часть информации вносится в документ динамически ASP-сервером. Принято, чтобы расширения у документов, обращающиеся к ASP-серверу, имели расширение *.asp. Примеры таких документов можно найти в директориях WINNT\SYSTEM32\INETSRV\IISADMIN и INETPUB\IISAMPLES\EXAIR, если был установлен Microsoft Internet Informational Server. Типичный пример обращения к ASP-серверу с Html-документа выглядит следующим образом:

<%
Set FileSystem=Server.CreateObject("Scrip-ting.FileSystemObject")
FileSystem.FindAllFiles
%>

Данная запись представляет собой Visual Basic (VB) скрипт. Т.к. скрипты в ASP-документах выполняются на сервере, то клиенту передается уже сформированный Html-документ. Поэтому, несмотря на наличие VB-скрипта, страница ASP может быть доступна клиентам, работающих на других операционных системах, например UNIX.

По существу, ASP-сервер представляет собой сервер OLE автоматизации, в котором предопределено несколько интерфейсов, в частности = IRequest (содержит методы, вызов которых позволяет установить параметры, заполненные на клиенте) и IResponse (вызов методов которого приводит к формированию Html-документа и передачи данного документа клиенту). По этим признакам ASP-сервер напоминает CGI-приложения и ISAPI/NSAPI dll (далее = Web-сервер приложения). Принципы выполнения методов в ASP-сервере и Web-серверных приложениях также аналогична: анализируется (если требуется) запрос клиента и динамически формируется отклик. Отличие заключается в том, что Web-серверные приложения формируют целиком Html-документ, в то время как отклик ASP-сервера вставляется в исходную HTML страницу. Например, если документ ASP представлен в виде:

<HTML>
<BODY>
<TITLE> Демонстрация Delphi ASP </TITLE>
<HR>
<% Set DelphiASPObj = Server.CreateObject("MyASP.TestASP")
DelphiASPObj.MyContent
%>
<HR>
</BODY>
</HTML>

и результат выполнения метода MyContent возвращает строку "First call to ASP server", то на экране клиентского броузера появится документ, содержащий текст "First call to ASP server", отформатированный в соответствии с тэгами документа.

Таким образом, отклик ASP-сервера добавляется к Html-документу. В одном документе допустимо обращение к нескольким ASP-серверам и результат их отклика формируется в единый документ. Этого невозможно достичь при использовании Web приложений. Однако существует ограничение: набор ASP-серверов, к которым обращаются из одного документа, обязан быть зарегистрирован на одном IIS-сервере. Нельзя обратиться по различным адресам для формирования одного Html-документа.

Широкие возможности для разработки ASP-приложений предоставляет среда разработки Borland Delphi 5 = одна из наиболее распространенных в России RAD (Rapid Application Development)-систем. Применению Delphi в этой области и будет посвящена данная статья.

Итак, ASP-сервер может быть реализован как в *.exe, так и в *.dll приложениях = это разрешается при создании сервера OLE-автоматизации. ASP-сервер, реализованный в виде exe-файла, запускается один раз в ответ на запрос клиента. При использовании внутренних (in-process) ASP-серверов один экземпляр DLL, загруженный в оперативную память, способен обслуживать одновременно нескольких клиентов. Для каждого из них может создаваться как отдельный экземпляр COM-объекта. Кроме того, единственный экземпляр COM-объекта может обслуживать нескольких клиентов. Это зависит от выбранной модели работы в потоках (Threading Model) при заполнении диалога при выборе команды File/New/ActiveX/Active Server Object.

Создадим внутренний (in-process) ASP-сервер и рассмотрим принципы его работы. Пусть сервер выполняет один запрос. Выбираем команду File/New/ActiveX/ActiveX Library и нажмем кнопку OK. Будет создан новый проект, который сохраним под оригинальным именем MyASP. Теперь вызываем из меню команду File/New/ActiveX/Active Server Object. В появившемся диалоге определим имя класса, например, TestASP (рис. 1). Поскольку мы создаем in-process сервер, параметр Instancing не играет роли, зато имеет значение параметр Threading Model. Выбор параметра Single приводит к неэффективной работе сервера = при одновременном к нему обращении нескольких клиентов сервер выполняет запросы последовательно и если один из клиентов обращается с длительным запросом, то остальные вынуждены ожидать его окончания, даже если запросы у них короткие по времени. Таким образом, создается впечатление "зависания" браузера и часто это приводит к попыткам прервать задачу разными методами. Выбор параметра Apartment приводит к разделению запросов клиентов по потокам, при этом для каждого клиента будет создан свой экземпляр COM-объекта (в данном примере, класса TTestASP). В этом случае при написании методов класса не требуется защиты переменных класса по потокам = клиент может свободно модифицировать их и это упрощает разработку кода приложения. Недостаток такой модели состоит в ресурсоемкости проекта. Кроме того, переменные класса инициализируются на каждое обращение, что удлиняет время отклика. Этих недостатков лишена модель Free, в которых единственный экземпляр COM-объекта обслуживает нескольких клиентов. Однако если клиенты могут изменять данные, то это требует защиты общих переменных по потокам, что усложняет процедуру реализации кода приложения и является потенциальным источником трудноуловимых ошибок. Как правило, эту модель используют в серверах, которые только предоставляют данные, но клиент не может их модифицировать. В нашем случае выберем модель Apartment.

Image 2021-01-02 183352.png


В этом же диалоге мы имеем возможность выбрать назначение ASP-сервера. Если планируется инсталлировать сервер на компьютере, которым управляет IIS версии 3 или 4, то следует выбрать Page Level Events Methods. С IIS5 эта опция тоже работает, но эффективнее будет работать опция Object Context. Эту же опцию необходимо выбирать, если работой ASP управляет Microsoft Transaction Server (MTS). При включенной опции Generate a Template Test Script for this object будет создан Html-документ, который в дальнейшем можно будет использовать для тестирования ASP-сервера.

После нажатия кнопки Ok будет создан файл реализации интерфейсов Unit1.pas. Сохраним его под именем TestASPUnit.pas. Кроме того, будет создана библиотека типов, появится ее редактор и файл, описывающий библиотеку типов = в данном примере MyASP_TLB.pas. Если была выбрана опция Page Level Events Methods, то библиотека типов будет содержать два предопределенных метода = OnStartPage и OnEndPage. Также будет создан файл TestASP.asp, который содержит Html-документ с заготовками VB-скриптов для тестирования сервера.

Теперь создадим метод, который будет заполнять HTML-документ. Для этого в редакторе библиотеки типов (рис. 2) отметим интерфейс ITest и вызовем команду New Method. Назовем вновь созданный метод MyContent, поместив этот текст в названии метода с мигающей кареткой. Данный метод не должен иметь параметров. Далее вызовем команду Refresh нажатием соответствующей кнопки. После этого в модуле реализации (TestASPUnit.pas) появится заготовка, где следует описать реализацию. Метод реализуем следующим образом:

procedure TTestASP.MyContent;
begin
if Assigned(Response) then Response.Write
('First call to ASP server');
end;

Здесь происходит обращение к методу Write интерфейса IResponse. Проверка Assigned(Response) гарантирует, что в момент записи сообщений присутствует ссылка на интерфейс.

Теперь необходимо изменить созданный Delphi HTML-документ для тестирования сервера, который хранится в файле TestASP.asp. В этом документе имеется следующий VB-скрипт:

Image 2021-01-02 183522.png


<% Set DelphiASPObj = Server.CreateObject("MyASP.TestASP")
DelphiASPObj.{Insert Method name here}
%>

Скрипт в данном виде работать не будет. Необходимо заменить фразу в фигурных скобках {Insert Method name here} на имя метода ASP-сервера, который генерирует отклик. В данном примере это имя MyContent. Скрипт должен выглядеть следующим образом:

<% Set DelphiASPObj = Server.CreateObject("MyASP.TestASP")
DelphiASPObj.MyContent
%>

Скомпилируйте проект, выберите пункт меню Run/Register ActiveX Server. Теперь можно приступать к тестированию. Для этого создадим виртуальную директорию на IIS, причем эта директория обязана иметь разрешение как на Read (из нее будут читаться данные), так и на Execute (из нее будет загружена и запущена MyASP.dll). Альтернатива = разместить эти файлы в разных директориях, одна из которых имеет доступ Read, а вторая = Execute. Но в любом случае выбранные директории должны экспонироваться через HTTP протокол. Поэтому в первую очередь необходимо обратиться к WWW-сервису IIS, посмотреть список доступных директорий и при необходимости создать новые с соответствующими правами доступа. В моем случае тестирование проекта осуществлялось на локальной машине. Был создан виртуальный каталог /TestASP. Далее в него были скопированы файл TestASP.asp. В Microsoft internet Explorer набираем строку

http://localhost/TestASP/TestAsp.asp

Видно, что скрипт ( текст между <% и %>) был замещен результатом выполнения метода MyContent в ASP-сервере.

Рассмотрим подробнее, каким образом выполняется скрипт в странице TestASP.asp. IIS, который получает запрос на TestASP.asp, считывает ее содержимое из хранилища, находит скрипт и выполняет ее. При этом в фоновом режиме запускается VB и вызывается команда CreateObject. Если MyASP.dll ранее не была загружена, то происходит ее загрузка. Для данного запроса создается COM объект = экземпляр класса TTestASP (он описан в модуле реализации, для нашего случая = TestASPUnit.pas). Ссылка на интерфейс IDispatch (он поддерживается в классе TTestASP) сохраняется в переменной DelphiASPObj. В дальнейшем написании кода после имени переменной, хранящей ссылку на IDispatch, можно набирать любой текст. Компилятор VB использует текст, который содержится в скрипте и следует после имени переменной (в данном примере: переменная = DelphiASPObj, метод = MyContent) для того, чтобы передать его ASP-серверу. Если ASP-сервер найдет метод с данным именем, то он его выполнит. При отсутствии метода с таким именем генерируется исключение. Поэтому при написании скриптов для ASP-сервера следует быть внимательным в названиях методов и при наличии исключений в первую очередь проверить корректность имен методов. При вызове какого-либо метода ASP-серверу становятся доступными интерфейсы IRequest и IResponse.

Перейдем к рассмотрению более сложного ASP-сервера, в котором анализируется запрос клиента при помощи методов интерфейса IRequest. В качестве задачи сервера будет выступать выполнение запроса к СУБД Oracle 8.0.5. В рамках данной статьи я не буду затрагивать вопросы создания объектов баз данных. Скажу лишь, что в нашем случае имеет место таблица Names с одним единственным полем Name. Таблица создана в схеме Demo. Ниже приведен SQL-запрос, создающий эту таблицу.

CREATE TABLE Names
(Name VARCHAR2(50)
)

Итак, сначала создадим HTML-файл, содержащий форму, с помощью которой будет вызываться на выполнение методы ASP-сервера. Примерный текст HTML-файла приведен ниже.

<head>
<title>Сложный ASP-сервер</title>
<body>
<form action="http://localhost/TestASP/TestASP.asp"
method="POST"
name="Query">
<p>Имя
<input type="text" size="50" name="field">
</p>
<p>
<input type="submit" name="button" value="Вперед!">
</p>
</form>
</body>
</html>

Сохраним этот файл под именем name.html и поместим его в каталог TestASP.

Но перед тем, как создавать модуль данных и обращаться к серверу базы данных, необходимо выяснить, каким образом анализируется запрос клиента в ASP-сервере. Запрос клиента можно анализировать при помощи вызова методов интерфейса IRequest, ссылка на который находится в свойстве Request класса TASPObject = предка класса, в котором реализуется ASP-сервер. Интерфейс IRequest предоставляет три свойства = QueryString, Form и Body в которых находятся ссылки на интерфейс IRequestDictionary. QueryString содержит параметры запроса, Form содержит список элементов управления, предоставляемых клиенту, а Body содержит данные, которые клиент ввел в эти элементы. Нам потребуются данные, поэтому ниже будет анализироваться свойство Body, но все сказанное ниже о методах IRequestDisctionary применимо и к любому другому свойству типа ICustomDictionary = QueryString, Form.

IRequestDictionary определен в модуле ASPTlb.pas следующим образом:

IRequestDictionary = interface(IDispatch)
['{D97A6DA0-A85F-11DF-83AE-00A0C90C2BD8}']
function Get_Item (Var_: OleVariant): OleVariant; safecall;
function Get__NewEnum: IUnknown; safecall;
function Get_Count: SYSINT; safecall;
function Get_Key (VarKey: OleVariant): OleVariant; safecall;
property Item [Var_: OleVariant]: OleVariant read Get_Item; default;
property _NewEnum: IUnknown read Get__NewEnum;
property Count: SYSINT read Get_Count;
property Key [VarKey: OleVariant]: OleVariant read Get_Key;
end;

Свойство Count содержит число элементов управления на форме. Для формы, содержащейся в name.html, оно равно 2. Свойство Key = имена элементов управления = в нашем случае это имена field и button. И, наконец, свойство Item содержит значения, введенные пользователем.

Следует помнить, что в коллекции Key[] индексы начинаются с единицы, а не с нуля. Все же, обращаясь к коллекции Key с соответствующим индексом = 1 или 2 для примера выше, можно получить названия контролей в виде строковых переменных.

Сделаем небольшое дополнение к проекту. Воспользовавшись редактором библиотек типов, создадим новый метод RequestProp. Введем следующий код для этого метода.

procedure TTestASP.RequestProp;
var
  S:string;
  V:OLeVariant;
  I,J,N:integer;
begin
  S := '';
  if Assigned(Request) then
    if Request.Body.Count>0 then
    begin
      for I := 1 to Request.Body.Count do
      begin
        S := S + 'Key' + IntToStr(I) + '=' + Request.Body.Key[I] + '<BR>';
        V := Request.Body.Item[I];
        if not VarIsEmpty(V) then
          if varType(V) = varDispatch then
          begin
            N := V.Count;
            S := S + 'ItemCount' + IntToStr(I) + '=' + IntToStr(N) + '<BR>';
            if N > 0 then
              for J := 1 to N do
                S := S + V.Item[J] + '<BR>';
          end;
      end;
    end;
  if Assigned(Response) then Response.Write(S);
end;

Скомпилируем проект и в созданном ранее файле TestASP.asp изменим VB-скрипты следующим образом: вместо строки DelphiASPObj.MyContent напишем строку DelphiASPObj. RequestProp. После этого в Internet Explorer следует обратиться к name.html следующей строкой:

http://localhost/TestASP/name.html

Image 2021-01-02 183621.png


В полученной форме (рис. 3) введите любое значение в строку ввода и нажмите кнопку "Вперед!". После этого получим результат выполнения приведенного выше кода метода RequestProp:

Key1=field
ItemCount1=1
some
Key2=button
ItemCount2=1
Вперед!

Таким образом, для определения параметров, введенных клиентом в какой-либо элемент управления, необходимо просмотреть все ключи, найти индекс интересующего нас контроля (в данном примере это 1, что соответствует ключу field) и извлечь значение, введенное клиентом, посредством вызова команды Request.Body.Item[Index].Item[1].

В имеющемся ASP-сервере создадим новый метод для доступа к базам данных. Поместим на него невизуальные компоненты доступа к данным (визуальные компоненты нельзя использовать в ASP-сервере). Вообще, в приложениях такого типа = ASP, ISAPI/NSAPI, CGI показ модальных форм с элементами управления (а диалоги = частный вид таких форм) ни к чему хорошему не приводит. При попытке показать диалог будут созданы элементы управления на диалоге, на них будет помещен текст и\или графика и приложение будет ожидать закрытия диалога (по нажатию кнопки OK или Cancel) чтобы продолжить свою работу. Дело в том, что диалог невидим. Поэтому его нельзя закрыть ни нажатием кнопок (они не получают сообщения OnClick), ни акселератором (сигналы с клавиатуры не посылаются невидимым элементам управления). Визуально программист наблюдает следующее: приложение "висит", отклик с ASP-сервера клиент не получает, и для повторной компиляции проекта требуется перезагрузка системы. Даже если команды показа диалогов отсутствуют в ASP-сервере, они могут быть показаны в процессе работы приложения, например, BDE пришлет сообщения об ошибке. Поэтому данный факт надо принимать во внимание при написании кода, где необходимо тщательно проверять данные перед их использованием, чтобы внешние приложения не сообщали об ошибках.

Традиционно доступ к данным осуществляется с помощью BDE, при этом используются компонеты TSession, TDatabase и TQuery. Однако лучше всего при разработке ASP-серверов использовать альтернативный способ доступа к данным, появившийся в Delphi 5 = ADO (Active Data Objects). Для работы с ADO прежде всего необходимо использовать компонент TADOConnection. Поставим его на форму. В инспекторе объектов выберем свойство ConnectionString и вызовем диалог для создания строки. В предложенном диалоге выбираем Microsoft OLE DB Provider for Oracle и нажимаем кнопку Next (рис. 4).

Image 2021-01-02 183652.png


На следующей странице диалога необходимо указать имя сервера (в данном примере = beq-local) и параметры аутентификации = имя пользователя (Demo) и пароль (pwd = не обязательно именно этот, любой, который вы сами укажете при создании пользователя Demo). Обязательно должна быть установлена метка в элементе управления Allow Saving Password, = иначе ASP-сервер попытается вывести на экран диалог для входа в систему. Протестировать соединение можно нажатием кнопки Test Connection = если все нормально, то вы должны увидеть сообщение об успешном соединении с сервером.

Далее в инспекторе объектов установите свойство LoginPromp в False. Проверить правильность установок можно при помощи изменения свойства Connected в True, при этом не должен появиться Login-диалог или информация о генерации исключения.

Поставим компонент TADOQuery на модуль данных и в свойстве Connection сошлемся на определенный выше компонент ADOConnection1.

Модуль данных, не создается автоматически при вызове эксперта для создания ASP-сервера, поэтому его необходимо создавать отдельно. Добавляем модуль данных к проекту путем вызова команды File/New/Data Module. Назовем созданный модуль данных ASPDataModule, а сам файл запомним под именем ASPDataModuleUnit.pas. Созданный модуль не будет создаваться автоматически при старте приложения или при обращении клиента, поэтому необходимо переписать конструктор и деструктор класса TTestASP, реализация которого находится в файле TestASPUnit.pas. Сошлемся на модуль ASPDataModuleUnit.pas в модуле TestASPUnit.pas.

В объявлении класса TTestASP в секции private определим переменную FData типа TASPDataModule. В секции public объявим процедуры AfterConstruction и BeforeDesctruction c обязательной директивой override:

TTestASP = class(TASPObject, ITest)
private
  FData:TDataModule1;
protected
public
  procedure AfterConstruction; override;
  procedure BeforeDestruction; override;
end;

реализуем процедуры AfterConstruction и BeforeDestruction в секции реализации:

procedure TTest.AfterConstruction;
begin
  inherited;
  FData := TDataModule1.Create(nil);
end;

procedure TTest.BeforeDestruction;
begin
  if Assigned(FData) then
  begin
    FData.Query1.Active := False;
    FData.ADOConnection1.Connected := False;
    FData.Free;
  end;
  inherited;
end;

Теперь создадим метод в библиотеке типов и назовем его QueryResponse. Реализуем его следующим образом:

procedure TTest.QueryResponse;
var
  S: string;
  I, J: integer;
begin
  S := Request.Body.Item[1].Item[1];
  if FData.ADOQuery1.Active then FData.ADOQuery1.Close;
  FData.ADOQuery1.SQL.Clear;
  FData.ADOQuery1.SQL.Add('Select * from EMP');
  FData.ADOQuery1.SQL.Add('where name like '+CHR(39)+S+'%'+CHR(39));
  FData.ADOQuery1.Active := True;
  if FData.ADOQuery1.RecordCount > 0 then
  begin
    FData.ADOQuery1.First;
    for J:=0 to FData.ADOQuery1.Fields.Count-1 do
      Response.Write(FData.ADOQuery1.Fields[J].FieldName+' ');
    Response.Write('<BR>');
    for I:=1 to FData.ADOQuery1.RecordCount do
    begin
      for J:=0 to FData.ADOQuery1.Fields.Count-1 do
        Response.Write(FData.ADOQuery1.Fields[J].AsString+' ');
      Response.Write('<BR>');
      if I < FData.ADOQuery1.RecordCount then FData.ADOQuery1.Next;
    end;
  end;
end;

В данном методе динамически создается SQL-запрос, при этом используются параметры, введенные клиентом в форму. Затем осуществляется обращение к SQL-серверу и возвращаемые данные помещаются в HTML-документ. В созданном ранее файле TestASP.asp изменим VB-скрипты следующим образом: вместо строки DelphiASPObj.MyContent напишем строку DelphiASPObj.QueryResponse. После этого в Microsoft Internet Explorer обращаемся к странице name.html. Результат выполнения запроса приведен на рисунке 5.

Image 2021-01-02 183725.png


При использовании ASP-сервера можно поместить параметры, необходимые для его работы, в Html-документ. Эти параметры могут редактироваться в документе и, таким образом, можно изменять опции под определенный сайт. Это является удобным при распространении ASP-сервера: купившая его компания может изменить начальные установки так, чтобы они отвечали требованиям компании. Для этого достаточно отредактировать Html-документ, что может быть сделано при использовании специалистов низкой квалификации. Пример проиллюстрируем следующим образом: определим в заголовке класса TTestASP (TestASPUnit.pas) две переменные: FCompanyName:string и FCopyrightYear:string; Определим в библиотеке типов два новых свойства: CompanyName:string и CopyrightYear:integer. На методы *Read и *Wirte для этих свойств определим чтение и возврат данных из описанных выше переменных. Добавим новый метод в библиотеку типов ShowCopyright, который реализуем следующим образом:

procedure TTestASP.ShowCopyright;
var
  S: OLEVariant;
begin
  S := Format('Copyright (C) %d by %s',[FCopyrightYear,FCompanyName]);
  if Assigned(Response) then Response.Write(S);
end;

В созданном ранее файле TestASP.asp изменим VB-скрипты:

<% Set DelphiASPObj = Server.CreateObject("MyASP.Test")
DelphiASPObj.CompanyName = "My Company"
DelphiASPObj.CopyrightYear = 1999
DelphiASPObj.ShowCopyright
%>

Если в файле TestASP.asp изменить имя компании, а это можно сделать при помощи любого текстового редактора, то все изменения будут отражаться в HTML-документе.

Естественно, в рамках одной статьи невозможно рассказать обо всех сторонах использования Active Server Pages, потому что, как вы понимаете, ASP является одной из наиболее перспективных Internet-технологий.


Author: Сергей Кривошеев
Source: http://www.comprice.ru/articles/detail.php?ID=42541
ID: 03427