Автор работы: Пользователь скрыл имя, 26 Апреля 2011 в 17:33, контрольная работа
Взаимодействие между пользовательской интерактивной HTML-страницей (среда браузера, клиент) и сервером обслуживается протоколом CGI. При передаче данных от клиентской формы серверу, последний кодирует входные данные, а сценарий CGI декодирует их, а затем функционально обрабатывает и возвращает выходные данные браузеру.
Задание
1. Технология Common Gateway Interface (CGI)
Введение.
Взаимодействие между пользовательской интерактивной HTML-страницей (среда браузера, клиент) и сервером обслуживается протоколом CGI. При передаче данных от клиентской формы серверу, последний кодирует входные данные, а сценарий CGI декодирует их, а затем функционально обрабатывает и возвращает выходные данные браузеру.
Судя по литературе, вопросам передачи и обработки данных, включая их запись на диск или в базу данных уделено достаточно много внимания, эти вопросы в той или иной степени затронуты практически в любом руководстве по Web-программированию [1, 2, 3]. Вместе с тем задачи, а в ряде случаев и проблемы, связанные с генерированием выходных данных в среду браузера, освещаются в публикациях и монографиях на уровне фона. Применение же встроенных HTML-функций Perl [2], в задачу которых входит облегчить генерацию HTML-включений непосредственно из CGI-сценария, приводит к тому, что программист и дизайнер должны выступать в одном лице.
В принципе, самый эффективный (с точки зрения разделения CGI программирования и HTML дизайна) способ возврата данных клиенту, это генерация HTML-шаблонов на лету. Шаблон читается CGI сценарием, который выполняет подстановку переменных вместо параметрических включений и потом на лету генерирует страницу в окне браузера. Самый неэффективный способ, это размещение полных HTML-страниц в теле CGI-скрипта. Любое изменение дизайна HTML-страницы, в последнем случае, потребует модифицировать и CGI программу в целом. К чему это приводит, думаю знакомо всем Web-программистам. Вместе с тем, как во втором, так и в первом случаях гибкость и оперативность вывода данных оставляет желать лучшего.
В
данной статье мы остановимся, на некоторых
промежуточных вариантах вывода
данных, обеспечивающих гибкость и оперативность,
смысл которых будет понятен ниже, я надеюсь.
Представим себе ситуацию, когда в действующую
HTML-страницу (файл) потребуется оперативно
выводить данные и при этом не затрагивать
существующий дизайн. Такими данными могут
быть изображения, численные значения
счетчиков, ленты новостей, котировки
валют on-line, прогнозы погоды и много другое.
При этом, в ряде случаев потребуется избавить
пользователя от перезагрузки HTML-страницы.
На сайтах часто можно встретить предупреждение
типа: "Для обновления данных перезагрузите
страницу!". Прямолинейным решением
может служить перезапись HTM-файлов с помощью
CGI-программы, которая предварительно
читает файл с диска и изменяет содержимое
параметрических включений. Такой подход,
плох уже тем, что снижает безопасность,
открывая доступ каждому (everyone) к записи
на диск. Мы рассмотрим другие варианты,
а именно, формирование запросов CGI-ресурсов
путем использования контейнерных HTML
элементов: APPLET, SCRIPT, OBJECT, IFRAME (ILAYER для Netscape),
ну и конечно элемент IMG. С последнего и
начнем.
1. Загрузка ресурса IMG.
Задача.
Вы хотите, чтобы на вашей HTML-странице, случайным образом, загружались бы графические изображения, перечень которых может постоянно изменяться и пополняться.
Решение.
Используем атрибут SRC элемента IMG для загрузки CGI-ресурса:
<IMG src="../cgi-bin/rand_imgages.
Надо отметить, что этот прием достаточно часто используется в Web-программировании. Все сложности сводятся к написанию приемлемого CGI-скрипта, который отвечал бы поставленной задаче. В качестве наглядного примера приведем довольно простой скрипт, обеспечивающий случайный вывод изображения из ограниченного списка графических файлов:
#!/usr/bin/perl
$path = "c:/apache/htdocs";
@pic=('c0.gif','c1.gif','c2.
srand;
$id=int(rand(9));
$gif=$path.'/images/'.$pic[$
print "Content-Type: image/gif\n\n";
open G,$gif;
binmode( G );
binmode( STDOUT );
print <G>;
close G;
exit;
Для полноты картины приведем и текст HTML-страницы:
<html>
<head>
<title>Copyright 2002 The Web Production</title>
</head>
<body>
<b>TOP</b> Text text ......<br><br>
<center>
<IMG SRC="../cgi-bin/rand_imgages.
</center>
<br>
<b>BOTTOM</b> Text text ......<br><br>
</body>
</html>
В этом примере видно, что дизайн может быть реализован отдельно от загружаемых изображений (но, с учетом их ширины и высоты) и может изменяться независимо от CGI-сценария и независимо от CGI-программиста. Более сложный вариант CGI-программы, обеспечивающий случайный выбор из переменного списка изображений, должен включать код открытия обособленной директории файлов изображений:
...
...
...
$DIR_PICTURES = $path.'/picturies';
opendir (ETC, $DIR_PICTURES)||die "no directory!: $!";
$i=0;
foreach $filename (readdir(ETC)) {
if($i > 1){ $k=$i-2; $my_pic[$k]=$filename;}
$i++;}
close (ETC);
$leng=@my_pic;
srand;
$id=int(rand($leng));
$gif=$path.'/images/'.$my_pic[
...
...
...
В этом скрипте, имена файлов заносятся в массив @my_pic, причем для пропуска точек (. и ..) в верхней части директории, выполняется условий оператор в зависимости от значения счетчика (переменная $i).
В
заключение отметим, что элемент IMG
и соответствующий CGI-сценарий часто
используются в качестве скрытых счетчиков
посетителей страниц. Такие скрипты могут
также содержать процессы MAIL, которые
позволяют, в сою очередь, известить владельца
о посещении страницы визитером, имеющего
такой-то IP-адрес, зашедший с такой-то страницы
и т.п.
2. Загрузка CGI-сценариев в контейнере IFRAME.
Основной привлекательностью использования элемента IFRAME является возможность выделения в произвольном месте HTML-страницы прямоугольной области произвольных размеров. Этот прием часто применяется для внедрения в статическую HTML-страницу, новостной, часто меняющейся информации, как текстовой, так и графической. При этом, как правило, новостная вставка, сама представляет собой HTML-страницу (файл). Применение, в качестве загрузочного ресурса CGI-сценария позволит автоматизировать процедуру смены новостей.
Задача.
Автоматизировать
процесс смены новостной
Решение.
CGI
программа считывает текстовый
файл с диска, или выполняет
выборку из базы данных (БД), генерирует
на лету документ HTML и загружает
ресурс в элемент IFRAME: <IFRAME SRC="../cgi-bin/news_bulletin.
Отметим, что элемент IFRAME представляет собой встроенный элемент Internet Explorer (IE). Начнем рассмотрение с CGI-скрипта:
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
$path = "c:/apache/htdocs";
$FILE_NEWS=$path.'/txt/
open(LIST,"<$FILE_NEWS");
@lines=<LIST>;
close(LIST);
#-------HTML-include:
print <<EOT;
<html>
<head>
<style type="text/css">P.just{text-
</head><body bgcolor='#FFFFFF' leftmargin='0'>
<table border="0" cellspacing="0" cellpadding="20">
<tr>
<td><p class="just"><font
color='#00007b' size='4'>@lines</font></p></
</tr>
</table>
</body></html>
EOT
exit;
В процессе загрузки в браузер новостной HTML-страницы, управление передается CGI-скрипту, который считывает обычный текстовый файл bulletin.txt с диска сервера, создает на лету HTML-вставку и выводит ресурс в элемент IFRAME. Для наглядности, HTML-вставка размещена в теле CGI-скрипта. В реальной ситуации, HTML-вставка существует в виде шаблона в каталоге шаблонов на сервере или находиться в таблице шаблонов в БД. Ниже представлена собственно новостная HTML-страница (news.html):
<html>
<head>
<title>Copyright 2002 The Web Production</title>
<style type="text/css">P.just{text-
</head>
<body bgcolor='#00007b' text="white">
<center><h2>News Bulletin</h2></center><hr>
<table border='1' cellspacing="0" cellpadding="10">
<tr>
<td align="left" valign="top" width='400'>Examples examples examples examples examples: </td>
<td align="left" valign="top">
<IFRAME
SRC="../cgi-bin/cgi_
FRAMEBORDER="0" MARGINHEIGHT="0" MARGINWIDTH="0" WIDTH="320" HEIGHT="100">
</IFRAME>
<ILAYER SRC="../cgi-bin/cgi_
VISIBILITY="show" WIDTH="320" HEIGHT="100">
</ILAYER>
</td>
</tr>
</table>
</body>
</html>
Из этого примера видно, что динамически обновляемая информация отделена от статического дизайна, который может модифицироваться дизайнером без ущерба CGI-cкрипту.
Дополнительный элемент ILAYER будет понятен браузеру Netscape Navigator (NN). Ниже представлен простой пример CGI-скрипта, выполняющий единичную выборку новостей из базы данных MySQL:
...
...
...
$table_name="news_arjive";
$dbh = DBI->connect("DBI:mysql:$
$sth = $dbh->prepare("SELECT text_news FROM $table_name WHERE id = 1");
$sth->execute;
$news = $sth->fetchrow_array ();
$sth->finish;
$dbh->disconnect;
#-------HTML-include:
print <<EOT;
<html>
<head>
<style type="text/css">P.just{text-
</head><body bgcolor='#FFFFFF' leftmargin='0'>
<table border="0" cellspacing="0" cellpadding="20">
<tr>
<td><p class="just"><font color='#00007b' size='4'>$news</font></p></td>
</tr>
</table>
</body></html>
EOT
exit;
Отметим, что изменение кода HTML-вставки, выразилось лишь только в замене массива @lines на переменную $news.
Автоматическая
выборка новостной информации из
БД хороший пример сокращения затрат
на содержание сайтов средних и крупных
размеров, порталов, интернет-магазинов
и.т.п. Редактор новостей корпоративной
сети, по мере поступления новостной информации,
заносит ее в БД. Дальнейшее распространение
и публикация новостей происходит без
его участия и без помощи дизайнеров и
программистов.
3. CGI-JavaScript программирование.
В рассмотренных выше примерах вставка возвращаемых данных осуществлялась, со стороны браузера, пассивно. Активное взаимодействие сценариев CGI и скриптов языка JavaScript в значительной степени расширяет возможности представления и обработки этих данных. В качестве примера, рассмотрим задачу охраны авторского права на публикуемую новостную информацию.
Задача.
Автоматизировать
процесс смены новостной
Решение.
Информация о работе Технология Common Gateway Interface (CGI)