Architecture Net

       

Добавление на сервер обработки управляющей структуры if-else-endif


В файле if_else_endif. srf содержится управляющая структура if-else-endif (если-иначе-конец если). Аналогичный обработчик добавляется в динамически подключаемую библиотеку (DLL) Web-приложения. Обратите внимание, что если количество секунд четное, то возвращаемым значением является HTTP_SUCCESS (success — "успех"), а если нечетное, то возвращается HTTP_S_FALSE (false — "ложь"). S в HTTP_S_FALSE означает, что на самом деле это успешный (successful) код, и никакой ошибки нет. Вероятность каждого исхода составляет 50 %. Таким образом, если клиент выполнял обновление несколько раз, то оба указанных результата будут равномерно распределены. Обратите внимание, что метод ShouldThisBeDone ("должно ли это быть сделано") на самом деле никаких HTML-данных клиенту не отправляет. Он предназначен только для того, чтобы управлять размещением текста и дескрипторов между дескрипторами if (если), else (иначе) и endif (конец если), находящимися в . srf-файле. Вот код C++ для этих новых возможностей

// Обработчик для проверки if (если), else(иначе) и endif


[request_handler("if_else_endif")]
class C_if_else_endif_ATLServerAppHandler
{
protected: // защищенный
[ tag_name(name="ShouldThisBeDone") ]
HTTP_CODE ShouldThisBeDone(void)
{
SYSTEMTIME systemTime;
GetLocalTime(&systemTime);
// возвратить HTTP_SUCCESS в 50 % случаев
if (systemTime.wSecond % 2)
return HTTP_SUCCESS;
else
return HTTP_S_FALSE;
}
};

HTTP_SUCCESS и HTTP_S_FALSE в действительности представляют соответственно значения TRUE (ИСТИНА) и FALSE (ЛОЖЬ). Если вы в своем броузере укажете if_else_endif. srf и несколько раз обновите броузер, то увидите, что эти два исхода появляются в случайном порядке. И хотя в приоре такое не встречается, между дескрипторами if (если), else (иначе) и endif можно расположить другие дескрипторы

{{handler ATLServerApp.dll/if_else_endif}}
{{if ShouldThisBeDone}}
Here is text that is displayed if ShouldThisBeDone
{{else}}
Here is text that is displayed if *not* ShouldThisBeDone
{{endif}}

Вот более русифицированная версия.

{{обработчик ATLServerApp.dll/if_else_endif}}
{{если ShouldThisBeDone}}
Вот - текст, который отображается если ShouldThisBeDone
{{иначе}}
Вот - текст, который отображается если *не* ShouldThisBeDone


{{конец если}}

Результат можно увидеть, перейдя по адресу http://localhost/ATLServerApp/ if_else_endif.srf Два возможных исхода показаны на рис. 12.10. и 12.11.


Рис. 12.10. Просмотр if_else_endif.srf



Рис. 12.11. Другой просмотр if_else_endif.srf

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


Следующий пример показывает использование цикла с условием окончания while-endwhile в соответствующем файле while_endwhile.srf Чтобы сохранить количество выполнений цикла, был добавлен компонент данных типа int, называемый count (счетчик) Этой переменной в конструкторе класса обработчика присваивается начальное значение, равное 0, а затем при каждом обращении к ShouldThisBeDoneAgain ("должно ли это быть сделано снова") значение count увеличивается на единицу Итерация продолжается до тех пор, пока выражение count <= 10 не станет ложным Обратите внимание, что в коде C++ на самом деле цикла с условием окончания while нет, а находится он в соответствующем . srf-файле Кроме того, в классе обработчика имеется два метода замены дескрипторов GetNextNumber (Получить следующее число) и GetNextNumberSquared (Получить квадрат следующего числа) Эти методы соответствуют двум дескрипторам из . srf-файла, появляющимся в цикле с условием окончания while

// Обработчик для проверки цикла с условием
// окончания while - endwhile
[request_handler("while_endwhile")]
class C_while_endwhile_ATLServerAppHandler
{
protected: // защищенный
int count; // счетчик
C_while_endwhile_ATLServerAppHandler() : count(0) // счетчик


{
}
[ tag_name(name="ShouldThisBeDoneAgain") ]
HTTP_CODE ShouldThisBeDoneAgain(void)
{
count++; // счетчик++;
if (count <= 10) // если (счетчик <= 10)
return HTTP_SUCCESS;
else
return HTTP_S_FALSE;
}
[ tag_name(name="GetNextNumber") ]
HTTP_CODE GetNextNumber(void)
{
m_HttpResponse
<< "The square of " << count << " is "; // Квадрат
//счетчика
return HTTP_SUCCESS;
}
[ tag_name(name="GetNextNumberSquared") ]
HTTP_CODE GetNextNumberSquared(void)
{
m_HttpResponse << count*count;
return HTTP_SUCCESS;
}
};

Соответствующий файл while_endwhile.srf отображает таблицу с числами и их квадратами В примере видно, что дескрипторы могут быть вложены так, как требуется Это приводит к тому, что дескрипторы GetNextNumber и GetNextNumberSquared заменяются несколько раз [Комментарии вида <!-- комментарий --> вставлены для удобства — Прим ред.].

<html>
<BODY> <!-- ТЕЛО -->
<Р>{{handler ATLServerApp.dll/while_endwhile}}</P> <!-- обработчик -->
<р>
<TABLE> <!-- таблица -->
{{while ShouldThisBeDoneAgain}}
<TR>
<TD>{{GetNextNumber}}</TD>
<TD>{{GetNextNumberSquared}}</TD>
</TR>
{{endwhile}}
</TABLE> <!-- таблица -->
</P>
</BODY> <!-- тело -->
</html>

Результат можно увидеть, перейдя по адресу http://localhost/ATLServerApp/while_endwhile. srf. Что получается при этом переходе, показано на рис. 12.12.





Рис. 12.12. Просмотр while_endwhile.srf

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



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