Встроенные объекты
В прошлой статье я рассказал вам о наиболее часто использующихся коллекциях объекта Request — ServerVariables и Form. Теперь вкратце опишем коллекцию QueryString. Она предназначена для получения информации из строки URL (напомню, что данные передаются таким образом при использовании в форме метода GET). Немного модифицируем предыдущий пример. Замените метод формы с POST на GET. В первом островке ASP замените строки
IF Request.Form("txtFirstName")="" OR _ Request.Form("txtLastName")="" OR _ Request.Form("txtCity")="" THEN
на
IF Request.QueryString("txtFirstName")="" OR _ Request.QueryString("txtLastName")="" OR _ Request.QueryString("txtCity")="" THEN
Во втором островке замените строкиы
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"))
на
sFirstName=Trim(Request.QueryString("txtFirstName")) sLastName=Trim(Request.QueryString("txtLastName")) sCity=Trim(Request.QueryString("txtCity")) sSex=Trim(Request.QueryString("rdoSex")) sEducation=Trim(Request.QueryString("selEducation")) sJob=Trim(Request.QueryString("selJob")) sMarried=Trim(Request.QueryString("selMarried")) sNumOfChildren=Trim(Request.QueryString("selChildren"))
В результате в браузере вы получите ту же самую картинку, что и при использовании метода POST и коллекции Form, но в адресной строке Internet Explorer будет что-то вроде этого:
Как видите, при использовании метода GET страдает секретность, так как, во-первых, пользователь может менять строку URL, что, возможно, приведет к неправильной работе скрипта, а во-вторых, эта строка не защищена от любопытных глаз, и любой человек может подсмотреть конфиденциальную информацию, просто взглянув на экран компьютера через плечо пользователя. Поэтому не следует использовать метод GET для передачи паролей и другой секретной информации.
Теперь давайте перейдем к коллекции Cookies объекта Request, которая НЕ идентична коллекции Response.Cookies, а скорее дополняет ее: из Response.Cookies нельзя читать данные, а в Request.Cookies нельзя записывать информацию.
Создайте файл cookies.asp, затем добавьте на него ссылку в файл default.htm, находящийся в виртуальном каталоге Embedded_objects. В файл cookies.asp введите следующий код:
<% Response.Expires %> <% IF Request.Form("txtUsername")<>"" THEN Response.Cookies("Username")=Request.Form("txtUsername") Response.Cookies("Username").Expires=#December 31, 2003 00:00# END IF %> <title>Request.Cookies test script</title> <div align="center"> <form action="cookies.asp" method="POST"> <table border="1"> <tbody><tr> <td valign="center" colspan="2"> <div align="center">Registration form</div> </td> </tr> <tr> <td valign="center"> <div align="left">Username:</div> </td> <td valign="center"> <input type="text" size="25" name="txtUsername" value="<%=Request.Cookies("Username")%">> </td> </tr> <tr> <td valign="center"> <div align="left">Password:</div> </td> <td valign="center"> <input type="password" size="25" name="txtPassword"> </td> </tr> </tbody></table> <br> <input type="submit"> </form> </div>
Теперь загрузите в браузер файл default.htm (предварительно не забудьте включить сервер) и активируйте ссылку на сценарий cookies.asp (рис. 1). Введите что-нибудь в поле Username и нажмите на кнопку «Подача запроса» (рис. 2). После этого закройте окошко браузера и опять загрузите файл cookies.asp. В поле Username снова появится имя, которое вы ввели в прошлый раз! Этот эффект достигается благодаря двум островкам ASP. Первый отвечает за запись информации, а второй — за считывание.
Давайте разберемся, как они работают. В первой строке кода мы проверяем, является ли поле Username пустым. Если нет, то даем команду движку ASP считать его значение и записать его в cookie. В третьей строке свойству Expires, которое отвечает за время хранения cookie, присваивается значение December 31, 2003 00:00. Это значит, что этот файл cookie будет храниться на винчестере пользователя до 12 часов ночи 31 декабря 2003 года. Во втором островке встречается новая конструкция <%=Request.Cookies("Username") %>. Это всего лишь сокращенная запись такого кода: <% Response.Write Request.Cookies("Username") %>. Что эта строка делает, я думаю, вы догадались.
Наконец, последняя коллекция объекта Request — ClientCertificates. Она отвечает за прием так называемых цифровых сертификатов пользователей. Я не буду подробно останавливаться на ней, так как, скорее всего, она не понадобится в вашей повседневной работе. Перечислю, однако, некоторые члены данной коллекции — их иногда используют разработчики: Issuer, Subject, ValidFrom, ValidUntil, SerialNumber.
Объект Request поддерживает только одно свойство (TotalBytes), которое содержит объем запроса и один метод (BinaryRead), отвечающий за прием с браузера двоичных данных (картинки, файлы и т. д.) Примечание: к этому методу можно обращаться только в том случае, если после этого не будет обращений к коллекции Request.Form.
Объект Server
А теперь давайте рассмотрим крайне полезный объект, который обеспечивает высокоуровневые средства доступа непосредственно к серверу. Он так и называется —Server. С помощью этого инструмента становится возможным создание объектов, запуск других исполняемых файлов, преобразование виртуальных путей в физические, переадресация на сервере и др.
Объект Server предоставляет разработчикам следующие методы и свойства:
• Свойство ScriptTimeOut;
• Метод HTMLEncode;
• Метод URLEncode;
• Метод CreateObject;
• Метод Transfer (в PWS 4.0 не поддерживается);
• Метод Execute (в PWS 4.0 не поддерживается);
• Метод MapPath;
• Метод GetLastError (в PWS 4.0 не поддерживается).
Рассмотрим первое и единственное свойство объекта Server —ScriptTimeOut. Если вы при написании скрипта допустили ошибку, из-за которой сценарий не может закончить работу, то свойство ScriptTimeOut не позволит этому сценарию выполнятся бесконечно долго. Рассмотрим следующий код:
<% Option Explicit %> <% Dim var1 Dim var2 var1=100 var2=1 Do While var1>1 var2=var2+1 Response.Write “Var2 = ” & var2 Loop %>
Как видите, цикл не завершится никогда. Следующее изменение в сценарии приведет к сообщению об ошибке и освобождении ресурсов сервера через 20 секунд:
<% Option Explicit %> <% Server.ScriptTimeOut=20 %> <% Dim var1 Dim var2 var1=100 var2=1 Do While var1>1 var2=var2+1 Response.Write “Var2 = ” & var2 Loop %>
Этот пример очень прост, но если представить, что скрипт делает ошибочную выборку из ОЧ-ЧЕНЬ большой базы данных, то польза данного свойства станет очевидна.
Метод HTMLEncode предназначен для кодирования в escape-последовательности строковых символов, для которых невозможен обычный вывод в браузере. Такими последовательностями являются, например, угловые скобки (>, <), кавычки ("") и др. Например, необходимо вывести на экран браузера следующий текст:
…Фирма Vasya Pupkin Inc.® для решения этой проблемы предлагает использовать такой код: Select case X Case > 1 Response.Write “Some text 1” Case < 1 Response.Write “Some text 2” Case =1 Response.Write “Some text 3” End Select
В HTML это должно выглядеть так:
...Фирма Vasya Pupkin Inc.® для решения этой проблемы предлагает использовать такой код: <p>Select case X<br> Case > 1<br> Response.Write "Some text 1"<br> Case < 1<br> Response.Write "Some text 2 "<br> Case = 1<br> Response.Write "Some text 3 "<br> End Select<br> </p>
Даже в этом небольшом примере трудно расставить все escape-последовательности. А если предположить, что текст генерируется автоматически, то данная задача оказывается попросту невыполнимой.
Метод URLEncode сходен с методом HTMLEncode и предназначен для кодирования URL посредством замены символов escape-последовательностями, каждая из которых состоит из знака процента и следующего за ним ASCII-кода в шестнадцатеричном представлении. Так как кодировка URL не совпадает с кодировкой HTML, то для преобразования строки в правильный URL-формат нельзя использовать метод HTMLEncode.
Метод CreateObject предназначен для запуска и работы практически любого COM-объекта. Значение данного метода при разработке web-приложений трудно переоценить. Например, чтобы создать и использовать компонент BrowserCapabilities, предназначенный для определения возможностей браузера с помощью файла browscap.ini, можно написать следующий код:
<% Dim a set a = Server.CreateObject("MSWC.BrowserType") Response.Write “Browser is ” & a.browser & "<br>" Response.Write “Browser version is ” & a.version & "<br>" Response.Write “Supports cookies is ” & a.cookies & "<br>" Response.Write “Supports VBScript is ” & a.vbscript & "<br>" Response.Write “Supports JavaScript is ” & a.vbscript & "<br>" %>
Метод MapPath служит для преобразования виртуальных путей в физические. Предположим, в корневом каталоге web-узла есть виртуальный каталог test. Чтобы определить реальный физический путь к нему, можно использовать следующий код:
<% Dim Physpath Physpath=Server.MapPath(“test”) Response.Write Physpath %>
Этот метод используется для того чтобы при перемещении ASP-приложения не пострадали связи между страницами. Совет: никогда не используйте абсолютные ссылки в своих web-приложениях (а также на обычных, статичных сайтах), так как при незначительном изменении структуры web-сайта ссылки перестают работать.
Методы Transfer, Execute и GetLastError я не буду здесь описывать (хотя они очень полезны), так как PWS 4.0, который мы используем, их не поддерживает.
На сегодня все. В следующий раз мы продолжим знакомство со встроенными объектами ASP.
(Продолжение следует)


