Программирование в IIS

         

Аутентификационные данные подключения к базе данных


Общей проблемой VB-приложений является неправильная поддержка абстракции логики. Если класс clsChair создан для чтения и записи данных в источник типа базы данных, то программист может включить в этот класс свойство Connection. Свойство Connection предоставляет классу информацию, необходимую для подключения к базе данных. Такой подход нежелателен, потому что возникают проблемы с расширяемостью интернет-приложений, написанных на языке VB. Интерфейс класса не отражает реальное положение дел, поскольку объект "стул" не имеет атрибута Connection на самом деле. Размещая свойство Connection в интерфейсе, программист предполагает, что потребителю класса известно, каким образом класс взаимодействует с источником данных. Атрибут Connection и подобные технические атрибуты не должны вредить интерфейсу. Здесь правильным решением является абстрагирование в бизнес-логике от всего, что не относится к объекту в реальной жизни.

Как программист может обеспечить "чистоту" логической абстракции класса и реализовать подключение к базе данных? Ввод вручную информации о подключении в классе, разумеется, не выход из положения, так как требует изменения кода. Всякое программное обеспечение должно иметь параметры состояния, доступные при инициализации или конструировании. Для сервера Windows механизмом хранения данных состояния или инициализации является реестр, который используется всеми утилитами и службами поддержки Windows. Технология .NET унаследовала использование файлов XML для хранения данных о развертывании и состоянии интернет-приложений.

Любая система работает до тех пор, пока программному обеспечению известен контекст хранения данных инициализации. Реестр Windows отыскивается всегда одинаково, независимо от узла его расположения. Программа не должна искать реестр на диске C:, ведь на другом сервере он может располагаться в другом месте. Реестр обладает контекстом, связанным с самим узлом, а не с положением файла на узле, внутри сервера или внутри сервера на отдельном узле.
В интернет-приложениях корневой веб-каталог выступает в роли общего узла контекста. К содержимому или файлам можно обращаться в контексте корневого веб-каталога. Он может располагаться на диске C: или D:, и при выражении контекста как корневого веб-каталога не возникнет проблем, связанных с нахождением значения данного параметра инициализации. Платформа .NET унаследовала стандарт хранения данных развертывания в файлах XML с именем Web.config, которые располагаются в любом каталоге структуры веб-каталогов. Более подробная информация о приложениях .NET и использовании файла web.config приведена в лекциях 2 и 3.

Так как класс clsChair размещен в приложении COM+, то реализован интерфейс IobjectConstruct для получения аутентификационных данных при подключении к базе данных. Для его использования в список ссылок проекта класса добавлена ссылка COM+ Services Type Library (см. рис. 1.7).

Интерфейс IObjectConstrucion реализован с использованием команды Implements, и в класс добавлена подпрограмма события IObjectConstruct_Construct. Эта подпрограмма выполняется при инициализации класса и передает экземпляр объекта классу, представляемому параметром pCtorObj. Экземпляр класса, на который указывает pCtorObj, имеет свойство ConstructString. Значение ConstructString использовалось для инициализации объекта ADO Connection, повсеместно применяемого в классе clsChair. В листинге 1.4

показана подпрограмма события IObjectConstruct_Construct.

Листинг 1.4.

(html, txt)

Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.

Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.


Рис. 1.18.  Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass



'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' ***** locals to class ***** '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ' holds the color of the chair Private m_scolor As String

'Chair ID for class instance Private m_sID As String

'holds the ADO Connection to the data 'source that the object interacts with Private m_Connection As ADODB.Connection

Private m_sErrorMessage As String

Private Sub IObjectConstruct_Construct(ByVal pCtorObj As Object)

On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "IObjectConstruct_Construct"

Dim sConnection As String

sConnection = pCtorObj.ConstructString

'make certain there is something If Len(sConnection) < 1 Then sConnection = DEFAULT_CONSTRUCTION_STRING End If

'establish connection to database server If m_Connection Is Nothing Then Set m_Connection = CreateObject("ADODB.Connection") End If

m_Connection.Open sConnection 'DEFAULT_CONSTRUCTION_STRING 'establish connection to database server Set m_Connection = CreateObject("ADODB.Connection") m_Connection.Open sConnection '"DSN=ASPExample"

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: Exit Sub

Sub_Error_Handler: 'record the error in class instance and rethrow 'for consuming software to learn of issue ProcessErr ERROR_MESSAGE_INFO & _ " Failure obtaining database connection information." & _ " Class will not connect to database" End Sub

Листинг 1.4.

Значение свойства ConstructString устанавливается в окне свойств службы компонентов. Для clsClass строка подключения задана в текстовом поле Constructor String (Строка конструктора) вкладки Activation (Активация) окна свойств компонента ConfigSeat.clsClass (см. рис. 1.18). При использовании данного механизма хранения данных о состоянии инициализации класс clsChair настраивается при помощи обычных служб Windows Server, с которыми знаком любой инженер, обслуживающий такой сервер.

Примечание. Технология доступа к данным Windows, использующая технологию ODBC или OLE-DB, позволяет автоматически сохранять подключения к базе данных.Экземпляр класса подключения ADO, хранящийся в m_Connection, является локальным по отношению к классу clsChair (см. рис. 1.4). Это означает, что подключение открыто, пока существует экземпляр класса clsChair. При уничтожении экземпляра класса clsChair экземпляр подключения ADO уничтожается, однако провайдер ODBC или OLE-DB сохраняет экземпляр подключения для следующего запроса. Не нужно кэшировать объекты подключения или создавать ситуации, требующие кэширования, поскольку Windows и так выполняет эту функцию.


Рис. 1.18.  Вкладка Activation (Активация) окна свойств ConfigSeat.clsClass


Браузер объектов


Свойством называется специальная пара функций, предназначенных для эмуляции одного атрибута класса при использовании класса другой программой. Одна из функций предназначена для считывания значения, а другая – для записи значения. Нажмите на клавишу F2 для открытия специального окна просмотра Object Browser (Браузер объектов) – это интерфейс ко всем программным элементам проекта, открытого в VB IDE. На рисунке 1.6 в левом верхнем поле со списком выбрана библиотека ConfigSeat, а в списке Classes (Классы) в левой части окна содержится класс clsChair.


Рис. 1.6.  Браузер объектов отображает класс clsChair и свойство сolor

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

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

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

Рекомендуется всегда использовать свойства для разрешения установки или считывания атрибута в классе.
Данный подход несколько затрудняет программирование и повышает уровень сложности программного решения, однако в будущем будет проще вносить изменения в класс. Если правила работы класса поменяются, то обновление объекта COM гораздо легче реализовать под общим интерфейсом COM, поскольку код, лежащий в основе функций свойства, используется для корректировки атрибута класса без изменения общего интерфейса класса. Изменение интерфейса класса потребует изменения потребителей класса, поэтому сложности из-за отсутствия абстракции между внутренними членами класса и его внешним интерфейсом, окажутся более серьезными по сравнению с первоначальным усложнением проекта.

В листинге 1.1 приведен код, реализующий класс clsChair.

Листинг 1.1. clsChair With Support to Read and Write the Color to the Instance Option Explicit (html, txt)

Вверху каждого файла кода в VB рекомендуется размещать выражение Option Explicit. Оно проверяет все необъявленные переменные, используемые в коде, при компиляции. При обнаружении таких переменных VB прерывает компиляцию и генерирует сообщение об ошибке. Данное выражение позволяет принудительно объявлять переменные, что полезно для выявления опечаток в именах переменных. Можно провести долгие часы, пытаясь понять, почему переменная не содержит нужного значения, и в результате обнаружить, что эта переменная просто неправильно указана в строке кода. Выявить такие ошибки трудно, поэтому используйте команду Option Explicit. VB настраивается на автоматическое добавление данного выражения в код каждого файла с помощью команды Tools\Options (Сервис\Параметры). Откройте вкладку Editor (Редактор) и отметьте опцию Require Variable Declaration (Требовать объявление переменных).


Добавление нового компонента в приложение COM+ в службы компонентов


Цель создания приложения COM+ – дать возможность службам компонентов обслуживать экземпляры классов в ConfigSeat.dll. Следующим шагом по установке ConfigSeat.dll на несущем сервере является добавление ConfigSeat.dll в только что созданное приложение COM+ New ConfigSeatWeb.

В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на папке Component (Компонент) под пунктом приложения COM+ New ConfigSeatWeb и выберите команду New\Component (Создать\Компонент) (см. рис. 1.15).


увеличить изображение
Рис. 1.15.  Запуск мастера установки компонентов COM+

В окне приветствия мастера установки компонентов COM+ (COM+ Component Install Wizard) нажмите на кнопку Next (Далее) для продолжения работы.В окне Import Or Install A Component (Импорт или установка компонента) нажмите на кнопку Install New Components (Установка новых компонентов).В диалоговом окне выбора файла выберите ConfigSeat.dll и нажмите на кнопку Open (Открыть).

В окне Install New Components (Установка новых компонентов) приведен список компонентов, добавляемых в новое приложение COM+ (см. рис. 1.16 ).


Рис. 1.16.  Окно Install New Component (Установка нового компонента) мастера компонентов COM+ с результатом загрузки библиотеки ConfigSeat.dll.

Данное окно предназначено для открытия библиотек COM DLL, загрузки их в приложение COM+ и отображения выбранных элементов. Нажмите на кнопку Add (Добавить) для открытия диалогового окна выбора файла (см. шаг 4). Выбор других библиотек COM DLL добавит их в списки файлов и компонентов, отображаемые в этом окне. Нажмите на кнопку Next (Далее).

Нажмите на кнопку Finish (Готово). Мастер установки компонента COM+ завершит свою работу, и библиотека ConfigSeat.dll будет добавлена в приложение COM+ New ConfigSeatWeb.



Добавление нового приложения COM+ в службы компонентов


Ниже приведены шаги, с помощью которых новое приложение добавляется в службы компонентов.

Откройте консоль MMC Component Services (Службы компонентов) и разверните дерево элементов в левой части окна; под значком компьютера, содержащего компонент, должна быть открыта папка COM+ Applications (Приложения COM+).

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

Щелкните правой кнопкой мыши на папке COM+ Applications (Приложения COM+) и выберите New\Application (Создать\Приложение) (см. рис. 1.9) для запуска мастера установки приложения COM+ (COM+ Application Install Wizard).

В первом окне мастера нажмите на кнопку Next (Далее).


увеличить изображение
Рис. 1.9.  Добавление нового приложения в консоль управления Components Services (Службы компонентов).

В окне Install Or Create A New Application (Установка или создание нового приложения) (см. рис. 1.10) нажмите на кнопку Create An Empty Application (Создать пустое приложение) для перехода к следующему окну.


Рис. 1.10.  Окно Install Or Create A New Application (Установка или создание нового приложения) мастера установки приложения COM+

В окне Create Empty Application (Создать пустое приложение) (см. рис. 1.11) введите имя приложения COM+; в нашем случае – New ConfigSeatWeb. Имя приложения COM+ не играет особой роли с точки зрения программирования, оно определяет приложение COM+ в консоли управления службами компонентов. Библиотека DLL ConfigSeat является новым компонентом, поэтому выберите значение по умолчанию Server Application (Приложение сервера) в качестве типа активации. Параметр Activation Type (Тип активации) сильно влияет на производительность и надежность приложения COM+.
Для получения более подробной информации об этом параметре обратитесь к разделу "Общие сведения об архитектуре Windows и приложениях служб компонентов". Для продолжения работы нажмите на кнопку Next (Далее).


Рис. 1.11.  Окно Create Empty Application (Создание пустого приложения) мастера установки приложения COM+



В окне Set Application Identity (Установка принадлежности приложения) (см. рис. 1.12) параметром по умолчанию является Interactive User (Интерактивный пользователь). Здесь можно указать одну из встроенных учетных записей: Local Service (Локальная служба) или Network Service (Сетевая служба) – либо вручную присвоить учетную запись для выполнения приложения COM+. Параметр Interactive User (Интерактивный пользователь) подразумевает выполнение приложения COM+ под учетной записью текущего пользователя, находящегося в системе.


Рис. 1.12.  Окно Set Application Identity (Установка принадлежности приложения) мастера установки приложения COM+

Не используйте этот параметр при работе с несущими компонентами приложения COM+, так как приложение COM+ не будет запускаться после выхода пользователя из системы узла.

Учетная запись Network Service (Сетевая служба) является учетной записью пользователя Windows по умолчанию для рабочих процессов в IIS. Учетная запись Local Service (Локальная служба) налагает большие ограничения, нежели учетная запись Network Service (Сетевая служба). Обе учетные записи являются ограничительными и, следовательно, достаточно защищенными для выполнения в них приложений. В рассматриваемом примере для выполнения приложения используется учетная запись Windows с именем webuser, которая создана для работы служб, связанных с интернетом. Учетная запись webuser принадлежит группе users. После ввода и подтверждения пароля webuser нажмите на кнопку Next (Далее).

Появится окно Add Application Roles (Добавить роли приложения) (см. рис. 1.13). По мере усложнения веб-приложений программисты вынуждены, помимо обеспечения контроля доступа к содержимому, определять роли.

Интеграция XML и XSL


Класс clsChair поддерживает обобщение логики представления. Функция GetChairState создает упорядоченную версию объекта "стул" потребителю, осуществляющему построение страницы. Как правило, веб-приложения COM используют ASP-страницу для анализа представления HTML, реализации классов и упрощения прорисовки страницы посредством связывания XML-объектов с документами XML, необходимыми для построения страницы. В ситуации COM – ASP – XSL (или XSLT) можно создать многозвенное приложение, обобщающее типы логики и технологии, приведенные в таблице 1.1.

Таблица 1.1. Звенья и технологии в веб-приложении COM

Название звенаПоддерживаемая технология
Логика представленияЛист XSL или XSLT
Бизнес-логикаVB COM и ASP.
Логика доступа к даннымADO
Логика данныхSQL Server

Страница ASP является уникальной частью программного решения, поскольку объединяет бизнес-логику и логику представления. В программном решении, представленном выше, ASP не была чистым обобщением бизнес-звена или звена представления, поскольку содержала аспекты каждого из них. В листинге 1.14 приведен исходный код страницы-диспетчера ASP, использовавшейся с clsChair. XMLCOMChair.asp не содержит кода HTML, вся страница отображается на листе XSL. Независимо от способа отображения данных из clsChair в браузере, ASP не требует внесения изменений. ASP должна иметь сведения об интерфейсе класса clsChair, поэтому в код включена бизнес-логика. Если в класс clsChair добавляются новые функции или свойства, то нужно отредактировать код ASP. ASP легко параметризуется в соответствии с настраиваемой системой запуска классов, полностью абстрагируясь от бизнес-логики и логики представления.

Листинг 1.14. Source Code for XMLCOMChair.asp object dispatcher (html, txt)

После выполнения экземпляром класса clsChair своей бизнес-логики состояние clsClass преобразуется в XML и используется для построения страницы HTML. Имя листа XSL – formatChair.xsl – хранится в коде ASP, но его можно получить другим способом, например, с помощью аргументов HTTP в представлениях форм или ссылках.
Подпрограмма Drawpage при помощи строкового аргумента, содержащего XML, прорисовывает конечную веб-страницу. Лист XSL определяет способ построения веб-страницы и отображение значений в XML. В XSL можно расположить и другие данные, например, сценарии JavaScript, предназначенные для выполнения в браузере. В листинге 1.15 приведен код листа XSL formatChair.xsl.

Листинг 1.15. Source code for formatChair.xsl (html, txt)

При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.

Теги элементов не соответствуют друг другу. Убедитесь, что в коде используются соответствующие друг другу начальные и конечные теги (включая теги HTML).Несоответствующее расстояние между символами. Необходимо соблюдать правильное количество пробелов между отдельными частями элементов. Лишний пробел между символами "/" и ">" становится причиной некорректного формирования XML.Присутствие специальных символов. Значения элементов и атрибутов не должны содержать специальных символов. Обратитесь к инструкции "Специальные символы в коде XML" для получения более подробной информации.

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

Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).


Рис. 1.21.  XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы



</xsl:comment>

<xsl:comment> Start the HTML page here </xsl:comment> <HTML> <HEAD> <TITLE>XML COM page</TITLE> </HEAD> <BODY>

<xsl:comment> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ build table for chair data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </xsl:comment>

<xsl:for-each select="Chair"> <P>current</P> <TABLE BORDER="1" CELLSPACING="0" CELLPADDING="0"> <TR> <TH>ID</TH> <TH>Color</TH> </TR> <TR> <TD><xsl:value-of select="@ID"/></TD> <TD><xsl:value-of select="@Color"/></TD> </TR> </TABLE> </xsl:for-each>

<xsl:comment> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ XSL parts are completed

Please never forget, all HTML must be well formed also. XSL is also case sensitive. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </xsl:comment>

<P>command </P> <xsl:comment> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ build table for commanding new chair data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ </xsl:comment>

<FORM METHOD = "POST" ACTION = "XMLCOMChair.asp" ID = "frmImage" NAME = "getInfo" > <TABLE BORDER="1" CELLSPACING="0" CELLPADDING="0"> <TR> <TD>Action</TD> <TD> <input TYPE="text" NAME="Action" VALUE="Open or New"> </input> </TD> </TR> <TR> <TD>ID</TD> <TD><input TYPE="text" NAME="ID" VALUE=""></input></TD> </TR> <TR> <TD>color</TD> <TD> <input TYPE="text" NAME="color" VALUE="puce"> </input> </TD> </TR> </TABLE> <input ID="subFull" NAME="subR" TYPE="submit" VALUE="Go"></input> </FORM>



</BODY> </HTML>

</xsl:template> </xsl:stylesheet>

Листинг 1.15. Source code for formatChair.xsl

При XSL-программировании следует иметь в виду несколько важных моментов. Любой файл XSL должен быть правильно сформирован, т.е. соответствовать стандартам XML, принятым Консорциумом WWW (W3C). Ошибки в формировании файлов, как правило, вызываются следующими проблемами в коде XML.

Теги элементов не соответствуют друг другу. Убедитесь, что в коде используются соответствующие друг другу начальные и конечные теги (включая теги HTML).Несоответствующее расстояние между символами. Необходимо соблюдать правильное количество пробелов между отдельными частями элементов. Лишний пробел между символами "/" и ">" становится причиной некорректного формирования XML.Присутствие специальных символов. Значения элементов и атрибутов не должны содержать специальных символов. Обратитесь к инструкции "Специальные символы в коде XML" для получения более подробной информации.

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

Когда программное решение целиком отгружено на сервер, и браузер запрашивает XMLCOMChair.asp, то отображаемая страница должна иметь следующий вид (см. рис. 1.21).


Рис. 1.21.  XMLCOMChair.asp использует clsChair и formatChair.xsl для прорисовки веб-страницы


dll на сервер ее необходимо


После копирования библиотеки ConfigSeat. dll на сервер ее необходимо зарегистрировать или загрузить в службы компонентов как приложение COM+. Для регистрации компонента компания Microsoft разработала утилиту командной строки regsvr32.exe. Для работы с ней выполните следующие действия.

Откройте окно командной строки или выберите Start\Run (Пуск\Выполнить).Введите regsvr32 <имя COM DLL> (где <имя COM DLL> – имя файла библиотеки COM DLL). Для файла библиотеки ConfigSeat.dll команда имеет вид regsvr32 ConfigSeat.dll, а курсор командной строки при выполнении команды должен находиться в той же папке, что и файл ConfigSeat.dll. При запуске regsvr32 из другого места расположения в команде следует указать полный путь к файлу .dll на сервере. Например, если файл ConfigSeat.dll расположен в папке C:\bin\, то команда имеет вид regsvr32 C:\bin\ConfigSeat.dll.Нажмите на клавишу Enter, чтобы зарегистрировать библиотеку COM DLL.В диалоговом окне появится сообщение об успешном завершении регистрации. Нажмите на клавишу OK для закрытия диалогового окна.

Для удаления библиотеки DLL COM или замены ее другой библиотекой следует аннулировать регистрацию библиотеки DLL и удалить соответствующий файл. При аннулировании регистрации из реестра удаляется запись CLSID для данной библиотеки, чем достигается "чистота" реестра и сокращается количество записей. Выполните те же самые шаги, с помощью которых проводилась регистрация, но используйте в команде ключ /u. Например, для аннулирования регистрации файла C:\bin\ConfigSeat.dll команда примет вид regsvr32 /u C:\bin\ConfigSeat.dll. Для просмотра ключей команды и информации о них выполните ее без каких-либо параметров: regsvr32.

При работе с regsvr32 не возникает каких-либо проблем. Это идеальное программное решение, не требующее управления и дополнительной информации о COM-объекте. Регистрация COM-объектов с помощью regsvr32

прекрасно подходит для приложения рабочего стола.


Использование служб компонентов


Установка объекта COM в службах компонентов более предпочтительна для веб-приложений по сравнению с использованием regsvr32, поскольку компоненты веб-приложении зачастую требуют последующего управления и обновления компонентов. Любое программное обеспечение, загруженное в службы компонентов, называется компонентом. Службы компонентов имеют больше возможностей по управлению компонентами, например:

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

Для загрузки объекта COM в службы компонентов сначала нужно создать приложение COM+. Приложение COM+ содержит один или более объектов или компонентов COM. Приложение COM+ в службах компонентов интерпретируется как идеальный (с точки зрения потребителя) развертываемый модуль. Приложение COM+ может использоваться другим процессом, или процесс, под которым выполняется приложение COM+, может быть предоставлен службам компонентов. Запуск (или остановка) приложения COM+ включает (или запрещает) использование всех его компонентов. Если наряду с надежными компонентами загружены ненадежные, то надежные компоненты нужно переместить в другое приложение COM+, которое не требует такого количества административных изменений, как приложение COM+ с проблемными библиотеками DLL. Такая стратегия минимизирует время простоя компонентов приложения, которое не будет "списано со счета" из-за ошибки в одном-единственном компоненте. Появляется возможность более четкого управления установкой компонента, изолированного от остальных надежных компонентов, пока его надежность не будет доказана.



Использование служб компонентов для ролевого доступа


Службы компонентов разрешают ролевой доступ к любому компоненту, загруженному в приложение COM+. Учетные записи пользователей Windows приписываются к роли, и запросы компонента выполняются с помощью аутентификационных данных этих учетных записей. Если эти роли связаны с запрашиваемой частью компонента, то программа-потребитель будет функционировать должным образом; в противном случае она не сможет осуществить доступ к компоненту. Роли связываются с компонентом, загруженным в приложение COM+, на следующих уровнях:

приложение COM+ – все компоненты располагаются в приложении COM+;компонент – конкретный объект COM, загруженный в приложение COM+;коллективные интерфейсы компонента – все методы объекта COM загружаются в приложение COM+;Mметод компонента – конкретный метод в конкретном объекте COM, загруженном в приложение COM+.

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

Включите проверку доступа уровня компонента для приложения COM+.Включите проверку доступа уровня компонента для компонента.Присвойте роль (роли) любой из частей компонента: сам компонент;метод компонента;все методы компонента.

Чтобы включить проверку доступа уровня компонента для приложения COM+, выполните следующие шаги.

В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на пункте COM+ Application (Приложение COM+) и выберите Properties (Свойства).В окне свойств откройте вкладку Security (Безопасность).Отметьте опцию Enforce Component-Level Access Checks (Обязательная проверка доступа уровня компонента).Нажмите на кнопку OK.

Для включения проверки доступа для компонента нужно включить проверку доступа для приложения COM+ и после этого выполнить следующие шаги.

В консоли управления Component Services (Службы компонентов) щелкните правой кнопкой мыши на пункте COM+ Application (Приложение COM+) и выберите Properties (Свойства).В окне свойств откройте вкладку Security (Безопасность).


Для присвоения роли компоненту в целом отметьте роль в списке Roles Explicitly Set For Selected Item(s) (Роли, установленные для выделенных элементов). Все методы компонента унаследуют данную роль.

Для присвоения роли определенным методам внутри компонента отметьте опцию Enforce Component-Level Access Checks (Обязательная проверка доступа на уровне компонента), что позволит в дальнейшем присваивать роли методам компонента.

Нажмите на кнопку OK.

Для компонента ConfigSeat.clsChair, добавленного в приложение COM+ New ConfigSeatWeb, ролевой доступ не требуется, поэтому обязательные проверки доступа уровня компонента не включены. Приложение COM+ New ConfigSeatWeb, тем не менее, настроено на обязательную проверку доступа, поэтому проверки доступа компонентного уровня включены. Если система IIS функционировала под учетной записью по умолчанию, созданной Windows (например, IUSR_имя_компьютера), то ASP-программа, создающая объект ConfigSeat.clsChair, вызовет ошибку, поскольку гостевая учетная запись интернета не имеет доступа к компоненту ConfigSeat.clsChair. После смены ее на другую учетную запись с доступом к указанному компоненту код ASP будет функционировать должным образом. Для использования кодом ASP компонента ConfigSeat.clsChair веб-сайт или виртуальный каталог в IIS настроен на работу с использованием аутентификационных данных учетной записи webuser.

Для настройки доступа выполните следующие шаги.

Откройте окно свойств веб-сайта или виртуального каталога и выберите вкладку Directory Security (Безопасность каталога).Нажмите на кнопку Edit (Изменить) в области Authentication And Access Control (Контроль аутентификации и доступа) для открытия соответствующего окна.По умолчанию опция Enable Anonymous Access (Разрешить анонимный доступ) включена; аутентификационные данные гостевой учетной записи пользователя располагаются в полях User Name (Имя пользователя) и Password (Пароль). Введите webuser в текстовое поле User Name (Имя пользователя) и пароль – в текстовое поле Password (Пароль).Нажмите на кнопку OK несколько раз для закрытия всех окон.

Теперь страницы ASP будут выполняться под учетной записью webuser. При создании страницами ASP компонента ConfigSeat.clsChair аутентификационные данные учетной записи webuser представляются для запроса в службы компонентов. Службы компонентов проверяют разрешения учетной записи webuser на создание и использование компонента, и ASP реализует функции в компоненте ConfigSeat.clsChair.


Использование VB в COM


До сих пор мы показывали построение простейшего веб-приложения COM, включая все этапы процесс разработки. В реальном COM-объекте должен присутствовать набор классов, отражающий объекты, выявленные в процессе сбора требований. Среди возможностей веб-приложений COM следует отметить хранение данных, связанных с выявленными объектами, чтение данных об этих объектах, упорядочивание данных с помощью XML и их форматирование для отображения в браузере. В данной лекции мы пропустим шаги, связанные со сбором требований. В лекции 6 показаны действия, входящие в цикл разработки программного обеспечения.

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

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

Существует проблема, связанная с ОО-анализом и проектированием в VB6. VB6 не позволяет создать действительно объектно-ориентированное программное решение. Эта среда программирования не поддерживает наследование реализации. Отсутствие реального полиморфизма и других возможностей ограничивает его эффективность при разработке приложений, обеспечивающих долговечность, особенно для масштабируемого программного решения. Объекты COM можно построить на других ОО-языках, например, на C++ и Java.

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

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


Модульный тест библиотеки COM DLL


Для тестирования библиотеки ConfigSeat.dll можно создать несложный код ASP, реализующий экземпляр класса clsChair для вывода значения color в браузер и изменения этого значения. Файл ASP DescribeChair.asp (см. листинг 1.2) можно расположить в веб-приложении на сервере с библиотекой ConfigSeat.dll. Файл ASP можно расположить на веб-сайте по умолчанию, созданном при установке IIS. Если сервер не настроен на выполнение exe-файлов, то проведите соответствующую настройку. Для получения инструкций по реализации работы ASP в IIS6 обратитесь к лекции 12 курса "Администрирование web-серверов в IIS".

Листинг 1.2. ASP DescribeChair.asp used to test the COM component ConfigSeat.DLL (html, txt)

Для демонстрации возможностей служб компонентов DescribeChair.asp следует запустить много раз. Нагрузка на веб-сервер, созданная запросами на файл ASP, не обеспечивает достаточный спрос на компонент COM или сервер, на котором он расположен, поэтому службы компонентов не зарегистрируют потребность в ресурсах. Microsoft предлагает две утилиты, предназначенные для проведения проверки нагрузкой.

Тест Microsoft Application Center TestТест Microsoft Web Application Stress (WAS)

WAS – бесплатная программа; Microsoft Application Center Test входит в пакет Visual Studio .NET Enterprise Edition.

Для создания нехватки ресурсов в ASP и просмотра реакции на это условие в Microsoft Application Center Test был создан простой сценарий, моделирующий одновременную работу ста пользователей в течение 5 минут. Такая нагрузка достаточно велика, и службы компонентов испытывали большую нагрузку при обслуживании экземпляра clsChair. В каждый момент времени создавалось от нуля до пяти экземпляров clsChair, обеспечивавших 175 запросов на страницы в секунду. На рисунке 1.17

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


увеличить изображение
Рис. 1.17.  Консоль управления службами компонентов, отражающая использование класса clsChair



Настройка проекта ActiveX DLL


После выбора типа проекта будет создан новый проект с именем Project1 и новый класс Class1. Если сразу скомпилировать проект, то конечный файл будет называться по умолчанию Project1.dll, а идентификатор класса (CLSID), используемый для идентификации класса в команде ASP Server.CreateObject – Project1.Class1. Имена класса и проекта должны быть информативными, а не шаблонными именами по умолчанию. Классу следует присвоить имя применительно к сути создаваемого проекта, а проекту – имя, определяющее файл хранилища или исполнения, внутри которого будет находиться класс.

Примечание. Все COM-объекты, созданные с помощью проекта Active X DLL в VB6, имеют расширение .dll.

Пусть в нашем примере веб-приложение является частью интернет-проекта по выбору параметров мебели с именем ConfigSeat.

Объект "стул" определен в процессе сбора требований, а создаваемый класс предназначен для представления этого объекта и является частью бизнес-логики программного приложения. Данный класс логично назвать clsChair. Префикс cls определяет объект как класс. Элемент Auto List Members в функции Visual Basic IntelliSense отображает имена частей проекта и не различает классы и другие типы файлов, например, модули. Использование префикса cls облегчает идентификацию класса в списке Auto List Members.

Для изменения имени класса откройте окно свойств с помощью команды View\Properties Window (Вид\Окно свойств) и выберите класс в Project Explorer (Диспетчер проектов). Исправьте имя Class1 в области Name (Имя) на clsChair (см. рис. 1.3). (Остальные параметры в окне свойств не меняйте, поскольку для этого требуются глубокие знания процесса разработки VB ActiveX. В данной лекции этот вопрос не рассматривается.)

Вы можете также изменить имя проекта, щелкнув правой кнопкой мыши на имени проекта в Project Explorer (Диспетчер проектов).


Рис. 1.3.  Окно свойств класса

В диалоговом окне свойств проекта во вкладке General (Общие) имеется текстовое поле Project Name (Имя проекта), в котором отображается имя по умолчанию Project1.
В нашем примере назовем проект ConfigSeat. Удалите в текстовом поле имя Project1 и введите ConfigSeat (см. рис. 1.4).

Многие программисты не знают о существовании автоматической нумерации версий в VB6. Номера версий помогают определять последнюю версию разрабатываемой библиотеки DLL с помощью уникальных идентификаторов. При каждой компиляции программного кода номер версии увеличивается. Как правило, объект COM устанавливается на узел несколько раз. Потребители программного обеспечения должны использовать только одну версию (последнюю), и номера версий позволяют работать именно с этой версией. При отсутствии номеров версий для определения последней версии пришлось бы использовать дату создания файла. В некоторых ситуациях (особенно при совместной работе над проектом нескольких программистов) определение номера версии по дате не работает. Для включения автоматического присвоения номеров новым версиям проекта откройте вкладку Make (Создание) в диалоговом окне свойств проекта и отметьте опцию Auto Increment (Автоматическая нумерация). Если вы не сделаете это, ошибки в программе не возникнет. Опция Auto Increment (Автоматическая нумерация) по умолчанию не включена, но мы настоятельно рекомендуем включать ее в каждом проекте.


Рис. 1.4.  Диалоговое окно свойств проекта с новым именем ConfigSeat


Настройка совместимости с двоичными файлами в VB


Если при перекомпиляции ConfigSeat.dll не скомпилирована тестовая структура, то может возникнуть ошибка при создании экземпляра класса. Это возможно для любого COM-объекта, если другая программа использует COM-объект и содержит ссылки на него. В VB проект ActiveX DLL настраивается на совместимость с проектом по умолчанию во вкладке Component (Компонент) окна свойств проекта. При перекомпиляции рассматриваемого проекта ActiveX DLL не будет установлена совместимость с двоичными файлами, поэтому при выполнении других программ со скомпилированными ссылками на библиотеку ActiveX DLL возникнут ошибки.

Для иллюстрации вышесказанного рассмотрим следующую ситуацию: ConfigSeat.dll скомпилирована в 9:00 утра. В полдень скомпилирована тестовая структура с именем testconfigseat.exe. Тестовая структура testconfigseat.exe содержит определенные ссылки на ConfigSeat.dll, и в ее коде класс озаглавлен строго определенным образом. В 18:00 проект ConfigSeat.dll перекомпилирован и установлена совместимость с проектом. При выполнении в 18:08 файл testconfigseat.exe вызвал ошибку, поскольку не смог найти библиотеку ConfigSeat.dll из-за изменения CLSID. При каждой компиляции ConfigSeat без указания совместимости с двоичными файлами генерируется новый CLSID. После настройки компонента на совместимость с двоичными файлами (см. рис. 1.20) VB использует один и тот же CLSID при каждой компиляции DLL, поэтому любое зависимое от библиотеки программное обеспечение работает исправно.

Приложение, использующее библиотеку ActiveX DLL, ожидает интерфейс для данного CLSID. Изменение интерфейса класса иначе, чем добавлением новой функции или свойства, вызовет ошибки в приложениях-потребителях, работа которых основывается на классе.


Рис. 1.20.  Во вкладке Component (Компонент) окна свойств проекта установлена совместимость с двоичными файлами

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



Обработка ошибок


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

В Visual Basic имеется система обработки ошибок, легкая в использовании и управлении. Отсутствие обработки ошибок распространяется и на программу-потребителя. В этом случае пользователь видит малоинформативное сообщение, и программа прерывает свою работу. В веб-приложении, где COM-объект используется страницей ASP, конечному пользователю отображается сообщение об ошибке, если IIS настроен на показ таких сообщений.

Каждая исключительная ситуация, имеющая место в классе clsChair, фиксируется в журнале событий и сохраняется в локальной переменной свойства ChairError. Код написан таким образом, что при получении информации об ошибке приостанавливается его работа. Обработка ошибок в классе clsChair реализована с использованием той же базовой технологии во всех функциях и подпрограммах. Обработчик ошибок устанавливается на входе в функцию или подпрограмму для перехода к определенной строке. Указываются две строки, определяющие стратегию выхода при обработке ошибок: sub_Exit_Done и sub_Error_Handler. Строка sub_Error_Handler представляет стратегию, согласно которой действия осуществляются при возникновении исключительных условий, указанных в выражении On Error. Код, следующий за строкой sub_Exit_Done, представляет собой обычную стратегию выхода функции или подпрограммы, если при работе программы не возникают исключительные ситуации. В листинге 1.5 приведена типовая структура системы обработки ошибок, примененная в классе clsClass.

Листинг 1.5.

(html, txt)

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

фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.

Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.

В листинге 1.6 приведен код подпрограммы ProcessErr.

Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting (html, txt)

ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.


'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value

On Error Resume Next 'destroy objects Exit Function

Sub_Error_Handler: ProcessErr " message about the failure in terms of function"

Листинг 1.5.

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

фиксирует информацию об ошибках в журнале событий Windows для дальнейшего анализа;записывает ошибки в локальную переменную класса для доступа к ней программы-потребителя.

Журнала не будет заполняться до тех пор, пока компонент не будет скомпилирован, по причине ограничения VB и мер безопасности Windows. При выполнении компонента в VB IDE журналы событий не ведутся.

В листинге 1.6 приведен код подпрограммы ProcessErr.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'ProcessErr 'formats error and stores it in error local 'then write to event log. Event logging 'will not function in IDE - only in compiled. ' 'in: vsMessage - usually denoting function 'out: nothing '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Sub ProcessErr(ByVal vsMessage As String)

Const ERROR_SEPARATOR = " -- " Const NOW_TIME_FORMAT = "yyyy mmm d hh:mm:ss" Const A_SPACE = " " Const ERROR_NUM = " Error #" Const ERROR_BY = " was generated by "

Dim sDateTime As String

'get a time data stamp sDateTime = CStr(Format(Now, NOW_TIME_FORMAT)) & _ ERROR_SEPARATOR

'construct the error entry vsMessage = sDateTime & vsMessage

'add err object data to the error entry m_sErrorMessage = vsMessage & ERROR_NUM & Err.Number _ & ERROR_BY & Err.Source & A_SPACE & Err.Description & vbCrLf

'write to event log App.LogEvent m_sErrorMessage, vbLogEventTypeError

End Sub

Листинг 1.6. ProcessErr Subroutine – Error Logger and Formatting

ProcessErr записывает время и добавляет его к описанию ошибки. Свойства класса VB Err конкатенируются в строку, которая станет частью сообщения об ошибке, фиксируемого и сохраняемого в локальной переменной ошибки.


Общие сведения об архитектуре Windows и приложениях служб компонентов


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

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

Стремясь к сокращению системных ресурсов, связанных с запуском и работой процессов, программисты разрабатывают программное обеспечение для загрузки в память под существующим процессом вместо создания нового процесса. Сравнение веб-приложений Common Gateway Interface (CGI) и веб-приложений ASP показывает различие, о котором идет речь. Если на веб-странице, требующей работы приложения CGI, наблюдается 10 посещений в минуту, то независимо от сложности этой работы серверу придется запускать исполняемый файл CGI 10 раз в минуту, т.е. 600 раз в час.

Если страница ASP выполняет те же задачи, что и исполняемый файл CGI, то через один и тот же интервал времени запускаются нулевые процессы. На самом деле запускается лишь один процесс, и это происходит при старте сервера; этот процесс – IIS. Расширение ISAPI ASP.DLL работает в пространстве процесса IIS. Раньше службы IIS останавливались без видимых причин после продолжительного периода времени.
Подобные ошибки возникали из-за повреждения процесса IIS и его дестабилизации исключением, утечкой памяти или невыпущенными указателями. Причиной этому была загрузка библиотеки DLL с дефектами в пространство процесса IIS. Эта унаследованная особенность (или ошибка) в архитектуре Windows привела к тому, что IIS воспринимается как ненадежная система в сравнении с другими, менее сложными системами, использующими CGI.

Для повышения надежности без потерь производительности (что возможно при работе программного обеспечения в собственном независимом процессе) был разработан сервер Microsoft Transaction Server (MTS) для Windows NT 4. MTS превратился в службы приложений (или COM+) на платформе Windows 2000. На каждой новой платформе у служб компонентов появлялись новые возможности. Основным достоинством служб является то, что они выступают в роли сервера DLL. Библиотеку DLL объекта COM можно загрузить в приложение COM+, и она будет выполняться в своем собственном процессе или в процессе программы-потребителя. Приложение сервера COM+ выполняется в собственном процессе, а приложение библиотеки – в процессе программы-потребителя. Если используемые библиотеки DLL надежны и не требуют частого изменения и обновления, то их следует размещать в приложении библиотеки, так как среднестатистическое программное решение использует меньше ресурсов сервера и функционирует с большей производительностью. Если библиотеки DLL созданы недавно, ненадежны или требуют частого обновления, то их следует располагать в приложении сервера. Это исключит сбои в обычной программе при возникновении ошибки в компоненте, и для обновления не потребуется полная остановка этой программы.


Построение тестовой структуры


Любое программное обеспечение необходимо тестировать, и VB IDE для этого имеется прекрасный механизм. Нажмите на кнопку Start (Пуск) в панели инструментов VB либо на клавишу F5, чтобы откомпилировать и выполнить программу.

Поскольку проект ConfigSeat является библиотекой ActiveX DLL, его нельзя выполнить, т.к. он должен использоваться другой исполняемой программой. Для тестирования класса clsChair следует создать еще один проект в том экземпляре IDE, где редактируется clsChair.Это будет исполняемая программа с одной задачей – тестированием класса clsChair. Программа для тестирования другой программы называется тестовой структурой.

В Visual Basic выберите команду File\Add Project (Файл\Создать проект) для открытия диалогового окна Add Project (Создание проекта).Во вкладке New (Новый проект) выберите шаблон проекта Standard Exe. Будет создан новый проект с именем Project1, содержащий форму Form1.В Project Explorer (Диспетчер проектов) щелкните правой кнопкой мыши на новом проекте и выберите Set As Start Up.Переименуйте проект, присвоив ему имя clsChairTester.В настоящий момент класс clsChair недоступен, поскольку в тестовой структуре clsChairTester нет ссылки на проект ConfigSeat. Для создания ссылки выберите команду Project\References (Проект\Ссылки) для открытия диалогового окна References (Ссылки) (см. рис. 1.7).


Рис. 1.7.  Диалоговое окно проекта References (Ссылки)

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

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

Элемент form1 можно настроить на отображение функционирования различных компонентов класса clsChair.
Используемый подход заключается в представлении всех свойств класса в виде текстовых полей, всех функций – в виде кнопок, с текстовыми полями для аргументов формы тестовой структуры соответствующего класса. Тестовую структура нужно сохранить вместе с исходным кодом тестируемого класса, так как в будущем это поможет при усовершенствовании класса или устранении ошибок.

Примечание. Рассматриваемая тестовая структура – clsChairTester – сохранена с исходным кодом данной лекцию и доступна на веб-сайте автора книги.

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

Нажмите на клавишу F5 для запуска тестовой структуры. Выходные данные покажут, что объект успешно создан, и что цвет стула равен значению Brown (Коричневый).Введите новый цвет и нажмите на кнопку Set New Color (Присвоить новый цвет).

На рисунке 1.8 показана тестовая структура, при работе которой цвет стула успешно изменен в нескольких тестах.


Рис. 1.8.  Тестовая структура clsChair тестирует свойство color


Построение в VB6 COM-объекта с поддержкой доступа к данным


Возьмем созданный ранее объект "стул" и используем его в дальнейшем процессе разработки, т.е. усовершенствуем объект, добавив функции чтения и записи данных в базу данных, упорядочивание состояния экземпляра класса и его фиксирование в документе XML. В класс clsChair добавятся следующие функции.

OpenChair(ID as string) as Boolean – открывает имеющуюся запись "стул" и заполняет объект значениями.CreateChair() as Boolean – генерирует новый ID, заполняет объект новым ID и записывает запись в базу данных.GetChairState() as XMLDOM – упорядочивает состояние объекта в XML DOM в виде: <Chair ID="" Color="" />.

В класс clsChair добавятся следующие свойства.

ChairID as String – Read Only . Идентификатор, используемый для уникальной идентификации рассматриваемого объекта "стул".ChairError as String – Read Only. Описание последней обнаруженной ошибки, имевшей место в классе clsChair.

Интерфейс по-прежнему не сложен, однако теперь он более соответствует классу в истинном объектно-ориентированном программном решении. Целесообразно добавить в интерфейс и другие функции: delete (удаление) и save (сохранение) – однако для сокращения приводимых в книге примеров рассматривать их не будем.

Имя chair предшествует именам функций в классе clsChair. Создавать интерфейс к объекту, использующий имя самого объекта, не рекомендуется, однако этого требуют ограничения данной технологии. Оpen и create являются ключевыми словами, зарезервированными в VB, поэтому их нельзя использовать в качестве имен пользовательских функций в экземпляре класса. Следует заметить, что наследование класса не содержит какой-либо логики, за исключением того, что связано с описанием самого стула или с его действиями в рассматриваемом сценарии. Отсутствует логика данных или логика представления, например, строки подключения к базе данных или HTML-вывод.

В листинге 1.3 приведен общий интерфейс объекта "стул"; он содержит объявления следующих функций, включая код реализации.

Листинг 1.3.

(html, txt)



Применение библиотеки COM DLL


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

В Project Explorer (Диспетчер проектов) выберите проект ConfigSeat.Выберите команду File\Make ConfigSeat.dll (Файл\Создать ConfigSeat.dll).

Откроется диалоговое окно Make Project (Создать проект), в котором нужно ввести имя файла и расположение новой библиотеки DLL. Измените имя файла или путь к файлу, если это необходимо, и нажмите на клавишу OK.

VB откомпилирует проект ConfigSeat и создаст файл .dll. Библиотека DLL автоматически зарегистрируется на узле, и ее можно будет сразу использовать. (О регистрации DLL речь пойдет в следующем подразделе.)

Скопируйте новую библиотеку DLL на несущий сервер. Библиотека DLL не обязательно должна находиться в корневом веб-каталоге – ее можно расположить в любом месте узла. Рекомендуем выбрать папку вне корневого веб-каталога, специально предназначенную для хранения двоичных компонентов веб-приложения. Размещение двоичных COM-файлов в корневом каталоге представляет необоснованный риск, ведь при наличии ошибки в настройках веб-сервера пользователь получает возможность доступа и загрузки двоичного файла COM.



Расширенная тестовая структура


Новый класс clsChair можно протестировать после расширения тестовой структуры (см. рис. 1.8) для проверки созданного интерфейса. В тестовую структуру были добавлены кнопки Get XML (Получить XML), Open (Открыть) для открытия нового экземпляра объекта "стул" и Create (Создать) (см. рис. 1.19). Перед нажатием на кнопку Open (Открыть) укажите в текстовом поле аргумент стула ID.


Рис. 1.19.  Расширенная тестовая структура для clsChair



Создание интерфейса класса в ActiveX DLL


Объект "стул" имеет некоторые атрибуты: цвет, высота, наличие или отсутствие колес. Эти атрибуты можно присоединить к классу в виде свойств. Ниже показано, как расширить класс clsChair добавлением свойства color.

Выберите команду Tools\Add Procedure (Сервис\Добавить процедуру).Введите имя свойства в текстовом поле Name (Имя) (см. рис. 1.5).В области Type (Тип) выберите Property (Свойство).В области Scope (Область) выберите Public (Общая).Нажмите на клавишу OK, и в соответствующем окне отобразится код, представляющий структуру свойств Let и Get.


Рис. 1.5.  Диалоговое окно Add Procedure (Добавление процедуры)



Специальные символы в коде XML


В XML для описания данных используется обычный текст, поэтому возможны проблемы, связанные с расшифровкой данных из структуры XML. Возьмем, к примеру, имя сотрудника компании O'Brien. Что произойдет, если программа поместит список сотрудников, в который входит и O'Brien, в документ XML, предназначенный для отображения в браузере? Элемент XML будет выглядеть так: <имя сотрудника="O'Brien">. Если апостроф не будет закодирован как специальный символ, то в анализаторе XML при загрузке кода произойдет ошибка. При кодировании специальных символов соответствующим образом элемент XML примет вид: <имя сотрудника="O&apos;Brien">.

Многие символы требуют кодирования. Специальные символы представляются в виде числовых ссылок из набора символов ISO/IEC 10646. Некоторым символам присвоены специальные знаковые последовательности, вид которых соответствует обозначаемому символу.

СимволПоследовательность знаков общей сущности
&&amp;
<&lt;
>&gt;
'&apos;
"&quot;

Например, числовая ссылка на символ "&" имеет вид "&#38;", можно использовать и представление "&amp;". Числовым представлением символа "=" является "&#61;". Для данного символа отсутствует знаковая последовательность. Для получения информации о других символах и эквивалентных им представлениях обратитесь к Приложению. Дополнительная информация по XML приведена на странице http://www.w3.org/TR/REC-xml, где можно ознакомиться с W3C-спецификацией для XML.



Структурирование данных в XML


Функция GetChairState создает документ XML, описывающий экземпляр класса clsChair. XML является простым одноэлементным документом. Элемент Chair содержит два атрибута: ID и Color. Для использования объекта XML добавьте в проект ссылку на библиотеку MSXML (см. рис. 1.7). В нашем проекте выбрана библиотека Microsoft XML v3.0, но существуют и другие версии этой библиотеки. На момент публикации книги уже вышла четвертая версия. В подпрограмме применяется конкатенация строк для построения XML и возврата строки из класса. Однако такой подход опасен, поскольку в большинстве XML-анализаторов сразу возникнет ошибка при некорректности любой части XML. Создание XML с использованием анализатора позволит правильно построить XML. В листинге 1.12 приведен исходный код функции GetChairState.

Листинг 1.12. Function GetChairState (html, txt)

После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document

интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.


'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return object Set GetChairState = xmlChair

On Error Resume Next 'destroy objects Set xmlChair = Nothing

Exit Function

Sub_Error_Handler: ProcessErr " Failure serializing chair into XML. "

End Function

Листинг 1.12. Function GetChairState

После изучения кода в листинге 1.12 становится ясно, почему при построении XML используется конкатенация строк. Применение DOM Document

интуитивно непонятно, и кажется, что для построения форматированной строки выполняется очень большой объем работы. Первая версия библиотеки XML MSXML.DLL была медленной и неэкономичной с точки зрения ресурсов; здравомыслящий программист реализует XML гораздо быстрее конкатенацией строк. Язык VB не достаточно эффективен для этого. Сокращение изменений, вносимых в строку, кардинально улучшает производительность. Поскольку технологии, связанные с XML, являются довольно новыми, программное обеспечение, поддерживающее эти технологии, должным образом не "устоялось". Программист должен быть в курсе новых данных от производителя и авторов статей и книг, так как данная технология постоянно модернизируется.


Свойства в классах


Свойства в VB представляют собой обычные функции для упрощения доступа и присвоения значений. Программист может включить в подпрограмму свойства код, реализующий работу программы. Рекомендуется создавать функции или подпрограммы для ситуаций, в которых работа выполняется программой. Хорошим примером функции в классе clsChair, являющейся свойством "только для чтения", будет GetChairState(). GetChairState() выполняет работу по созданию кода XML, поэтому она размещена в функции, возвращающей экземпляр класса. Если класс DOMDocument30 сохранен в локальной переменной класса и инициирован после вызова функции Open() или Create(), то использование свойства с доступом "только для чтения" является лучшим способом возврата экземпляра класса DOMDocument30.

Поскольку свойства ChairError и ChairID доступны только для чтения, то при попытке записи в функцию значения произойдет ошибка. Свойство color является единственным свойством, поддерживающим чтение и запись, поскольку существуют два прототипа свойства – Get и Let. Свойства ChairError и ChairID доступны только для чтения, поэтому содержат только прототип Get.

Ни в одном фрагменте кода данной лекции не показана еще одна возможность VB, которая, правда, не очень важна. Свойство может принимать и возвращать аргумент экземпляра класса. Если для принятия экземпляра класса используется прототип свойства, то используется ключевое слово Set, а не Let. Например, если класс clsChair имеет свойство записи ChairState, которое воспринимает экземпляр класса XML DOM как аргумент, то прототип выглядит следующим образом:

Public Property Set ChairState(ByVal vNewValue As DOMDocument30) End Property



отображается диалоговое окно New


После запуска Visual Basic 6 отображается диалоговое окно New Project (Новый проект) (см. рис. 1.2), в котором выбирается тип проекта. Для построения COM-объектов веб-приложения выберите ActiveX DLL и нажмите на кнопку Open (Открыть).

Рис. 1.2.  Диалоговое окно нового проекта в Visual Basic 6
В VB6 можно создать проекты других типов, например, исполняемые файлы и элементы управления ActiveX. Проекты ActiveX EXE и Standard EXE обычно используются при разработке приложений. Проект исполняемого файла мы рассмотрим далее при создании тестовой программы для библиотеки DLL ActiveX. В проекте ActiveX Control мы сгенерируем элемент управления ActiveX, передаваемый браузеру или используемый в приложениях рабочего стола.
Из-за ограничений, связанных с разработкой программ в VB runtime, элементы управления ActiveX, написанные на VB, не подходят для веб-разработки, поскольку после установки программы на клиенте зачастую требуется перезагрузка компьютера для работы с новым элементом управления ActiveX.

Загрузка в COM+ с помощью строки Constructor


ConfigSeat.dll можно скопировать в среду сервера и разместить в приложении COM+, заменив предыдущую версию ConfigSeat.dll. Приложение COM+ в службах компонентов может заблокировать DLL. После отключения приложение в службах компонентов библиотека DLL освобождается для удаления. Если библиотека DLL участвует в работе веб-приложения, то веб-сервер не будет использовать класс clsChair после удаления классов в DLL из приложения COM+.

Сейчас мы выполним загрузку новой версии clsClass в приложение COM+ New ConfigSeatWeb.

В консоли управления службами компонентов удалите старую версию ConfigSeat.clsClass, щелкнув правой кнопкой мыши на компоненте и выбрав Delete (Удалить).Добавьте новую версию компонента так же, как и первую версию, с помощью мастера установки компонентов COM+ (COM+ Component Install Wizard ).По окончании работы с мастером щелкните правой кнопкой мыши на классе в консоли управления Component Services и выберите Properties (Свойства), чтобы открыть окно свойств для класса ConfogSeat.clsClass.Откройте вкладку Activation (Активация) и отметьте опцию Enable Object Construction (Включить конструирование объекта). Затем введите текст, который должен получить класс от подпрограммы события IObjectConstruct_Construct, приведенной в листинге 1.4. В классе ConfigSeat.clsClass строка конструктора содержит строку подключения ADO для получения доступа к информации в базе данных (см. рис. 1.18).Убедитесь, что класс clsChair загружен, выполнив на нем быстрый модельный тест. Тестовая структура проясняет функциональность класса внутри новой среды. Исполняемый файл скопируйте на узел и запустите. Выполните более простой тест с помощью DescribeChair.asp (см. листинг 1.2), добавив несколько новых вызовов функций для нагрузки компонента. В листинге 1.13 приведена расширенная версия файла DescribeChair.asp с именем DescribeChairFinal.asp.

Листинг 1.13. DescribeChairFinal.asp used to demonstrate added interface of clsChair. (html, txt)

Запустите тест нагрузкой из утилиты Microsoft Application Center Test, и вы увидите, что работа приложения ASP – COM – база данных требует больше ресурсов, чем простое приложение ASP – COM. Предыдущая версия clsChair не предусматривает взаимодействия с базой данных, и база данных располагается на том же сервере, где расположены ASP и COM-объект clsChair. При моделировании одновременной работы 100 пользователей в течении 5 минут выяснилось, что приложение способно поддерживать среднюю нагрузку, равную 45 запросам на страницы в секунду.

На рисунке 1.17 показано окно служб компонентов, отображающее состояние предыдущего теста. В тесте для предыдущей версии clsChair заголовки Call и Call Time не регистрировали никаких значений, кроме 0. В последней версии clsChair поле In Call стабильно отображало значения от 0 до 1, а поле Call Time стало равным 15 мс. Очевидно, что производительность компонента заметно снизилась по сравнению с проведенным ранее тестом. Как видите, дополнительная функциональная нагрузка, связанная со считыванием информации из базы данных, снижает эффективность работы веб-приложения.


' create the object since this is hard work set o = Server.CreateObject("ConfigSeat.clsChair")

'demonstrate that values were changing Response.Write("<p> color=" & o.color & "</p>") Response.Write("<p>change color to blue</p>") o.color = "blue" Response.Write("<p> color=" & o.color & "</p>")

if o.CreateChair() then Response.Write("<p> new id=" & o.ChairID & "</p>") else Response.Write("<p> possible error=" & o.ChairError & "</p>")

end if

set oXML = o.GetChairState()

Response.Write("<p> xml=" & oXML.XML & "</p>")

Response.Write("<p> open new chair</p>")

if not o.OpenChair("20021129095221") then Response.Write("<p> possible error=" & o.ChairError & "</p>") end if

Response.Write("<p> new chair color should be purple</p>") Response.Write("<p> new chair color =" & o.color & "</p>")

'destroy object so it can be created again set o = nothing %> </BODY> </HTML>

Листинг 1.13. DescribeChairFinal.asp used to demonstrate added interface of clsChair.

Запустите тест нагрузкой из утилиты Microsoft Application Center Test, и вы увидите, что работа приложения ASP – COM – база данных требует больше ресурсов, чем простое приложение ASP – COM. Предыдущая версия clsChair не предусматривает взаимодействия с базой данных, и база данных располагается на том же сервере, где расположены ASP и COM-объект clsChair. При моделировании одновременной работы 100 пользователей в течении 5 минут выяснилось, что приложение способно поддерживать среднюю нагрузку, равную 45 запросам на страницы в секунду.

На рисунке 1.17 показано окно служб компонентов, отображающее состояние предыдущего теста. В тесте для предыдущей версии clsChair заголовки Call и Call Time не регистрировали никаких значений, кроме 0.В последней версии clsChair поле In Call стабильно отображало значения от 0 до 1, а поле Call Time стало равным 15 мс. Очевидно, что производительность компонента заметно снизилась по сравнению с проведенным ранее тестом. Как видите, дополнительная функциональная нагрузка, связанная со считыванием информации из базы данных, снижает эффективность работы веб-приложения.


Запись в базу данных


Реализация функций CreateChair и OpenChair требует взаимодействия с базой данных. Функция CreateDir вставляет данные о новом объекте "стул" в базу данных, в OpenChair заполняет состояние экземпляра класса значениями, считанными из базы данных. Функция Createchair генерирует для этого объекта идентификатор ID, создает команду SQL и записывает новые значения в базу данных при помощи выражения SQL INSERT. В листинге 1.7 приведен код функции CreateChair.

Листинг 1.7. Function CreateChair (html, txt)

При вызове функции CreateNewID генерируется новый ID объекта "стул". CreateNewID вызывает функцию New(), форматирует значение в виде уникального числа и преобразует его в строку. В листинге 1.8 приведен исходный код функции CreateNewID. Данный алгоритм имеет большой недостаток. Он генерирует уникальную строку ID только в том случае, если запрос выполняется через 1 с после предыдущего запроса ID. Для получения уникальных значений необходимы более приемлемые подходы, например, использование функции глобально уникального идентификатора Windows (GUID) или других самодельных функций с генератором случайных чисел. Этот недостаток не был устранен, чтобы класс clsChair стабильно генерировал ошибку при записи информации в базу данных. Ошибка возникает из-за того, что ID объекта "стул" является главным ключом в таблице базы данных, в которой находится информация об этом объекте. Запись строки, содержащей такое же значение ID, что и записанное ранее, приведет к ошибке обновления ADO.

Листинг 1.8. Function CreateNewID (html, txt)

После генерации ID конструируется выражение SQL с использованием констант, являющихся частью выражения обновления SQL, с помощью которого новые данные записываются в базу данных. Использованное значение color в действительности является локальным значением m_scolor. Свойство color, как и me.color, можно (и нужно) использовать вместо локального значения m_scolor. Если свойство color нужно подтвердить или изменить из его текущего состояния в экземпляре класса, то оно пригодится для внесения небольшого изменения в код в единственном месте, однако в этом случае потребуется изменить код и в свойстве, и в функции при помощи переменной m_scolor.


После построения команды SQL функция ExecuteCommand передает эту команду в базу данных для выполнения (см. листинг 1.9). В этой функции не предусмотрен возврат значения от события. При выполнении операции ExecuteCommand использует ADO.

Для работы с технологией ADO в набор ссылок проекта ConfigSeat нужно добавить ссылку на ADO. ADO инсталлируется при помощи пакета Microsoft Data Access Components (MDAC). ADO присутствует в ссылках Visual Basic как библиотека ActiveX Data Objects x Library, где x – номер версии MDAC. На момент написания данной книги последней версией пакета была версия 2.7, но можно использовать и версию 2.6. Если программное обеспечение располагается на узле с NT 4, то нужно использовать версию 2.6.

Листинг 1.9. Function ExecuteCommand (html, txt)

В большей части вызовов Err.Raise, выполняемых при возникновении исключительных ситуаций, выводится номер ошибки 1001. Можно указать любой номер, однако это число выбрано для простоты. Используйте числа из диапазона 1000 – 65535, предназначенного для нумерации особых ошибок. Объект ADO Command предназначен для вызова сервера базы данных. Если от объекта Command ожидается набор записей Recordset, то функция Execute возвращает набор записей ADO Recordset. Так как объект ExecuteCommand изначально не предназначен для возврата набора записей Recordset, объект Recordset, возвращаемый от объекта Command, игнорируется.

ExecuteCommand проверяет, что локальный объект подключения m_Connection установлен и жизнеспособен. После этого создается объект Command и настраивается на отправку серверу команды SQL. Если во время выполнения ExecuteCommand возникнет ошибка, обработчик ошибок зафиксирует ее и выйдет из функции, возвратив значение "ложь". Все переменные типа boolean в VB имеют значение "ложь", если им не присвоены иные значения, поэтому включите в программу код, присваивающий функции значение "истина" по достижении успеха.

Функция OpenChair открывает набора записей ADO Recordset по известному ID объекта "стул", переданного функции, и заполняет экземпляр класса по результатам перемещения к первой записи набора Recordset.


В листинге 1. 10 приведен исходный код функции OpenChair. Так как ID объекта "стул" является уникальным в базе данных, то ввиду ограничений работы с данными безопаснее считать, что функция возвращает только одну строку данных, и, как правило, следует использовать именно первую строку. Recordset исследуется на наличие данных с помощью проверки BOF (начало файла) и EOF (конец файла) – они не должны равняться значению "истина". Если значение параметров BOF и EOF равно "истине", то в наборе Recordset записи отсутствуют. Выполнение команды MoveFirst в пустом наборе Recordset приведет к ошибке. Свойства EOF или BOF всегда проверяются перед прохождением по набору Recordset в одном из направлений при помощи команд MoveNext или MovePrevious.

Листинг 1.10. Function OpenChair (html, txt)

Набор Recordset, полученный для OpenChair, создан другой вспомогательной ADO-функцией – GetADORecordSet. Как и ExecuteCommand, GetADORecordSet воспринимает выражение SQL как параметр и открывает набор Recordset из источников данных в локальном экземпляре m_Connection объекта Connection. Объект набора записей передается в вызывающую функцию. В листинге 1.11 приведен исходный код функции GetADORecordSet.

Листинг 1.11. Function GetADORecordSet (html, txt)

Существует много возможностей по усовершенствованию функции GetADORecordSet. Одной из них является установка набора ADO Recordset как параметра функции, передаваемого в ByRef, и возврат значения "истина" или "ложь" в зависимости от результата извлечения набора Recordset. Программа расходует ресурсы на создание набора записей ADO Recordset только один раз, и функция сообщит вызывающей функции о правильности набора Recordset. Функции ExecuteCommand и GetADORecordSet можно объединить в одну.



Можно указать любой номер, однако это число выбрано для простоты. Используйте числа из диапазона 1000 – 65535, предназначенного для нумерации особых ошибок. Объект ADO Command предназначен для вызова сервера базы данных. Если от объекта Command ожидается набор записей Recordset, то функция Execute возвращает набор записей ADO Recordset. Так как объект ExecuteCommand изначально не предназначен для возврата набора записей Recordset, объект Recordset, возвращаемый от объекта Command, игнорируется.

ExecuteCommand проверяет, что локальный объект подключения m_Connection установлен и жизнеспособен. После этого создается объект Command и настраивается на отправку серверу команды SQL. Если во время выполнения ExecuteCommand возникнет ошибка, обработчик ошибок зафиксирует ее и выйдет из функции, возвратив значение "ложь". Все переменные типа boolean в VB имеют значение "ложь", если им не присвоены иные значения, поэтому включите в программу код, присваивающий функции значение "истина" по достижении успеха.

Функция OpenChair открывает набора записей ADO Recordset по известному ID объекта "стул", переданного функции, и заполняет экземпляр класса по результатам перемещения к первой записи набора Recordset. В листинге 1.10 приведен исходный код функции OpenChair. Так как ID объекта "стул" является уникальным в базе данных, то ввиду ограничений работы с данными безопаснее считать, что функция возвращает только одну строку данных, и, как правило, следует использовать именно первую строку. Recordset исследуется на наличие данных с помощью проверки BOF (начало файла) и EOF (конец файла) – они не должны равняться значению "истина". Если значение параметров BOF и EOF равно "истине", то в наборе Recordset записи отсутствуют. Выполнение команды MoveFirst в пустом наборе Recordset приведет к ошибке. Свойства EOF или BOF всегда проверяются перед прохождением по набору Recordset в одном из направлений при помощи команд MoveNext или MovePrevious.



'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'OpenChair ' Opens an existing record for a chair and 'populates the object with the values ' 'in: Chair ID to open 'out: returns true on success and false otherwise '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Public Function OpenChair(ID As String) As Boolean On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "OpenChair"

Const COMMAND_PREFIX = "SELECT * FROM tblChair WHERE ([ID]='" Const COMMAND_SUFFIX = "')"

Dim sSQL As String Dim rs As ADODB.Recordset

'build the insert statement sSQL = COMMAND_PREFIX & ID & COMMAND_SUFFIX

'get Recordset Set rs = GetADORecordSet(sSQL)

'make certain we got a valid Recordset If rs Is Nothing Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Failure Opening Chair ID = " & ID End If

'make certain that we got a Recordset 'with at least 1 value If rs.EOF And rs.BOF Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Failure - record for Chair does not exist. ID = " & ID End If

rs.MoveFirst

'set new ID to local setting m_sID = rs(CHAIR_ID)

'set new color to local setting color = rs(CHAIR_COLOR)

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return success value

OpenChair = True

On Error Resume Next 'destroy objects Set rs = Nothing Exit Function

Sub_Error_Handler: ProcessErr "Failure Opening Chair ID = " & ID

End Function

Листинг 1.10. Function OpenChair

Набор Recordset, полученный для OpenChair, создан другой вспомогательной ADO-функцией – GetADORecordSet. Как и ExecuteCommand, GetADORecordSet воспринимает выражение SQL как параметр и открывает набор Recordset из источников данных в локальном экземпляре m_Connection объекта Connection. Объект набора записей передается в вызывающую функцию. В листинге 1.11 приведен исходный код функции GetADORecordSet.

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 'GetADORecordSet 'Sends SQL command to datasource and returns 'an ADO Recordset to the function consumer '



'in: vsSource - SQL string to execute 'out: returns true on success, false otherwise '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Private Function GetADORecordSet(ByVal vsSource As String) _ As ADODB.Recordset

On Error GoTo Sub_Error_Handler Const ERROR_MESSAGE_INFO = "GetADORecordSet"

Dim rsRequested As ADODB.Recordset Dim cmdRequested As ADODB.Command

'establish connection If m_Connection.State <> adStateOpen Then Err.Raise 1001, ERROR_MESSAGE_INFO, _ "Connection Object is not open. Database connect be opened." End If

'establish command Set cmdRequested = CreateObject("ADODB.Command") Set cmdRequested.ActiveConnection = m_Connection

'set up command object cmdRequested.CommandType = adCmdText cmdRequested.CommandText = vsSource

'Create instance of Recordset object Set rsRequested = cmdRequested.Execute

'return Recordset If Not rsRequested Is Nothing Then If rsRequested.State = adStateOpen Then Set GetADORecordSet = rsRequested Else 'rsRequested state is not open Err.Raise 1001, ERROR_MESSAGE_INFO, _ " Recordset state is not open " & vsSource End If Else 'rsRequested is nothing error Err.Raise 1001, ERROR_MESSAGE_INFO, _ " Recordset object is nothing " & vsSource End If

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub_Exit_Done: 'return value On Error Resume Next 'destroy objects Set rsRequested = Nothing Set cmdRequested = Nothing Exit Function

Sub_Error_Handler: ProcessErr " Failure obtaining Recordset."

End Function

Листинг 1.11. Function GetADORecordSet

Существует много возможностей по усовершенствованию функции GetADORecordSet. Одной из них является установка набора ADO Recordset как параметра функции, передаваемого в ByRef, и возврат значения "истина" или "ложь" в зависимости от результата извлечения набора Recordset. Программа расходует ресурсы на создание набора записей ADO Recordset только один раз, и функция сообщит вызывающей функции о правильности набора Recordset.Функции ExecuteCommand и GetADORecordSet можно объединить в одну.


Безопасность ASP.NET


При загрузке страницы showGrid.aspx фиксируется событие Load и вызывается функция LoadGrid. При вызове функции LoadGrid устанавливается подключение к базе данных посредством строковой переменной и инициализируется объект подключения ADO Connection.

Примечание. Следует отметить, что указывать символьные аргументы строки подключения в коде, как в листинге 2.10, крайне не рекомендуется. Это сделано, чтобы показать аутентификационные данные, используемые для подключения, а также метод их применения к объекту Connection. Рекомендуем получать аутентификационные данные, размещая строки подключения к базе данных в файле web.config (см. лекции 3).

В листинге 2.10 используется источник данных Microsoft Access 2000. Чтобы веб-форма ASP.NET могла считывать и записывать информацию в файл базы данных Access, необходимо настроить файловые разрешения сервера для файлов данных Access (.mdb). При использовании базы данных корпоративного уровня, например, SQL Server или Oracle, для передачи аутентификационных данных серверу базы данных при ее запросе веб-формой ASP.NET возможно применение интегрированной безопасности. Аргумент integrated security=sspi в строке подключения к базе данных указывает использование интегрированной безопасности, и аутентификационные данные Windows .NET Server предоставляются источнику данных. Учетная запись пользователя Windows, используемая приложением ASP.NET, меняться в зависимости от следующих критериев.

Аутентификация осуществляется для приложения ASP.NET. Анонимная или не анонимная.Используется режим изоляции IIS. Режим изоляции IIS 5.0 или режим изоляции рабочих процессов.

В зависимости от метода аутентификации в приложении IIS ASP.NET использует следующие учетные записи Windows.

Гостевая учетная запись Windows IIS для анонимного доступа.

IUSER_<имя_компьютера>Субъект пула приложения. Учетная запись Windows, определенная в пуле приложения. Учетными записями по умолчанию являются Network Service (Сетевая служба), Local Service (Локальная служба) и Local System (Локальная система).Учетная запись Windows-аутентифицируемого пользователя, являющегося потребителем приложения. Аутентификационные данные, предоставленные пользователем при аутентификации приложения сервера ASP.NET.


Если IIS настроен на разрешение анонимного доступа к сайту, и для сервера установлен режим изоляции приложения по умолчанию (т.е. режим изоляции рабочих процессов), то ASP.NET использует субъект в пуле приложения, занятом веб-приложением. Если режим изоляции IIS 5.0 используется для обеспечения обратной совместимости, то субъектом пула приложения будет гостевая учетная запись IIS. Если приложение настроено на использование одного из режимов аутентификации, доступных в IIS и предусматривающих предоставление аутентификационных данных пользователем, то IIS по умолчанию использует в качестве субъекта аутентификационные данные. Субъекты, используемые по умолчанию приложением IIS, приведены в табл. 2.1.

В рассматриваемом приложении (или в любом другом) возможны и другие субъекты доступа. Например, для авторизации доступа пользователя к приложению применяется аутентификация форм, и, в то же время, используется специальная учетная запись пользователя для выполнения всех запросов базы данных.

Для веб-формы showGrid.aspx применяется режим изоляции рабочих процессов. Анонимный доступ будет разрешен, поэтому аутентификационными данными учетной записи Windows пула приложений станут входные данные, используемые для доступа к источнику информации. Для файла базы данных Microsoft Access файловые разрешения несущего сервера устанавливаются так, чтобы учетная запись Windows производила чтение, запись и изменение файла .mdb. Если речь идет о базе данный корпоративного уровня, то учетной записи Windows нужно предоставить соответствующий доступ к базе данных на сервере базы данных.

Примечание. Следует помнить, что файл web.config содержит элемент authentication. Режимом элемента аутентификации по умолчанию является Windows. Так как многие программисты используют учетную запись группы администраторов, то впечатление о правильности параметров в форме ASP.NET может быть обманчивым, так как эта учетная запись наделена правами на выполнение практически любых действий в среде разработки. При перемещении приложения на тестовый или конечный сервер с ограниченными разрешениями доступа возможно, что веб-форма не будет функционировать.



Таблица 2.1. Субъекты по умолчанию для приложения ASP.NETАутентификацияРежим изоляции приложенияУчетная запись Windows, используемая ASP.NET
АнонимнаяИзоляция IIS 5.0IUSER_<имя_компьютера>.
АнонимнаяИзоляция рабочих процессовСубъект пула приложения для веб-приложения.
Не анонимнаяИзоляция IIS 5.0Аутентификационные данные, предоставленные пользователем при проверке подлинности.
Не анонимнаяИзоляция рабочих процессовАутентификационные данные, предоставленные пользователем при проверке подлинности.

Файл AssemblyInfo.cs


Проект ASP.NET с именем SimpleWF создает библиотеку – установочный пакет для файлов веб-формы, из которых состоит проект; эта библиотека является обычной DLL. Библиотека создается при первом запросе файла ASPX из IIS. Файл Codebehind и файл источника, ссылки на которые содержатся в файле ASPX, компилируются в языке инструкций Microsoft (MISL). Формат этого языка аналогичен коду библиотеки в отличие от двоичных продуктов других компиляторов. MISL создается только для исполняемых подпрограмм кода.

Файлы AssemblyInfo.cs, SimpleWF.csproj, SimpleWF.csproj.webinfo и SimpleWF.vsdisco поставляют компилятору необходимую информацию для создания библиотеки, содержащей код MISL, сгенерированный из файлов ASP.NET. Информация в файле AssemblyInfo.cs представляет собой описание библиотеки, например, ее версию и имя. Этот файл можно использовать для подписи библиотек посредством присвоения ключа, который является механизмом защиты библиотеки от реинжиниринга. В листинге 2.5 приведен код пустого файла AssemblyInfo.cs. Файл библиотеки можно редактировать напрямую, и для этого не требуется высокого уровня знаний. Укажите известные значения, оставив другие значения незаполненными.

Листинг 2.5. Blank AssemblyInfo.cs file (html, txt)



Файл Codebehind веб-формы – aspx.cs


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

<textarea name="txtResponse" ><% =Request("txtYourself") %> </textarea>

В веб-форме ASP.NET требуется разработка большего объема кода, но с более высоким уровнем организации. В листинге 2.4 приведен код веб-формы requestSomething.aspx в файле requestSomething.aspx.cs. Дизайнер веб-форм автоматически генерирует большую часть кода, приведенного в листинге 2.4. При открытии файла requestSomehing.aspx в представлении Design (Дизайн) и двойном щелчке на элементе управления верхнего текстового поля txtYourself дизайнер веб-форм создаст событие в файле requestSomething.aspx.cs с именем txtYourself_TextChanged. Дизайнер веб-форм откроет файл requestSomething.aspx.cs для получения функции события, созданной для элемента управления txtYourself. Несмотря на то, что дизайнер веб-форм генерирует большую часть кода в файле Codebehind, этот код при желании можно редактировать вручную.

Листинг 2.4. Source Code for the requestSomething.aspx CodeBehind File requestSomething.aspx.cs (html, txt)

Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:

this.txtResponse.Text = this.txtYourself.Text;

Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.


/// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.txtYourself.TextChanged += new System.EventHandler(this.txtYourself_TextChanged);

this.Load += new System.EventHandler(this.Page_Load); } #endregion private void txtYourself_TextChanged (object sender, System.EventArgs e) { this.txtResponse.Text = this.txtYourself.Text; } } }

Листинг 2.4. Source Code for the requestSomething.aspx CodeBehind File requestSomething.aspx.cs

Обработчик события веб-формы вызывается при изменении и отправке на веб-сервер значения txtYourself в форме. После отправки формы серверу файл Codebehind веб-формы requestSomething.aspx определяет, что отправлено значение текстового поля txtYourself и вызывает функцию события txtYourself_TextChanged. В нашем примере для размещения значения, отправленного в текстовое поле txtResponse, создана единственная строка кода:

this.txtResponse.Text = this.txtYourself.Text;

Оба текстовых поля воспринимаются как элементы управления или экземпляры классов в обычном программном приложении, полностью абстрагируя программиста от деталей HTML. Так как программист может вставлять элементы управления в представлении Design (Дизайн) и изменять код, связанный с действием элемента управления, щелкнув на этом элементе, он практически полностью избавляется от редактирования кода HTML.


Файл информации о поиске – vsdisco


Файл vsdisco определяет пути поиска на сервере разработки, что дает ASP.NET возможность нахождения веб-служб ASP.NET. Файл SimpleWF.vsdisco генерируется для проекта SimpleWF по умолчанию. В листинге 2.7

приведен исходный код файла SimpleWF.vsdisco. Для упрощения поиска ASP.NET других библиотек в среде разработки следует отредактировать файл vsdisco, указав в нем веб-каталоги, в которых не нужно осуществлять поиск. В версии vsdisco по умолчанию исключаются папки расширения FrontPage, так как обычно библиотеки в этих папках не содержатся.

Листинг 2.7. Source of SimpleWF.vsdisco (html, txt)



Файл проекта – csproj


Файл csproj является файлом XML и содержит информацию о зависимостях проекта и некоторых параметрах компиляции библиотеки. Visual Studio .NET обновляет этот файл по мере добавления или удаления из проекта веб-форм и ссылок. Не следует изменять файл csproj при обычной работе с проектом ASP.NET. При открытии файла в браузере отображается информация обо всех параметрах и элементах, составляющих проект: имена файлов, параметры реализации и ссылки библиотеки и т.д.



Файл проекта WebInfo – csproj.webinfo


Файл csproj.webinfo представляет собой файл XML и описывает расположение файла проекта. В листинге 2.6 приведено содержание файла SimpleWF.csproj.webinfo. Он также генерируется и обновляется Visual Studio. .NET, и его не следует редактировать напрямую.

Листинг 2.6. Contents of File SimpleWF.csproj.webinfo (html, txt)



Файл веб-формы – ASPX


Файл ASPX является отображаемым файлом веб-приложения ASP.NET. Конечный пользователь запрашивает его в своем веб-браузере для реализации функциональных возможностей веб-приложения ASP.NET. Если конечному пользователю нужно просмотреть веб-форму этого файла из IIS, необходимо выполнить запрос из веб-браузера по адресу http://<URL_моего_узла>/<мой_виртуальный_веб-каталог>/WebForm1.aspx, введя его в адресной строке.

Создаваемому виртуальному каталогу по умолчанию присваивается имя проекта. Все веб-приложения ASP.NET генерируют виртуальный веб-каталог при установке в IIS. Файлы WebForm1.aspx.cs и WebForm1.aspx.resx используются для создания проектной библиотеки DLL – результата компиляции файла WebForm1.aspx. Файл aspx.cs называется кодом реализации файла ASPX, а файл ASPX – главным файлом. Файл aspx.cs содержит весь код, реализующий ASPX, а aspx.resx представляет собой файл-источник веб-формы.

В листинге 2.1 показано представление HTML файла ASPX веб-формы ASP.NET. В нем можно изменять код HTML и сценарий javascript клиентской части, однако с помощью элементов управления веб-формы ASP.NET в представлении Design (Дизайн) вы создадите сложную веб-страницу без написания кода HTML. Представление Design (Дизайн) дизайнера веб-форм является редактором типа WYSIWIG ("что вижу на экране, то и получаю при печати"), абстрагирующим разработчика от кода HTML и дающим возможность наглядного построения веб-сраниц (по аналогии со средой IDE для приложений рабочего стола в Visual Basic 6). Если вам больше нравится программировать вручную, используйте область HTML-инструментария для получения элементов HTML.

Листинг 2.1. HTML View for requestSomething.aspx (html, txt)

Первая строка requestSomething.aspx определяет файл Codebehind с именем requestSomething.aspx.cs. Global.asax использует такие же правила именования файлов, что и файл requestSomething.aspx, обращаясь к файлу Global.asax.cs. Назначение файла Global.asax такое же, как в ASP – обеспечить место расположения для записи кода, доступное веб-формам рассматриваемого проекта, которое позволит разработчику фиксировать события, связанные с приложением.
Например, в ASP файл Global.asa обеспечивает запуск и остановку приложения, открытие и закрытие сеанса; файл Global. asax предоставляет класс Global, наследующий System.Web.HttpApplication и содержащий функции, связанные с этими событиями. Кроме того, Global.asax предоставляет события начала и завершения запроса на ресурсы, процесса аутентификации и ошибок приложения.

Веб-форма requestSomething.aspx содержит три элемента управления. Они добавлены из области Web Forms (Веб-формы). В дизайнере веб-форм можно добавлять элементы управления в веб-форму, как при создании приложения рабочего стола в Visual Basic или в Visual C++. Интерфейс элементов управления практически такой же.

Разработчики создают код веб-форм так же, как они программируют классы форм в Visual Basic или Visual C++. Представление свойств элемента управления имеет формат XML и располагается в файле ASPX. Технология .NET использует XML для инициализации нужного элемента управления и создания кода HTML, возвращаемого потребителю. Инструментарий Visual Studio .NET позволяет разработчикам выбирать элементы HTML. Например, элементы DataGrid и таблица HTML реализуют отображение таблицы в веб-браузере. Элемент управления веб-формы DataGrid дает более обширное программное управление заполнением и конфигурацией таблицы по сравнению с элементом таблицы HTML. В листингах 2.2 и 2.3 показаны различия между элементом управления веб-формы DataGrid и элементами HTML. В листинге 2.2 приведен код XML, размещенный в файле ASPX и представляющий собой элемент управления DataGrid.

Листинг 2.2.

(html, txt)

В листинге 2.3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.

Листинг 2.3.

(html, txt)

В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали).На рисунке 2.4

показана форма requestSomething.aspx после отправки информации на сервер.


Рис. 2.4. 



<asp:DataGrid id="DataGrid2" style="Z-INDEX: 104; LEFT: 88px; POSITION: absolute; TOP: 258px" runat="server"> </asp:DataGrid>

Листинг 2.2.

В листинге 2. 3 показан элемент HTML, созданный при вставке таблицы из области HTML-инструментария в веб-форму.

<TABLE id="Table1" style="Z-INDEX: 103; LEFT: 191px; POSITION: absolute; TOP: 291px" cellSpacing="1" cellPadding="1" width="300" border="1"> <TR> <TD></TD> <TD></TD> <TD></TD> </TR> <TR> <TD></TD> <TD></TD> <TD></TD> </TR> <TR> <TD></TD> <TD></TD> <TD></TD> </TR> </TABLE>

Листинг 2.3.

В простейшей веб-форме requestSomething.aspx (см. рис. 2.4) пользователь может ввести некоторую личную информацию и нажать на кнопку Submit (Отправить). После отправки веб-формы он получает ответ в виде содержимого, введенного им в текстовом поле с именем Tell Me About Yourself And Click Submit (Расскажите о себе и нажмите на кнопку Submit [Отправить]), а также в поле You Said (Вы сказали). На рисунке 2.4

показана форма requestSomething.aspx после отправки информации на сервер.


Рис. 2.4. 


Файл веб-конфигурации – web.config


Файл web.config представляет собой файл конфигурации IIS. Программист использует его для настройки IIS на определенную работу в процессе разработки. Когда проект ASP.NET готов к реализации, сайт или виртуальный каталог IIS немедленно настраивается согласно этой конфигурации. Параметры файла web.config применяются ко всем папкам каталога, в котором расположен данный файл, если ни в одной из них не содержится другого файла web.config (в веб-приложении их может содержаться несколько). Если файл web.config отсутствует, то по умолчанию используется файл machine.config, расположенный в папке $:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG. Фрагмент пути v1.1.4322 отражает версию технологии .NET, используемой на сервере. В листинге 2.8 приведен файл по умолчанию web.config, созданный в проекте SimpleWF.

Листинг 2.8. Source Code of web.config file (html, txt)

Параметры приложения устанавливаются как дочерние элементы элемента appSettings, который, в свою очередь, является дочерним по отношению к элементу configuration. Файл web.config по умолчанию не содержит параметров приложения. Эти параметры обычно включаются динамическими свойствами элементов управления, добавленных в веб-формы в дизайнере веб-форм или введенных вручную. Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.

Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:

compilation. Определяет параметры компиляции приложения по умолчанию;customErrors. Определяет конфигурацию отчетов об ошибках;authentication. Определяет используемый метод аутентификации;trace. Определяет метод, согласно которому функционирует служба .NET Trace;sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.


Параметры приложения содержат значения инициализации компонентов приложения. Об использовании файла web.config для хранения и извлечения параметров приложения более подробно рассказывается в лекции 3.

Элемент system.web имеет дочерние элементы, содержащие параметры управления механизмом самого веб-приложения. При отсутствии дочерних элементов приложение использует параметры файла machine.config. Приведенный ниже список возможных параметров далеко не полон, однако формирующие этот список дочерние элементы элемента system.web по умолчанию присутствуют в файле web.config, созданном Visual Studio .NET:

compilation. Определяет параметры компиляции приложения по умолчанию;customErrors. Определяет конфигурацию отчетов об ошибках;authentication. Определяет используемый метод аутентификации;trace. Определяет метод, согласно которому функционирует служба .NET Trace;sessionState. Определяет функционирование сеанса и механизм для управления этим сеансом;globalization. Определяет параметры набора символов, кодировки и настройки, связанные с культурой языка.


Использование классов ADO.NET для заполнения элемента управления DataGrid


После установки соединения выполняется запрос экземпляра набора данных ADO.NET myDataSet таблицы tblChairs базы данных. Набору данных DataSet при инициализации присваивается имя myChairs. Инициализируется объект ADO.NET Adaptor для заполнения экземпляра myDataSet. После этого инициализируется объект ADO.NET DataView с именем myDataView с использованием первой таблицы набора данных myDataSet. В итоге аргумент DataGrid с именем dg, переданный подпрограмме, устанавливает свойство источника данных на экземпляр DataView с именем myDataView, и вызывает метод DataBind аргумента dg для заполнения экземпляра dg элемента DataGrid данными из таблицы tblChairs.

Использование класса DataView не является обязательным, если нужно отобразить весь набор данных DataSet. В элементе dg (см. листинге 2.10) отображается весь созданный набор данных DataSet, поэтому можно опустить следующую строку:

DataView myDataView = new DataView(myDataSet.Tables[0]);

Свойство DataSource элемента dg установим равным значению Tables[0] свойства набора данных myDataSet. Строку, присваивающую dg.DataSource источнику myDataView, изменим следующим образом:

dg.DataSource = myDataSet.Tables[0]

При нажатии на клавишу F5 будет скомпилирована страница showGrid.aspx, затем откроется окно браузера с отображением данных в таблице myChairs (см. рис. 2.6).


Рис. 2.6.  Отображение результатов работы showGrid.aspx с использованием DataGrid



Использование XML


В веб-формах можно использовать элемент управления XML, реализующий XML, XSL и XSL Transformations (XSLT). Для получения веб-формы, осуществляющей преобразование XML и XSL, создайте новую веб-форму и в представлении Design (Дизайн) вставьте в форму элемент управления XML (см. рис. 2.15). Элемент управления XML предназначен, главным образом, для интеграции веб-форм в приложении, использующем XSL для инкапсуляции логики представления.

Элемент управления XML настраивается в окне свойств (см. рис. 2.15). В этом окне указывается файл XML или XSLT/XSL, и при открытии страницы осуществляется преобразование XML и XSL в HTML. Если в элементе управления указаны файлы, они должны являться частью проекта, отображаемого в Solution Explorer.


увеличить изображение
Рис. 2.15.  Отображение в представлении Design (Дизайн) формы с элементом управления XML

Размещение в форме элемента управления XML ограничено: дизайнер веб-форм позволяет располагать его только в левом верхнем углу представления Design (Дизайн) (см. рис. 2.15), хотя некоторые элементы управления размещаются и под элементами управления XML. Дизайнер веб-форм может не воспринять действительную структуру страницы в документе XSL или XSLT, поэтому его возможности по отображению страницы в представлении Design (Дизайн) сильно ограничены.


© 2003-2007 INTUIT.ru. Все права защищены.

Изменение кода веб-формы, ориентированной на работу с данными


Чтобы изменить файл Codebehind веб-формы с элементом dgChair, щелкните правой кнопкой мыши на файле веб-формы в Solution Explorer или правой кнопкой мыши на самом файле в представлении Design (Дизайн). Затем выберите View Code (Просмотреть код). По умолчанию Visual Studio .NET отображает в Solution Explorer не все файлы программного решения. Щелкните на значке Show All Files (Показать все файлы) в верхней части Solution Explorer для показа всех файлов, чтобы выбрать файл Codebehind.

Файл Codebehind отобразится с директивами using для классов, необходимых для функционирования веб-формы, с пространством имен и структурой классов. Пространство имен носит то же имя, что и рассматриваемый проект. Имя класса совпадает с именем веб-формы. В листинге 2.9 приведен исходный код веб-формы showGrid. Веб-форма showGrid демонстрирует элемент управления DataGrid. Дизайнер веб-форм разместил защищенный элемент в классе showGrid, представляющий элемент dgChair, добавленный в веб-форму. Ссылка using System.Data.OleDb добавлена для простоты обращения к классам ADO.NET.

Листинг 2.9. Source Code for showGrid.aspx.cs after DataGrid Added in Design View (html, txt)

Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10

приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.

Листинг 2.10. Source Code for Subroutine LoadGrid (html, txt)

LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:

LoadGrid(dgChair);


Листинг 2.9. Source Code for showGrid.aspx. cs after DataGrid Added in Design View

Если вам нужно заполнить элемент dgChair данными из таблицы базы данных, то требуется получение набора данных ADO.NET DataSet с информацией из базы данных. Набор DataSet используется для заполнения элемента dgChair при запросе веб-страницы с веб-сервера. При загрузке страницы с веб-сервера вызывается событие Load объекта Page. Класс showGrid наследуется из System.Web.UI.Page, как видно из объявления класса в листинге 2.9, поэтому событие Load также наследуется из System.Web.UI.Page. При выполнении события Load происходит получение набора DataSet и заполнения элемента DataGrid. В листинге 2.10

приведена подпрограмма LoadGrid, реализующая заполнение элемента DataGrid набором DataSet.

private void LoadGrid(DataGrid dg) { //set the connection credentials string DataSetName = "myChairs"; string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=C:\\aspData\\employees.mdb;";

//make the DB connection OleDbConnection myConn = new OleDbConnection(ConnectionString);

//make a data set to hold chairs DataSet myDataSet = new DataSet(DataSetName);

//make a data adaptor OleDbDataAdapter myAdapt = new OleDbDataAdapter("Select * From tblChair", myConn);

//fill the dataset myAdapt.Fill(myDataSet);

//get a view in the dataset DataView myDataView = new DataView(myDataSet.Tables[0]);

//show the data view in the Grid dg.DataSource = myDataView; dg.DataBind(); }

Листинг 2.10. Source Code for Subroutine LoadGrid

LoadGrid представляет собой функцию, входящую в класс showGrid. Функция вызывается посредством размещения следующего вызова в функции события Page_Load файла showGrid.aspx:

LoadGrid(dgChair);


Мастер форм данных


Дизайнер веб-форм содержит мастер для создания форм, отображающий наборы данных из источника. Для работы с мастером форм данных (Data From Wizard) выполните следующие действия.

В Solution Explorer щелкните правой кнопкой мыши и выберите Add New Item (Добавить новый элемент).В диалоговом окне Add New Item (Добавление нового элемента) вы увидите большое количество типов файлов, которые можно добавить в проект – они отображаются в правой панели. Разверните дерево каталогов слева, и вы увидите дочерние элементы дерева, представляющие собой категории, при выборе которых изменяется набор отображаемых в правой панели элементов.Выберите Data Form Wizard (Мастер форм данных) и введите имя файла (см. рис. 2.8).


Рис. 2.8.  Выбор мастера форм данных (Data Form Wizard)

Нажмите на кнопку Open (Открыть), и в Visual Studio .NET будет создана новая веб-форма. В нашем примере она называется employees.aspx.Откроется мастер форм данных с окном приветствия, информирующим о предстоящих действиях. Нажмите на кнопку Next (Далее).В окне Choose The Dataset You Want To Use (Выберите нужный набор данных) мастер предложит выбрать имеющийся набор данных либо создать новый набор DataSet. В данном примере создан набор DataSet с именем dsEmps (см. рис. 2.9). Все наборы DataSet, создаваемые в мастере, становятся элементами проекта и могут использоваться другими веб-формами или веб-службами внутри этого проекта. Файл DataSet имеет расширение .xsd.


Рис. 2.9.  Окно Choose The Dataset You Want To Use (Выберите нужный набор данных) мастера форм данных (Data Form Wizard)

Нажмите на кнопку Next (Далее) для перехода в окно Choose A Data Connection (Выберите подключение к данным) (см. рис. 2.10). В ниспадающем списке показаны соединения, созданные в проекте до этого. Вы можете выбрать имеющееся подключение либо создать новое. В нашем примере выбрано подключение ASPNETExample.


Рис. 2.10.  Окно Choose A Data Connection (Выберите подключение к данным) мастера форм данных


Нажмите на кнопку New Connection (Новое подключение) для открытия окна Data Link Properties (Свойства подключения к данным), в котором настраивается новое подключение к базе данных.Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables Or Views (Выберите таблицы или образы). Мастер откроет подключение к данным, созданное в предыдущем шаге, и найдет базу данных. Вы можете выбрать таблицы источника данных, к которым должна подключиться веб-форма. Выберите все таблицы и образы, отображаемые в веб-форме; выбор осуществляется в левой области, после чего каждый элемент переносится в правую область окна посредством нажатия на кнопку ">". В нашем примере выбрана таблица tblEmployee (см. рис. 2.11).


Рис. 2.11.  Окно Choose Tables Or Views (Выберите таблицы или образы) мастера форм данных

Нажмите на кнопку Next (Далее) для перехода к окну Choose Tables And Columns To Display On The Form (Выберите таблицы и столбцы, которые необходимо отобразить в форме). Мастер откроет таблицы или образы, выбранные в шаге 9, и покажет их с соответствующими столбцами, доступными для отображения в двойном списке выбора элементов.

Отметьте нужные столбцы для отображения в веб-форме.

При выборе несколько таблиц появится окно Create A Relationship Between Tables (Создать отношение между таблицами), в котором выбираются ключи и отношения таблиц. В нашем примере для отображения выбраны все столбцы таблицы tblEmployee (см. рис. 2.12).

Нажмите на кнопку Finish (Готово). Visual Studio .NET сгенерирует законченную форму с именем employees.aspx со всем необходимым кодом в файле Codebehind и элементами управления, вставленными в форму для отображения данных таблицы tblEmployee.


Рис. 2.12.  Выбор таблиц и столбцов для отображения в форме



На рисунке 2.13 показана веб-форма employees.aspx, отображенная в представлении Design (Дизайн). Элементы управления можно перемещать для нужной настройки их отображения. Код, лежащий в основе формы, довольно высокого уровня, в нем присутствует даже обработка ошибок!




Рис. 2.13.  Результирующая веб-форма, сгенерированная мастером форм данных, отображенная в представлении Design (Дизайн)

Если employees.aspx установлена в качестве стартовой страницы, то нажмите на клавишу F5 для компиляции employees.aspx, чтобы открыть браузер и отобразить веб-форму. На пустой странице будет показана кнопка Load (Загрузить). Нажмите на кнопку Load (Загрузить), и данные отобразятся в браузере (см. рис. 2.14).


Рис. 2.14.  Веб-форма employees.aspx, сгенерированная мастером форм данных и отображающая информацию из таблицы tblEmployee


Начало работы с Visual Studio .NET


Откройте Visual Studio .NET. Вы увидите начальную страницу, если ее отображение разрешено. Как и в предыдущей версии Visual Studio, по умолчанию предоставляется шаблон проекта (эту возможность можно отключить). Создадим новый проект веб-форм ASP.NET.

Нажмите на кнопку New Project (Создать проект) в окне шаблона проекта, чтобы открыть окно New Project (Создание проекта) с перечнем типов проектов и соответствующими шаблонами.В списке слева выберите Visual C# Projects (Проекты Visual C#) – справа отобразятся шаблоны проектов, соответствующие C#.Выберите шаблон проекта ASP.NET Web Application (Веб-приложение ASP.NET).Введите свое имя проекта, отличное от имени в текстовом поле. Укажите имя сервера, задав URL (см. рис. 2.2) или путь UNC к корневому веб-каталогу. В URL укажите имя сервера по умолчанию localhost, если разрабатываемое программное решение располагается на рабочей станции во время написания кода и модульного тестирования. В нашем примере указано имя SimpleWF.Нажмите на кнопку OK. Vusual Studio .NET подключится к несущему серверу и сгенерирует файлы проекта. Visual Studio.NET вносит изменения на веб-сервере через порт 80, создавая новый виртуальный каталог, связанный с файловым каталогом, в котором находятся файлы проекта веб-формы. Если на порте 80 отсутствует веб-сервер IIS, или если IIS не работает, то Visual Studio .NET не сможет сгенерировать проект веб-приложения.


Рис. 2.2.  Присвоение имени проекту веб-приложения ASP.NET SimpleWF

При успешном подключении Visual Studio .NET к серверу, указанному в окне New Project (Создание проекта), по умолчанию генерируются следующие файлы:

AssemblyInfo.cs;Global.asax;Global.asax.resx;SimpleWF.csproj;SimpleWF.csproj.webinfo;SimpleWF.vsdisco;Web.Config;WebForm1.aspx;WebForm1.aspx.cs;WebForm1.aspx.resx.

После создания веб-формы на узле редактор отобразит пустую веб-форму с именем WebForm1, готовую для редактирования (см. рис. 2.3).

Для редактирования веб-форм в Visual Studio .NET используется дизайнер веб-форм (Web Forms Designer). Он позволяет переходить из представления формы в представление HTML для отображения кода XML и HTML с помощью кнопки HTML в левом нижнем углу окна веб-формы.


увеличить изображение
Рис. 2.3.  Веб-форма в представлении Design (Дизайн) дизайнера веб-форм

Обратное переключение легко осуществляется посредством кнопки Design (Дизайн), расположенной рядом с кнопкой HTML. Дизайнер веб-форм является довольно гибким компонентом и отображает изменения, вносимые вручную в представлении HTML. Файл ASPX редактируется в любом представлении дизайнера веб-форм – все вносимые изменения равнозначны.



Обзор архитектуры интернет-форм


Расширением файла страницы веб-формы ASP.NET является .aspx, и в этой лекции такой тип файлов называется ASPX. Каждая веб-форма ASP.NET имеет связанный с ней класс. Классы файла ASPX содержатся в файле кода формы, который называется Codebehind. Имя файла Codebehind указывается следующим образом: <имя_файла>.aspx.<расширение_языка>, где <имя_файла> – имя файла ASPX, <расширение_языка> – двухсимвольное расширение, отражающее язык файла Codebehind. Если файл ASPX называется Webform.aspx, то файл Codebehind имеет вид Webform.aspx.cs для языка C# и Webform.aspx для языка Visual Basic. Файл ASPX содержит визуальные элементы веб-формы, а файл Codebehind содержит логику, согласно которой эта форма функционирует. Все файлы Codebehind компилируются в динамически подключаемые библиотеки (DLL), отгружаемые на сервер вместе с соответствующими страницами ASPX. Библиотеке DLL проекта по умолчанию присваивается имя проекта.

При запросе ASPX в IIS страница обрабатывается посредством расширения ISAPI ASP.NET aspnet_isapi.dll. Технология .NET генерирует еще одну временную библиотеку DLL на основе ASPX во время первого запроса файла. Эта DLL содержит класс, наследуемый от соответствующего класса веб-формы, сгенерированного в файле Codebehind, и располагается в библиотеке DLL проекта (см. рис. 2.1).

Такая система существенно обобщает бизнес-логику и логику представления по сравнению с абстракцией, предлагаемой архитектурой ASP. Файл Codebehind содержит бизнес-логику, а ASPX – логику представления веб-формы.


Рис. 2.1.  Обзор архитектуры веб-форм ASP.NET

Возможности этих двух файлов усиливают уровень абстракции логики представления и бизнес-логики. Файлы ASPX – это файлы XML, содержащие элементы HTML и элементы управления серверной части для создания HTML. Программист может внедрять бизнес-логику в файлы ASPX, но на это ему придется затратить дополнительные усилия. Файлы Codebehind – это файлы с кодом, и разместить в них логику представления гораздо сложнее, чем использовать файлы ASPX. В ASP абстракция бизнес-логики и логики также представляет собой сложный процесс, поэтому в ASP логика представления и бизнес-логика объединяются при разработке программного решения.



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


Для заполнения элемента dgChair данными из таблицы базы данных мы будем использовать ADO.NET, поэтому нужно добавить в файл showGrid.aspx пространство имен для классов данных, необходимых для доступа к источнику данных. Веб-формы по умолчанию содержат пространство имен System.Data, являющееся главным пространством имен ADO.NET. Другие пространства имен, подчиненные System.Data, поддерживают определенные типы источников данных. Стандартными пространствами имен, подчиненными System.Data, являются следующие.

System.Data.Common. System.Data.OleDb. System.Data.SqlClient. System.Data.SqlTypes.

Пространство имен SqlClient обеспечивает интерфейс к провайдеру SQL Server и наиболее эффективный способ связи с SQL Server 2000. Пространство имен System.Data.OleDb поддерживает интерфейс, аналогичный традиционной технологии ADO; оно неэффективно при подключении к SQL Server 2000. System.Data.Ole.Db рекомендуется для работы с источниками данных, отличными от SQL Server 2000, имеющими провайдера OLE-DB. Пространства имен System.Data.Common и System.Data.SqlTypes обеспечивают интерфейсы для SQL Server и общие интерфейсы между SQL Server и классами OLE-DB.

ADO.NET поставляется в виде единственной библиотеки – System.Data.dll. Если необходима поддержка источника данных ODBC, Microsoft предлагает другую библиотеку (ее можно загрузить из интернета) для обеспечения пространства имен классов ODBC.

Поскольку источником данных, рассматриваемым в примерах данной лекции, является Microsoft Acess 2000, то следует использовать пространство имен OleDb. Если источником данных является SQL Server 2000, то используется пространство имен SqlClient – это наиболее эффективный способ установки связи с SQL Server 2000. Вверху файла showGid.aspx необходимо вместе с остальными директивами пространства имен ввести следующую строку кода:

using System.Data.OleDb; //for the OleDb classes



Построение веб-форм


Отображение информации из базы данных в таблице HTML реализуется с помощью элемента управления веб-формы DataGrid. В представлении Design (Дизайн) выберите DataGrid в инструментарии и вставьте этот элемент в веб-форму. При отображении кода HTML вы имеете дело с представлением формы в HTML. На рисунке 2.3 изображена веб-форма в представлении Design (Дизайн).) После добавления в форму элемента DataGrid его можно переименовать в окне свойств. На рисунке 2.5 мы видим, что элементу DataGrid присвоено имя dgChair.


Рис. 2.5.  Окно свойств элемента управления DataGrid

Запуск веб-формы в Visual Studio .NET на данном этапе вызовет компиляцию веб-формы в библиотеку на сервере разработки. В нашем примере сервер разработки, на котором расположена веб-форма, называется amd1700. Для компиляции веб-формы и запуска ее в режиме отладки в Visual Studio .NET нажмите на клавишу F5. Visual Studio .NET скомпилирует веб-форму и перейдет в режим отладки аналогично тому, как это происходило в предыдущих версиях Visual Studio при запуске исполняемого файла Visual Basic или Visual C++.

После завершения компиляции на рабочей станции откроется браузер с отображением веб-формы. Сервер разработки выполнит действия, необходимые для отображения веб-страницы, и браузер откроет пустую страницу. При закрытии браузера сеанс отладки завершится, и Visual Studio .NET вернется в режим редактирования. В данном упражнении отображается пустая страница, поскольку элемент DataGrid dgChair не содержит никаких данных. Для отображения элементом DataGrid данных нужно создать в файле Codebehind код, реализующий получение элемента DataSet и размещение данных в элементе управления dgChair.



Применение элемента управления DataList


Помимо DataGrid для отображения информации из базы данных используются и другие типы элементов управления данными. Элемент управления DataList применяется для отображения данных в формате, отличном от табличной формы. В листинге 2.11 приведен исходный код файла datalist.aspx.cs, представляющий собой веб-форму, в которой элемент управления DataList заполняется данными с помощью набора ADO.NET Dataset.

Листинг 2.11. Web Form Featuring the Use of the DataList Control (html, txt)

DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.

Листинг 2.12. HTML for datalist.aspx Featuring Data Binding Expressions (html, txt)

DataList определяется элементами HTML <asp:DataList>. Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом <ItemTemplate>. Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов <ItemTemplate>, однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSet – ID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color – <%#DataBinder.Eval(Container.DataItem, "Color")%>.

При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.


Рис. 2.7. 


Листинг 2.11. Web Form Featuring the Use of the DataList Control

DataList использует иной механизм построения DataSet, называемый шаблоном. Шаблон описывает способ отображения данных в элементе управления DalaList. Щелкните правой кнопкой мыши на DataList и выберите любую из опций редактирования шаблона в команде Edit Template (Изменить шаблон) контекстного меню. В шаблоне настраиваются заголовки или имена полей, определяющие отображение данных. В DataList присутствуют также верхние, нижние колонтитулы и названия. Для указания данных из определенного набора DataSet необходимо изменить шаблон в представлении HTML. Теги <%# и %> означают присоединение данных в странице веб-формы. В коде шаблона указываются поля присоединения данных. В листинге 2.12 приведен код файла datalist.aspx, отображаемый в представлении HTML.

<%@ Page language="c#" Codebehind="datalist.aspx.cs" AutoEventWireup="false" Inherits="SimpleWF.datalist" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>datalist</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#"> <meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout" bgColor="#ffffff"> <form id="datalist" method="post" runat="server"> <asp:DataList id="dlChair" style= "Z-INDEX: 102; LEFT: 18px; POSITION: absolute; TOP: 34px" runat="server" Height="301px" Width="316px"> <ItemTemplate> <DIV style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 15px; FONT: 12pt verdana; COLOR: black; PADDING-TOP: 15px" align="left">ID:</DIV> <%# DataBinder.Eval(Container.DataItem, "ID")%> <DIV style="PADDING-RIGHT: 15px; PADDING-LEFT: 15px; PADDING-BOTTOM: 15px; FONT: 12pt verdana; COLOR: black; PADDING-TOP: 15px" align="left">Color:</DIV> <%# DataBinder.Eval(Container.DataItem, "Color")%> </ItemTemplate> </asp:DataList> </form> </body> </HTML>



Листинг 2.12. HTML for datalist.aspx Featuring Data Binding Expressions

DataList определяется элементами HTML <asp:DataList>. Внутри тегов элемента DataList располагаются теги шаблона, определяемые тегом <ItemTemplate>. Свойства шаблона в дизайнере веб-форм генерируют теги внутри тегов <ItemTemplate>, однако их можно отредактировать вручную в представлении HTML. Теги присоединения данных можно стратегически расположить внутри шаблона в тех местах, где должны отображаться соответствующие поля набора данных DataSet. В листинге 2.12 приведены два поля из отображаемого набора DataSet – ID и Color. Тег присоединения для поля ID имеет вид <%#DataBinder.Eval(Container.DataItem, "ID")%>, а тег присоединения поля Color – <%#DataBinder.Eval(Container.DataItem, "Color")%>.

При запуске datalist.aspx сгенерирован тот же набор DataSet, как в примере с элементом DataGrid (см. рис. 2.6). Однако формат данных отличается от предыдущего примера (см. рис. 2.7), поскольку данные отформатированы по шаблону, приведенному в листинге 2.12.


Рис. 2.7.