Visual Basic, .NET, ASP, VBScript
 

   
 

.NET разработчик, автор множества статей. В ранние годы (2001 - 2003) занимался разработкой на Visual Basic 6 и Active Server Pages, с 2003 года в основном занят разработкой корпоративного программного обеспечения на платформе Microsoft .NET (C#, VB.NET; ASP.NET, Silverlight). Личный блог: http://pavel.surmenok.com/

 
     
   
 

Введение

    При создании web-страниц можно использовать VBScript. Но у него есть некоторые недостатки. Во-первых, VBScript поддерживает не все браузеры. Во-вторых, VBScript совершенно не умеет работать с файлами и базами данных, что существенно ограничивает его сферу применения.
    Технология Active Server Pages была разработана Microsoft сравнительно недавно. Она поддерживает как синтаксис JScript, так и VBScript, причём по умолчанию используется VBScript. Принцип технологии простой: скрипт исполняется на сервере, а пользователю передаётся готовый HTML-файл.
    Для работы с ASP требуется сервер на основе Internet Information Server для Windows NT/2k/XP или Personal Web Server для Windows 95/98/ME. Эти продукты можно совершенно бесплатно скачать с сайта Microsoft. Весит оно около 30 мегабайт. В комплекте с сервером поставляется огромная справочная система и примеры.
    Как правило, скрипты хранятся в файлах .asp, хотя могут храниться и в файлах с другими расширениями. Как правило, главной страницей сайта делается default.asp. Весь код, который должен исполняться на стороне сервера заключается между <% и %>. В самом начале файла указывается, какой синтаксис будет использоваться. Для того, чтобы указать, что будет использоваться VBScript нужно вставить такую строку:

<%@Language=VBScript%>

Объектная структура

    В ASP имеются несколько встроенных объектов. Ниже перечислены эти объекты, их свойства и методы.

Название Свойства Методы Описаиие
Appilaction Contents
StaticObjects
Value
Lock
Unlock
    Объект используется в основном для хранения переменных уровня приложения.
ASPError ASPCode
Number
Source
Category
File
Line
Column
Description
ASPDescription
      Объект ASPError можно использовать для получения информации об ошибке, которая произошла в сценарии на ASP-странице.
ObjectContext   SetAbort
SetComplete
    Используется для завершения или прерывания транзакции.
Request ClientSertificate
Cookies
Form
Item
QueryString
ServerVariables
TotalBytes
BinaryRead     Используется для получения передаваемых скрипту переменных, чтения cookies, получения HTTP переменных.
Response Buffer
CacheControl
CharSet
ContentType
Cookies
Expires
ExpiresAbsolute
Status
AddHeader
AppendToLog
BinaryWrite
Clear
End
Flush
IsClientConnected
Pics
Redirect
Write
    Используется для вывода данных, записи cookies, перенаправления браузера.
Server ScriptTimeout CreateObject
HTMLEncode
MapPath
URLEncode
URLPathEncode
    Служит для создания объектов на стороне сервера, определения полного адреса файла и содержит некоторые другие полезные мелочи.
Session CodePage
Contents
LCID
SessionID
StaticObjects
Timeout
Value
Abandon     Здесь хранятся переменные уровня сессии.

Вывод данных

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

Response.Write "<font size=7 color=red>Test</font>"

    Если внутри выводимой строки нужно использовать кавычку ["], то она удваивается.

Response.Write "Вот это "" кавычка"

    Microsoft предусмотрела сокращённую форму записи:

="<font size=7 color=red>Test</font>"

    Кроме метода Write у объекта Response есть другие свойства и методы.
    Свойство Buffer устанавливает, как будут передаваться данные: клиент будет получать их по мере поступления в объект Response или же получит сразу весь код после окончания работы скрипта.
    Метод Redirect перенаправляет браузер на другую страницу. В качестве параметра передаётся url, на который нужно перейти. Этот метод работает, только если на момент его вызова объект Response пуст!

Ввод данных

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

Mypage.asp?id=25&name=vbnet

    Странице mypage.asp передаются переменные id и name. Они указываются после имени файла и знака вопроса [?]. Параметры разделяются между собой знаком амперсанда [&]. Для того, чтобы получить значения передаваемых переменных используется свойство QueryString объекта Request.

Dim id, name
id = Request.QueryString ("id")
name = Request.QueryString ("name")
Response.Write "ID=" & id & ", а Name=" & name

    Заметьте, что в VBScript не нужно при объявлении указывать тип переменных, поскольку существует только один типа данных - Variant.
    Так как свойство QueryString является свойством по умолчанию объекта Request, можно использовать более короткую форму записи:

Dim id, name
id = Request ("id")
name = Request ("name")
Response.Write "ID=" & id & ", а Name=" & name

    Для передачи данных ASP приложению можно также пользоваться HTML формами. Возможны 2 метода передачи данных из форм: Get и Post. При использовании метода Get, значения переменных передаются через url. При использовании метода Post этого не происходит.

<form action="mypage.asp" method="post">
<input type=hidden name="id" value="25">
<input type=text name=name value="Введите имя">
<input type=submit value="Отправить"
</form>

    ASP скрипту, которому передаются данные абсолютно без разницы, какой метод передачи вы используете. Так что лучше, когда вы передаёте данные из HTML формы, используйте метод Post.

Переменные уровня сессии и приложения

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

Session ("email") = "pavel@vbnet.ru"

    А считываются данные ещё проще:

Dim email
email = Session ("email")
Response.Write email

    Объект Application существует в единственном экземпляре и используется для хранения данных на уровне всего приложения.

Application ("url") = "http://vbnet.ru"

Dim url
url = Application ("url")
Response.Write "Это <a href=" & url & ">" & url & "</a>"

Работа с базами данных

    Работа с базами данных на ASP осуществляется с помощью технологий ADO и ODBC. Для соединения с базой данных нужно обязательно указывать источник данных. Источник данных - информация о базе данных, главным образом о её типе и местонахождении.
    ADO (ActiveX Data Objects) - библиотека, содержащая объекты, с помощью которых можно работать с БД. Чаще всего используются объекты Connection и Recordset. Экземпляры объектов создаются с помощью метода CreateObject объекта Server. Сначала нужно создать соединение (объект Connection), открыть его с помощью метода Open, затем создаём рекордсет (объект Recordset) и открываем его методом Open.
    Например:

<%
Dim curdir, Conn, RS, sSQL 'объявляем переменные
curdir = Server.MapPath ("authors.mdb") 'Получаем полный путь к базе данных authors.mdb, лежащей в папке с этим скриптом
Set Conn = Server.CreateObject ("ADODB.Connection") 'создаём соединение
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & curdir 'открываем соединение
Set RS = Server.CreateObject ("ADODB.Recordset") 'создаём рекордсет
sSQL = "Select * From Authors Order By name;" 'формируем SQL запрос
RS.Open sSQL, Conn 'открываем рекордсет

If RS.BOF = False Or RS.EOF = False Then 'если в рекордсете есть записи, то
RS.MoveFirst 'перемещаемся к первой записи
%>

<!--Рисуем таблицу-->
<Table border=1 width=100%>
<tr>
<td>ID</td>
<td>Имя</td>
<td>E-mail</td>
<td>URL</td>
</tr>

<%
Do While Not RS.EOF 'перебираем все записи
'Выводим в таблицу информацию
%>

<tr>
<td><%=RS.Fields ("ID")%></td>
<td><%=RS.Fields ("name")%></td>
<td><%=RS.Fields ("email")%></td>
<td><%=RS.Fields ("url")%></td>
</tr>

<%
Loop
%>

</table>

<%
RS.Close 'Закрываем рекордсет
Conn.Close 'Закрываем соединение
Set RS = Nothing 'Уничтожаем объект RS
Set Conn = Nothing 'Уничтожаем объект Conn
%>

    Рекордсет следует использовать только если нужно получить данные из БД. Если же нужно только выполнить SQL команду действия, то рекордсет не нужен. Для выполнения SQL запроса действия используется метод Execute объекта Connection.

<%
Dim sSQL, Conn, ID, curdir
curdir = Server.MapPath ("authors.mdb") 'Получаем путь к базе
Set Conn = Server.CreateObject ("ADODB.Connection") 'создаём соединение
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & curdir 'открываем соединение
ID = Request ("id") 'Получаем значение переменной id
sSQL = "Update articles Set hits=hits+1 Where id=" & ID 'SQL запрос, который увеличивает значение поля hits на 1 у записи, поле id которой равно переменной id объекта Request
Conn.Execute sSQL 'Выполняем запрос
Conn.Close 'закрываем соединение
Set Conn = Nothing 'уничтожаем соединение
%>

Включение файлов

    Вы можете включать в ASP страницу код из других файлов. Для этого используется команда #include. Рассмотрим её работу на примере включения меню сайта, расположенного в файле menu.inc в ASP страницу.

menu.inc:

<a href=articles.asp>Статьи</a><BR>
<a href=samples.asp>Примеры</a><BR>
<a href=about.asp>Об авторе</a><BR>

    Теперь в ASP странице там, где нужно поместить меню, вставляем эту строку:

<!--#include file=menu.inc-->

    Плюсы использования этой возможности ASP очевидны. В примере, расположенном выше, для изменения меню сайта не нужно править все ASP страницы, а нужно исправить только один файл menu.inc.
    Все команды include обрабатываются сервером до выполнения кода. Например, следующий скрипт не сможет открыть файл Header1.inc, так как в ASP попытка выполнить команду #include будет предпринята раньше, чем имя файла будет назначено переменной name.

<!-- Этот скрипт не будет выполнен -->
<% name=(header1 & ".inc") %>
<!-- #include file="<%= name %>" -->

    Возможно использование вложенных include файлов. Например в файле menu.inc имеется команда включения файла copyright.inc.
    Недопустимы так называемые "перекрёстные" include файлы. Например в файле menu.inc имеется команда включения файла include.inc, а в include.inc расположена команда включения menu.inc. Такие включения не будут обработаны сервером и будет сгенерирована ошибка.
    Команды и процедуры скриптов полностью должны быть заключены в ограничители сценариев <% и %>, теги HTML <SCRIPT> и </SCRIPT> или теги HTML <OBJECT> и </OBJECT>. То есть, нельзя открыть ограничитель скрипта во включающем файле .asp и закрыть его во включаемом файле; скрипт или команда скрипта должны присутствовать в виде отдельных законченных модулей. Например, следующий скрипт не будет работать:

<!-- Этот скрипт не будет выполнен -->
<%
   For i = 1 To n
     инструкции основного файла
     <!-- #include file="header1.inc" -->
   Next
%>

    Следующий скрипт будет работать:

<%
   For i = 1 to n
     инструкции основного файла
%>
<!-- #include file="header1.inc" -->
<% Next %>

Обработка событий приложения

    В ASP имеется четыре события, которые может обрабатывать разработчик. Это старт/стоп сессии и старт/стоп приложения. Обработчики этих событий размещаются в файле global.asa в корневом каталоге приложения. Макет этого файла:

<Script language=VBScript Runat=Server>
Sub Application_OnStart
'код при старте приложения
End Sub
Sub Application_OnEnd
'код при остановке приложения
End Sub
Sub Session_OnStart
'код при старте сессии
End Sub
Sub Session_OnEnd
'код при окончании сессии
End Sub
</Script>

HTTP переменные

    Используя объект Request можно получить некоторые переменные, полученные от браузера. Ниже перечислены некоторые из них:

Переменная Описание
ALL_HTTP     Все HTTP заголовки.
ALL_ROW     Все заголовки в raw-форме. Отличие от ALL_HTTP состоит в том, что в ALL_HTTP имя заголовка стоит после HTTP_ и написано заглавными буквами. А в ALL_ROW имена заголовков передаются в таком виде, в каком они были посланы пользователем.
APPL_MD_PATH     Передаёт логический путь к приложению для ISAPI DLL.
APPL_PHYSICAL_PATH     Передаёт физический путь к приложению.
AUTH_PASSWORD     Значение, введённое пользователем в диалог аутотентификации. Переменная доступна только если была использована аутентификация.
AUTH_TYPE     Метод аутотентификации, используемый сервером для ограничения доступа пользователей к защищённому скрипту.
AUTH_USER     Имя аутотентифицированного пользователя.
CERT_COOKIE     Уникальный ID для сертификата клиента.
CERT_FLAGS     Bit0 равен 1, если присутствует сертификат пользователя. Bit1 равен 1, если Certifying Authority пользователя недействительно (отсутствует в списке CA на сервере).
CERT_ISSUER     Значение поля Issuer сертификата пользователя (O=MS, OU=IAS, CN=user name, C=USA).
CERT_KEYSIZE     Размер ключа в соединении Secure Sockets Layer.
CERT_SECRETKEYSIZE     Размер ключа личного сертификата сервера.
CERT_SERIALNUMBER     Серийный номер сертификата пользователя.
CERT_SERVER_ISSUER     Значение поля Issuer сертификата сервера.
CERT_SERVER_SUBJECT     Значение поля Subject сертификата сервера.
CERT_SUBJECT     Значения поля Subject сертификата пользователя.
CONTENT_LENGTH     Длина данных, переданных пользователем скрипту.
CONTENT_TYPE     Тип данных, переданных пользователем. Используется при запросах, как Get, Post, Put.
HTTP_<ИмяЗаголовка>     Передаёт значение заголовка HTTP_<ИмяЗаголовка>.
Примечание: Сервер заменяет знак подчёркивания [_] в ИмяЗаголовка на тире [-]. Например, если Вы запросите заголовок HTTP_MY_HEADER, то сервер будет искать заголовок с именем HTTP_MY-HEADER.
HTTPS     Возвращает ON, если запрос от пользователя был получен через защищённый канал и возвращает OFF, если запрос получен через незащищённый канал.
HTTPS_KEYSIZE     Размер ключа в соединении Secure Sockets Layer.
HTTPS_SECRETKEYSIZE     Количество бит в личном ключе сертификата сервера. Например, 1024.
HTTPS_SERVER_ISSUER     Значение поля Issuer сертификата сервера.
HTTPS_SERVER_SUBJECT     Значение поля Subject сертификата сервера.
INSTANCE_ID     ID копии IIS в текстовом формате.
INSTANCE_META_PATH     Metabase путь копии IIS, которая отвечает на запрос.
LOCAL_ADDR     IP адрес сервера.
LOGON_USER     Логин пользователя в Windows NT.
PATH_INFO     Дополнительная информация о пути, переданная клиентом.
PATH_TRANSLATED     Физический путь, полученный из виртуального пути PATH_INFO.
QUERY_STRING     Информация запроса, находящаяся в url после знака вопроса [?].
REMOTE_ADDR     IP адрес пользователя.
REMOTE_HOST     Имя компьютера пользователя.
REMOTE_USER     Имя пользователя, посланное пользователем.
REQUEST_METHOD     Метод отправки запроса. Для HTTP это: Get, Head или Post.
SCRIPT_NAME     Виртуальный путь к исполняемому скрипту.
SERVER_NAME     Имя сервера, DNS или IP адрес сервера.
SERVER_PORT     Номер порта сервера, на который был послан запрос.
SERVER_PORT_SECURE     Если порт, на который был послан запрос, охраняется, то эта переменная будет иметь значение 1. В отличном случае - 0.
SERVER_PROTOCOL     Название и версия протокола запроса информации. Имеет формат: Протокол/Версия.
SERVER_SOFTWARE     Название и версия программного обеспечения сервера, которое отвчает на запрос и стартует сессию.
URL     Основная часть url.

    Значения HTTP заголовков получаются так же, как и другие переменные, хранящиеся в объекте Request.

Dim IP
IP = Request ("REMOTE_ADDR")
Response.Write IP

    Так как все HTTP заголовки входят в коллекцию ServerVariables, можно использовать для получения их значений цикл For Each ... Next.

<%
Dim name
%>
<TABLE>
<TR>
<TD><B>Переменные сервера</B></TD>
<TD><B>Value</B></TD>
</TR>
<% For Each name In Request.ServerVariables %>
<TR>
<TD> <%= name %> </TD>
<TD> <%= Request.ServerVariables(name) %> </TD>
</TR>
<% Next %>
</TABLE>

Работа с почтой

    Рано или поздно у разработчика ASP-приложения появляется необходимость работы с электронной почтой. Например, нужно отправить пользователю забытый пароль или направить автору вопроса на форуме ответ на него и т.д. Для этого можно воспользоваться стандартной библиотекой CDO (Collaboration Data Objects). Эта библиотека имеет очень разветвлённую объектную структуру. В этой статье мы рассмотрим только отправку сообщений с помощью CDO. Для этого используется объект Message. Мы воспользуемся такими свойствами, как From, To, Subject, BodyPar, Body, HTMLBody и одним методом Send.
    Сначала, как всегда, создаём ссылку на объект.

Dim mailMessage, sBody
Set mailMessage = Server.CreateObject ("CDO.Message")

    Затем заполняем поля сообщения, текст сообщения и указываем его кодировку.

mailMessage.From = "mailrobot@vbnet.ru@
mailMessage.To = "vasya@pupkin.ru"
mailMessage.BodyPart.Charset = "koi8-r"
mailMessage.Subject = "Тема собщения"
sBody = "Уважаемый Василий Пупкин!" & vbCrLf & "Вы приглашены на открытие раздела сайта VBNet.ru Справочник Visual Basic" & vbCrLf & "С наилучшими пожеланиями, Администрация VBNet.ru"
mailMessage.Body = sBody

    Если Вы хотите отправить сообщение не в текстовом, а HTML формате, то нужно использовать свойство htmlBody вместо Body:

sBody = "Уважаемый Василий Пупкин!<BR>Вы приглашены на открытие раздела сайта VBNet.ru Справочник Visual Basic<BR>С наилучшими пожеланиями, Администрация VBNet.ru"
mailMessage.htmlBodyBody = sBody

    Теперь отправляем сообщение, используя метод Send.

mailMessage.Send

    После того, как письмо отправлено, уничтожаем объект mailMessage для освобождения памяти.

Set mailMessage = Nothing

Заключение

    В этой статье были рассмотрены основные инструменты технологии Active Server Pages.

Павел Сурменок
pavel@vbnet.ru
vbnet.ru
 
     

   
   
     
  VBNet рекомендует