Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11631
Последний выпуск: 19.06.2015

ASP - Работа с семействами

Большинство встроенных объектов ASP предусматривают использование семейств. Семейства — это структуры данных, подобные массивам, в которых хранятся строки, числа, объекты и другие значения. Семейства отличаются от массивов тем, что автоматически расширяются и сокращаются по мере сохранения или извлечения элементов семейства. Кроме того, при изменении семейства позиции его элементов также меняются. Для доступа к элементу семейства можно использовать уникальный строковый ключ элемента, индекс (позицию) элемента в семействе или воспользоваться перебором всех элементов семейства.

Доступ к элементу по имени или индексу

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

<%
  Session.Contents("FirstName") = "Meng"
  Session.Contents("LastName") = "Phua"
  Session.Contents("Age") = 29
%>

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

<%= Session.Contents("FirstName") %>

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

<%= Session.Contents(2) %>

Семейства ASP нумеруются с 1. При добавлении и удалении элементов семейства индексы элементов могут изменяться. Не следует считать индекс элемента постоянным значением. Доступ по индексу обычно используется для перебора элементов семейства, о чем пойдет речь в следующих разделах, или для извлечения элементов семейства, доступного только для чтения.

Кроме того, для доступа к элементу по имени может использоваться сокращенная нотация. Поиск семейств, связанных с объектом, ASP осуществляет в определенном порядке. Если элемент с заданным именем встречается в семействах объекта только один раз, имя семейства можно опустить (однако это может снизить быстродействие):

<%= Session("FirstName") %>

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

Перебор элементов семейства

С помощью перебора элементов семейства можно узнать, что в нем хранится, а также изменить нужные элементы. Для перебора элементов семейства необходимо указать имя семейства. Например, инструкция VBScript For...Each может использоваться для доступа к элементам объекта Session:

<%
  'Declare a counter variable.
  Dim strItem

  'For each item in the collection, display its value.
  For Each strItem In Session.Contents
    Response.Write Session.Contents(strItem) & "<BR>"
  Next
%>

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

<%
  'Declare a counter variable.
  Dim intItem

  'Repeat the loop until the value of counter is equal to 3.
  For intItem = 1 To 3
    Response.Write Session.Contents(strItem) & "<BR>"
  Next
%>

Обычно заранее не известно, сколько элементов содержит семейство. Поэтому в ASP включена поддержка свойства Count для семейства. Это свойство возвращает число элементов в семействе. Свойство Count используется для того, чтобы указать конечное значение счетчика.

<%
  'Declare a counter variable.
  Dim lngItem, lngCount

  lngCount = Session.Contents.Count

  'Repeat this loop until the counter equals the number of items
  'in the collection.
  For lngItem = 1 To lngCount
     Response.Write Session.Contents(lngItem) & "<BR>"
  Next
%>

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

<%
  var intItem, intNumItems;

  intNumItems = Session.Contents.Count;

  for (intItem = 1; intItem <= intNumItems; intItem++)
  {
    Response.Write(Session.Contents(intItem) + "<BR>")
  }
%>

Язык Microsoft JScript поддерживает объекты Enumerator, которые также могут использоваться для просмотра семейств ASP. Метод atEnd определяет, остались ли еще элементы в семействе. Метод moveNext обеспечивает переход к следующему элементу семейства.

<%
  Session.Contents("Name") = "Suki White"
  Session.Contents("Department") = "Hardware"
		.
		.
		.
  //Create an Enumerator object.
  var mycollection = new Enumerator(Session.Contents);

  //Iterate through the collection and display each item.
  while (!mycollection.atEnd())
  {
    var x  = myCollection.item();
    Response.Write(Session.Contents(x) + "<BR>");
    myCollection.moveNext();
  }
%>

Перебор элементов семейства с использованием подразделов

Сценарии допускают встраивание нескольких связанных значений в один модуль настройки клиента, что позволяет уменьшить количество модулей настройки клиента, передаваемых между обозревателем и веб-сервером. Поэтому семейство Cookies для объектов Request и Response может хранить несколько значений в одном элементе. Эти подэлементы, или подразделы, доступны по отдельности. Подразделы поддерживаются только в семействах Request.Cookies и Response.Cookies. Семейство Request.Cookies поддерживает только операции чтения; семейство Response.Cookies поддерживает только операции записи.

Следующие инструкции создают два модуля настройки клиента — обычный и с подразделами:

<%
  'Send a cookie to the browser.
  Response.Cookies("Fruit") = "Pineapple"

  'Send a cookie with subkeys to browser.
  Response.Cookies("Mammals")("Elephant") = "African"
  Response.Cookies("Mammals")("Dolphin") = "Bottlenosed"
%>

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

HTTP_COOKIE= Mammals=ELEPHANT=African&DOLPHIN=Bottlenosed; Fruit=Pineapple;

Кроме того, в семействе Request.Cookies можно просмотреть все модули настройки клиента, а в отдельном модуле — все подразделы. Однако при попытке просмотреть подразделы модуля настройки клиента, в котором подразделов нет, обнаружить какие-либо элементы не удается. Чтобы этого избежать, прежде всего проверьте наличие подразделов в модуле настройки клиента. Это можно сделать с помощью атрибута HasKeys семейства Cookies. Данный прием иллюстрируется следующим примером.

<%
   'Declare counter variables.
   Dim Cookie, Subkey

   'Display the entire cookie collection.
   For Each Cookie In Request.Cookies
     Response.Write Cookie
     If Request.Cookies(Cookie).HasKeys Then
       Response.Write "<BR>"
       'Display the subkeys.
       For Each Subkey In Request.Cookies(Cookie)
         Response.Write " ->" & Subkey & " = " & Request.Cookies(Cookie)(Subkey) & "<BR>"
       Next
     Else
       Response.Write " = " & Request.Cookies(Cookie) & "<BR>"
     End If
   Next
%>

Этот сценарий возвращает следующие результаты:

Mammals
->ELEPHANT = African
->DOLPHIN = Bottlenosed
Fruit = Pineapple

Регистр имени ключа

Семейства Cookies, Request, Response и ClientCertificate допускают обращение к одной и той же уникальной строке — имени ключа. Например, в следующих инструкциях в результате обращения к одному и тому же имени ключа, User, для каждого семейства возвращаются различные значения:

strUserID = Request.Cookies("User")
strUserName = Request.QueryString("User")

Регистр имени ключа устанавливается первым семейством, присваивающим значение этому ключу. Рассмотрим следующий сценарий:

<%
  'Retrieve a value from QueryString collection using the UserID key.
  strUser = Request.QueryString("UserID")

  'Send a cookie to the browser, but reference the key, UserId, which has a different spelling.
  Response.Cookies("UserId")= "1111-2222"
  Response.Cookies("UserId").Expires="December 31, 2000"
%>

Может показаться, что модуль настройки узла получил имя ключа UserId, однако на самом деле этому модулю было присвоено имя UserID (отличающееся регистром букв). Семейство QueryString первым определило регистр данного ключа.

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

Перебор элементов семейства объектов

Семейства Session и Application могут содержать либо скалярные переменные, либо экземпляры объектов. Семейство Contents может содержать как скалярные переменные, так и экземпляры объектов, созданные в результате вызова Server.CreateObject. Семейство StaticObjects содержит объекты, созданные с помощью тега HTML <OBJECT> в области определения объекта Session. Для получения дополнительных сведений об этом способе создания экземпляров объектов см. раздел Задание области определения объектов.

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

<%
  For Each Object in Session.StaticObjects
    Response.Write Object & ": " & Session.StaticObjects(Object)
  Next
%>

Отличия семейств ASP от остальных семейств

Хотя описанные в этом разделе семейства ASP похожи на объект Visual Basic Collection, они имеют ряд отличий. Семейства ASP поддерживают свойство Count и методы Item, Remove и RemoveAll. Метод Add эти семейства не поддерживают.

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
18 апреля 2006, 17:28:20
в примере ошибка вместо intItem написано strItem
2.
Аноним
Мне нравитсяМне не нравится
18 апреля 2006, 17:26:56
<%
'Declare a counter variable.
Dim intItem

'Repeat the loop until the value of counter is equal to 3.
For intItem = 1 To 3
Response.Write Session.Contents(strItem) & "<BR>"
Next
%>
в этом примере ошибка вместо intItem написано strItem
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог