![]() |
Технология Клиент-Сервер 2007'3 |
||||||
|
RIFE – это полнофункциональный Web-фреймворк с инструментами и API для реализации наиболее востребованных возможностей. Каждый из его наборов инструментов может использоваться отдельно, а при совместном использовании они дают множество средств для повышения производительности разработки. RIFE обеспечивает, обработку каждого объявления и определения в коде в одном месте. Это упрощает задачу разработчика, уменьшая число повторов в коде, обеспечивая целостность и облегчая поддержку.
Continuations позволяют частям страницы вести себя как изолированные, независимые и вложенные элементы.
Эти конструкции позаимствованы из Scheme и содержат всю информацию о местоположении программы и локальных переменных методов. Используя эту информацию, приложение может прервать исполнение программы (это характерно для RIFE) и продолжить его позже с того же места, как будто ничего не случилось.
Допустим, у вас есть набор форм, которые нужно заполнять на манер визарда. Логически это одна сущность с несколькими шагами взаимодействия с пользователем. Традиционные фреймворки как-то реализуют это с помощью сессий, но при этом остается потребность либо разбить логику на несколько страниц, либо начать использовать условия, чтобы проверить, какие шаги уже были выполнены.
Результат получается примерно таким:
/* start page 1 */ output form 1 wait for input process input go to page 2 /* end page 1 */ /* start page 2 */ check for form 1 data if not present go to page 1 output form 2 wait for input process input go to page 3 /* end page 2 */ /* start page 3 */ check for form 2 data if not present go to page 2 output form 3 wait for input process input go to next page /* end page 3 */ |
Но на самом деле нужно следующее:
/* start page */ output form 1 wait for input process input output form 2 wait for input process input output form 3 wait for input process input go to next page /* end page */ |
Таким образом, вы думаете об этом как о непрерывном ряде шагов, следующих друг за другом с периодическим взаимодействием с пользователем. Если все шаги выполнены, вы переходите к следующему элементу.
RIFE позволяет писать элементы точно так же, как в приведенном выше псевдокоде. Нужно только заменить 'wait for input' вызовом метода pause();. Вызов метода pause() распознается как continuation только в том случае, если он используется внутри метода processElement(). В любом другом месте он будет просто удален. Это сделано, потому что трассировка байткода других методов элемента подразумевает рассмотрение всех методов всех классов, которые используются в Element. Это не только приведет к потерям в производительности, это просто невозможно выполнить, поскольку нельзя динамически изменять классы самого JRE.
Простой пример, иллюстрирующий сказанное выше:
public void processElement() { int total = 0; while (total < 50) { print(getHtmlTemplate("form")); pause(); total += getParameterInt("answer", 0); } print("получена сумма " + total); } |
Этот элемент берет серию ответов и складывает их. Когда сумма превышает 50, исполнение завершается, и выводится сумма.
Поскольку continuations всегда работают в одном элементе, вам придется реализовать взаимодействие с пользователем через submissions (которые в данном контексте можно рассматривать как сохранение изменений) или через exit (здесь – возврат к предыдущему состоянию), которые указывают на тот же самый элемент.
Copyright © 1994-2016 ООО "К-Пресс"