Листинг 7.1. Файл chap7\controls\controls. htm
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>Органи керування у формах</ТITLЕ>
</HEAD>
<BODY BGCOLOR=#FFFFFF>
<FORM METHOD=POST ACTION="http://www.someserver.ru/frolov-cgi/controls.exe">
<TABLE>
<TR>
<TD VALIGN=TOP> Текстове поле ТЕХТ</ТD>
<TD><INPUT TYPE=text NAME="text1" VALUE="Sample of textl" SIZE=30></TD>
</TR>
<TR>
<TD VALIGN=TOP>Текстове поле PASSWORD</TD>
<TD><INPUT TYPE=password NAME="pwd" VALUE="Sample of password"></TD>
</TR>
<TR>
<TD VALIGN=TOP> Текстове поле TEXTAREA</TD>
<TD><TEXTAREA NAME="text2" ROWS=4 COLS=30>Sample of text</TEXTAREA></TD>
</TR>
<TR><TD VALIGN=ТОР>Перемикачі СНЕСКВОХ</ТD>
<TD>
<INPUT TYPE=CHECKBOX NAME="chk1" VALUE="on" CHECKED>Перший <BR>
<INPUT TYPE=CHECKBOX NAME="chk2" VALUE="оn">Другий<ВR>
<INPUT TYPE=CHECKBOX NAME="chk3" VALUE="on" СНЕСКЕD>Третій<ВR>
</TD>
</TR>
<TR><TD VALIGN=TOP>Перемикачі RADIO</TD>
<TD>
<INPUT TYPE=RADIO NAME="rad" VALUE="on1" СНЕСКЕD>Перший<ВR>
<INPUT TYPE=RADIO NAME="rad" VALUE="on2">Bтoрой<BR>
<INPUT TYPE=RADIO NAME="rad" VALUE="оn">Третій<ВR>
</TD>
</TR>
<TR><TD VALIGN=TOP>Список</TD>
<TD>
<SELECT NAME="sel" SIZE=”1”>
<0PTION Value="First Option">First Option</OPTION>
<OPTI0N Value="Second Option">Second Option</OPTI0N>
<OPTION Value="None">None Selected</OPTION>
</SELECT>
</TD>
</TR>
<TR>
<TD VALIGN=ТОР>Схований орган керування</ТЕ>
<TD>
<INPUT TYPE=HIDDEN NAME="hid" VALUE="Hidden"></TD>
</TR>
</TABLE>
<BR>
<INPUT TYPE=submit VALUE="Send">
<INPUT TYPE=reset VALUE="Reset">
<P><INPUT TYPEIMAGE SRC="$end.gif" BORDER=0>
</FORM>
</BODY>
</HTML>
Оператор <FORM> тут має 2 параметр - METHOD і ACTION:
<FORM METHOD=POST ACTION="http://www. someserver. ru/frolov-cgi/controls. exe">
Мал. 7.2. Форма в документі HTML із різноманітними органами керування
Параметр METHOD має значення POST і задає засіб передачі даних програмі CGI через стандартний потік запровадження.
У параметрі ACTION зазначений шлях до завантажувального файла програми CGI, що знаходиться в каталозі frolov-cgi серверу WWW з адресою http://www.someserver.ru.
Програми CGI (а також розширення серверу WWW у виді бібліотек динамічного компонування DLL з інтерфейсом ISAPI, що будуть розглянуті в такій главі) можуть знаходитися не в будь-якому каталозі серверу WWW, а тільки в такому, для якого дозволене виконання програм. Якщо створюється виртуальный сервер WWW, що фізично розташовується в постачальника послуг Internet, можливо, вам прийдеться одержати дозвіл на створення або використання такого каталога.
Тепер можна зайнятися органами керування.
Всі органи керування розміщені в таблиці. У першому рядку цієї таблиці знаходиться однострочное поле для запровадження тексту, що вставлений у форму оператором <INPUT> і мають тип TEXT:
<TD><INPUT TYPE=text NAME="text1" VALUE="Sample of text1" SIZE=30></TD>
Ім'я поля зазначено в параметрі NAME як "text1”. У якості початкового значення для поля параметром VALUE заданий рядок "Sample of text1” Цей рядок можна буде редагувати після відображення форми. Також зазначений розмір поля, рівний 30 символам, параметром SIZE.
В другому рядку таблиці також за допомогою оператора <INPUT> визначене поле для запровадження пароля:
<TD><INPUT TYPE=password NAME=”pwd" VALUE=”Sample of password"></TD>
При запровадженні символів у цьому полі вони не відображаються. Аналогічно не відображається і початковий рядок, використаний для ініціалізації поля.
Для запровадження многострочного тексту в третьому рядку таблиці за допомогою оператора <TEXTAREA> розміщена область запровадження тексту:
<TD><TEXTAREA NAME="text2" ROWS=4 COLS=30>Sample of text</TEXTAREA></TD>
Ім'я цього поля задане як "text2". Поле має висоту, рівну чотирьом рядкам (параметр ROWS дорівнює чотирьом), і ширину, рівну 30 символам (параметр COLS дорівнює 30).
У четвертому рядку таблиці розташована група з трьох незалежних перемикачів типу CHECKBOX:
<TD>
<INPUT TYPE=CHECKBOX NAME="chk1" VALUE="on" СНЕСКЕD>Перший<ВР>
<INPUT TYPE=CHECKBOX NAME="chk2" VALUE="on">Другий<BR>
<INPUT TYPE=CHECKBOX NAME="chk3" VALUE="on" СНЕСКЕD>Третій<ВР>
</TD>
Кожний із цих перемикачів має власне ім'я, задане параметром NAME. Оператор VALUE задає значення, що буде послано в сервер WWW при вмиканні перемикача. До речі, якщо перемикач виключений, він не посилає в сервер WWW ніяких даних.
Нижче, у пятой рядку, знаходиться група з трьох перемикачів типу RADIO із залежною фіксацією:
<ТD>
<INPUT TYPE=RADIO NAME=*rad" VALUE="on1" СНЕСКЕD>Перший<ВR>
<INPUT TYPE=RADIO NAME="rad" VALUE="on2">Другий<ВR>
<INPUT TYPE=RADIO NAME="rad" VALUE="on3">Tpетий<BR>
</TD>
Всі перемикачі, що ставляться до одной' групи, повинні називатися однаково. У даному випадку за допомогою параметра NAME задано для всіх трьох перемикачів ім'я "rad".
Перший перемикач включений по умовчанню, тому що для нього заданий параметр CHECKED.
Для того щоб при аналізі даних, отриманих від форми, програма CGI могла визначити, який із перемикачів, що входять у групу, був включений, задано для кожного перемикача своє значення параметра VALUE.
Шостий рядок таблиці містить список, що складається з трьох рядків. Цей список визначений за допомогою операторів <SELECT> і <OPTION>, як це показано нижче:
<ТЕ>
<SELECT NAME="Sel" SIZE="1">
<OPTION Value="first Option">First Option</OPTION>
<OPTI0N Value="Second Option">Second Option</OPTION>
<OPTION Value="None">None S«lec1ed</OPTI0N>
</SELECT>
</TD
Ім'я списку задане як "sel", а висота його дорівнює одному рядку. Вміст рядків списку задається за допомогою параметра VALUE відповідних операторів <OPTION>.
Останній рядок таблиці містить схований орган керування, що не відображається у вікні навігатора:
<TD><INPUT TYPE=HIDDEN NAME="hid" VALUE="Hidden"></TD>
Орган посилає серверу WWW рядок "Hidden", задану в параметрі VALUE.
Під таблицею у формі розташовані три кнопки, перші дві з який стандартні, а третя зроблена за допомогою графічного зображення. Ці кнопки вставлені за допомогою оператора <INPUT> у такий спосіб:
<BR>
<INPUT TYPE=submit VALUE="Send">
<INPUT TYPE=reset VALUE="Reset”>
<P><INPUT TYPE=IMAGE SRC=”send. gif” BORDER=0>
Кнопка типу SUBMIT має напис Send і призначена для посилки даних із форми в сервер WWW для опрацювання програмою CGI.
Кнопка типу RESET призначена для того, щоб користувач, зрадивши дані у формі, міг знову повернутися до значень, заданим по умовчанню за допомогою параметра VALUE в операторах визначення органів керування. Ця кнопка має напис Reset.
Остання кнопка має тип IMAGE. Її зображення знаходиться у файлі send.gif, адреса URL котрого (у даному випадку це просто ім'я файла) зазначений у параметрі SRC. Для того щоб навколо зображення кнопки не було рамка, зазначена нульове значення параметра BORDER.
Програма CGI одержить від графічної кнопки координати точки, у якій знаходився курсор миші в момент натискання на цю кнопку. Таким чином, можливо створення кнопки у виді сегментированного графічного зображення. Програма CGI зможе визначити, у якій області зображення був зроблений щиголь мишею при відправленні заповненої форми на опрацювання.
7.2. Передача даних програмі CGI
Коли користувач заповнює форму і натискає на кнопку типу SUBMIT або на графічну кнопку (який виконує аналогічну функцію), дані з полів форми разом з іменами цих полів передаються навігатором серверу WWW. Сервер у свою чергу аналізує ці дані і запускає відповідну програму CGI, шлях до файла якої зазначений в операторі <FORM>.
Перед запуском програми CGI сервер WWW вибирає в залежності від значення параметра METHOD оператора <FORM> один із двох засобів передачі отриманих даних для опрацювання. Це методи GET і POST.
7.2.1. Метод GET
Метод GET припускає передачу даних програмі CGI через перемінне середовище (environment variables). Це те саме перемінне середовище, що встановлюються в операційній системі MS-DOS командою SET.
Сервер WWW створює для програми CGI досить багато переменных середовища. Імена і призначення всіх цих перемінних будуть приведені пізніше, а поки - тільки самі необхідні.
Насамперед, метод GET припускає використання перемінне середовище з ім'ям QUERY_STRING. Саме сюди потрапляють дані з полів форми. Ці дані знаходяться в такому форматі:
Имя1=Значение1&Имя2=Значение2&Имя=Значение3
Тут у якості імен використовуються значення параметрів NAME, що задають імена поляж форми. Замість значень подставляются дані з відповідних полів. Скануючи вміст текстового рядка перемінне середовище QUERY_STRING, програма CGI може знайти в ній ім'я будь-якого потрібного поля і відповідного цього імені значення. Ніякі дані від виключених перемикачів не передаються, тому не варто думати, що в отриманому рядку обов'язково зустрінуться імена всіх поляж, розташованих у формі.
Адреса заданого рядка перемінне середовище в програмі, складеної на С, легко одержати за допомогою функції getenv:
char *szQueryString;
szQueryString = getenv("QUERY_STRING");
Якщо модифікується рядок перемінне середовище, те її варто скопіювати у внутрішній буфер. Операційна система серверу WWW може не припустити прямого редагування блока пам'яті, що містить перемінних середовищ.
Рядок, переданий у перемінне середовище QUERY_STRING, закодирована з використанням так називаної кодировки URL. У цій кодировке всі символи прогалин заміняються на символи +. Крім того, для уявлення кодів керуючих і деяких інших символів використовується послідовність символів виду %хх, де символи хх являють собою шестнадцатеричный код символу у виді двох символів ASCII.
7.2.2. Метод POST
При використанні методу POST програма CGI одержує дані з форми через стандартний потік запровадження STDIN. Якщо програма CGI складена на мові програмування С, то для одержання даних вона може скористатися такими функціями, як fread або scanf.
Що ж стосується кількості байтів даних, що потрібно вважати зі стандартного потоку запровадження, то ця інформація передається програмі CGI через переменную середовища з ім'ям CONTENT_LENGTH.
Нижче приведений фрагмент коду для визначення розміру інформації для запровадження через стандартний потік STDIN:
int Size;
Size = atoi(getenv("CONTENT_LENGTH"));
Вхідні дані можуть бути потім отримані, наприклад, у такий спосіб:
char szBuf[8196];
fread(szBuf, Size, 1, stdin);
Зрозуміло, буфер для читання даних можна замовляти і динамічно, для чого варто скористатися такою функцією, як malloc.
Якщо в операторі <FORM> не зазначений параметр ENCTYPE (тип MIME переданих даних) або цей параметр має значення application/x-www-form-urlencoded, дані, отримані через стандартний потік запровадження, закодированы в кодировке URL Перед використанням випливає їх раскодировать відповідним чином.
7.2.3. Що краще - GET або POST
Метод GET звичайно використовується для опрацювання невеличких форм, тому що навігатори накладають обмеження для розміру даних, переданих через переменную середовища QUERYJSTRING.
У цьому відношенні метод POST є більш кращим, тому що не накладає на розмір переданих даних ніяких обмежень. Тільки метод POST придатний для передачі файлів із локального комп'ютера через навігатора в сервер WWW.
7.3. Передача відповіді з програми CGI
Поза залежністю від використаного методу передачі даних (GET або POST) результат своєї роботи програма CGI повинна направити в стандартний потік висновка STDOUT. Якщо програма складена на мові програмування С, для запису результату роботи вона може скористатися, наприклад, функцією printf або fwrite.
Частіше усього програми CGI використовуються для створення динамічних документів HTML на основі даних, отриманих із форми. У цьому випадку першим рядком, що необхідно вивести в стандартний потік висновка STDOUT, повинна бути такий рядок заголовка HTTP:
Content-type: text/html
Відразу за цим рядком необхідно вивести ще один порожній рядок, що послужить роздільником між заголовком HTTP і даними документа HTML.
Нижче приведений фрагмент коду, у якому програма CGI динамічно формує документ HTML і виводить його в стандартний потік висновка STDOUT:
printf("Content-type: tеxt/html\n\n");
printf("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2//EN\">");
printf("<HTML><HEAD><TITLE>XYZ Incorporation</TITLE></HEAD><BODY BGCOLOR=#FFFFFF”>");
printf(“<Н1>Результати опрацювання форми</Н1>");
printf("</BODY></HTML>”);
Варто звернути увагу на символи перекладу рядка \n\n. Перший із них закриває рядок заголовка HTTP, а другий потрібний для створення порожнього розділювального рядка.
7.4. Перемінне середовище для програми CGI
Перед тим, як перейти до прикладів програм CGI, ми вивчимо перемінні середовища, що формуються для цих програм перед запуском. Через ці перемінні, крім даних із полів форм, передається й інша дуже важлива інформація, що не завжди варто ігнорувати.
Вивчення переменных середовища треба почати з того, що переглянути їхнє значення за допомогою найпростішої програми CGI, створеної з використанням мови пакетних завдань операційної системи Microsoft Windows NT, а простіше говорячи, за допомогою звичайного файла з розширенням імені bat.
Для запуску цієї програми можна підготувати форму, вихідний текст якої поданий у листинге 7.2.
Дата добавления: 2015-04-19; просмотров: 686;