Технология Common Gateway Interface (CGI)

Автор работы: Пользователь скрыл имя, 26 Апреля 2011 в 17:33, контрольная работа

Описание

Взаимодействие между пользовательской интерактивной HTML-страницей (среда браузера, клиент) и сервером обслуживается протоколом CGI. При передаче данных от клиентской формы серверу, последний кодирует входные данные, а сценарий CGI декодирует их, а затем функционально обрабатывает и возвращает выходные данные браузеру.

Работа состоит из  1 файл

теория - копия.doc

— 96.50 Кб (Скачать документ)

Задание 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.cgi">.

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

#!/usr/bin/perl

$path = "c:/apache/htdocs";

@pic=('c0.gif','c1.gif','c2.gif','c3.gif','c4.gif','c5.gif','c6.gif','c7.gif','c8.gif');

srand;

$id=int(rand(9));

$gif=$path.'/images/'.$pic[$id];

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.cgi">

</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[$id];

...

...

...

     В этом скрипте, имена файлов заносятся  в массив @my_pic, причем для пропуска точек (. и ..) в верхней части директории, выполняется условий оператор в зависимости от значения счетчика (переменная $i).

     В заключение отметим, что элемент IMG и соответствующий CGI-сценарий часто используются в качестве скрытых счетчиков посетителей страниц. Такие скрипты могут также содержать процессы MAIL, которые позволяют, в сою очередь, известить владельца о посещении страницы визитером, имеющего такой-то IP-адрес, зашедший с такой-то страницы и т.п. 

     2. Загрузка CGI-сценариев  в контейнере IFRAME.

     Основной  привлекательностью использования  элемента IFRAME является возможность  выделения в произвольном месте HTML-страницы прямоугольной области произвольных размеров. Этот прием часто применяется для внедрения в статическую HTML-страницу, новостной, часто меняющейся информации, как текстовой, так и графической. При этом, как правило, новостная вставка, сама представляет собой HTML-страницу (файл). Применение, в качестве загрузочного ресурса CGI-сценария позволит автоматизировать процедуру смены новостей.

Задача.

     Автоматизировать  процесс смены новостной информации (текстовой) в поле статической HTML-страницы.

Решение.

     CGI программа считывает текстовый  файл с диска, или выполняет  выборку из базы данных (БД), генерирует  на лету документ HTML и загружает  ресурс в элемент IFRAME: <IFRAME SRC="../cgi-bin/news_bulletin.cgi" HSPACE="0" VSPACE="0" FRAMEBORDER="0" MARGINHEIGHT="0" MARGINWIDTH="0" WIDTH="320" HEIGHT="100"> </IFRAME>.

     Отметим, что элемент IFRAME представляет собой  встроенный элемент Internet Explorer (IE). Начнем рассмотрение с CGI-скрипта:

#!/usr/bin/perl

print "Content-Type: text/html\n\n";

$path = "c:/apache/htdocs";

$FILE_NEWS=$path.'/txt/bulletin.txt';

open(LIST,"<$FILE_NEWS");

@lines=<LIST>;

close(LIST);

#-------HTML-include:

print <<EOT;

<html>

<head>

<style type="text/css">P.just{text-align: justify;}</style>

</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></td>

</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-align: justify;}</style>

</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_programming/news_bulletin.cgi"   HSPACE="0" VSPACE="0"

FRAMEBORDER="0" MARGINHEIGHT="0"  MARGINWIDTH="0" WIDTH="320" HEIGHT="100">

</IFRAME>

<ILAYER SRC="../cgi-bin/cgi_programming/news_bulletin.cgi" left="0"  top="0"

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:$database:$host:$port",$login,$pass);

$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-align: justify;}</style>

</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 в значительной степени расширяет возможности представления и обработки этих данных. В качестве примера, рассмотрим задачу охраны авторского права на публикуемую новостную информацию.

Задача.

     Автоматизировать  процесс смены новостной информации (текстовой) в поле статической HTML-страницы и обеспечить при этом сохранение информации об авторских правах на публикацию.

Решение.

Информация о работе Технология Common Gateway Interface (CGI)