Объедините функцию Faces Flow с Ajax

Можно ли совместить новую функцию JSF 2.2 Faces Flow с Ajax?

Пример использования: мастер встроен в панель на странице. По мере того, как пользователь проходит через мастер, обновляется только панель, а не вся страница.


person Harald Wellmann    schedule 23.08.2013    source источник


Ответы (3)


Я сам просматриваю этот маршрут и провел некоторое исследование. Короткий ответ: Да, вы можете использовать ajax как для частичной обработки, так и для частичного рендеринга. Вот рабочий пример:

Определение потока

@ApplicationScoped
public class MyFlow implements Serializable {

    @Produces @FlowDefinition
    public Flow defineFlow(@FlowBuilderParameter FlowBuilder flowBuilder) {
        flowBuilder.id("", "myFlow");
        flowBuilder.viewNode("flowP1", "/flowPage1.xhtml").markAsStartNode();
        return flowBuilder.getFlow();
    }
}

flowPage1.xhtml (первый и единственный просмотр в потоке):

<html xmlns="http://www.w3.org/1999/xhtml"
  xmlns:h="http://xmlns.jcp.org/jsf/html"
  xmlns:p="http://primefaces.org/ui">
<h:head>
    <title>View within Flow Ajax test</title>
</h:head>
<h:body>
    <h:form>
        <h:panelGrid columns="2">
            <p:commandButton value="Flow Action Method" action="#{myFlowBean.flowActionMethod}" update="flowText"/>
            <p:commandButton value="View Action Method" action="#{myViewBean.viewActionMethod}" update="viewText"/>
            <h:outputText id="flowText" value="#{myFlowBean.flowValue}" />
            <h:outputText id="viewText" value="#{myViewBean.viewValue}" />
        </h:panelGrid>
    </h:form>
</h:body>
</html>

Поддерживающие бобы

Flow-Scope Bean

@Named
@FlowScoped("myFlow")
public class MyFlowBean implements Serializable{

    private String flowValue;

    @PostConstruct
    public void init(){
        System.out.println("MyFlowBean PostConstruct");
    }

    public void flowActionMethod(){
        System.out.println("flowActionMethod called");
        //flowValue = "Flow Value Set";
    }

    public String getFlowValue() {
        return flowValue;
    }

    public void setFlowValue(String flowValue){
        this.flowValue = flowValue;
    }
}

Бин с областью просмотра

@Named
@ViewScoped
public class MyViewBean implements Serializable {

    private @Inject MyFlowBean flowBean;
    private String viewValue;

    @PostConstruct
    public void init(){
        System.out.println("MyViewBean PostConstruct");
    }

    public void viewActionMethod(){
        System.out.println("viewActionMethod called");
        viewValue = "View Value Set";
        flowBean.setFlowValue("Flow Value Set");
    }

    public String getViewValue() {
        return viewValue;
    }
}

Перейдите к потоку, используя «myFlow» в качестве навигационного варианта из любого места за пределами потока. После отображения файла flowPage1.xhtml выполните следующие действия, чтобы продемонстрировать использование AJAX:

  1. Нажмите кнопку «Просмотреть метод действия». Это установит значение обоих полей bean-компонента, но отобразит только поле с областью видимости. Таким образом, вы увидите только текст для поля с областью видимости.
  2. Нажмите кнопку «Метод действия потока». Это отобразит поле bean-компонента с областью действия Flow, отображая значение, которое уже было установлено методом действия bean-компонента View.
person jdessey    schedule 15.10.2013

Ознакомьтесь с этим основным объяснением Faces Flow:

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

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

Представление в JSF 2.x предназначено для того, чтобы оставаться в живых до тех пор, пока его контроллер (бэкинг-компонент), стоящий за ним , не возвращает новый результат. значение. Однако сам поток определяет комбинацию результатов, которую вы разрешаете в своем приложении. Единственный способ использовать Ajax — не уничтожать представление, которое у вас уже есть, а поток делает это для каждого отдельного перехода.

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

person Xtreme Biker    schedule 24.08.2013

Я видел, как ребята из проекта liferay используют (рекомендуют) эту функцию для управления базовыми портлетами мастера.

http://www.liferay.com/web/neil.griffin/blog/-/blogs/three-cheers-for-jsf-2-2-faces-flows

person Alireza Fattahi    schedule 05.03.2014