Мы рассмотрим использование Faces Flow в этом уроке. Для получения основной информации о Faces Flow, вы можете взглянуть на
эту статью .
Я использовал следующие инструменты и технологии в примере приложения, которое я разработал для этого урока:
- JSF версия 2.2
- GlassFish версия 4.0
- JDK версия 1.7
- Maven версия 3.0.5
1. Структура каталогов проекта 2. Зависимости проекта
<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version>7.0-b72</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish</groupId> <artifactId>javax.faces</artifactId> <version>2.2.0</version> <scope>provided</scope> </dependency>3. 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(); } }
Класс Customer — это класс Java, который настраивает поток с тем же именем. Единственный метод этого класса возвращает
класс javax.faces.flow.Flow . Что нужно сделать в первую очередь в методе, это определить идентичность потока. Затем запустите узел, и возвращаемый узел определен для потока.
4. order-flow.xml
класс javax.faces.flow.Flow . Что нужно сделать в первую очередь в методе, это определить идентичность потока. Затем запустите узел, и возвращаемый узел определен для потока.
4. order-flow.xml
<flow-definition id="order"> <flow-return id="returnFromOrderFlow"> <from-outcome> #{orderBean.returnValue} </from-outcome> </flow-return> </flow-definition>
Предыдущий файл конфигурации потока является файлом конфигурации Faces, который включает
элемент определения потока . Если файл конфигурации XML используется для настройки потока, этот файл должен называться flowName-flow.xml.
Обратите внимание на этот файл, который настраивает поток с именем «order» и находится в каталоге потока с тем же именем. Прежде всего, в файле конфигурации идентификация потока должна быть определена с помощью атрибута ID элемента определения потока. Под этим элементом должен быть
элемент возврата потока, который также определяет точку возврата для потока.
5. CustomerBean.java — OrderBean.java
@Named @FlowScoped("customer") public class CustomerBean implements Serializable { public CustomerBean() { System.out.println("CustomerBean has been created..."); } public String getName() { return this.getClass().getSimpleName(); } public String getReturnValue() { return "/index"; } }
@Named @FlowScoped("order") public class OrderBean implements Serializable { public OrderBean() { System.out.println("OrderBean has been created..."); } public String getName() { return this.getClass().getSimpleName(); } public String getReturnValue() { return "/index"; } }FlowScoped является областью применения CDI. Класс с
аннотацией @FlowScoped учитывается в области действия потока, указанной во время выполнения.
Бин активируется при входе в поток и деактивируется при выходе из потока. Метод
getReturnValue , который есть у обоих компонентов, возвращает значение возвращаемого узла.
6. index.xhtml
<h1>Welcome to kodcu.com Faces Flow tutorial</h1> <h:form prependId="false"> <h:panelGrid> <p>Click Customer to register your customer information and enter the customer flow.</p> <h:commandButton value="Customer" action="customer"/> <p>Click Order to register your order information and enter the order flow.</p> <h:commandButton value="Order" action="order"/> </h:panelGrid> </h:form>Обратите внимание, что потоки с именами «customer» и «order» вызываются аргументами «
customer » и «
order », в которых компоненты commandButton передаются атрибутам действия.
Эти два аргумента определяют действие вызова соответствующих потоков.
7. order.xhtml
<h:form prependId="false"> <h:panelGrid columns="3" cellpadding="2" cellspacing="2"> <h:outputLabel for="product" value="Product: "/> <h:inputText id="product" value="#{flowScope.product}" required="true" maxlength="20"/> <h:message for="product"/> <h:outputLabel for="price" value="Price: "/> <h:inputText id="price" value="#{flowScope.price}" required="true"> <f:convertNumber pattern="#,##0.00"/> </h:inputText> <h:message for="price"/> <h:outputLabel/> <h:panelGroup> <h:commandButton value="next" action="orderA" /> <h:commandButton immediate="true" action="returnFromOrderFlow" value="Exit Flow"/> </h:panelGroup> </h:panelGrid> </h:form>Новый объект EL
# {flowScope} получает текущие данные потока и отображает данные потока для
faceContext.getApplication (). GetFlowHandler (). GetCurrentFlowScope () . Объект также представлен как локальное хранилище для потоков.
8. Демонстрационное приложение В следующей статье мы рассмотрим вызовы потоков и то, как потоки передают параметры друг другу.