Создание Web-страницы.
#!/usr/local/bin/perl
use CGI;
$co = new CGI;
print $co->header, $co->start_html(-title=>'CGI Example'),
$co->center($co->h1('Welcome to CGI!')),
$co->textarea (
-name => 'textarea',
-default => 'No opinion',
-rows => 10,
-columns => 60 ),
$co->end_html;
Если возможности объектно-ориентированного интерфейса не требуются, пакет CGI.pm также поддерживает простой функционально-ориентированный интерфейс. Мы рассмотрим пример применения функционально-ориентированного интерфейса CGI.pm ниже.
Создание и использование элементов управления HTML.Изучать программирование лучше всего на примерах. Потому ниже приводятся два CGI-сценария: один создает Web-страницу с элементами управления — полями ввода текста, переключателями, кнопками, включая Submit, а второй читает данные, введенные пользователем на этой странице. Оба сценария — вариации с небольшими дополнениями на тему оператора print, который собственно и создает страницу.
Первый сценарий хранится в файле cgil.pl, и в справочных целях полностью приводится в листинге 6-7. Когда пользователь открывает сценарий в броузере (переходя по его адресу — например, http://www.yourserver.com/user/cgi/cgil.pl), сценарий возвращает страницу с элементами управления HTML и текстом. В данном случае это страница анкеты.
Страница содержит приветствие и сообщение о том, что посетители, не желающие заполнять анкету, могут перейти по ссылке на сервер CPAN (Comprehensive Perl Archive Network — всеобъемлющий архив, посвященный языку Perl).
Затем вы увидите запрос имени пользователя с текстовым полем и вопрос о его мнении с областью редактирования текста (многострочное текстовое поле).
Просматривая анкету дальше, вы увидите еще несколько элементов управления — кнопки с зависимой и независимой фиксацией, списки, а также кнопка подтверждения и очистки анкеты. Позже мы рассмотрим, как создать все эти элементы управления на примере предложенных сценариев. Когда пользователь нажимает на кнопку Submit, расположенную в конце анкеты, броузер собирает данные, введенные на странице, и передает их другому CGI-сценарию, cgi2.pl. В справочных целях он приведен в листинге 6-8.
В общем, нет никакой необходимости создавать CGI-сценарий, генерирующий анкету, — можно просто написать страницу HTML, которая будет вызывать cgi2.pl по нажатию пользователем кнопки Submit. Подход, требующий генерации кода, выбран лишь затем, чтобы продемонстрировать обе стороны процесса — как создать элементы управления HTML из CGI-сценария и как прочесть данные из этих элементов управления.
Листинг 5.7. cgi1.pl
#!/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(-charset=>'windows-1251', -lang=>'ru'),
$co->start_html(
-title => 'CGI Example',
-author => 'Andrew',
-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 interested in ",
$co->a({href=>"http://www.cpan.org/"},"CPAN"),".",
$co->hr, $co->startform(
-method=>'POST',
-action=>'http://inna/scripts/web/l6/e8.pl'),
"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('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;
Листинг 5.8.cgi2.pl
#!/usr/local/bin/perl
use CGI; $co = new CGI;
print $co->header(-charset=>'windows-1251', -lang=>'ru'),
$co->start_html(
-title => 'CGI Example',
-author => 'Andrew',
-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('text')), ".", $co->p, "Your opinions are: ",
$co->em($co->param('textarea')), ".",$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')), "</em> 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;
Начинаем HTML-документ.Начало работы над документом HTML строится следующим образом. Вначале вы создаете CGI объект, затем с помощью метода headerэтого объекта — HTTP-заголовок (в данном примере создается простая шапка документа, но допустимы сколь угодно сложные шапки с любыми атрибутами, например, -charset=>'windows-1251'). Заголовок можно сформировать и самостоятельно, напимер, командой print. Метод start_htmlначинает сам документ HTML. Этот метод создает секцию <HEAD>,а также позволяет указать некоторые атрибуты <BODY>, как-то: цвет для изображения фона и ссылок. Ниже приведен фрагмент кода cgil.pl, открывающий страницу. Обратите внимание: чтобы результаты работы методов header и start_htmlпопали на страницу, необходимо использовать функцию print:
#! /usr/local/bin/perl
$со = new CGI,
print $co->header,
$co->start_html(
-title => 'CGI Example',
-author => 'Andrew',
-meta => {'keywords'=>'CGI Perl'},
-BGCOLOR => 'white',
-LINK => 'red' )
Создаем заголовки HTML.После создания шапки CGI-методы типа h1, h2, h3 и др. помогут создать заголовки, соответствующие тегам <Н1>, <Н2>, <НЗ>и т. д. Ниже приведен фрагмент кода, генерирующий заголовки <Н1> и <Н2>в начале Web-страницы с анкетой. В данном случае это простое приглашение пользователю.
#!/usr/local/bin/perl
$со = new CGI; print
$co->h1('Here is the Survey!,'),
$co->h2('Please fill out survey...')
Центрируем элементы.Чтобы центрировать текст с помощью тегов <CENTER>,используется CGI-метод center.В следующем примере центрируется заголовок, созданный в предыдущем примере:
#'/usr/local/bin/perl
$со = new CGI; print
$co->center($co->h1('Here is the Survey!')),
$co->h2('Please fill out survey...'),
Создаем маркированный список.CGI-методы ul и li создают несортированный маркированный список (теги <UL> и <LI>соответственно). Ниже приведен фрагмент кода, представляющий пользователю несколько аргументов, побуждающих заполнить анкету:
#!/usr/local/bin/perl
$со = new CGI; print "Reasons for filling out our survey:",
$co->p, $co->ul(
$co->li('Fame'), $co->li('Fortune '), $co->li('Fun'), )
Создаем гиперссылку.Гиперссылки помещаются на страницу CGI-методом а, как в примере ниже, где выводится URL для перехода (на случай, если пользователь не заинтересован в заполнении анкеты, созданной сценарием cgil.pl):
#!/usr/local/bin/perl
$со = 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"), ". "
Создаем горизонтальную полосу.Для создания горизонтальной линии (метка <HR>)используется CGI-метод hr:
#!/usr/local/bin/perl
$со = new CGI; print
$co->hr
Создаем HTML-форму.Элементы управления HTML группируются в формы. В примере с анкетой для создания формы использовался GGI-метод startform.После нажатия кнопки Submit данные из элементов управления должны быть прочитаны и переданы сценарию, формирующему сводку данных, то есть cgi2.pl. URL этого сценария указывается в атрибуте actionформы:
#!/usr/local/bin/perl $со = new CGI; print
$co->startform(
-method=>'POST',
-action=>'http://www.yourself.com/user/cgi/cgi2.pl')
#$co->startform()
Все последующие элементы управления будут включены в форму, потому что метод startformгенерирует тег <FORM>.
Замечание. Если startform вызывается без аргументов, кнопка Submit возвращает введенные данные той же форме. Ниже рассказывается, как использовать такую возможность.
Работаем с текстовыми полями.Для создания текстового поля, позволяющего вводить текст, используется CGI-метод textfleld.В примере ниже создается текстовое поле, предназначенное для хранения имени пользователя.
#!/usr/local/bin/perl
"Please enter your name: ' ,
$co->textfield('text')
Чтение данных из элементов управления HTML.Элементы управления созданы (точнее, пока только текстовое поле), но как считать из них данные? Когда пользователь нажмет на кнопку Submit, броузер отправит данные формы сценарию cgi2.pl; CGI-метод paramв нем как раз и предназначен для чтения данных. Ему достаточно передать имя, присвоенное текстовому полю, в данном случае — 'text'(см. предыдущий раздел), а вывод выполняется следующим образом:
#!/usr/local/bin/perl
$co = new CGI;
print "Your name is: ", $co->em($co->param( 'text')), ".";
Метод emсоздает метку <ЕМ>,которая большинством броузеров воспринимается как указание на переход к курсивному начертанию.
Работаем с текстовыми областями.Текстовая область может содержать несколько строк текста. Вот как в cgil.pl создается текстовая область, предназначенная для ввода любого мнения пользователя (задается как описание самой области в 10 строк по 60 символов в каждой, так и некоторого текста по умолчанию, а также имени области, 'textarea'):
#!/usr/local/bin/perl
$со = new CGI; print "Please enter your opinion; ", $co->p,
$co->' textarea' (
-name => 'textarea',
-default => 'No opinion',
-rows => 10,
-columns => 60 )
А во фрагменте ниже, CGI-метод paramсчитывает текст и выводит данные анкеты:
print "Your opinions are: ", $co->em($co->param('textarea')), ".";
Работаем с кнопками с независимой фиксацией.Кнопки с независимой фиксацией (checkbuttons) обычно объединяются в группу, что позволяет возвращать имена выбранных элементов управления в одном списке. Во фрагменте кода, приведенном ниже, с помощью CGI-метода , checkbox_groupкак раз и создается такая группа. Ей присваивается имя, кнопки получают подписи и задаются пункты, выбранные по умолчанию при выводе Web-страницы:
#!/usr/local/bin/perl $со = new CGI; print
"Please indicate what products you use. ",$co->p,
$co->checkbox_group(
-name => 'checkboxes',
-values => ['Shampoo', 'Toothpaste', 'Bread', 'Cruise missiles'],
-defaults => ['Bread', 'Cruise missiles'] )
Код ниже предназначен для проверки и вывода выбора пользователя. В данном случае paramвозвращает список имен помеченных кнопок, поэтому потребовался вызов функции join, объединяющей элементы списка в строку:
print "You use these products: ", $co->em(join(", ", $co->param('checkboxes'))),
Работаем со списками.Список с готовыми значениями можно прокрутить в случае, когда невозможно одновременно вывести па экран все его строки. Этот элемент управления создается CGI-методом scrolling_list.В сценарии cgil.pl список позволяет выбрать уровень доходов. Он называется 'list'и включает строки 'Highest', 'High', 'Medium'и 'Low',причем по умолчанию выбрано 'High':
#! /usr/local/bin/perl
$со = new CGI; print "Please indicate your income level: ",$co->p,
$co->scrolling_list('list',
['Highest', 'High', 'Medium', 'Low'], 'High', )
Ниже приведен пример чтения и вывода выбранной строки:
print "Your income level is: ", $co->em($co->param('list')), ".";
Работаем с кнопками с зависимой фиксацией.Кнопки с зависимой фиксацией (radiobuttons) позволяют сделать однозначный выбор из нескольких значений. Например, в cgil.pl создается семь таких кнопок. Они объединяются в группу 'radios'и получают значения от '1' до '7', а метки прикрепляются к ним с помощью хэша %labels:
#!/usr/local/bin/perl
$со = 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 )
Ниже приведен пример чтения и печати выбранного элемента, взятый из сценария cgi2.pl:
print "Today is day ', co->param('radios'), " of the week.";
Работаем с раскрывающимся списком.В HTML раскрывающийся список представляет собой набор элементов, который пользователь может открыть нажатием кнопки, обычно сопровождающийся изображением стрелки вниз. Пользователь может выбрать элемент списка, а вы - определить, на чем он остановился. Вот как делается выбор количества непрошеной почты, которое пользователь согласен получать (пример взят из нашей анкеты). Элементы задаются при помощи метода popup_menu:
#!/usr/local/bin/perl
$со = new CGI; print
$co->popup_menu (
-name => 'popupmenu',
-values => ['Very much', 'A lot','Not so much', 'None'] )
Далее приведен пример чтения и печати выбора пользователя, взятый из сценария cgi2.pl:
print "How much unsolicited mail you like",
$co->param('popupmenu');
Работаем со скрытыми полями данных.Данные, хранящиеся в скрытом поле на Web-странице, невидимы для пользователя. (Это удобно, когда сценарий ожидает получить некоторые неизменные сведения о странице.) Такие поля создаются следующим образом:
#!/usr/local/bin/perl
$со = new CGI; print
$co->hidden(-name=>'hiddendata', -default=>'Rosebud'),
И вот как вывести эти данные из cgi2.pl:
print "The hidden data is: ",
join(", ", $co->param('hiddendata'));
Создаем кнопки отмены и подтверждения.Чтобы отправить на сервер данные формы, пользователь должен нажать кнопку Submit. Она создается CGI-методом submit.Аналогично, кнопка Reset, которая очищает данные формы, создается методом reset.Ниже приведен пример кода, создающий кнопки Submit и Reset на Web-странице:
#!/usr/local/bin/perl
$со = new CGI; print
$co->center(
$co-> submit(-value=>'Отправить'),
$co->reset(-value=>'Отмена'))
После нажатия на кнопку Submit данные отправляются сценарию cgi2.pl.
Закрываем HTML-форму.Все элементы управления, описанные ранее, являются частью одной формы анкеты, созданной в cgil.pl. Для открытия формы использовался метод startform,а для ее закрытия — endform:
#!/usr/local/bin/perl
$со = new CGI; print
$co->endform,
Закрываем HTML-документ.Чтобы завершить работу с HTML-документом, используйте метод end_html,который выводит теги </BODY></HTML>.Вот как заканчивается страница с анкетой в сценарии cgil.pl:
#!/usr/local/bin/perl $со = new CGI;
$co->end_html;
На этом cgil.pl кончается. Когда пользователь введет данные и нажмет кнопку Submit, будет вызван сценарий cgi2.pl, который выведет сводку анкеты.
Функционально-ориентированное CGI-программирование.До сих пор мы использовали объектно-ориентированные методы. Однако пакет CGI имеет и функционально-ориентированный интерфейс (Впрочем, при обращении к нему некоторые возможности объектно-ориентированною интерфейса становятся недоступными). В примере ниже используется функционально ориентированный интерфейс пакета CGI. Код генерирует текстовое поле с предложением ввести имя пользователя. После нажатия на кнопку Submit данные возвращаются к тому же CGI-сценарию, который с помощью функции рагаmвыводит введенное имя в нижней части Web-страницы:
Листинг 5.9. Функционально ориентированный интерфейс пакета CGI.
#!/usr/local/bin/perl
use CGI qw/:standard/;
print header(-charset=>'windows-1251', -lang=>'ru'),
start_html(' CGI Functions Example' ),h1('CGI Functions Example'),
start_form, "Please enter your name: ", textfield('text'), p,
submit(-value=>'Отправить'), reset(-value=>'Отмена'), end_form,hr;
if(param()) {print "Your name is: ",em(param('text')), hr;}
print end_html;
Использование cgi-lib.pl.Ранее рассказывалось о CGI-программировании на базе методов стандартного модуля CGI.pm. He менее популярен среди программистов пакет cgi-lib.pl. Поскольку многие CGI-сценарии на Perl написаны с его помощью, далее рассказывается именно о нем. Авторские права на этот пакет принадлежат его создателю Стивену Е. Бреннеру, на домашней странице которого (http://cgi-lib.stanford.edu/cgi-lib) можно получить копию cgi-lib.pl. Вам разрешается работать с cgi-lib.pl и даже изменять его до тех пор, пока ваши действия не будут ущемлять описанные в начале файла авторские права. Особая процедура установки не требуется — файл cgi-lib.pl копируется в каталог, где хранятся CGI-сценарии, и с помощью команды require подключается к ним:
require 'cgi-lib.pl';
Если у вас нет этого пакета - просто используйте модуль CGI.pm в таком контексте:
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;
Далее создаются два сценария, генерирующие те же страницы, что и в предыдущей главе, но вместо CGI.pm на сей раз будет использован пакет cgi-lib.pl. Предыдущие сценарии назывались cgil.pl и cgi2.pl, а в этой речь пойдет о libl.pl и lib2.pl.
Пакет cgi-lib.pl подключается к сценарию с помощью команды require. (He запрещено использовать также use, но вряд ли вам встретится такой вариант.) В отличие от модуля CGI.pm, количество функций, генерирующих теги HTML в cgi-lib.pl, крайне ограничено. Обычно эти теги приходится выводить вручную. (Пакет cgi-lib.pl предназначался в первую очередь для разбора посланных сценарию данных.) Впрочем, некоторые теги HTML все же генерируются автоматически: подпрограмма PrintHeader создает шапку HTML, необходимую для страницы, раздел HtmlTop (метки <HEAD> и <BODY>). Также с ее помощью можно создать заголовок страницы, как показано в следующем примере, задающем страницу с заголовком "My Web Page":
#!/usr/local/bin/perl
require 'cgi-lib. рl';
print &PrintHeader;
print &HtmlTop ("My Web Page");
После описания начала страницы остальная разметка HTML (в том числе формы) создается путем непосредственного вывода тегов. Например, вот так задается заголовок <Н1>:
print "<CENTER><H1>Hello!</H1></CENTER>";
Чтобы прочитать данные, переданные CGI-сценарию, используется подпрограмма ReadParse. Она создает хэш (обычно называемый %in) и записывает в него значения элементов данных, переданных сценарию. Элементы данных адресуются по именам, присвоенным соответствующим элементам HTML. Например, следующий код создает хэш %in и, читая данные текстового поля 'text', выводит их:
&ReadParse(*in);
print "Here is the text: <EM>", $in('text'), "</EM>.";
Чтобы завершить Web-страницу метками HTML </BODY> и </HTML>, можно использовать подпрограмму HtmlBot (она просто возвращает строку "</BODY>\n</HTML>\n"):
print &HtmlBot;
Вот так, вкратце, и работает cgi-lib.pl.
Lib1.pl
#!/usr/local/bin/perl
#require 'cgi-lib.pl';
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
print "<BODY BGCOLOR=\ white\ LINK=\ red\><p>
<CENTER><H1>Here is the Survey!</H1></CENTER>
<H2>Please fill out our survey</H2>
Reasons for filling out our 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://inna/scripts/web/l6/lib2.pl\"
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 products you use <P>
<INPUT TYPE=\"checkbox\" NAME=\"checkboxes\"VALUE=\"Shampoo\"> Shampoo
<INPUT TYPE=\"checkbox\" NAME=\"checkboxes\"VALUE=\"Toophpaste\"> 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
<OPTION SELECTED VALUE=\"High\">High
<OPTION VALUE=\"Medium\">Medium
<OPTION VALUE=\"Low\">Low
</SELECT><P>
Please indicate your 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 mail 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></FORM>";
print &HtmlBot;
Листинг 5.11. lib2.pl
#!/usr/local/bin/perl
#require 'cgi-lib.pl';
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, SplitParam/;
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
print "<BODY BGCOLOR=\white\ LINK=\ red\><p>
<CENTER><H1>Thank you for filling out our survey.</H1></CENTER>
<H3>Here are your responses...</H3>";
if (&ReadParse(*in)) {print "Your name is: <EM>", $in{'text'},
"</EM>.", "<p>","Your opinions are. <EM>", $in{'textarea'},
"</EM>.","<p>", "You use these products. <EM>",
join(", ", &SplitParam($in{'checkboxes'})), "</EM>.<p>",
"Your income level is: <EM>",$in{'list'},
"</EM>.<p>Today is day <EM>", $in{'radios'},
"</EM> of the week.<p>","How much uncolicited mail you like<EM>",
$in{'popupmenu'}, "</EM>.", "<p>",
"The hidden data is <EM>", $in{'hiddendata'}, "</EM>."; }
print &HtmlBot;
Какие подпрограммы входят в состав cgi-lib.pl?Вот их список:
CgiDie — как и CgiError, печатает сообщение об ошибке и, кроме того, останавливает программу.
CgiError — печатает сообщение об ошибке, используя стандартные заголовки и HTML-код.
HtmlBot — возвращает строку"</BODY>\n</HTML>\n".
HtmlTop — возвращает раздел <HEAD> документа HTML и открывает раздел <BODY>. Необязательный строковый параметр используется в качестве названия Web-страницы: добавляется тег HTML <H1> с этим названием.
MethGet — возвращает значение истина, если текущий вызов CGI сделан при помощи метода GET. В противном случае возвращается значение ложь.
MethPost — возвращает значение истина, если текущий вызов CGI сделан при помощи метода POST. В противном случае возвращается значение ложь.
MyBaseUrl — возвращает базовый адрес (base URL) CGI-сценария, без дополнительного пути или строк запроса.
MyFullUrl — возвращает базовый адрес (base URL) CGI-сценария, включая дополнительный путь и строки запроса.
PrintEnv — форматирует и печатает переменные среды, доступные сценарию.
PrintHeader — возвращает строку "Content-type: text/html\n\n". С нее должны начинаться все Web-страницы, создаваемые cgi-lib.pl.
PrintVariables — форматирует и печатает значения данных. Ей передается хэш или запись таблицы символов (для вывода элементов соответствующего массива). Без аргументов PrintVariables выводит содержимое хэша %in.
ReadParse — основная подпрограмма библиотеки cgi-lib.pl. Она читает и разбирает данные, переданные CGI-сценарию методами GET или POST. Обычно она используется для создания хэша %in: ей передается запись таблицы символов *in. Хэш содержит данные, переданные сценарию, упорядоченные по именам соответствующих элементов управления. Необязательные второй, третий и четвертый параметры указывают на то, что надо заполнить соответствующие хэши данными из принятых файлов.
SplitParam — разбивает параметр, содержащий несколько значений, на список из единичных параметров. Эта подпрограмма предназначена для работы с элементами HTML, способными хранить несколько значений, — например, группой кнопок.
Начинаем документ HTML.Прежде всего, необходимо подключить пакет cgi-lib.pl. HTTP-заголовок ("Content-type: text/html\n\n") обычно генерируется функцией PrintHeader. Секции <HEAD> и <BODY> создает подпрограмма HtmlTop. Ее необязательный строковый аргумент используется в качестве названия Web-страницы и вставляется в начало страницы как заголовок первого уровня. Пример (lib1.pl):
#!/usr/local/bin/perl
require 'cgi-lib.pl';
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
Если для тега <BODY> требуется задать дополнительные атрибуты, их выводят вручную:
print "<BODY BGCOLOR=\ white\ LINK=\ red\><p>";
Подсказка. Конечно же, можно пропустить HtmlTop и создать собственные <HEAD> и <BODY>, выводя теги HTML со всеми необходимыми атрибутами.
Файл cgi-lib.pl не имеет специальных подпрограмм для создания разметки HTML, поэтому почти все, что требуется, приходится выводить вручную.
Читаем данные из элементов управления HTML.Для чтения данных из различных элементов управления в cgi-lib.pl предназначена подпрограмма ReadParse. Обычно создается хэш %in, с данными, полученными от элементов управления. Он адресуется по именам элементов. Например, в листинге 6-8 мы задавали текстовое поле с именем text. Вот как создается хэш %in и выводятся данные, полученные от элемента управления:
require 'cgi-lib.pl';
if (&ReadParse(*in)) {print "Your name is: ", $in{'text'}, "<p>";}
Обратите внимание: значение ReadParse проверяется до обращения к хэшу %in. Если ReadParse возвращает значение ложь, значит, получить данные не удалось.
Работаем с текстовыми областями.Содержимое текстовой области выводится так:
if (&ReadParse(*in)) {print "Your opinions are: ",
$in{'textarea'};};
Работаем с кнопками с независимой фиксацией.Когда данные группы кнопок будут переданы сценарию lib2.pl, $in('checkboxes') возвратит строку с несколькими значениями. Подпрограмма SplitParam пакета cgi-lib.pl делает из этой строки список:
if (&ReadParse(*in)) { print 'You use these products: ",
join(", ", &SplitParam($in{'checkboxes'}));}
Работаем со списками. Вот как lib2.pl читает и выводит на экран данные, выбранные пользователем из списка:
if (&ReadParse(*in)) {print "Your income level is: ",$in{'list'};}
Работаем с кнопками с зависимой фиксацией. Сценарий lib2.pl проверяет, какая кнопка была выбрана, и выводит ее значение:
if (&ReadParse(*in)) {print "Today is day", $in{'radios'};}
Работаем с раскрывающимися списками.Сценарий lib2.pl проверяет выбор пользователя и выводит его на экран:
if (&ReadParse(*in)) {print 'How much unsolicited mail you like:",
$in{ 'popupmenu'}, "<p>";}
Работаем со скрытыми полями данных.Вот часть кода lib2.pl, читающая текст из скрытого элемента управления и выводящая его на экран:
if (&ReadParse(*in)) {print "The hidden data is ",
$in{'hiddendata'};}
Завершаем документ HTML.Подпрограмма HtmlBot пакета cgi-lib.pl закрывает Web-страницу. Она возвращает строку "</BODY>\n</HTML>\n":
print &HtmlBot;
Часто эта строка оказывается последней в сценарии, как и в lib1.pl с lib2.pl.
Выводим все переменные.В этих примерах значения данных, переданных элементами управления HTML, выводились непосредственно оператором print. Но это можно сделать и проще: то же самое делает подпрограмма PrintVariables, но только в фиксированном формате. Например, можно заменить lib2.pl кодом, приведенным ниже:
Листинг 5.12. Вывод всех переменных.
#!/usr/local/bin/perl
#require 'cgi-lib рl';
use CGI qw/:ReadParse, PrintHeader, HtmlTop, HtmlBot, Vars/;
print &PrintHeader;
print &HtmlTop ("CGI Example Using cgi-lib.pl");
if (&ReadParse(*in)) { print &Vars; } print &HtmlBot;
Все данные, переданные lib2.pl, действительно есть, но не сопровождаются пояснительным текстом. PrintVariables полезна при отладке, но вряд ли нужна в завершенном проекте.
Примеры приложений.
Огромное количество CGI-сценариев на языке Perl уже доступно в Интернете и готово к использованию. Вот список нескольких полезных источников (проверяйте каждый такой сценарий на защищенность, а также на предмет наличия любых других проблем):
· архив Ясона (Jason's Perl Archive) — www.aquapal.co.uk/perl/perl.html;
· архив сценариев Мэтта (Matt's Script Archive) — www.worldwidemart.com/ scripts/;
· архив фирмы Yahoo! (Yahoo Perl Scripts) — dir.yahoo.com/Computers_And_-Internet/ProgrammingLanguages/Perl/Scripts/;
· страница ссылок и сценариев на Perl, принадлежащая Дэйлу Бьюли (Dale Bewley's Perl Scripts and Links), — www.bewley.net/perl/;
· страничка на www.perl.com, посвященная CGI, — reference.perl.com/query.cgi?cgi.
· русскоязычный сайт, посвященный Perl - www.perl.ru.
Когда вы начнете писать сценарии, которые делают больше, чем простенькие предыдущие, проблема защиты станет актуальной. Это одна из тем, которая будет обсуждаться далее.
Защита CGI.Обеспечение безопасности всегда было серьезной проблемой. В наши дни она еще более актуальна, так как но мере развития операционных систем становится все сложнее и сложнее затыкать бреши в защите. Поэтому на Unix-системах CGI-сценарии обычно запускаются от имени идентификатора пользователя "nobody" («никто»). Такой процесс имеет минимум привилегий. Считалось, что процесс, имеющий минимум привилегий, принесет меньше вреда. Однако и по сей день могут возникать проблемы — в частности, из-за неаккуратности в CGI-сценариях. Ниже рассказывается, как обойти некоторые наиболее вероятные неприятности.
Вот несколько Web-страниц, посвященных безопасности CGI, которые я рекомендовал бы прочитать до того, как вы начнете создавать для широкого использования что-либо серьезнее простейших CGI-сценариев:
страница WWW-консорциума, посвященная безопасности CGI (The World Wide Web Consortium's CGI security page), — www.w3.org/Security/Faq/ www-security-faq.html;
часть сборника вопросов и ответов (FAQ) по CGI-программированию на Perl, посвященная проблемам безопасности, - www.perl.com/CPAN-local/doc/ FAQs/cgi/perl-cgi-faq.html;
страничка Селены Сол (Selena Sol), рассказывающая, как вы рискуете при установке чужих сценариев — Stars.com/Authoring/Scripting/Sequrity;
Следующий шаг — непосредственное изучение кода. В примерах вы найдете информацию о безопасности и о том, как писать CGI-сценарии для счетчиков и гостевых книг.
Дата добавления: 2015-11-04; просмотров: 911;