Платформы корпоративных информационных систем

         

Сохранение состояния в сценарии CGI



Пример 9-4. Сохранение состояния в сценарии CGI

#!/usr/bin/perl -w

use CGI;

open(F,"/usr/dict/words") or die("He могу открыть! $!");
#Это файл, который будет выводиться, может быть любым.

$output = new CGI;

sub print_range { # Это главная функция программы, my $start = shift;
# Начальная строка файла, my $count = 0;
# Указатель, my $line = "";
# Текущая строка файла, print $output->header,
$output->start_html('Moй словарь');
# Создает HTML с заголовком 'Мой словарь', print "<pro>\n";



while (($count < $start) and ($line = <F>)) { $count++; }
# Пропустить все строки перед начальной, while (($count < $start+10) and ($line ? <F>) ) { print $line; $count++; }
# Напечатать очередные 10 строк.

my $newnext = $start+10; my $newprev = $start-10;

# Установить начальные строки для URL 'Next' и 'Previous',
print "</pre><p>";

unless ($start == 0) { # Включить URL 'Previous', если только вы

# уже не в начале .

print qq%<a href="read.cgi?start=$newprev">Previous</a>%; }

unless (eof) { # Включить URL 'Next', если только вы # не в конце файла.

print qq% <a href="read.cgi?start=$newnext">Next</a>%;

}

print «HTML; </body><html> HTML

exit(0); }

# Если данных нет, начать сначала,
if (not $output->param) {

&print_range(0); }

# Иначе начать со строки, указанной в данных.
&print_range($output->param('start'));

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

Однако если вам требуется нечто большее, чем возможность просто листать "файл, то полагаться на URL бывает обременительно. Облегчить эту трудность можно через использование формы HTML и включение данных о состоянии в теги <INPUT> типа HIDDEN. Этот метод с успехом используется на многих сайтах, позволяя делать ссылки между взаимосвязанными CGI-программами или расширяя возможности использования одной CGI-программы, как в предыдущем примере. Вместо ссылки на определенный объект, такой как начальная страница, данные URL могут указывать на автоматически генерируемый ID пользователя.

Так работают AltaVista и другие поисковые машины. При первом поиске генерируется ID пользователя, который скрыто включается в последующие URL. С этим ID связаны один или несколько файлов, содержащих результаты запроса. В URL включаются еще две величины: текущее положение в файле результатов и направление, в котором вы хотите перемещаться в нем дальше. Эти три значения — все, что нужно для работы мощных систем навигации больших поисковых машин.

- Впрочем, не хватает еще кое-чего. Использовавшийся в нашем примере файл /usr/diet/words очень велик. Что если на середине чтения мы его бросим, но захотим вернуться к нему позднее? Если не запомнить URL следующей страницы, никакого способа вернуться назад нет, даже AltaVista это не позволит. Если вы перезагрузите свой компьютер или станете работать с другого, невозможно вернуться к результатам прежнего поиска, не вводя заново запрос. Однако такое долговременное запоминание состояния лежит в основе персонализации вебсайтов, о которой мы говорили выше, и стоит посмотреть, как им можно воспользоваться. Пример 9-5 является модифицированным вариантом примера 9-4.



Содержание раздела