Asp объект application


Содержание

Asp объект application

Описание объекта Application

Вы можете использовать данный метод для того, чтобы сделать доступной информацию между всеми пользователями данного приложения. Основанное на ASP приложение определено как все .asp-файлы в виртуальной директории и всех ее поддиректориях. Из-за того, что объект Application может быть доступен («зашарен») более чем одному пользователю, то в нем предусотренно два метода — Lock и Unlock (заблокировать и разблокировать) для того, чтобы быть уверенным, что сразу несколько пользователей не смогут попытаться изменять свойства одновременно.

Вы можете хранить свои значения в коллекциях данного объекта: Application.Contents и Application.staticObjects. Информация, сохраненная в коллекции Application доступны через приложение. Следующий скрипт демонстрирует запись двух типов переменных.

Application(«greeting») = «Добро пожаловать на наш вэб-сервер!»
Application(«num») = 25
%>

Для каждой из этих переменных предполагается их членство в коллекции Application Contents.

Вы можете также связать компонент с переменной. Если вы связываете сомпонент к переменной с помощью объекта Server.CreateObject, то переменная будет членом коллекции Application.Contents. Если переменная связана с тэгом , то переменная будет членом коллекции Application StaticObjects.

Если вы связываете конкретный компонент с переменной в коллекцией Application Contents Collection и используете Visual Basic Scripting Edition как основной язык написания скриптов, вы должны использовать ключевое слово Set. Это иллюстрированно следующим примером.

Вы можете также определить методы и свойства компонента MyComponent следующим скриптом

или путем создания локальной копии объекта и использования его следующим образом:

Set MyLocalObj1 = Application(«Obj1»)
MyLocalObj1.MyObjMethod
%>

Другой способ, чтобы создать объект с использованием тэга в файле Global.asa. Для более полной информации смотрите описание Global.asa.

Вы не можете хранить встроенные объекты в объекте Application. Для примера, каждый из следующих строк будет вызывать ошибку:

Set Application(«var1») = Session
Set Application(«var2») = Request
Set Application(«var3») = Response
Set Application(«var4») = Server
Set Application(«var5») = Application
Set Application(«var6») = ObjectContext
%>

Если вы храните массив в объекте Application то вы не должны пытаться обращаться к элементам, хранящимся в массиве напрямую. К примеру, следующий скрипт не работает

Настоятельно рекомендуется чтобы, если вы храните массив в объекте Application, вы получили копию массива прежде чем считывать или изменять любые его элементы. Кода вы сделали такую копию вы можете изменить или считать любые его элементы и измененную локальную копию сохранить обратно в Application. Данный прием мы продемонстрируем в следующем примере:

—file1.asp—

‘Создаем и инициируем массив
dim MyArray()
Redim MyArray(5)
MyArray(0) = «привет!»
MyArray(1) = «какая-либо другая строка»

‘Запоминание массива в объекте Application
Application.Lock
Application(«StoredArray») = MyArray
Application.Unlock

—file2.asp—

‘Получение массива из объекта Application
‘и модицикация второго элемента
LocalArray = Application(«StoredArray»)
LocalArray(1) = » Люди!»

‘вывод строки «привет! Люди!»
Response.Write(LocalArray(0)&LocalArray(1))

‘Перезапись массива в объект Application
‘Данное действие перепишет значения в StoredArray на новые
Application.Lock
Application(«StoredArray») = LocalArray
Application.Unlock
%>

Следующий пример использует переменную NumVisits для хранения числа посещений, когда страница была получена клиентом. Метод Lock вызывается тогда, когда есть возможность того, что к переменной NumVisits может возникнуть паралелльное обращение. Вызывая метод Unlock вы разрешаете обращаться к данной переменной (объекту Application) другим пользователям.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель этой страницы!

Коллекция Application. Contents

Коллекция Contents группирует все элементы, которые были добавлены приложением через команды скрипта. Вы можете использовать коллекцию Contents чтобы получить список элементов, которые были получены приложением или чтобы указать какой из элементов будет использован в данной операции.

ключ
Указанное имя элемента для его получения.

Коллекция Application.Contents содержит те элементы которые были определены на уровне приложения без использования тэга . Это касается обеих объектов — созданных с использованием Server.CreateObject и с использованием скалярных переменных установленных через определение Application. В следующем скрипте, к примеру, оба и MyVar и MyObj будут членами коллекции Application.Contents.

Application(«MyVar») = «Привет!»
Set Application(«MyObj») = Server.CreateObject(«MyComponent»)
%>

Коллекция Application.Contents поддерживает циклы типа For. Each и For. Next.
Следующие два примера иллюстрируют каждый из вышеуказанных методов циклов использования Application.Contents.

For Each Key in Application.Contents
response.write («key»)
Next Key
%>

For i = 1 to Application.Contents.Count
response.write(«key»)
Next Key
%>

Коллекция Application. StaticObjects

Коллекция StaticObjects содержит все объекты, созданные с использованием тэга и объекта Application. Вы можете использовать коллекцию для того, чтобы определить значения указанных свойств для объекта или создать цикл по коллекции и получить все свойства для всех статических объектов.

ключ
Указанное имя элемент для обращения к нему.

Вы можете использовать управление циклом чтобы перебирать ключи в коллекции StaticObjects. Это продемонстрированно следующим примером:

For Each ObjProp in Application.StaticObjects
response.write(ObjProperty & » : » & Application.StaticObjects(ObjProp) & «
«)

Метод Application. Lock

Метод Lock блокирует для других клиентов переменные, хранимые в объекте Application от изменеия. Потому, как только один клиент может в данный момент времени получить доступ к переменным объекта. Если вы не вызываете метод Unlock после обработики переменных, то сервер сам разблокирует данный объект, когда истечет время (timeout) работы скрипта .asp.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель данной страницы.

В предыдущем примере метод Lock предохраняет переменную NumVisits объекта Application от доступа к нему одновременно нескольких клиентов. Если бы приложение не было бы заблокированно, то два клиента попробывали-бы одновременно увеличить значение переменной NumVisits.

Метод Application. Unlock

Метод Unlock разблокирует заблокированные ранее переменные c помощью метода Lock.

Application.Lock
Application(«NumVisits») = Application(«NumVisits») + 1
Application.Unlock
%>

Вы посетитель данной страницы.

В предыдущем примере метод Unlock разблокирует переменную NumVisits объекта Application, заблокированную ранее объектом Lock от доступа к нему одновременно нескольких клиентов.

Событие Application_OnEnd

Данное событие активизируется, когда приложение закрывается, а точнее после события Session_OnEnd. Только встроеные объекты Application и Server доступны.

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Вы не можете вызывать метод MapPath (объект Server) в подпрограмме Application_OnEnd.

Событие Application_OnStart

Данное событие активизируется, когда активируется новая сессия, такая, как, к примеру, Session_OnStart. Только встроенные объекты Application и Server доступны. Обращение к объектам Session, Request или Response в подпрограмме Application_OnStart вызовет ошибку.

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Уроки ASP-технологий

Объект Application

Теперь давайте рассмотрим объект Application. Он предназначен для хранения глобальных переменных ASP-приложения, то есть переменных, которые доступны каждому сеансу приложения. Эти переменные находятся в коллекции Contents, к которой обычно обращаются сокращенно. Например, запишем следующий код в файл default.asp.

Затем создадим файл test.asp и наберем такой код:

После этого исполним сценарий default.asp, а затем test.asp. Последний выведет строку test в окне браузера. Вообще, в какой бы сценарий приложения мы не вставили код test.asp, результат будет одним и тем же.

Объект Application предоставляет разработчикам два метода:

  • Метод Lock
  • Метод Unlock

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

Кроме коллекций и свойств у объекта Application есть два события: Application_OnEnd и Application_OnStart, которые мы рассмотрим чуть позже.

Объект Session

Этот объект предназначен для управления сеансами. Он имеет четыре свойства:

  • CodePage
  • LCID
  • SessionID
  • TimeOut

Первые два свойства — это таблица кодировки и идентификатор локали. Их мы рассматривать не будем, так как они практически не используются.

Свойство SessionID доступно в режиме «только для чтения» и возвращает уникальный идентификатор сеанса. Использование:

Свойство TimeOut отвечает за время, через которое движок ASP прервет сеанс и удалит всю связанную с ним информацию на сервере. Установка этого свойства не позволяет оставлять данные о конкретном пользователе на сервере после того, как он отключился. Принимает значения в минутах. Например:

Объект Session имеет один метод — Abandon, который позволяет принудительно прервать сеанс до истечения срока, указанного в свойстве TimeOut. Пример использования:

В объекте Session, как и в объекте Application, можно хранить данные. Для этого используются переменные уровня сессии. Например:

Кроме того, объект Session предоставляет разработчикам два события: Session_OnStart и Session_OnEnd, которые мы рассмотрим немного ниже.

Файл Global.asa


С чего начинается … нет, не Родина :-) — web-приложение? Ответ такой: с файла Global.asa. Он является главным файлом приложения. В этом файле могут существовать только следующие элементы:

  • Четыре события: Application_OnStart, Application_OnEnd, Session_OnStart, Session_OnEnd;
  • Тэги
    Атрибут RUNAT всегда принимает значение Server. Атрибут SCOPE определяет область видимости компоненты (Application или Session). ID — это идентификатор, с помощью которого в дальнейшем можно будет получить доступ к объекту. Далее вы указываете PROGID или CLASSID, которые нужны, чтобы идентифицировать компонент.

Например, вы хотите создать экземпляр компонента BrowserCapabilities (он рассматривался выше), который был бы доступен каждому сеансу приложения. Для этого в файле global.asa необходимо написать примерно следующий код:

После этого вы получаете доступ к свойствам и методам данного компонента из любого сценария вашего приложения простым обращением к переменной MyBrowser. Например:

Также экземпляры ActiveX-компонентов можно создавать с помощью подключения библиотеки типов данной компоненты. Делается это следующим образом:

Атрибут TYPE всегда принимает значение TypeLib. В атрибуте FILE необходимо указать путь к библиотеке типов вашего компонента. UUID — это уникальный идентификатор этой библиотеки. Указывать можно либо FILE, либо UUID. VERSION — это, естественно, версия компоненты :-). Атрибут LCID отвечает за идентификатор локали.

Например, у вас есть библиотека динамической компоновки MyLib.dll, а у нее есть библиотека типов MyLib.lib. Вы можете подключить ее в файле global.asa вот таким способом:

Затем в любом сценарии приложения можно использовать этот компонент следующим образом:

Иллюстрированный самоучитель по Architecture .NET

Состояния в приложениях ASP.NET. Статические элементы данных. Объект Application (Приложение). Объект Session (Сеанс).

Сохранение состояния при запросах, посылаемых по протоколу передачи гипертекстовых файлов HTTP, – главная проблема в Web-программировании ASP.NET предоставляет для этого несколько удобных функций Необходимо сохранять два типа состояния.

  • Состояние приложения – глобальная информация, которая совместно используется всеми пользователями Web-приложения
  • Состояние сеанса используется для хранения данных конкретного пользователя, который многократно обращается к Web-приложению

Статические элементы данных

Статические элементы данных класса совместно используются всеми экземплярами класса. Следовательно, статические элементы данных могут использоваться для хранения состояния приложения.

Объект Application (Приложение)

Глобальная информация приложения хранится во встроенном объекте Application (Приложение), который является экземпляром класса HttpApplicationState. Удобно получать доступ к этому объекту через свойство Application (Приложение) класса Page (Страница). Класс HttpApplicationState содержит словарь в формате «ключ – значение», используемый для хранения как объектов, так и скалярных величин.

Объект Session (Сеанс)

Информация о сеансе индивидуальных пользователей может храниться во встроенном объекте Session (Сеанс), который является экземпляром класса HttpSession-State. Доступ к этому объекту удобно получать с помощью свойства Session (Сеанс) класса Page (Страница). Класс HttpSessionState, аналогично классу HttpApplicationState, имеет словарь в формате «ключ – значение», который можно использовать для хранения как объектов, так и скалярных величин.

При реализации переменных сеанса возникают некоторые интересные вопросы.

  • Обычно для идентификации сеанса, от которого поступил запрос, используются небольшие фрагменты данных о предыстории обращений данного пользователя к данному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies). Что делать, если такие фрагменты данных (cookies) не поддерживаются браузером, или отключены пользователем?
  • Поддержка состояния сеанса для многих пользователей влечет накладные расходы. Истекает ли срок действия состояния сеанса после определенного периода времени?
  • Высокопроизводительными Web-узлами используется группа серверов. Каким образом приложение может получить необходимые ему данные, если второй запрос обслуживается не той машиной, которой обслуживался первый запрос?

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

По умолчанию небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies), в ASP.NET используются для идентификации сеанса, в котором отправлен запрос. Но ASP.NET можно сконфигурировать так, чтобы при выполнении не создавались эти небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, обычно автоматически создаваемые сервером на машине пользователя (cookies).

В такой модели идентификатор сеанса (Session ID), который обычно сохраняется в небольшом фрагменте данных о предыстории обращений конкретного пользователя к конкретному WWW-серверу, автоматически создаваемом сервером на машине пользователя (cookie), внедряется в унифицированный указатель информационного ресурса (URL). Конфигурация, где не используются небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies), обсуждается в следующем разделе.

Предельное время ожидания для состояния сеанса

По умолчанию, предельное время ожидания для состояния сеанса истекает после 20 минут. Это означает, что если данный пользователь находится в состоянии ожидания (простоя) в течение указанного периода времени, сеанс прекращается, и запрос от клиента теперь будет обрабатываться как запрос от нового пользователя, причем будет создан новый сеанс. Как и другие параметры, предельное время ожидания указывается в файле конфигурации, – это мы обсудим в разделе «Конфигурация ASP.NET».

Хранение состояния сеанса

С помощью модели состояния сеанса, которая отделяет хранение информации от использования сохраненной информации приложениями, ASP.NET полностью решает не только проблему группы серверов, но и много других проблем. Модели состояния позволяют реализовать различные сценарии хранения так, чтобы не затрагивать при этом код приложения. Сервер состояния .NET не имеет «активных» объектов для запросов. Вместо этого в конце каждого сетевого запроса все объекты в коллекции сеанса преобразуются в последовательную форму, чтобы запомнить состояние сеанса. Когда тот же самый клиент возвращается к странице, объекты сеанса преобразуются из последовательной формы в параллельную.

По умолчанию, состояния сеанса кэшируются, и поэтому, как правило, хранятся в оперативной памяти. Конечно, в конфигурации можно указать, что в качестве кэша следует использовать память определенной машины или же что состояния сеанса нужно сохранять в базе данных SQL-сервера. В этих случаях данные не привязаны к определенному серверу, и потому данные сеанса могут безопасно использоваться группой серверов.

Создание ASP-компонентов в Delphi 6

Что такое ASP

SP (Active Server Pages) — технология, которая позволяет создавать Web-страницы, содержащие код, выполняемый Web-сервером, и динамически формировать Web-страницы. Вместе с Microsoft Internet Information Services поставляется несколько COM-объектов, выполняющих серверный код. Современная версия этой технологии позволяет использовать в ASP-страницах произвольные серверные компоненты. Клиентское приложение, использующее ASP-объекты, представляет собой HTML-документ (куда могут также входить клиентский и серверный коды на скриптовых языках), который можно прочесть практически с помощью любого Web-браузера. Обычно эти HTML-документы размещаются на каком-либо Web-сервере (как правило, это Microsoft Internet Information Server версии 3.0 и выше). Web-сервер, получив требование о предоставлении документа, считывает его из локального хранилища и передает клиенту, при этом часть информации вносится в документ Web-сервером динамически; сам же Web-сервер в этом случае может обращаться к ASP-объектам (входящим в комплект поставки Internet Information Server или созданным сторонними разработчиками). Как правило, Web-документы, содержащие обращения к ASP-объектам, имеют расширение *.asp. Примеры подобных документов можно найти в каталогах, создаваемых при установке Internet Information Server.

Ранее (см. Компьютер Пресс, №2’2001, c. 169) мы рассказывали о создании простейших ASP-приложений, в том числе для работы с базами данных. Настоящую публикацию следует рассматривать как продолжение той статьи.

Объекты, используемые в ASP

ерархию объектов, используемых в технологии ASP, можно увидеть на рис. 1.

Объект Request

Объект Request используется для доступа к данным, которые формируются клиентом при обращении к ASP-серверу. Доступ к объекту Request получают с помощью интерфейса IRequest, которому присущи следующие основные свойства и методы:

  • свойство ClientSertificate — содержит значения всех полей клиентного сертификата, которые пересылаются в http-сообщении;
  • свойство Cookies — содержит значения всех заголовков Cookie в HTTP-запросе. Cookie — небольшие текстовые файлы, которые запоминаются на компьютере конечного пользователя и передаются на сервер в каждом запросе. С их помощью можно создать «сессию» для клиента: когда клиент обращается первоначально к одной, затем к другой странице и т.д. (при этом клиент не имеет права перейти к следующей странице, не обратившись к предыдущей);
  • свойство Form — если клиент осуществляет обращение к ASP-серверу с помощью формы, то можно получить значения заполненных полей в форме при обращении к свойству Form с добавлением имени поля;
  • свойство ServerVariables — содержат большинство переменных, необходимых для формирования HTTP-заголовков;
  • свойство TotalBytes — суммарное число байт, которые передаются клиентом на сервер. Реальное число байт может быть меньше, так как протокол HTTP не позволяет пересылать пакеты, размер которых превышает 8 Kбайт;
  • свойство QueryString — содержит имена и значения полей запроса при использовании метода GET;
  • свойство Body — содержит имена и значения полей запроса при использовании метода POST;
  • метод BinaryRead — используется для получения содержимого всего запроса, посылаемого клиентом, если размер запроса превышает 8 Kбайт. Вызов этого метода позволяет получить следующие 8 Kбайт данных HTTP-запроса. Вызов следует повторять до тех пор, пока не будет прочитан весь запрос; при этом размер последнего пакета может быть менее 8 Kбайт. Результаты вызова метода запоминаются в двоичном массиве. Следует обратить внимание на то, что после вызова этого метода нельзя обращаться к свойству Form.

Объект Response

В этом классе формируется отклик ASP-сервера, который передается клиенту. Доступ к этому объекту осуществляется через интерфейс IResponse. Основные свойства и методы данного интерфейса таковы:

  • свойство Cookies — позволяет создать коллекцию параметров вместе с их значениями. К этой коллекции также добавляется время, в течение которого данную коллекцию следует сохранять в клиентском приложении. При успешном получении отклика клиент запоминает эти параметры на диске в виде файла. При следующем обращении к серверу эти данные будут переданы в запросе и их можно будет получить при использовании свойства Request.Cookie. Анализ этих данных позволяет определить, обращался ли клиент к серверу ранее и если обращался, то с какими запросами. Cookie используются для создания «сессии» с клиентом в CGI-приложениях, поскольку IP-адреса клиента могут изменяться Proxy-серверами во время сессии. В ASP-приложениях возможно также создание сессии для клиента (это мы обсудим ниже);
  • свойство Buffer — если значение этого свойства равно True, то осуществляется буферизация отклика. При этом значении параметра отклик клиенту не отправляется до тех пор, пока не будет вызван метод Request.End (этот метод автоматически вызывается после обработки всего ASP-документа, то есть когда сформированы отклики от всех ASP-серверов) или Flush;
  • свойство CacheControl — определяет, может ли клиент кэшировать отклик;
  • свойство Charset — определяет имя шрифта для содержимого отклика ContentType=”text/html”;
  • свойство ContentType — указывает содержимое отклика. По умолчанию это свойство имеет значение text/html. Это значение необходимо изменять, например, при передаче картинок (image/jpeg или image/gif и т.д);
  • свойство Expires — при значении CacheControl=True определяет, сколько времени хранится отклик на клиентском месте;
  • свойство ExpiresAbsolute — то же самое, что Expires, только определяет абсолютную дату и время хранения отклика;
  • свойство IsClientConnected — указывает, был ли клиент отсоединен от сервера;
  • свойство Status — нормальное значение статуса «200 OK» означает успешную генерацию отклика. При невозможности создать отклик следует изменять значение статуса. Так, «401 Unauthorized» означает, что пользователю запрещено обращаться к данной странице по соображениям безопасности, например в случае неправильно введенного пароля;
  • метод AddHeader — добавляет заголовок в отклик. Заголовки добавляются в виде =” ”;
  • метод AppendToLog — добавляет строку в Log-файл Web-сервера. Эта строка не передается клиенту;
  • метод BinaryWrite — формирует двоичный отклик. Чаще всего используется для передачи клиенту картинок;
  • метод Clear — полностью очищает отклик. После этого его требуется формировать заново с самого начала;
  • метод End — прекращает обработку ASP-документа и немедленно возвращает результат клиенту. Вызывается автоматически после завершения обработки ASP-документа, но может быть вызван явно из кода ASP-сервера. После его вызова вызовы методов Write или BinaryWrite запрещены;
  • метод Flush — отправляет текущее содержимое буфера клиенту. Формирование отклика может продолжаться дальше;
  • метод Write — используется для записи текстовой информации в отклик;
  • метод Redirect — позволяет переадресовать запрос на другой URL. При этом можно поменять параметры запроса в объекте Request.

Объект Server

Этот объект позволяет обращаться к Internet Information Services и экспонирует ряд его методов и свойств:

  • свойство ScriptTimeout — время в минутах, в течение которого сессия существует без генерации нового запроса или без вызова команды Refresh со стороны клиента;
  • метод CreateObject — вызов этого метода используется для запуска COM-сервера, который будет принимать скрипты с ASP-документа и генерировать отклик, который вставляется вместо скрипта;
  • метод Execute — выполняет скрипт в указанном ASP-файле;
  • метод GetLastError — возвращает объект ASPError, в котором можно получить полную информацию о последней ошибке;
  • метод HTMLEncode — заменяет зарезервированные символы в HTML-документе подходящим набором символов, которые интерпретируются браузером и позволяют клиенту увидеть на экране зарезервированные символы. Например, дизайнер Web-сайта хочет, чтобы клиент увидел на экране следующее сочетание символов:
    . Если эту последовательность вставить в HTML-документ, то она будет интерпретирована как разрыв строки. Для этой последовательности символов метод HTMLEncode вернет: %3CBR%3E. При помещении этой последовательности символов в HTML-документ клиент увидит на экране
    ;
  • метод MapPath — конвертирует путь, выраженный в терминах виртуальных каталогов (абсолютный или относительный), в путь к физическому каталогу на данном компьютере;
  • метод Transfer — пересылает весь текущий отклик к другому ASP-серверу для продолжения формирования отклика;
  • метод URLEncode — перекодирует URL, включая специальные символы, в строку.

Объект Session

Этот объект создается во время первого обращения клиента к ASP-серверу. Замечательная особенность этого объекта — его способность сохраняется в течение некоторого времени после генерации отклика клиенту. Если в течение этого времени клиент вновь обратится к серверу, то сможет работать внутри ранее созданной сессии. Если внутри этого объекта объявить переменные, то в них можно запоминать состояние клиента. Этот факт значительно облегчает проведение сессий с клиентом по сравнению с CGI-приложениями, где постоянно приходится анализировать Cookie. Основные свойства и методы объекта Session:

  • свойство StaticObjects — коллекция всех объектов, добавленных к сессии при помощи тэга . Можно прочитать или изменить все значения свойств этих объектов. Вызов метода Remove удаляет данный объект. Вызов метода RemoveAll удаляет все объекты;
  • свойство Contents — коллекция всех динамически создаваемых объектов. Эти объекты можно создавать во время выполнения и использовать их при последующих обращениях клиентов к Web-серверу;
  • свойство CodePage — указывает страницу кодировки символов, которая может изменяться в зависимости от локальных настроек;
  • свойство LCID — языковой идентификатор, используемый для интерпретации текстовых строк;
  • свойство SessionID — идентификатор сессии для данного клиента. Генерируется автоматически и является постоянным для всех запросов данного клиента;
  • свойство Timeout — время в минутах, в течение которого существует сессия без генерации нового запроса или без вызова команды Refresh со стороны клиента;
  • метод Abandon — разрушает сессию и возвращает все ресурсы;
  • событие Session_OnStart — генерируется в момент создания сессии. Оно генерируется после события Application_OnStart, но до начала выполнения кода. Все переменные в сессии уже являются доступными, и к ним можно обращаться. Обработчик этого события должен быть написан на языке VBScript или JavaScript;
  • событие Session_OnEnd — наступает перед разрушением сессии по истечении времени TimeOut или после вызова метода Abandon. В обработчике событий можно работать с объектами Application, Server и Session, но не с Request и Response. Обработчик этого события должен быть написан на языке VBScript или JavaScript.

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

Рассмотрим в качестве примера Интернет-магазин. Предположим, пользователь на первой Web-странице выбирает наименование товара (например, Intel Processor), на второй странице — количество этого товара (например, 5), на третьей странице отображается цена, после чего ожидается подтверждение заказа. Ясно, что для генерации третьей страницы необходимо знать значения параметров с первых двух страниц. Поэтому после возвращения отклика с первой страницы используется команда:

Session.Value[‘GoodName’]:=’ Intel Processor ‘;

Имя выбранного товара можно получить после анализа свойств объекта Request. После второй страницы используем команду:

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

В объекте Session можно также запоминать динамически создаваемые объекты (об этом будет рассказано ниже).

Объект Application

Этот объект используется для хранения и обработки данных, которые являются общими для всех сессий. При помощи объекта Application можно передавать данные от одного клиента к другому. Основные свойства и методы объекта Application:

  • свойство Contents – содержит список всех объектов, которые были добавлены при выполнении скриптов из ASP-документов. Объект Contents имеет два метода: Remove удаляет данный объект, а RemoveAll удаляет все объекты. Сюда же можно помещать ссылки на динамически создаваемые объекты при выполнении кода ASP-сервера;
  • свойство StaticObjects — список всех объектов, которые были добавлены при помощи тэга ;
  • метод Lock. Клиенты работают в многопоточном режиме, а переменные в объекте Application являются общими для всех клиентов. Поэтому если надо обратиться к свойствам объекта Application или к методам, которые работают с переменными данного объекта, то обязательно требуется вызов метода Lock. Это дает возможность безопасно работать с переменными Application, в то время как остальные клиенты будут ожидать окончания работы с этим объектом. После чтения или записи свойства (либо окончания работы метода) требуется вызов метода Unlock, и только после этого переменные (методы) будут доступны для других клиентов;
  • метод Unlock — делает доступными переменные или методы объекта Application другим клиентам;
  • событие Appliation_OnStart — наступает в момент первого старта приложения и продолжается до создания сессии. Из обработчика этого события можно обращаться только к объектам Server и Application. Обработчик этого события должен быть написан на языке VBScript или JavaScript;
  • событие Application_OnEnd — вызывается в момент завершения ASP-приложения, после разрушения всех сессий. Доступные объекты и языки для описания обработчика те же, что и у обработчика Application_OnStart.

Использование объекта Session для хранения состояния

втоматическая обработка полей Cookie в ASP-технологии позволяет определить, обращался ли ранее клиент к данному Web-серверу. При первом обращении клиента для него создается объект Session. При последующих обращениях этого же клиента для него назначается ранее созданный объект Session. Объект Session разрушается либо при отсутствии в течение интервала времени Session.TimeOut новых запросов от клиентов, либо при вызове метода Session.Abandon из кода. В объекте Session можно хранить переменные и объекты, которые динамически создаются или изменяются. Эти изменения видны при каждом последующем обращении клиента. Таким образом, объект Session может хранить состояние клиента. Данная возможность, реализованная на уровне технологии, обеспечивает ASP-приложениям существенные преимущества по сравнению с CGI- и ISAPI-приложениями, где для хранения состояния необходимо писать трудоемкий код для работы с Cookie.

Для тестирования прежде всего требуется настроить Microsoft Internet Information Services (IIS). Для этого создадим виртуальную директорию IIS, которая обязательно должна иметь разрешение как на чтение (из нее будут читаться данные), так и на выполнениe скриптов (из нее будет загружен *.asp-документ). Директория должна быть доступна с помощью протокола HTTP. Поэтому в первую очередь нужно обратиться к Web-сервису Internet Information Server, просмотреть список доступных директорий и при необходимости создать новые с соответствующими правами доступа.

В нашем примере на компьютере, который имеет IP-адрес 192.168.0.2, была создана виртуальная директория /Test, соответствующая физическому адресу на компьютере C:\ASPTest. В директорию, имеющую права доступа Read и Script, был скопирован файл Test.asp. Сам файл ASP01.dll (COM-сервер) можно поместить в произвольную директорию. Главное — чтобы он был зарегистрирован в системном реестре. Для этого после выполнения команды Save As в Delphi 6 выберем команду меню Run/Register ActiveX server и выполним ее.

Продолжим работу с сессией. Воспользуемся проектом, создание которого было описано ранее (см. КомпьютерПресс, № 2’2001, c. 196). Исходный код проекта можно найти на нашем CD-ROM. Сначала разберемся, каким образом можно сохранять и изменять переменные. Для этого в секции private класса TTest модуля ASP01_U1 обьявим метод:

В каждом методе модуля ASP01_U1 вызовем метод IncrementCallCount с параметром Name= . Например, в ранее объявленном методе GetPicture (см. КомпьютерПресс, № 2’2001, с.196) обратимся к IncrementCallCount следующим образом:

Далее добавим в библиотеку типов новый метод GetCallCount, как было описано выше. Реализуем этот метод следующим образом:

И наконец, создадим ASP-документ с вызовом метода GetCallCount:

Сохраним этот документ в файле Test3.asp в директории C:\ASPTest (напомним, что она зарегистрирована в Internet Information Server и имеет разрешения на чтение и выполнение кода). Далее, обращаясь к ранее созданным ASP-документам, будем обращаться к объявленным ранее методам ASP-сервера в произвольной последовательности и произвольное число раз, пока, наконец, не дойдем до страницы Test3.asp. В результате получим примерно следующий отклик, какой представлен на рис. 2.


Напротив названия каждого метода стоит число обращений к нему клиента в текущей сессии. Если вызвать команду Refresh в браузере, то можно заметить, что число напротив надписи GetCallCount увеличится на 1.

Данные в коллекции Session.Value хранятся в виде вариантных переменных; иными словами, они могут принадлежать любому типу, конвертируемому в OleVariant: integer, single, double, WideString и т.д. Можно хранить и массивы — для этого вызывается функция VarArrayCreate. Доступ к переменным осуществляется по имени. Коллекция Session.Value возвращает пустое значение (null), если ранее переменная с данным именем не была добавлена к коллекции. Добавление новой переменной осуществляется в случае присвоения значения элемента коллекции с уникальным именем.

Однако ссылки на экземпляры классов (объекты) в этой коллекции хранить нельзя. Точнее говоря, хранить их можно: например привести указатель к типу integer и сохранить в коллекции Session.Value. Далее можно получать доступ к объекту приведением типа и таким образом при каждом следующем обращении клиента получать ссылку на объект и работать с ним. Казалось бы, все хорошо, однако при разрушении сессии по истечении TimeOut деструкторы объектов вызваны не будут. Это означает, что при работе такого сервера постепенно будут исчерпываться доступные системные ресурсы и в конце концов Web-сервер просто «рухнет». Если бы существовала возможность создать обработчик события Session_OnEnd в коде Delphi, то деструкторы можно было бы вызвать явно. Однако этот обработчик может быть создан только в ASP-документе на языках VBScript или JavaScript.

Выход из создавшейся ситуации заключается в использовании коллекции Session.Contents, которая предназначена для хранения объектов. В принципе, коллекция Session.StaticObjects также используется для хранения объектов, но ее нельзя модифицировать во время выполнения приложения. Идея хранения объектов в коллекции Session.Contents заключается в следующем: объекты, которые необходимо хранить, поддерживают интерфейс IUnknown (или его потомок). Именно ссылка на этот интерфейс и помещается в коллекцию Session.Contents. При закрытии сессии для всех интерфейсов, хранящихся в этой коллекции, вызывается метод Release. Соответственно из этого обработчика событий можно вызвать деструктор класса при равенстве нулю числа ссылок на интерфейс.

Для проверки вышесказанного попробуем решить следующую задачу: мы хотим помещать содержимое одной записи в базе данных на отдельную Web-страницу, давая пользователю возможность передвигаться по записям вперед и назад. В этом случае требуется запоминать положение указателя текущей записи в наборе данных, что будет выполняться в компоненте Session. Наиболее простой способ запомнить положение указателя текущей записи — не закрывать набор данных после формирования отклика пользователю.

Первоначально создадим ASP-документ, содержащий форму с двумя кнопками: Back и Next. В данном документе вызовем новый метод ASP-сервера, который назовем, например, TestSession. В этом методе будем анализировать запрос и смещать текущую запись вперед или назад. Сохраним документ в файле Test4.asp. Окончательный вид документа следующий:

Далее создадим новый модуль данных и поместим на него компоненты TADOConnection и TADOTable. В ADOConnection1 сошлемся на базу данных Northwind. В компоненте ADOTable1 сошлемся на ADOConnection1, свойству TableName присвоим значение Alphabetical list of products, а его свойство Active установим равным True. Это означает, что немедленно после отработки конструктора будет установлена связь с сервером баз данных. Объявим новый интерфейс ISessionObject — потомок IUnknown. Полезно к этому интерфейсу добавить метод, который будет возвращать указатель на модуль данных. Несмотря на то что использовать указатели в интерфейсах запрещено вследствие необходимости осуществлять маршалинг для разных модулей, в нашем случае это оправданно, поскольку данный метод будет использоваться только внутри модуля ASP01. Все внешние приложения (в том числе Internet Information Services) будут работать с этим интерфейсом как с Iunknown, не «зная» о существовании метода, возвращающего указатель.

Окончательный код выглядит следующим образом:

Данный код прост и не требует комментариев. Ключевой метод — ObjRelease — уменьшает число ссылок и при их равенстве нулю вызывает деструктор класса. Некоторые изменения потребуются и в классе TTest модуля ASP01_U1. Прежде всего необходимо вызвать конструктор класса TDataModule2. Наиболее подходящее место для вызова конструктора — событие Session_OnStart — недоступно из кода Delphi. Метод AfterConstruction также подходит мало — при обращении к нему не определены ссылки на объекты Session, Application, Server. Необходимо, чтобы эти объекты были инициализированы из интерфейса IScriptingContext — именно это и делает метод OnStartPage. Поэтому будем вызывать конструктор из метода TTest.OnStartPage. При этом следует учитывать, что конструктор мог быть вызван раньше — во время предыдущего запроса клиента. Следовательно, необходима предварительная проверка существования экземпляра класса TTest. Окончательно код будет выглядеть следующим образом:

Первоначально в переменную V пытаемся копировать переменную с именем DataModule, которая хранится в объекте Session. Если это не удается (что происходит, когда пользователь обращается к ASP-серверу в первый раз), то создаем экземпляр класса TDataModule2, получаем от него ссылку на интерфейс ISessionObject и запоминаем ее в объекте Session под именем DataModule. Теперь поведение экземпляра класса TDataModule2 будет корректным: он будет существовать, пока существует объект Session для данного клиента, и разрушаться с окончанием сессии. Чтобы убедиться в этом, достаточно переписать деструктор TDataModule2 и поместить туда оператор Beep (визуальные элементы управления в ASP-приложениях показывать запрещено). Если после этого вновь обратиться к ASP01 и затем выгрузить ASP-сервер, как было описано выше, то можно услышать звук динамика.

Осталось реализовать метод TestSession в классе TTest — он формирует отклик для клиента. В этом методе необходимо получить доступ к хранящемуся в объекте Session экземпляру класса TDataModule2, проанализировать запрос и при нажатии кнопки Next переместить курсор на следующую запись, а при нажатии кнопки Prior — на предыдущую. Окончательный код выглядит следующим образом:

В нем используется определенный ранее метод ISessionObject.getDataModule для получения ссылки на экземпляр класса TDataModule2. Скомпилировав этот проект и обратившись к созданной ранее странице Test4.asp, можно получить отклик, который представлен на рис. 3.

При нажатии клавиши Next получаем страницу со следующей записью; Prior — с предыдущей.

В заключение следует отметить, что объект Application также имеет аналогичные свойства для хранения переменных и объектов. Эти свойства имеют те же самые названия, что и в объекте Session. Существует два отличия использования аналогичных свойств объекта Application:

ASP. Основы. Объекты и компоненты. Доступ к базам данных

Dynamic HTML представляет собой основное средство программирования клиента для Microsoft Internet Explorer 4.0 и выше, но такие программы просмотра Web, как Netscape Navigator, не поддерживают Dynamic HTML. На самом деле очень малая часть функциональности клиентской части, поддерживаемой различными программами просмотра, может рассматриваться как действительно кросс-платформенная.

Если Вы хотите разработать Интернет-узел, открытый для доступа самым различным программам просмотра, то должны перенести программирование с клиента на сервер. Такую возможность предоставляют Microsoft ASP (Active Server Pages — активные серверные страницы). По сути ASP не что иное, как сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML-текст. Это ключевая особенность ASP — клиент никогда не видит вашего кода, а только результирующий HTML, который воспринимает любая программа просмотра.

Листинг 4.1 демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now — функция VBScript, возвращающая текущий момент времени и дату. Если текущий час меньше 12, то приветствие задается в форме «Доброе утро!» От полудня до шести вечера сообщение имеет вид «Добрый день!», а после шести — «Добрый вечер!»

Листинг 4.1.Простой пример ASP.

Simple ASP Example

11 And Hour(Now) 17 Then

strGreeting = «Добрый вечер!»

Обратите внимание на код в листинге, окруженный специальными символами: угловыми скобками и знаками процента ( ). Такие символы означают, что это серверный код, который выполняется перед тем, как страница будет на самом деле послана программе просмотра. Если бы Вы посмотрели в Internet Explorer на результирующий HTML-текст, то увидели бы следующее (в предположении, что сейчас еще не вечер, но уже не утро):

Simple ASP Example

В этом-то и состоит суть ASP. Результат исполнения кода — обыкновенный HTML! Эту страницу можно просматривать любой программой просмотра: не только Internet Explorer, но и, например, Netscape Navigator. Иными словами, ASP предоставляет разработчику подлинную платформенную независимость

У представленного кода есть еще несколько особенностей. Обратите внимание на самую верхнюю строчку — она определяет, на каком языке написан сценарий на данной странице:

Скорее всего, Вы будете писать свои сценарии на VBScript, но ASP поддерживает и JavaScript. В отличие от сценариев на клиентской стороне, здесь выбор языка абсолютно не создает проблем совместимости с различными программами просмотра, поскольку весь код исполняется на сервере.

А теперь обратите внимание на ту строку, где и происходит генерация HTML-текста. Здесь для вывода приветствия используется переменная:

Переменная strGreeting заключена в угловые скобки со знаками процента, как и весь остальной серверный код, но, кроме того, ей предшествует знак равенства. Такая конструкция играет важную роль в ASP, указывая, что в данное место HTML-страницы нужно вставить текущее значение этой переменной.

Объекты и компоненты.На самом простом уровне создание ASP-страницы — это ни что иное, как написание серверного кода для получения ожидаемого результата. Но VBScript не является полнофункциональным языком и, как только Вы приступаете к построению более сложных страниц, его выразительных средств начинает не хватать. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Собственно говоря, в VBScript отсутствуют какие-либо встроенные средства доступа к каким бы то ни было внешним источникам данных. Так как же в таком случае при помощи ASP выполняются такие сложные действия, как доступ к данным? Ответ будет таким: нужно дополнить VBScript объектами и компонентами ASP.

ASP-объекты и компоненты — это не что иное, как компоненты ActiveX, подобные обычным DLL ActiveX, с которыми Вы наверняка работали в Microsoft Visual Basic. Различие между объектами и компонентами ASP состоит в том, каким образом они появляются в программе. ASP-объекты — это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. А вот ASP-компоненты представляют собой DLL, существующие вне структуры ASP. Эти компоненты могут быть написаны на любом языке, а некоторые по­лезные ASP-компоненты просто поставляются в комплекте с Visual InterDev. ASP-компо­ненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

Файл GLOBAL.ASA.Одна из главных трудностей разработчика для Интернета, независимо от того, какую технологию он использует, состоит в том, как сложно создать в Интернете настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой по сути лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе. Коренная проблема для всех Web-приложений такова: как показать, что это именно приложение?

Определить приложение в среде Microsoft Windows довольно просто. Приложение запуска­ется двойным щелчком значка и завершается, когда в меню File выбран пункт Exit. В проме­жутке между двумя этими событиями данные хранятся в переменных. Но для Интернет-при­ложений это не так. Как определить, когда приложение начинается, а когда заканчивается? Можно сказать, что приложение начало работу, если пользователь зашел на узел и просмат­ривает одну из его страниц. Но что если он переходит к другому узлу, а через пять минут возвращается? Приложение все еще активно? А если пользователь отсутствовал час или два?

Проблема определения моментов запуска и завершения приложения оказывает серьезное влияние на правильное управление переменными и последовательностью выполнения. К счастью, ASP предлагает решение. Оно состоит в том, что для определения начала и завер­шения — как всего приложения, так и отдельных пользовательских сессий — используется специальный файл под названием GLOBAL.ASA. На этот файл возложено реагирование на четыре ключевых события узла: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 4.2 приведен типичный файл GLOBAL.ASA.

Листинг 4.2.Файл GLOBAL.ASA.

Для обозначения разделов сценария GLOBAL.ASA содержит теги

Хотя GLOBAL.ASA отмечает начало и завершение приложения при помощи событий, оста­ется неясным, что же все-таки составляет собственно приложение. Одна из рабочих форму­лировок, предложенная Microsoft, определяет Интернет-приложение как виртуальный ката­лог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

Согласно этому определению с приложением одновременно могут работать несколько про­грамм просмотра. Но событие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда затем страницы из этого ката­лога запрашивают другие пользователи, возбуждается только событие Session_OnStart.

В то время как приложение может относиться к нескольким программам просмотра, обра­щающимся к одному и тому же множеству Web-страниц, сессия касается какой-то одной программы просмотра, обращающейся к тем же Web-страницам. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если же пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

В качестве примера рассмотрим следующий сценарий. Два пользователя намереваются посе­тить на Web-узле приложение Magazine. Пользователь 1 оказывается проворнее и быст­ренько запрашивает Web-страницу DEFAULT.ASP. Тут же возбуждаются события Application_OnStart и Session_OnStart. Буквально пятью минутами позже к приложению обращается пользователь 2. Поскольку пользователь 1 как-то проявлял себя в течение последних 20 минут, приложение Magazine активно. Следовательно, возбуждается только событие Session_OnStart, сигнализируя о начале новой сессии. Кроме того, теперь для завершения приложения необходимо, чтобы завершились обе сессии.

В течение следующих 15 минут пользователь 1 не запрашивает ни­каких страниц приложе­ния Magazine. Поскольку он не проявлял активности на протяжении 20 минут, ASP приходит к выводу, что пользователь 1 закончил свою работу с приложением, и возбуждает событие Session_OnEnd. Но приложение все еще активно, поскольку в течение последних 20 минут к нему обращался пользователь 2.

Пользователь 2 работает с приложением еще час, то и дело запрашивая новые Web-страницы. Но в конце концов он отключается, а через 20 минут после того, как он покинул узел (точнее, в последний раз запросил Web-страницу приложения), возбуждается событие Session_OnEnd. Поскольку пользователь 2 был последним пользователем данного приложения, оно завершается, и возбуждается событие Application_OnEnd.

В ASP есть несколько встроенных объектов, которые доступны разработчику. Эти объекты помогают управлять многими вещами: от переменных, до передачи форм. Работать с ними легко, они вызываются из кода напрямую без какого-то особого синтаксиса.

Объект Application.Объект Application (приложение) позволяет создавать переменные приложения (application variables) — переменные, доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.

В листинге 4.3 приведен пример программы, которая использует Объект Application. В нем переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.

Листинг 4.3.Объект Application.

Эта страница последний раз посещалась:

Создание переменной приложения сводится к адресации объекта Application именем новой переменной, которую вы хотите создать. Например, следующий код создает новую переменную приложения с именем Company и присваивает ей значение NewTech.

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

Поскольку такие переменные доступны нескольким пользователям одновременно, вы не сможете гарантировать, что два пользователя не попытаются одновременно присвоить одной и той же переменной разные значения. Для разрешения подобных коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, а не только переменную, вы хотите изменить, поэтому сразу же после изменения значения переменной разблокируйте объект:

Несмотря на то, что переменные приложения пригодны для временного хранения данных, их нельзя использовать для долговременного хранения. Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.

Объект Session.Зачастую разработчиков меньше интересуют данные, совместно используемые несколькими пользователями, зато гораздо больше — данные, связанные с конкретным пользователем. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).

Листинг 4.4 демонстрирует, как определить несколько переменных сессии в файле GLOBAL.ASA. Само по себе их определение так же просто, как и в случае переменных приложения. Все, что нужно сделать — это адресовать объект Session именем переменной, которую вы хотите создать. Основное различие между переменными этих объектов — их области видимости. Переменные сессии предназначаются для одного пользователя и живут, пока пользователь поддерживает сессию. Как только в течение 20 минут (по умолчанию) пользователь не обращается к страницам данного виртуального каталога, данные пропадают.

Листинг 4-..Создание переменных сессии.

Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web-странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий фрагмент кода считывает переменные сессии, созданные в листинге 4.4, и выводит их в полях ввода:

Ранее мы определили Интернет-приложение как лишенные статуса транзакции между Web-сервером и программой просмотра. Как же тогда ASP запоминает переменные сессии для каждого пользователя приложения? Ответ будет таким: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique Identifier, GUID) сохраняет, а впоследствии посылает серверу и получает именно ему предназначенные данные. Таким образом каждый клиент может иметь свой набор данных в каждом Интернет-приложении.

Осталось сказать, что для установки или считывания впемени жизни сессии (в минутах) применяется свойство Timeout объекта Session:

Объект Request.Для передачи данные клиенту создается Web-страница, а для передачи данных в обратном направлении программа просмотра использует отправку формы (form submission). В форме содержатся текстовые поля, переключатели и т.п. Клиент размещает введенные данные в этих полях и пересылает пакет серверу. Процессом передачи формы управляют два атрибута тега

Элемент формы с типом SUBMIT — это кнопка, нажатие которой пользователем заставляет программу просмотра упаковать данные формы и отправить их. Формат пересылки данных определен строго и сервер знает, чего ожидать от клиента. Данные имеют вид пар Поле=Значение,отсылаемых серверу в формате открытого текста. Если в предыдущем примере ввести в поле Name NewTech и info@newtech.com в поле Email, то сценарию DATA.ASP будет послан следующий текст:

На сервере эти данные можно вновь разобрать по полям и использовать в любых целях. Вот тут-то и нужен объект Request. Он используется в ASP для разбора полученных от клиента данных. Для работы с объектом Request просто сообщите ему имя поля, значение которого хотите получить, и объект вернет вам это значение. Например, следующий код вернет вам значение поля Name:

Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров прямо в гиперссылке

то для разбота данных применяют свойство Request.QueryString, который работает так же, как Request.Form. Следующий фрагмент кода вернет значение поля Name из гиперссылки:

Другое свойство — Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. А листинг 4.5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.

Листинг 4.5.Определение компьютера пользователя.

Вы вошли с компьютера

Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

Объект Response.Этот объект управляет содержимым страницы, которую ASP возвращает программе просмотра. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. Так что следующие две строки кода эквивалентны:

Поскольку объект Response используется очень часто, такое сокращение оправдано.

Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:

Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно. В листинге 4.6 приведена исправленная версия примера, устаревающая уже в момент загрузки.

Листинг 4.6.Страница, устаревающая уже в момент загрузки.

Forcing a Page to Expire


Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

Объект Server.Объект Server (сервер) представляет собой в некотором роде свалку — в том смысле, что предоставляемые им функции никак не связаны между собой, за тем исключением, что все они полезны разработчику для Интернета. Пожалуй, самая важная из всех функций объекта Server — это метод CreateObject, который создает экземпляр компонента ActiveX. Причем это может быть как встроенный компонент, входящий в комплект поставки, так и тот, который написали Вы сами на любом языке. В любом случае использование компонента ActiveX на сервере требует вызова метода CreateObject.

Аргументом метода CreateObject служит ProgID (программный идентификатор) требуемого компонента ActiveX. ProgID — это содержательное имя компонента, такое как Excel.Sheet или Word.Basic. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с ProgID Excel.Sheet.

Set MyObject = Server.CreateObject(«Excel.Sheet»)

Другим полезным методом объекта Server является MapPath, возвращающий фактический путь, соответствующий заданному виртуальному каталогу.

Компоненты ASP — это на самом деле просто компоненты ActiveX, наподобие тех, что Вы можете сами создать на Visual Basic или Visual C++. Но эти компоненты написаны Microsoft и поставляются вместе с Visual InterDev. Они предназначены для выполнения полезных для Web-узлов задач общего характера, включая доступ к данным. Создать их на своей странице Вы можете при помощи метода CreateObject объекта Server, а как только они созданы, смело обращайтесь к их свойствам и методам для выполнения нужных Вам задач.

Компонент ActiveX Data Objects.Самым полезным изо всех компонентов ASP следует признать компонент доступа к базам данных, называемый также ActiveX Data Objects, или сокращенно ADO. Он и содержащиеся в нем объекты применяются для чтения и записи данных в источники данных ODBC при публикации в Web информации из баз данных.

Объект Connection (подсоединение) создается методом CreateObject объекта Server, и ссылка на него помещается в переменную. Когда объект создан, его можно использовать для открытия подсоединения к любому источнику данных ODBC. Следующий фрагмент кода устанавливает подсоединение к источнику данных ODBC с названием Publications:

‘ Создаем объект Connection

Set objConnection = Server.CreateObject(«ADODB.Connection»)

‘ Открываем подсоединение к источнику данных

objConnection.Open «Publications», «sa», «» %>

Здесь objConnection — переменная для объектной ссылки на экземпляр объекта Connection. Метод Open устанавливает подсоединение, принимая в качестве аргументов имя источника данных, идентификатор пользователя и пароль.

Когда подсоединение установлено, получать информацию из источника данных можно при помощи объекта Recordset (набор записей). Этот объект умеет выполнять оператор SELECT языка SQL и возвращать набор записей, удовлетворяющих этому запросу. Как и объект Connection, Recordset создается методом CreateObject. В следующем примере программа выполняет оператор SELECT над источником данных, представленным переменной objConnection:

После того, как записи получены, для передвижения по ним можно обращаться к методам MoveFirst, MoveLast, MoveNext и MovePrevious. Затем метод Write объекта Response помещает данные на Web-страницу, которая и посылается программе просмотра. В листинге 4.7 приведен полный пример ASP-страницы, которая строит список пользователей, со­держащихся в источнике данных Data.

Листинг 4.7.Построение списка при помощи ADO.

Одна из основных задач в управляемом данными Web-приложении — управление информацией в объекте Recordset. Очень часто простой запрос возвращает гораздо больше данных, чем имеет смысл показывать. Давайте, например, посмотрим, что происходит, когда Вы обращаетесь к какой-либо поисковой системе в Интернете. Поисковая машина, получив ключевое слово, возвращает ссылки на узлы, где это ключевое слово встречается. Но зачастую обнаруживаются тысячи узлов, содержащих данное ключевое слово. Совершенно очевидно, что показать все эти узлы на одной Web-странице совершенно невозможно.

Выход состоит в разбиении на страницы (paging). Этот механизм реализован во всех поисковых системах для передачи за один раз некоей порции результатов запроса, скажем, из 10 записей. Теперь пользователь может эффективно работать с полученной информацией. Поддерживает разбиение на страницы и ADO — посредством нескольких свойств объекта Recordset: PageSize, PageCount и AbsolutePage.

При получении набора данных можно указать, что записи следует разбить на страницы. Количество строк набора данных, составляющих страницу, задается значением свойства PageSize. Затем можно определить общее количество страниц в наборе данных посредством свойства PageCount. А доступ к заданной странице обеспечивает свойство AbsolutePage.

В листинге 4.8 приведен полный пример, в котором пользователь может просматривать 10 записей за раз. Переменная сессии CurrentPage отслеживает текущую страницу. Пользователь может перейти к предыдущей порции данных или к следующему набору из 10 записей, выбрав одну из двух гипертекстовых ссылок на странице.

Листинг 4.8.Разбиение набора данных на страницы средствами ADO.

Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект. — презентация

Презентация была опубликована 6 лет назад пользователемИгорь Торицын

Похожие презентации

Презентация на тему: » Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект.» — Транскрипт:

1 Лекция 6 Active Server Pages (ASP )Active Server Pages (ASP ) –Основы. –GLOBAL.ASA –Объекты и компоненты. –Объект Application. –Объект Session. –Объект Request. –Объект Response. –Объект Server.

2 Основы ASP Active Server Pages активные серверные страницы.Active Server Pages активные серверные страницы. ASP — сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML- текст.ASP — сценарий на VBScript, который исполняется на сервере. Когда запрашивается страница, этот сценарий порождает HTML- текст. К лиент никогда не видит кода, а только результирующий HTML, который воспринимает любая программа просмотра.К лиент никогда не видит кода, а только результирующий HTML, который воспринимает любая программа просмотра.

3 Пример Пример демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now функция VBScript, возвращающая текущий момент времени и дату.Пример демонстрирует простую ASP-страницу, которая создает приветствие в соответствии со временем суток. В нем текущий час определяется при помощи кода Hour(Now), где Now функция VBScript, возвращающая текущий момент времени и дату.Пример

17 Then strGreeting = Добрый вечер! End If %>» title=»Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = Добрый вечер! End If %>» > 4 Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = «Добрый вечер!» End If %> 17 Then strGreeting = Добрый вечер! End If %>»> 17 Then strGreeting = «Добрый вечер!» End If %>»> 17 Then strGreeting = Добрый вечер! End If %>» title=»Пример Листинг 1. Простой пример ASP.Листинг 1. Простой пример ASP. Simple ASP Example Simple ASP Example 11 And Hour(Now) 11 And Hour(Now) 17 Then strGreeting = Добрый вечер! End If %>»>

5 Особенности К од в листинге, окруженный угловыми скобками и знаками процента ( ) — серверный код, который выполняется перед тем, как страница будет послана программе просмотра.К од в листинге, окруженный угловыми скобками и знаками процента ( ) — серверный код, который выполняется перед тем, как страница будет послана программе просмотра. — на каком языке написан сценарий на данной странице. Можно использовать JavaScript. — на каком языке написан сценарий на данной странице. Можно использовать JavaScript. — п еременн ой strGreeting предшествует знак равенства, указывая, что в данное место HTML- кода нужно вставить текущее значение переменной. — п еременн ой strGreeting предшествует знак равенства, указывая, что в данное место HTML- кода нужно вставить текущее значение переменной.

6 Файл GLOBAL.ASA. В Интернете сложно создать настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе.В Интернете сложно создать настоящее приложение. Взаимодействие программы просмотра и Web-сервера представляет собой лишенную состояния транзакцию, в ходе которой сервер посылает клиенту Web-страницу и затем забывает о его существовании. Когда клиент запрашивает другую Web-страницу, сервер ничего не помнит о предыдущем запросе.

7 Файл GLOBAL.ASA. Д ля определения начала и завершения как всего приложения, так и отдельных пользовательских сессий в ASP используется файл GLOBAL.ASA.Д ля определения начала и завершения как всего приложения, так и отдельных пользовательских сессий в ASP используется файл GLOBAL.ASA. Он реагир ует на четыре ключевых события: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии).Он реагир ует на четыре ключевых события: Application_OnStart (запуск приложения), Application_OnEnd (завершение приложения), Session_OnStart (начало сессии) и Session_OnEnd (завершение сессии). В листинге 2 приведен типичный файл GLOBAL.ASA.В листинге 2 приведен типичный файл GLOBAL.ASA.

8 Файл GLOBAL.ASA. Листинг 2. Файл GLOBAL.ASA.Листинг 2. Файл GLOBAL.ASA. Sub Session_OnStart End Sub Sub Session_OnEnd End Sub Sub Application_OnStart End Sub Sub Application_OnEnd End Sub

9 Файл GLOBAL.ASA. Для обозначения разделов сценария GLOBAL.ASA содержит теги. Эти теги имеют особый атрибут RUNAT=Server, который означает, что содержащийся в теге код на VBScript должен исполняться на сервере, а не на клиенте. Функционально RUNAT=Server означает то же, что и сочетания угловых скобок и знака процента, используемые для обозначения серверного сценария на Web- страницах.Для обозначения разделов сценария GLOBAL.ASA содержит теги. Эти теги имеют особый атрибут RUNAT=Server, который означает, что содержащийся в теге код на VBScript должен исполняться на сервере, а не на клиенте. Функционально RUNAT=Server означает то же, что и сочетания угловых скобок и знака процента, используемые для обозначения серверного сценария на Web- страницах.

10 Файл GLOBAL.ASA. Ф ормулировк а, предложенная Microsoft, определяет Интернет- приложение как виртуальный каталог со всеми его файлами.Ф ормулировк а, предложенная Microsoft, определяет Интернет- приложение как виртуальный каталог со всеми его файлами. Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.Если пользователь запрашивает Web-страницу из виртуального каталога под названием Bookstore, то тем самым он запускает приложение Bookstore, и в GLOBAL.ASA возбуждаются события Application_OnStart и Session_OnStart.

11 Файл GLOBAL.ASA. Согласно этому определению с приложением одновременно могут работать несколько программ просмотра.Согласно этому определению с приложением одновременно могут работать несколько программ просмотра. С обытие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога.С обытие Application_OnStart происходит только один раз: когда первый пользователь запрашивает Web-страницу из виртуального каталога. Когда страницы из этого каталога запрашивают другие пользователи, возбуждается только событие Session_OnStart.Когда страницы из этого каталога запрашивают другие пользователи, возбуждается только событие Session_OnStart. Session_OnStart

12 Файл GLOBAL.ASA. Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога.Для конкретной программы просмотра сессия длится, пока программа продолжает запрашивать страницы виртуального каталога. Если пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd.Если пользователь не запрашивает Web-страницы (из данного виртуального каталога) на протяжении 20 минут (по умолчанию), сессия завершается, и возбуждается событие Session_OnEnd. Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.Когда в данном виртуальном каталоге завершаются все сессии, возбуждается событие Application_OnEnd.

13 Объекты и компоненты. VBScript не является полнофункциональным языком. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы.VBScript не является полнофункциональным языком. Так, в VBScript нет встроенных функций доступа к данным; не умеет он и открывать текстовые файлы. Все это и многое другое реализуется объектами и компонентами ASP.Все это и многое другое реализуется объектами и компонентами ASP. ASP-объекты и компоненты это компоненты ActiveX, подобные обычным DLL ActiveX.ASP-объекты и компоненты это компоненты ActiveX, подобные обычным DLL ActiveX.

14 Объекты и компоненты. ASP-объекты это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server.ASP-объекты это элементы управления ActiveX, которые в коде на VBScript доступны всегда: их не нужно создавать явно. В число объектов ASP входят Application, Session, Request, Response и Server. ASP-компоненты — это DLL, существующие вне структуры ASP. ASP-компоненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.ASP-компоненты — это DLL, существующие вне структуры ASP. ASP-компоненты нужно явно создавать в коде. ASP поддерживает компоненты Database Access, File Access, Browser Capabilities, Ad Rotator и Content Linking.

15 Объект Application. Объект Application (приложение) позволяет создавать переменные приложения (application variables), доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога.Объект Application (приложение) позволяет создавать переменные приложения (application variables), доступные всем пользователям данного приложения. Все, кто обращается к Web-страницам данного виртуального каталога, могут совместно использовать любую переменную приложения определенную для этого каталога. В листинге 3 приведен пример программы, в не й переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.В листинге 3 приведен пример программы, в не й переменная приложения служит для отслеживания времени последнего обращения к страницам приложения.пример

16 Объект Application. Листинг 3. Объект Application.Листинг 3. Объект Application. Application Variables Application Variables Эта страница последний раз посещалась: Эта страница последний раз посещалась:

17 Объект Application. Имя может быть произвольным, а переменная может содержать любую информацию, будь то число или текст.Имя может быть произвольным, а переменная может содержать любую информацию, будь то число или текст. Т акие переменные доступны нескольким пользователям одновременно.Т акие переменные доступны нескольким пользователям одновременно. Для разрешения коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, поэтому после изменения значения переменной разблокируйте объект.Для разрешения коллизий объект Application поддерживает методы Lock и UnLock. Метод Lock блокирует весь объект Application, поэтому после изменения значения переменной разблокируйте объект.

18 Объект Application. П еременные приложения пригодны лишь для временного хранения данных, их нельзя использовать для долговременного хранения.П еременные приложения пригодны лишь для временного хранения данных, их нельзя использовать для долговременного хранения. Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.Все данные в переменных приложения уничтожаются, когда происходит событие Application_OnEnd. Так что, если вы хотите, чтобы они сохранились после завершения приложения, позаботьтесь о их переносе в файл или базу данных.

19 Объект Session. ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables).ASP поддерживает переменные для индивидуального пользователя при помощи объекта Session (сессия), который позволяет создавать переменные сессии (session variables). Sub Session_OnStart Session(«Company»)=»NewTech» End Sub

20 Объект Session. Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web- странице приложения, в котором эти переменные были первоначально созданы.Переменные сессии можно создавать на любой Web-странице или в файле GLOBAL.ASA, а доступны они на любой Web- странице приложения, в котором эти переменные были первоначально созданы. Получить значения переменных сессии можно, считывая их из объекта Session. Следующий пример считывает переменные сессии выводит их в полях ввода:Получить значения переменных сессии можно, считывая их из объекта Session. Следующий пример считывает переменные сессии выводит их в полях ввода: пример

21 Объект Session. Как ASP запоминает переменные сессии для каждого пользователя приложения:Как ASP запоминает переменные сессии для каждого пользователя приложения: эти переменные сохраняются на сервере для каждого клиента. Программа просмотра получает от сервера уникальный идентификатор, позволяющий определить, какой набор переменных кому принадлежит. Клиент этот идентификатор (Globally Unique >

22 Объект Session. Д ля установки или считывания в р емени жизни сессии (в минутах) применяется свойство Timeout объекта Session:Д ля установки или считывания в р емени жизни сессии (в минутах) применяется свойство Timeout объекта Session: Session.Timeout=30Session.Timeout=30 Для принудительного окончания сессии и ликвидации сессионных переменных применяют метод AbandonДля принудительного окончания сессии и ликвидации сессионных переменных применяют метод Abandon Session.AbandonSession.Abandon

23 Объект Request. Для передачи данны х серверу программа просмотра использует отправку формы (form submission).Для передачи данны х серверу программа просмотра использует отправку формы (form submission). Данные имеют вид пар Поле=Значение, отсылаемых серверу открыты м текст ом.Данные имеют вид пар Поле=Значение, отсылаемых серверу открыты м текст ом. На сервере эти данные разбирает по полям объект Request. Например, следующий код вернет вам значение поля формы Name:На сервере эти данные разбирает по полям объект Request. Например, следующий код вернет вам значение поля формы Name:

24 Объект Request. Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию.Request.Form применяется, когда данные были отправлены методом POST и именно этому сценарию. Если для отправки данных используется метод GET или сценарий вызывается с передачей параметров в гиперссылкеЕсли для отправки данных используется метод GET или сценарий вызывается с передачей параметров в гиперссылке Чтобы отправить данные, щелкните здесь! Чтобы отправить данные, щелкните здесь! то для разбота данных применяют свойство Request.QueryString:то для разбота данных применяют свойство Request.QueryString:

25 Объект Request. Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра.Request.Cookies используются для извлечения информации из кукисов (cookies), отосланных вместе с запросом строке пользовательского агента программы просмотра. Л истинг 5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.Л истинг 5 демонстрирует применение свойства ServerVariables для определения имени компьютера, с которого клиент вызвал сценарий.демонстрирует

26 Объект Request. Листинг 5. Определение компьютера пользователя.Листинг 5. Определение компьютера пользователя. Server Variables Server Variables Вы вошли с компьютера Вы вошли с компьютера Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.Переменные сервера представляют широкий круг информации о клиенте и Web-сервере. Доступ к каждой конкретной переменной сводится к чтению соответствующей переменной.

27 Объект Response. Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response.Фактически в комбинации знак равенства представляет собой сокращенное обозначение метода Write объекта Response. С ледующие две строки кода эквивалентны:С ледующие две строки кода эквивалентны: Поскольку объект Response используется очень часто, такое сокращение оправдано.Поскольку объект Response используется очень часто, такое сокращение оправдано.

28 Объект Response. Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти.Полезное свойство объекта Response — Expires. Оно задает время (в минутах) за которое страница устаревает. Если установить его в нуль, то страница будет устаревать в момент загрузки и Internet Explorer не будет ее кэшировать. Кэширование сильно влияет на разработку и может привести к тому, что приложение будет функционировать неправильно. IE кэширует страницы двумя способами: на диске и в памяти.

29 Объект Response. Рассмотрим такой фрагмент кода, показывающий текущее время и дату:Рассмотрим такой фрагмент кода, показывающий текущее время и дату: Сейчас Сейчас Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно.Когда IE запрашивают страницу с этим кодом, на сервере выполняется сценарий, и на странице появляется текущее время. Однако, если программа просмотра переходит к другой странице, а затем возвращается к этой, со временем, то время не изменится, поскольку IE не запрашивает ее повторно.

30 Объект Response. В листинге 6 приведена исправленная версия примера, устаревающая уже в момент загрузки.В листинге 6 приведена исправленная версия примера, устаревающая уже в момент загрузки.приведена Листинг 6. Страница, устаревающая уже в момент загрузки.Листинг 6. Страница, устаревающая уже в момент загрузки. Forcing a Page to Expire Forcing a Page to Expire Сейчас Сейчас

31 Объект Response. Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:Еще один полезный метод объекта Response — Redirect, перенаправляющий программу просмотра на указанный URL:

32 Объект Response. Кроме методов (Write и Redirect) и свойства Expires у объекта Response имеется коллекция (набор однотипных объектов) Cookies. Создание элемента коллекции означает запись теневой посылки на компьютер посетителя. Каждый элемент коллекции имеет имя, одно или несколько значений и несколько свойств:Кроме методов (Write и Redirect) и свойства Expires у объекта Response имеется коллекция (набор однотипных объектов) Cookies. Создание элемента коллекции означает запись теневой посылки на компьютер посетителя. Каждый элемент коллекции имеет имя, одно или несколько значений и несколько свойств:

33 Объект Response. срок жизни (Expires),срок жизни (Expires), имя папки на сервере, сценарии из которой имеют право чтения этой теневой посылки (Path),имя папки на сервере, сценарии из которой имеют право чтения этой теневой посылки (Path), имя сервера, сценарии которого имеют право чтения этой теневой посылки (Domain).имя сервера, сценарии которого имеют право чтения этой теневой посылки (Domain).

34 Объект Response. Обязательным параметром теневой посылки является только ее имя. Остальные параметры можно не указывать. В этом случае:Обязательным параметром теневой посылки является только ее имя. Остальные параметры можно не указывать. В этом случае: Отсутствие значения приводит к стиранию теневой посылки с компьютера посетителя;Отсутствие значения приводит к стиранию теневой посылки с компьютера посетителя; Отсутствие срока жизни приводит к устареванию теневой посылки в момент закрытия браузера;Отсутствие срока жизни приводит к устареванию теневой посылки в момент закрытия браузера;

35 Объект Response. Отсутствие имени папки означает разрешение чтения теневой посылки сценариями из текущей папки;Отсутствие имени папки означает разрешение чтения теневой посылки сценариями из текущей папки; Отсутствие имени сервера означает разрешение чтения теневой посылки сценариям любого сервера (если они знают имя теневой посылки).Отсутствие имени сервера означает разрешение чтения теневой посылки сценариям любого сервера (если они знают имя теневой посылки).

36 Объект Response. Приведем пример записи теневой посылки:Приведем пример записи теневой посылки: Response.Cookies(«visit»)(«Value ) = dataResponse.Cookies(«visit»)(«Value ) = data Response.Cookies(«visit»).Expires = Date + 365Response.Cookies(«visit»).Expires = Date Response.Cookies(«visit»).Path= » / «Response.Cookies(«visit»).Path= » / » Response.Cookies(«visit»).Domain= Request.ServerVariables(SERVER_N AME )Response.Cookies(«visit»).Domain= Request.ServerVariables(SERVER_N AME )

37 Объект Server. Объект Server (сервер) содержит функции, никак не связаны между собой.Объект Server (сервер) содержит функции, никак не связаны между собой. С амая важная функци я объекта Server это метод CreateObject, который создает экземпляр компонента ActiveX.С амая важная функци я объекта Server это метод CreateObject, который создает экземпляр компонента ActiveX. Аргументом метода CreateObject служит Prog >

38 Объект Server. Следующая строчка показывает, как при помощи CreateObject создать экземпляр компонента с Prog >

Asp объект application

Вы можете использовать данный метод для того, чтобы сделать доступной информацию между всеми пользователями данного приложения. Основанное на ASP приложение определено как все .asp-файлы в виртуальной директории и всех ее поддиректориях. Из-за того, что объект Application может быть доступен («зашарен») более чем одному пользователю, то в нем предусотренно два метода — Lock и Unlock (заблокировать и разблокировать) для того, чтобы быть уверенным, что сразу несколько пользователей не смогут попытаться изменять свойства одновременно.

Синтаксис:

Application . метод

Коллекции:

Методы:

События:

Скрипты, которым могут предшествовать события должны быть описаны в файле global.asa. Для получения более полной информации по этому файлу смотрите описание Global.asa


Замечания:

Вы можете хранить свои значения в коллекциях данного объекта: Application.Contents и Application.staticObjects. Информация, сохраненная в коллекции Application доступны через приложение. Следующий скрипт демонстрирует запись двух типов переменных.

Для каждой из этих переменных предполагается их членство в коллекции Application Contents.

Вы можете также связать компонент с переменной. Если вы связываете сомпонент к переменной с помощью объекта Server.CreateObject, то переменная будет членом коллекции Application.Contents. Если переменная связана с тэгом , то переменная будет членом коллекции Application StaticObjects.

Если вы связываете конкретный компонент с переменной в коллекцией Application Contents Collection и используете Visual Basic Scripting Edition как основной язык написания скриптов, вы должны использовать ключевое слово Set. Это иллюстрированно следующим примером.

Вы можете также определить методы и свойства компонента MyComponent следующим скриптом

или путем создания локальной копии объекта и использования его следующим образом:

Другой способ, чтобы создать объект с использованием тэга в файле Global.asa. Для более полной информации смотрите описание Global.asa.

Вы не можете хранить встроенные объекты в объекте Application. Для примера, каждый из следующих строк будет вызывать ошибку:

Если вы храните массив в объекте Application то вы не должны пытаться обращаться к элементам, хранящимся в массиве напрямую. К примеру, следующий скрипт не работает

>Настоятельно рекомендуется чтобы, если вы храните массив в объекте Application, вы получили копию массива прежде чем считывать или изменять любые его элементы. Кода вы сделали такую копию вы можете изменить или считать любые его элементы и измененную локальную копию сохранить обратно в Application. Данный прием мы продемонстрируем в следующем примере:

NumVisits для хранения числа посещений, когда страница была получена клиентом. Метод Lock вызывается тогда, когда есть возможность того, что к переменной NumVisits может возникнуть паралелльное обращение. Вызывая метод Unlock вы разрешаете обращаться к данной переменной (объекту Application) другим пользователям.

Коллекция Application. Contents

Коллекция Contents группирует все элементы, которые были добавлены приложением через команды скрипта. Вы можете использовать коллекцию Contents чтобы получить список элементов, которые были получены приложением или чтобы указать какой из элементов будет использован в данной операции.

Синтакс:

Application.Contents( ключ )

Параметры:

ключ
Указанное имя элемента для его получения.

Замечание:

Коллекция Application.Contents содержит те элементы которые были определены на уровне приложения без использования тэга . Это касается обеих объектов — созданных с использованием Server.CreateObject и с использованием скалярных переменных установленных через определение Application. В следующем скрипте, к примеру, оба и MyVar и MyObj будут членами коллекции Application.Contents.

Коллекция Application.Contents поддерживает циклы типа For. Each и For. Next.
Следующие два примера иллюстрируют каждый из вышеуказанных методов циклов использования Application.Contents.

Коллекция Application. StaticObjects

Коллекция StaticObjects содержит все объекты, созданные с использованием тэга и объекта Application. Вы можете использовать коллекцию для того, чтобы определить значения указанных свойств для объекта или создать цикл по коллекции и получить все свойства для всех статических объектов.

Синтакс:

Application.StaticObject( ключ )

Параметры:

ключ
Указанное имя элемент для обращения к нему.

Замечание:

Вы можете использовать управление циклом чтобы перебирать ключи в коллекции StaticObjects. Это продемонстрированно следующим примером:

Метод Application. Lock

Метод Lock блокирует для других клиентов переменные, хранимые в объекте Application от изменеия. Потому, как только один клиент может в данный момент времени получить доступ к переменным объекта. Если вы не вызываете метод Unlock после обработики переменных, то сервер сам разблокирует данный объект, когда истечет время (timeout) работы скрипта .asp.

Синтакс:

Application.Lock

Пример:

бШ посетитель данной страницы.

В предыдущем примере метод Lock предохраняет переменную NumVisits объекта Application от доступа к нему одновременно нескольких клиентов. Если бы приложение не было бы заблокированно, то два клиента попробывали-бы одновременно увеличить значение переменной NumVisits.

Метод Application. Unlock

Метод Unlock разблокирует заблокированные ранее переменные c помощью метода Lock.

Синтакс:

Application.Unlock

Пример:

Вы посетитель данной страницы.

В предыдущем примере метод Unlock разблокирует переменную NumVisits объекта Application, заблокированную ранее объектом Lock от доступа к нему одновременно нескольких клиентов.

Событие Application_OnEnd

Данное событие активизируется, когда приложение закрывается, а точнее после события Session_OnEnd. Только встроеные объекты Application и Server доступны.

Синтакс:

Параметры

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Замечания

Вы не можете вызывать метод MapPath (объект Server) в подпрограмме Application_OnEnd.

Событие Application_OnStart

Данное событие активизируется, когда активируется новая сессия, такая, как, к примеру, Session_OnStart. Только встроенные объекты Application и Server доступны. Обращение к объектам Session, Request или Response в подпрограмме Application_OnStart вызовет ошибку.

Синтакс:

Параметры

язык_программирования
параметр, который указывает на то, каким языком будет написан скрипт. Например JavaScript или VisualBasic.

Объект Application

На верхней ступени иерархии объектов Excel находится объект Application (Приложение), который является приложением Excel и характеризует его в целом. Объект Application содержит более 120 свойств и 40 методов, предназначенных для установки параметров приложения Excel. Также он позволяет использовать более 400 встроенных функций, вызывая их с помощью следующей конструкции:

Application. Pi () ‘Вычисление числа Пи.

Application.Sum(Аргументы) ‘Вычисление суммы аргументов.

Для глобальных свойств и методов объекта Application можно опускать префикс Application, непосредственно именуя глобальный элемент. Например, обращение Application .ActiveSheet можно заменить на ActiveSheet.

В иерархии объектов подчиненными для объекта Application являются объекты коллекций: WorkBooks (Рабочие книги), Worksheets (Рабочие листы), Range (Диапазон), Chart.

Как было сказано, объект Application обладает большим количеством свойств, методов и событий, что приводит иногда к избыточности и не позволяет рассмотреть их полностью. Важные свойства объекта Application приведены в табл. 8.1.

Свойства объекта Application

Active Workbook, ActiveSheet, ActiveCell, ActiveChart

Возвращают активный объект: соответственно, рабочую книгу, лист, ячейку, диаграмму. Объект ActiveCell содержится в объекте ActiveSheet, а объекты ActiveSheet и ActiveChart — в Active Workbook.

Пример: ActiveCell.Value = «Название региона»

Задает режим вычислений. Возможные значения: xl Calculation A uremia tic (автоматический режим), xlCalculationManual (вручную).

Определяет текст в строке заголовка активного окна

Объект, который используется при отладке программных проектов

Определяют по умолчанию соответственно путь файла, формат и направление просмотра текста

Булевские свойства, позволяющие включить или выключить отображение на экране тех или иных элементов приложения


Определяет семейство (коллекцию) стандартных диалоговых окон Excel. Возможные типы окон: xlDialogOpen, xlDialogSaveAs, xlDialogSave. С помощью свойства Dialogs можно организовать диалог с пользователем.

Пример: Application. Dialogs . Show — активизирует диалоговое окно открытия документа

Height, Width, Left, Top

Группа свойств, определяющих высоту, ширину и координаты верхнего левого угла окна приложения Excel

Коллекция имен ячеек и областей всех открытых документов Excel

Возвращает текущую рабочую книгу

Определяет коллекцию открытых в Excel рабочих книг

Возвращает выделенный в активном окне объект, тип которого зависит от текущего выделения. Если нет выделенного объекта, то возвращается значение Nothing

Важные методы объекта Application приведены в табл. 8.2.

Основные методы объекта Application

Вызывает принудительные вычисления во всех открытых рабочих книгах. Пример: Application. Calculate

Возвращает диапазон с пересечением нескольких диапазонов. Синтаксис: Intersect (range 1, range2, . ).

Пример: Intersect(Range(«Bl:E3») , Range («D3:E4»)). Select — результат диапазон D3:E3

Возвращает диапазон с объединением нескольких диапазонов. Синтаксис: Union (гangel, range2, . ).

Пример: Union (Range(«Bl:C2») , Range («D3:E4»)). Select — результат область из диапазона В1:С2 и диапазона D3:E4

Запускает макрос (второй параметр метода) в указанное время (первый параметр метода):

OnTime (Время, ИмяПроцедуры As String, [. ]) .

Пример: запускает процедуру «Test» в 9 ч 30 мин —

OnTime (TimeValue(”09:30:00″ ) , «Test»)

Запускает на выполнение макрос (процедуру или функцию) проекта рабочей книги или функцию из DLL или XLL. Синтаксис: Run(ИмяМакроса, Аргументы).

Пример: запускает вычисление факториала (функция Fakt) для числа 5 (аргумент функции) — f=Application.Run(«Fakt», 5)

Временно приостанавливает работу приложения на заданное время: Wait(Time) As Boolean.

Пример: Application.Wait (Now + TimeValue(«0:00:15″))

Закрывает приложение. Пример: Application . Quit

Объект Application может обрабатывать более 20 событий. Большая часть из них возникает в процессе работы с объектами Workbook (рабочая книга), Sheet (страница документа) и Window (окно). Почти все события, кроме NewWorkBook, могут быть обработаны на двух уровнях — объектом Application и объектом Workbook.

Важные события объекта Application приведены в табл. 8.3.

События объекта Application

При создании новой рабочей книги

При активизации рабочей книги

Перед закрытием рабочей книги

Перед сохранением рабочей книги

При потере фокуса (перестает быть активной)

При добавлении нового листа в рабочую книгу

При открытии рабочей книги

Функция CountA объекта Application. Часто в программах на VBA необходимо осуществить поиск последней заполненной ячейки в некотором диапазоне. Для этого можно использовать функцию COUNTA объекта Application. Данная функция подсчитывает количество непустых ячеек заданного диапазона и количество аргументов, которые содержат значения. Функция учитывает элементы, содержащие числовые значения и другие непустые значения, в том числе текст, значения даты и логические значения.

Синтаксис функции CountA:

где arg1> arg2t . argn являются диапазоном ячеек или значениями (константами). Может быть до 30 аргументов.

Рассмотрим, как можно использовать функцию CountA в некотором коде на VBA. Пусть на листе Excel содержится информация, приведенная на рис. 8.3.

Рис. 8.3. Фрагмент листа MS Excel

Исходя из приведенной на рис. 8.3 Excel-таблицы при вызове функции CountA в коде VBA будут получены результаты, приведенные в табл. 8.4.

Иллюстрированный самоучитель по Architecture .NET

Состояния в приложениях ASP.NET. Статические элементы данных. Объект Application (Приложение). Объект Session (Сеанс).

Сохранение состояния при запросах, посылаемых по протоколу передачи гипертекстовых файлов HTTP, – главная проблема в Web-программировании ASP.NET предоставляет для этого несколько удобных функций Необходимо сохранять два типа состояния.

  • Состояние приложения – глобальная информация, которая совместно используется всеми пользователями Web-приложения
  • Состояние сеанса используется для хранения данных конкретного пользователя, который многократно обращается к Web-приложению

Статические элементы данных

Статические элементы данных класса совместно используются всеми экземплярами класса. Следовательно, статические элементы данных могут использоваться для хранения состояния приложения.

Объект Application (Приложение)

Глобальная информация приложения хранится во встроенном объекте Application (Приложение), который является экземпляром класса HttpApplicationState. Удобно получать доступ к этому объекту через свойство Application (Приложение) класса Page (Страница). Класс HttpApplicationState содержит словарь в формате «ключ – значение», используемый для хранения как объектов, так и скалярных величин.

Объект Session (Сеанс)

Информация о сеансе индивидуальных пользователей может храниться во встроенном объекте Session (Сеанс), который является экземпляром класса HttpSession-State. Доступ к этому объекту удобно получать с помощью свойства Session (Сеанс) класса Page (Страница). Класс HttpSessionState, аналогично классу HttpApplicationState, имеет словарь в формате «ключ – значение», который можно использовать для хранения как объектов, так и скалярных величин.

При реализации переменных сеанса возникают некоторые интересные вопросы.

  • Обычно для идентификации сеанса, от которого поступил запрос, используются небольшие фрагменты данных о предыстории обращений данного пользователя к данному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies). Что делать, если такие фрагменты данных (cookies) не поддерживаются браузером, или отключены пользователем?
  • Поддержка состояния сеанса для многих пользователей влечет накладные расходы. Истекает ли срок действия состояния сеанса после определенного периода времени?
  • Высокопроизводительными Web-узлами используется группа серверов. Каким образом приложение может получить необходимые ему данные, если второй запрос обслуживается не той машиной, которой обслуживался первый запрос?

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

По умолчанию небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies), в ASP.NET используются для идентификации сеанса, в котором отправлен запрос. Но ASP.NET можно сконфигурировать так, чтобы при выполнении не создавались эти небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, обычно автоматически создаваемые сервером на машине пользователя (cookies).

В такой модели идентификатор сеанса (Session ID), который обычно сохраняется в небольшом фрагменте данных о предыстории обращений конкретного пользователя к конкретному WWW-серверу, автоматически создаваемом сервером на машине пользователя (cookie), внедряется в унифицированный указатель информационного ресурса (URL). Конфигурация, где не используются небольшие фрагменты данных о предыстории обращений конкретного пользователя к конкретному Web-серверу, автоматически создаваемые сервером на машине пользователя (cookies), обсуждается в следующем разделе.

Предельное время ожидания для состояния сеанса

По умолчанию, предельное время ожидания для состояния сеанса истекает после 20 минут. Это означает, что если данный пользователь находится в состоянии ожидания (простоя) в течение указанного периода времени, сеанс прекращается, и запрос от клиента теперь будет обрабатываться как запрос от нового пользователя, причем будет создан новый сеанс. Как и другие параметры, предельное время ожидания указывается в файле конфигурации, – это мы обсудим в разделе «Конфигурация ASP.NET».

Хранение состояния сеанса

С помощью модели состояния сеанса, которая отделяет хранение информации от использования сохраненной информации приложениями, ASP.NET полностью решает не только проблему группы серверов, но и много других проблем. Модели состояния позволяют реализовать различные сценарии хранения так, чтобы не затрагивать при этом код приложения. Сервер состояния .NET не имеет «активных» объектов для запросов. Вместо этого в конце каждого сетевого запроса все объекты в коллекции сеанса преобразуются в последовательную форму, чтобы запомнить состояние сеанса. Когда тот же самый клиент возвращается к странице, объекты сеанса преобразуются из последовательной формы в параллельную.

По умолчанию, состояния сеанса кэшируются, и поэтому, как правило, хранятся в оперативной памяти. Конечно, в конфигурации можно указать, что в качестве кэша следует использовать память определенной машины или же что состояния сеанса нужно сохранять в базе данных SQL-сервера. В этих случаях данные не привязаны к определенному серверу, и потому данные сеанса могут безопасно использоваться группой серверов.

IT-ЗАМЕТКИ

Инструменты пользователя

Инструменты сайта

Состояние приложения позволяет сохранять глобальные объекты, доступ к которым может получать любой клиент. В основе состояния приложения лежит класс System.Web.HttpApplicationState, который доступен на всех веб-страницах через встроенный объект Application.

Работа с ним происходит аналогично работе с объектом Session. Только свойств, аналогичным свойствам Session — SessionID и Timeout у него нет. Свойство Application возвращает объект класс HttpApplicationState.

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

Например, можно было бы создать обработчик событий в файле global.asax, который отслеживал бы число созданных сеансов или количество поступивших в приложение запросов. Или же можно было бы применить подобную логику в обработчике событий Page.Load для отслеживания количества запросов данной страницы различными клиентами. Ниже показан код для реализации последнего варианта:

Состояние приложения применяется редко, потому что, как правило, является неэффективным. В предыдущем примере счетчик вряд ли бы всегда отображал точное значение, особенно при насыщенном трафике. Например, в случае, если бы одну и ту же страницу одновременно запросили два пользователя, последовательность событий выглядела следующим образом:

Другими словами, один из этих запросов не учитывается, потому что два клиента получают доступ к счетчику одновременно. Во избежание этой проблемы, следует использовать методы Lock() и UnLock(), которые явно позволяют получать доступ к коллекции состояния Application только одному клиенту за раз:

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

Илон Маск рекомендует:  Strspn дать длину совпадающей подстроки
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL