Часть IV. Создание сценариев CGI

Глава 18. CGI-программирование

Коротко

Эта глава начинает раздел, посвященный программированию с использованием CGI (Common Gateway Interface). CGI-программирование — очень популярное среди программистов применение Perl (и, по мнению некоторых, единственная причина существования этого языка). CGI-программирование основывается на сценариях CGI, которые, с точки зрения языка, являются обычными программами на Perl, но с расширением .cgi. Сценарии устанавливаются на Web-сервере, и в результате на Web-страницах появляются кнопки, списки с прокруткой, меню и многие другие элементы управления. Благодаря CGI пользователь может взаимодей ствовать с Web-страницами, получая доступ к базам данных, запуская программы, играя в игры и даже оформляя заказы. Для сотен тысяч программистов Perl — основа интерактивных Web-страниц.

В этой главе я собираюсь раскрыть ключевые моменты программирования сценариев CGI. Я покажу два CGI-сценария. Первый, cgi1.cgi, создает Web-страницу с элементами управления HTML (Hypertext Markup Language — язык гипертекстовой разметки) — кнопками, списками, всплывающие меню и т. д. Пользователь вводит данные и нажимает кнопку Submit. Затем с помощью второго сценария, cgi2.cgi, мы читаем введенные им данные и возвращаем пользователю копию.

В этой, равно как и в трех последующих главах, я буду предполагать, что у вас есть ISP (Internet Service Provider — компания, предоставляющая доступ в Интернет), свой раздел на сервере, а также возможность размещать на нем страницы. (Обычно это делается либо с помощью программы, использующей протокол FTP, либо с помощью специальной страницы на сервере провайдера, предостав ляющей возможность переносить файлы). Также вам потребуется разрешение провайдера на запуск CGI-сценариев — дело в том, что иногда из соображений защиты информации это запрещено. Предполагая, что не только вы можете запускать CGI-сценарии, не забывайте также устанавливать соответствующие права доступа для них — помните о защите своих файлов и системы в целом. В частности, для операционных систем семейства Unix для установки прав доступа следует использовать команду chmod — например: chmod 644 script.cgi. Сделав это, необходимо также разрешить выполнение сценария, например, с помощью команды chmod +x script.cgi. (Для получения полной информации о процессе размещения страниц имеет смысл обратиться к вашему провайдеру.)

Использование CGI.pm

Итак, как создается CGI-сценарий? Теоретически это очень просто: программа CGI, как и любая другая программа на Perl, выполняет обычные команды Perl, когда она вызывается броузером (то есть когда броузеру в качестве URL задается CGI-сценарий). Все, что вы направляете в стандартный вывод, передается броузеру. Так, если CGI-сценарий выполняет команду print "Hello!", этот текст будет возвращен броузеру, и на странице появится надпись "Hello!". Но это рудиментарный способ. Требуется ли прочитать данные, введенные пользователем с помощью элементов управления, расположенных на странице? Или вы захотите создать эти элементы управления из сценария? Чтобы сделать все это и многое другое, используется прилагающийся к Perl пакет CGI.pm. (В следующей главе мы будем использовать другой популярный пакет — cgi-lib.pl.) С одной стороны, это стандартный способ работы с CGI средствами Perl, с другой — отличное введение в CGI.pm.

Итак, интерпретатор Perl содержит, среди других модулей, стандартный модуль CGI.pm. Поэтому если у вас установлен Perl, то, скорее всего, есть и CGI.pm. Начиная с пятой версии Perl CGI.pm стал объектно-ориентированным, хотя упрощенный функционально-ориентированный интерфейс все еще существует. В наших примерах мы будем использовать объектно-ориентированное программирование. Создавая с помощью CGI.pm объекты CGI, мы будем вызывать различные методы этого объекта. Существуют методы, соответствующие практичес ки всем основным тегам HTML, и при их вызове создается нужный тег с указанными атрибутами. Все они могут получать именованные параметры (за исключением методов, требующих один аргумент); иными словами, требуется указать не только значение атрибута HTML, но и его имя. В следующем примере объект CGI создает Web-страницу посредством встроенных методов. Обратите внимание на именованные параметры метода textarea, задающие имя области редактирования текста ('textarea'), значение по умолчанию и размеры:

use CGI;

$co = new CGI;

print $co->header,

$co->start_html(-title=>'CGI Example'),

$co->center($co->hl(`Welcome to CGI!')),

$co->textarea

(

-name => 'textarea',

-default => 'No opinion',

-rows => 10,

-columns => 60

),

$co->end_html;

Если возможности объектно-ориентированного интерфейса не требуются, пакет CGI.pm также поддерживает простой функционально-ориентированный интерфейс. Мы рассмотрим пример применения функционально-ориентированного интерфейса CGI.pm в конце главы.

 

Создание и использование элементов управления HTML

Создание и использование элементов управления HTML

Изучать программирование лучше всего на примерах. Потому в этой главе, как отмечалось ранее, приводятся два CGI-сценария: один создает Web-страницу с элементами управления — полями ввода текста, переключателями, кнопками, включая Submit, а второй читает данные, введенные пользователем на этой странице. Оба сценария — вариации с небольшими дополнениями на тему оператора print, который собственно и создает страницу.

Первый сценарий хранится в файле cgi1.cgi, и в справочных целях полностью приводится в листинге 18.1. Когда пользователь открывает сценарий в броузере (переходя по его адресу — например, http://www.yourserver.com/user/cgi/cgi1.cgi), сценарий возвращает страницу с элементами управления HTML и текстом. В данном случае это страница анкеты. На рис. 18.1_18.3 она показана в окне программы Netscape Navigator.

Как видно из рис. 18.1, страница содержит приветствие и сообщение о том, что посетители, не желающие заполнять анкету, могут перейти по ссылке на сервер CPAN (Comprehensive Perl Archive Network — всеобъемлющий архив, посвященный языку Perl).

Прокручивая страницу с анкетой вниз, вы увидите запрос имени пользователя с текстовым полем и вопрос о его мнении с областью редактирования текста (многострочное текстовое поле).

Рис. 18.1. Текст, маркированный список и гиперссылка

Просматривая анкету дальше, вы увидите еще несколько элементов управления, показанных на рис. 18.3, — кнопки с зависимой и независимой фиксацией, списки, а также кнопка подтверждения и очистки анкеты. В этой главе мы рассмотрим, как создать все эти элементы управления на примере предложенных сценариев.

Когда пользователь нажимает на кнопку Submit, расположенную в конце анкеты, броузер собирает данные, введенные на странице, и передает их другому CGI-

сценарию, cgi2.cgi. В справочных целях он приведен в листинге 18.2, а результаты его выполнения — на рис. 18.4, где вы можете наблюдать сводку введенной пользователем информации.

Рис. 18.2. Текстовое поле и текстовая область

Рис. 18.3. Элементы управления HTML

 

Создание и использование элементов управления HTML

Как Web-страница с анкетой узнает, куда передать данные? Все элементы управления на ней принадлежат одной HTML-форме. Это невидимый элемент — просто конструкция, которая содержит набор элементов управления, а атрибут action формы указывает URL-адрес файла cgi2.cgi. Когда пользователь нажимает на кнопку Submit, броузер передает данные, введенные им, по указанному URL. В cgi2.cgi мы читаем данные и отображаем их.

Рис. 18.4. CGI-сценарий cgi2.cgi показывает результаты анкетирования

Осталось сделать еще одно замечание, и тогда мы будем готовы к чтению раздела «Непосредственные решения». В общем нет никакой необходимости создавать CGI-сценарий, генерирующий анкету, — можно просто написать страницу HTML, которая будет вызывать cgi2.cgi по нажатию пользователем кнопки Submit. Подход, требующий генерации кода, выбран лишь затем, чтобы продемонстрировать обе стороны процесса — как создать элементы управления HTML из CGI-сценария и как прочесть данные из этих элементов управления. Если же вы хотите непосредственно использовать страницу HTML с анкетой, обратитесь к листингу 18.3, где и приведен код страницы, создающийся сценарием cgi1.cgi.

Листинг 18.1. cgi1.cgi

#!/usr/local/bin/perl

use CGI;

$co = new CGI;

$labels{`1'} = `Sunday';

$labels{`2'} = `Monday';

продолжение И

$labels{`3'} = `Tuesday';

$labels{`4'} = `Wednesday';

$labels{`5'} = `Thursday';

$labels{`6'} = `Friday';

$labels{`7'} = `Saturday';

print $co->header,

$co->start_html(

-title => 'CGI Example',

-author => 'Steve',

-meta => {`keywords' => 'CGI Perl'},

-BGCOLOR => 'white',

-LINK => 'red'

),

$co->center($co->h1(`Here is the Survey!')),

$co->h2(`Please fill out survey...'),

"Reasons for filling out our survey:", $co->p,

$co->ul(

$co->li(`Fame'),

$co->li(`Fortune'),

$co->li(`Fun'),

),

"If you would rather not fill out our survey!,",

"you might be interesed in",

$co->a({href=>"http://www.cpan.org/"},"CPAN"),".",

$co->hr,

$co->startform(

-method=>'POST',

-action=>'http://www.yourself.com/user/cgi/cgi2.cgi'),

"Please enter your name: ",

$co->textfield(`text'), $co->p,

"Please enter your opinion: ", $co->p,

$co->textarea(

-name => 'textarea',

-default => 'No opinion',

-rows => 10,

-columns => 60

), $ co->p,

"Please indicate what products you use: ",$co->p,

$co->checkbox_group(

-name => 'checkboxes',

-values => [`Shampoo','Toophpaste','Bread',

`Cruise missiles'],

-defaults => [`Bread','Cruise missiles']

), $co->p,

"Please indicate your income level: ",$co->p,

$co->scrolling_list(

 

Создание и использование элементов управления HTML

`list',

[`Highest','High','Medium','Low'],

`High',

), $co->p,

"Please indicate your day of a week: ", $co->p,

$co->radio_group(

-name => 'radios',

-values => ['1','2','3','4','5','6','7'],

-default => '1',

-labels => \%labels

), $co->p,

"Thank you for filling out our survey. Please indicate How much unsolicited mail you like to get: ",

$co->popup_menu(

-name => 'popupmenu',

-values => [`Very much','A lot','Not so much','None']

), $co->p,

$co->hidden(-name=>'hiddendata', -default=>'Rosebud'),

$co->center(

$co->submit,

$co->reset,

),

$co->hr,

$co->endform,

$co->end_html;

Листинг 18.2. cgi2.cgi

#!/usr/local/bin/perl

use CGI;

$co = new CGI;

print $co->header,

$co->start_html(

-title => 'CGI Example',

-author => 'Steve',

-meta => {`keywords'=>'CGI Perl'},

-BGCOLOR => 'white',

-LINK => 'red'

),

$co->center($co->h1(`Thanks for filling out our survey.')),

$co->h3(`Here is your responses...'),

$co->hr;

if ($co->param()) {

print

"Your name is: ",$co->em($co->param(`taxt')),

".",$co->,

"Your opinions are: ",

$co->em($co->param(`taxtarea')), ".",$co->p,

продолжение И

"You use these products: ",$co->em(join(", ",

$co->param(`checkboxes'))), ".",$co->p,

"Your income level is: ",$co->em($co-

>param(`list')),".", $co->p,

"Today is day ",$co->em($co->param(`radios')), " of

the week,", $co->p,

"How much unsolicited mail you like: ",

$co->em($co->param(`popupmenu')), ".", $co->p,

"The hidden data is ".$co->em(join(", ",

$co->param(`hiddendata'))), ".";

}

print $co->hr;

print $co->end_html;

Листинг 18.3. Полученная страница (HTML)

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">

<HTML><HEAD><TITLE>CGI Example</TITLE>

<LINK REV=MADE HREF="mailto:Steve">

<META NAME="keywords" CONTENT="CGI Perl">

</HEAD>

<BODY BGCOLOR="white" LINK="red">

<CENTER><H1>Here is the Survey!</H1></CENTER>

<H2>Please fill out the survey...</H2>

Reasons for filling out survey:

<P><UL><LI>Fame</LI> <LI>Fortune</LI> <LI>Fun</LI> </UL>

If you would rather not fill out our survey, you might

be interested in

<A HREF="http://www.cpan.org/">CPAN</A>.

<HR><FORM METHOD="POST"

ACTION="http://www.yourserver.com/user/cgi/cgi2.cgi"

ENCTYPE="application/x-www-form-urlencoded">

Please enter your name:

<INPUT TYPE="text" NAME="text" VALUE=""><P>

Please enter your opinion: <P><TEXTAREA NAME="textarea"

ROWS=10 COLS=60>No opinion</TEXTAREA><P>

Please indicate what product you use: <P>

<INPUT TYPE="checkbox" NAME="checkboxes" VALUE="Shampoo">

Shampoo

<INPUT TYPE="checkbox" NAME="checkboxes" VALUE="Toothpaste">

Toothpaste

<INPUT TYPE="checkbox" NAME="checkboxes" VALUE="Bread" CHECKED>

Bread

<INPUT TYPE="checkbox" NAME="checkboxes" VALUE="Cruise missiles " CHECKED>Cruise missiles <P>

Please indicate your income level: <P><SELECT

NAME= "list" SIZE=4>

<OPTION VALUE="Highest">Highest

 

Создание и использование элементов управления HTML

<OPTION SELECTED VALUE="High">High

<OPTION VALUE="Medium">Medium

<OPTION VALUE="Low">Low

</SELECT>

<P>Please indicate the day of the week: <P>

<INPUT TYPE="radio" NAME="radios" VALUE="1" CHECKED>Sunday

<INPUT TYPE="radio" NAME="radios" VALUE="2">Monday

<INPUT TYPE="radio" NAME="radios" VALUE="3">Tuesday

<INPUT TYPE="radio" NAME="radios" VALUE="4">Wednesday

<INPUT TYPE="radio" NAME="radios" VALUE="5">Thursday

<INPUT TYPE="radio" NAME="radios" VALUE="6">Friday

<INPUT TYPE="radio" NAME="radios" VALUE="7">Saturday <P>

Thank you for filling out our Survey. Please indicate how

much unsolicited you like to get:

<SELECT NAME= "popupmenu">

<OPTION VALUE="Very much">Very much

<OPTION VALUE="A lot">A lot

<OPTION VALUE="Not so much">Not so much

<OPTION VALUE="None">None

</SELECT>

<P><INPUT TYPE="hidden" NAME="hiddendata" VALUE="Rosebud">

<CENTER><INPUT TYPE="submit" NAME=".submit">

<INPUT TYPE="reset"></CENTER><HR>

<INPUT TYPE="hidden" NAME=".cgifields" VALUE="radios">

<INPUT TYPE="hidden" NAME=".cgifields" VALUE="list">

<INPUT TYPE="hidden" NAME=".cgifields" VALUE="checkboxes">

</FORM>

</BODY>

</HTML>

Непосредственные решения

Использование языка PerlScript

Я начну эту главу с обсуждения возможности, которой не следует пренебрегать,  — с языка PerlScript. Некоторые броузеры, например Microsoft Internet Explorer, способны выполнять его. Несмотря на то что разговор о PerlScript выходит за рамки книги, знать о его существовании надо — часто вместо написания полноценной CGI-программы можно сделать все, что требуется, внедрив PerlScript в Web-страницу. В следующем примере PerlScript используется для вывода строки "Hеllo!" на Web-странице.

<HTML>

<HEAD>

<TITLE>PerlScript Example</TITLE>

</HEAD>

<BODY>

<H1>PerlScript Example</H1>

<SCRIPT LANGUAGE="PerlScript">

$window->document->write("Hello!");

</SCRIPT>

</BODY>

</HTML>

Эта страница представлена на рис. 18.5 в том виде, как ее выводит Microsoft Internet Explorer.

Рис. 18.5. Пример страницы с использованием PerlScript

 

Центрируем элементы

Начинаем HTML-документ

Начало работы над документом HTML строится следующим образом. Вначале вы создаете CGI объект, затем с помощью метода header этого объекта — HTTP-заголовок (в данном примере создается простая шапка документа, но допустимы сколь угодно сложные шапки с любыми атрибутами), после чего метод start_html начинает сам документ HTML. Этот метод создает секцию <HEAD>, а также позволяет указать некоторые атрибуты <BODY>, как-то: цвет для изображения фона и ссылок. Ниже приведен фрагмент кода cgi1.cgi, открывающий страницу. Обратите внимание: чтобы результаты работы методов header и start_html попали на страницу, необходимо использовать функцию print:

#!/usr/local/bin/perl

$co = new CGI;

print $co->header,

$co->start_html(

-title => 'CGI Example',

-author => 'Steve',

-meta => {`keywords'=>'CGI Perl'},

-BGCOLOR => 'white',

-LINK => 'red'

)

Создаем заголовки HTML

После создания шапки CGI-методы типа h1, h2, h3 и др. помогут создать заголовки, соответствующие тегам <H1>, <H2>, <H3> и т. д. Ниже приведен фрагмент кода, генерирующий заголовки <H1> и <H2> в начале Web-страницы с анкетой. В данном случае это простое приглашение пользователю.

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->h1(`Here is the Survey!'),

$co->h2(`Please fill out survey...')

Результат вы можете наблюдать на рис. 18.1.

Центрируем элементы

Чтобы центрировать текст с помощью тегов <CENTER>, используется CGI-метод center. В следующем примере центрируется заголовок, созданный в предыдущем примере:

#!/usr/local/bin/perl

$co = new CGI;

print

продолжение И

...

$co->center($co->h1(`Here is the Survey!')),

$co->h2(`Please fill out survey...'),

Результат работы этого кода показан на на рис. 18.1.

Создаем маркированный список

CGI-методы ul и li создают несортированный маркированный список (теги <UL> и <LI> соответственно). Ниже приведен фрагмент кода cgi1.cgi, представляющий пользователю несколько весомых аргументов, побуждающих заполнить анкету:

#!/usr/local/bin/perl

$co = new CGI;

print

...

"Reasons for filling out our survey:", $co->p,

$co->ul(

$co->li(`Fame'),

$co->li(`Fortune'),

$co->li(`Fun'), )

Результат работы этого кода показан на рис. 18.1.

Создаем гиперссылку

Гиперссылки помещаются на страницу CGI-методом a, как в примере ниже, где выводится URL для перехода (на случай, если пользователь не заинтересован в заполнении анкеты, созданной сценарием cgi1.cgi):

#!/usr/local/bin/perl

$co = new CGI;

print

...

"If you would rather not fill out our survey!,",

"you might be interesed in",

$co->a({href=>"http://www.cpan.org/"},"CPAN"),"."

Результат работы кода показан на рис. 18.1.

Создаем горизонтальную полосу

Для создания горизонтальной линии (метка <HR>) используется CGI-метод hr:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->hr

Результат работы кода показан на рис. 18.1.

 

Чтение данных из элементов управления HTML

Создаем HTML-форму

Элементы управления HTML должны группироваться в формы. В примере с анкетой для создания формы использовался GDI-метод startform. После нажатия кнопки Submit данные из элементов управления должны быть прочитаны и переданы сценарию, сформирующему сводку данных, то есть cgi2.cgi. URL этого сценария указывается в атрибуте action формы:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->startform(

-method=>'POST',

-action=>'http://www.yourself.com/user/cgi/cgi2.cgi')

#$co->startform()

Все последующие элементы управления будут включены в форму, потому что метод startform генерирует тег <FORM>.

Подсказка. Если startform вызывается без аргументов, кнопка Submit возвращает введенные данные той же форме. В конце главы рассказывается, как использовать такую возможность.

Работаем с текстовыми полями

Для создания текстового поля, позволяющего вводить текст, используется CGI-метод textfield. В примере ниже создается текстовое поле, предназначен ное для хранения имени пользователя.

#!/usr/local/bin/perl

$co = new CGI;

print

...

"Please enter your name: ",

$co->textfield(`text')

Результат работы кода показан на рис. 18.1.

Чтение данных из элементов управления HTML

Элементы управления созданы (точнее, пока только текстовое поле), но как считать из них данные?

Когда пользователь нажмет на кнопку Submit, броузер отправит данные формы сценарию cgi2.cgi; CGI-метод param в нем как раз и предназначен для чтения данных. Ему достаточно передать имя, присвоенное текстовому полю, в данном случае — 'text' (см. предыдущий раздел), а вывод выполняется следующим образом:

Глава 18. CGI-программирование

#!/usr/local/bin/perl

$co = new CGI;

print "Your name is: ", $co->em($co->param('text')), ".";

Метод em создает метку <EM>, которая большинством броузеров воспринима ется как указание на переход к курсивному начертанию. Результат вы можете видеть на рис. 18.4 в начале главы.

Работаем с текстовыми областями

В отличие от текстовых полей, текстовая область может содержать несколько строк текста. Вот как в cgi1.cgi создается текстовая область, предназначенная для ввода любого мнения пользователя (задается как описание самой области в 10 строк по 60 символов в каждой, так и некоторого текста по умолчанию, а также имени области, 'textarea'):

#!/usr/local/bin/perl

$co = new CGI;

print

...

"Please enter your opinion: ", $co->p,

$co->'textarea'(

-name => 'textarea',

-default => 'No opinion',

-rows => 10,

-columns => 60 )

Результат работы кода показан на рис. 18.2. А во фрагменте, приведенном ниже, CGI-метод param считывает текст и выводит данные анкеты, как показано на рис. 18.4.

print "Your opinions are: ", $co->em($co->param('textarea')), ".";

Работаем с кнопками с независимой фиксацией

Кнопки с независимой фиксацией (checkbuttons) обычно объединяются в группу, что позволяет возвращать имена выбранных элементов управления в одном списке. Во фрагменте кода, приведенном ниже, с помощью CGI-метода checkbox_group как раз и создается такая группа. Ей присваивается имя, кнопки получают подписи, а кроме того, задаются пункты, выбранные по умолчанию при выводе Web-страницы:

#!/usr/local/bin/perl

$co = new CGI;

print

...

"Please indicate what products you use: ",$co->p,

$co->checkbox_group(

-name => 'checkboxes',

 

Работаем с кнопками с зависимой фиксацией

-values => [`Shampoo','Toophpaste','Bread',

`Cruise missiles'],

-defaults => [`Bread','Cruise missiles'] )

Результат работы кода показан на рис. 18.3. Код ниже предназначен для проверки и вывода выбора пользователя (см. рис. 18.5). В данном случае param возвращает список имен помеченных кнопок, поэтому потребовался вызов функции join, объединяющей элементы списка в строку:

print "You use these products: ", $co->em(join(", ",
$co->param('checkboxes'))), ".";

Работаем со списками

Список с готовыми значениями можно прокрутить в случае, когда невозможно одновременно вывести на экран все его строки. Этот элемент управления создается CGI-методом scrolling_list. В сценарии cgi1.cgi список позволяет выбрать уровень доходов. Он называется 'list' и включает строки 'Highest', 'High', 'Medium' и 'Low', причем по умолчанию выбрано 'High':

#!/usr/local/bin/perl

$co = new CGI;

print

...

"Please indicate your income level: ",$co->p,

$co->scrolling_list(

`list',

[`Highest','High','Medium','Low'],

`High', )

Результат работы кода показан на рис. 18.3. Ниже приведен пример чтения и вывода выбранной строки (см. рис. 18.4):

print "Your income level is: ", $co->em($co->param('list')), ".";

Работаем с кнопками с зависимой фиксацией

Кнопки с зависимой фиксацией (radiobuttons) позволяют сделать однозначный выбор из нескольких значений. Например, в cgi1.cgi создается семь таких кнопок, соответствующих семи дням недели. Они объединяются в группу 'radios' и получают значения от '1' до '7', а метки прикрепляются к ним с помощью хэша %labels:

#!/usr/local/bin/perl

$co = new CGI;

$labels{`1'} = `Sunday';

$labels{`2'} = `Monday';

$labels{`3'} = `Tuesday';

$labels{`4'} = `Wednesday';

$labels{`5'} = `Thursday';

продолжение И

$labels{`6'} = `Friday';

$labels{`7'} = `Saturday';

print

...

"Please indicate your day of a week: ", $co->p,

$co->radio_group (

-name=>'radios',

-values=>['1','2','3','4','5','6','7'],

-default=>'1',

-labels=>\%labels )

Результат работы кода показан на рис. 18.3. Ниже приведен пример чтения и печати выбранного элемента, взятый из сценария cgi2.cgi (см. рис. 18.4):

print "Today is day ", $co->em($co->param('radios')), " of the week.";

Работаем с раскрывающимся списком

В HTML раскрывающийся список представляет собой набор элементов, который пользователь может открыть нажатием кнопки, обычно сопровождающийся изображением стрелки вниз. Пользователь может выбрать элемент списка, а вы определить, на чем он остановился. Вот как делается выбор количества непрошеной почты, которое пользователь согласен получать (пример взят из нашей анкеты). Элементы задаются при помощи метода popup_menu:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->popup_menu (

-name => 'popupmenu',

-values => [`Very much','A lot',

'Not so much','None'] )

Результат работы кода показан на рис. 18.3. Далее приведен пример чтения и печати выбора пользователя, взятый из сценария cgi2.cgi (см. рис. 18.4):

print "How much unsolicited mail you like: ", $co->em
($co->param('popupmenu')), ".";

Работаем со скрытыми полями данных

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

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->hidden(-name=>'hiddendata', -default=>'Rosebud'),

 

Закрываем HTML-документ

И вот как вывести эти данные из cgi2.cgi (см. рис. 18.4):

print "The hidden data is: ", $co->em(join(", ",
$co->param('hiddendata'))), ".";

Создаем кнопки отмены и подтверждения

Чтобы отправить на сервер данные формы, пользователь должен нажать кнопку Submit. Она создается CGI-методом submit. Аналогично, кнопка Reset, которая очищает данные формы, создается методом reset. Ниже приведен пример кода, создающий кнопки Submit и Reset на Web-странице, генерируемой сценарием cgi1.cgi:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->center(

$co->submit,

$co->reset,

)

Результат работы кода показан на рис. 18.3. После нажатия на кнопку Submit данные отправляются сценарию cgi2.cgi.

Закрываем HTML-форму

Все элементы управления, описанные в предыдущих разделах этой главы, являются частью одной формы анкеты, созданной в cgi1.cgi. Для открытия формы использовался метод startform, а для ее закрытия — endform:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->endform,

Закрываем HTML-документ

Чтобы завершить работу с HTML-документом, используйте метод end_html, который выводит теги </BODY></HTML>. Вот как заканчивается страница с анкетой в сценарии cgi1.cgi:

#!/usr/local/bin/perl

$co = new CGI;

print

...

$co->end_html;

На этом cgi1.cgi кончается. Обратившись к этому сценарию, вы увидите Web-страницу, показанную на рис. 18.1_18.3. Когда пользователь введет данные и нажмет кнопку Submit, будет вызван сценарий cgi2.cgi, который выведет сводку анкеты (см. рис. 18.4).

Функционально-ориентированное CGI-программирование

До сих пор в этой главе использовались объектно-ориентированные методы. Однако пакет CGI имеет и функционально-ориентированный интерфейс. (Впрочем, при обращении к нему некоторые возможности объектно-ориентированного интерфейса становятся недоступными.) В примере ниже используется функционально-ориентированный интерфейс пакета CGI. Код генерирует текстовое поле с предложением ввести имя пользователя. После нажатия на кнопку Submit данные возвращаются к тому же CGI-сценарию, который с помощью функции param выводит введенное имя в нижней части Web-страницы:

#!/usr/local/bin/perl

use CGI qw/:standart/;

print header,

start_html('CGI Functions Example'),

h1('CGI Functions Example'),

start_form,

"Please enter your name: ",textfield('text'),p,

submit,reset,

end_form,

hr;

if(param()) {

print "Your name is: ", em(param('text')), hr; }

print end_html;

Результат этого сценария показан на рис. 18.6.

Рис. 18.6. Функционально-ориентированый CGI-сценарий