Встроенные объекты
В прошлой статье я рассказал вам о пересылке данных клиентам с помощью встроенного объекта Response. Однако только лишь пересылкой интерактивности добиться нельзя: ведь
необходимо еще и принимать информацию от клиента! Для этого и предназначен объект Request, который в основном ценен своими коллекциями. Их пять:
• ServerVariables.
• QueryString.
• Cookies.
• Form.
• ClientCertificates.
Рассмотрим первую коллекцию — ServerVariables. В нее входит огромное количество различной информации о сервере, которая хранится в так называемых переменных окружения (environment variables). Обращение к ним осуществляются таким образом:
<% Request.ServerVariables("переменная окружения") %>
Некоторые наиболее часто используемые переменные перечислены в таблице.
Все переменные запомнить, естественно, невозможно, поэтому напишем следующий скрипт для вывода ВСЕХ переменных и их значений:
<% Option Explicit %> <title>ServerVariables Collection Enum</title> <% Dim SvrVar FOR EACH SvrVar IN Request.ServerVariables Response.Write "<b>" & SvrVar & "</b>" & " " & "===>" & " " & Request.ServerVariables(SvrVar) & "<br>" NEXT %>
Давайте разберемся, как работает этот скрипт. В первой строке встречается новая директива: Option Explicit. Она предназначена для того чтобы в случае, если в последующем сценарии появится необъявленная переменная, движок ASP не объявил бы ее автоматически, а сгенерировал ошибку. Это делается, чтобы не возникало путаницы в объявлениях. Например, рассмотрим простейший код:
<% val1=2 val2=3 result=vap1+val2 Response.Write result %>
Вы увидите цифру 3, так как движок ASP автоматически объявляет переменную vap1 и присваивает ей значение 0. Поэтому результат будет 0+3=3. В этом простом примере можно легко найти ошибку, но представьте, если у вас скрипт на несколько страниц!
Теперь вернемся к нашему коду. После объявления переменной SvrVar встречается конструкция:
FOR EACH variable IN collection operators NEXT
Этот цикл применяется для удобства перебора элементов коллекции.
В теле цикла просто формируется строка вида "ключ ===> значение".
В результате получится что-то вроде того, что изображено на рис. 1. Перед тем, как
приступить к рассмотрению коллекций Form и QueryString, позвольте мне напомнить вам, что такое форма и какие стандартные элементы можно в нее поместить.
Форма позволяет передавать данные, введенные пользователем, посредством HTTP-запроса серверу. Форма как таковая является блочным тэгом, у которого есть четыре основных атрибута:
•Action. В этом атрибуте указывается имя сценария, который будет обрабатывать данную форму.
•Method. Метод передачи данных. Существует два метода: POST и GET. Первый предназначен для передачи данных в виде отдельных строк, которые пользователь не может увидеть. В методе GET все строки сцепляются в одну, которая затем присоединяется к URL.
•Target. Имя фрейма (если таковой имеется), в который будет загружаться ответ сервера.
•Name. Имя формы.
В форму можно поместить такие элементы управления:
• Поле ввода текста (однострочное). Пример:
<input type="“text”" name="“txtJob”" value="“”" size="30">
• Поле ввода текста (многострочное). Пример:
<textarea name="“txtFeedback”">This is a multiline textbox in which you can for example enter your opinion about this site</textarea>
• Поле ввода пароля. Пример:
<input type="“password"" name="“txtPassword"">
• Раскрывающийся список. Пример:
<select name="“lstChooseCountry”"> <option selected="">Ukraine</option> <option>Russia</option> <option>German</option> <option>France</option> <option>China</option> </select>
• Фиксированный список. Пример:
<select name="”lstChooseCountry”" size="3"> <option selected="">Ukraine</option> <option>Russia</option> <option>German</option> <option>France</option> <option>China</option> </select>
• Скрытые элементы ввода. Пример:
<input type="“hidden”" value="“username”">
• Обычная кнопка. Пример:
<input type="“button”" name="“CustomButton”" value="“My">
• Кнопка сброса. Пример:
<input type="“reset”" name="“ResetButton”" value="“ResetAll”">
• Кнопка для отправки данных серверу. Пример:
<input type="“submit”" name="“SubmitButton”" value="“Send">
• Графическая кнопка (заменяет кнопку для отправки данных серверу). Пример:
<input type="“image”" name="“ImageButton”" src="“imgbutton.gif”">
• Флажок. Пример:
<input type="“checkbox”" name="“chkRecNews”"> I want to receive a newsletter from you.
• Переключатели. Пример:
<input type="“radio”" checked="" name="“rdoSelectLanguage”"> Russian <input type="“radio”" name="“rdoSelectLanguage”"> English
Пример формы:
<form action="”doIt.asp”" method="”POST”" name="”frmAction”"> <input type="“text”" name="“txtUsername”" size="30"> <input type="“password"" name="“txtPassword""> <input type="“submit”" value="“Submit"> </form>
Теперь, когда мы разобрались с формами, давайте посмотрим, как их обрабатывает сервер при помощи ASP-скриптов. Для этого в объекте Request существует две коллекции: QueryString и Form. Первая отвечает за прием данных от клиента в случае, если форма отправляется при помощи метода GET, вторая — метода POST. Чтобы не растекаться мыслию по древу, давайте перейдем к конкретному примеру. Соорудим форму для сбора демографической информации по Украине. Проделайте следующие операции:
• В виртуальном каталоге Embedded_objects, который мы создали в прошлой статье, создайте файл request.asp.
• В файле default.htm добавьте на него ссылку на него.
• В сам файл request.asp запишите следующий текст.
<% Option Explicit %> <% Response.Expires=0 %> <title>Demographic information for Ukraine</title> <% Dim vElement Dim bFlagEmptyField Dim sFirstName Dim sLastName Dim sCity Dim sSex Dim sEducation Dim sJob Dim sMarried Dim sNumOfChildren IF Request.Form("txtFirstName")="" OR _ Request.Form("txtLastName")="" OR _ Request.Form("txtCity")="" THEN %> <p align="CENTER"> </p><form action="request.asp" name="frmdoIt" method="POST"> <table align="CENTER" border="1"> <tbody><tr> <td valign="MIDDLE" colspan="2" height="30"> <p align="CENTER">Demographic information for Ukraine</p> </td> </tr> <tr> <td align="LEFT" width="28%"> Your first name: </td> <td width="72%"> <input type="text" name="txtFirstName" size="20"> </td> </tr> <tr> <td align="LEFT" width="28%"> Your last name: </td> <td width="72%"> <input type="text" name="txtLastName" size="20"> </td> </tr> <tr> <td align="LEFT" width="28%"> City: </td> <td width="72%"> <input type="text" name="txtCity" size="15"> </td> </tr> <tr> <td align="LEFT" width="28%"> Sex: </td> <td width="72%"> <input type="radio" name="rdoSex" value="Male" checked=""> Male <input type="radio" name="rdoSex" value="Female"> Female </td> </tr> <tr> <td align="LEFT" width="28%"> Education: </td> <td width="72%"> <select name="selEducation"> <option selected="">Select your education</option> <option>High education</option> <option>Incomplete High education</option> <option>Higher education</option> <option>Incomplete Higher education</option> <option>None</option> <option>Other...</option> </select> </td> </tr> <tr> <td align="LEFT" width="28%"> Your job: </td> <td width="72%"> <select name="selJob"> <option selected="">Select your job</option> <option>Computer/Internet</option> <option>Education</option> <option>Training</option> <option>Testing</option> <option>Management</option> <option>None</option> <option>Other...</option> </select> </td> </tr> <tr> <td align="LEFT" width="28%"> Are you married? </td> <td width="72%"> <select name="selMarried"> <option selected="">Yes</option> <option>No</option> </select> </td> </tr> <tr> <td align="LEFT" width="28%"> Number of children: </td> <td width="72%"> <select name="selChildren"> <option>0</option> <option selected="">1</option> <option>2</option> <option>3</option> <option>4</option> <option>5</option> <option>6</option> <option>More</option> </select> </td> </tr> </tbody></table> <br> <input type="submit"> </form> <% ELSE sFirstName=Trim(Request.Form("txtFirstName")) sLastName=Trim(Request.Form("txtLastName")) sCity=Trim(Request.Form("txtCity")) sSex=Trim(Request.Form("rdoSex")) sEducation=Trim(Request.Form("selEducation")) sJob=Trim(Request.Form("selJob")) sMarried=Trim(Request.Form("selMarried")) sNumOfChildren=Trim(Request.Form("selChildren")) Response.Write "Your first name is " & sFirstName & "<br>" Response.Write "Your last name is " & sLastName & "<br>" Response.Write "Your city is " & sCity & "<br>" Response.Write "Your sex is " & sSex & "<br>" SELECT CASE sEducation CASE "High education" Response.Write "Your education is " & sEducation & ". " & "Hmm... Not bad" & "<br>" CASE "Higher education" Response.Write "Your education is " & sEducation & ". " & "That is cool!" & "<br>" CASE "Incomplete Higher education" Response.Write "Your education is " & sEducation & ". " & "You must learn more" & "<br>" CASE "Incomplete High education" Response.Write "Your education is " & sEducation & ". " & "You must learn more" & "<br>" CASE "None" Response.Write "Your education is " & sEducation & ". " & "That is no good" & "<br>" CASE "Other" Response.Write "Your education is " & sEducation & ". " & "You are smart!" & "<br>" END SELECT Response.Write "Your job is " & sJob & "<br>" IF sMarried="Yes" THEN Response.Write "Your are married... Congratulations" & "<br>" ELSE Response.Write "Your are not married" & "<br>" END IF IF sNumOfChildren="More" THEN Response.Write "You have more than 6 children. " & "WOW!!!" & "<br>" ELSEIF sNumOfChildren="0" THEN Response.Write "You have no children. " & "Well, everything lies ahead" & "<br>" ELSE Response.Write "You have " & sNumOfChildren & " children. " & "That is good!" & "<br>" END IF Response.End END IF %>
Этот скрипт не очень полезен, так как он нигде не сохраняет полученную информацию, но тем не менее он хорошо показывает возможность обработки переданных данных. О том, как сохранить эту информацию, я расскажу в одной из следующих статей, посвященных ASP и базам данных. А теперь немного пояснений.
Перед тем, как пользователь, нажав кнопку Submit, отправит данные на сервер, он должен заполнить ВСЕ поля, иначе он увидит ту же страницу. Этот эффект достигается благодаря использованию конструкции IF… THEN…END IF (IF Request.Form("txtFirstName")="" OR Request.Form("txtLastName")="" OR Request.Form("txtCity")="" THEN). Если найдено пустое поле, то браузеру отправляется HTML, расположенный после тэга %"; если же нет, то выполняются инструкции, написанные во втором островке ASP. Я думаю, вам не составит труда разобраться в них. Примечание: функция Trim используется для отсечения пробелов слева и справа заданной строки. В результате на экране браузера вы получите картинку, представленную на рис. 2. После того, как вы введете что-нибудь в поля формы и нажмете кнопку «Подача запроса», вы увидите нечто аналогичное рис. 3.
На сегодня это все. В следующей статье мы рассмотрим остальные коллекции, свойства и методы объекта Request.
Удачного программирования!
(Продолжение следует)


