Январь 18, 2006
Взаимодействие нескольких форм
Введение
Одним из недостатков HTTP протокола является невозможность сохранения состояния, или, другими словами, отсутствие поддержки транзакций, когда несколько последовательных действий пользователя объединяются в одно законченное действие.
Хрестоматийным примером при обсуждении этого вопроса является система заказа товаров (виртуальный магазин). Не будем изменять традициям, рассмотрим данный пример.
Представьте себе Веб-систему, которая предлагает каталог товаров, возможность помещения этих товаров в "виртуальную корзину", подсчет общей стоимости покупки, оформление заказа. Весь этот процесс невозможно осуществить в пределах одной страницы, поэтому необходимо придумать способ взаимодействия нескольких сценариев друг с другом, для того чтобы сохранять текущий контекст, позволяющий отслеживать покупателей на всем их пути по магазину.
Существует несколько стратегий, позволяющих осуществить сохранение контекста. Ими являются:
Скрытые поля. Используя скрытые поля, можно включать невидимую информацию в форму, посылаемую следующему CGI-сценарию.
Включения на стороне CGI. Этот механизм позволяет вставлять в документ специальные тэги, незаметно для пользователя передающие CGI переменные.
Cookies. Данный механизм позволяет сохранять определенную информацию на стороне клиента.
Существует также четвертый способ - создать специальный cookie-сервер, с которым будет взаимодействовать каждый CGI-сценарий.
Скрытые поля формы
Скрытые поля позволяют хранить "невидимую" информацию в форме документа. Такие поля не отображаются браузером, но это вовсе не означает, что информация спрятана, любой может увидеть ее, вызвав опцию браузера "View Source". Таким образом скрытые поля нельзя использовать в целях безопасности, а можно только в целях прозрачной передачи информации.
Приведу пример определения двух скрытых полей формы:
<form action="/cgi-bin/sendmail.pl" method="post">
...
<input type="hidden" name="mail_to"
value="andrey@novikov.com">
<input type="hidden" name="subject"
value="Test letter">
...
</form>
При посылке формы, данные, заключенные в скрытые поля, кодируются и посылаются серверу точно так же, как и данные других полей. Для CGI-сценария нет никакой разницы между скрытыми и видимыми полями.
Простейшим способом использования скрытых полей для сохранения контекста является запись данных формы в скрытые поля следующей формы. Приведу пример первой формы:
<form action="/cgi-bin/firststep.pl" method="post">
Введите Ваше имя: <input type="text" name="realname">
<br>
Введите Ваш адрес: <input type="text" name="email">
<br>
<input type="submit" name="Send"
value="Следующий шаг">
<input type="reset" name="Reset" value="Очистить">
</form>
При посылке этой формы на сервер соответствующий сценарий динамически генерирует следующую форму, содержащую скрытые поля:
<form action="/cgi-bin/secondstep.pl" method="post">
<input type="hidden" name="realname"
value="Андрей Новиков">
<input type="hidden" name="email"
value="andrey@novikov.com">
Город проживания: <input type="text" name="city">
<br>
<input type="submit" name="Send"
value="Следующий шаг">
<input type="reset" name="Reset" value="Очистить">
</form>
И так до самого конца. Достоинством такого подхода является отсутствие необходимости временных файлов и "волшебных cookies". С другой стороны недостатком такого подхода авляется снижение производительности при обработке форм с большим количеством полей.
продолжение следует...
Часть 2 |
Разместил:
Источник: CodeNet