Мы рассмотрим использование 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. Демонстрационное приложение
В следующей статье мы рассмотрим вызовы потоков и то, как потоки передают параметры друг другу.