Wisconsin | Lake Geneva | Madison |
Superlor /TABLE>
Те же результаты можно получить всего одной командой print, хотя это несколько сложнее, поскольку вам придется создавать неявный цикл с помощью тар. Следующая команда print выдает результат, идентичный приведенному выше:
print table
caption('Cities I have Known'),
Tr(th [qw(State Cities)]),
map { Tr(th($_), td( [ sort @{$hash{$_}} ] )) } sort keys %hash;
Эти функции особенно удобны при форматировании результатов запроса к базе данных, как показано в примере 19.3 (см. главу 14 "Базы данных").
Пример 19.3. salcheck
#!/usr/bin/perl
# salcheck - проверка жалованья
use DBI;
use CGI qw(:standard :html3);
$limit = param("LIMIT");
print header(), start_html("Salary Query"), h1("Search"), start_form(),
p(Enter minimum salary", textfield("LIMIT")), submitO, end_form();
if (defined $limit) {
$dbh = DBI->connect("dbi:mysql:somedb:server.host.dom:3306",
"username", "password")
or die "Connecting: $DBI::errstr";
$sth = $dbh->prepare("SELECT name,salary FROM employees
WHERE salary > $limit")
or die "Preparing: ", $dbh->errstr;
$sth->execute
or die "Executing: ", $sth->errstr;
print h1("Results"), "'
while (Orow = $sth->fetchrow()) { print Tr( td( \@row ) );
}
print " /TABLE>\n' $sth->finish;
$dbh->disconnect;
}
print end_html()
[> Смотри также
Документация по стандартному модулю CGI; рецепт 14.10.
Проблема
Требуется сообщить клиентскому броузеру о том, что страница находится в другом месте.
Решение
Вместо обычного заголовка выведите перенаправление и завершите программу. Не забудьте о дополнительной пустой строке в конце заголовка:
$url = "http://www.perl.com/CPAN/";
print "Location: $url\n\n";
exit;
Комментарий
Иногда программа CGI не генерирует документ сама. Она лишь сообщает клиенту о том, что ему следует получить другой документ. В этом случае заголовок HTTP содержит слово Location, за которым следует новый URL. Обязательно используйте абсолютный, а не относ
Прямолинейного решения, показанного выше, обычно вполне хватает. Но если модуль CGI уже загружен, воспользуйтесь функцией redirect. В примере 19.4 эта возможность применяется при построении cookie.
Пример 19.4. oreobounce
#!/usr/bin/perl -w
# oreobounce - установить cookie и перенаправить броузер
use CGI qw(:cgi);
$oreo = cookie( -NAME => 'filling',
-VALUE => "vanilla creme",
-EXPIRES => '+3M', ff M - месяц, m - минута
-DOMAIN => '.perl.corn'):
$whither = "http://somewhere.perl.com/nonesuch.html";
print redirect( -URL => $whither,
-COOKIE => $oreo);
Результат выглядит так:
Status: 302 Moved Temporarily Set-Cookie: filling=vanilla!l!20crXE4n'ie; domain=.perl.corn;
expires=Tue, 21-Jul-1998 11:58:55 GMT Date: Tue, 21 Apr 1998 11:55:55 GMT Location: http://somewhere.perlcom/nonesuch.html Content-Type: text/html B"blank line here"
В примере 19.5 приведена закопченная программа, которая определяет имя клиентского броузера и перенаправляет его на страницу "Файла жаргона" Эрика Реймонда, где говорится о соответствующей операционной системе. Кроме того, в программе хорошо продемонстрир
Пример 19.5. os_snipe
#!/usr/bin/perl
# os_snipe - перенаправить в статью Файла жаргона,
# посвященную текущей операционной системе
$dir = "http://www.wins.uva.nl/%7Emes/jargon";
for ($ENV{HTTP_USER_AGENT}) {
$page = /Mac/ && "m/Macintrash.html"
|| /Win(dows )?NT/ && "e/evilandrude.html"
|| /Win|MSIE|WebTV/ && "m/MicroslothWindows.html"
|| /Linux/ && "1/Linux.html"
|| /HP-UX/ && "h/HP-SUX.html"
|| /SunOS/ && "s/ScumOS.html"
|| "a/AppendixB.html'
}
print "Location: $dir/$page\n\n'
В программе os_snipe использовано динамическое перенаправление, поскольку разные пользователи отсылаются на разные страницы. Если перенаправление всегда ведет к одному месту, разумнее включить статическую строку в конфигурационный файл сервера - это о
Сообщить клиентскому броузеру, что вы не собираетесь выдавать никаких данных - далеко не то же самое, что перенаправить его "в никуда":
use CGI qw(:standard);
print header( -STATUS => "204 No response" ):
Результат выглядит так:
Status: 204 No response Content-Type: text/html
Например, этот вариант используется в ситуации, когда от пользователя приходит запрос, а вы не хотите, чтобы его страница изменилась или даже просто обновилась.
Выглядит немного глупо - сначала мы указываем тип содержимого, а потом говорим, что содержимого не будет, - но модуль поступает именно так. При ручном кодировании это бы не понадобилось.
#!/bin/sh
cat "EOCAT Status: 204 No response
EOCAT
> Смотри также -------------------------------
Документация по стандартному модулю CGI.
Проблема
Сценарий CGI странно ведет себя с броузером. Вы подозреваете, что в заголовке HTTP чего-то не хватает. Требуется узнать, что именно броузер посылает серверу в заголовке HTTP.
Решение
Создайте фиктивный Web-сервер (см. пример 19.6) и подключитесь к нему в своем броузере.
Пример 19.6. dummyhttpd
#!/usr/bin/perl -w
# dummyhttpd - запустить демона HTTP и выводить данные,
# получаемые от клиента
use strict;
use HTTP::Daemon; и Требуется ШР-5.32 и выше
my $server = HTTP::Daemon->new(Timeout => 60);
print "Please contact me at: url, ">\n";
while (my Sclient = $server->accept) { CONNECTION:
while (my $answer = $client->get_request) { print $answer->as_string;
$client->autoflush;
RESPONSE:
while () {
last RESPONSE if $_ eq ".\n";
last CONNECTION if $_ eq "..\iT print $client $_;
} print "\nEOF\n";
}
print "CLOSE: ", $client->reason, "\n";
$client->close;
undef $client;
}
Комментарий
Трудно уследить за тем, какие версии тех или иных броузеров все еще содержат ошибки. Фиктивная программа-сервер может спасти от многодневных напряженных раздумий, поскольку иногда неправильно работающий броузер посылает серверу неверные данные. На своем о
Фиктивный сервер лучше всего запускать на том же компьютере, что и настоящий. При этом броузер будет отправлять ему все cookies, предназначенные для этого домена. Вместо того чтобы направлять броузер по обычному URL:
http://somewhere.com/cgi-bin/whatever
воспользуйтесь альтернативным портом, указанным в конструкторе new. При использовании альтернативного порта необязательно быть привилегированным пользователем, чтобы запустить сервер.
http://somewhere.com:8989/cgi-bin/whatever
Если вы решите, что клиент ведет себя правильно, и захотите проверить сервер, проще всего воспользоваться программой telnet для непосредственного общения с удаленным сервером.
% telnet www.perl.com 80
GET /bogotic HTTP/1.0
HTTP/1.1 404 File Not Found
Date: Tue, 21 Apr 1998 11:25:43 GMT
Server: Apache/1,2.4
Connection: close
Content-Type: text/html
TITLE 404 File Not Found /TITLE
File Not Found
The requested URL /bogotic was not found on this server,
Если в вашей системе установлены модули LWP, вы сможете использовать синоним GET для программы Iwprequest. При этом будут отслеживаться все цепочки перенаправлений, что может пролить свет на вашу проблему. Например:
% GET -esuSU http://mox.perl.com/perl/bogotic
GET http://language.perl,com/bogotic Host: mox.perl.com User-Agent: lwp-request/1.32
GET http://mox.perl.com/perl/bogotic -> 302 Moved Temporarily
GET http://www.perl.com/perl/bogotic -> 302 Moved Temporarily
GET http://language.perl.com/bogotic -> 404 File Not Found
Connection: close
Date: Tue, 21 Apr 1998 11:29:03 GMT
Server: Apache/1.2.4
Content-Type: text/html
Client-Date: Tue, 21 Apr 1998 12:29:01 GMT
Client-Peer: 208.201.239.47:80
Title: Broken perl.corn Links
An Error Occurred
BODY
H1 An Error Occurred /h1
404 File Not Found
> Смотри также --------------------------------
Документация по стандартному модулю CGI; рецепт 14.10.
|
© copyright 2000 Soft group |
| |
Используются технологии uCoz
|
---|