|
Пример простейшего серверного сценарияТеперь приведем
простой пример сценария, который запускается прямо на сервере. Для чего это
нужно? Область применения серверных сценариев довольно широка. Подобные сценарии
могут, например, на ходу генерировать HTML-коц, и пересылать его
броузеру. Но мы рассмотрим пример, в котором сценарий будет принимать и
обрабатывать отправленную пользователем форму. Помните, когда мы создавали страницу гипотетической фирмы «Лентяй»,
в ней был раздел «Книга отзывов» ? Там пользователю предлагалось ввести
свое имя в одно текстовое поле (с именем Name), а свое мнение — в другое
(многострочное) текстовое поле (с именем Opinion). Затем, после нажатия
кнопки Отправить заполненная форма отправлялась на сервер. Но что с ней
происходит там? В качестве примера мы написали небольшой сценарий, который
принимает данные формы и создает текстовый файл, в который эти данные
записываются. Затем сценарий высылает пользователю сообщение об успешном
завершении работы. Сценарий,
исполняемый на сервере, может быть написан на различных языках программирования
и использовать различные технологии. Например, он может использовать технологию
ASP (Active Server Pages) или специальную серверную редакцию языка
JavaScript. Однако чаще всего такие сценарии пишутся на языке Perl (и используют
технологию CGI — Common Gateway Interface). Мы сейчас не будем
рассказывать об этом подробно, а просто проиллюстрируем, каким может быть
простейший Perl-сценарий. Для облегчения восприятия давайте сначала напишем его
«построчно», а затем приведем полный текст. Итак, в первой
строке мы должны указать местоположение интерпретатора языка Perl на сервере.
Его можно узнать у администратора сервера. Если сервер работает под управлением
Windows NT, а не UNIX или Linux, эта строка будет проигнорирована. Обычно она
выглядит так: #! /usr/bin/perl Теперь, чтобы мы могли легко считывать данные HTML -формы, надо написать еще одну строку: require "cgi-lib.pl"; Эта строка подключает специальную библиотеку функций (cgi),
позволяющих, в частности, легко взаимодействовать с формами, отправленными
пользователем. Без этой библиотеки при написании сценария пришлось бы
сильно попотеть. Поскольку мы будем отправлять пользователю подтверждение успешного
завершения работы, необходимо предварительно указать тип текста, который
сценарий будет посылать пользователю: print "Content-type: text/html\n\n"; Вообще говоря, все, что указано в операторе print, по умолчанию
будут отправлено на компьютер пользователя. Теперь нужно прочитать данные
формы, отправленной пользователем: &ReadParse(*input); Запись в файлПосле этого нужно создать файл, в который записываются эти
данные. Этому файлу нужно дать какое-то имя. В принципе, это имя может
быть любым, но если мы просто укажем в сценарии конкретное имя, то при
обработке первого присланного отзыва все будет хорошо, но при обработке
второго отзыва новый файл заменит первый. Поэтому мы можем взять имя файла
из имени, введенного пользователем. Однако может случиться, что несколько
пользователей введут одинаковые имена. Что же делать? Выйти из положения можно разными способами. Один из них заключается
в том, чтобы сгенерировать имя файла из имени, введенного пользователем,
и некого случайного числа. Таким образом, вероятность генерации двух одинаковых
имен файлов оказывается ничтожно малой. Чтобы генерировать случайные числа, сначала необходимо инициализировать
их генератор: srand($$^time); Теперь можно сгенерировать само имя. Для удобства присвоим
его переменной $fname: $fname=$input{"Name"}.int(rand(99999) ) ; Имена переменных в языке Perl всегда начинаются со знака $.
Как вы можете заметить, мы здесь использовали новую переменную $fname,
не объявляя ее заранее. Но Perl — язык очень демократичный, здесь такие
вещи допускаются (точнее сказать — здесь допускается еще и не такое!).
С помощью функции rand(99999) мы генерируем случайное число в диапазоне
от 0 до 99 999, а затем отделяем от него целую часть с помощью функции
int. Знак «точка» означает конкатенацию, то есть присоединение
символьных строк друг к другу. Хотя теперь вероятность совпадения двух имен файлов просто
ничтожно мала, все же на всякий случай перед созданием файла неплохо бы
проверить, не существует ли уже файл с тем же именем. Если он существует
(что почти невероятно), наш простенький сценарий просто выведет предупреждающее
сообщение для пользователя и завершит работу: if (-e "$fname.txt") { Как мы уже говорили, оператор print по умолчанию выводит
информацию на компьютер пользователя. На этом месте сценарий предлагает
пользователю попробовать отослать форму еще раз, так как теперь будет
сгенерировано другое имя файла. Если же все в порядке, сценарий должен создать и открыть для
ввода данных файл с именем, хранящимся в переменной $fname и расширением
txt: open (FILE,
">$fname.txt"); Теперь, чтобы иметь возможность записывать в этот файл какие-либо
данные, нужно, как говорят программисты, «перенаправить туда вывод» с
помощью оператора select: select (FILE); Это означает, что теперь, к примеру, оператор print будет выводить
данные не на компьютер пользователя, а в наш новый файл. Заметим время,
когда это произошло: $tim=localtime(); Здесь мы получили
текущее время и дату с помощью функции localtime() и присвоили его переменной
$tim. Теперь давайте выведем сами данные: print <<OTZYV Кстати, это пример многострочного оператора print. Вместо открывающих
кавычек здесь использованы символы<<и идентификатор (какое-нибудь
имя следующего многострочного блока), а вместо закрывающих кавычек — только
имя многострочного блока. В результате мы можем просто набирать текст,
который должен быть выведен. В этот текст, однако, можно подставлять значения
переменных: в данном случае вместо $input{"Name"} будет выведено имя пользователя,
которое он ввел в поле формы с именем Name, вместо $input{"Opinion"} —
его мнение, введенное в многострочное текстовое поле Opinion. А вместо
переменной $tim будет выведено текущее время. Теперь, когда все данные выведены, файл надо закрыть (только
при этом он окончательно сохраняется на диске). Это делается с помощью
оператора close: lose(FILE); Выдача сообщения пользователюНа этом миссия сценария завершается, но надо еще вывести
подтверждение успешного завершения работы, чтобы пользователь узнал об
этом. Это можно сделать с помощью оператора print, но прежде нужно перенаправить
вывод обратно пользователю: select(STDOUT); Слово STDOUT обозначает так называемый стандартный вывод,
куда данные выводятся по умолчанию. Теперь, наконец, можно послать
пользователю подтверждающее сообщение: print "<Н1>Ваш отзыв был успешно отправлен на сервер
компании! </Н1>"; и завершить работу: exit 0; Хотя мы и рассмотрели написание этого сценария построчно, давайте все же теперь взглянем на него целиком: #! /usr/bin/perl Конечно,
этот сценарий совершает довольно примитивную работу. Однако его рассмотрение
может дать некоторое представление о том, что за пределами HTML, CSS и
JavaScript открываются новые просторы Web-технологий. И мы надеемся, что после
прочтения этой книги наши читатели не просто научатся создавать динамические
веб-страницы, но и заинтересуются другими существующими
веб-технологиями. И последний совет: чтобы научиться свободно обращаться с HTML/CSS/ JavaScript, как можно больше экспериментируйте самостоятельно! Начинать можно с изменений и «улучшений» приведенных в книге примеров, однако затем попробуйте создавать страницы самостоятельно «с нуля» или « почти с нуля ». А если вы увидите в WWW какую-либо интересную и красивую страницу, обязательно посмотрите на ее код, вникните в то, как она сделана. Такой опыт тоже очень полезен. На этом мы, пожалуй, закончим наше путешествие в мир веб-технологий. Удачи вам, дорогой читатель, и хороших веб-страниц! |