Серия лекций ASP (8) Использование коллекций
Автор:Eve Cole
Время обновления:2009-05-30 19:59:11
Большинство встроенных объектов ASP поддерживают коллекции. Коллекции — это места, где хранятся строки, числа, объекты и другие значения. Коллекции очень похожи на массивы, за исключением того, что коллекция автоматически расширяется и выполняет поиск при сохранении или извлечении элементов. В отличие от массивов, при изменении коллекции положение элементов будет меняться. Доступ к элементам можно получить по их имени, индексу или путем просмотра всех элементов коллекции.
Доступ к элементам по имени и индексу. Вы можете получить доступ к определенным элементам коллекции, используя имя элемента. Например, коллекция Contents содержит все переменные, хранящиеся в объекте Session. Также владеет всеми объектами, созданными Server.CreateObject. Предположим, что в объекте Session хранится следующая информация о пользователе:
<%
Session.Contents("Имя") = "Сэм"
Session.Contents("LastName") = "Ву"
Session.Contents("Возраст") = 29
%>
Доступ к элементам можно получить, используя имя, связанное с элементом, когда он был сохранен в коллекции. Например, следующее выражение возвращает строку «Сэм»:
<%= Session.Contents("Имя") %>
Доступ к элементам также можно получить, используя индекс или номер, связанный с элементом. Например, следующее выражение извлекает информацию, хранящуюся во втором слоте хранилища объекта Session, и возвращает «Woo»:
<%= Session.Contents(2) %>
Коллекции ASP нумеруются начиная с 1. Когда элементы добавляются или удаляются из коллекции, индекс, связанный с элементом, изменяется. Поэтому нельзя предполагать, что индекс предмета останется неизменным. Как будет объяснено в следующих разделах, доступ с использованием индексов обычно используется для обхода коллекции или для доступа к элементам в коллекции, доступной только для чтения.
Доступ к проектам осуществляется с использованием их сокращенных имен. ASP ищет коллекции, связанные с объектами, в определенном порядке. Если элемент с определенным именем встречается в коллекции объектов только один раз, вы можете удалить имя коллекции:
<%= Сеанс("Имя") %>
При доступе к элементам, хранящимся в объектах Application или Session, обычно можно безопасно удалить имя коллекции. Однако для объектов Request лучше указать имя коллекции, поскольку коллекция, скорее всего, будет содержать повторяющиеся имена.
Обход коллекции Просмотрите все элементы коллекции, чтобы узнать об элементах, хранящихся в коллекции, или изменить элементы. При обходе коллекции необходимо указать имя коллекции. Например, вы можете использовать оператор For...Each в VBScript для доступа к элементам, хранящимся в объекте сеанса:
<%
'Объявляем переменную-счетчик.
Тусклый элемент
'Для каждого элемента коллекции выведите его значение.
Для каждого элемента в Session.Contents
Response.Write Session.Contents(Item) & "<BR>"
Следующий
%>
Вы можете использовать оператор For...Next в VBScript для перебора коллекции. Например, чтобы перечислить три элемента, хранящиеся в сеансе в приведенном выше примере, вы должны использовать следующий оператор.
<%
'Объявляем переменную-счетчик.
Тусклый элемент
'Повторяем цикл, пока значение счетчика не станет равным 3.
Для элемента = от 1 до 3
Response.Write Session.Contents(Item) & "<BR>"
Следующий
%>
Поскольку количество элементов, хранящихся в коллекции, обычно неизвестно, ASP поддерживает свойство коллекций Count, которое возвращает количество элементов в коллекции. Вы можете использовать свойство Count, чтобы указать окончательное значение счетчика.
<%
'Объявляем переменную-счетчик.
Тусклый элемент
'Повторяем этот цикл, пока счетчик не станет равным количеству элементов
'в коллекции.
Для элемента = 1 до Session.Contents.Count
Response.Write Session.Contents(Item) & "<BR>"
Следующий
%>
Вы можете использовать оператор for в сценарии для циклического перемещения по коллекции. При использовании свойства Count в инструкции JScript for для достижения лучших результатов следует присвоить значение Count локальной переменной и использовать эту переменную для установки окончательного значения счетчика. Таким образом, обработчику сценариев не нужно искать значение Count каждый раз во время цикла. Следующий пример демонстрирует эту технику:
<%
вар элемент, numitems;
numitems = Session.Contents.Count;
for (item = 1; item <= numitems; item++) {
Response.Write(Session.Contents(item) + "<BR>")
}
%>
В Microsoft JScript 3.0 появился объект Enumerator. Вы можете использовать этот объект для просмотра коллекций ASP. Метод atEnd указывает, есть ли еще элементы в коллекции. Метод moveNext переходит к следующему элементу коллекции.
<%
// Создаем объект перечислителя
вар mycoll = новый Enumerator(Session.Contents);
//Итерируем коллекцию и отображаем каждый элемент
while (!mycoll.atEnd()) {
вар х = mycoll.item();
Response.Write(Session.Contents(x) + "<BR>");
mycoll.moveNext();
}
%>
Скрипт, который перебирает набор подразделов, встраивает соответствующие значения в один файл cookie, чтобы уменьшить количество файлов cookie, отправляемых между браузером и веб-сервером. Поэтому коллекция объектов Request и Response Cookies может иметь несколько значений в одном элементе. Доступ к этим подпунктам или подключевым словам можно получить индивидуально. Только коллекции Request.Cookies и Response.Cookies поддерживают подразделы (подключи). Request.Cookies поддерживает только операции чтения; Response.Cookies поддерживает только операции записи.
Вы можете перечислить все файлы cookie в коллекции Request.Cookie и все подразделы (подключи) в файле cookie. Однако перебор подразделов файла cookie без подразделов не даст никаких результатов. Этого можно избежать, используя синтаксис .HasKeys, чтобы сначала проверить, содержит ли файл cookie подразделы. Пример ниже демонстрирует эту технику.
<%
'Объявляем переменные счетчика
Тусклое печенье, подраздел
'Показать всю коллекцию файлов cookie.
Для каждого файла cookie в Request.Cookies
Response.Write Cookie & "<BR>"
Если Request.Cookies(Cookie).HasKeys Тогда
'Показать подразделы
Для каждого подраздела в Request.Cookies(Cookie)
Response.Write Subkey & "=" & Request.Cookies(Cookie)(Subkey) & "<BR>"
Следующий
Еще
Response.Write «В этом файле cookie нет подразделов <BR>».
Конец, если
Следующий
%>
Перебирать коллекцию объектов
Коллекции сеансов и приложений могут содержать количественные переменные или экземпляры объектов. Коллекция Contents содержит количественные переменные и экземпляры объектов, созданные путем вызова Server.CreateObject. Коллекция StaticObjects содержит объекты, созданные с использованием элемента HTML <OBJECT> в файле Global.asa.
При переборе коллекции, содержащей объект, вы можете получить доступ к идентификатору объекта или его методам и свойствам. Например, предположим, что ваше приложение использует несколько объектов для создания учетных записей пользователей, и каждый объект имеет метод инициализации. Вы можете перебирать коллекцию StaticObjects, чтобы вызвать каждый метод инициализации:
<%
Для каждого объекта в Session.StaticObjects
Session.StaticObjects(Object).InitializeUser
Следующий
%>
Чем отличаются коллекции ASP?
Хотя коллекции ASP, обсуждаемые в этом разделе, очень похожи на объекты коллекций Visual Basic, между ними есть некоторые различия. Коллекции ASP поддерживают свойство Count и метод Item, но не поддерживают методы Add и Remove.