Опубликован: 20.02.2006 | Доступ: свободный | Студентов: 3558 / 479 | Оценка: 4.34 / 3.99 | Длительность: 21:22:00
ISBN: 978-5-9570-0022-1
Лекция 12:

Программирование на ASP

< Лекция 11 || Лекция 12: 123456789

Объект Request

Объект Request реализует для запроса к веб-серверу получение информации от клиента. В этом объекте имеется полезный для разработчика тип данных – данные, отправляемые на сервер. Например, если требуется имя пользователя, то ASP запрашивает его у пользователя в форме с кнопкой Submit (Отправить), которую пользователь нажимает после ввода данных. После нажатия кнопки ASP считывает информацию с помощью объекта Request. Как показано в листинге 12.1, объект Request использует имя элемента ввода HTML, содержащего значение, введенное пользователем.

<%@ Language=VBScript %>

<html>
<head>
<title>What is you name?</title>

</head>
<body>

<FORM METHOD = "POST" ACTION = "askname.asp" ID = "frmImage" 
NAME = "getInfo" >

<% 

If len(Request("UserName")) > 0 then
  Response.Write("<p>you said your name was: " & _ 
                     Request("UserName") & "</p>")
  
  Response.Write("<p>Please reenter it</p>")
else
  Response.Write( _
  "<p>Please enter you name and click the submit button.</p>")
end if

%>

<input TYPE="text" NAME="UserName" VALUE="">

<INPUT ID="subFull" NAME="subR" TYPE="submit" VALUE="Refresh" >

</FORM>

</body>
</html>
Листинг 12.1. AskName.asp - Sample ASP Requesting User's Name

При первом запросе пользователем ASP-кода (см. листинг 12.1) ему будет предложено ввести свое имя. Если пользователь введет произвольный текст в поле ввода с именем UserName и нажмет на кнопку отправки данных, то это значение будет передано на сервер. Запрос попадет в тот же ASP-код, с помощью которого создана страница, отображаемая пользователю. ASP-страница называется askname.asp – это видно из атрибута ACTION элемента FORM. При выполнении запроса askname.asp с веб-сервера объект Request используется для считывания значения в поле ввода с именем UserName:

Request("UserName")
Библиотеки объекта Request

Объект Request используется для запроса значения из строки запроса, формы HTTP или элемента cookie посредством описанного метода присвоения имени переменной. Объект Request предоставляет разработчику три набора значений.

  • Request.Cookies. Набор имен и значений cookie на компьютере клиента.
  • Request.Form. Набор имен и значений элементов ввода HTML, являющихся результатом отправки HTML-формы или записи в файл ASP.
  • Request.QueryString. Набор пар имен и значений в строке запроса, используемых для запроса файла ASP.

Все наборы поддерживают свойства Count, Key и Item, поэтому любой из них позволяет обращаться к значению с помощью его порядкового номера. Это целесообразно в случае чтения различных комбинаций данных с целью определения способа обработки информации. В ASP можно встроить логику, согласно которой при отправке ключа определенного имени будут найдены и обработаны другие параметры запроса. В листинге 12.2 приведен пример кода ASP, осуществляющего вывод всех значений во всех библиотеках.

<%@ Language=VBScript %>

<% 

'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'sub WriteCollection
'loops through the contents of any collection object 
'passed in and response.writes the index and name = value
'using HTML
'
'in 
'      c = any 1 based collection 
'     CollectionName = any string to describe the 
'     collection
'out – nothing – writes to client
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub WriteCollection(c, CollectionName)

     dim i               'index for collection loop
     dim sPhrase          'phrase assembled to show values
     
     'draw a line
     Response.Write("<hr><p>")

     'announce the size of the collection
     Response.Write(CollectionName & " have " & c.Count & _
                                           " values:</p>")
     
     for i= 1 to c.Count 
          'these collections are 1 based - 
          'I don't know why when most all others are 0 based 
          
          sPhrase = "#" & i & " " & c.Key(i) & _
                    " = " & c.Item(i) & "<br>"

          Response.Write(sPhrase)
     next 
     
end sub


%>

<HTML>
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
<title>Tell me about the requester</title>

</HEAD>
<BODY>


<% 

'show me the server time so I can verify page is not cached
Response.Write("<p>server time: " & now() & "</p>")

'write cookies collection
WriteCollection Request.Cookies, "Cookies"

'write form variables collection
WriteCollection Request.Form, "Form Variables" 

'write query string collection
WriteCollection Request.QueryString, "Query String" 


%>

</BODY>
</HTML>
Листинг 12.2. ShowRequestValues.asp - ASP Listing Collection Contents

В листинге 12.2 приведена подпрограмма subWriteCollection(c,CollectionName), считывающая аргумент набора и выводящая в браузере, выполняющем запрос, имена и значения всех элементов набора. Номера набора должны начинаться с единицы, а не с нуля, как в других наборах. Подпрограмма WriteCollection вызывается трижды из раздела BODY раздела HTML. При каждом вызове в подпрограмму передается набор объекта Request. При выполнении файла ASP ShowRequestValues.asp (см. листинг 12.2) на экран выводятся демонстрационные значения элементов cookie и строк запросов (см. рис. 12.9).

Вывод наборов запроса

Рис. 12.9. Вывод наборов запроса

Два элемента cookies на компьютере-клиенте вывели результат запроса файла ShowRequestValues.asp в следующие строки браузера:

#1 TheServer = Name=birdhouse&Number=2
#2 Visits = LastTime=3%2F22%2F2003+8%3A55%3A02+AM

Один элемент cookie называется TheServer, а другой – Visits. Элемент cookie TheServer имеет несколько значений, поэтому его имя равно параметру Name, который, в свою очередь, равен значению birdhouse. Это следует из того, что значение свойства Key набора Request.Collection является именем элемента cookie, а значением свойства Item набора элементов cookie является пара имя/значение. Наборы Request.Form и Request.QueryString состоят лишь из пар имя/значение, содержащихся в значениях свойств Key и Item соответственно.

Управление кэшированием содержимого с помощью заголовков HTTP

Браузеры периодически выполняют кэширование веб-страницы или ее части. Время сервера было записано в браузер (см. листинг 12.2) для определения того, кэшировались ли результаты работы файла ShowRequestValues.asp. Кэширование содержимого улучшает производительность веб-сайта; тем не менее, в отдельных случаях его использовать нежелательно. Некоторые браузеры не могут переписать новые данные из кода ASP или отобразить нужное изображение, если имена этих элементов совпадают с именами файлов, кэшированных из предыдущего запроса с того же сервера, а изображение изменилось со времени предыдущего запроса. С помощью команды AddHeader объекта Response можно добавить аргумент в запрос HTTP, отправляемый к запрашивающему браузеру, и запретить кэширование содержимого на странице. При считывании запроса HTTP браузер находит заголовок, обозначающий, что содержимое должно быть загружено, а не получено из кэша браузера.

В листинге 12.3 приведен пример заголовков, добавляемых в верхнюю часть файла ASP, для запрета веб-браузеру отображения кэшированного содержимого.

<%@ Language=VBScript %>

<% 
'eliminate caching
Response.AddHeader "pragma","no-cache"
Response.AddHeader "cache-control","private"
Response.CacheControl = "no-cache"
%>
Листинг 12.3. Использование функции AddHeader

Этот же результат можно получить более простым способом, добавив на страницу строку Response.Expires=-1.

Управление состоянием приложения посредством элементов cookie

Элементы cookie позволяют хранить данные о состоянии на хосте веб-браузера. Данные могут быть получены позже с компьютера пользователя. Запись элементов cookie осуществляется посредством функции Response.Cookies. В листинге 12.4 показан код ASP для вывода имеющихся элементов cookie и их обновления. Элементы cookie можно записать с указанием срока действия. Если срок действия не указан, то они существуют до тех пор, пока пользователь не закроет браузер. После этого элементы cookie удаляются с компьютера, на котором работал браузер.

<%@ Language=VBScript %>

<% 
'need to do this because we are writing cookies
Response.Buffer = True  
%>
<!--#include file="CommonSubs.inc"-->

<HTML>
<HEAD>
<title>Let me mark the time you were here last</title>
</HEAD>
<BODY>
<p> Here are the cookies that were here before </p>
<%

'write cookies collection
WriteCollection Request.Cookies, "Cookies"

'get time and date for right now
dim sTimeNow
sTimeNow = now()

'get previous number
dim sCookie
dim i

'get cookie value
sCookie = Request.Cookies("TheServer")("Number")

'make it a number and increment
i = cint(sCookie) + 1

%>
<hr>
<p> The Visits cookie LastTime value will be updated to 
<% =sTimeNow %> </p>

<p> The TheServer cookie Number value will be updated to
 <% =i %> </p>

<%

'update cookie values
Response.Cookies("Visits")("LastTime") = sTimeNow

Response.Cookies("TheServer")("Name") = "birdhouse"

Response.Cookies("TheServer")("Number") = i

%>
</BODY>
</HTML>
Листинг 12.4. WriteCookies.asp - ASP Listing and Updating Cookies

В листинге 12.4 показан код ASP-файла WriteCookies.asp для считывания и записи элементов cookie при каждом вызове файла. Их значения считываются посредством набора Request.Cookies и записываются в браузер с помощью подпрограммы Write.Collection, в результате чего конечный пользователь видит эти значения. После этого ASP считывает значение Number элемента cookie TheServer и прибавляет к нему единицу. Это новое значение и значение LastTime элемента cookie Visits записываются с помощью команды Response.Cookies(<имя cookie>) (<имя параметра>)=<новое значение>. После блока кода спецификации языка в листинге 12.4 расположена строка Response.Buffer=True. Эта команда выполняет проверку того, что сконструирован весь HTTP-запрос, включая заголовки и содержимое, перед его записью в браузер клиента. Если страница, предназначенная для отправки браузеру, полностью сконструирована, то ASP.DLL сначала отправляет заголовки, необходимые для установки элементов cookies, а затем – само содержимое. Заголовки нужно записывать перед отправкой содержимого по причине определенных ограничений HTTP. Если параметр буфера объекта Response не включен, то содержимое будет передаваться клиенту потоком по мере генерирования, без передачи заголовков. В листинге 12.4 показано также использование файла включения. В строке 7 команда <!--#include file="CommonSubs.inc"--> вставляет содержимое файла CommonSubs.inc в файл ASP, как если бы оно было введено вручную в указанном месте файла. Подпрограмма WriteCollection (см. листинг 12.2) размещена в файле CommonSubs.inc. Большим преимуществом файла включения является то, что в одном файле можно расположить множество общих функций для использования другими файлами в рассматриваемом веб-приложении без повторного ввода кода. Наличие единственной копии кода, используемого файлами ASP, значительно облегчает работу по сравнению с ситуацией, когда в коде каждого файла приходится создавать отдельную версию одной и той же функции или подпрограммы. Исправление ошибки в файле включения устраняет эту ошибку одновременно из всех файлов, использующих данное включение. Если во ASP-файлах используются отдельные копии одной и той же функции или подпрограммы, то исправление ошибки потребует большого объема работы, а также возникнет риск появления новых ошибок.

В листинге 12.4 показан еще один подход ASP, заключающийся в использовании знака равенства "=" для выполнения Response.Write. Речь идет о следующей строке:

<p> The Visits cookie LastTime value will be updated to <%
=sTimeNow %> </p>

Фрагмент кода <% =sTimeNow %> открывает блок кода ASP в секции HTML страницы ASP, достаточно длинный для записи значения переменной sTimeNow. Знак " = " является сокращенным представлением команды Response.Write сразу после тега <%. Данный подход используется, если нужно вставить команду Response.Write в код HTML и, в то же время, обеспечить простоту работы и удобочитаемость кода.

< Лекция 11 || Лекция 12: 123456789
Александр Тагильцев
Александр Тагильцев

Где проводится профессиональная переподготовка "Системное администрирование Windows"? Что-то я не совсем понял как проводится обучение.

Владимир Кирин
Владимир Кирин
Неполодки на ресурсе.При сдаче 7 теста, открывается пустое окно, и ничего не происходит.Поправте пожалуйста. При этом попытка считается защитана, перездача только через 30 мин. Использую браузер опера.