Языки

» Html
» Java Script

» PHP

» Perl

» ASP

» CGI

» Xml

» Dhtml

» VBScript

» Java

» Css

Уроки

» Photoshop

» Corel Draw

» Dreamwawer

» Flash MX

Скачать

» Программы

» Книги

Шаблоны

» Сайтов

» Flash

» Скрипты

Active Server Pages

  » 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-страниц. О нем и пойдет речь в следующем разделе.

Сохранить документ

Сохранить документ (.doc)

Распечатать документ

Напечатать

 

Следующий урок


Общение
» Чат

» Форум

Реклама 

Здесь может быть Ваша реклама

Поиск

» Поиск

Статистика 

Связь
» Web дизайнер

» Ваша реклама

» Отзывы

» О проекте

 



Сайт управляется системой uCoz