Шаг 1 - Что есть ASP ?
Что есть ASP (Active Server Pages) - активные серверные страницы ?
Это HTML страницы с дополнительным программным кодом для динамического построения страниц на основании данных, полученных из БД SQL. В моих шагах это смесь HTML и VBScript.
Что нужно для работы с ASP ?
Нужен Windows NT Server, Internet Information Server (IIS) и ASP, MS SQL Server. Для серьезной разработки нужен InterDev из MS Visual Studio.
Редакторы, подобные FrontPage, "убивают" в страницах непонятный для них код. Вопросам установки и конфигурирования всего этого посвящены многостраничные тома, поэтому, будем считать, что все установлено правильно и работает.
Запускаем InterDev. У меня версии 6.0 с установленным SP3. Многие программисты клянут все продукты Microsoft, а что такое SP не знают. Или считают, что SP для Windows NT (есть уже SP6a) и SP для Visual Studio (есть SP3) - это одно и то же. И не знают, что после повторной установки дополнительных компонентов надо снова прогонять SP... Для Windows - свой, для Visual Studio - свой, и т.д. Такова жизнь...
- В меню File выбираем New Project.
- На закладке New выбираем Visual InterDev Projects.
- В окне выбираем New Web Project.
- Задаем имя проекта и его расположение на диске.
- Нажимаем кнопку Open
- Запускается Web Project Wizard
- Задаем имя сервера (или его адрес) и режим Master mode, нажимаем Next
- Происходит подключение к серверу. У вас должны быть необходимые административные права для этого.
- Выбираем режим Connect to an existing Web и Name: Root Web, давим на Finish.
Создается проект... Процесс не мгновенный, особенно, если "там" много файлов. Должно появиться окно Project Explorer (в главном окне InterDev).
Мой знакомый таким образом управляет сервером далеко за океаном... Дух захватывает !!!
Продолжим.
- В меню Project выбираем Add Item.
- Выбираем HTML Page или ASP Page... Можно попробовать оба варианта и сравнить код созданных страниц.
- Мы создадим страницу Test1.asp
- В окне редактора видим код. От кода HTML он отличается только первой строкой:
<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<P> </P>
</BODY>
</HTML>
- Пишем вместо <P> </P> что-нибудь...
- Нажимаем Сохранить.
- В IE указываем адрес своего сервера и имя страницы.
Первый шаг сделан. Дальше будет интересней...
Шаг 2 - Файл GLOBAL.ASA и строка соединения с БД
Использование ASP предполагает знание HTML, поэтому, комментариев по тэгам не будет... Смотрите раздел Html&Web.
Нам надо "подключиться" к серверу баз данных. У меня - MS SQL Server 7.0. Для "подключения" необходимо иметь строку соединения. Ее лучше сразу положить в файл GLOBAL.ASA, который "лежит", или должен "лежать", в корне основного каталога нашего Интернет-сервера.
Файл GLOBAL.ASA содержит сценарии. В нем объявляются глобальные переменные и определяются обработчики событий, доступные для всех страниц нашего приложения.
Содержание файла GLOBAL.ASA
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Application_OnStart
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Application_OnEnd
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnStart
Session("DBConnectionString")="DATABASE=Имя_базы_данных;UID=Имя_пользователя;PWD=Пароль_пользователя;DSN=Системный_DSN;APP=ASP Script"
END SUB
</SCRIPT>
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
SUB Session_OnEnd
END SUB
</SCRIPT>
Рассмотрим назначение обработчиков событий в нашем файле:
Session_OnStart - выполняется один раз при первой загрузке пользователя любой страницы.
Session_OnEnd - выполняется по завершении сеанса работы пользователя, по истечении заданного времени или по команде пользователя
Application_OnStart - выполняется один раз при первой загрузке пользователя первой страницы
Application_OnEnd - выполняется один раз, когда сервер заканчивает работу
А сейчас нас интересует строка в модуле Session_OnStart:
Session("DBConnectionString")="DATABASE=Имя_базы_данных;UID=Имя_пользователя;PWD=Пароль_пользователя;DSN=Системный_DSN;APP=ASP Script"
Этой командой мы создаем глобальную переменную DBConnectionString (имя может
быть любым), доступную во всех страницах нашего приложения.
DATABASE - имя базы данных SQL-сервера
UID - имя пользователя (логин) для обращения к базе данных
PWD - пароль пользователя (логина)
DSN - системный DSN для подключения к базе данных
APP - тип приложения, которое обращается к серверу базы данных
Логин и пароль для доступа ASP к БД SQL должен создать Администратор SQL Server.
Сохраняем наш файл. Следует отметить, что файл GLOBAL.ASA пользователь никогда не видит.
Шаг 3 - Тэги ASP и наш первый запрос к БД.
Несколько слов о тэгах ASP.
Тэги <% %> и <%= %>
Тэг <% %> используется для обозначения любого сценария, который должен исполняться сервером. Клиент никогда не видит кода внутри этого тэга.
Тэг <%= %> предназначен для записи HTML-кода в том месте передаваемого документа, где находится этот тэг.
Пример 1
<% intCount = 10%>
Присваивает переменной intCount значение 10.
Пример 2
<% = intCount %>
Вставляет в HTML-документ значение переменной intCount. На экране мы увидим число 10.
Какой бы тэг ни был использован, клиент не будет знать содержимого сценария. Вместо этого он увидит HTML-код, который исполнил сценарий. Вот так !!!
Тэг <SCRIPT>
ASP-сервер различает сценарии для клиента и сервера по атрибуту RUNAT. Если значение равно "server", то ASP анализирует, компилирует и выполняет данный сценарий. В противном случае сценарий передается клиенту.
<SCRIPT LANGUAGE="vbscript" RUNAT="server">
</SCRIPT>
Продолжаем редактировать нашу страницу Test1.asp
Дополняем ее кодом для выполнения запроса к БД.
<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<P>ASP по шагам</P>
<%
\' Следующая строка обращается к объекту Server и создает соединение:
Set Conn = Server.CreateObject("ADODB.Connection")
\' Строка открытия сессии использует нашу глобальную переменную, объявленную в файле GLOBAL.ASA (Шаг 2)
Conn.Open Session("DBConnectionString")
\'Открываем RecordSet с именем RS, используя для этого SQL запрос к БД
DoubleInfo и таблице T_InfoRub.
Set RS = Conn.Execute("select * from DoubleInfo..T_InfoRub")
%>
\' Начинаем цикл по нашему RecordSet
<% Do While Not RS.EOF %>
\' Выводим значение поля FldStrName таблицы T_InfoRub
<%=RS("FldStrName")%>
\' Начинаем новую строку для следующей записи
</br>
<%
\' Переходим к следующей записи
RS.MoveNext
\' Конец цикла по записям
Loop
\' Закрываем RecordSet
RS.Close
\' Закрываем соединение
Conn.Close
%>
</BODY>
</HTML>
Оказывается, все очень просто !!!
В следующем шаге мы узнаем, почему после изменения данных в таблице мы не видим этого в нашей активной странице.
Шаг 4 - Обновление информации в активной странице.
В предыдущем шаге наша страница начала выводить информацию из таблицы базы данных. Если вы измените информацию в таблице, то, рано или поздно, столкнетесь с тем, что наша (Ваша) страница отображает изменения "через раз". Это связано с тем, что информация в Internet кэшируется серверами. В свое время, с решением этого вопроса мне помог мой знакомый Влад. Я о нем упоминал в Шаге 1.
Добавим в самом начале нашей страницы две строки. Не забудем включить их в тэг <% %>:
<%@ Language=VBScript %>
<%
Response.Expires = 0
Response.AddHeader "pragma", "no-cache"
%>
<HTML>
<HEAD>
....................
Об объекте Response мы поговорим позже. Сейчас самое важное, что после сохранения кода наша страница всегда и сразу отображает изменения информации в таблице базы данных. Шаг у нас получился небольшой, но очень важный.
Шаг 5 - Включаемые файлы.
В ASP-документ можно включать внешние файлы, которые обрабатываются вместе с основным документом так, как будто они являются составной частью документа. Это позволяет создавать совместно используемые наборы сценариев и библиотек. Для включения файла в ASP-документ используется директива препроцессора
<!--#include virtual="OtherFile.asp"-->
или
<!--#include file="OtherFile.asp"-->
Включаемые файлы вставляются в ASP-документ до выполнения сценариев.
Ограничений на количество включаемых файлов нет. Можно даже добавлять файлы во включаемый файл. Нельзя создавать циклические ссылки. Например, документ
А включает документ В, документ В включает документ С. При включении документа А в документ С возникнет ошибка.
В следующих шагах мы начнем изучать серверные компоненты.
Шаг 6 - Передача данных на сервер.
До сих пор наши страницы отображали данные из таблицы базы данных. Настало время записать что-нибудь в таблицу. Для этого создадим новую страницу Test2.asp, как в Шаге 1. Не забываем добавить две "волшебные" строки в начале страницы:
<%@ Language=VBScript %>
<%
Response.Expires = 0
Response.AddHeader "pragma", "no-cache"
%>
<HTML>
<HEAD>
..................
После кода <P> </P> , или вместо него, добавляем форму для ввода данных:
<FORM ACTION="Test2.asp" METHOD=POST id=form1 name=form1>
Наименование: <BR> <INPUT TYPE="Text" NAME="TextBoxName" VALUE="" SIZE=50
MAXLENGTH=40> <BR>
Содержание: <BR> <textarea rows="5" name="EditBoxComment" cols="50"
VALUE=""></textarea><BR>
<BR><INPUT TYPE=SUBMIT NAME="Action" VALUE="Enter Запись">
</FORM>
Сохраняем код и вызываем страницу, например, в IE. Комментировать этот код не буду - здесь все HTML. Стоит обратить внимание только на
ACTION="Test2.asp" - форма вызывает (возвращает) нашу страницу.
Добавим еще несколько строк в начале страницы
<%@ Language=VBScript %>
<%
Response.Expires = 0
Response.AddHeader "pragma", "no-cache"
%>
\' Создаем строковую переменную и анализируем код возврата - Action = "Enter"
,
\' где "Enter" часть нашего <INPUT TYPE=SUBMIT NAME="Action" VALUE="Enter
Запись"> из формы.
<%
strMsg=""
Action = Left(UCase(Request("Action")),5)
If Action = "ENTER" Then
strMsg="Данные получены !!!"
End If
%>
<HTML>
<HEAD>
..................
После кода <P> </P> , в "теле" страницы, добавляем строку <% = strMsg %>. Сохраняем код и проверяем его работу. Наша форма реагирует на нажатие кнопки формы. В следующем шаге мы прочитаем данные из полей ввода формы и запишем их в таблицу базы данных.
Шаг 7 - Пишем данные в таблицу.
Продолжаем редактировать нашу страницу Test2.asp. Усложним блок проверки.
<%
strMsg=""
Action = Left(UCase(Request("Action")),5)
If Action = "ENTER" Then
strMsg="Данные получены !!!"
\' Добавлен следующий код, в котором мы проверяем, что все поля формы
заполнены.
If Request("TextBoxName") = "" OR _
Request("EditBoxComment") = "" Then
strMsg="<B>Все поля формы должны быть заполнены.</B>"
End If
End If
%>
Обратите внимание на символ подчеркивания в конце строки If
Request("TextBoxName") = "" OR _
Этим символом выполняется перенос командной строки. Операторы If Then, End
If, OR понятны каждому программисту.
А теперь, перед блоком проверки добавим следующий код:
<SCRIPT LANGUAGE=VBScript RUNAT=Server>
FUNCTION CheckString (s, endchar)
pos = InStr(s, "\'")
While pos > 0
s = Mid(s, 1, pos) & "\'" & Mid(s, pos + 1)
pos = InStr(pos + 2, s, "\'")
Wend
CheckString="\'" & s & "\'" & endchar
END FUNCTION
</SCRIPT>
Эта функция нам понадобится нам для обработки строковых данных перед
составлением SQL-команды. В блок проверки добавляем "ветвь" Else:
If Request("TextBoxName") = "" OR _
Request("EditBoxComment") = "" Then
strMsg="<B>Все поля формы должны быть заполнены.</B>"
Else
\' Начинаем "строить" нашу команду для SQL-сервера. Указываем имя БД и имя таблицы, затем, перечисляем поля.
strSqlCommand = "insert into DataBaseName..TableName (" &_
"FldStrName," &_
"FldStrComment) " &_
" VALUES ("
\' Добавляем значение TextBoxName из нашей формы в предыдущем шаге.
strSqlCommand = strSqlCommand &
CheckString(Request("TextBoxName"),",")
\' Добавляем значение EditBoxComment из нашей формы в предыдущем шаге.
strSqlCommand = strSqlCommand &
CheckString(Request("EditBoxComment"),"")
\' Создаем соединение с сервером БД
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open Session("DBConnectionString")
\' Выполняем нашу подготовленную команду strSqlCommand
Conn.Execute(strSqlCommand)
\' Закрываем соединение
Conn.Close
End If
Наша страница ASP "научилась" записывать данные в таблицу базы данных.
Шаг 8 - Серверные компоненты и объектная модель ASP-сервера.
Мы очень быстро научились создавать ASP-страницы, которые умеют "читать" и "писать" базу данных SQL. Пора задуматься о смысле жизни...
Технология ASP может использовать компоненты ActiveX и взаимодействовать с сервером с учетом использования объектной модели.
Серверные компоненты представляют собой объекты OLE Automation. Можно создавать серверные компоненты при помощи C++, Visual Basic, но ASP содержит и ряд встроенных компонентов.
Ad Rotator - позволяет "вращать" изображения на странице в случайном порядке, либо в определенной последовательности.
Browser Capabilities - позволяет сценарию получить информацию о возможностях клиента.
Content Linker - позволяет создать и вести список URL Web-узла.
Database Access - самый важный компонент или Active Data Object (ADO), который позволяет легко и просто получить доступ к базе данных.
File Access - позволяет создавать, открывать , читать и записывать текстовый файл в локальной файловой системе.
Объектная модель ASP-сервера
Application - создается в файле GLOBAL.ASA и может применяться для совместного использования данных.
Определяем пользовательское свойство и записываем его значение:
<% Application("MyBackColor") = "green" %>
Теперь во всех файлах нашего приложения можем создать одинаковый для всех страниц тэг:
<BODY BGCOLOR = <%= Application("MyBackColor") %> >
Request - объект содержит значения, переданные серверу посредством HTTP-запроса. В этом объекте есть пять наборов:
ClientCertificate - данные, которые запросил сервер при установлении соединения
Cookies - значения cookie Forms - содержит значения, переданные серверу при отправке данных формы методом POST
QueryString - содержит значения, переданные серверу при отправке данных формы методом GET
ServerVariables - содержит ряд переменных среды сервера, например HTTP_USER_AGENT
Response - отправляет данные обратно клиенту. Например, вызывая метод Write объекта Response можно вставлять строки в выходной HTML-файл.
Server - позволяет сценарию взаимодействовать с сервером.
Session - сохраняет информацию о сеансе работы пользователя.
Это краткий обзор "анатомии" ASP. Его надо было сделать. Есть над чем задуматься или испугаться... А для тех, кто ничего не боится, будут следующие шаги и подробности ASP.
Шаг 9 - Объект Application.
Начнем познавать объекты ASP по-порядку.
Объект Application позволяет создавать объекты и обеспечивает доступ к ним.
Мы можем создавать переменные и обращаться к ним из страниц нашего приложения:
<%
Application("strName") = "Привет всем !!!"
Application("intCount") = 25
%>
У объекта Application есть два метода (Lock и Unlock), которые позволяют обеспечить дифференцированный доступ пользователей к нашим переменным:
<%
Application.Lock
Application("intCount") = Application("intCount") + 1
Application.Unlock
%>
События объекта Application описываются в файле GLOBAL.ASA. Мы говорили о них в Шаге 2. Напомню, событий всего два:
Application_OnStart
Application_OnEnd
Шаг 10 - Объект Request.ServerVariables().
В коллекции объекта есть несколько интересных объектов.
Request.ServerVariables() позволяет получить много полезной информации.
Переменных достаточно много. Их использование и значение зависят от многих факторов. Предлагаю следующий пример программы:
<%@ Language=VBScript %>
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY>
<P>ASP Server Variables</P>
<BR><% = Request.ServerVariables("AUTH_TYPE") %>
<BR><% = Request.ServerVariables("CONTENT_LENGTH") %>
<BR><% = Request.ServerVariables("CONTENT_TYPE") %>
<BR><% = Request.ServerVariables("GATEWAY_INTERFACE") %>
\' Имя пользователя, зарегистрировавшегося в системе Windows NT
<BR><% = Request.ServerVariables("LOGON_USER") %>
<BR><% = Request.ServerVariables("PATH_INFO") %>
<BR><% = Request.ServerVariables("PATH_TRANSLATED") %>
<BR><% = Request.ServerVariables("QUERY_STRING") %>
\' IP-адрес клиента, обратившегося к нашему серверу.
\' Полученное значение можно записывать в таблицу БД для дальнейшей обработки
учета посещений.
<BR><% = Request.ServerVariables("REMOTE_ADDR") %>
<BR><% = Request.ServerVariables("REMOTE_HOST") %>
<BR><% = Request.ServerVariables("REQUEST_METHOD") %>
<BR><% = Request.ServerVariables("SCRIPT_MAP") %>
<BR><% = Request.ServerVariables("SCRIPT_NAME") %>
\' Имя хоста или его IP-адрес
<BR><% = Request.ServerVariables("SERVER_NAME") %>
\' Номер порта
<BR><% = Request.ServerVariables("SERVER_PORT") %>
<BR><% = Request.ServerVariables("SERVER_PORT_SECURE") %>
<BR><% = Request.ServerVariables("SERVER_PROTOCOL") %>
<BR><% = Request.ServerVariables("SERVER_SOFTWARE") %>
<BR><% = Request.ServerVariables("URL") %>
<p>Пример использования серверной переменной
<br><A HREF="http://<%= Request.ServerVariables("SERVER_NAME")
%>/scripts/MyPage.asp">Link to MyPage.asp</A>
</BODY>
</HTML>
Шаг 11 - Объект Response.
Один из самых интересных и полезных объектов.
Можем установить значения для используемых атрибутов:
<%
Response.Cookies("Type") = "My Web Server"
Response.Cookies("Type").Expires = "May 30, 2000"
Response.Cookies("Type").Domain = "center.kharkov.com"
Response.Cookies("Type").Path = "/www/home/"
Response.Cookies("Type").Secure = FALSE
%>
Можем добавить в выходную страницу специфические значения:
<%
Response.Addheader "WWW-Authenticate", "BASIC"
%>
Можем записать строку в файл протокола IIS:
Response.AppendToLog strStringLog
StrStringLog - строка должна быть длиной до 80 символов и использовать в качестве разделителя ;
Можем заставить Browser отобразить другую страницу:
Response.Redirect "http://center.wit.kharkov.ua/education_masters.asp"
И, пожалуй, самое главное в объекте Response. Можем полностью формировать выходной поток и строить страницы любой сложности:
<%
Response.Write "<TABLE WIDTH = 100%\\>"
%>
Обратите внимание на слэш после 100% ! Без него будет ошибка. В результате работы этого кода в страницу будет вставлен следующий код:
<TABLE WIDTH = 100%>
Для записи в выходной поток длинных строк следует применять следующий прием:
<%
strLongString = String(4096, "A")
Response.Write(strLongString)
%>
Для записи в выходной поток двоичных объектов следует использовать BinaryWrite:
<%
Response.BinaryWrite pict
%>
Если свойство Response.Buffer установлено в TRUE можно очистить буфер формируемого потока:
<%
Response.Clear
Response.End
%>
Метод End останавливает выполнение скрипта и направляет текущий результат клиенту.
Метод Flush немедленно выгружает буфер выходного потока:
<%
Response.Flush
%>
Шаг 12 - Объект Server.
Очень важный объект в работе ASP. Одно название чего стоит !!!
Свойств всего одно:
<% Server.ScriptTimeout = 30 %>
Устанавливает тайм-аут выполнения скрипта. По умолчанию это время 90 секунд.
Можем прочитать это значение в переменную:
<% intTimeOut = Server.ScriptTimeout %>
Или установить другое время выполнения:
<% Server.ScriptTimeout = 180 %>
Мы можем создавать серверные объекты при помощи метода Server.CreateObject(). Если объект создается из страницы, то он будет автоматически уничтожен как только сервер завершит обработку данной ASP-страницы.
Можно сохранить объект в переменной сессии:
<%Set Session("MyObject") = Server.CreateObject("MSWC.AdRotator") %>
Удалить объект можно двумя способами.
<% Session("MyObject") = Nothing %>
<% Session("MyObject") = "Просто строка текста" %>
Для установки HTML-кодировки указанной строке можно использовать метод Server.HTMLEncode():
<% = Server.HTMLEncode("Тэг параграфа - <p>")%>
Посмотрите страничку как текст и вы увидите преобразованный HTML.
Для установки относительного пути к папке на сервере используется метод Server.MapPath(). Например, у вас есть файл C:\\Inetpub\\wwwroot\\script\\MyFile.TXT. Для определения пути к этому файлу можно добавить следующую строку :
<% = Server.MapPath(Request.ServerVariables("PATH_INFO"))%>
Можно применять и следующую конструкцию :
<% = Server.MapPath("script/MyFile.TXT") %>
Нельзя использовать точки (.) или (..) - будет ошибка.
Для кодировки с escape-последовательностями строки используется метод Server.URLEncode():
<% Response.Write(Server.URLENcode("http://www.mydomen.com"))%>
Посмотрите у себя на результат выполнения.
Необходимо добавить следующее. Для создания ASP НЕ обязательно иметь Windows NT. Можно использовать Personal Web Server(PWS) для Win95 и Win98. Замечание прислал Валерий Хромов.
Шаг 13 - Сервер и клиент.
Мы обзорно рассмотрели объекты ASP. Теперь необходимо узнать следующее - обработка информации может осуществляться как на сервере, так и на стороне клиента. Браузер клиента - это несколько объектов, которыми можно управлять. VBScript позволяет очень много. Какие события обрабатывать на стороне сервера, а какие на стороне клиента, - решать Вам. Это зависит, в первую очередь, от логики приложения.
Следующий пример демонстрирует взаимодействие различных объектов и события на стороне клиента.
<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<TITLE>Тест</TITLE>
</HEAD>
<BODY>
<H3>Дата и время</H3>
<FORM NAME="MyForm">
<INPUT TYPE="TEXT" NAME="txtTime">
<INPUT TYPE="BUTTON" VALUE="Update Time" NAME="btnTime">
</FORM>
<SCRIPT LANGUAGE="VBSCRIPT">
MyForm.txtTime.value = Now()
Sub btnTime_OnClick
MyForm.txtTime.value = Now()
End Sub
</SCRIPT>
</BODY>
</HTML>
Сочетание возможностей VBScript на стороне сервера и на стороне клиента позволяет обеспечить полный контроль над Web-приложением.