Статьи

JSF 2.2: использовать Faces Flow


Мы рассмотрим использование Faces Flow в этом уроке.
Для получения основной информации о Faces Flow, вы можете взглянуть на
эту статью .

Я использовал следующие инструменты и технологии в примере приложения, которое я разработал для этого урока:

  • JSF версия 2.2
  • GlassFish версия 4.0
  • JDK версия 1.7
  • Maven версия 3.0.5

В примере приложения есть потоки клиентов и заказов. Поток клиентов записывает имя, фамилию и адрес клиента. Поток заказов записывает товар, цену и адрес счета-фактуры заказа.

1. Структура каталогов проекта

Снимок экрана 2013-06-30 в 8.45.34 вечера

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

<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. Демонстрационное приложение

В следующей статье мы рассмотрим вызовы потоков и то, как потоки передают параметры друг другу.