Файл pass_parameter. srf показывает, как можно передавать параметры методу замены обработчика запросов Web-приложения (pass parameter как раз и означает "передать параметр"). Класс обработчика запросов с помощью функций грамматического разбора преобразует первоначальные параметры, указанные в . srf-файле и имеющие строковый тип (string), в тот тип данных, который требуется методу обработчика запросов. В классе обработчика запросов сигнатура такого рода функции должна выглядеть следующим образом:
HTTP_CODE parSeFunction(
IAtlMemMgr* pMemoryManager,
LPCSTR szArgumentData,
parameterType** ppArgument);
Память, используемая для хранения преобразованного параметра, должна быть размещена с помощью pMemoryManager->Allocate (memory manager — "диспетчер памяти", allocate— "разместить"). Эту память не надо освобождать явным образом, потому что в нужное время она автоматически освобождается каркасом ATL Server. Исходные строковые (типа string) данные, передаваемые через параметр, выбираются из szArgumentData (данные аргумента). Преобразованный параметр передается методу обработчика запросов и затем сохраняется с помощью ppArgument (argument— "аргумент"). Для параметра вы можете определить свой собственный тип данных с помощью какой-либо структуры или использовать типы данных, указанные ниже .
Затем, как показано в следующей сигнатуре, аргумент принимается из класса обработки запросов соответствующим методом замены:
HTTP_CODE replacementMethod(
parameterType* pArgument);
Параметр pArgument должен указывать на тот тип данных, который используется в соответствующей функции грамматического разбора.
Связывать друг с другом метод замены и соответствующую ему функцию грамматического разбора можно с помощью одного из двух приемов. В соответствии с первым из них, если parameterType (тип параметра) является одним из типов, поддерживаемых для атрибута tag_name, то имя функции грамматического разбора можно пропускать, и она будет автоматически связываться с методом замены в результате учета типа.
Ну, а в соответствии со вторым приемом имя функции грамматического разбора, связываемой с методом замены, можно указывать явно в параметре parse_func (функция грамматического разбора) атрибута tag_name. Такой прием необходимо использовать тогда, когда вы с помощью какой-либо структуры определяете свой собственный тип параметра или имеются разные методы, которые принимают один и тот же тип параметра.
В следующем примере показана передача параметров из соответствующего файла pars_parameter .srf. Передача параметров выполняется с помощью первого из двух указанных приемов. В примере можно видеть, что передача параметра требует как функции грамматического разбора, так и метода замены.
Функция должна преобразовывать параметр из строкового типа в тот, который
нужен (в данном примере это int) Что касается метода замены, то он должен принимать
преобразованный параметр и управлять заменой дескрипторов.
// Обработчик для проверки передачи параметров
[request_handler("pass_parameter")]
class C_parameter_passing_ATLServerAppHandler
{
protected: // защищенный
// метод синтаксического анализа преобразовывает
// параметр из строки в int
HTTP_CODE parseFunction(
IAtlMemMgr* pMemoryManager,
LPCSTR szArgumentData,
int** ppArgument)
{
// распределить память для передаваемого параметра
int *pparam =
(int *)pMemoryManager->Allocate(sizeof(int) ) ;
// Распределить
// установить значение параметра, передаваемого
// методу замены *pparam = atoi(szArgumentData) ;
// передать параметр обратно через ppArgument
ppArgument = &pparam;
return HTTP_SUCCESS;
}
// метод замены принимает параметр типа int
[ tag_name(name="SquareOfParameter") ]
HTTP_CODE SquareOfParameter(int* pArgument)
{
m_HttpResponse
<< "Parameter was " // Параметр был
<< *pArgument << "<p>"
<< "Square of parameter is" // Квадрат параметра
<< *pArgument * *pArgument;
return HTTP_SUCCESS;
}
};
Квадрат параметра отображается соответствующим файлом pass_parameter.srf.
{{handler ATLServerApp.dll/pass_parameter}}
{{SquareOfParameter(10)}}
Результат можно увидеть, перейдя по адресу http://localhost/ATLServerApp/
pass_parameter.srf Что получается при этом переходе, показано на рис. 12.13.
Кроме того, из файла . srf в обработчик запросов Web-приложения можно передавать
несколько параметров различных типов. Для этого надо определить структуру с
элементами, которые должны соответствовать передаваемым параметрам Следующий
пример демонстрирует, как из . srf-файла передаются два параметра Первый из
них является числом, а второй — строкой Функция грамматического разбора выделяет
указанные два параметра из одной строки и "укладывает" их в пользовательскую
структуру, которая называется PARAMETER_DATA (данные параметров) Эта функция
с помощью простых приемов грамматического разбора разбивает строку-параметр
на лексемы и приводит тип каждого из параметров к тому типу, который должен
быть у соответствующего элемента структуры Затем структура передается методу
замены как один составной параметр.
Рис. 12.13. Просмотр pass_parameter srf
Данный пример также демонстрирует, как с помощью второго приема связать функцию грамматического разбора с указанным выше методом управления заменой В соответствии с этим приемом имя метода фа мм этического разбора явно указывается с помощью параметра parse_f unc в атрибуте tag_name метода замены
// Обработчик, который принимает два параметра
[request_handler("pass_two_parameters")]
class C_pass_two_parameters_ATLServerAppHandler
{
protected: // защищенный
// пользовательская структура для того,
// чтобы сохранять преобразованные параметры
typedef struct
{
short index; // короткий индекс
char string[100]; // строка символов
} PARAMETER_DATA;
// метод синтаксического анализа преобразовывает
// два параметра из строки
HTTP_CODE parseTwoParametersFunction(
IlAtlMemMgr* pMemoryManager,
LPCSTR szArgumentData,
PARAMETER_DATA** ppArgument)
{
// распределить память для параметров,
// которые будут переданы
PARAMETER_DATA *pparams =
(PARAMETER_DATA *)pMemoryManager->Allocate(
// Распределить
sizeof(PARAMETERJDATA));
// установить параметры, которые будут
// переданы методу замен
char *szToken = strtok( // символ
(LPSTR)szArgumentData, ", "); // получить 1-й параметр
pparams->index = atoi(szToken); // сохранить 1-й параметр
szToken = strtok(NULL, "\""); // ПУСТОЙ УКАЗАТЕЛЬ
-
// пропустить пробелы, символы табуляции и пустой строки
szToken = strtok(NULL, "\""); // ПУСТОЙ"УКАЗАТЕЛЬ
-
// получить 2-й параметр
strcpy(pparams->string, szToken); // строка - сохранить
// 1-й параметр
// передать параметры обратно через ppArgument
ppArgument = &pparams;
return HTTP_SUCCESS;
}
// метод замены принимает два параметра в структуру
[ tag_name(name="HandleTwoParameters",
parse_func="parseTwoParametersFunction") ]
HTTP_CODE HandleTwoParameters(PARAMETER_DATA* pArgument)
{
m_HttpResponse
<< "First parameter was " // Первый параметр
был
<< pArgument->index << "<p>"
// индекс
<< "Second parameter was \"" // Второй
параметр был
<< pArgument->stnng << "\"<p>"
// строка
<< "The ASCII code for this index is "
// Код ASCII для этого индекса
<< pArgument->string[pArgument->index] ;
return HTTP_SUCCESS;
}
Рис. 12.14. Просмотр pass_two_parameters.srf
Результат передачи двух параметров отображается с помощью соответствующего файла pass_two_parameters. srf (pass two parameters — "передать два параметра").
{{handler ATLServerApp.dll/pass_two_parameters}}
{{HandleTwoParametersdO, "here is a bit of text")}}
Этот результат можно увидеть, перейдя по адресу http://localhost/ATLServerApp/ pass_two_parameters .srf. Что получается при этом, показано на рис. 12.14.