前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Web Folw配置

Spring Web Folw配置

作者头像
Tim在路上
发布2020-08-04 23:49:23
9710
发布2020-08-04 23:49:23
举报

配置Spring Web Flow需要在Spring的上下文中配置一些关于流程的Bean来处理流程的请求并执行。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://www.springframework.org/schema/webflow"
      xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/webflow
                          http://www.springframework.org/schema/webflow/spring-webflow.xsd">

让后开始配置吧:

  1. 装配流程执行器
代码语言:javascript
复制
<webflow:flow-executor id="logoutFlowExecutor" flow-registry="logoutFlowRegistry">
        <webflow:flow-execution-attributes>
            <webflow:always-redirect-on-pause value="false"/>
            <webflow:redirect-in-same-state value="false"/>
        </webflow:flow-execution-attributes>
    </webflow:flow-executor>

2.配置流程注册表

流程注册表是加载流程定义并通过执行器执行他们。

代码语言:javascript
复制
<webflow:flow-registry id="logoutFlowRegistry" flow-builder-services="builder" base-path="/WEB-INF/webflow">
        <webflow:flow-location-pattern value="/logout/*-webflow.xml"/>
    </webflow:flow-registry>

3.处理流程请求 DispatcherServlet一般会直接将请求分发给控制器,所以如果我们想要使用Spring Web Folw就需要一个Mapping将请求映射到SWF.

代码语言:javascript
复制
<bean id="logoutFlowHandlerMapping" class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"
          p:flowRegistry-ref="logoutFlowRegistry" p:order="3">
        <property name="interceptors">
            <array value-type="org.springframework.web.servlet.HandlerInterceptor">
                <ref bean="localeChangeInterceptor"/>
            </array>
        </property>
    </bean>

请求重定向给SWF后我们需要的是处理请求, 需要使用FlowHandlerAdapter进行请求处理。

代码语言:javascript
复制
<bean id="logoutHandlerAdapter" class="org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter"
          p:supportedFlowId="logout" p:flowExecutor-ref="logoutFlowExecutor"
          p:flowUrlHandler-ref="logoutFlowUrlHandler"/>

    <bean id="logoutFlowUrlHandler" class="org.jasig.cas.web.flow.CasDefaultFlowUrlHandler"
          p:flowExecutionKeyParameter="RelayState"/>
组件

状态类型

它是用来做什么的

视图(视图)

暂停流程并邀请用户参与流程

行为(动作)

行为状态,流程逻辑发生的地方

决策(决定)

基于流程数据的评估查询查询结果确定流程方向

子流程(子流)

在当前的流程上下文中启动一个新的流程

结束(完)

流程的最后一站

流程配置例子
代码语言:javascript
复制
<action-state id="frontLogout">
    <evaluate expression="frontChannelLogoutAction" />
    <transition on="finish" to="finishLogout" />
    <transition on="redirectApp" to="redirectToFrontApp" />
  </action-state>
或
    <action-state id="validate">
        <evaluate expression="captchaVaditeAuthenticationViaFormAction.validate(flowRequestContext, flowScope.credential, messageContext)"/>
        <transition on="error" to="initializeLogin"/>
        <transition on="valid" to="realSubmit"/>
    </action-state>

Spring Web Flow 应用

我们将使用一个简单的支付的例子,来一步步的配值Spring Web Flow, 我们首先要理清楚整个支付的流程

代码语言:javascript
复制
开始 --> 特定用户 --> 创建订单 --> 支付 --> 
保存订单 --> 感谢用户 -->结束

这个简化的支付流程是一个线性的过程,定义起来还是什么容易。

首先我们默认已经搭建好了Spring SpringMVC项目 现在开始构建项目:

  1. 首先要导入SWF需要的jar
代码语言:javascript
复制
<dependency>
            <groupId>org.springframework.webflow</groupId>
            <artifactId>spring-webflow</artifactId>
            <version>2.4.5.RELEASE</version>
        </dependency>

2.配置springmvc.xml文件

基于springmvc项目我们需要,在springmvc.xml配值文件中配值拦截映射器:

代码语言:javascript
复制
<bean id="flowHandlerMapping"
        class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
        <property name="flowRegistry" ref="flowRegistry" />
        <property name="defaultHandler">
            <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController" />
        </property>
</bean>

配置流的处理器适配器

代码语言:javascript
复制
<bean id="flowHandlerAdapter"
        class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
        <property name="flowExecutor" ref="flowExecutor" />
    </bean>

3.创建并配置webflow-config.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:webflow="http://www.springframework.org/schema/webflow-config"
    xsi:schemaLocation=" http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/webflow-config
        http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd">
    <!-- 装配流程执行期:为用户创建和启动一个流程执行实例,不负责加载流程定义 -->
    <webflow:flow-executor id="flowExecutor" />
    <!-- 配置流程注册表,其功能为:负责加载流程定义 -->
    <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->
    <webflow:flow-registry id="flowRegistry"
        flow-builder-services="flowBuilderServices">
        <webflow:flow-location path="/WEB-INF/flows/shopping.xml"
            id="shopping" />
        <!-- 在这个声明中,流程注册表会在该path下查找流程定义 -->
    </webflow:flow-registry>
    <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->
    <webflow:flow-builder-services id="flowBuilderServices"
        view-factory-creator="mvcViewFactoryCreator" />
    <!-- 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->
    <bean id="mvcViewFactoryCreator"
        class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
        <property name="viewResolvers" ref="viewResolver" />
    </bean>
</beans>

4.创建shopping.xml用来定义流程

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns="http://www.springframework.org/schema/webflow"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/webflow
     http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
    <!-- view-state中的view对应views文件夹中的jsp页面,on是触发事件,to对应state id -->

    <!-- 根据排在第一位的顺序来执行 -->
    <view-state id="viewCart" view="viewCart">
        <transition on="submit" to="viewOrder">
        </transition>
    </view-state>
    <view-state id="viewOrder" view="viewOrder">
        <transition on="confirm" to="viewConfirmed">
        </transition>
    </view-state>
    <view-state id="viewConfirmed" view="viewConfirmed">
        <transition on="returnToIndex" to="returnToIndex">
        </transition>
    </view-state>
    <end-state id="returnToIndex" view="externalRedirect:/index.jsp">
    </end-state>
</flow>

其中on属性表示触发的事件,to属性是当触发该事件后转向的状态。首先转向viewCart状态,当点击submit后转向viewOrder状态,在该状态下点击confirm则会转移到viewConfirmed状态,依次同理。这里转向的页面是jsp页面,

view-state的属性id与jsp文件的名字相对应。

例如id viewCart 对应viewCart.jsp页面

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cart Application</title>
</head>
<body>
    <h1>View Cart</h1>
    <a href="${flowExecutionUrl}&_eventId=submit">Submit</a>
</body>
</html>

上面需要说明的是Spring Web Flow为视图的用户提供了一个flowExecutionUrl变量,它包含了流程的URL,结束链接将一个”_eventId”参数关联到URL上,以便回到Web流程时触发该参数值的事件,直到流程结束。

再例如:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Cart Application</title>
</head>
<body>
    <h1>Order Confirmed</h1>
    <a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>
</body>
</html>
</html>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 组件
    • 流程配置例子
    • Spring Web Flow 应用
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档