Б.
Морис. HTML в действии (+ дискета)
Часть III
Единое целое
Глава 10
Формы, базы данных и интерфейс CGI
До сих пор все web-документы, созданные нами в этой книге,
направляли поток информации в одну сторону - от автора к
читателю. С помощью форм можно обеспечить и обратную связь.
Формы позволяют пользователю вводить информацию, передают ее
определенной вами серверной программе, которая возвращает
результат обработки в стандартном HTML-представлении. Формы не
вошли в спецификации HTML 2, однако оказались настолько
полезным средством, что практически все современные
web-броузеры их поддерживают. В Web можно найти множество
форм, которые могут послужить вам образцами для собственных
web-страниц. В этой главе вы познакомитесь с основами создания
форм, подробнее узнаете о едином шлюзовом интерфейсе CGI
(Common Gateway Interface), которого мы коснулись в главе 8,
а также о расширениях CGI, разработанных Робертом Денни
(Robert Denny) для его HTTP-сервера. И, наконец, мы расскажем
о серверных программах, которые могут взаимодействовать с
HTML-формами через интерфейс CGI.
Использование интерфейса CGI в web-документах В
основном создание HTML-документов не зависит от операционной
системы вашего сервера. Однако в сфере CGI и интерактивных
форм положение меняется. Практически все здесь зависит от
конкретной операционной системы и используемого HTTP-сервера.
В этой книге мы постараемся рассказать об особенностях работы
с формами на всех платформах. Примеры использования CGI
ориентированы на конкретные HTTP-серверы, работающие под
Windows или Windows NT. В каждом примере указано, в какой
среде работает программа. Если вы используете UNIX-сервер,
примеры будут отражать только основные алгоритмы
функционирования форм, однако сам код потребует изменений.
В отличие от большинства других примеров в этой книге,
примеры использования CGI, расположенные в этой главе, можно
протестировать только при запущенном HTTP-сервере.
В этой книге описаны shareware-версия сервера для
Windows 3.1 Роберта Денни, бесплатная версия сервера
EMWAC для Windows NT, а также еще три сервера для Windows
и Windows NT: 32-битная версия сервера Роберта Денни, которая
распространяется фирмой O'Reilly and Associates (http://website.ora.com/); профессиональная
версия сервера EMWAC для Windows NT фирмы Process
Software (http://www.process.com/); сервер для
Windows NT компании Computer Software Manufaktur
(http://www.csm.co.at/com). Более подробную информацию о
HTTP-серверах можно найти в главе 13.
Одна из наиболее интересных особенностей Windows-серверов -
возможность использования разработанного Робертом Денни
расширения CGI. DOS и Windows имеют очень слабые возможности
для написания командных файлов, вследствие чего на их основе
сложно создать простые CGI-примеры. Поэтому предложенный
Робертом Денни CGI для Windows является весьма привлекательным
вариантом. Более сложные примеры в этой главе используют этот
расширенный CGI. В противоположность предложенным компанией
Netscape расширениям языка HTML, которые создают серьезные
проблемы совместимости web-документов, расширения CGI
затрагивают в основном HTTP-серверы, а для пользователей
тонкости внутренней реализации CGI не имеют значения.
Совет Пользователям Perl интересно будет узнать, что
этот язык уже перенесен в NT, что открывает богатые
возможности по написанию командных файлов. Так что, если вы
используете Perl в среде UNIX и хотите перейти на более
простые в использовании HTTP-серверы для Windows NT,
стоит получить копию Perl для написания серверных
CGI-программ.
В сообществе Web ведутся интенсивные дискуссии относительно
точного синтаксиса и расширений HTML-форм, так что многие вещи
могут в будущем измениться. Синтаксис определения форм, скорее
всего, претерпит некоторые изменения в HTML 3, так что
следите за происходящими событиями. Кроме того, официальная
документация по HTML 2 является в настоящее время
документом, открытым для комментариев (RFC - Request For
Comments) и передается в организацию IETF для утверждения в
качестве стандарта как раз во время написания этой книги.
Как работают формы Каждая форма содержит по
меньшей мере один элемент. Если в форме содержится только одно
текстовое поле, она «срабатывает» (submit) при нажатии клавиши
Enter. В более сложных формах задается кнопка или картинка, с
помощью которой запускается процесс срабатывания, в результате
которого вся информация, введенная в поля, пересылается по
протоколу HTTP серверному приложению. Значения передаются в
виде ASCII-текста, в формате имя=значение, т. е. первым
следует имя поля, затем - знак равенства и данные, введенные в
это поле. Каждая пара имя=значение отделяется от следующей
амперсандом (&). Способ передачи информации на сервер
зависит от метода, используемого для пересылки формы. Об этих
методах мы расскажем чуть ниже. Серверное приложение
обрабатывает полученную информацию и возвращает результат
броузеру. Результирующая страница может представлять собой
все, что угодно - от простого подтверждения до выборки из базы
данных с элементами мультимедиа. Можно также создавать
CGI-программы, возвращающие страницы, которые не являются
результатом запроса к базе данных, однако содержание (или
адрес) которых изменяются по определенным правилам.
Поле того как вы прочтете о синтаксисе HTML-форм, можно
забежать вперед и перейти к разделу «Единый шлюзовой интерфейс
CGI», чтобы узнать, как обрабатывается введенная пользователем
в форму информация.
Создание формы В этой главе мы будем создавать
элементы, которые могут быть расположены в форме «Комментарии
пользователей», соединенной ссылкой с домашней страницей
компании Canyon Software. Эту страницу мы создавали в
предыдущих главах.По мере прочтения материала
возвращайтесь к этому рисунку, на котором можно увидеть, как
будут выглядеть все элементы формы в броузере Netscape.
Форма начинается и заканчивается тегами <FORM>, она
может содержать различные поля и кнопки. Для начала введите
элемент <FORM> с помощью диалогового окна вставки
элементов редактора HoTMetaL PRO. При вводе элемента
<FORM> будет необходимо указать значения атрибутов
ACTION, METHOD и ENCTYPE,
В поле атрибута ACTION введите /cgi-bin/comments.exe. Это
название программы, которая будет запускаться при срабатывании
формы, в нашем случае программа comments.exe расположена в
каталоге cgi-bin. Наименование каталога с исполнимыми файлами
зависит от используемого сервера. Возможно, понадобится ввести
полный URL, содержащий сетевой адрес и путь к файлу. Если
опустить первую часть URL, web-броузер пошлет данные из формы
на узел, с которого форма была получена. Поскольку значением
атрибута ACTION может быть любой URL, возможно создание формы,
которая будет обрабатываться не на «родном» узле.
Атрибут METHOD может принимать два значения: GET и POST.
Нужное значение зависит от того, каким образом ваш сервер
поддерживает протоколы CGI. Для начала введите POST, это более
предпочтительный метод.
В стандартном CGI метод GET помещает введенную
пользователями информацию в конец URL, указывающего на
исходный сервер. Поскольку формы могут быть очень большими,
при методе GET могут образовываться URL огромных размеров. Это
несколько отбивает охоту создавать новые формы. При
использовании метода POST информация от пользователя вливается
в общий поток данных протокола HTTP, и серверная программа
может читать входные данные через поток «стандартного ввода»
(standard input). При использовании Windows CGI оба метода
помещают информацию в файлы на диске, которые затем
считываются CGI-программой.
Последний атрибут, ENCTYPE, всегда имеет значение
application/x-www-form-urlencoded. Исходный HTML-код для формы
на этом этапе может выглядеть примерно так:
<HTML><HEAD><TITLE>Canyon Software
Comment Form</TITLE></HEAD> <BODY><H1>Comments
or Problems</H1><P><IMG
SRC="envquill.gif"> Use this form to send us comments
and bug reports. Also, we're always looking for qualified beta
testers for our products. If you are interested in beta
testing, please be sure to leave your e-mail address, and
we'll contact you for more
information.</P><HR> <FORM
ACTION="/cgi-bin/comments.exe"></FORM><HR> </BODY></HTML>
Поля ввода После создания пары тегов <FORM>
можно приступать к определению отдельных элементов формы,
которые включают в себя текстовые поля, разворачивающиеся
списки, большие текстовые области, кнопки и различные
переключатели.
Разворачивающиеся списки В разворачивающемся
списке перечислены пункты, один из которых пользователь может
выбрать. Вы, несомненно, видели такие списки во многих
Windows-приложениях. Основной экранный элемент такого списка
представляет собой прямоугольник, справа от которого
расположена направленная вниз стрелка. Если щелкнуть кнопкой
мыши на этой стрелке, список развернется. Ниже описана
последовательность действий по созданию в форме
разворачивающегося списка.
1. Вставьте тег абзаца и введите заголовок
разворачивающегося списка. В нашем примере следует набрать
«Enter the product you are commenting on» (Выберите продукт,
который желаете прокомментировать).
2. Вставьте тег <SELECT> в том месте страницы, где
должен находиться разворачивающийся список. В рассматриваемом
примере тег <SELECT> помещен сразу за введенным текстом.
3. Поместите точку вставки между открывающими тегами
<SELECT> и <OPTION>. Выберите команду Markup д
Edit SGML Attributes или нажмите клавишу F6, чтобы открыть
диалоговое окно редактирования атрибутов.
4. Введите имя элемента в поле NAME. В нашем примере
вводится «prodname». Каждый элемент формы должен иметь
уникальное имя, чтобы при получении введенной пользователем
информации можно было идентифицировать каждый элемент данных.
5. Щелкните на кнопке Apply, чтобы ввести элемент в форму.
6. Поместите точку вставки между тегами <OPTION> и
</OPTION>.
7. Введите текст первого пункта списка, в этом примере -
«Drag And Zip». Поместите точку вставки между тегами
</OPTION> и </SELECT>.
8. Вставьте следующий элемент <OPTION> между тегами
</OPTION> и </SELECT> с помощью команды Markup д
Insert Element или клавиш Ctrl+I. Введите наименование
продукта, как показано на рис. 10.4.
9. Повторите шаг 8 несколько раз чтобы ввести все
пункты списка.
HTML-код для тега <SELECT> выглядит примерно так:
<P>Enter the product you are commenting
on: <SELECT NAME="prodname"> <OPTION>Drag
And Zip</OPTION> <OPTION>Drag And View
Gold</OPTION> <OPTION>Drag And View Gold -
DWG</OPTION> <OPTION>Drag And
File</OPTION> <OPTION>Fileman
Launcher</OPTION> <OPTION>Unspecified</OPTION></SELECT></P>
Текстовые поля В поле типа TEXT пользователь
может ввести одну строку текста, которая будет передана на
сервер. Этот элемент встречается в формах особенно часто.
Текстовое поле создается с помощью тега <INPUT> и его
параметров. Для создания элемента этого типа выполните
следующую последовательность действий.
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите текст, описывающий поле ввода. В этом
примере следует ввести «What version of this product are you
using?» (Какую версию данного продукта вы используете?)
2. Введите тег <INPUT> там, где должно находиться
текстовое поле. Появится элемент <INPUT> с точкой
вставки между открывающим и завершающим тегами.
3. Выберите команду Markup д Edit SGML Attributes или
нажмите клавишу F6. Введите уникальное имя элемента в поле
NAME. В этом примере следует ввести «version». Атрибут TYPE по
умолчанию имеет значение TEXT, так что нет необходимости его
менять. Оставьте поля всех остальных атрибутов пустыми.
4. Щелкните на кнопке Apply, чтобы закончить создание
текстового поля.
Можно определить для тега <INPUT> несколько других
атрибутов, которые будут описаны в этой главе ниже.
HTML-код для текстового поля выглядит следующим
образом: <P>What version of this product are you
using?<INPUT NAME="version"></P>
Список с множественным выбором Этот элемент
представляет собой вариант разворачивающегося списка. Он
позволяет пользователю одновременно выбрать несколько пунктов.
Конкретный способ отображения списка с множественным выбором
зависит от web-броузера, в котором открывается форма. Ниже
описаны шаги, с помощью которых можно вставить в форму список
с множественным выделением.
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите текст, описывающий список с множественным
выбором. В этом примере следует ввести «Select one or more
comment categories:» (Укажите, к каким категориям можно
отнести ваш комментарий:)
2. Введите тег <SELECT> в том месте, где вы хотите
разместить список. Как и при создании обычного списка,
поместите точку вставки между тегами <SELECT> и
<OPTION>.
3. Выберите команду Markup д Edit SGML Attributes или
нажмите клавишу F6, чтобы открыть диалоговое окно
редактирования атрибутов.
4. Введите уникальное имя элемента в поле NAME. Для
соответствия примеру следует ввести «type».
5. Введите в поле SIZE значение «2» и выберите в качестве
аргумента атрибута MULTIPLE значение MULTIPLE
6. Щелкните на кнопке Apply, чтобы добавить элемент в
форму.
7. Поместите точку вставки между тегами <OPTION> и
</OPTION>. С помощью этого тега задаются элементы
списка.
8. Выберите команду Markup д Edit SGML Attributes или
нажмите клавишу F6, введите для первого элемента списка
значение «1» в поле атрибута VALUE и щелкните на кнопке Apply.
Для следующих элементов списка необходимо увеличивать значение
VALUE. Атрибуты тега <OPTION>
9. Введите между тегами <OPTION> и </OPTION>
текст первого пункта списка, в этом примере - «General
Comment». Поместите точку вставки между тегами </OPTION>
и </SELECT>.
10. Добавьте следующий тег <OPTION> с помощью команды
Markup д Insert Element или комбинации клавиш Ctrl+I и
повторите шаги 7, 8 и 9, чтобы добавить в список с
множественным выбором все три оставшихся пункта,
В этом примере были использованы новые атрибуты элемента
<SELECT>, которые необходимо пояснить. На шаге 5 мы
ввели значение «2» для атрибута SIZE и указали опцию MULTIPLE
вместо того, чтобы оставить это поле пустым. Атрибут SIZE
определяет, сколько элементов должно одновременно отображаться
в списке. Если действительное число элементов превосходит
указанное количество, появляется линейка прокрутки, с помощью
которой можно добраться до нужного элемента. Если количество
элементов в списке не превышает значения параметра SIZE,
линейка прокрутки не действует.
Значение атрибута MULTIPLE определяет, что одновременно
может быть выделено несколько элементов списка. Пользователь
может выделить несколько элементов, перемещая по ним указатель
мыши и удерживая нажатой ее кнопку, либо нажав клавишу Ctrl
при выборе элементов. На рис. 10.6 показан процесс ввода
списка с множественным выбором.
В этом списке и у тега <OPTION> имеется несколько
дополнительных атрибутов. На шаге 8 мы ввели значение «1»
для атрибута VALUE вместо того, чтобы оставить это поле
пустым. Это дает web-броузеру указание посылать серверу при
срабатывании формы заданное число вместо текста, содержащегося
между открывающим и завершающим тегами <OPTION>.
Существует несколько причин, по которым стоит предпочесть
такой способ передачи параметров. Прежде всего, CGI-программе
проще анализировать короткие строки, чем длинные. С другой
стороны, если вы создаете многоязычную форму, текст списка
может меняться, хотя смысл его пунктов остается постоянным. В
таких случаях очень удобно использовать атрибут VALUE.
Примерный HTML-код для списка с множественным выбором приведен
ниже:
<P>Select one of more comment categories:
Select one of more comment categories: <SELECT
NAME="type" SIZE="2" MULTIPLE="MULTIPLE"> <OPTION
VALUE="1">General Comment</OPTION> <OPTION
VALUE="2">Bug Report</OPTION> <OPTION
VALUE="3">New Feature Request</OPTION> <OPTION
VALUE="4">Follow-up
Comment</OPTION> </SELECT></P>
Флажки и переключатели Использование флажков
(check boxes) и переключателей (radio buttons) - еще один
способ осуществлять выбор одного или нескольких элементов из
набора вариантов. При использовании флажков пользователь может
указать один, несколько или ни одного элемента. Переключатели
(они же «радиокнопки») позволяют выбрать ровно один элемент из
группы (вспомните радиоприемники с механическими клавишами
переключения диапазонов). Радиокнопки объединяются в группу,
если указать для них одинаковое значение атрибута NAME.
Значение атрибута VALUE используется сервером для
идентификации выбранного элемента.
Флажки Чтобы ввести в форму флажок, сделайте
следующее:
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите текст, описывающий группу флажков. В этом
примере следует ввести «How did you hear about this product?»
(Как вы узнали об этом продукте?)
2. Перейдите на новую строку с помощью тега <BR>.
Там, где вы хотите разместить первый флажок, введите его
название. В этом примере следует ввести «Magazine» (Журнал)
перед местом расположения флажка.
3. После введенного текста вставьте элемент <INPUT>.
4. Выберите команду Markup д Edit SGML Attributes или
нажмите клавишу F6. Введите уникальное имя элемента в поле
NAME. Для соответствия примеру следует ввести «magazine».
5. Выберите значение CHECKBOX для атрибута TYPE,
и щелкните на кнопке Apply.
6. Повторите последовательность шагов 2-5 для каждого
добавляемого флажка. В данном примере нужно добавить еще три
флажка,
Для флажков атрибут VALUE определяет текстовую строку,
которая должна быть послана на сервер, если флажок установлен
(отмечен). Если оставить поле VALUE пустым, как мы сделали в
этом примере, то по умолчанию посылается строка «on», чего в
большинстве случаев достаточно. Для неотмеченных посылается
значение no data, а не «no» или «off».
Определение флажков в HTML-коде выглядит следующим образом:
<P> How did you hear about this
product? <BR> Magazine: <INPUT TYPE="CHECKBOX"
NAME="magazine"> Internet Browsing: <INPUT
TYPE="CHECKBOX" NAME="Internet"> Recommendation from a
friend: <INPUT TYPE="CHECKBOX"
NAME="recommendation"> Other: <INPUT TYPE="CHECKBOX"
NAME="other"> </P>
Переключатели Переключатели типа радиокнопок
очень похожи на флажки, за исключением того, что все кнопки в
группе имеют одно и то же имя. Ниже описана последовательность
действий по включению в форму группы радиокнопок.
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите текст, описывающий группу радиокнопок. В
этом примере следует ввести «How satisfied are you with this
product?» (Насколько вы удовлетворены этим продуктом?). После
этого вставьте тег перевода каретки.
2. Поместите точку вставки после тега <BR> и введите
название первой радиокнопки. В этом примере - «Very
Satisfied».
3. Как и для флажка, вставьте элемент <INPUT>.
4. Откройте окно редактирования атрибутов с помощью команды
Markup д Edit SGML Attribute и выберите RADIO в качестве
значения атрибута TYPE.
5. Введите имя группы кнопок в поле NAME. Для этого примера
следует ввести «howsat».
6. Введите уникальное значение в поле VALUE. Начните,
например, с «1».
7. Для той кнопки, которая должна быть выбрана по
умолчанию, укажите опцию CHECKED.
8. Введите таким образом все кнопки, показанные на рис.
10.9. Не забудьте, что необходимо вводить одно и то же
значение в поле NAME всех кнопок и разные значения в поле
VALUE. Можно определить в одной форме несколько групп
радиокнопок, назначая элементам каждой группы другое имя,
поскольку радиокнопки группируются по признаку совпадения их
имен.
HTML-код для созданной нами группы радиокнопок выглядит
следующим образом:
<P>How satisfied are you with this
product? <BR> Very Satisfied <INPUT
TYPE="RADIO" NAME="howsat"> Somewhat Satisfied <INPUT
TYPE="RADIO" NAME="howsat"> Not Satisfied <INPUT
TYPE="RADIO" NAME="howsat"> Not at All Satisfied
<INPUT TYPE="RADIO" NAME="howsat"> </P>
Текстовые области Текстовые области (text areas)
напоминают листы блокнота. В такую область можно ввести
несколько строк текста. Разработчик формы может определить
размер текстовой области, указав количество «колонок» (ширина
которых равна усредненной ширине символов) и строк.
Чтобы создать текстовую область, необходимо выполнить
следующие действия:
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите заголовок текстовой области. В этом
примере следует ввести «Enter comments or bug report here.»
(Введите здесь свои комментарии или опишите замеченные
ошибки).
2. Вставьте тег <TEXTAREA> в том месте страницы, где
вы хотите разместить область ввода текста.
3. Выберите команду Markup д Edit SGML Attributes, чтобы
отредактировать параметры тега <TEXTAREA>. Введите
значение «textcomment» в поле атрибута NAME, «3» для атрибута
ROWS, «40» для атрибута COLUMNS и щелкните на кнопке Apply.
Поскольку различные web-броузеры используют в поле
<TEXTAREA> шрифты разной величины, значение атрибута
COLUMNS весьма приблизительно определяет количество символов,
которые поместятся в одной строке текстового поля. Текстовая
область имеет горизонтальную и вертикальную линейки прокрутки,
так что пользователи могут вводить в поле данного типа
практически любое количество символов, которое определяется
лишь внутренними ограничениями конкретного web-броузера.
Атрибуты элемента <TEXTAREA>
HTML-код, задающий текстовую область, выглядит примерно
так: <P>Enter comments or bug report
here: <TEXTAREA NAME="textcomment"
ROWS="3" COLS="40"></TEXTAREA></P>
Другие типы полей ввода Помимо рассмотренных,
существует еще несколько типов полей ввода, определяемых тегом
<INPUT>. Тип поля зависит от выбранного значения
атрибута TYPE. В рассматриваемом примере страницы присутствует
элемент Serial Number для ввода серийного номера, который
определен как поле типа PASSWORD, а также скрытое поле,
определяющее номер версии формы. Последний по счету, но не по
значимости, тип поля <INPUT> используется для создания
необходимой во всех формах кнопки SUBMIT, с помощью которой
пользователь завершает работу с формой и отправляет введенные
данные на сервер, а также кнопки RESET, которая очищает
содержимое всех полей.
Для более красивого размещения элементов в форме можно
воспользоваться прозрачной графической вставкой. С ее помощью
можно увеличить расстояние между кнопками, которые обычно
расположены вплотную друг к другу.
Поля типа PASSWORD Поле типа PASSWORD (пароль)
используется для ввода текста, который должен остаться в
тайне. Однако это дает защиту только от подглядывания из-за
плеча, поскольку текст все равно передается по линиям связи.
На экране web-броузера вместо вводимых в такое поле символов
появляются звездочки.
Чтобы создать поле типа PASSWORD, необходимо ввести
заголовок поля (в нашем случае - «Serial Number»), вставить
элемент <INPUT> и в качестве значения атрибута TYPE
выбрать PASSWORD.
Для создания поля PASSWORD выполните следующую
последовательность действий:
1. Вставьте после созданных на предыдущем этапе элементов
тег абзаца и введите текст, предваряющий поле пароля. В этом
примере следует ввести «If you want a return call, please
enter your product serial number and your phone number» (Если
вы хотите, чтобы мы вам ответили по телефону, введите серийный
номер продукта и свой номер телефона). После этого вставьте
тег перевода каретки.
2. Введите наименование поля (в нашем случае - «Serial
Number») и вставьте элемент <INPUT> с атрибутом TYPE,
имеющим значение PASSWORD.
3. Введите наименование поля для телефонного номера,
например, «Phone Number», и вставьте элемент <INPUT>
типа TEXT.
4. Введите текстовую метку для адреса электронной почты,
например «If you want return e-mail, please leave your
address» (Если вы хотите получить ответ по электронной почте,
пожалуйста оставьте ваш адрес) и вставьте элемент
<INPUT> типа TEXT.
HTML-код для поля типа PASSWORD выглядит следующим образом:
<P>If you want a return call, please enter your
product serial number and your phone
number: <BR> Serial Number: <INPUT
TYPE="PASSWORD" SIZE="20" MAXLENGTH="16">Phone Number:
<INPUT SIZE="20"> <BR> If you want return
e-mail, please leave your address: <INPUT
SIZE="20"> </P>
Скрытые поля Поля типа HIDDEN полезны, если вы
хотите установить в форме какое-либо значение, которое будет
передаваться на сервер, однако хотите, чтобы пользователь его
не видел. Например, если имеются две одинаковые формы, но
написанные на разных языках, полезно отслеживать, какая из них
была заполнена. Для этого можно ввести название языка (или
другой идентификатор) в скрытое поле, которое пользователь не
увидит. Когда заполненная форма будет послана на сервер,
CGI-программа сможет распознать язык формы и выбрать нужный
вариант дальнейшей обработки данных.
В нашем примере формы ввода комментариев скрытое поле типа
HIDDEN использовано для сохранения номера версии формы. Этот
номер будет передаваться на сервер, позволяя отслеживать, с
какой версией формы идет работа. Для создания скрытого поля
необходимо ввести тег абзаца, вставить элемент <INPUT> и
выбрать значение HIDDEN для атрибута TYPE. После этого следует
ввести «revision» в поле атрибута NAME и «1.0» в поле атрибута
VALUE. Значение VALUE будет передаваться на сервер при
заполнении формы. HTML-код выглядит следующим образом:
<P><INPUT TYPE="HIDDEN" NAME="revision"
VALUE="1.0"></P>
Графические поля ввода В полях ввода можно
использовать изображения. Если установить атрибут TYPE
элемента <INPUT> в значение IMAGE, а в поле атрибута SRC
ввести имя файла с изображением в формате GIF, то это
изображение будет выводиться на экран броузера вместо кнопки
или текстового поля. Когда пользователь щелкнет кнопкой мыши
на таком изображении, форма «сработает», и координаты
указателя мыши будут переданы на сервер в формате «имя.X» и
«имя.Y», где «имя» - значение атрибута NAME графического поля.
Имейте в виду, что если в изображении имеется и обычная кнопка
SUBMIT, и пользователь щелкнет кнопкой мыши именно на ней, то
информация о других графических полях передана не будет.
Графические поля ввода можно, например, использовать для
представления различных моделей какого-либо товара, так что
пользователь может выбрать ту из них, которой посвящен его
комментарий, или о которой он запрашивает информацию.
Стандартные графические поля Помимо использования
изображений как кнопок в элементе <INPUT>, в форму можно
вставлять и обычные изображения. Поскольку, как мы знаем из главы
8, GIF-изображения бывают прозрачными, можно создать такой
рисунок, который вообще не будет виден, и с его помощью
увеличить расстояние между полями ввода и кнопками. В
рассматриваемом примере прозрачное изображение шириной 1/2
дюйма используется для создания между кнопками пустого
пространства.
Предупреждение Используйте этот прием с осторожностью.
Если в web-броузере отключен вывод встроенных изображений,
вместо пустого места читатель увидит установленный по
умолчанию в данном броузере заменитель изображения.
Ввод изображений в форму ничем не отличается от их
размещения на обычных страницах. Этот процесс был подробно
описан в главе
8. В качестве напоминания кратко приводим
последовательность действий по вставке в форму простого
изображения:
1. Введите тег абзаца после созданных на предыдущем этапе
элементов.
2. Вставьте тег <IMG> в том месте, где вы хотите
добавить пустое пространство. Откроется диалоговое окно
редактирования атрибутов изображения.
3. Введите имя GIF-файла в поле NAME. В нашем примере
введем «spacer.gif».Если вы
не помните имя и полный путь к файлу, то можно его найти,
воспользовавшись кнопками Edit и Choose file.
4. Введите дополнительные теги изображения, если хотите еще
больше увеличить пустое пространство.
<IMG SRC="file:///spacer.gif"> <IMG
SRC="file:///spacer.gif">
Кнопки SUBMIT и RESET Несмотря на то, что мы
рассматриваем два оставшихся значения атрибута TYPE элемента
<INPUT> в самом конце этого раздела, типы SUBMIT и RESET
очень важны. Каждая форма, в которой имеется более одного поля
должна иметь кнопку SUBMIT. По умолчанию текст для кнопки
SUBMIT определен как «Submit Query» (Отправить запрос). Его
можно заменить своим текстом, введя его в атрибут VALUE. Поле
SUBMIT в форме выглядит как кнопка, размер которой
определяется введенным вами текстом. Для кнопки SUBMIT не
нужно задавать атрибут NAME, при ее нажатии происходит
срабатывание формы, и броузер отправляет введенную информацию
на сервер.
Чтобы вставить в форму кнопку SUBMIT, введите элемент
<INPUT> и установите для атрибута TYPE значение SUBMIT.
В поле атрибута VALUE введите «Send Comments» (Отослать
комментарий).
На кнопке RESET по умолчанию выводится текст «reset», при
использовании этой кнопки все поля формы очищаются. Форма не
срабатывает, информация на сервер не передается, и вообще
никаких действий больше не происходит.
Чтобы вставить в форму кнопку RESET, введите элемент
<INPUT> и установите для атрибута TYPE значение RESET. В
поле атрибута VALUE введите «Start Over» (Начать сначала).
HTML-код для этих элементов управления выглядит следующим
образом:
<INPUT TYPE="SUBMIT" VALUE="Send
Comments"> <INPUT TYPE="RESET" VALUE="Start Over">
В форме можно определить несколько кнопок RESET и SUBMIT,
однако имейте в виду, что часто пользователь не видит форму на
экране полностью, поэтому принято помещать единственную кнопку
SUBMIT в самом конце формы. Тогда пользователю перед отправкой
информации на сервер придется прокрутить форму до конца.
Заключение В этом разделе вы познакомились со
всеми элементами, которые могут присутствовать в интерактивных
формах. Однако в собственных формах вы вряд ли будете
использовать сразу все типы элементов, как мы это сделали в
рассмотренном примере. Созданная нами страница выглядит
слишком сложной и перегруженной, она может несколько
обескуражить пользователя. В следующих разделах мы более
подробно расскажем об интерфейсе CGI и создадим более простую
версию формы комментариев пользователей.
Единый шлюзовой интерфейс CGI Единый шлюзовой
интерфейс CGI (Common Gateway Interface) представляет собой
стандарт взаимодействия внешних шлюзовых приложений с
HTTP-серверами. Это очень гибкий и мощный способ обработки
передаваемых web-броузером и проходящих через web-сервер
данных, который к тому же легко переносится в большинство
операционных систем. Первоначально интерфейс CGI
разрабатывался для операционной системы UNIX, поэтому обмен
данными в нем, как правило, осуществляется через потоки
«стандартного ввода» (standard in) и «стандартного вывода»
(standard out), а также через переменные окружения.
Чтобы понять, как передается информация в рамках интерфейса
CGI.
При использовании UNIX-серверов можно найти множество
пакетов, предназначенных для создания программ обработки
данных CGI (просмотрите web-страницы по адресу http://hoohoo.ncsa.uiuc.edu/cgi/, там есть
много полезных указателей). Многие алгоритмы могут применяться
и в среде Windows или Windows NT, эти методы обсуждаются в
этой главе ниже. В силу зависимости реализации CGI от
операционной среды необходимо внимательно изучить документацию
HTTP-сервера, чтобы определить, как он обрабатывает вызовы
CGI.
Наиболее значительное различие между обработкой CGI на
платформах UNIX и Windows заключается в том, что под UNIX в
большинстве случаев достаточно сценариев (script) командного
процессора и командных интерпретаторов типа Perl. При
написании программ обработки CGI в среде Windows проще
использовать Visual Basic или даже Си. Так происходит потому,
что в UNIX доступны несколько мощных и гибких командных
процессоров и огромное количество программ, предназначенных
для работы в пакетном режиме и способных обрабатывать поток
данных «стандартного ввода». С другой стороны, Windows
является в основном графической операционной системой с очень
слабыми возможностями пакетной обработки. Наиболее мощные
средства программирования, такие как Visual Basic, не
ориентированы на командную строку, и управление ими
непосредственно из командной строки невозможно.
Совет Хотя в этой главе интерфейс CGI обсуждается в
основном применительно к обработке форм, с его помощью можно
делать почти все! Например, на основной HTML-странице можно
поместить CGI-ссылку. URL будет передан указанной серверной
программе, которая «на ходу» сгенерирует затребованную
HTML-страницу. Такой подход можно использовать для
представления данных, меняющихся в реальном времени, либо для
страниц, полностью построенных на запросах к базе данных.
Кроме того, CGI используется для обработки размеченных
изображений-карт, которые рассматривались в главе 8.
Обработка данных CGI Информация, проходящая через
HTTP-сервер при использовании интерфейса CGI, может
передаваться двумя способами: в виде потока данных через
«стандартный ввод» (при использовании метода POST) или через
набор переменных окружения. Поскольку сервер WinHTTPD
обеспечивает специальный интерфейс для среды Windows/DOS,
который в Windows 3.1 использовать гораздо легче, чем
стандартный интерфейс CGI, в этом разделе предполагается, что
вы используете CGI в среде Windows NT и HTTP-серверы
EMWAC или CSM (ALIBABA). Следующий раздел посвящен интерфейсу
Windows CGI и поясняет работу с сервером WinHTTPD.
В среде Windows NT командная оболочка предоставляет
почти такие же возможности, как и в UNIX. В этой системе
используется стандартный интерфейс CGI, в соответствии с
которым определяется набор переменных окружения, содержащих
информацию о полученных от пользователя данных. В
расположенной ниже таблице приведен список стандартных
переменных окружения, которые поддерживаются HTTP-серверами
EMWAC и CSM.
Таблица 10.1. Список стандартных переменных
окружения, которые поддерживаются серверами EMWAC и
CSM.
Переменная Описание
SERVER_SOFTWARE Наименование и версия программного обеспечения
информационного сервера, который отвечает на
запрос (и на котором работает шлюз). Формат:
название/версия.
SERVER_NAME Имя сервера, DNS-псевдоним или IP-адрес в том
виде, как он появляется в ссылочном URL.
GATEWAY_INTERFACE Версия спецификаций интерфейса CGI, в соответст-
вии с которыми функционирует данный сервер.
Формат: CGI/версия.
SERVER_PROTOCOL Наименование и версия информационного протокола,
по которому получен запрос.
Формат: протокол/версия.
SERVER_PORT Номер порта, через который был получен запрос.
REQUEST_METHOD Метод, в соответствии с которым был сделан запрос.
Для протокола HTTP возможны значения «GET»,
«HEAD», «POST», и т. д.
PATH_INFO Информация, полученная от пользователя. Сценарий,
обрабатывающий CGI-вызов, вызывается строкой,
содержащей фактический путь и имя файла, за кото-
рыми может следовать дополнительная информация.
Эта информация и помещается в переменную
PATH_INFO. Если информация является частью URL,
то перед передачей данных CGI-скрипту она должна
быть декодирована сервером.
SCRIPT_NAME Фактический путь и имя файла запускаемого CGI-сце-
нария, используемый в ссылочных URL.
QUERY_STRING При использовании метода GET (или при обработке
формы типа ISINDEX) в эту переменную помещается
информация, следующая за знаком ? в URL,
вызывающем CGI-сценарий.
Эта информация является запросом и не нуждается в
декодировании. Данная переменная должна устанавли-
ваться, когда приходит запрос, который не должен
обрабатываться в командной строке.
REMOTE_ADDR IP-адрес удаленного узла, сделавшего запрос.
CONTENT_TYPE При использовании метода POST в эту переменную
заносится тип получаемых данных. В настоящее время
определен только один тип: x-www-form-urlencoded.
CONTENT_LENGTH При использовании метода POST в эту переменную
помещается длина входных данных (в байтах), которые
должны быть прочитаны из потока «стандартного
ввода».
HTTP_ACCEPT Типы данных по классификации MIME, которые могут
быть приняты клиентом в соответствии с HTTP-заго-
ловками. Другие протоколы тоже могут нуждаться в
получении такой информации. Элементы в этом
списке разделяются запятыми.
Формат: тип/подтип,тип/подтип,…
Серверная CGI-программа читает эти переменные способом,
зависящим от используемого языка программирования. Например, в
Си есть функция getenv, вызов которой позволяет получить эти
параметры.
Способ получения CGI-программой данных от сервера зависит
от метода, использованного при передаче формы (помните, мы
устанавливали этот метод при создании формы, так что вы уже
знаете, о чем пойдет речь). При использовании метода POST
(который более предпочтителен) данные из формы пересылаются
серверной программе через поток «стандартного ввода».
Количество байт, которые программа должна прочитать,
указывается в переменной окружения CONTENT_LENGTH. При
использовании метода GET данные, полученные от формы, будут
помещены в переменную окружения QUERY_STRING. В обоих случаях
данные имеют следующий формат:
имя1=строка_данных_1&имя2=строка_данных_2&имя3=строка_данных_3
Каждый элемент данных (каждое поле формы) идентифицируется
в потоке данных с помощью уникального имени; за знаком
равенства следуют введенные пользователем в это поле данные.
Далее идет амперсанд, за которым следует очередная порция
данных. Серверная программа должна разобрать эти данные и
выполнить определенные действия, например, произвести поиск в
базе данных. В результате работы программа генерирует данные,
которые необходимо отобразить на экране пользователя. Обычно
этот результат представляется в формате HTML (Content-type:
text/html), но иногда он может быть представлен и в виде
обычного текста (Content-type: text/plain). Тип возвращаемых
серверу (и броузеру) данных определяется заголовком,
сгенерированным CGI-программой.
При возврате результирующей страницы программа имеет
возможность сгенерировать только ее содержание, в этом случае
сервер сам добавит HTTP-заголовки, как показано в следующем
примере.
Content-type:
text/html <HTML><HEAD><TITLE>
Обработанный результат
</TITLE> </HEAD> <BODY><H1>
Обработанный результат </H1> <P>К этой
информации сервером были
добавлены HTTP-заголовки.</P> </BODY></HTML>
С другой стороны, серверная программа может полностью
сгенерировать выходное сообщение сама, включая HTTP-заголовки:
HTTP/1.0 200 OK Server: Версия_сервера MIME-Version:
1.0 Content-type: text/html X-Script-name: Visual Basic
CGI Test <HTML><HEAD><TITLE>
Окончательный результат
</TITLE> </HEAD> <BODY><H1>
Окончательный результат </H1> <P>Этот результат
был пропущен сервером без
дополнительной обработки.</P> </BODY></HTML>
Третья возможность заключается в подготовке программой
двухстрочного сообщения, которое переадресует web-броузер к
другому URL. Этот URL может указывать на любой ресурс, включая
текстовые и HTML-документы. Такое сообщение из двух строк
выглядит следующим образом: Location:
/mypath/my-document.html [вторая строка остается пустой]
URL в этом случае обычно обозначает другой документ на
локальном сервере, однако может определять и ссылку на
удаленный узел. Такая возможность используется в тех случаях,
когда необходимо передать броузеру команду открыть документ,
удовлетворяющий условиям поиска, или направить пользователя к
странице подсказки, если запрос был сделан неправильно.
Основы Windows CGI В процессе создания своего
HTTP-сервера для Windows 3.1 Роберт Денни (Robert Denny)
понял, что стандартный интерфейс CGI выглядит в среде
Windows/DOS слишком неуклюже и для его реализации необходимо
произвести очень много «подсобных работ». Командный язык DOS
очень ограничен, а «родные» приложения для Windows 3.1 не
поддерживают концепцию «стандартного ввода/вывода», поэтому
вся внутренняя обработка должна проходить в сессиях DOS.
Несмотря на то, что существует несколько заменителей
стандартного командного процессора DOS, которые помогают
разрешить эти проблемы, необходимость запуска сеансов DOS
делает невозможным использование для CGI-обработки мощных
средств Windows. Поэтому в своем HTTP-сервере для Windows
Роберт Денни помимо поддержки стандартного интерфейса CGI
(через множество дополнительных операций) реализовал
экспериментальный интерфейс, предназначенный специально для
этой среды. Чтобы максимально сохранить общность со
стандартными спецификациями интерфейса CGI, Windows-версия не
использует специфических особенностей этой операционной
платформы (типа OLE или DDE). Вместо использования потоков
стандартного ввода и вывода, обмен информацией производится
через дисковые файлы. Сервер вызывает функцию WinExec для
запуска Windows-приложения CGI, которое читает входной файл,
обрабатывает данные и сохраняет результирующие HTML-формы или
текст в выходном файле. Когда сервер обнаруживает, что
CGI-программа завершила работу, он читает созданный файл и
отправляет результат пользователю.
Для создания программ обработки CGI в среде Windows
наиболее удобен язык программирования Visual Basic. С его
помощью можно очень быстро создавать приложения, использующие
все доступные в Windows 3.1 средства обработки данных.
Обработка данных в Windows CGI В основном эти
потоки сходны с передачей данных в стандартном CGI,
однако в Windows CGI для обмена информацией
между сервером и клиентом вместо переменных окружения и
потоков стандартного ввода/вывода используются
конфигурационные (.INI) и временные файлы.
Пример программы: обработка формы комментариев В
первой части данной главы мы создали форму ввода комментариев,
которая может использоваться для сбора отзывов потребителей о
ваших товарах и услугах. Наступило время подумать о том, как
эта информация будет обрабатываться на сервере. Как уже
упоминалось, способ работы и получения данных серверной
CGI-программой зависит от конкретной операционной системы, в
которой работает HTTP-сервер. В этом разделе приведены
примеры, ориентированные на сервер Роберта Денни WinHTTPD для
Windows 3.1. Пример написан на Visual Basic и использует
интерфейс Windows MAPI, через который администратору системы
отправляется через Microsoft Mail почтовое сообщение, когда
кто-либо заполняет форму комментариев. Если вы захотите
использовать подобную технологию, вам понадобится установить
на своем компьютере Visual Basic.
HTML-код использованной в данном примере формы представляет
собой упрощенную версию формы комментариев, созданной нами в
начале главы. HTML-код упрощенной формы приведен ниже, а вид
этой формы в web-броузере Netscape. Вам следует подставить
вместо строки «your host» в тегах <IMG> адрес своего
узла. Заметьте, что атрибут ACTION в определении формы (тег
<FORM>) указывает на файл cgi-win/cgimapi.exe. При
работе с интерфейсом Windows CGI необходимо размещать
программы обработки вызовов CGI в каталоге cgi-win. Если
указать каталог cgi-bin, сервер будет искать файл приложения в
каталоге cgi-dos.
<HTML><HEAD><TITLE>Canyon Software
Comment Form</TITLE></HEAD> <BODY><H1>Comments
or Problems</H1><P> <IMG
SRC="http://yourhost/images/ask_dan.gif"> Use this form
to send us comments and bug reports. Also, we're always
looking for qualified beta testers for our products. If you
are interested in beta testing, please be sure to leave your
e-mail address, and we'll contact you for more
information.</P><HR> <FORM
ACTION="cgi-win/cgimapi.exe" METHOD="POST"><P>Please
select the product you are commenting on: <SELECT
NAME="prodname" SIZE="0"> <OPTION VALUE="1">Drag
And Zip</OPTION> <OPTION VALUE="2">Drag And
View Gold</OPTION> <OPTION VALUE="3">Drag And
View Gold-DWG</OPTION> <OPTION VALUE="4">Draw
And File</OPTION> <OPTION VALUE="5">Fileman
Launcher</OPTION> <OPTION
VALUE="6">Unspecified</OPTION></SELECT> </P> <P>
What version of this product are you using? <INPUT
NAME="version" SIZE="10"
MAXLENGTH="10"> </P><P>Select one or more
comment categories: <SELECT NAME="type" SIZE="2"
MULTIPLE="MULTIPLE"> <OPTION>General
Comment</OPTION> <OPTION>Bug
Report</OPTION> <OPTION>New Feature
Request</OPTION> <OPTION>Follow-up
Comment</OPTION></SELECT> </P><P>Enter
comments or bug report here: <TEXTAREA
NAME="textcomment" ROWS="3"
COLS="40"> </TEXTAREA></P><P>If you
want a return call, please enter your product serial number
and your phone number: <BR> Serial Number: <INPUT
TYPE="PASSWORD" NAME="serialnumber" SIZE="20"
MAXLENGTH="16"> Phone Number: <INPUT
NAME="phonenumber" SIZE="20"><BR>If you want return
e-mail, please leave your address: <INPUT NAME="e-mail"
SIZE="20"> </P><P>I'd like to try beta
testing. Please send me more information: <INPUT
TYPE="CHECKBOX" NAME="beta"> </P><P><IMG
SRC="http://yourhost/images/spacer.gif"> <IMG
SRC="http://yourhost/images/spacer.gif"> <INPUT
TYPE="SUBMIT" VALUE="Send Comments"> <INPUT
TYPE="HIDDEN" NAME="revision" VALUE="1.0"> <IMG
SRC="http://yourhost/images/spacer.gif"><INPUT
TYPE="RESET" VALUE="Start
Over"> </P></FORM><HR></BODY></HTML>
Эта форма при срабатывании передает значения девяти или
менее (если не все было заполнено) информационных полей
серверной программе.
Создание CGI-программы с использованием почтового
интерфейса MAPI В качестве одного из способов обработки
замечаний пользователей можно предложить их пересылку
администратору системы. При работе в Windows для этого удобно
использовать почтовую систему Microsoft Mail, входящую в
комплект поставки MS Windows. Компания Microsoft предлагает
интерфейс прикладного программирования под названием MAPI
(Mail Application Programmer Interface) и элемент управления
Visual Basic, который позволяет программам, написанным на этом
языке, получать доступ к почтовым функциям Windows. Роберт
Денни разработал для своего сервера несложное приложение на
Visual Basic, которое обеспечивает базовую обработку в рамках
интерфейса CGI, общую для всех серверных программ. При
использовании этих средств нужно добавить очень небольшой
объем кода, чтобы создать работающую интерфейсную программу.
Дополнительный код приведен в примере, расположенном в конце
этого раздела. Его необходимо оформить в виде модуля Visual
Basic под названием CGIMAPI.BAS.
Mодуль CGI.BAS выполняет всю работу по получению
CGI-информации от сервера. Он помещает все необходимые данные
в переменные, которые после этого можно использовать любым
способом. Прежде всего, имеется несколько специальных
переменных, которые отражают значение упомянутых ранее
переменных окружения. Также существует два массива, которые
содержат всю информацию, полученную от формы. Эти переменные
называются CGI_FormTuples(i).key и CGI_FormTuples(i).value.
Это строковые переменные; .key содержит наименование поля,
определенное при создании формы, а в .value записываются
данные, введенные пользователем в это поле.
Текст большинства добавленных модулей приведен на следующих
страницах. Код в разделе «Section A» инициирует сессию MAPI в
Windows. Отправителем электронной почты выступает пользователь
«webdoc». В разделе «Section B» проверяются все данные,
поступившие из полей формы. Эти поля хранятся в массиве
CGI_FormTuples согласно порядку их определения в HTML-форме.
Для каждого опознанного поля генерируется строка выходного
почтового сообщения. В разделе «Section C» сессия MAPI
завершается, и отправляется почтовое сообщение. Наконец, в
разделе «Section D» создается короткий ответ, который
пересылается web-броузеру и информирует пользователя о том,
что сообщение было отправлено. После раздела «D» расположены
процедуры обработки ошибок. Для краткости большинство из этих
процедур из текста изъято.
Sub CGI_Main () Dim sel As String Dim buf As
String Dim i As Integer Dim Msg As String Load Mapi1
' Открытие сессии Mail API On Error GoTo handleerror
' ****** Section A ******
Mapi1.MapiSession1.UserName = "webdoc" ' Пользователь, заполняющий форму
Mapi1.MapiSession1.Password = "webdoc"
Mapi1.MapiSession1.Action = SESSION_SIGNON
Mapi1.Msg1.SessionID = Mapi1.MapiSession1.SessionID ' Установка режима отправки
собщения
Mapi1.Msg1.Action = MESSAGE_COMPOSE ' Начало создания сообщения
Mapi1.Msg1.MsgIndex = -1 ' Режим компоновки (а не чтения)
сообщения
' ****** End of Section A ******
If CGI_NumFormTuples > 2 Then ' Проверка успешности предварительной обработки
' Далее идет назначение полей, которые передадутся от формы в почтовое сообщение
' Сюда можно вставить дополнительные действия, например сохранение данных в файле или в БД
' Анализируются значения переменных CGI_FormTuples(n).key, чтобы не включать в отправляемое
' сообщение незаполненные поля
' Возможные значения этих переменных в соответствии с формой formsamp.hml:
' prodname, version, type, textcomment, serialnumber, phonenumber, e-mail, beta и revision
Mapi1.Msg1.MsgNoteText = "Comment Form Submission: "
For i = 0 To CGI_NumFormTuples - 1
' ****** Section B ******
Select Case CGI_FormTuples(i).key
Case "beta"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Beta Requested. "
Case "prodname"
Select Case CGI_FormTuples(i).value
' Здесь анализируется параметр VALUE для выбора корректного названия продукта
Case "1": Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Product: D&Z"
Case "2": Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Product: D&VG"
Case "3": Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Product: D&VG DWG"
Case "4": Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Product: D&F"
Case "5": Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Product: Fileman"
Case Else: Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "For Unspecified Product"
End Select
Case "version"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Version Level: " & CGI_FormTuples(i).value & ". "
Case "type"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Report Type: " & CGI_FormTuples(i).value & " "
Case "type_1" ' Обрабатывается список со множественным выделением
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "and " & CGI_FormTuples(i).value & " "
Case "type_2"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "and " & CGI_FormTuples(i).value & " "
Case "type_3"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "and " & CGI_FormTuples(i).value & " "
Case "type_4"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "and " & CGI_FormTuples(i).value & " "
Case "revision"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Form Revision" & CGI_FormTuples(i).value & " "
Case "textcomment"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Comment: " & CGI_FormTuples(i).value & ". "
Case "serialnumber"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Serial Number: " & CGI_FormTuples(i).value & ". "
Case "phonenumber"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "Phone Number: " & CGI_FormTuples(i).value & ". "
Case "e-mail"
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "e-mail Address: " & CGI_FormTuples(i).value & ". "
Case Else
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & CGI_FormTuples(i).key & " = " & CGI_FormTuples(i).value & ". "
End Select
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & Chr(10)
Next
Mapi1.Msg1.MsgNoteText = Mapi1.Msg1.MsgNoteText & "End of Comment "
' ****** End of Section B ******
Else
Mapi1.Msg1.MsgNoteText = "Message Text Was Missing..."
End If
' ****** Section C ******
Mapi1.Msg1.MsgSubject = "From " & CGI_RemoteAddr
Mapi1.Msg1.RecipDisplayName = "Comment User"
Mapi1.Msg1.Action = MESSAGE_RESOLVENAME
Mapi1.Msg1.Action = MESSAGE_SEND
Unload Mapi1
' ****** End of Section C ******
' ****** Section D ******
StartMailResp
Send ("<H2>OK!</H2>")
Send ("<P>Thanks for your input. Your comments have been recorded.</P>")
GoTo Finishup
' ******End of Section D ******
handleerror:
Unload Mapi1
StartMailResp
Select Case Err
Case MAPI_USER_ABORT: Msg = "MAPI_USER_ABORT "
:
: Дополнительные процедуры обработки ошибок
:
Case CONTROL_E_NO_ATTACHMENTS: Msg = "CONTROL_E_NO_ATTACHMENTS "
Case Else: Msg = "Error " & Err
End Select
Send ("<H2>Error:</H2>")
Send ("<P>Due to a system error: " & Msg & ", this message could not be sent. We're sorry..</P>")
Resume Finishup
' Завершение обработки. Возврат завершающих строк HTTP.
'
Finishup:
Send ("<HR>")
Send ("</A></BODY></HTML>")
'****** RETURN, DON'T STOP! ******
End Sub
Использование тега ISINDEX Еще один способ
двустороннего обмена информацией с читателем web-документа
заключается в использовании тега <ISINDEX>. Страница,
содержащая этот тег, генерируется CGI-программой и, когда
пользователь вводит данные и нажимает клавишу Enter,
результирующий URL посылается создавшей страницу программе.
Когда пользователь вводит текст в поле <ISINDEX> и
нажимает клавишу Enter, на сервер поступает специальный
URL-запрос. Он представляет собой URL исходной страницы, к
которому добавлен вопросительный знак и введенный
пользователем текст. Например, если URL страницы с тегом
<ISINDEX> выглядел как
http://myhost.mycompany.com/cgi-bin/specialpage.exe
а пользователь ввел aladdin lamp то результирующий
URL, отсылаемый обратно на сервер, будет иметь следующий
вид: http://myhost.mycompany.com/cgi-bin/specialpage.exe?aladdin+lamp
Сервер передаст эту командную строку программе
specialpage.exe, которая проанализирует данные «aladdin+lamp»
и возвратит соответствующую информацию, которая обычно
представляет собой результат поиска файлов или просмотра базы
данных. Этот метод часто используется в web-серверах,
работающими в операционной системе UNIX.
Генерация страниц в реальном времени и другие
нестандартные приемы Возможность генерации серверной
программой текстовых или HTML-страниц не ограничивается
возвратом результата запросов к базам данных или формами
комментариев. В этом разделе мы опишем несколько приемов,
которые, возможно, натолкнут вас на новые идеи.
Содержание страницы, основанное на адресе
клиента При вызове CGI-программы ей, среди других
данных, передается и адрес удаленного узла. Это позволяет
ограничить доступ к информации. Пусть, например, у вас имеется
база данных, содержащая коммерческую информацию. В этом случае
можно предоставлять полный доступ к данным только
ограниченному контингенту пользователей. Такие читатели
получат всю запрашиваемую информацию, однако, если запрос
отправляет пользователь из другой категории, в ответ он
получит страницу с предложением подписаться на информационные
услуги. Анализируя IP-адрес узла, с которого отправлен запрос,
можно создавать зависимые от этого адреса страницы.
Предупреждение Хакеры практически всегда атакуют свои
цели таким образом, чтобы попытка доступа выглядела совершенно
легальной. При этом используется, например, подстановка
IP-адресов, поэтому вы должны применять описанную выше
методику только если ваша система надежно защищена, либо
изолирована от Internet. Однако, чтобы ввести дополнительный
уровень защиты, можно скомбинировать этот метод с базовыми
средствами авторизации доступа, которые обеспечиваются многими
HTTP-серверами.
Домашние страницы с указателями на динамические
адреса В World Wide Web постоянно увеличивается доля
коммерческой информации. Возможно, возникнет необходимость
сделать так, чтобы ссылку извне можно было установить только
на домашнюю (и ни на какую другую) страницу вашего web-узла.
Например, на домашней странице расположено важное
предупреждение об ответственности за нарушение авторских прав,
и вы не хотите повторять его на всех остальных страницах. Для
этого можно создать «главную» страницу вашего web-документа в
виде CGI-ссылки и написать CGI-программу, которая будет
генерировать домашнюю страницу с динамическими ссылками,
которые изменяются ежедневно (или ежечасно), а также создать
дополнительную программу, которая будет изменять по тому же
закону имена внутренних документов. Если кто-либо в этом
случае захочет установить указатель на вашу подстраницу, такая
ссылка будет функционировать недолго. Необходимо отметить, что
это не метод обеспечения безопасности web-сервера, а лишь
ограничение на «маршрут» читателей, который всегда должен
начинаться с домашней страницы.
Web-игры Можно создать web-страницу, основанную,
например, на принципе игры в рулетку - для этого необходимо
предусмотреть изменение гиперссылок по случайному закону либо
в зависимости от того, что происходит в это время на сервере.
Это особенно интересно при использовании изображений-карт,
которые возвращают на сервер только координаты указателя мыши.
Серверная CGI-программа может выдавать в разные моменты
времени различные указатели. Кроме того, возвращаемые читателю
изображения также могут меняться в зависимости от различных
факторов.
Что дальше После изучения форм и интерфейса CGI
формальное введение в составные части HTML-публикаций можно
считать законченным. Настало время продвигаться в искусстве
соединения этих составных частей в единое целое.
Дополнительные примеры использования интерфейса CGI для
различных HTTP-серверов, работающих в среде Windows, вы
найдете в главе 13,
«Сервер к вашим услугам»
Содержание
| Далее |