Встроенные объекты

В прошлой статье я рассказал вам о наиболее часто использующихся коллекциях объекта 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 будет что-то вроде этого:

http://localhost/embedded\_objects/request.asp?txtFirstName=Vasya&txtLastName=Pupkin&txtCity=Kharkov&rdoSex=Male&selEducation=High+education&selJob=Computer%2FInternet&selMarried=Yes&selChildren=More

Как видите, при использовании метода GET страдает секретность, так как, во-первых, пользователь может менять строку URL, что, возможно, приведет к неправильной работе скрипта, а во-вторых, эта строка не защищена от любопытных глаз, и любой человек может подсмотреть конфиденциальную информацию, просто взглянув на экран компьютера через плечо пользователя. Поэтому не следует использовать метод GET для передачи паролей и другой секретной информации.

Теперь давайте перейдем к коллекции Cookies объекта Request, которая НЕ идентична коллекции Response.Cookies, а скорее дополняет ее: из Response.Cookies нельзя читать данные, а в Request.Cookies нельзя записывать информацию.

Создайте файл cookies.asp, затем добавьте на него ссылку в файл default.htm, находящийся в виртуальном каталоге Embedded_objects. В файл cookies.asp введите следующий код:

&lt;% Response.Expires %&gt; &lt;% IF Request.Form("txtUsername")&lt;&gt;"" THEN Response.Cookies("Username")=Request.Form("txtUsername") Response.Cookies("Username").Expires=#December 31, 2003 00:00# END IF %&gt; <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(&quot;Username&quot;)%">&gt; </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. Первый отвечает за запись информации, а второй — за считывание.

Рис. 1 Рис. 2

Давайте разберемся, как они работают. В первой строке кода мы проверяем, является ли поле 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 не позволит этому сценарию выполнятся бесконечно долго. Рассмотрим следующий код:

&lt;% Option Explicit %&gt; &lt;% Dim var1 Dim var2 var1=100 var2=1 Do While var1&gt;1 var2=var2+1 Response.Write “Var2 = ” &amp; var2 Loop %&gt;

Как видите, цикл не завершится никогда. Следующее изменение в сценарии приведет к сообщению об ошибке и освобождении ресурсов сервера через 20 секунд:

&lt;% Option Explicit %&gt; &lt;% Server.ScriptTimeOut=20 %&gt; &lt;% Dim var1 Dim var2 var1=100 var2=1 Do While var1&gt;1 var2=var2+1 Response.Write “Var2 = ” &amp; var2 Loop %&gt;

Этот пример очень прост, но если представить, что скрипт делает ошибочную выборку из ОЧ-ЧЕНЬ большой базы данных, то польза данного свойства станет очевидна.

Метод HTMLEncode предназначен для кодирования в escape-последовательности строковых символов, для которых невозможен обычный вывод в браузере. Такими последовательностями являются, например, угловые скобки (&gt;, <), кавычки ("") и др. Например, необходимо вывести на экран браузера следующий текст:

…Фирма Vasya Pupkin Inc.® для решения этой проблемы предлагает использовать такой код: Select case X Case &gt; 1 Response.Write “Some text 1” Case &lt; 1 Response.Write “Some text 2” Case =1 Response.Write “Some text 3” End Select

В HTML это должно выглядеть так:

...Фирма Vasya Pupkin Inc.® для решения этой проблемы предлагает использовать такой код: <p>Select case X<br> &nbsp;&nbsp;Case &gt; 1<br> &nbsp;&nbsp;&nbsp;&nbsp;Response.Write "Some text 1"<br> &nbsp;&nbsp;Case &lt; 1<br> &nbsp;&nbsp;&nbsp;&nbsp;Response.Write "Some text 2 "<br> &nbsp;&nbsp;Case = 1<br> &nbsp;&nbsp;&nbsp;&nbsp;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, можно написать следующий код:

&lt;% Dim a set a = Server.CreateObject("MSWC.BrowserType") Response.Write “Browser is ” &amp; a.browser &amp; "<br>" Response.Write “Browser version is ” &amp; a.version &amp; "<br>" Response.Write “Supports cookies is ” &amp; a.cookies &amp; "<br>" Response.Write “Supports VBScript is ” &amp; a.vbscript &amp; "<br>" Response.Write “Supports JavaScript is ” &amp; a.vbscript &amp; "<br>" %&gt;

Метод MapPath служит для преобразования виртуальных путей в физические. Предположим, в корневом каталоге web-узла есть виртуальный каталог test. Чтобы определить реальный физический путь к нему, можно использовать следующий код:

&lt;% Dim Physpath Physpath=Server.MapPath(“test”) Response.Write Physpath %&gt;

Этот метод используется для того чтобы при перемещении ASP-приложения не пострадали связи между страницами. Совет: никогда не используйте абсолютные ссылки в своих web-приложениях (а также на обычных, статичных сайтах), так как при незначительном изменении структуры web-сайта ссылки перестают работать.

Методы Transfer, Execute и GetLastError я не буду здесь описывать (хотя они очень полезны), так как PWS 4.0, который мы используем, их не поддерживает.

На сегодня все. В следующий раз мы продолжим знакомство со встроенными объектами ASP.

(Продолжение следует)