Создание простой формы

Создадим простую форму,_ реализующую ссылку из документа main.shtml на сценарий books.cgi.

Вставьте следующие две строки после последней записи ссылки, которая была создана в файле main.shtml:

<BR> Basic form using GET method <A HREF="/cgi‑bin/books.cgi" >Form1</A>

Теперь введите следующий код и сохраните его в файле books.cgi; не забудьте поместить этот файл в каталог cgi‑bin.

$ pg books.cgi

#!/bin/sh

# сценарий books.cgi

echo "Content‑type: text/html"

echo ""

echo "<HTML>"

echo "<BODY>"

# вызов books_result.cgi, затем пользователь щелкает на кнопке отправки

echo "<FORM action="/cgi‑bin/books_result.cgi" METHOD=GET>"

echo "<H4> CGI FORM</H4>"

#текстовое поле, результаты ввода присвоены переменной с именем 'contact' echo "Your Name: <INPUT NAME=contact SIZE=30><BR><BR>"

#раскрытие выбранного пункта меню, присвоенного переменной 'film'

echo "<SELECT NAME=film>"

echo "<OPTION>"-— Pick a Film --"

echo "<OPTION>A Few Good Men"

echo "<OPTION>Die Hard"

echo "<OPTION>Red October"

echo "<OPTION>The Sound Of Music"

echo "<OPTION>Boys In Company C"

echo "<OPTION>Star Wars"

echo "<OPTION>Star Trek"

echo "</SELECT>"

# раскрытие выбранного пункта меню, присвоенного переменной 'actor'

echo "<SELECT NAME=actor>"

echo "<OPTION>— Pick Your Favourite Actor —"

echo "<OPTION>Bruce Willis"

echo "<OPTION>Basil Rathbone"

echo "<OPTION>Demi Moore"

echo "<OPTION>Lauren Bacall"

echo "<OPTION>Sean Connery"

echo "</SELECT>"

echo "<BR><BR>"

# имена переменных флажков 'view_cine' и 'view_vid'

echo "Do you watch films at the..<BR>"

echo "<INPUT TYPE="Checkbox" NAME=view_cine> Cinema"

echo "<INPUT TYPE="Checkbox" NAME=view_vid> On video"

echo "<BR><BR>"

# результаты ввода, присвоенного переменной 'textarea'

echo "Tell what ls your best film, or just enter some comments<BR>"

echo "<TEXTAREA COLS="30" ROWS="4" NAME="textarea"></TEXTAREA>"

echo "<BR><INPUT TYPE=Submit VALUE="Send it">"

echo "<INPUT TYPE="reset" VALUE="clear Form">"

echo "</FORM>" echo "</BODY>" echo "</HTML>"

Действие form action выбирается, как только пользователь щелкнет на кнопке 'Send it', в результате чего вызывается сценарий books_result.cgi. В этом случае будет использоваться метод get.

В форме, код которой приведен выше, отображаются два текстовых поля, два раскрывающихся поля и два флажка.

Текстовое поле, предназначенное для ввода пользовательского имени, имеет длину 30 символов; результаты ввода присваиваются переменной contact.

Первое раскрывающееся меню обеспечивает выбор любимого пользовательского фильма; выбранная опция присваивается переменной film.

Второе раскрывающееся меню обеспечивает выбор любимого актера; выбранная опция присваивается переменной actor.

Можно установить один или оба флажка, выполнив щелчок мышью на требуемом варианте. Выбранные значения хранятся в переменных view_cine и view_vid. Если пользователь указывает один из флажков, переменные должны иметь значение "on".

Область текстового поля обеспечивает ввод большего количества строк текста, чем стандартное текстовое поле (текст, разбитый на 30 столбцов и 4 строки, в нашем случае(, а вся введенная информация присваивается переменной textarea.

Для отсылки данных в качестве типа ввода указывается слово submit. Чтобы очистить форму, щелкните на кнопке clear.

Введите следующий сценарий cgi, назовите его books_result.cgi и сохраните его в каталоге cgi‑bin.

$ pg books_result.cgi

#!/bin/sh

#сценарий books_result.cgi

#вывод на печать настроек web–сервера env для метода get

echo "Content‑type: text/html"

echo ""

echo "<HTML><PRE>"

echo "<PRE>"

echo " Results from a GET form"

echo "REQUEST_METHOD : $REQUEST_METHOD"

echo "QUERY STRING : $QUERY_STRING"

echо "</PRE></HTML>"

Сценарий отображает значения пары переменных cgi, query_strinG и request_method. Переменная Query_string будет хранить все данные в виде кодированной строки, которая отправлена формой, созданной с помощью сценария books.cgi. Переменная request_method сохраняет тип используемого метода; в данном случае будет выбран метод get. На рис. 29.7 показано, как выглядит форма, созданная с помощью сценария books.cgi.

Linux и UNIX: программирование в shell. Руководство разработчика _13.jpg

Рис. 29.7. Форма cgi, использующая метод get

Теперь выполним ввод и отсылку некоторой информации (рис. 29.8). После щелчка на кнопке 'Send it' отображается страница, показанная на рис. 29.9. Значение переменной QUERY_string отображается только частично по причине большой длины строки. Ниже приведена строка, имеющая полную длину:

contact=David+Tansley&f ilm=The+So_md+Of+Music&actor=Bruce+Willis&view_cine=onS,view_vid=onbtextarea=%21%22%A3%A3%24%25 %24%25%5E*%5E%26*%28%29*%2 8%29%28*%OD%OAHow%27s+that+%21%21

Linux и UNIX: программирование в shell. Руководство разработчика _14.jpg

Рис. 29.8. Выбор и ввод информации в форму

Linux и UNIX: программирование в shell. Руководство разработчика _15.jpg

Рис. 29.9. Информация, отправленная формой, закодирована

Для пересланной информации необходимо иметь следующие поля, присвоенные

переменной query string, показанной выше:

Переменная

Значение переменной

contact

David Tan$1ey

film

The Sound of Music

actor

Bruce Willis

view cine

Если установлено значение on, то флажок выбран

view_vid

Если установлено значение on, то флажок выбран

textarea

!"%$%А*А&*о*о(*

How's that it!

Декодирование закодированной строки

После того как пользователь щелкнет на кнопке "submit", информация присваивается переменной query_string, а строка кодируется следующим образом: • Все пробелы заменяются знаками +.

   •  Все поля значений разделяются символами &.

   • Все значения и соответствующие поля разделяются знаками =.

   • Все символы и некоторые специальные символы представляются кодами %ху, где xy является шестнадцатеричным эквивалентом данного символа. При просмотре переменной QUERY_STRING можно заметить, что многие из этих символов представлены переменной textarea.

Протокол cgi определяет, что любые символы в форме %ху (где xy является шестнадцатеричным числом) могут быть преобразованы в эквивалентные символы ASCII. Эти шестнадцатеричные символы состоят из специальных символов &, %, +, =, (, ) и всех других символов, выходящих за рамки десятичного диапазона ASCII с границей 127. Например, символу ( соответствует эквивалент в виде %29.