Автор работы: Пользователь скрыл имя, 21 Декабря 2010 в 22:22, контрольная работа
По мере выполнения данной работы будет рассмотрено как создавать документы с формами, программировать на стороне сервера с использованием CGI и обрабатывать данные, передаваемые браузером серверу. Также будут кратко рассмотрены различные способы такой обработки, а также основные приемы построения интерактивных страниц Web-узла.
Common Gateway Interface (CGI) — это спецификация обмена данными между прикладной программой, выполняемой по запросу пользователя, и HTTP-сервером, который
Введение 3
1. Обмен данными в Web-технологии 5
2. Спецификация CGI 6
3. Web-формы и CGI 10
Заключение 13
Список использованной литературы 14
В случае доступа к скрипту по методу GET данные, которые передаются скрипту, размещаются в переменной окружения QUERY_STRING.
Как
ни странно звучит, но у CGI-скрипта
может быть такой элемент операционного
окружения как командная строка. Это не
означает, что скрипт реально можно вызвать
из командной строки через сервер. Тем
не менее, получить доступ к содержанию
командной строки скрипта можно с помощью
тех же функций, что и при вызове его из-под
интерактивной оболочки:
#Perl
foreach $a (@ARGV)
{
print $a,"\n";
}
// C
void main(argc,argv)
int argc;
char *argv[];
{
int i;
for(i=0;i<argc;i++)
{
printf("%s\n",argv[i]);
}
}
В обоих примерах показана распечатка аргументов командной строки для программ на Perl и C соответственно. Аргументы командной строки появляются только в запросах типа ISINDEX.
Ввод данных в скрипт через поток стандартного ввода осуществляется только при использовании метода доступа к ресурсу (скрипту) POST. При этом в переменную окружения CONTENT_LENGTH помещается число символов, которое необходимо считать из потока стандартного ввода скрипта, а в переменную окружения CONTENT_TYPE помещается тип кодирования данных, которые считываются из потока стандартного ввода.
При
посимвольном считывании в C можно применить,
например, такой фрагмент кода:
int n;
char *buf;
n=
atoi(getenv("CONTENT_LENGTH"))
buf = (char *) malloc(n+1);
memset(buf,'\000',n+1);
for(i=0;i<n;i++)
{
buf[i]=getchar();
}
free(buf);
В данном фрагменте применено динамическое размещение памяти в скрипте, поэтому при выходе из него память следует освободить. Вообще говоря, память будет автоматически освобождена операционной системой после завершения скрипта. Однако, если переносить скрипт на спецификацию FCGI (Fast CGI), что требует минимума переделок, из-за неаккуратной работы с памятью могут возникнуть проблемы.
Существует только один способ вернуть данные серверу и, соответственно, браузеру пользователя — писать в поток стандартного вывода (STDOUT). При этом скрипт должен формировать HTTP-сообщение.
Сначала
выводятся директивы HTTP-
Content-type:
text/html,
либо
Location:
http://domain.ru/
В
первом случае определяется тип тела
HTTP-сообщения, а во втором осуществляется
перенаправление запроса. После заголовка
генерируется отклик в виде тела HTTP-сообщения,
которое должно быть отделено от заголовка
пустой строкой:
#!/bin/sh
echo Content-type: text/plain
echo
echo
Hello
В данном случае используется командный интерпретатор sh. Если скрипт начинает формирование заголовка с директивы версии HTTP-протокола, то сервер не анализирует отклик и передает его как есть. Если в заголовке, сгенерированном скриптом, эта директива отсутствует, то сервер считает, что заголовок неполный, и вставляет в него дополнительные директивы.
Контейнер (элемент разметки) FORM позволяет определить в рамках HTML-документа форму ввода. В рамках этого контейнера размещаются все поля ввода, куда пользователь может поместить свою информацию. Если контейнер формы открыт, т.е. в документе указан тег начала контейнера <FORM ...>, то обязательно нужно указать и тег конца контейнера </FORM>.
В
общем случае контейнер имеет
следующий вид:
<FORM
NAME=...
ACTION=url
METHOD=POST|GET|PUT|...
enctype=application/x-
multipart/form-data
[target=window_name]
>
...
</FORM>
Атрибут NAME используется для именования формы. Это делается главным образом в JavaScript-программах. Атрибут ACTION задает URL, по которому отправляются данные из формы. Атрибут METHOD определяет метод передачи данных (фактически, речь идет о формировании сообщения, передаваемого по сети). Атрибут ENCTYPE определяет тип кодирования данных в теле сообщения и разбиение сообщения на части. Необязательный атрибут TARGET позволяет адресовать окно, в котором будет отображаться результат обработки данных из формы.
В рамках обзора применения контейнера FORM мы рассмотрим:
Инициировать
обмен можно при помощи JavaScript-кода,
но рассматривать данный способ программирования
обмена данными мы здесь не будем.
FORM (mailto). Контейнер FORM позволяет определить в рамках HTML-документа форму ввода. В рамках этого контейнера размещаются все поля ввода, в которые пользователь может поместить информацию. Часто автор страниц Web-сайта по тем или иным причинам не имеет возможности программировать на стороне сервера. Однако это не означает, что он не может применять формы. Формы можно применять для отправки почты.
Для
того, чтобы получить тело сообщения, необходимо
указать метод POST (cgimail2.htm). В этом случае
сообщение должно уйти абоненту без открытия
окна почтового клиента:
<FORM METHOD=post
ACTION=mailto:help@domain.ru>
<INPUT NAME=n1 VALUE="Поле1">
<INPUT TYPE=BUTTON VALUE="Отправить">
</FORM>
В данном случае мы использовали протокол, отличный от HTTP — SMTP. В нем нет понятия метода доступа вообще. Тем не менее логика разбиения текстовых сообщений для всех протоколов одна и та же, как, собственно, и предполагалось при создании Web-технологии — унификация доступа к ресурсам.
FORM (HTTP). Основной целью введения форм в HTML было обеспечение ввода данных в прикладную программу из универсального мультипротокольного браузера. При этом нужно отдавать себе отчет, что прикладная программа естественным образом должна выполняться на компьютере, где функционирует HTTP-сервер. Она не может работать в пустоте. Программу должен кто-то загружать, настраивать в адресном пространстве компьютера (linking), передавать ей управление и удалять из памяти после ее завершения.
Основная
задача формы — это предоставление
шаблона ввода данных, которые
будут переданы скрипту. Сам скрипт
при этом указывается через URL, который
задается в атрибуте ACTION:
<FORM ACTION=script.cgi>
<INPUT NAME=n1 VALUE="Поле1">
<INPUT NAME=n2 VALUE="Поле2">
<INPUT TYPE=BUTTON VALUE="Отправить">
</FORM>
или
<FORM METHOD=post ACTION=script.cgi>
<INPUT NAME=n1 VALUE="Поле1">
<INPUT NAME=n2 VALUE="Поле2">
<INPUT TYPE=BUTTON VALUE="Отправить">
</FORM>
В данном примере скрипт просто распечатывает пару "имя поля формы — значение поля формы" в виде HTML-таблицы (formcgi1.htm).
FORM (SSI). Когда говорят о формах, обычно предполагается, что в контейнере FORM обязательно должен быть указан адрес скрипта. Этот скрипт примет данные и "на лету" сгенерирует страницу, которая и будет возвращена пользователю. Из этого правила существует, по крайней мере, два исключения.
Во-первых,
атрибут ACTION можно не указывать в том случае,
если данные, введенные в форму, обрабатываются
JavaScript-программой. В этом случае достаточно
дать форме имя, чтобы к ее элементам (контейнерам)
можно было обращаться. Передачу данных
можно реализовать через метод submit, который
будет выполняться при нажатии на гипертекстовую
ссылку, например, formssi1.htm. Более подробно
данный материал описан в главе "Программирование
на JavaScript".
Во-вторых,
принять данные можно через скрипт,
который встроен в документ как Server
Side Include. Этот способ показан ниже.
<FORM>
<INPUT NAME=n1 VALUE="Поле1">
<INPUT NAME=n2 VALUE="Поле2">
<INPUT TYPE=BUTTON VALUE="Отправить">
<HR>
<!--#exec cgi=./cgi.cgi -->
</FORM>
Сам
скрипт принимает запрос из QUERY_STRING
и распечатывает его в виде HTML-таблицы.
При этом результат распечатывается вслед
за формой после горизонтального отчеркивания.
Точно так же можно обработать данные
и методом POST, только для этого необходимо
указать его в атрибуте METHOD контейнера
FORM.
В заключении, как обычно, подведем черту под рассматриваемой темой и коротко сформулируем преимущества CGI.
1. Так как программа выполняется сервером, нет никакого значения, какой у посетителя браузер - древний Lynx или новейший Internet Explorer. Нет никаких возможных недоразумений и сообщений об ошибках.
2. CGI-скрипты позволяют реализовать гораздо более широкий набор функций чем, например, Java и JavaScript.
3. Код cgi-скрипта закрыт для конкурентов.
4.
Писать CGI-скрипты можно практически
на любом из современных языков программирования.
Но
также стоит заметить, что в
настоящее время существует ряд
языков для Web-программирования, которые
несколько снижают необходимость в написании
CGI-скриптов. Среди таких языков можно
назвать PHP и ASP. Но рассмотрение этих языков
в рамках данной работы целью не является.
1.
Материалы с сайта www.intuit.
2.
Материалы с сайта http://www.
3.
Материалы с сайта http://pwd.
4.
Материалы с сайта http://php.
5. Лекционный материал по курсу «IT»