В версии 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. Вы можете настроить начальный узел так, чтобы он занимал другое имя. В узлах потока нет существенного соглашения об именах.
Дополнительные соображения, о которых следует знать:
- Каждая страница в этом каталоге является узлом представления потока (узлом представления).
- Навигация между представлениями (страницами) в каталоге считается внутри потока.
- Переход к представлению вне этого каталога считается выходом из потока.
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