Программирование форм

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

Самый важный совет, который мы можем дать по поводу программирования форм, легко запомнить – копируйте чужие работы. Писать обрабатывающее форму приложение с чистого листа очень трудно. Копировать работающее приложение и модифицировать его для нужд своей формы – гораздо легче.К счастью, поставщики серверов знают об этом и обычно поставляют образцы обрабатывающих формы приложений вместе с сервером. Покопайтесь немного в каталоге cgi-src, и вы найдете ряд полезных примеров, которые сможете скопировать и применять.

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

Прежде чем мы начнем, примите во внимание, что не все серверы вызывают эти приложения одинаково.


Наши примеры покрывают широкий класс серверов, произошедших от оригинального HTTP-сервера, созданного в центре NCSA (National Center for Supercomputing Applications, Национальный центр по использованию суперкомпьютеров). Они также должны работать с очень популярным и легко доступным сервером Apache. Во всех случаях обращайтесь за разъяснениями к серверной документации. Подробную информацию можно найти в книгах: «CGI Programming with Perl» Скотта Гулича (Scott Guelich), Шишира Гундаварама (Shishir Gundavaram) и Гюнтера Бирзнекса (Gunther Birznieks), «Webmaster in a Nutshell»2 Стивена Спейнауэра (Stephen Spainhour) и Роберта Экштейна (Robert Eckstein), выпущенных издательством «O’Reilly».

Альтернативой CGI-программированию является модель Java-сервлетов3, описанная в книге «Java Servlet Programming»4, принадлежащей перу Джейсона Хантера (Jason Hunter) и Вильяма Кроуфорда (William Crawford) (O’Reilly). Сервлеты могут применяться для обработки как GET-, так и POST-форм, хотя они посвящены более общим вопросам. В этой книге нет примеров сервлетов.

Возвращение результатов
Прежде чем начать, мы должны обсудить, как завершается работа приложения со стороны сервера.


Все приложения со стороны сервера передают свои результаты назад серверу (и далее – пользователю), наравляя их в стандартный вывод приложения в виде файла в MIME- кодировке. Следовательно, первая строка вывода должна быть MIME-описателем типа содержимого. Если ваше приложение возвращает HTML-документ, первая строка это:

Content-type: text/html

Вторая строка должна быть совершенно пустой. Ваше приложение может возвращать содержимое и другого типа – только укажите правильно MIME-тип. Изображениям GIF, например, предшествует:

Content-type: image/gif

Собственно текст, который не должен интерпретироваться как HTML, может возвращаться как:

Content-type: text/plain

Это часто оказывается полезным, когда приходится возвращать вывод других команд, генерирующих простой текст вместо HTML.

Обработка GET-форм
Когда применяется метод GET, броузер передает параметры формы в виде части URL-адреса, который вызывает приложение формы со стороны сервера. Типичный вызов приложения типа GET может использовать примерно такой URL:

http://www.kumquat.com/cgi-bin/dump_get?name=bob&phone=555-1212

Когда сервер www.kumquat.com обрабатывает этот URL, он вызывает приложение под названием dump-get, хранящееся в каталоге cgi-bin.


Все, что идет после знака вопроса, передается приложению в качестве параметров.

Далее дело может обстоять по-разному, в соответствии с природой URL типа GET. В то время как формы помещают в URL пары имя/значение, можно вызывать приложения типа GET с URL, содержащим только значения. Таким образом:

http://www.kumquat.com/cgi-bin/dump_get?bob+555-1212

это тоже допустимый вызов с параметрами, разделенными знаком «плюс» (+). Такой вызов обычно встречается, когда на приложение ссылается поисковый документ с тегом . Параметры, набранные пользователем в поле ввода, передаются приложению со стороны сервера как безымянные параметры, разделенные знаком «плюс».

Если вызывать GET-приложение с поименованными параметрами, сервер передаст эти параметры приложению одним способом. Безымянные параметры передаются по-другому.

Использование поименованных параметров с GET-приложениями
Поименованные параметры передаются GET-приложениям путем создания переменной окружения QUERY_STRING и присваивания ей в качестве значения всей той части URL, которая следует за вопросительным знаком. Если взять наш предыдущий пример, значением QUERY_STRING будет:

name=bob&phone=555-1212

Ваше приложение должно получить эту переменную и выделить из нее пары имя/значение.


К счастью, большинство серверов поставляются вместе с рядом стандартных программ, выполняющих эту работу, так что простая С-программа, просто распечатывающая параметры, может выглядеть примерно так:

#include
#include
#define MAX_ENTRIES 10000
typedef struct {char *name;
char *val;
}entry;
char *makeword(char *line, char stop);
char x2c(char *what);
void unescape_url(char *url);
void plustospace(char *str);
main(int argc, char *argv[])
{ entry entries[MAX_ENTRIES];
int num_entries, i;
char *query_string;
/* Получить значение переменной окружения QUERY_STRING */
query_string = getenv("QUERY_STRING");
/* Извлечь параметры, построить таблицу вхождений */
for (num_entries = 0; query_string[0]; num_entries++) {
entries[num_entries].val = makeword(query_string, '&');
plustospace(entries[num_entries].val);
unescape_url(entries[num_entries].val);
entries[num_entries].name =
makeword(entries[num_entries].val, '=');
}
/* Выдать "рыбу" HTML */
printf("Content-type: text/html\n");
printf("\n");
printf();
printf();
printf("Именованные параметры\n");
printf("");
printf();
printf("Вы ввели следующие параметры:\n");
printf("
    \n");/* Выдать полученные от пользователя параметры */
    for(i = 0; i < num_entries; i++)
    printf("
  • %s = %s\n", entries[i].name,
    entries[i].val);
    /* И завершить выдачу "рыбы" */
    printf("
\n");
printf("\n");
printf("\n");
}

Эта программа начинается с нескольких объявлений, которые определяют стандартные функции, просматривающие строку символов и выделяющие имена параметров и их значения.


Тело программы получает значение переменной окружения QUERY_STRING, применяя системный вызов getenv(), употребляет стандартные функции для выделения параметров из этого значения и затем порождает простой HTML-документ, который отображает эти значения для пользователя.

В реальных приложениях вы должны вставить действительные коды обработки параметров после их выделения и перед генерацией HTML.

Разумеется, вам также нужно изменить выдаваемый HTML-текст в соответствии с функцией вашего приложения.

Использование безымянных параметров с GET-приложениями
Безымянные параметры передаются приложению как параметры командной строки. Это делает разработку приложения со стороны сервера почти тривиальной. Вот простая последовательность команд, печатающая значения параметров:

#!/bin/csh -f
#
# Вывод заданных пользователем неименованных параметров типа GET
echo "Content-type: text/html"
echo
echo ''
echo ''
echo 'Вывод неименованных параметров'
echo ''
echo ''
echo 'Вы задали следующие параметры:'
echo '
    '
    foreach i ($*)
    echo '
  • ' $i
    endecho '
'
echo ''
exit 0

Мы снова следуем тому же общему правилу: выводим типовой заголовок документа, включающий MIME-тип содержимого, за ним – параметры и стандартное завершение. Чтобы преобразовать это в реальное приложение, замените цикл foreach командами, которые что-то действительно делают.

Обработка POST-форм
Приложения, принимающие параметры HTML/XHTML для метода POST, будут читать закодированные параметры из своего стандартного ввода. Подобно GET-приложениям с поименованными параметрами они могут воспользоваться стандартными функциями сервера, чтобы разобрать эти параметры:

#include
#include
#define MAX_ENTRIES 10000
typedef struct {char *name;
char *val;
} entry;
char *makeword(char *line, char stop);
char *fmakeword(FILE *f, char stop, int *len);
char x2c(char *what);
void unescape_url(char *url);
void plustospace(char *str);
main(int argc, char *argv[])
{ entry entries[MAX_ENTRIES];
int num_entries, i;
/* Извлечь параметры из stdin, построить таблицу вхождений */
for (num_entries = 0; !feof(stdin); num_entries++) {
entries[num_entries].val = fmakeword(stdin, '&', &cl);
plustospace(entries[num_entries].val);
unescape_url(entries[num_entries].val);
entries[num_entries].name =
makeword(entries[num_entries].val, '=');
}
/* Выдать "рыбу" HTML */
printf("Content-type: text/html\n");
printf("\n");
printf();
printf();
printf("Именованные параметры\n");
printf("");printf();
printf("Вы ввели следующие параметры:\n");
printf("
    \n");
    /* Выдать полученные от пользователя параметры */
    for(i = 0; i < num_entries; i++)
    printf("
  • %s = %s\n", entries[i].name,
    entries[i].val);
    /* And close out with more boilerplate */
    printf("
\n");
printf("\n");
printf("\n");
}

И снова мы следуем той же общей схеме. Первые строки программы состоят из объявлений разных стандартных процедур, необходимых для разбора параметров, и объявления структуры, в которой будет содержаться их список. Настоящий код начинается с чтения списка параметров из стандартного ввода и построения списка имен и значений параметров в массиве под названием entries. Когда с этим покончено, в стандартный вывод печатается типовой заголовок документа, за которым идут параметры и шаблонное завершение.

Как и другие примеры, эта программа вполне пригодна для проверки параметров, передаваемых серверному приложению, пока вы новичок в формах и отладке приложений. Ее также можно использовать как основу для других приложений, вставляя подходящий обрабатывающий код после того, как список параметров построен, и изменяя вывод программы, чтобы отправлять пользователю соответствующие результаты.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела HTML на эту тему:
Атрибуты формы общего назначения
Группировка элементов формы и обеспечение их надписями
Многострочные области ввода текста
Получение данных из форм при помощи электронной почты
Простой пример формы

Вернуться в раздел: HTML / 9. Формы