#include<stdio. h> int main() { // выдаем обязательный заголовок // это часть CGI-протокола printf("Content-type: text/html\n\n"); printf("<html>"); printf("<body>"); printf("Hello, World!"); printf("</body>"); printf("</html>"); return 0; } |
Заголовок является обязательной частью. Он передается веб-серверу и определяет, что следует за ним. В большинстве случаев у вас будет именно такой заголовок. Он говорит веб-серверу, что дальше идет HTML-код. С другими типами заголовков мы познакомимся чуть позже. В заголовке может быть несколько строк. Конец заголовка обозначается двумя переходами на новую строку - \n\n. Откомпилируйте эту программу, а исполняемый файл положите в каталог /cgi-bin вашего веб-сайта. Переименуйте его в test. cgi. К этому скрипту можно обратится непосредственно через обозреватель, написав в командной строке URL, например у меня это выглядит так http://*****/cgi-bin/test. cgi В результате, в вашем обозревателе вы увидите строку: "Hello, World!". Далее мы рассмотрим CGI-программу такого же типа. Она не принимает никаких параметров, но зато выдает более полезную информацию - список и значения всех переменных окружения. Такой скрипт вам пригодится, когда вы будете отлаживать свои CGI-программы на различных веб-серверах. Дело в том, что переменные окружения различаются на различных веб-серверах. Так, например, для веб-сервера Apache, путь к каталогу веб-сайта хранится в переменной окружения DOCUMENT_ROOT. Для веб-сервера Microsoft Internet Information Server это значение хранится в переменной PATH_TRANSLATED. В операционной системе UNIX скрипт для вывода всех переменных выглядит следующим образом.
Обратите внимание на CGI-заголовок. Он отличается от того, который у нас был в предыдущем примере. plain означает, что скрипт выдаст не HTML-код, а чистый текст. Броузер будет воспринимать его, как обычный текст и выводить в точности как есть. Здесь не надо заменять спецсимволы типа < на их эквиваленты <. Скопируйте этот скрипт в директорию /cgi-bin с именем env. Установите атрибут 755 (rwxr-xr-x). Вот результат выполнения такого скрипта на моем unix-сервере:
Программа на языке Си для Windows и веб-сервера Internet Information Server будет выглядеть следующим образом:
Сначала выполняется команда /c set>c:\www\mysite\temp\env. dmp. Результатом выполнения такой команды и будет список всех переменных окружения, который затем сохраняется в файл. Далее мы читаем этот файл и выдаем его содержимое веб-серверу. Вы можете заметить, что в данном случае, как и в прошлом примере, мы печатаем не html-код, а чистый текст и поэтому у нас заголовок: Content-type: text/plain. Не забудьте также, что этот cgi-скрипт будет работать только под Internet Information Server. Для веб-сервера Apache следует заменить getenv("PATH_TRANSLATED") на getenv("DOCUMENT_ROOT"). COMSPEC=C:\WINNT\SYSTEM32\ COMPUTERNAME=JUPITER CONTENT_LENGTH=0 GATEWAY_INTERFACE=CGI/1.1 HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd. ms-powerpoint, application/vnd. ms-excel, applic HTTP_ACCEPT_LANGUAGE=ru HTTP_CONNECTION=Keep-Alive HTTP_HOST=www. HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) HTTP_ACCEPT_ENCODING=gzip, deflate HTTPS=off INCLUDE=C:\Program Files\Mts\Include INSTANCE_ID=1410 LIB=C:\Program Files\Mts\Lib LOCAL_ADDR=168.144.29.178 NUMBER_OF_PROCESSORS=2 OS2LIBPATH=C:\WINNT\system32\os2\dll; OS=Windows_NT PATH=C:\WINNT\system32;C:\WINNT;C:\Program Files\Mts PATH_TRANSLATED=e:\InetPub\Clients\ PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.JS;.VBE;.JSE;.WSF;.WSH PROCESSOR_ARCHITECTURE=x86 PROCESSOR_IDENTIFIER=x86 Family 6 Model 5 Stepping 1, GenuineIntel PROCESSOR_LEVEL=6 PROCESSOR_REVISION=0501 PROMPT=$P$G REMOTE_ADDR=194.226.32.34 REMOTE_HOST=194.226.32.34 REQUEST_METHOD=GET SCRIPT_NAME=/cgi-bin/env. exe SERVER_NAME=www. SERVER_PORT=80 SERVER_PORT_SECURE=0 SERVER_PROTOCOL=HTTP/1.1 SERVER_SOFTWARE=Microsoft-IIS/4.0 SYSTEMDRIVE=C: SYSTEMROOT=C:\WINNT TEMP=C:\temp TMP=C:\temp USERPROFILE=C:\WINNT\Profiles\Default User Далее, прежде чем перейти к рассмотрению cgi-скриптов, которые принимают и обрабатываю параметры формы, мы напишем простенькую программу, которая выдает строку параметров html-формы. О том, как считываются параметры формы, читайте выше, здесь я привожу исходный код программы и ее результат для html-формы, описанной в четвертой главе.
Скомпилируйте этот код. Он платформенно независимый, поэтому можете скомпилировать как под Unix, так и под Windows. Из четвертой главы возьмите HTML-форму, можете взять и любую другую. В поле action пропишите путь к данной программе на вашем веб-сервере. Результат после нажатия на кнопку "Опубликовать": |
ПРАКТИЧЕСКАЯ РАБОТА №8
Тема работы: Разработка CGI программы на языке Perl.
Цель работы: научиться разрабатывать CGI программы на языке Perl.
Теоретическая часть
Программа на языке Perl состоит из деклараций и операторов. Любой текст, начиная с символа "#" и до конца строки, считается комментарием и игнорируется.
Для переменных деклараций не требуется. До тех пор пока им не будет присвоено какое-либо конкретное значение, они просто содержат неопределенное значение undef. Декларации могут располагаться в любом месте программы, т. к. обрабатываются на этапе компиляции, предшествующем этапу исполнения программы.
Операторы языка Perl подразделяются на простые и составные. Составные операторы состоят из блоков, заключенных в фигурные скобки. В отличие от языка C, фигурные скобки в составных операторах обязательны, даже если в них заключен только один оператор. Операторы разделяются точкой с запятой.
Знакомство с Perl можно начать со сценария сценарий 1:
#!c:/perl/bin/perl
print "Content-type:text/html\n\n";
print "Hello world!";
Ход работы
Задание 1. Вывод строки приветствия на Perl (html, txt)
Первая строка сценария, оформленная в виде комментария, указывает на физическое размещение интерпретатора языка Perl. Остальные строки фактически формируют ответ веб-сервера:
Во второй строке в выходной поток передается поле Content-type заголовка ответа сервера, и в конце вставляется пустая строка, отделяющая заголовок от тела ответа сервера.
В последней строке помещается содержимое тела ответа сервера.
В результат выполнения сценария данного сценария получим следующую страницу:

В следующем примере будет рассмотрен сценарий, считывающий и обрабатывающий данные, полученные веб-сервером из запроса клиента. Исходные данные должны вводиться пользователем в поля формы веб-страницы, загруженной в веб-браузере.
#!c:/perl/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
$method = $ENV{'REQUEST_METHOD'};
if ($method eq 'POST')
{
$length = $ENV{'CONTENT_LENGTH'};
read(STDIN, $qstr, $length);
}
else
{
if ($method eq 'GET') { $qstr = $ENV{'QUERY_STRING'}; }
else
{
print "Method ".$method." is not supported
</BODY></HTML>";
#exit(0);
}
}
print "<P>Метод = ", $method;
print "<p>Строка параметров: <p>\n";
print $qstr;
# обратная перекодировка
$qstr =~ tr/+/ /;
$qstr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
# выделение списка параметров
print "<p>А теперь отдельные поля:<p>";
@pars = split(/&/, $qstr);
# определение размера массива
$n_pars = @pars;
# выделение имени и значения для каждого параметра
for ($i=0; $i<$n_pars; $i++)
{
# выделение списка из двух переменных $name и $value
($name, $value) = split(/=/, $pars[$i]);
print "Параметр <B>", $name, "</B> равен <I>",
$value, "</I><br>";
}
print "</HTML></BODY>\n";
Задание 2. Вывод списка параметров, полученных сервером в запросе от клиента (html, txt)
Данный сценарий ориентирован на передачу данных из веб-формы одним из основных методов: GET или POST. Поскольку передача данных в этих методах отличается, то в сценарии сначала определяется метод передачи данных путем обращения к переменной окружения REQUEST_METHOD, значение которой доступно сценарию через одноименный элемент ассоциативного массива (хэша) ENV, содержащего значения всех переменных окружения.
После определения использовавшегося в запросе клиента метода, выбирается адекватный способ чтения параметров, полученных из веб-формы:
В случае метода POST определяется общий размер переданных данных (в байтах) из переменной окружения CONTENT_LENGTH, а затем блок данного размера считывается из входного потока STDIN с помощью функции read.
В случае метода GET данные доступны в переменной окружения QUERY_STRING.
Если метод запроса не совпадает ни с одним из рассмотренных выше или его значение не определено, то происходит принудительное завершение сценария с выдачей соответствующего сообщения.
Поскольку в рамках протокола HTTP символы, отличные от латинских букв и цифр передаются в виде шестнадцатиричных кодов (пробелы заменяются на '+'), требуется предварительное обратное преобразование полученных данных с помощью операторов замены s/// и tr// с использованием шаблонов в виде регулярных выражений.
Далее с помощью функции split происходит разделение блока символов на подстроки по заданному разделителю:
Пары, описывающие имя параметра и его значение разделяются с помощью символа '&'. Результат разделения помещается в скалярный массив @pars.
Внутри пары имя и значение разделяются символом '='.
Рассмотренный пример может быть взят за основу для любого сценария, обрабатывающего данные из веб-формы, поскольку позволяет получить исходные данные, полученные от клиента. Расширение сценария сводится к добавлению кода обработки полученных данных и формирования итогового документа, возвращаемого веб-сервером клиенту.

Задание 3. Рассмотрим для примера сценарий выполняющий четыре арифметические операции над целыми числами, которые пользователь вводит через поля веб-формы в браузере.
#!c:/perl/bin/perl
print "Content-type: text/html\n\n";
print "<HTML><BODY>\n";
$method = $ENV{'REQUEST_METHOD'};
if ($method eq 'POST')
{
$length = $ENV{'CONTENT_LENGTH'};
read(STDIN, $qstr, $length);
}
else
{
if ($method eq 'GET') { $qstr = $ENV{'QUERY_STRING'}; }
else
{
print "Method ".$method." is not supported </BODY></HTML>";
exit(0);
}
}
$qstr =~ tr/+/ /;
$qstr =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
@pars = split(/&/, $qstr);
$n_pars = @pars;
foreach $par (@pars)
{
($name, $value) = split(/=/, $par);
$opers{$name} = $value;
}
$op1 = int($opers{'A'});
$op2 = int($opers{'B'});
$op = $opers{'op'};
switch:
{
if ($op eq '+') { $res = $op1 + $op2; last switch; }
if ($op eq '-') { $res = $op1 - $op2; last switch; }
if ($op eq '*') { $res = $op1 * $op2; last switch; }
if ($op eq '/')
{
if ($op2 == 0)
{
print " Divide by zero! </BODY></HTML>";
exit(0);
}
else
{
$res = $op1 / $op2; last switch;
}
}
{
print "Operator ".$op." is not supported </BODY></HTML>";
exit(0);
}
}
print "Result: ".$op1.$op.$op2.' = '.$res;
print "<p><a href=\'".$ENV{'HTTP_REFERER'}."\'>Back</a></p>";
print "</HTML></BODY>\n";
Задание 4. Калькулятор арифметических операций для целых операндов (html, txt)
В данном примере из строки запроса извлекаются 3 параметра с именами "A", "B" и "op", после чего в зависимости от значения третьего параметра выполняется соответствующая арифметическая операция над первыми двумя параметрами.

В итоге формируется html страница с результатом вычисления и обратной ссылкой на исходную страницу с формой. Для определения адреса исходной страницы используется значение переменной окружения HTTP_REFERER:
Result: 34*12 = 408
Для поиска синтаксических ошибок в сценариях на Perl можно использовать непосредственный запуск интерпретатора в командной строке, который находится в установочном каталоге Perl:

Задание 5. Создайте файл с текстом сценария 1. Файл должен иметь расширение pl, и размещаться в директории Scripts (или cgi-bin). Проверьте настройки доступа к папке для веб-сервера, который должен иметь право на выполнение сценариев в этой папке.
При сохранении файла в редакторе также следует также выбрать правильную кодировку символа переноса строки. Кроме того, первая строка сценария должна содержать правильный путь к директории, в которой установлен интерпретатор языка Perl (обычно это файл perl. exe или подобный ему).
Если текст сценария содержит синтаксические ошибки, то после попытки его запустить на выполнение веб-сервером, последний вернет клиенту ответ, содержащий код внутренней ошибки сервера. Поэтому перед запуском сценария рекомендуется выполнить его проверку. Для проверки сценария на наличие синтаксических ошибок удобно использовать непосредственный запуск интерпретатора вручную. Для этого в командной строке из директории, указанной в первой строке сценария, необходимо запустить исполняемый модуль (обычно perl. exe) с аргументом, являющимся именем файла (с указанием пути), содержащим текст сценария. При наличии синтаксических ошибок в сценарии интерпретатор выдаст сообщения с указанием соответствующих номеров строк в файле, в которых эти ошибки обнаружены. Исправляйте ошибки до тех пор, пока интерпретатор не перестанет выдавать сообщения об ошибках.
Для того, чтобы посмотреть работу сценария, необходимо в браузере набрать его URL по HTTP-протоколу.
Подготовьте файл с текстом сценария 2.Для проверки работоспособности данного сценария можно выполнить его непосредственный запуск в веб-браузере через его URL с добавлением строки параметров, например:
http://localhost/Scripts/test. pl? a=2&b=14
Подготовьте HTML страницу, содержащую форму с полями для ввода данных. Вставьте в тэге <FORM> атрибут ACTION со значением, равным URL сценария, в качестве метода выполнения запроса укажите в атрибуте METHOD значение GET. Проверьте работу формы. Сделайте то же самое, но для метода POST.
3. <html>
4. <body>
5. <form action='http://localhost/Scripts/test. pl'>
6. <p>Operand1: <input type='text' name='A'></p>
7. <p>Operand2: <input type='text' name='B'></p>
8. <p>Operation:<br>
9. <select name='op'>
10. <option value='+'>+</option>
11. <option value='-'>-</option>
12. <option value='*'>*</option>
13. <option value='/'>/</option>
14. <select></p>
15. <input type='submit' value='Calculate!'>
16. </from>
17. </body>
</html>
Проверьте работу сценария.
Перечень вопросов, выносимых на экзамен
1. Язык гипертекстовой разметки HTML.
2. Структура HTML-документа: заголовочная часть и основное тело документа. Комментарии в HTML.
3. Заголовочная часть документа <HEAD>. Заголовок документа <TITLE>. Связь с другими документами.
4. Абсолютные и относительные ссылки. Тэги <BASE> и <LINK>. Конструкции и назначения тэга <META>. Использование других тэгов в заголовочной части HTML-документа.
5. Основное тело документа. Назначение и параметры тэга <BODY>.
6. Форматирование текста. Тэги физического и логического форматирования. Формат отображения. Принцип отделения структуры документа от его представления.
7. Форматирование HTML-документа
8. Ссылки на другие документы и файлы.
9. Списки. Типы списков, параметры.
10. Таблицы в HTML.
11. Фреймы. Правила описания фреймов
12. Особенности применения графических изображений в HTML-документе.
13. Карты-изображения. Терминология, концепция и варианты реализации.
14. Событийные приложения и объектные модели языков сценариев. Языки программирования интерактивных HTML-документов.
15. Язык сценариев JavaScript. Синтаксис языка. Размещение на странице и четыре способа встраивания сценариев в HTML-документ.
16. Язык сценариев JavaScript. Переменные и литералы. Типы данных. Выражения и операторы. Типы сложных выражений.
17. Язык сценариев JavaScript. Операторы управления, выбора, цикла и манипулирования с объектами.
18. Язык сценариев JavaScript. События и обработчики событий. Ключевое слово this. Объект event. Вызов процедуры обработки события.
19. Язык сценариев JavaScript. Иерархия ключевых объектов. Объект Array.
20. Язык сценариев JavaScript. Иерархия ключевых объектов. Объект Date.
21. Язык сценариев JavaScript. Иерархия ключевых объектов. Объект Math.
22. Язык сценариев JavaScript. Иерархия ключевых объектов. Объект String.
23. Каскадные таблицы стилей. Классы и селекторы. Группирование и наследование. Простые и контекстные селекторы. Псевдоклассы.
24. Способы связывания каскадных таблиц стилей и HTML-документа.
25. Назначение, общая схема работы и непосредственные функции Web-сервера. Среда работы сервера.
26. CGI — как средство расширения возможностей WWW технологии. Общий принцип работы CGI-приложения. Способы передачи параметров в приложение и возврат результатов.
27. Вызов CGI программ. Конструкция языка HTML для построения форм.
28. Язык программирования Perl. Типы данных. Скалярные переменные. Конструкторы и операции, применимые к скалярным переменным.
29. Язык программирования Perl. Типы данных. Списковые переменные Списки и хэши. Конструкторы и операции, применимые к списковым переменным.
30. Синтаксис языка программирования Perl. Описание подпрограмм. Операторы выбора и перехода. Циклы и операторы управления циклом
31. Базовые средства ввода-вывода в языке Perl.
32. Средства языка Perl для работы с регулярными выражениями.
ПЕРЕЧЕНЬ ЛИТЕРАТУРЫ
Литература основная
1. А. Матросов, А. Сергеев, М. Чаунин. HTML 4.0. СПб.: БХВ-Петербург,., 672с.
2. А. Павлов. CGI-программирование: учебный курс. СПб.: Питер,., 416с.
3. Р. Шварц, Т. Кристианен. Изучаем Perl: Пер. с англ. — К.: Изд. BHV,., 320с.
дополнительная:
4. Л. Уолл. Программирование на Perl, СПб.: Симво,., 1200 с.
5. Д. Кирсанов. Web-дизайн: книга Дмитрия Кирсанова, СПб.: Симво,., 376 с.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |


