Практика применения Perl, PHP, Apache, MySQL для активных Web-сайтов (С) Александр Фролов, Григорий Фролов, 2002 4. Краткое введение в CGI Пассивные и активные Web-серверы Технологии создания Web-приложений Пример документа HTML с формой Указание параметров тега <FORM> Поле ввода многострочного текста Флажки с независимой фиксацией Передача ответа из программы CGI Переменные среды для программы CGI
В предыдущих главах нашей книги мы рассказали Вам о том, как подготовить аппаратное и программное обеспечение макета, необходимого для создания Web-приложений, а также как установить и настроить Web-сервер Apache. Прежде чем двигаться дальше, мы рекомендуем испытать Apache в работе, создав один или несколько простейших Web-узлов, содержащих статические страницы HTML. Краткое описание HTML с примерами документов Вы найдете в [1]. Данная глава посвящена программам CGI — широко распространенному средству создания активных Web-узлов, наделенных способностью отображать в браузере посетителя не только заранее подготовленные статические страницы, но и вести диалог, обращаться к базам данных, почтовым серверам и другим ресурсам. Мы будем составлять наши программы CGI с использованием популярного языка программирования Perl, как нельзя лучше подходящего для решения этой задачи. Заметим, что язык Perl доступен как на платформе Linux, так и на других платформах, в частности, на платформе Microsoft Windows. Это позволяет создавать Web-приложения, которые можно запускать на различных компьютерных платформах практически без изменений. Однако прежде чем мы перейдем собственно к программам CGI, нам необходимо определить такие понятия, как пассивные и активные Web-серверы, статические и динамические документы HTML, а также уточнить понятие Web-приложения. В этой главе мы также расскажем о формах, составляющих неотъемлемую часть большинства Web-приложений, рассмотрим принципы, положенные в основу функционирования программ CGI. Пассивные и активные Web-серверы Различают пассивные и активные Web-серверы. Если страницы сервера содержат только статическую текстовую и мультимедийную информацию, а также гипертекстовые ссылки на другие страницы, то сервер называется пассивным. Когда же страницы сервера ведут себя аналогично окнам обычных интерактивных приложений, вступая в диалог с пользователем, Вы имеете дело с активным сервером. Очевидно, статический Web-сервер не может служить основой для создания интерактивных приложений в сети Интернет с базами данных, так как он не предусматривает никаких средств ввода и обработки запросов. Поэтому мы расскажем Вам только об активных Web-серверах. Активные Web-серверы служат базой, на которой создаются Web-приложения. Страницы пассивного Web-сервера представляют собой обычные документы HTML, содержащие, помимо текста, ссылки, графические изображения и другие объекты, такие как аплеты Java, элементы управления ActiveX и т.д. Каждая страница сервера Web имеет свой адрес ресурса URL. Для того чтобы получить доступ к той или иной странице, пользователь должен указать ее адрес URL программе браузера. В этом случае страница Web загружается с сервера: браузер устанавливает соединение с сервером Web, применяя протокол передачи гипертекстовых данных (Hyper Text Transfer Protocol, HTTP), получает нужную страницу и разрывает соединение. Принятая страница отображается в окне браузера. Этот процесс показан на рис. 4-1. Рис. 4-1. Взаимодействие браузера и сервера Web Заметим, что протокол HTTP работает «поверх» протокола TCP/IP, используя его для обмена данными между браузером и сервером Web. Если на загружаемой странице имеется несколько графических изображений, то для загрузки каждого из них браузер повторяет описанный Выше процесс установки соединения. Активный Web-сервер не только хранит статическую информацию, но и взаимодействует с посетителями интерактивно. При этом посетитель сервера может заполнить какую-либо форму, содержащую поля для ввода цифровой или символьной информации, и передать ее серверу (просто щелкнув кнопку, расположенную в форме). Сервер, получив данные из полей формы, запустит созданное специально для этой формы программное расширение (например, программу CGI), которое обработает полученные данные, динамически сформирует документ HTML и возвратит его пользователю (рис. 4-2). При этом возможно обращение Web-сервера к СУБД или постовым серверам. Данная схема не накладывает никаких ограничений на вид выполняемой обработки или на вид динамически сформированного документа HTML. Поэтому Web-сервер позволяет решать практически любые задачи, требующие обработки данных, полученных от пользователей. Документы HTML, которые создаются описанным выше образом, называются динамическими. Если наряду со статическими страницами на сервере Web имеются динамические документы, то такой сервер называют активным. Рис. 4-2. Формирование динамических документов HTML Многие современные серверы Web, расположенные в Интернете, интегрированы с базами данных. При этом информация, хранящаяся в них, становится доступной посетителям сервера. Некоторым посетителям разрешается только просматривать содержимое баз данных, а некоторым — редактировать (после ввода своего идентификатора и пароля). Технологии создания Web-приложений В нашей книге мы рассмотрим две технологии создания активных Web-северов. Первая из них предполагает применение программных расширений сервера Web в виде программ CGI. Вторая связана с использованием предварительной обработки гипертекста PHP. Эти технологии широко применяются на платформе Linux. Они также доступны и на платформе Microsoft Windows. В книге [1] мы также рассмотрели приемы создания программных расширений Web-сервера Microsoft Internet Information Server с применением программ ISAPI, серверных сценариев JavaScript и технологии активных страниц Active Server Pages (ASP). В своем оригинальном виде эти технологии доступны только на платформе Microsoft Windows, хотя были предприняты попытки их переноса и на платформу Linux (см., например, http://www.chilisoft.com). В рамках Web-приложений на стороне клиента работает браузер, который способен предварительно обрабатывать данные, отправляемые на сервер, а также обрабатывать и представлять результаты, полученные от сервера, в удобном для пользователя виде. В роли основного сервера для Web-приложений выступает, как можно легко догадаться, сервер Web — разумеется, активный. Однако Web-сервер выполняет только часть работы. Он отвечает за получение данных от пользователя и подготовку страниц, отправляемых обратно. Что же касается запросов к базе данных или обращений к другим активным объектам, реализующим бизнес-логику, то для решения этих задач Web-сервер обращается к серверам базы данных, почтовым серверам или другим серверам приложений. Обращения выполняются либо средствами ASP и PHP, либо при помощи расширений CGI или ISAPI. Мы будем называть Web-приложением набор страниц ASP, PHP, HTML, DHTML, программ CGI, объектов COM, клиентских и серверных элементов управления ActiveX, клиентских и серверных сценариев, а также аплетов Java, расположенных на одном или нескольких Web-серверах и предназначенных для работы в рамках одного приложения. При этом активные компоненты Web-приложений могут обращаться к серверам баз данных или другим прикладным серверам для выполнения тех ли иных запросов. Подмножество Web-приложений, созданных с применением технологии активных серверных страниц ASP, мы будем называть ASP-приложениями. По аналогии приложения, созданные с применением технологии PHP, называются в нашей книге PHP-приложениями. Несмотря на кажущееся сходство приложений Web и программ, ориентированных на мэйнфреймы и терминалы, они относятся к разным типам, каждый из которых имеет свои особенности. И если во втором случае системой управляет администратор, а линии связи между терминалами пользователей и мэйнфреймом обладают высокой надежностью и достаточной пропускной способностью, то в случае приложений Web дело обстоит иначе. Разработчик приложения Web должен быть готов к тому, что линия связи может в любой момент оборваться, а пользователь после ее восстановления пожелает возобновить работу с того места, на котором случился обрыв. Пропускная способность и надежность каналов Интернета пока оставляет желать лучшего, поэтому необходимо минимизировать обмен данными между клиентом и сервером. На стороне клиента может оказаться любая операционная система и любой браузер, поэтому забота о совместимости — насущная необходимость. В Интернете много желающих получить несанкционированный доступ к популярным ресурсам и воспользоваться номерами чужих кредитных карточек, а значит, и вопросы обеспечения безопасности становятся первоочередными. Для того чтобы Web-сервер мог вести диалог с пользователем, разработан механизм программных расширений сервера, основанный на применении так называемого стандартного шлюзового интерфейса Common Gateway Interface (CGI). Программы CGI средствами этого интерфейса получают (через протокол HTTP) информацию от пользователя. Они ее обрабатывают и отправляют обратно в виде нового документа HTML, ссылки на существующий документ или на другой объект. Передача информации от удаленного пользователя приложению CGI обычно выполняется следующим образом. В документе HTML, который создается для ввода информации, предназначенной для обработки, размещается форма ввода. Формы обычно содержат необходимые элементы управления, такие, как поля редактирования текстовой информации, переключатели, списки и т. д. Каждому элементу управления присваивается произвольное имя. Кроме того, в формах обычно предусматривается кнопка, которую следует щелкнуть после заполнения всех полей. Когда пользователь заполняет форму и щелкает указанную кнопку, данные передаются приложению CGI, путь к которому задается в заголовке формы. Это приложение получает через протокол HTTP данные из полей формы в виде «имя поля/значение». После обработки полученных данных приложение CGI создает документ HTML и записывает его в стандартное устройство вывода stdout. Этот документ затем автоматически передается удаленному пользователю. На рис. 4-3 мы показали форму ввода информации для клиентов (номер телефона, имя и фамилия, тип файловой и операционной системы) службы восстановления данных DataRecoveru.Ru. Рис. 4-3. Форма ввода информации для клиентов службы DataRecovery.Ru Заполнив всю форму, пользователь нажимает кнопку Экстренный вызов, и данные из полей формы передаются программе CGI. Обработав данные, программа CGI динамически формирует новый документ HTML с результатами обработки и отправляет его обратно пользователю. На рис. 4-4 показано содержимое такого документа, созданного динамически программой CGI. Рис. 4-4. Результат обработки формы При необходимости программа CGI может обращаться к СУБД или другим программным системам. Этот процесс мы проиллюстрировали на рис. 4-2. Что представляет собой программа CGI? Это обычное консольное приложение, работающее в среде операционной системы Web-сервера и осуществляющее обмен данными через стандартные потоки ввода и вывода. Такое приложение загружается в оперативную память сервера и запускается только по явному запросу пользователя, когда к нему выполняется обращение из документа HTML. Окончив обработку запроса пользователя, программа CGI завершает свою работу и выгружается из памяти сервера. Программа CGI работает на сервере как отдельный процесс. В рамках этого процесса она способна, в частности, обращаться к базам данных для выборки или обновления информации. Программы CGI можно писать на любом языке программирования, допускающем создание исполняемых модулей. Чаще всего их составляют с применением интерпретируемого языка Perl, хотя можно использовать для этой цели C, C++ и другие языки программирования. Для запуска программ CGI в среде ОС Microsoft Windows необходимо создать консольное приложение Win32 (не путайте его с консольной программой MS-DOS — это разные вещи). Интерпретаторы Perl доступны на Linux, Microsoft Windows и многих других платформах. Если Web-сервер создан на базе Microsoft Internet Information Server, вместо программ CGI Вы можете использовать приложения ISAPI, реализованные в виде библиотек динамической загрузки DLL. Приложения ISAPI условно делятся на расширения ISAPI и фильтры ISAPI. Расширения ISAPI выполняют те же функции, что и только что рассмотренные программы CGI. Однако есть и очень важные отличия. Самое главное из них заключается в том, что расширение ISAPI загружается в адресное пространство Web-сервера, но не работает как отдельный процесс. Причем такая загрузка выполняется один раз, когда к расширению обращается первый пользователь. В дальнейшем расширение остается в оперативной памяти и может быть задействовано без повторной загрузки. Заметим, что сервер Microsoft Internet Information Server версии 4.0 и более новых версий позволяет загружать программы ISAPI в отдельное адресное пространство. Эта возможность, замедляющая работу сервера, обычно используется для отладки новых программ. Аварийное завершение программы ISAPI, загруженной в отдельное адресное пространство, как правило, не приводит к полной остановке Web-сервера. В результате расширения ISAPI работают быстрее по сравнению с программами CGI, особенно когда сервер Web посещают много пользователей. Что же касается программ CGI, то для каждого пользователя приходится запускать отдельный процесс. В операционной системе Microsoft Windows запуск процесса отнимает немало времени, но в Linux данная операция выполняется быстрее. С другой стороны, приложения ISAPI приходится отлаживать намного тщательнее, чем программы CGI. Так как приложение ISAPI работает в адресном пространстве Web-сервера, ошибка в приложении ISAPI способна вызвать аварийное завершение работы Web-сервера. Ошибки в программе CGI обычно менее значимы, так как в худшем случае авария произойдет только в том процессе, в котором работает эта программа, а не в процессе сервера Web. Фильтры ISAPI, так же как и расширения ISAPI, реализованы в виде библиотек динамической загрузки DLL, однако они предназначены для другого. Фильтры ISAPI способны контролировать весь поток данных между браузером и сервером Web на уровне протокола HTTP. Благодаря этому их можно применять для решения таких задач, как динамическая перекодировка и шифрование данных, создание дополнительных процедур аутентификации пользователей, сбор статистической информации об использовании ресурсов сервера и т. д. Подробнее о приложениях ISAPI читайте в [1]. Технология ASP предполагает интенсивное использование серверных сценариев и объектов COM для создания активных Web-серверов. При ее применении на сервере Microsoft Internet Information Server располагаются текстовые файлы с расширением asp, содержащие операторы языка HTML, и сценарии, составленные на языках JScript или VB Script. Средствами технологии ASP удается легко создавать интерактивные страницы Web, не используя расширения CGI или ISAPI, что позволяет в ряде случаев полностью избежать или максимально сократить программирование на C++ или Perl. Активные страницы ASP выполняют обработку данных, введенных пользователями при помощи форм, обращаясь при необходимости к базам данных или другим активным объектам. Как работают серверные сценарии в страницах ASP? Когда пользователь обращается к странице ASP, Web-сервер интерпретирует расположенный в ней сценарий. При этом анализируются параметры, переданные этой странице. Далее страница модифицируется (или создается заново), а затем отправляется обратно пользователю. Заметим, что пользователь не может каким-либо образом получить содержимое страницы ASP, так сервер Web отправляет ему не саму страницу, а результат ее интерпретации. Таким образом, логика работы страницы скрыта от пользователей. Серверный сценарий, встроенный в страницу ASP, способен обращаться к базам данных через вызов методов интерфейса ActiveX Data Objects (ADO) — простую и понятную процедуру. Если у Вас возникнет необходимость реализовать собственную бизнес-логику, Вы можете создать новые объекты COM или использовать объекты COM сторонних разработчиков. Приложения PHP По своему принципу действия приложения PHP напоминают приложения ASP, тем не менее, они во многом отличаются. В то время как ASP предполагает активное использование модели компонентного объекта COM и элементов управления ActiveX, технология PHP базируются на классических библиотеках объектных модулей. Это, в частности, означает, что для добавления каких-либо функций, не входящих в стандартную библиотеку PHP требуется перекомпилировать исходные тексты PHP. С этим, однако, не возникает особых проблем, так как в соответствии с открытой лицензией PHP поставляется бесплатно, причем вместе с исходными текстами. Разработанная для платформы Unix и ее клонов, PHP сегодня доступна и на платформе Microsoft Windows. В нашей книге технологии PHP посвящены две отдельные главы — 10 и 11. Чаще всего программы CGI и приложения PHP (а также приложения ISAPI, которые мы рассмотрели в [1]) применяются для обработки данных, введенных посетителями Web-сервера при помощи форм. Наверное, не все наши читатели имеют опыт создания форм, поэтому мы расскажем о некоторых особенностях взаимодействия форм и расширений Web-сервера. Как Вы знаете, форма содержит элементы управления, посредством которых пользователь вводит текстовые или цифровые значения, выбирает строки из списков. В форме могут располагаться переключатели, обычные или графические кнопки. Для того чтобы сделать форму в документе HTML, следует воспользоваться тегом <FORM>. Этот тег применяется в паре с тегом </FORM>, завершающим описание формы. Между тегами <FORM> и </FORM> находятся описания элементов управления в виде таких тегов, как <INPUT>, <TEXTAREA> и <SELECT> с соответствующими параметрами. Вот пример определения простейшей формы: <FORM METHOD=get
ACTION="http://www.myserver.ru/cgi/form.exe"> Полный текст документа HTML с этой формой Вы найдете в листинге 4-1. Листинг 4-1 Вы найдете в файле chap4\form1.html на прилагаемом к книге компакт-диске. Здесь элементы управления размещаются в таблице, состоящей из одного столбца и трех строк. В верхних двух строках мы расположили поля ввода и редактирования текста, а в последней строке — кнопку Сохранить. Рис. 4-5. Внешний вид простейшей формы Параметр ACTION определяет, какое действие будет выполнено над формой, после того как пользователь ее заполнит и передаст серверу Web. В примере, приведенном выше, в качестве значения для параметра ACTION мы указали путь к программе CGI, которая будет выполнять обработку данных. Посредством параметра METHOD Вы можете выбрать один из двух методов передачи данных из формы серверу Web. Если значение этого параметра равно GET (как в нашем примере), программа CGI, указанная в параметре ACTION, получит данные из формы через переменную среды с именем QUERY_STRING. В том случае, когда значение параметра METHOD равно POST, программа CGI получит данные из формы через стандартный поток ввода. Позже мы расскажем о различии этих методов более подробно. И, наконец, третий параметр ENCTYPE, используется очень редко и только для метода POST. Он позволяет указать тип передаваемых данных и по умолчанию имеет значение application/x-www-form-urlencoded. Заметим, что для отправки формы на сервер Web можно использовать графическую кнопку типа IMAGE. Изображение такой кнопки задается параметром SRC. Когда посетитель щелкает графическую кнопку, программа CGI получает от нее координаты точки, в которой находился курсор мыши в момент щелчка. Таким образом, возможно создание кнопки в виде сегментированного графического изображения. Программа CGI при этом сумеет определить, в какой области изображения был произведен щелчок мышью при отправке заполненной формы на обработку. Параметры тега <FORM> Задавая различные параметры тега <FORM>, разработчик Web-приложения может указывать программу CGI или сценарий для обработки формы, метод передачи данных и тип передаваемых данных. Допустимые параметры тега <FORM> перечислены в табл. 4-1. Таблица 4-1. Параметры тега <FROM>
Параметр ACTION определяет, какое действие будет выполнено над формой, после того как пользователь ее заполнит и передаст Web-серверу. В примере, приведенном выше, в качестве значения для параметра ACTION мы указали путь к программе CGI, расположенной в файле form.exe, которая будет выполнять обработку данных. С помощью параметра METHOD можно выбрать один из двух методов передачи данных из формы программе расширения Web-сервера: · Если значение этого параметра равно GET (как в нашем примере), программа CGI, указанная в параметре ACTION, получит данные из формы через переменную среды операционной системы с именем QUERY_STRING. · В том случае, когда значение параметра METHOD равно POST, программа CGI получит данные из формы через стандартный поток ввода. Позже мы рассмотрим различия между этими методами более подробно. И, наконец, третий параметр ENCTYPE, используется очень редко и только для метода POST. Он позволяет указать тип передаваемых данных и по умолчанию имеет значение application/x-www-form-urlencoded. Применение параметра ENCTYPE может пригодиться Вам для загрузки файлов на Web-сервер через браузер. В этом случае данный параметр указывается как multipart/form-data. Загрузка файлов на Web-сервер через браузер Технология загрузки файлов посетителей на Web-сервер (часто называемая технологией File Upload) основана на экспериментальном протоколе, описанном в документе RFC1867 (если Вы не знакомы с описаниями RFC, сходите на сервер http://www.cis.ohio-state.edu/htbin/rfc). Документ RFC1867 называется «Form-based file Upload in HTML»”, что можно перевести как «прием файлов через документы HTML». В этом документе помимо всего прочего описывается применение строки FILE в качестве возможного значения атрибута TYPE тега <INPUT>, создающего элементы управления в формах. Этот элемент управления состоит из однострочного текстового поля и расположенной справа от него кнопки с надписью Browse, предназначенной для выбора файла на локальном диске. Кроме того, в атрибуте ENCTYPE тега <FORM> для передачи файлов предлагается указывать тип данных multipart/form-data, что отличается от привычного формата application/x-www-form-urlencoded. Формат данных multipart/form-data позволяет передавать данные типа MIME и, в частности, произвольные двоичные данные, которыми в общем случае являются все файлы. Что же касается формата application/x-www-form-urlencoded, используемого по умолчанию, то он пригоден только для передачи текстовых данных. Подробнее об этом мы рассказали в [1]. Там же Вы найдете исходные тексты расширения ISAPI, предназначенного для загрузки файлов на Web-сервер при помощи протокола, описанного в документе RFC1867. Для создания в форме различных элементов управления (полей ввода, флажков, кнопок и так далее) используются теги <INPUT>, <TEXTAREA> и <SELECT>. Тег <INPUT> предназначен для вставки в форму таких элементов управления, как поля ввода текстовой информации, флажки, кнопки (обычные и в виде графических изображений). Этот тег применяется также для упомянутой выше загрузки локальных файлов через браузер на Web-сервер. Параметры тега <INPUT> перечислены в табл. 4-2. Таблица 4-2. Параметры тега <INPUT>
Параметр TYPE определяет тип создаваемого элемента управления. Он может принимать значения, перечисленные в табл. 4-3. Таблица 4-3. Значения параметра <TYPE>
Тег <INPUT> с параметром TYPE, имеющим значение TEXT, позволяет вставить в форму поле редактирования текстовой строки. Если же нужно создать поле ввода многострочного текста, следует воспользоваться тегом <TEXTAREA>, применяемым совместно с закрывающим тегом </TEXTAREA>. Для тега <TEXTAREA> Вы можете задать параметры, перечисленные в табл. 4-4. Таблица 4-4. Значения параметра <TEXTAREA>
Вот пример описания многострочного текстового поля: <TEXTAREA NAME="multi" ROWS=8 COLS=40> Здесь мы создали поле, состоящее из 8 строк по 40 символов в каждой. Четыре строки были проинициализированы. При загрузке в окно браузера данное поле будет выглядеть так, как это показано на рис. 4-6. Рис. 4-6. Форма с полем типа TEXTAREA Полный текст соответствующего документа HTML Вы найдете в листинге 4-2. Листинг 4-2 Вы найдете в файле chap4\textarea.html на прилагаемом к книге компакт-диске. С помощью тега <SELECT> Вы можете вставить в форму заранее проинициализированный список произвольных текстовых строк. Выбранная строка пересылается Web-серверу наряду с содержимым других полей формы. Для тега <SELECT> определены два параметра — NAME и SIZE. Параметр NAME задает имя списка, которое передается We-серверу в паре с выбранной строкой. С помощью параметра SIZE можно задать высоту списка в строках. Ниже мы привели пример использования тега <SELECT>: <SELECT NAME="number"> Для записи строк в список здесь используется тег <OPTION>. Строка, отмеченная параметром SELECTED, будет выбрана в списке по умолчанию. Пример документа HTML с формой Формы лучше изучать на конкретном примере. В этом разделе мы создадим форму, содержащую почти все перечисленные выше элементы управления (рис. 4-7), и рассмотрим исходный текст соответствующего документа HTML. Рис. 4-6. Форма с элементами управления различных типов Исходный текст документа HTML с данной формой приведен в листинге 4-3. Листинг 4-3 Вы найдете в файле chap4\form2\controls.html на прилагаемом к книге компакт-диске. <!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 3.2//EN"> Рассмотрим применение тегов в этой форме. Указание параметров тега <FORM> В теге <FORM> здесь заданы два параметра — METHOD и ACTION: <FORM METHOD=POST
ACTION="http://saturn/frolov-cgi/controls.exe"> Параметр METHOD имеет значение POST и указывает способ передачи данных программе CGI через стандартный поток ввода. В параметре ACTION указан путь к загрузочному файлу программы CGI, которая находится в каталоге frolov-cgi Web-сервера с адресом http://www.someserver.ru (этот адрес в реальности не существует и приведен только в качестве примера). Заметим, что программы CGI (а также расширения Web-сервера в виде библиотек динамической компоновки DLL с интерфейсом ISAPI, которые мы рассмотрели в [1]) могут находиться не в любом каталоге Web-сервера, а только в таком, для которого разрешено выполнение программ. Если Вы создаете виртуальный Web-узел, который физически располагается на сервере провайдера Интернета, возможно, Вам придется получить разрешение на создание или использование такого каталога. Теперь займемся элементами управления. Мы разместили все элементы управления в таблице. В первой строке этой таблицы находится однострочное поле для ввода текста, которое вставлено в форму оператором <INPUT> и имеет тип TEXT: <INPUT TYPE=text NAME="text1" VALUE="Текст" SIZE=30> Имя поля указано в параметре NAME как text1. В качестве начального значения для поля параметром VALUE задана строка «Текст». Эту строку можно будет редактировать после отображения формы. Мы также указали размер поля, равный 30 символам, для чего воспользовались параметром SIZE. Во второй строке таблицы также при помощи оператора <INPUT> определено поле для ввода пароля: <INPUT TYPE=password NAME="pwd" VALUE="Пароль"> При вводе символов в этом поле они не отображаются. Аналогично, не отображается и начальная строка, использованная для инициализации поля. Поле ввода многострочного текста Для ввода многострочного текста в третьей строке таблицы при помощи оператора <TEXTAREA> мы расположили следующие теги: <TEXTAREA NAME="text2"
ROWS=4 COLS=30> Имя этого поля задано как text2. Поле имеет высоту, равную четырем строкам (параметр ROWS равен 4), и ширину, равную 30 символам (параметр COLS равен 30). Флажки с независимой фиксацией В четвертой строке таблицы мы расположили группу из трех флажков с независимой фиксацией типа CHECKBOX: <INPUT TYPE=CHECKBOX
NAME="chk1" VALUE="on" CHECKED>Первый<BR> Для каждого из этих флажков при помощи параметра NAME задано собственное имя. Оператор VALUE задает значение, которое будет послано Web-серверу при отмеченном флажке. Кстати, если флажок не отмечен, форма не посылает в Web-сервер никаких связанных с этим флажком данных. Заметим, что первый и третий флажок при первоначальной загрузке формы в окно браузера отображаются в отмеченном состоянии, так как для соответствующих тегов <INPUT> задан параметр CHECKED. Ниже, в пятой строке, находится группа из трех флажков типа RADIO с зависимой фиксацией: <INPUT TYPE=RADIO
NAME="rad" VALUE="on1" CHECKED>Первый<BR> Все флажки, относящиеся к одной группе, должны называться одинаково. В нашем случае при помощи параметра NAME мы задали для всех трех переключателей имя «rad». Первый флажок по умолчанию отмечен, так как для него задан параметр CHECKED. Для того чтобы при анализе данных, полученных от формы, программа CGI могла определить, какой из флажков, входящих в группу, был отмечен, мы задали для каждого флажка свое значение параметра VALUE. Шестая строка таблицы содержит список, состоящий из трех строк. Этот список определен при помощи тегов <SELECT> и <OPTION>, как это показано ниже: <SELECT NAME="sel"
SIZE="1"> Имя списка задано как «sel», а высота его равна одной строке. Содержимое строк списка задается при помощи параметра VALUE соответствующих тегов <OPTION>. Последняя строка таблицы содержит скрытый элемент управления, который не отображается в окне браузера: <INPUT TYPE=HIDDEN NAME="hid" VALUE="Hidden"> Он посылает Web-серверу строку «Hidden», заданную в параметре VALUE. Кнопки типа SUBMIT и RESET Под таблицей в форме расположены три кнопки, первые две из которых стандартные, а третья сделана при помощи графического изображения. Эти кнопки вставлены при помощи тега <INPUT> следующим образом: <INPUT TYPE=submit
VALUE="Send"> Кнопка типа SUBMIT имеет надпись «Send» и предназначена для посылки данных из формы в Web-сервер для последующей обработки программой CGI. Кнопка типа RESET предназначена для того, чтобы посетитель, изменив данные в форме, мог снова вернуться к значениям, заданным по умолчанию при помощи параметра VALUE в тегах определения элементов управления. Эта кнопка снабжена надписью «Reset». Последняя кнопка имеет тип IMAGE. Ее изображение находится в файле send.gif, адрес URL которого (в нашем случае это просто имя файла) указан в параметре SRC. Для того чтобы вокруг изображения кнопки не было рамки, мы указали нулевое значение параметра BORDER. Заметим, что программа CGI получит от графической кнопки координаты точки, в которой находился курсор мыши в момент щелчка кнопки. Таким образом, возможно создание кнопки в виде сегментированного графического изображения. Программа CGI сможет определить, в какой области изображения была щелкнута кнопка при отправке заполненной формы на обработку. Когда пользователь заполняет форму и щелкает кнопку типа SUBMIT либо графическую кнопку (которая выполняет аналогичную функцию), данные из полей формы вместе с именами этих полей передаются браузером Web-серверу. Тот, в свою очередь, анализирует эти данные и запускает соответствующую программу CGI, путь к файлу которой указан в теге <FORM>. Перед запуском программы CGI сервер Web выбирает в зависимости от значения параметра METHOD тега <FORM> один из двух способов передачи полученных данных для обработки — метод GET или POST. Метод GET предполагает передачу данных программе CGI через переменные среды (environment variable). Это те самые переменные среды, которые устанавливаются в операционной системе MS-DOS командой SET. Сервер Web создает для программы CGI довольно много переменных среды. Имена и назначение всех этих переменных Вы узнаете позже из раздела «Переменные среды для программы CGI» этой главы, а пока мы расскажем только о самых необходимых переменных. Прежде всего, метод GET предполагает использование переменной среды с именем QUERY_STRING. Именно сюда попадают данные из полей формы. Эти данные находятся в следующем формате: “Имя1=Значение1&Имя2=Значение2&Имя3=Значение3” Здесь в качестве имен используются значения параметров NAME, задающих имена полей формы. Вместо значений подставляются данные из соответствующих полей. Сканируя содержимое текстовой строки переменной среды QUERY_STRING, программа CGI найдет в ней имя любого нужного поля и соответствующее этому имени значение. Заметим, что если флажок, расположенный в форме, не отмечен, то никакие данные от него не передаются. Поэтому не следует думать, что в полученной строке Вы обязательно встретите имена всех полей формы. Адрес строки любой переменной среды в программе, составленной на C, легко получить с помощью функции getenv: char * szQueryString; Строка, передаваемая в переменной среды QUERY_STRING, закодирована с использованием так называемой кодировки URL. В этом случае все символы пробелов заменяют символами «+». Кроме того, для представления кодов управляющих и некоторых других символов используется последовательность символов вида «%xx», где «xx» — это шестнадцатеричный код символа в виде двух символов ASCII. В нашей книге [1] Вы найдете исходные тексты функций, написанных на языке программирования С, и предназначенных для перекодирования информации, полученной из форм. Как Вы скоро узнаете, программа Perl может получать значения полей формы напрямую без необходимости сканирования, учета кодировки URL и разбора принятых данных. При использовании метода POST программа CGI получает данные из формы через стандартный поток ввода stdin. Если программа CGI составлена на языке программирования C, то для получения данных она может воспользоваться такими функциями, как fread или scanf. Что же касается количества байт данных, которые нужно считать из стандартного потока ввода, то эта информация передается программе CGI через переменную среды с именем CONTENT_LENGTH. Ниже мы приводим фрагмент кода для определения размера информации для ввода через стандартный поток stdin: int Size; Входные данные можно затем получить, например, следующим образом: char szBuf[8196]; Если в теге <FORM> не указан параметр ENCTYPE (тип MIME передаваемых данных) или этот параметр имеет значение application/x-www-form-urlencoded, данные, полученные через стандартный поток ввода, закодированы в URL. Перед использованием Вы должны их перекодировать соответствующим образом. Заметим, что программа CGI, составленная на языке Perl, тоже может читать данные из входного потока аналогичным образом. Однако, как Вы скоро увидите, в этом нет никакой необходимости. В языке Perl предусмотрены мощные и удобные способы извлечения данных из входных потоков, не требующих непосредственного чтения и разбора принятых данных. Метод GET обычно применяют для обработки небольших форм, так как браузеры и операционные системы накладывают ограничения на размер данных, передаваемых через переменную среды QUERY_STRING. В этом отношении метод POST предпочтительнее, так как не ограничивает размер передаваемых данных. Передача ответа из программы CGI Вне зависимости от метода передачи данных (GET или POST) результат своей работы программа CGI направляет в стандартный поток вывода stdout. Если программа составлена на языке программирования C, для записи результат работы она может воспользоваться, например, функцией printf или fwrite. Чаще всего программы CGI применяют для создания динамических документов HTML на основе данных, полученных из формы. В этом случае первой строкой, которую необходимо вывести в стандартный поток вывода stdout, будет следующая строка заголовка HTTP: Content-type: text/html Сразу за ней необходимо вывести еще одну пустую строку, которая послужит разделителем между заголовком HTTP и данными документа HTML. Вот фрагмент кода, в котором программа CGI динамически формирует документ HTML и выводит его в стандартный поток вывода: printf("Content-type: text/html\n\n"); Обратите внимание на символы перевода строки «\n\n». Первый из них закрывает строку заголовка HTTP, а второй создает пустую разделительную строку. Программы CGI, составленные на языке Perl, тоже могут динамически формировать документы HTML и выводить их в стандартный поток вывода. Однако им доступны и более передовые технологии, основанные на применении шаблонов. Забегая вперед, скажем, что шаблоны не только значительно упрощают формирование динамических документов HTML, но и позволяют разделить работу программистов и дизайнеров. Переменные среды для программы CGI Прежде чем перейти к примерам программ CGI, мы расскажем о переменных среды, которые формируются для этих программ перед запуском. Через эти переменные помимо данных из полей форм передается и другая очень важная информация. Рассмотрим по отдельности назначение переменных среды. Заметим, что набор переменных, создаваемых при запуске программы CGI, зависит от конкретной реализации сервера Web. В главе 5 мы приведем исходный текст программы CGI, позволяющей просмотреть список имен переменных среды и их значения. · AUTH_TYPE Технология Web допускает защиту страниц HTML, когда доступ к отдельным страницам предоставляется только отдельным пользователям при предъявлении пароля. При этом определяется система аутентификации или проверки подлинности идентификатора пользователя. Переменная среды AUTH_TYPE содержит тип идентификации, который применяется сервером. Например, для Web-сервера типа Microsoft Internet Information Server при включении аутентификации в этой переменной будет храниться строка «NTLM». · GATEWAY_INTERFACE В этой переменной находится версия интерфейса CGI, с которой работает данный сервер. · HTTP_ACCEPT В этой переменной перечислены типы данных MIME, которые браузер способен принять от Web-сервера. Например, сервер Microsoft Internet Information Server может передать браузеру растровые графические изображения в формате gif, jpeg, pjpeg, x-xbitmap. Строка вида */* говорит о том, что браузер способен обработать любые типы данных. Подробно типы данных описаны в спецификации протокола MIME. · HTTP_REFER В переменную HTTP_REFER записывается адрес URL документа HTML, который инициировал работу программы CGI. · HTTP_ACCEPT_LANGUAGE Переменная HTTP_ACCEPT_LANGUAGE содержит идентификатор предпочтительного национального языка для получения ответа от сервера Web. · HTTP_UA_PIXELS Разрешение видеоадаптера, установленное в компьютере пользователя. · HTTP_UA_COLOR Допустимое количество цветов в системе пользователя. · HTTP_UA_OS Операционная система, под управлением которой работает браузер. · HTTP_UA_CPU Тип центрального процессора, установленного в компьютере пользователя. · HTTP_USER_AGENT В эту переменную записывается имя браузера, с помощью которого запрашивается документ HTML. Анализируя это имя, программа CGI принимает решение об использовании тех или иных расширений стандарта языка HTML, допустимого для конкретного браузера. · HTTP_HOST Имя узла, на котором работает сервер Web. · HTTP_CONNECTION Тип соединения. · HTTP_ACCEPT_ENCODING Метод кодирования, который применяет браузер для формирования ответа серверу Web. · HTTP_AUTHORIZATION Информация авторизации от браузера. Используется браузером для собственной аутентификации в сервере Web. · HTTP_FROM Имя пользователя в том виде, как оно зарегистрировано при настройке браузера. Применяется формат адресов электронной почты. · HTTP_PRAGMA Специальные команды серверу Web. · CONTENT_LENGTH Количество байт данных, которые программа CGI должна получить от браузера. · CONTENT_TYPE Тип данных, присланных браузером. · PATH_INFO Путь к виртуальному каталогу, в котором находится программа CGI. Как правило, при настройке сервера Web администратор выделяет один или несколько каталогов для хранения расширений сервера в виде программ CGI или ISAPI. Для файлов, записанных в такие каталоги, устанавливается доступ на запуск. Администратор создает таблицу соответствия физических каталогов и виртуальных, определяя права доступа к виртуальным каталогам с помощью программы настройки параметров Web-сервера. · PATH_TRANSLATED Физический путь к программе CGI. · QUERY_STRING Строка параметров, указанная в форме после адреса URL программы CGI после разделительного символа «?». · REMOTE_ADDR Адрес IP узла, на котором работает браузер пользователя. · REMOTE_HOST Доменное имя узла, на котором работает браузер пользователя. Если эта информация недоступна (например, для узла не определен доменный адрес), вместо доменного имени указывается адрес IP, как в переменной REMOTE_ADDR. · REMOTE_USER Имя пользователя, которое используется браузером для аутентификации. Применяется только в том случае, если Web-сервер способен работать с аутентификацией и программа CGI отмечена как защищенная. · REQUEST_METHOD Метод доступа, который применяется для передачи данных от браузера серверу Web. В своих примерах мы используем методы доступа GET и POST, хотя протокол HTTP допускает применение и других методов доступа, например PUT и HEAD. · SCRIPT_NAME В эту переменную записывается путь к виртуальному каталогу и имя программы CGI. Анализируя эту переменную, программа CGI определяет путь к своему загрузочному файлу. · SERVER_NAME Доменное имя сервера Web или адрес IP сервера Web, если доменное имя недоступно или не определено. · SERVER_PROTOCOL Имя и версия протокола, который применяется для выполнения запроса к программе CGI. · SERVER_PORT Номер порта, на котором браузер посылает запросы серверу Web. · SERVER_SOFTWARE Название и версия программного обеспечения сервера Web. Версия следует после названия и отделяется от названия символом «/». · REMOTE_IDENT Имя, с которым пользователь подключился к серверу Web. Применяется только в том случае, если сервер Web способен подключать пользователей по именам. |