Н. 3. Елманова, C++ Builder 3.0, архитектура "клиент/сервер" и Internet
Теперь осталось обработать пользовательский ввод, например сгенерировав" динамически страницу с введенными пользователем значениями. С этой целью добавим еще один компонент - TPageProducer (рис. 9.17).
Рис. 9.17. Добавление компонента PageProducer2 для генерации HTML-страницы, содержащей результаты обработки пользовательского ввода
Внесем в качестве значения свойства HTMLDoc вновь созданного компонента PageProducer2 следующий текст:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1251">
<title>Cnacn6o!</title>
</head>
<body bgcolor="#FFFFFF">
<р>3дравствуйте, <#Т1>!</р>
<р>Спасибо, что Вы заполнили нашу анкету. Теперь мы с
удовольствием завалим Вас рекламой по адресу: <#Т2>. Ждите
от нас писем!</р>
</body>
</html>
Данный текст представляет собой шаблон документа. Он содержит специальные теги, заменяемые в процессе формирования HTML-страницы строками, которые, в свою очередь, могут быть получены в результате пользовательского ввода в созданной выше форме. В нашем случае это теги ??Ш!_Й_-?Й.Т2>. .Они_представляют собой имена полей ^вврда в созданной ранее форме, в чем можно убедиться, просмотрев HTML-текст формы.
Для замены специальных тегов следует создать обработчик события OnHTMLTag компонента PageProducer2:	"— ———""""""—
226
Создание Web-приложений
void _fastcall TWebModulel::PageProducer2HTMLTag(TObject
*Sender,  TTag Tag, const AnsiString TagString, TStrings "TagParams, AnsiString &ReplaceText)
{
ReplaceText=Request->QueryFields->Values[TagString]+ Request->ContentFields->Values[TagString];
}
Здесь Request - объект TWebRequest, сгенерированный приложением в результате пользовательского запроса. В свойстве QueryFields (объект 'TStrings) этого объекта содержатся имена параметров и значения, введенные пользователем, в виде Name=Value (реально они содержатся в переменной окружения QUERY_STRING, созданной Web-сервером, в виде Namel=Valuel&Name2=Value2&). Параметр TagString - строка, содержащаяся в теге, подлежащем замене. Свойство Values объекта TStrings используется, если строки, содержащиеся в этом объекте, представимы в виде Name=Value (что и происходит в данном случае).
Отметим, что, если в теге <form>, содержащемся в тексте формы, вместо метода GET указан метод POST, вместо свойства QueryFields следует использовать свойство ContentFields.
Теперь создадим еще один компонент TWebAction (со значением свойства Pathlnfo, равным /test3) для отображения страницы, сгенерированной с помощью PageProducer2, и добавим еще один обработчик события OnAction:
void _fastcall TWebModulel::WebModule1WebActionItem3Action( TObject *Sender, TWebRequest *Request, TWebResponse
*Response,   bool &Handled)
{
Response->Content=PageProducer2->Content(); }
Возникает вопрос: каким образом можно инициировать генерацию этой страницы после нажатия пользователем кнопки Submit в форме ввода? С этой целью следует описать реакцию на ее нажатие в HTML-тексте формы, т. е. отредактировать свойство HTMLDoc компонента PageProducerl:
<form action="http://default/scripts/web.exe/test3" method="get">
В параметре action указывается URL ресурса, предоставляемого пользователю при нажатии кнопки Submit. В рассматриваемом случае это наше приложение со значением Pathlnfo, равным /test3.
227