Сервер Web своими руками. Язык HTML, приложения CGI и ISAPI

Программа AREF


До сих пор в наших примерах мы использовали программы CGI только для обработки данных из полей форм, указывая адрес URL загрузочного файла программы в параметре ACTION оператора <FORM>. Однако есть и другая возможность вызова программ CGI: вы можете указать их адрес в параметре HREF оператора ссылки <A>. В этом случае вы можете передать программе CGI параметры, указав их после имени файла загрузочного модуля через разделительный символ “?”. Программа получит строку параметров методом GET и сможет извлечь ее из переменной среды с именем QUERY_STRING.

Пример документа HTML, в котором демонстрируется вызов программы CGI указанным выше способом, приведен в листинге 7.7.

Листинг 7.7. Файл chap7\aref\aref.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">

<HTML>

  <HEAD>

    <TITLE>Ссылки на документы HTML</TITLE>

  </HEAD>

  <BODY BGCOLOR=#FFFFFF>

    <A HREF="http://frolov/frolov-cgi/aref.exe?page1">Домашняя страница</A><BR>

    <A HREF="http://frolov/frolov-cgi/aref.exe?page2">Книги</A><BR>

    <A HREF="http://frolov/frolov-cgi/aref.exe?page3">Статьи</A><BR>

  </BODY>



</HTML>

В этом документе есть три ссылки на программу CGI с именем aref.exe, причем каждый раз ей передаются разные параметры. Внешне документ выглядит так, как это показано на рис. 7.8.

Рис. 7.8. Документ HTML с ссылками на программу CGI

Программа CGI принимает параметр и в зависимости от его значения отображает один из документов HTML. Например, при выборе третьей строки в окне навигатора отображается документ, показанный на рис. 7.9.

Рис. 7.9. Документ, который отображается программой CGI при выборе строки “Статьи”

Исходный текст программы AREF достаточно прост и приведен в листинге 7.8.

Листинг 7.8. Файл chap7\aref\aref.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void main(int argc, char *argv[])


{

  char * szQueryString;

  szQueryString = getenv("QUERY_STRING");

  if(!strcmp(szQueryString, "page1"))

    printf("Location: home.htm\n\n");

 

  else if(!strcmp(szQueryString, "page2"))

    printf("Location: books.htm\n\n");

 

  else if(!strcmp(szQueryString, "page3"))

    printf("Location: capital.htm\n\n");

  else

    printf("Location: error.htm\n\n");

}

Программа получает значение переменной среды QUERY_STRING, пользуясь для этого функцией getenv. Далее она сравнивает значение параметра со строками “page1”,  “page2” и “page3”. При совпадении программа возвращает навигатору адрес URL соответствующего документа HTML, формируя заголовок HTTP специального вида:

Location: <Адрес URL документа HTML или графического изображения>\n\n

Когда навигатор получает от сервера WWW такой заголовок, он отображает в своем окне документ или файл графического изображения, адрес URL которого указан в заголовке.

Таким образом, программа CGI может анализировать параметры, поступающие от навигатора через ссылку или поля формы, а затем не только динамически формировать документ HTML для отображения в окне навигатора, но и возвращать ссылки на уже существующие документы в виде их адресов URL.

Эта возможность может пригодиться вам для организации ссылок на документы HTML через списки, создаваемые оператором <SELECT>, расположенном в форме. Программа CGI может определить, какая строка была выбрана в списке в момент посылки заполненной формы серверу WWW, и в зависимости от этого либо возвратить ссылку на тот или иной существующий документ HTML, либо сформировать новый документ HTML динамически.


Содержание раздела