Введение
При создании 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.