Spring Web Folw配置

2020-08-04 23:49:23 浏览数 (1)

配置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>

0 人点赞