Architecture Net

Передача параметров серверному обработчику


Файл 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— "аргумент"). Для параметра вы можете определить свой собственный тип данных с помощью какой-либо структуры или использовать типы данных, указанные ниже .

  • bool (логический, булев);
  • char (символ);
  • unsigned char (символ без знака);
  • short (короткий);
  • unsigned short (короткий без знака);
  • int;
  • unsigned int (int без знака);
  • _int64;
  • unsigned_int64(_int64 без знака);
  • double (с удвоенной точностью);


  • float (с плавающей точкой).
  • Затем, как показано в следующей сигнатуре, аргумент принимается из класса обработки запросов соответствующим методом замены:

    HTTP_CODE replacementMethod(
    parameterType* pArgument);

    Параметр pArgument должен указывать на тот тип данных, который используется в соответствующей функции грамматического разбора.

    Связывать друг с другом метод замены и соответствующую ему функцию грамматического разбора можно с помощью одного из двух приемов. В соответствии с первым из них, если parameterType (тип параметра) является одним из типов, поддерживаемых для атрибута tag_name, то имя функции грамматического разбора можно пропускать, и она будет автоматически связываться с методом замены в результате учета типа.


    {{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.

    CompEbook.ru Железо, дизайн, обучение и другие


    Содержание раздела