Опубликован: 04.05.2010 | Доступ: свободный | Студентов: 4191 / 524 | Оценка: 4.64 / 4.44 | Длительность: 41:24:00
Лекция 5:

Разработка на ASP.NET. Жизненный цикл страницы, пользовательский интерфейс

< Лекция 4 || Лекция 5: 123456 || Лекция 6 >

6.2. Обзор технологии ASP.NET

ASP.NET – это платформа для создания Веб-приложений и Веб-сервисов, работающих под управлением IIS [11]. Сегодня существуют другие технологии, позволяющие создавать Веб-приложения. К ним, прежде всего, относятся популярные сегодня языки PHP и PERL, технологии JSP, CSP, более старая технология CGI и т.д. Однако, ASP.NET отличается от них высокой степенью интеграции с серверными продуктами, а также с инструментами Microsoft для разработки, доступа к данным и обеспечения безопасности. Кроме того, использование ASP.NET позволяет разрабатывать Веб- и Windows приложения, используя очень похожие технологические цепочки, одинаковые языки программирования, технологии доступа к данным и т.д. Более того, базовые языки программирования, с помощью которых сегодня возможна разработка Веб-приложений являются полностью объектно-ориентированными, что делает разработку исполнимой части, а также ее модификацию, обслуживание, отладку и повторное использование гораздо более простым занятием, чем в других технологиях.

6.2.1. Жизненный цикл Веб-страниц ASP.NET

При выполнении страницы ASP.NET осуществляется ее жизненный цикл, во время которого исполняется ряд шагов обработки, такие как: инициализация, определение элементов управления, восстановление и поддержание рабочего состояния, выполнение кода обработчика событий, а также отрисовка. Знание жизненного цикла страницы необходимо, чтобы иметь возможность записывать код в нужный шаг жизненного цикла с нужным результатом. Кроме этого, при создании собственных элементов управления необходимо ознакомиться с жизненным циклом страницы, чтобы гарантировать правильную инициализацию элементов управления, сбор свойств элементов управления и текущих данных состояния, а также запуска любого управляющего кода [12].

Примечание: Далее будут использоваться такие термины, как состояние просмотра (оно же – состояние вида, ViewState ), сессия (Session) и другие. Их объяснение будет дано позднее, в разделе " Управление состоянием в ASP.NET "
6.2.1.1. Общие этапы жизненного цикла страницы

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

Таблица 6.1. Этапы жизненного цикла страницы
Этап Описание
Запрос страницы Запрос страницы происходит перед началом жизненного цикла страницы. При запросе страницы пользователем ASP.NET определяет, нужно ли обрабатывать и компилировать страницу (до начала жизненного цикла страницы ), или отправить в ответ на запрос кэшированную версию страницы, не запуская ее обработку.
Запуск На начальном этапе устанавливаются свойства страницы, например Request и Response. На этом этапе страница также определяет, является ли запрос обратной передачей или новым запросом, и устанавливает свойство IsPostBack. Кроме этого, на этом этапе устанавливается свойство страницы UICulture.
Инициализация страницы Во время инициализации страницы элементы управления страницы являются доступными, устанавливаются все свойства элементов управления UniqueID. На странице также применяются темы. Если текущий запрос является обратным запросом, данные обратного запроса не загружены, а значения свойств элементов управления не восстановлены к значениям в состоянии просмотра.
Загрузка Во время загрузки, если текущий запрос является обратным запросом, в свойства элементов управления будут переданы данные, восстановленные из состояния просмотра и состояния управления.
Проверка Во время проверки вызывается метод Validate всех проверяющих элементов управления, который устанавливает свойство IsValid отдельных проверяющих элементов управления и страницы.
Обработка событий обратного запроса Если запрос является обратным, вызывается любой из обработчиков событий.
Отрисовка Перед отрисовкой производится сохранение состояния просмотра страницы и всех элементов управления. На этапе отрисовки страница вызывает метод Render для каждого элемента управления, предоставляя модуль записи текста, который записывает полученные данные в OutputStream свойства страницы Response.
Выгрузка Выгрузка вызывается после завершения отрисовки страницы, отправки клиенту и готовности к удалению. На данном этапе свойства страницы, например Response и Request, выгружаются, производится очистка.
6.2.1.2. События жизненного цикла

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

Страницы также поддерживают автоматическую обработку: ASP.NET производит поиск методов с соответствующими именами и автоматически выполняет эти методы при возникновении определенных событий. Если атрибут AutoEventWireup в директиве @Page установлен в значение true (или не установлен, так как он имеет значение true по умолчанию), события страницы автоматически привязываются к методам, которые используют правила именования Page_event, например Page_Load и Page_Init..

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

Таблица 6.2. События жизненного цикла страницы
Событие страницы Типичные случаи использования
PreInit Событие используется:
  • С помощью свойства IsPostBack нужно проверить, обрабатывается ли страница в первый раз.
  • Создание или повторное создание динамических элементов управления.
Init Возникает после инициализации всех элементов управления и применения параметров обложки. Это событие используется для чтения или инициализации свойств элемента управления.
InitComplete Вызывается объектом Page. Это событие используется для обработки заданий, требующих завершения всех инициализаций.
PreLoad Это событие используется при необходимости обработки страницы или элемента управления до наступления события Load. После вызова события при помощи Page оно загружает состояние просмотра для себя и всех элементов управления, затем обрабатывает все данные из обратных запросов, включенных в экземпляр Request.
Load Page вызывает метод события OnLoad в Page, затем рекурсивно выполняет это действие для каждого дочернего элемента управления, до выполнения загрузки страницы и всех элементов управления. Метод события OnLoad используется для установки свойств элементов управления и создания подключения к базе данных.
События элементов управления Эти события используются для обработки определенными событиями в элементах управления, например Button события элемента управления Click или TextBox события TextChanged.
LoadComplete Это событие используется для обработки заданий, требующих полной загрузки всех других элементов управления страницы.
PreRender До события:
  • Объект Page вызывает EnsureChildControls для каждого элемента управления и для страницы.
  • Каждый связанный элемент управления, свойство которого DataSourceID установлено, вызывает свой метод DataBind. Событие PreRender происходит для каждого элемента управления на странице. Это событие используется для внесения окончательных изменений на странице или в ее элементах управления.
SaveStateComplete До этого события ViewState сохраняется для страницы и всех элементов управления. Все изменения на странице или в ее элементах управления на данном этапе будут проигнорированы. Эти задачи используются для сохранения состояния просмотра без внесения изменений в элементы управления.
Render Это не событие; вместо этого на данном этапе обработки объект Page вызывает этот метод для каждого элемента управления. Все серверные Веб-элементы управления ASP.NET обладают методом Render, который записывает разметку элемента управления, отправляемую клиенту. Обычно во время создания пользовательских элементов управления при выводе разметки элемента управления этот метод переопределяется. Однако если пользовательский элемент управления содержит только стандартные серверные элементы управления ASP.NET и не содержат пользовательской разметки, переопределять метод Render не требуется. Пользовательский элемент управления (файл с расширением ASCX) содержит отрисовку по умолчанию, таким образом, нет необходимости отрисовывать элемент управления явным образом.
Unload Это событие происходит для всех элементов управления и затем для страницы. При работе с элементами управления это событие используется для выполнения окончательной очистки определенных элементов управления, например, для закрытия подключений отдельных элементов управления к базам данных. Относительно страницы это событие используется для выполнения окончательных действий, например, для закрытия открытых файлов и подключений к базам данных, а также закрытия пользовательских сеансов или других задач, связанных с запросами.

Достаточно подробно жизненный цикл страницы и серверных элементов управления, а также порядок обработки событий представлен на рис. 6.3.

05_03
Жизненный цикл страницы ASP

увеличить изображение
Рис. 6.3. Жизненный цикл страницы ASP

Источник: ASP.NET 2.0 Page LifeCycle [13]

6.2.1.3. Дополнительные аспекты жизненного цикла страницы

Отдельные серверные элементы управления ASP.NET обладают собственным жизненным циклом, сходным с жизненным циклом страницы. Например, события Init и Load происходят во время соответствующих событий страницы.

Хотя Init и Load рекурсивно происходят с каждым элементом, они выполняются в обратном порядке. Событие Init (а также Unload ) для каждого дочернего элемента происходят до возникновения соответствующего события в его контейнере (снизу вверх). Однако событие Load в контейнере происходит до событий Load в дочерних элементах управления (сверху вниз).

При наследовании класса из класса Page кроме обработки событий страницы можно также переопределять методы базовых классов страницы. Например, при переопределении метода страницы InitializeCulture для динамической установки языка и региональных параметров. Стоит обратить внимание на то, что при создании обработчика событий с использованием синтаксиса Page_event базовая реализация вызывается явным образом и поэтому не требует вызова в методе. Например, метод базового класса страницы OnLoad вызывается вне зависимости от создания метода Page_Load. Однако при переопределении метода OnLoad с применением ключевого слова override ( Overrides в Visual Basic) необходимо вызвать базовый метод явным образом. Например, при переопределении метода страницы OnLoad необходимо вызвать base.OnLoad() ( MyBase.OnLoad() в Visual Basic) для запуска базовой реализации.

6.2.2. Управление состоянием в ASP.NET

Если просмотреть HTML-код любой aspx-страницы, то можно обратить внимание, что внутри формы страницы находятся скрытые поля:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTY1NDU2MTA1MmRkIrOULfk+GC2eXyao7O8emfNAp+4=" />

Эти поля используются для возврата информации серверу. Возврат информации серверу осуществляется с помощью механизма состояний просмотра (состояние вида, ViewState ). Как видно, строка ViewState не является читабельной, т.к. выглядит как последовательность случайных символов. На самом деле, значение ViewState представляет собой строку, заданную в формате Base64 и пользователь может достаточно легко интерпретировать эти данные, преобразовав их в формат ASCII.

ViewState используется для сохранения состояний между отправками страниц на сервер и обратно на клиент, и позволяет серверу понять, как восстановить страницу к прежнему виду и узнать, какие поля пользователь изменил на странице. Это не единственный механизм сохранения состояния, используемый в ADO.NET. Рассмотрим эти механизмы [14, 15].

В табл. 6.3, табл. 6.4, табл. 6.5 приводится краткий сравнительный анализ всех доступных для управления состоянием опций.

Таблица 6.3. Сравнение опций для управления состоянием (часть 1)
Состояние просмотра Строка запроса Специальные cookie-наборы
Допустимые типы данных Все поддающиеся сериализации .NET-типы данных. Ограниченное количество строковых данных. Строковые данные.
Место хранения Скрытое поле на текущей Веб-странице. Строка URL-адреса в браузере. Компьютер клиента (в памяти или небольшом текстовом файле, в зависимости от срока жизни данного cookie-набора).
Срок жизни Сохраняется постоянно для отправки данных на одну страницу. Утрачивается, когда пользователь вводит новый URL-адрес или закрывает окно браузера, однако, может быть сохранена в ссылках. Срок жизни cookie-наборов определяется программистом. Они могут использоваться на нескольких страницах и могут сохраняться между посещениями.
Контекст Ограничивается, но текущей страницей. Ограничивается целевой страницей Все ASP.NET -приложение целиком.
Безопасность По умолчанию является незащищенным, хотя можно воспользоваться директивами Page и принудительно применить шифрование и хеширование. Доступна для просмотра и запросто может быть изменена пользователем. Никак не защищены и могут изменяться пользователем.
Сложности, влияющие на производительность Хранение большого количества информации замедлит процесс передачи, но никак не отразится на производительности сервера. Никаких, потому что количество данных очевидно. Никаких, потому что количество данных очевидно.
Обычно применяется для: Для настройки параметров конкретной страницы. Для отправки идентификационного номера продукта со страницы каталога на страницу подробностей. Для определения персонализированных предпочтений на Веб-сайте
Таблица 6.4. Сравнение опций для управления состоянием (часть 2)
Состояние сеанса (Session) Состояние приложения (Application)
Допустимые типы данных Все поддающиеся сериализации .NET-типы данных. Не поддающиеся сериализации типы поддерживаются, если используется внутрипроцессная служба состояний. Все .NET-типы данных.
Местонахождение хранилища/Место хранения данных В памяти сервера В памяти сервера.
Время жизни Истекает по прошествии предопределенного периода времени (который, как правило, длится 20 минут, но может быть изменен глобально или программно). Совпадает со сроком жизни приложения (который обычно длится до перезагрузки сервера).
Контекст Все ASP.NET -приложение. Все ASP.NET -приложение. В отличие от большинства других типов методов, данные приложения являются глобальными для всех пользователей.
Безопасность Является безопасным/защищенным, потому что данные никогда не передаются клиенту. Однако, подвержено атакам типа перехвата сеанса, если не используется SSL. Является очень безопасным, потому что данные никогда не передаются клиенту.
Сложности, влияющие на производительность Сохранение большого количества информации может значительно замедлить работу сервера, особенно в случае, когда к нему подключается одновременно большое количество пользователей, потому что для каждого пользователя будет создаваться отдельная копия данных сеанса. Сохранение большого количества информации может замедлить работу сервера, потому что срок жизни этих данных никогда не будет заканчиваться, и они и никогда не будут удаляться.
Обычно применяется: Для хранения элементов в "корзине для покупок". Для хранения глобальных данных любого типа.
Таблица 6.5. Сравнение опций для управления состоянием (часть 3)
Профили Кэширование
Допустимые типы данных Все поддающиеся сериализации .NET-типы данных. Не поддающиеся сериализации типы поддерживаются, если создается специальный профиль. Все .NET-типы данных.
Местонахождение хранилища/место хранения данных В конечной базе данных В памяти сервера.
Срок жизни Постоянный Зависит от применяемой вами политики истечения сроков, но может оканчиваться раньше, если серверу перестает хватать ресурсов памяти.
Контекст Все ASP.NET -приложение. К ним также могут доступ и другие приложения. Тот же, что и состояния приложения (глобальный для всех пользователей и всех страниц).
Безопасность Являются довольно безопасными, потому что хотя данные и никогда не передаются клиенту, они хранятся в базе данных, которая может быть "взломана". Является достаточно безопасным, потому что данные никогда не передаются клиенту.
Сложности, влияющие на производительность Позволяют легко сохранять большое количество данных, но не исключают возникновение нетривиальных непроизводительных издержек при извлечении и записи данных для каждого запроса. Сохранение большого количества информации может привести к вытеснению другой более полезной, находящейся в кэше информации. Однако, ASP.NET имеет возможность удалять элементы заблаговременно для гарантии оптимальной производительности.
Обычно применяется: Для хранения информации об учетной записи пользователя. Для хранения данных, извлекаемых из базы данных.
< Лекция 4 || Лекция 5: 123456 || Лекция 6 >