1. Обзор
Spring Web Flow основан на Spring MVC и позволяет реализовывать потоки в веб-приложении. Он используется для создания последовательности шагов, которые проводят пользователей через процесс или некоторую бизнес-логику.
В этом кратком руководстве мы рассмотрим простой пример процесса активации пользователя . Пользователю предоставляется страница, и он нажимает кнопку « Активировать
» , чтобы продолжить, или кнопку « Отмена
» , чтобы отменить активацию.
Не то чтобы здесь предполагалось, что у нас уже есть настроенное веб-приложение Spring MVC.
2. Настройка
Начнем с добавления зависимости Spring Web Flow в pom.xml
:
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
<version>2.5.0.RELEASE</version>
</dependency>
Последнюю версию Spring Web Flow можно найти в центральном репозитории Maven .
3. Создание потока
Давайте теперь создадим простой поток. Как было сказано ранее, поток — это последовательность шагов, которая ведет пользователя через процесс. В настоящее время это можно сделать только с помощью конфигурации на основе XML.
Каждый шаг в потоке называется состоянием .
В этом простом примере мы будем использовать состояние просмотра
. Состояние просмотра
— это шаг в потоке, который отображает соответствующее представление. Состояние просмотра
относится к странице в приложении ( WEB-INF/view),
при этом идентификатором состояния просмотра
является имя страницы, на которую оно ссылается. ``
Мы также будем использовать элемент перехода
. Элемент перехода
используется для обработки событий, происходящих в определенном состоянии
.
Для этого примера потока мы настроим три состояния просмотра
— активацию
, успех
и отказ
.
Процесс для этого потока довольно прост. Отправной точкой является представление активации
. Если событие активации
инициировано, оно должно перейти в представление успеха
. Если событие отмены
инициировано, оно должно перейти в представление отказа
. Элемент перехода
обрабатывает событие нажатия кнопки, которое происходит в состоянии просмотра:
<view-state id="activation">
<transition on="activate" to="success"/>
<transition on="cancel" to="failure"/>
</view-state>
<view-state id="success" />
<view-state id="failure" />
Начальная страница активации, на которую ссылается идентификатор активации
и которая находится в WEB-INF/view/activation.jsp
, представляет собой простую страницу с двумя кнопками: активировать
и отменить
. Нажатие кнопок с инициирует наши переходы, чтобы отправить пользователя либо в успешное состояние просмотра
( WEB-INF/view/success.jsp
), либо в состояние просмотра
отказа ( WEB-INF/view/failure.jsp):
<body>
<h2>Click to activate account</h2>
<form method="post" action="${flowExecutionUrl}">
<input type="submit" name="_eventId_activate" value="activate" />
<input type="submit" name="_eventId_cancel" value="cancel" />
</form>
</body>
Мы используем flowExecutionUrl
для доступа к контекстно-зависимому URI для текущего состояния просмотра
выполнения потока .
4. Настройка потока
Далее мы настроим Spring Web Flow в нашей веб-среде. Мы сделаем это, настроив Flow Registry и Flow Builder Service.
Flow Registry позволяет нам указать расположение наших потоков, а также указать службу Flow Builder, если она используется.
Служба Flow Builder помогает нам настраивать службы и параметры, используемые для создания потоков.
Одним из сервисов, которые мы можем настроить, является view-factory-creator
. View - factory-creator
позволяет нам настраивать ViewFactoryCreator
, используемый Spring Web Flow. Поскольку мы используем Spring MVC, мы можем настроить Spring Web Flow для использования преобразователя представлений в наших конфигурациях Spring MVC.
Вот как мы настроим Spring Web Flow для нашего примера:
@Configuration
public class WebFlowConfig extends AbstractFlowConfiguration {
@Autowired
private WebMvcConfig webMvcConfig;
@Bean
public FlowDefinitionRegistry flowRegistry() {
return getFlowDefinitionRegistryBuilder(flowBuilderServices())
.addFlowLocation("/WEB-INF/flows/activation-flow.xml", "activationFlow")
.build();
}
@Bean
public FlowExecutor flowExecutor() {
return getFlowExecutorBuilder(flowRegistry()).build();
}
@Bean
public FlowBuilderServices flowBuilderServices() {
return getFlowBuilderServicesBuilder()
.setViewFactoryCreator(mvcViewFactoryCreator())
.setDevelopmentMode(true).build();
}
@Bean
public MvcViewFactoryCreator mvcViewFactoryCreator() {
MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
factoryCreator.setViewResolvers(
Collections.singletonList(this.webMvcConfig.viewResolver()));
factoryCreator.setUseSpringBeanBinding(true);
return factoryCreator;
}
}
Мы также можем использовать XML для этой конфигурации:
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="flowRegistry" ref="activationFlowRegistry"/>
</bean>
<flow:flow-builder-services id="flowBuilderServices"
view-factory-creator="mvcViewFactoryCreator"/>
<bean id="mvcViewFactoryCreator"
class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
<property name="viewResolvers" ref="jspViewResolver"/>
</bean>
<flow:flow-registry id="activationFlowRegistry"
flow-builder-services="flowBuilderServices">
<flow:flow-location id="activationFlow" path="/WEB-INF/flows/activation-flow.xml"/>
</flow:flow-registry>
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="activationFlowExecutor"/>
</bean>
<flow:flow-executor id="activationFlowExecutor"
flow-registry="activationFlowRegistry"/>
5. Навигация по потокам
Чтобы перемещаться по потокам, запустите веб-приложение и перейдите по адресу http://localhost:8080/{context-path}/activationFlow . Чтобы запустить приложение, разверните его на сервере приложений, таком как Tomcat или Jetty .
Это отправляет нас на начальную страницу потока, которая является страницей активации
, указанной в нашей конфигурации потока:
Вы можете нажать на кнопку активации
, чтобы перейти на страницу успеха:
Или кнопку отмены
, чтобы перейти на страницу отказа:
6. Заключение
В этой статье мы использовали простой пример в качестве руководства по использованию Spring Web Flow.
Вы можете найти полный исходный код и все фрагменты кода для этой статьи на GitHub.