Visual2000 · Архив статей Колесова & Павловой

Visual Basic 6.0 упрощает разработку для Web
Часть 2. Создание IIS(WebClass)-приложений

Андрей Колесов, Ольга Павлова

Дополнительно смотрите:

© 1999, Андрей Колесов, Ольга Павлова
Авторский вариант. Статья была опубликована c незначительной литературной правкой в журнале "КомпьютерПресс" № 05/99, c.108-112.
ВНИМАНИЕ! Данный вариант статьи содержит ряд исправлений и дополнений к ранее опубликованному варианту, связанными с созданием более качественного программного примера.

Загрузить программные приложения (13 Кб, VB-WEB2.ZIP) Программые приложения содержат два рабочих примера в подкаталогах Exam2-1 и Exam2-2, которые можно разметить в любом месте. Подробнее о запуске примеров см. файл README2.TXT.



1. Создание первого проекта WebClass

Хотя технология разработки приложения для Web в среде VB6 является достаточно простой, на начальном этапе освоения она может несколько напугать программиста. Ведь объектные модели IIS/ASP/WebClass обладают невероятным количеством возможностей, и вряд ли найдется человек, который был бы знаком с ними в полной мере. Тем не менее не стоит волноваться — нужно только ознакомиться с основами Internet-разработки, а потом вы сможете приступить к созданию реальных приложений, шаг за шагом осваивая документацию.

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

Внимание. Для создания и работы с WebClass на компьютере должны находиться IIS (для Windows NT) или Personal Web Server (для Windows 9x). Для установки PWS (персональный Web-сервер, который иногда называется Peer Web Services, — аналог IIS при работе в среде Windows 9x) используйте диск Setup VB6. В стартовом окне укажите опцию Server Applications and Tools и нажмите кнопку Next. В следующем окне отметьте позицию NT Option Pack (for Windows 9x) и щелкните кнопку Install. По запросу программы установите второй диск Setup. Далее укажите вариант записываемой конфигурации PWS (рекомендуем для первого раза Typical). После окончания загрузки в меню Windows появится новая группа MS Personal Web Server.

Одним из компонентов проекта WebClass являются HTML-шаблоны, которые, в принципе, представляют собой обычные HTML-файлы. Обычно они создаются вне интегрированной среды разработки VB, но после их импорта в проект вы получаете возможность редактировать их внутри VB IDE с помощью любого привычного вам редактора, например Notepad или FrontPage. Для этого выберите команду Options из меню Tools, перейдите во вкладку Advanced и введите путь к нужному вам редактору в поле ввода "External HTML Editor". (Мы выбрали Notepad.)

Первый шаг, с которого начинается разработка приложения, — это создание проекта WebClass. Запустите VB и в окне New Project выберите элемент IIS Application (рис. 1).

Рис. 1.

После загрузки проекта переименуйте его из Project1 в WCSimple. Затем дважды щелкните папку Designers в окне Project. Раскроется дерево проекта, и вы увидите модуль WebClass1. Дважды щелкните его, и на экране появится Конструктор.

Переименуйте модуль в WClass1.Dsr (рис. 2). Сохраните проект на жестком диске с именем Simple.vbp (это обязательное условие для дальнейшей работы над проектом).

Рис. 2.

Конструктор WebClass состоит из двух панелей. В левой части показаны элементы модуля — HTML Template WebItems и Custom WebItems, а справа — соответствующие им теги HTML (рис. 3).

Рис. 3.

Следующим шагом разработки приложения является импорт HTML-шаблонов. Для нашего примера создадим в редакторе Notepad следующий простой шаблон с именем Simple.htm, состоящий всего из одной строки:

<html><body>Привет всем!</body></html>

Теперь импортируем шаблон в Конструктор. Для этого либо щелкните правой кнопкой мыши дерево на левой панели Конструктора, а затем выберите Add HTML Template, либо щелкните кнопку со значком IE Globe на панели инструментов (рис. 4). В появившемся окне откройте файл Simple.htm. В результате наш модуль WebClass1 приобретает такой вид, который показан на рис. 4.

Рис. 4.

Замечание. Обратите внимание, что текст содержимого Simple.htm в поле HTML Context Конструктора выдается к кодировке, которая установлена в вашем текущем браузере по умолчанию. У нас там стоит KOI-8, поэтому сейчас мы видим русский текст в окне Конструктора в искаженном виде.

При импорте шаблона Конструктор создает его копию, чтобы защитить исходный файл. Для нашего проекта фактически используемый файл носит имя Simple1.htm. Данный момент является существенным, если вы вдруг захотите отредактировать исходный шаблон вне среды Конструктора. Если вы будете исправлять шаблон в среде Конструктора (кнопка Edit HTML Template), то обратите внимание, что вы работаете с файлом Simple1.htm.

Теперь нужно сформировать код события WebClass_Start, которое активизируется при запросе пользователем URL-адреса. Событие WebClass_Start является аналогом события Form_Load в традиционном VB-приложении. Объект WebClass также имеет и другие события, включая Initialize и Terminate, аналогичные обычным событиям в VB.

Откроем окно кода (например, дважды щелкнув значок WebClass1 в окне Конструктора). При первом обращении к WebClass_Start туда автоматически запишется некоторый код (см. в конце статьи приложение "Используемый по умолчанию код запуска события"). Однако в нашем приложении Simple.vbp требуется написать только одну строку кода:

Private Sub WebClass_Start()
  Template1.WriteTemplate
End Sub

Метод WriteTemplate направляет указанный шаблон в браузер. Теперь запустим созданное приложение на выполнение. При первом запуске VB попросит установить свойства проекта (рис. 5), а затем указать имя виртуального корневого каталога (рис. 6) для PWS. В обоих случаях не будем изменять параметры, предложенные по умолчанию, и нажмем OK.

Рис. 5.

Рис. 6.

Далее после нескольких секунд размышления компьютера (при последующих запусках все будет выполняться достаточно быстро) мы увидим результат — IE покажет созданную нами ASP-страницу (рис. 7). Обратите внимание на адрес созданной страницы, которая находится во временном виртуальном каталоге персонального Web-сервера.

Рис. 7.

Выйдите из браузера и остановите выполнение приложения — именно таков порядок закрытия WebClass-приложения в процессе разработки или отладки. Поздравляем! Вы создали первое IIS-приложение на VB.

В начало статьи

2. Серьезный проект для регистрации пользователей через Web

Сейчас мы попробуем создать более полезное WebClass-приложение, предназначенное для довольно часто встречающейся задачи регистрации пользователей через Web. Здесь наша программа будет не только создавать ASP-страницы, но и записывать данные в базу данных Access. Для этого в VB6 должны быть установлены следующие компоненты (входящие в состав типичной установки): Access ODBC Driver (Workstation Tools) и Data Access Components 2.0 (Server Tools).

В начало статьи

2.1. Создание начального проекта

Повторите для нового приложения то, что мы уже выполняли в предыдущем примере. Запустите новую сессию VB6 и выберите IIS Application в окне New Project. После загрузки проекта переименуйте его из Project1 в SimpleR. Раскройте папку Designers, щелкните элемент WebClass1 для вывода на экран Конструктора. Опять зайдите в окно Properties и установите WebClass1 как wcSimple, а свойство NameInURL — как SimpleR. Теперь сохраните проект на жестком диске с именем SimpleR.vbp (рис. 8).

Рис. 8.

Для разработки приложения мы используем HTML-шаблон с именем SimpleR.htm, содержимое которого приведено в листинге 1. Этот файл был создан в Visual InterDev, но вы можете подготовить его в любом другом редакторе, в частности Notepad. Добавьте этот шаблон к проекту и назовите появившийся новый элемент WebItem как tplSimple. Дважды щелкните его, в появившемся окне кода найдите подпрограмму WebClass_Start и замените содержащийся там текст на следующий код, который выводит шаблон при загрузке приложения:

Private Sub WebClass_Start() 
  ' Выводит исходный HTML-шаблон
  tplSimple.WriteTemplate
End Sub

Запустите проект на выполнение, и вы увидите, что браузер выводит ASP-страницу, которая в данном случае является точной копией исходного HTML-шаблона (рис. 9). Выйдите из браузера и остановите выполнение приложения.

Рис. 9.

ВНИМАНИЕ! [Замечание от 25.04.00] При отладке примера мы столкнулись с тем, что при создании ASP-страницы DSR-конструктор почему-то не копирует несколько последних строк HTML-кода шаблона. (Поэтому вместо нижней строки COPURIGHT появляются какие-то обрывки текста.) Мы решили эту проблему, добавив непосредственно с помощью текстового редактора в самый конец файла шаблона SimpleR1.htm строку из 60-и пробелов.

В Конструкторе WebClass щелкните правой кнопкой мыши элемент tplSimple и выберите команду Edit HTML Template из контекстного меню. Тогда вы увидите свой шаблон в редакторе HTML-кода, который вы установили по умолчанию в среде. Еще раз обратите внимание, что вы имеете сейчас дело не с исходным файлом шаблона, а с его копией SimpleR1.htm. Внимательно приглядевшись, вы обнаружите, что шаблон страницы включает три тега, имеющих такой вид:

<WC@TAGTITLE>Title</WC@TAGTITLE>
... 
<WC@TAGEMAIL>Email</WC@TAGEMAIL>
... 
<WC@TAGNAME>Name</WC@TAGNAME>

Префикс WC@ указывает на то, что поля этих тегов могут заменяться во время выполнения программы на код, содержащийся в WebClass. Для этого мы будем использовать метод WriteTemplate, который вызывает специальную процедуру ProcessTag, как только в HTML-шаблоне встретится подобный тег. Вернемся в среду VB и дважды щелкнем элемент tplSimple для вывода окна Code. Введите в процедуру WebClass_Start (в самом начале, перед строкой tplSimple.WriteTemplate) еще одну строчку кода:

Session("Title") = "Введите свою информацию для регистрации:"

[Дополнение от 25.04.00] Чтобы заблокировать автоматическое восстановление параметров объекта Session в кэш-памяти IE5 здесь же нужно добавить еще две строки для начальной очистки других полей формы:

    Session("Email") = ""
    Session("Name") = ""

Далее в окне кода в левом верхнем списке выберите элемент tplSimple , а в правом верхнем списке — ProcessTag. В появившейся процедуре tplSimple_ProcessTag введите следующий текст:

Select Case TagName 
  Case "WC@TAGTITLE"
    TagContents = Session("Title")
  Case "WC@TAGEMAIL"
    TagContents = "Email:<br> <input type='text' name='Email'><br>"
  Case "WC@TAGNAME"
    TagContents = "Имя:<br> <input type='text' name='Name'><br>"
End Select

Обратная передача HTML-кода с помощью параметра TagContents осуществляет замену тегов. Установите контрольную точку (breakpoint) в строке tplSimple.WriteTemplate подпрограммы WebClass_Start и запустите приложение на выполнение. После остановки программы в контрольной точке с помощью клавиши F8 проследите шаг за шагом порядок выполнения событий. Вы увидите, что подпрограмма tplSimple_ProcessTag вызывается три раза — поочередно для каждого из трех тегов в шаблоне. Особенно интересно здесь то, что данная процедура заменяет теги Email и Name на HTML-код, который создает поля ввода в браузере (рис. 10).

Рис. 10.

Возможность интерактивно отлаживать код события для сервера является одной из наиболее мощных возможностей разработки WebClass-приложений, включенных в VB6. При Web-разработке в VB5 нельзя интерактивно отлаживать код на VBScript в ASPприложениях — создание пробных версий и исправление ошибок было, к сожалению, единственным способом проведения отладки.

В начало статьи

2.2. Установление связи с событием

Следующий этап в разработке нашего приложения — написание кода, который обрабатывает событие для кнопки "Зарегистрироваться", расположенной на форме. Для этого в Конструкторе WebClass щелкните элемент tplSimple на левой панели. Тогда справа вы увидите список HTML-элементов страницы, к которым можно подключить события. Щелкните правой кнопкой мыши тег Form1 и выберите команду Connect to Custom Event из контекстного меню (рис. 11).

Рис. 11.

Присвойте добавленному событию имя RegisterMe и обратите внимание на то, что имя события в столбце Target, расположенном рядом со столбцом Form1, также изменилось (рис. 12).

Рис. 12.

Теперь перейдем в HTML-шаблон и убедимся, что тег FORM принял следующий вид:

<FORM method='post' action=SimpleR.ASP?WCI=tplSimple &WCE=RegisterMe&WCU>

SimpleR.asp — это специальный сценарий запуска, о котором мы расскажем дальше. Значения, идущие после знака вопроса, обозначают следующее: элемент WebClass (WebClass Item — WCI) равен tplSimple; событие WebClass (WebClass Event — WCE) равно RegisterMe; а адрес WebClass URLData (WCU) пуст.

Когда пользователь щелкает кнопку "Зарегистрироваться" в браузере, эта строка кода запускает событие tplSimple_RegisterMe в ActiveX DLL-библиотеке на сервере. В данном случае работа формы связана с событием на сервере, однако вы можете установить в браузере любую гиперссылку, которая будет запускать нужное событие на сервере. Таким образом, использование WebClass вносит еще одно новшество в разработку Web- приложений — событийно-управляемый стиль программирования VB распространяется и на приложения, основанные на использования браузера.

Дважды щелкните событие RegisterMe на левой панели Конструктора WebClass, чтобы перейти в окно кода. Для нашего события введите следующий текст:

If Len(Request.Form("Email")) = 0 Then 
  Session("Title") = "Пожалуйста, введите " & "свой Email адрес!"
  Session("Email") = ""
  Session("Name") = ""
Else 
  Session("Title") = "Вот, что Вы ввели:"
  Session("Email") = Request.Form("Email")
  Session("Name") = Request.Form("Name")
End If 
tplSimple.WriteTemplate

Request.Form представляет собой стандартный способ возвращения введенных в форме данных из страницы в браузере. При этом устанавливается несколько переменных Session и повторно выводится тот же самый HTML-шаблон. Установите контрольную точку на операторе If и запустите проект.

Введите электронный адрес и имя, а затем щелкните кнопку "Зарегистрироваться". Вы увидите, что поле Title обновится, но поля ввода станут пустыми, так как пока в нашем программном коде им не присваивается никакого значения. Остановите выполнение проекта и откорректируйте tplSimple_ProcessTag в соответствии с кодом, приведенном в листинге 2. Для этого нужно добавить две строки, которые присваивают полям ввода значения (переменная Value), соответствующие переменным Session:

" value='" & Session("Email") & "'" & _
и
" value='" & Session("Name") & "'" & _

Снова запустите проект и удостоверьтесь, что теперь все будет работать как надо (рис. 13).

Рис. 13.

В начало статьи

2.3. Доступ к базе данных с помощью объектов ADO

И наконец, последний этап разработки — включение в состав проекта возможности хранить и получать записи из базы данных. Для этого создадим базу данных MS Access 7.0 в том же каталоге, где находится наше приложение, и назовем ее Register.mdb. Для этого можно воспользоваться встроенным средством VB — Visual Data Manager (VisData), которое запускается из меню Add-Ins. (Мы подробно описывали работу в VisData в статье "Создание персональной адресной книги на VB 5.0".) Добавим таблицу с двумя полями — Email и Name — и сохраним ее как Users. Щелкнем OK, когда Access предложит нам создать уникальное поле индекса. Чтобы сейчас не заниматься настройкой путей файлов, запишем Register.mdb в корневой каталог на диске C.

В среде VB добавьте ссылку к библиотеке Microsoft ActiveX Data Objects Library: с помощью команды Project|References отметьте библиотеку ADO Library 1.5 или 2.0. В случае если последняя не установлена на вашем компьютере, загрузите установочный комплект MDAC 2.0 с Web-узла Microsoft по адресу: www.microsoft.com/data/ado. Теперь откорректируйте подпрограмму tplSimple_RegisterMe в соответствии с кодом, приведенным в листинге 3.

Новая процедура tplSimple_RegisterMe сохраняет данные из формы в переменных Session, затем открывает набор записей ADO и ищет Email-адрес. Если адрес найден, подпрограмма возвращает найденную запись из базы данных с сообщением о дубликатном адресе. Если адрес не найден, информация о пользователе заносится в базу данных. Следующая строка кода определяет имя файла базы данных, который находится в одном каталоге с проектом, и указывает тип связи с ADO:

DBName$ = App.Path + "\register.mdb"
Connect = "DBQ=" + DBName$ + ";Driver={Microsoft Access Driver (*.mdb)}"

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

После компиляции проекта происходят две вещи. Во-первых, созданная библиотека ActiveX DLL регистрируется на той машине, где она разрабатывалась, — аналогично тому, как это бывает с любым ActiveX-проектом в VB. Во-вторых, создается специальный ASP-файл запуска, где указано имя проекта в свойстве NameInURL для WebClass. В нашем примере этот файл называется SimpleR.asp. Взгляните на текст этого сценария в каком-либо из редакторов, например Notepad. Когда пользователь вводит в браузере URL-адрес файла SimpleR.asp, IIS-сервер выполняет сценарий и создает экземпляр SimpleR.wcSimple. Здесь необходимо обратить ваше внимание на то, что Microsoft не рекомендует тем или иным образом изменять такой ASP-сценарий.

В начало статьи

3. Последнее напутствие...

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

Несомненно, VB5 можно было использовать для разработки Web-приложений, но там приходилось прибегать к огромному множеству программных трюков, чтобы ASP- сценарии взаимодействовали с DLL-библиотеками надлежащим образом. С появлением VB6 ушли в прошлое ограничения в VBScript и отсутствие подлинной событийно- управляемой среды программирования.

В начало статьи

ПРИЛОЖЕНИЯ

В начало статьи

Используемый по умолчанию код запуска события

При первом создании IIS-проекта используемый по умолчанию шаблон (шаблон VB- проекта — не путать с HTML-шаблоном!) вставляет следующий код:

Private Sub WebClass_Start()
  ' Пишет ответ пользователю
  With Response
    .Write "<html>"
    .Write "<body>"
    .Write "<h1><font face=""Arial""> WebClass1's Starting Page</font></h1>"
    .Write "<p>This response was created in the Start event of WebClass1.</p>"
    .Write "</body>"
    .Write "</html>"
  End With
End Sub

Данный код использует метод Write объекта Response для передачи некоторого текста в браузер, не требуя при этом никакого HTML-шаблона.

В начало статьи

Листинг 1. Содержимое исходного HTML-шаблона SimpleR.htm для проекта SimpleR.vbp

<HTML>
<!— SimpleReg.HTM —>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0;
        charset=windows-1251">
<TITLE>Простой пример Web-регистрации</TITLE>
</HEAD>
<BODY bgcolor="#ffffff">
<H2>Регистрационная форма</H2>
<WC@TAGTITLE>Title</WC@TAGTITLE>
<HR>
<FORM method='post'>
   <H3>Информация о пользователе:</H3>
   <WC@TAGEMAIL>Email</WC@TAGEMAIL><BR>
   <WC@TAGNAME>Name</WC@TAGNAME>
   <H3><INPUT id=submit1 name=submit1 type=submit
       value="Зарегистрироваться"></H3>
</FORM>
<HR>
<FONT face="" size=1>© 1999, А.К. & О.П. <BR>
</FONT>
</BODY></HTML>

В начало статьи

Листинг 2. Код процедур tplSimple_ProcessTag и WebClass_Start()

Private Sub tplSimple_ProcessTag(ByVal TagName As String, _
  TagContents As String, SendTags As Boolean)
  ' динамическая замена тегов
  Select Case TagName
    Case WC@TAGTITLE
      TagContents = Session("Title")
    Case "WC@TAGEMAIL"
      TagContents = "Email:<br>" & _
        "<input type='text'" & _
        " value='" & Session("Email") & "'" & _
        " name='Email'><br>"
    Case "WC@TAGNAME"
      TagContents = "Имя:<br>" & _
        "<input type='text'" & _
        " value='" & Session("Name") & "'" & _
        " name='Name'><br>"
    End Select
End Sub

Private Sub WebClass_Start()
   Session("Title") =  "Введите свою информацию для регистрации:"
   ' Выводит исходный HTML-шаблон
   tplSimple.WriteTemplate
End Sub

В начало статьи

Листинг 3. Код процедур tplSimple_RegisterMe()

Private Sub tplSimple_RegisterMe()
  Dim rs As ADODB.Recordset, Connect As String, DBName As String
  ' имя базы данным и тип доступа
  DBName$ = App.Path + "\register.mdb"  ' в каталоге приложения
  Connect = "DBQ=" + DBName$ + ";Driver={Microsoft Access Driver (*.mdb)}"
    '
  If Len(Request.Form("Email")) = 0 Then
    Session("Title") = "Пожалуйста, введите свой Email адрес!"
    Session("Email") = ""
    Session("Name") = ""
  Else ' введен Email-адрес
    Session("Email") = Request.Form("Email")
    Session("Name") = Request.Form("Name")
    Set rs = New ADODB.Recordset
    rs.Open "Users", Connect, adOpenDynamic, adLockOptimistic
    If Not rs.EOF Then rs.Find "Email='" & (Session("Email")) & "'"
    If rs.EOF Then
      rs.AddNew
      rs!Email = Session("Email")
      rs!Name = Session("Name")
      rs.Update
      Session("Title") = "Вот, что Вы ввели!"
    Else
      Session("Email") = rs!Email
      Session("Name") = rs!Name
      Session("Title") = "Запись с таким адресом уже существует!"
    End If
  End If
  ' формирование новой ASP-страницы
  tplSimple.WriteTemplate
  If Not rs Is Nothing Then rs.Close
End Sub

В начало статьи