Статьи

JavaServer Faces Flow Scope


В версии 2.2 JavaServer Faces имеет новую область действия компонента, которая шире, чем область запроса, уже, чем область сеанса и отличается от области представления:
Область действия потока

Что такое поток?

В современных веб-приложениях мы видим примеры, в основном о том, где взаимодействие с пользователем осуществляется через ряд экранов, связанных друг с другом. Например бронирование авиабилетов, покупки / заказ приложений и так далее.

В этих примерах речь идет о концепции «
потока », которая представляет собой переход к страницам между неслучайными точками и указываются точки входа и выхода.

Вдохновленный
потоками задач
Spring Web Flow и
ADF , JavaServer Faces версии 2.2 обеспечивает поддержку концепции потока, которую я попытался объяснить здесь с помощью имени
Faces Flow, и проводит
стандартизацию , используя хорошие аспекты Spring Web Flow, потоков задач ADF. и
Apace MyFaces CODI .

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

Что это дает?

Faces Flow обеспечивает
инкапсуляцию определенных потоков и
упаковку как модуль многократного использования в других приложениях с использованием используемых источников.

Доступ к данным в потоке можно получить в рамках этого потока (
но указание параметров может сделать поток для передачи данных в другой поток ). Это позволяет использовать один и тот же поток на другой вкладке или в одном и том же браузере. 

Инкапсуляция

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

Предположим, что у нас есть три страницы в нашем гипотетическом примере, который называется Step1.xhtml, Step2.xhtml, Step3.xhtml. На странице Step1.xhtml пользователь запрашивает ввод информации, а затем выводит эту информацию на экран в Step2.xhtml. В Step2.xhtml от пользователя снова запрашивается ввод информации, и обе эти полученные информации выводятся на экран в Step3.xhtml. 

Поскольку в этом гипотетическом примере область действия компонента — сеанс, например, в первой вкладке / окне браузера Safari, когда мы вводим информацию, запрошенную на странице Step1.xhtml, и переходим на страницу Step2.xhtml, а затем создаем новую запрос на странице Step2.xhtml после открытия новой вкладки / окна; мы можем увидеть выходные данные bean-компонента в другой вкладке / окне.
Это потому, что один и тот же экземпляр компонента работает в обеих вкладках / окнах. Когда мы запрашиваем страницу Step2.xhtml из другого браузера (например, chrome), мы не сталкиваемся с какой-либо ошибкой доступа, даже если не видим данные, которые видны в Safari. 

Когда мы разрабатываем этот гипотетический пример с Faces Flow, мы не можем видеть данные на вкладке 2. окна того же браузера.
Напротив, поскольку не вызывая поток с помощью действия вызова потока, мы получаем исключение «Нет активных контекстов для типа области действия javax.faces.flow.FlowScoped». Та же самая ситуация относится к звонку из другого браузера.
Когда поток вызывается с помощью действия вызова потока, создается новый экземпляр bean-компонента потока, который активируется в Faces Context, а затем этот экземпляр сохраняет свои собственные данные.

Упаковка потока

Потоки могут быть упакованы в файлы JAR или в каталогах. 

Я- Упаковка в банке

Когда потоки упакованы в файлы JAR, потоки должны быть объявлены в файле META-INF /face-config.xml. Узлы потока (страницы) размещаются в META-INF / flow /. Файл beans.xml должен существовать в каталоге META-INF. 

II- Упаковка в каталоге

Если мы опираемся на структуру каталогов проекта Maven, каталог, который имеет то же имя, что и поток, может использоваться в src / main / webapp для упаковки в каталог в веб-проекте maven (
это хорошая привычка ). Начальный узел совпадает с именем потока по умолчанию и принимает суффикс .xhtml. Вы можете настроить начальный узел так, чтобы он занимал другое имя. В узлах потока нет существенного соглашения об именах. 

Дополнительные соображения, о которых следует знать:

  • Каждая страница в этом каталоге является узлом представления потока (узлом представления).
  • Навигация между представлениями (страницами) в каталоге считается внутри потока.
  • Переход к представлению вне этого каталога считается выходом из потока.

конфигурация

Потоки могут быть настроены в файле конфигурации xml или программно в классах Java.

I- файл конфигурации

Если вы используете файл конфигурации xml для настройки потока, этот
файл должен называться flowname-flow.xml и должен находиться в каталоге потока . Например, если поток, называемый заказом, настраивается, имя файла должно быть order- flow.xml.
Файл конфигурации потока — это файл конфигурации граней, который включает элемент определения потока.

<flow-definition id="order">
   <flow-return id="returnFromOrderFlow">
     <from-outcome>#{orderBean.returnValue}</from-outcome>
   </flow-return>
</flow-definition>

Имя потока элемента определения потока должно быть определено с помощью атрибута id. Опять же, под этим элементом должен быть элемент возврата потока, который определяет точку возврата для потока. 

Любой входящий параметр для потока указывается с помощью
элемента
входящего параметра . Если поток вызывает другой поток, это указывается с
помощью элемента потока вызовов . То, какой поток будет вызван, задается
элементом
flow-reference в элементе call-flow, и если параметр будет передан в этот вызываемый поток, это определяется
элементом
outbound-parameter

II- Программный

Если поток будет настроен с использованием класса Java, имя класса должно быть именем потока.  Например, если мы хотим настроить поток с именем customer, класс должен быть Customer.java.  

public class Customer implements Serializable {
    
    @Produces
    @FlowDefinition
    public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
        String flowId = "customer";
        flowBuilder.id("", flowId);
        flowBuilder.viewNode(flowId, "/" + flowId + "/" + flowId + ".xhtml").markAsStartNode();
        
        flowBuilder.returnNode("returnFromCustomerFlow")
                   .fromOutcome("#{customerBean.returnValue}");
        
        return flowBuilder.getFlow();
    }
}

Класс конфигурации потока включает в себя один метод с именем
defineFlow . Этот метод возвращает
класс
javax.faces.flow.Flow

Метод DefineFlow принимает параметр FlowBuilder, который передается из приложения Faces. Метод использует методы класса javax.faces.flow.Builder.FlowBuilder для настройки потока.

Прежде всего, идентичность потока должна быть определена в методе. Для этого вызывается метод Id класса FlowBuilder. Затем начальный узел и возвратный узел определены для потока.

Аргумент, который передается методу ReturnNode, устанавливает имя возвращаемого узла, а аргумент, который передается методу fromOutcome, устанавливает значение возвращаемого узла.

В результате, Faces Flow отвечает большой потребности в JavaServer Faces и предоставляет важное новшество для разработчиков Faces. Я попытался разобраться с тем, что нужно знать о потоке лиц в начале этой статьи. Я надеюсь быть с новыми статьями, касающимися использования потоков с конкретными примерами. 

Реальное содержание выше, можно получить доступ к 
Faces Flow