» ASP
для новичков
» Главная
страница
»
ASP
для новичков
Работа с
объектами HttpRequest и HttpResponse Сами встроенные объекты
HttpRequest и HttpResponse мы уже рассматривали в одном из разделов данной
главы. Однако это был лишь обзор их свойств и методов. Сейчас пришло время
несколько более подробно рассмотреть механизмы работы с этими встроенными
объектами.
Начнем мы с самого простого
варианта работы. Как мы помним, объект HttpRequest содержит в себе
информацию, которая пришла на сервер от браузера удаленного пользователя.
Попробуем получить из этого запроса все данные, которые сможем.
Воспользуемся предыдущим
примером с передачей данных из формы. Но для обрабатывающей страницы мы
установим код, приведенный в листинге 3.26. Так как ее содержимое создается
динамически при помощи объекта Response, а точнее, его метода write, нам не
потребуется размещать на разрабатываемой Web-странице какие-либо компоненты.
Листинг 3.26
Public Class WebForm2
Inherits System.Web.UI.Page
tRegion " Web Form Designer
Generated Code "
'This call is required by
the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeCcmponent()
End Sub
Private Sub Page_Init(ByVal
sender
As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Init
'CODEGEN: This method call
is required by the Web Form Designer 'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Load
'Put user code to initialize
the page here
Dim n As String
Dim t As Boolean
Dim i As Integer
n = Request.ApplicationPath
Response.Write("Путь к
приложению — " + n)
Response.Write("<р>Браузер пользователя")
n = Request.Browser.Browser
Response.Write("<р>Услозное наименование браузера — " + n)
t =
Request.Browser.ActiveXControls
If t Then
Response.Write("<р>Элементы ActiveX включены") Else
Response.Write("<р>Элементы ActiveX выключены") End If
t =
Request.Browser.BackgroundSounds If t Then
Response.Write("<р>3вук включен") Else
Response.Write("<р>3вук выключен") End If
t = Request.Browser.Cookies
If t Then
Response.Write("<p>Cookies сохраняются")
Else
Response.Write("<p>Cookies не сохраняются") End If
t =
Request.Browser.JavaApplets If t Then
Response.Write
("<p>Java-annjieibi выполняются") Else
Response.Write("<p>Java-anraieTbi не выполняются") End If
n = Request.Browser.Platform
Response.Write("<p>OC пользователя — " + n) i = Request.ContentLength
Response.Write("<р>Длина полученного пакета — " + i.ToString() + "
байтов") n = Request.HttpMethod
Response.Write("<р>Использованный метод передачи данных — " + n) n
= Request.Pathlnfо
Response.Write("<р>Дополнительные данные в URL- " + n) n =
Request.RawUrl
Response.Write("<р>Полный URL — " + n) n =
Request.UrlReferrer.AbsoluteUri
Response.Write
("<p>URL страницы, с которой пришел пользователь — " + г.) n =
Request.UserHostAddress
Response. Write
("<р>1Р-адрес пользователя — " + n)
End Sub
End Class
Результат работы этого
приложения нельзя показать на иллюстрации, так как созданная Web-страница
достаточно велика и не может поместиться полностью на экране, поэтому мы просто
воспроизведем отображенный текст. Текстовое содержимое обрабатывающей страницы
выглядит следующим образом:
Браузер пользователя
Условное наименование
браузера — IE
Элементы ActiveX включены
Звук включен
Cookies сохраняются
Java-апплеты выполняются
ОС пользователя — WinNT
Длина полученного пакета — 0
байтов
Использованный метод
передачи данных. — GET
Дополнительные данные в URL-
Полный URL —
/form/WebForm2.aspx?fl=%DO%98%DO%B3%DO%BE%Dl%80%Dl%8C&f2=Webmaster@bhv.
spb.su
URL страницы, с которой
пришел пользователь — http://localhost/form/WebForml.aspx
IP-адрес пользователя —
127.0.0.1
Уже из этого маленького
примера становится ясно, сколько информации может предоставить встроенный объект
HttpRequest. Однако хотелось бы несколько подробнее остановиться на одном его
составном свойстве. Свойство UriReferrer предоставляет разработчику практически
полную информацию о том ресурсе, с которого удаленный пользователь
перешел на Web-страницу. Думаю, излишне говорить о том, как важна для владельца
сайта статистика действий удаленных пользователей. Опираясь на нее, можно
правильно расставить акценты в содержимом сайта и больше внимания уделять именно
наиболее часто посещаемым страницам. Опираться на действия сторонних сервисов по
сбору статистики не всегда представляется возможным. Помимо того, что они
являются платными, нет гарантии, что сервис действует безошибочно, и точно так
же нет гарантии, что владелец сервиса не будет пользоваться собранными данными в
своих целях. Вне всякого сомнения, случаи ошибок сервисов сбора статистики или
использования конфиденциальной информации владельцем сервиса чрезвычайно редки,
одна к о вероятность возникновения этих ситуаций отличается
от нуля, поэтому нельзя ее игнорировать.
О том, как получить данные о
системе пользователя, мы уже знаем. Составное свойство Browser объекта
HttpRequest позволяет получить эту информацию. Состав этого свойства
рассматривался нами ранее. Сейчас пришло Время увидеть, из чего состоит свойство
uriReferrer.
Еще раз повторюсь, данное
свойство описывает адрес того интернет-ресурса, с которого пользователь перешел
на текущую Web-страницу. Как известно, значение подобного свойства имеет тип
Uri. Данный тип является составным. Состав значений данного типа приведен ниже.
- schemeDelimiter. Свойство
типа string. Предназначено только для чтения. В нем хранится набор символов,
которые отделяют наименование протокола в адресе ресурса, от его основного
имени. Чаще всего это комбинация двоеточия и двух обратных слэшей.
- urishemeFiie. Свойство типа
string, предназначенное только для чтения. В него записывается тип протокола,
если искомый адрес указывает на некий файл.
- urishemeFtp. Свойство типа
string, предназначенное только для чтения. В него записывается тип протокола,
если доступ к предыдущему ресурсу осуществлялся по протоколу FTP.
- uriShemeGopher. Свойство
типа string, предназначенное только для чтения. В него записывается тип
протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу Gopher.
- uriShemeHttp. Свойство типа
string, предназначенное только для чтения. В него записывается тип протокола,
если доступ к предыдущему ресурсу осуществлялся по протоколу HTTP. Естественно,
этот случай будет наиболее часто встречаться, так как переход на Web-страницы
обычно производится с других Web-страниц именно по протоколу HTTP.
- uriShemeHttps. Свойство
типа string, предназначенное только для чтения. В него записывается тип
протокола, если доступ к предыдущему ресурсу осуществлялся по протоколу Secure
HTTP, т. е. были приняты меры по обеспечению секретности передачи данных.
- uriShemeMailto. Свойство
типа string, предназначенное только для чтения. В него записывается тип
протокола, если доступ к ресурсу осуществлялся по протоколу SNMP, т. е. ссылка
на ресурс активирует почтовый клиент, установленный в системе по умолчанию, для
создания электронного письма.
- uriShemeNews. Свойство типа
string, предназначенное только для чтения. В него записывается тип протокола,
если искомый ресурс является сообщением новостной конференции, и доступ к нему
осуществляется по протоколу NNTP (Network News Transport Protocol).
- uriSchemeNntp. Свойство
абсолютно идентично предыдущему.
- AbsolutePath. Свойство типа
string. В нем содержится часть URL, расположенная после основного адреса
ресурса. Чаще всего в нем находится полное наименование файла, включая и путь к
нему в среде виртуальных каталогов сервера.
- AbsoiuteUri. Свойство типа
string содержит весь URL искомого ресурса полностью, без каких-либо исключений.
- Authority. Свойство
содержит доменное имя ресурса или его IP-адрес, в зависимости от того, какой
именно тип адреса был использован в URL, а также номер порта, если тот был
указан в адресе явно. Все это записывается одним значением типа string.
- Fragment. Свойство типа
string. В нем находится наименование закладки документа, являющейся
идентификатором для локальных гиперссылок, если она находилась в полном URL. В
свойстве записывается не только наименование закладки, но и символ, отделяющий
ее от имени документа. Обычно, в этом качестве используется символ решетки — #.
- Host. В свойстве типа
string находится только доменное имя ресурса или его IP-адрес, в зависимости от
того, какой именно тип адресации был использован в URL.
- HostNameType. В свойстве
указывается тип имени ресурса, примененный в искомом URL. Свойство имеет тип
uriHostNameType. Данный тип является перечислимым, следовательно, значение
свойства может принимать одно из следующих значений:
- Basic. Адрес ресурса
успешно обработан, но идентифицировать его тип не представляется возможным;
- Dns. В URL использовано
доменное имя ресурса, удовлетворяющее правилам службы DNS;
- IPv4. В URL использовано
наименование узла, соответствующее правилам четвертой версии протокола IP;
- IPv6. В URL использовано
наименование узла, соответствующее правилам шестой версии протокола IP;
- Unknown. Тип наименования
узла не распознан и не поддерживается системой.
- isDefauitPort. Логическое
свойство типа Boolean. Имеет значение True, если сервер, на котором расположен
искомый ресурс, функционирует на порте, номер которого соответствует
"умолчальному" значению для данного типа сервера.
- isFiie. Логическое свойство
типа Boolean. Имеет значение True, если искомый URL указывает на некий файл.
- isLoopBack. Логическое
свойство типа Boolean. Имеет значение True, если URL указывает на некий ресурс,
расположенный на том же сервере, что и обрабатывающее приложение.
- isUnc. Логическое свойство
типа Boolean. Имеет значение True, если URL составлен по правилам UNC (Universal
Naming Convention). Чаще всего подобные адреса встречаются в локальных сетях.
- LocalPath. Свойство типа
string. В нем содержится путь к искомому ресурсу в физической операционной
системе той платформы, на которой функционирует сервер. Естественно, если
пользователь пришел к нам с другого сервера, в данном свойстве не будет
адекватной информации, так как наш сервер не может получить данные о файловой
системе другого сервера.
- PathAndQuery. Свойство типа
string. В нем содержится полное наименование файла из URL, включая и путь к
нему, и дополнительный запрос, отделяемый от имени файла символом
вопросительного знака.
- Port. Свойство типа
integer. В нем хранится номер порта, на котором функционирует сервер, указанный
в URL.
- Query. Свойство типа
string. В нем находится строка запроса из URL, включая и стартовый символ
вопросительного знака.
- scheme. Свойство типа
string. В нем находится наименование протокола доступа к ресурсу, на который
указывает URL. В качестве значений должно быть использовано одно из следующих
слов:
- file. Доступ осуществляется
к ресурсу, находящемуся на локальном компьютере;
- ftp. Доступ осуществляется
по протоколу FTP;
- gopher. Доступ к ресурсу
осуществляется по протоколу Gopher;
- http. Доступ осуществляется
по протоколу HTTP;
- https. Доступ
осуществляется по протоколу Secure HTTP;
- mailto. URL указывает на
адрес электронной почты;
- news. URL указывает на
ресурс из новостной конференции, и доступ производится по протоколу NNTP.
- userEscaped. Свойство
логического типа Boolean. Приобретает значение True, если полученная строка,
составляющая URL, была ранее пропущена через процедуру URL-кодирования браузером
или иным приложением.
- userinfo. Свойство типа
string. В нем располагается информация об удаленном пользователе, который и
инициировал данный сеанс работы сообщением новостной конференции, и доступ к
нему осуществляется по протоколу NNTP (Network News Transport Protocol).
- userEscaped. Свойство
логического типа Boolean. Приобретает значение True, если полученная строка,
составляющая URL, была ранее пропущена через процедуру URL-кодирования браузером
или иным приложением.
- userinfo. Свойство типа
string. В нем располагается информация об удаленном пользователе, который и
инициировал данный сеанс работы с Web-приложением. В этом свойстве могут
храниться имя пользователя, его пароль доступа или иные специфичные именно для
него данные.
Помимо перечисленных нами
свойств, для объектов типа uri, существует и ряд методов. Следует рассмотреть
наиболее часто используемые методы.
- checkHostName. В качестве
параметра методу передается адрес какого-либо хоста в виде значения типа string.
Метод проверяет полученный адрес и возвращает тип этого адреса. Возвращаемое
значение имеет тип uriHos.tNameType. Естественно, применение этого метода к
адресу ресурса, с которого на нашу Web-страницу пришел пользователь, абсолютно
идентично использованию свойства Scheme, которое мы уже рассматривали, однако не
следует забывать, что при помощи типа URI мы можем обрабатывать не только
значение свойства uriReferrer, но и вообще любой URL.
- checkSchemeName. Данная
функция также применима, пожалуй, только для тех URL, которые пользователь
вводит самостоятельно. В качестве своего параметра она принимает значение типа
string, в котором указывается протокол доступа к какому-либо ресурсу в том виде,
как его указал пользователь. Метод проверяет, поддерживается ли запрошенный
протокол системой. В случае успешного прохождения теста, возвращается значение
True, иначе — False. Как нетрудно догадаться, метод возвращает значение типа
Boolean.
- HexEscape. В качестве
параметра метод принимает значение типа char, т. е. один символ, затем выдает
строчную запись кода этого символа в шестнадцатеричной системе счисления.
Возвращаемое значение имеет тип string. Подобный метод может использоваться для
проведения процедуры URL-кодирования.
- Hexunescape. Метод, по
сути, производит обратное действие по отношению к предыдущему. В качестве
параметров ему передаются строка и целое число, т. е. параметры имеют тип string
и integer соответственно. Целое число — это порядковый номер символа в строке,
которая является первым параметром. Метод предполагает, что последовательность
символов, начиная с указанного места в строке, является шестнадцате-ричным кодом
некоего символа (т. е. подразумевается, что искомая строка-параметр уже была
подвергнута процедуре URL-кодирования), и возвращает этот символ. В том случае,
если на указанном месте находится символ, который не может рассматриваться как
шестнадцатеричная цифра, будет возвращен именно символ, находящийся на указанной
позиции, а само целочисленное значение, указывающее не его расположение, будет
увеличено на единицу. Понятно, что метод возвращает значение тип а Char.
- isHexEncoding. Метод
получает точно такой же набор параметров, как и предыдущий. Но при этом он всего
лишь проверяет, может ли символ, находящийся в искомой строке на указанной
позиции, быть частью ше-стнадцатеричного числа. Для этого достаточно, чтобы
искомый символ был либо цифрой, либо буквой латинского алфавита в промежутке от
"а" до "Г включительно (регистр не имеет значения). Если символ удовлетворяет
поставленным условиям, возвращается значение True, иначе — False.
Теперь, зная, какие
параметры можно извлечь из свойства uriReferrer, можно получить из него
максимально полную информацию, и на ее основе построить статистику перемещения
пользователя по сайту, а также знать, какой именно сайт обеспечивает Вам
наибольший приток пользователей.
Но вернемся к объекту
HttpRequest. В его состав входит еще одно свойство, которое может представлять
для нас интерес. Его наименование — ServerVariables. Данное свойство является
коллекцией, в которой хранятся все значения, получаемые сервером от браузера
пользователя. Часть этих значений вынесена в отдельные свойства объекта
HttpRequest, но давайте посмотрим, что же именно хранится в этом
свойстве-коллекции. Мы поступим так же, как и в предыдущем примере — всего лишь
изменим код Web-страницы, обрабатывающей данные, введенные пользователем в
форму. На самом деле, нам эти данные не нужны, нас будет интересовать лишь
дополнительная информация. Итак, измененный код обрабатывающей Web-страницы
приведен в листинге 3.27.
Листинг
3.27
Public Class WebForm2
Inherits System.Web.UI.Page
#Region " Web Form Designer
Generated Code "
'This call is required by
the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub
InitializeComponent()
End Sub
Private Sub Page_Init(ByVal
sender
As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Init
'CODEGEN: This method call
is required by the Web Form Designer 'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal
sender As System.Object, ByVal e
As System.EventArgs) Handles
MyBase.Load
'Put user code to initialize
the page here Dim names(),vals0
As String Dim i,k As Integer
names=request.ServerVariables.AllKeys For i = 0 To names.GetUpperBound(0)
Response.Write("Переменная: " + names(i) + "<br> ") vals =
Request.ServerVariables.GetValues(i) For k = 0 To vals.GetUpperBound(0)
Response.Write("Значение " + CStr(k) + ": " + vals(k) +
Next k Next i
End Sub
End Class
Сам код достаточно прост. Мы
объявляем два массива типа string. В массиве names будут храниться наименования
переменных сервера, которые мы получим при помощи метода дикеуз. Второй массив
vals предназначен для значений этих переменных. При этом не следует думать, что
первый элемент массива vals будет однозначно соответствовать первому элементу
массива names. Все несколько сложнее.
Мы не знаем заранее, будет
ли каждая переменная простой строкой, или же это будет массив строк. Поэтому мы
используем метод Getvaiues, который собирает все значения, соответствующие той
или иной переменной. На самом деле в нашем примере все переменные будут
представлены единичными значениями строчного типа, поэтому подобный код страдает
некоторыми излишествами. Однако в тех случаях, когда заранее неизвестно, будут
ли все значения обычными строками или же массивами, рекомендуется все-таки
использовать именно подобную конструкцию.
В результате действия этого
приложения, в окно просмотра браузера будет выведен следующий текст:
Переменная: ALL_HTTP
Значение 0:
HTTP_CONNECTION:Keep-Alive HTTP_ACCEPT:image/gif, image/ x-xbitmap, image/jpeg,
image/pjpeg, application/vnd.ms-excel, application/msword, */*
HTTP_ACCEPT_ENCODING:gzip, deflate HTTP_ACCEPT_ LANGUAGE:ru HTTP__HOST:localhost
HTTP_REFERER:http://localhost/ form/WebForml.aspx HTTP_USER_AGENT:Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914)
П
еременная: ALL_RAW
З
начение 0: Connection: Keep-Alive Accept: image/gif, image/x-xbitmap,
?image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, I-*/*
Accept-Encoding: gzip, deflate Accept-Language: ru Host: localhost
TReferer: http://localhost/form/WebForml.aspx User-Agent: Mozilla/4.0
"(compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914) Переменная:
APPL_MD_PATH
З
начение 0: /LM/W3SVC/1/Root/form
Переменная:
APPL_PHYSICAL_PATH
З
начение 0: d:\inetpub\wwwroot\form\
AUTH_TYPE
Переменная: AUTH _ USER
Значение 0 :
Переменная: AUTH_PASSWORD
Значение 0:
Переменная
Значение О
Переменная
Значение 0:
Переменная: CERT_COOKIE
Значение 0:
Переменная
Значение О
Переменная
Значение О
Переменная
Значение 0:
Переменная:
CERT_SECRETKEYSIZE
Значение 0:
Переменная:
CERT_SERIALNUMBER
Значение 0:
Переменная:
CERT_SERVER_ISSUER
Значение 0:
Переменная:
CERT_SERVER_SUBJECT
Значение 0:
Переменная :
LOGON USER
Значение 0
Переменная :
REMOTE USER
Значение 0
Переменная : CONTENT TYPE
Значение 0 :
Переменная : GATEWAY
INTERFACE
Значение 0: CGI/1.1
Переменная : HTTPS
Значение 0:off
Переменная : HTTPS KEYSIZE
Значение 0 :
Переменная :
HTTPS_SECRETKEYS I ZE
Значение 0 :
Переменная : HTTPS SERVER
ISSUER
Значение 0:
Переменная : HTTPS SERVER
SUBJECT
Значение 0 :
Переменная : INSTANCE_ID
Значение 0 : 1
Переменная :
INSTANCE_META_PATH
Значение 0 : /LM/W3SVC/1
Переменная : LOCAL ADDR
Значение 0 : 127.0.0.1
Переменная : PATH_INFO
Значение 0 :/form/WebForm2 .
aspx
Переменная : PATH TRANSLATED
Значение 0 :d:
\inetpub\wwwroot\form\WebForm2 . aspx
Переменная : QUERY STRING
Значение 0: fl=&Ј2=
Переменная : REMOTE_ADDR
Значение 0: 127.0.0.1
Переменная : REMOTE_HOST
Значение 0: 127.0.0.1
Переменная : REQUEST METHOD
Значение 0: GET
Переменная : SCRIPT_NAME
Значение 0: /form/WebForm2 .
aspx
Переменная : SERVER NAME
Значение 0:localhost
Переменная : SERVER PORT
Значение 0: 80
Переменная : SERVER PORT
SECURE
Значение 0:
Переменная: CERT FLAGS
Значение 0:
Переменная: CERT ISSUER
Значение 0:
SERVER_PROTOCOL
НТТР/1.1
SERVER_SOFTWARE
Microsoft-IIS/5.1 :
Переменная: URL
Значение 0:
/form/WebForm2.aspx I
Переменная: HTTP_CONNECTION
Значение 0: Keep-Alive
Переменная: HTT P_ACCE PT
Значение 0: image/gif,
image/x-xbitmap, image/jpeg, image/pjpeg, _ application/vnd.ms-excel,
application/msword, */*
Переменная:
HTTP_ACCEPT_ENCODING
Значение 0: gzip, deflate
Переменная:
HTTP_ACCEPT_LANGUAGE
Значение 0: ru
Переменная: HTTP_HOST
Значение О: localhost
Переменная: HTTP_REFERER
Значение О:
http://localhost/form/WebForml.aspx
Переменная: HTTP_USER_AGENT
Значение 0: Mozilla/4.0
(compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.2914)
Как видно, практически все
серверные переменные дублируются отдельными свойствами объекта HttpRequest,
поэтому разработчик в каждом случае k" может сам решать, каким способом ему
получать необходимую информацию — через серверные переменные или при помощи
отдельных свойств, однако можно заметить, что в некоторых случаях серверные
переменные несут несколько более детальную информацию.
Говоря о принципах работы с
объектом HttpRequest, нельзя обойти стороной его коллекцию Cookies. Однако для
обсуждения данной технологии у нас выделен отдельный раздел, в котором она будет
обсуждаться достаточно детально и комплексно, поэтому здесь мы опустим ее
рассмотрение. А пока что перейдем к объекту HttpResponse.
Этот объект, как мы уже
знаем, позволяет отправлять информацию браузеру пользователя. В наших примерах
мы пользовались методом write, который позволяет передавать строки. После того,
как браузер получит эти строки, он отобразит их. При этом, естественно, следует
осознавать, что браузер будет интерпретировать эти строки как HTML-код.
Естественно, при использовании данного метода приходится передавать не только
значимую информацию, но и все остальное содержимое Web-страницы, что естественно
не слишком удобно. Именно поэтому в наших примерах, приведенных в данном разделе
главы, страницы с выводимой информацией выглядели так непрезентабельно.
Но что делать, если нам
необходимо выводить информацию на Web-страницах? Дело в том, что компоненты Web
Forms (Web-формы) позволяют нам отображать любую информацию, поэтому следует
пользоваться в подобных случаях именно ими. Однако может возникнуть еще одна
проблема. В зависимости от действий пользователя или иных дополнительных данных,
приложению может понадобиться отображать совершенно различные по своей структуре
страницы. Можно, конечно, создать на одной странице несколько наборов элементов
Web Forms, и в зависимости от ситуации делать видимым один набор и скрывать
другие наборы элементов, но очень уж громоздко получается. Действительно, проще
все-таки воспользоваться различными Web-страницами. Но остается проблема, как
отобразить необходимую страницу в данный момент. Ведь любые переходы по
гиперссылкам и формам приводят на некую конкретную страницу. Хорошим решением
может быть использование метода Redirect. Он позволяет переадресовать запрос,
полученный от браузера удаленного пользователя к любой другой Web-странице, в
зависимости от нужд приложения. Нам уже известно, что в качестве параметра
данному методу передается строка, в которой записан URL той Web-страницы,
которая будет отображена. Таким образом, мы получаем достаточно стройную схему.
Рассмотрим это на примере.
Предположим, что мы строим
сайт, структура которого будет различна для мужчин и женщин. На стартовой
странице при помощи формы мы узнаем пол подключившегося удаленного пользователя,
а затем в зависимости от полученных данных отобразим ту или иную Web-страницу.
Соответственно, нам потребуется три модуля в нашем новом проекте. Но не будем
забегать вперед. Все по порядку.
На первой странице нам
потребуется, помимо основных информационных элементов, разместить группу кнопок
переключателей. Если бы мы использовали на этой странице только чистый HTML-код,
тогда бы нам потребовалось вместо трех страниц создавать четыре. Но, используя
компоненты Web Forms (Web-формы), можно обойтись всего тремя. Группа кнопок
реализована при помощи компонента RadioButtonList. В его состав входит всего два
элемента, причем ни один из них не будет выбран по умолчанию. А свойство
AutopostBack нам следует установить в True, чтобы как только пользователь выбрал
какую-либо кнопку-переключатель, эти данные были бы переданы на сервер. Итак,
HTML-код стартовой страницы приведен в листинге 3.28.
Листинг 3.28
<%@ Page Language="vb"
AutoEventWireup="false" Codebehind="WebForml.aspx.vb"
Inherits="redirect.WebForml"%>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<titlex/title>
<meta name="GENERATOR"
content="Microsoft Visual Studio.NET 7.0">
<meta
name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta
name="vs_defaultClientScript" content="JavaScript">
<meta
name="vs_targetSchema"
con-tent="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body
MS_POSITIONING="GridLayout">
<form id="Forml"
method="post" runat="server">
<asp:Label id="Labell"
style="Z-INDEX: 101; LEFT: 32px;
POSITION: absolute; TOP:
36px" runat="server" Width="290px" Height="19px"> Пожалуйста, укажите свой
4>ncxn</asp:Label>
<asp:RadioButtonList
id="RadioButtonListl" style="Z-INDEX: 102;
LEFT: 41px; POSITION:
absolute;
TOP: 73px" runat="server"
AutoPostBack="True">
<asp:List!tem
Value="male">Myжcкoй</asp:ListItem>
<asp:ListItem
Value="female">JKeHCKJ<tti</asp:ListItem>
</asp:RadioButtonList>
</form>
</body>
</HTML>
Для того чтобы узнать, какую
именно кнопку переключатель выбрал пользователь, мы воспользуемся свойством
selectedindex. Соответственно, код для загрузки второй страницы сайта мы
поместим в функцию, обрабатывающую изменение состояния элемента, которая носит
наименование RadioButtonListl_SelectedIndexChanged. Но проще посмотреть сам КОД
класса, реализующего данную Web-страницу. Этот код приведен в листинге 3.29.
Листинг 3.29
Public Class WebForml
Inherits System.Web.UI.Page
Protected WithEvents Labell
As System.Web.Ul.WebControls.Label
Protected WithEvents
RadioButtonListl As System.Web.UI.WebControls.RadioButtonList
#Region " Web Form Designer
Generated Code "
'This call is required by
the Web Form Designer.
<System.Diagnostics.DebuggerStepThrough()> Private Sub
InitializeComponent()
End Sub
Private Sub Page_Init(ByVal
sender As System.Object, ByVal
e As System.EventArgs)
Handles MyBase.Init
'CODEGEN: This method call
is required by the Web Form Designer 'Do not modify it using the code editor.
InitializeComponent()
End Sub
#End Region
Private Sub Page_Load(ByVal
sender
As System.Object, ByVal
e As System.EventArgs)
Handles MyBase.Load
'Put user code to initialize
the page here
End Sub
Private Sub
RadioButtonListl_SelectedIndexChanged(ByVal sender
As System.Object, ByVal
e As System.EventArgs)
Handles RadioButtonListl.SelectedlndexChanged
If
RadioButtonListl.Selectedlndex = 0 Then
Response.Redirect("WebForm2.aspx") Else
Response.Redirect("WebFormS.aspx") End If
End Sub
End Class
Достаточно хорошо видно , что когда свойство
RadioButtonListl. Selectedlndex равно нулю, т. е. когда пользователь
активизировал первую кнопку-переключатель, загружается страница WebForm2.aspx.
Иначе, браузеру удаленного пользователя передается страница WebForm3.aspx.
Видно, что использование метода Redirect является очень простым и эффективным
приемом.
О чем еще можно упомянуть,
рассматривая объект HttpResponse? Скорее всего, следует вспомнить о методе
AddHeader. Как мы знаем, многие действия над Web-страницами производятся при
помощи заголовков HTTP, которые передаются в качестве содержимого тегов
<мета>. Так, например, заголовок Refresh заставляет браузер по истечении
заданного времени перезагрузить Web-страницу или загрузить другую Web-страницу.
Для того чтобы динамически добавлять подобные HTTP-заголовки в тело
Web-страницы, отсылаемой пользователю, отлично подойдет искомый метод AddHeader.
В качестве параметров ему передается две строки — наименование добавляемого
HTTP-заголовка и его значение.
Так, например, для того
чтобы вставить все тот же заголовок Refresh, следует воспользоваться следующим
фрагментом кода:
AddHeader ("Refresh", "10")
При этом в блок заголовка
отправляемой пользователю Web-страницы будет вставлен следующий тег:
<МЕТА
HTTP-EQUIV="Refresh" Content="10">
Тогда браузер пользователя
получит директиву перезагрузить данную страницу через десять секунд после ее
полной загрузки.
Однако следует помнить, что
HTTP-заголовок Refresh позволяет не просто указывать период перезагрузки, но и
адрес Web-страницы, которую должен будет загрузить браузер. По умолчанию браузер
будет загружать ту же самую страницу, в которой располагался этот
HTTP-заголовок. Но мы можем заставить его по истечении указанного времени
загрузить и какую-либо иную Web-страницу. Для этого к HTTP-заголовку Refresh
добавляется еще одно значение — URL страницы, на которую необходимо будет
перейти. Но разработчику эта деталь ничуть не прибавляет работы, он должен
передать оба значения одной строкой в качестве параметра метода.
Также объект HttpResponse
обладает несколькими механизмами, которые позволяют разработчику самостоятельно
управлять кэшированием Web-страниц. Рассмотрим ситуацию с кэшированием несколько
подробнее. Как известно, некоторые Web-страницы редко изменяются с течением
времени. Если браузер загружает подобную Web-страницу, то он может одновременно
сохранить ее в своем внутреннем кэше. Когда пользователь еще раз запросит эту
страницу, браузер может не загружать ее с Web-сервера, а извлечь из внутреннего
кэша, существенно ускоряя подобным образом время ее получения. Но браузеру
необходимо точно знать, когда Web-страница будет изменена, чтобы не предоставить
пользователю ее устаревшую версию. Срок годности страницы можно указать при
помощи все тех же заголовков HTTP, но в состав объекта HttpResponse входит
несколько механизмов, которые позволяют разработчику .управлять кэшированием
страниц. Их мы и рассмотрим сейчас.
Свойство Expires позволяет
задавать отрезок времени, в течение которого Web-страница гарантированно не
будет изменена, и браузер может предоставлять пользователю ее ранее сохраненную
в кэше версию. В качестве значения данного свойства используется целое число,
которое указывает срок жизни Web-страницы в минутах.
Если рассчитать срок жизни
страницы без изменений не представляется возможным, но точно известна дата,
после которой страница будет изменена, можно использовать свойство
ExpiresAbsoiute. Его значение имеет тип DateTime, и, естественно, браузер будет
считать, что после наступления даты, указанной в виде значения этого свойства,
обязательно следует запрашивать обновленную версию Web-страницы с сервера.
Но страницы кэшируются не
только браузером. В Интернете существует огромное множество прокси-серверов,
через которые пользователи и ведут свою работу в WWW. Эти прокси-серверы также
обладают собственной политикой кэширования Web-страниц, запрашиваемых
пользователями, поэтому следует каким-либо образом также контролировать
кэширование своих страниц прокси-серверами. Поэтому в состав объекта
HttpResponse было введено свойство cacheControi. Но с его помощью мы не можем
указывать сроки действительности сохраненных в кэше прокси-серверов копий наших
Web-страниц. Данное свойство позволяет всего лишь указывать прокси-серверу,
можно или нельзя ему кэшировать данную Web-страницу. Если в качестве значения
свойства CacheControi используется строка Public, то Web-страница может быть
сохранена в кэше. Если же мы используем значение Private, то прокси-сервер будет
поставлен в известность, что данная страница не подлежит кэшированию.
А вот теперь самое
интересное. Дело в том, что все эти свойства, естественно, можно использовать в
создаваемых приложениях ASP.NET, но это не будет хорошим стилем
программирования. Они оставлены только для совместимости с предыдущими версиями
ASP-скриптов. В ASP.NET существует отдельный объект, который предназначен именно
для управления политиками кэширования Web-страниц. О нем и пойдет речь в
следующем разделе.
Следующий
урок
|