什么是webflow:

  Spring Web Flow构建于Spring MVC之上,允许实现Web应用程序的“流程”。流程封装了一系列步骤,指导用户执行某些业务任务。它跨越多个HTTP请求,具有状态,处理事务数据,可重用,并且可能是动态的,并且本质上是长期运行的。

  Spring Web Flow的最佳位置是具有受控导航功能的有状态Web应用程序,例如办理登机手续,申请贷款,购物车结帐,甚至向表单添加确认步骤。这些场景的共同点是以下一个或多个特征:

  • 有一个明确的开始和结束点。
  • 用户必须按特定顺序浏览一组屏幕。
  • 直到最后一步,更改才会完成。
  • 一旦完成,就不可能意外地重复交易

以上是Spring官网中给出的解释,我觉得也非常准确就直接引用一下~~

如何在现有项目中引入webflow:

  1.添加相关依赖(因为webflow2.X版本是构建于SpringMVC之上的,所以请自行添加其余依赖)

<dependencies>
<dependency>
<groupId>org.springframework.webflow</groupId>
<artifactId>spring-webflow</artifactId>
<version>2.4.5.RELEASE</version>
</dependency>
</dependencies>

  2.在已有的SpringMVC配置中引入如下配置:(如此处已引入过类似配置可忽略相关内容)

    <!-- 配置包扫描器 -->
<context:component-scan base-package="*****"/>
<!-- 配置注解驱动 -->
<mvc:annotation-driven/>
<import resource="webmvc-config.xml"/>
<import resource="webflow-config.xml"/>

  webmvc-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--class="org.springframework.web.servlet.view.UrlBasedViewResolver">-->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<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>
<bean id="flowHandlerAdapter" class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
</beans>

  webflow-config.xml:

<?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="index" />
<webflow:flow-location path="/WEB-INF/flows/test.xml" id="test" />
<webflow:flow-location path="/WEB-INF/flows/shopping-sub.xml" id="subflow"/>
<!-- 在这个声明中,流程注册表会在该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>

  shopping.xml:

<?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 -->
<!-- 流程开始前的初始化工作 -->
<on-start>
<evaluate expression="initData"></evaluate>
</on-start>
<view-state id="hello" view="hello">
<transition on="viewCart" to="viewCart"></transition>
</view-state>
<!-- 根据排在第一位的顺序来执行 -->
<view-state id="viewCart" view="viewCart">
<transition on="submit" to="viewOrder"></transition>
<transition on="confirm" to="login"></transition>
</view-state> <action-state id="login" >
<evaluate expression="loginAction"/>
<transition on="success" to="orderConfirmed"></transition>
<transition on="error" to="returnToIndex"></transition>
</action-state> <view-state id="viewOrder" view="viewOrder">
<transition on="confirm" to="orderConfirmed">
</transition>
</view-state>
<view-state id="orderConfirmed" view="orderConfirmed">
<transition on="returnToIndex" to="returnToIndex"></transition>
<transition on="dataCheck" to="dataCheck"></transition>
</view-state>
<!-- 本流程中的数据流转 -->
<action-state id="dataCheck">
<evaluate expression="dataCheck"></evaluate>
<transition on="success" to="subflow"></transition>
</action-state>
<!-- 创建一个子流程 -->
<subflow-state id="subflow" subflow="subflow">
<transition on="returnshopping" to="returnToIndex"></transition>
</subflow-state> <end-state id="returnToIndex" view="index">
</end-state> <!-- 全局流程变量 -->
<global-transitions>
<transition on="returnToIndex" to="returnToIndex"></transition>
</global-transitions>
</flow>

  以上配置为我的实验项目的具体配置,关于(webmvc-config.xml,webflow-config.xml)中的内容已给出相应注释,只特别说明一点:

<webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="index" />

  这个配置中的id为项目的访问路径,以上配置的访问路径类似:localhost:8080/***/index(项目也将从这个访问路径进入webflow流程)

webflow的核心参数:

  在开始介绍流程之前我们需要先知道webflow中存在两大核心参数:

  1.execution:此参数用于指定一个唯一的流程实例,在页面提交时此处的值可以直接通过${flowExecutionKey}获得

  2._eventId:此参数用于确定页面的跳转关系,对应shopping.xml中on属性中的值

  3.flowExecutionUrl:在提交的时候可以直接使用此参数作为form表单中action的值:${flowExecutionUrl}

  上述的1,2参数是使用webflow框架在页面提交请求的时候必须带回的参数

webflow的流程定义:

  在介绍完webflow的基础定义与简单配置之后,接下来将着重为大家介绍webflow的流程定义(shopping.xml)文件(如上文我配置中引入的其他流程定义与之类似不做重复介绍)

  常用标签:

  on-start:此标签的作用是在流程启动执行前,先执行的内容(可以用于初始化一些业务所需的数据)

    evaluate:

      expression:此处的值为对应的bean(该bean需 extends AbstractAction),实现 doExecute 方法(此方法即为初始化方法)

  view-state:此标签用于指定对应的视图页面

    id:指代当前标签

    view:指代视图名称(如不添加veiw属性,该值默认=id)

    transition:

      on:对应_eventId的值,表明触发事件

      to:该触发事件所对应的动作,一般为需要执行的标签id

  action-state:于view-state类似,不同之处在于此标签对应的是JavaBean(相关属性参照上文标签)

  subflow-state:用于定义当前流程的子流程

    id:指代当前子流程

    subflow:指代子流程名字,需对应webflow-config中webflow:flow-location所添加的子流程的id

  end-state:流程结束标签

  global-transitions:用于指定全局的流程变量,即:在流程中任意位置触发当前_eventId,均会进入对应to的位置

  最后提醒一点的是:webflow的流程定义文件中的配置为顺序执行(哪个标签配置在最前面,流程会优先进入该标签,之后的根据流转规则执行)

webflow的数据:

  在webflow中关于数据的业务需要,给出了不同的数据存储位置,常用储存位置如下:

  1.FlowScope:放在此处的数据仅在当前流程中可见,随着当前流程的销毁而销毁(子流程中不可见)

  2.ConversationScope:放在此处的数据为最顶层流程与所有子流程共享数据,在整个业务流程结束后销毁(子流程可见)

  3.RequestScope:放在此处的数据仅存在于当前请求中,随着当前请求的结束而销毁。

  4.FlashScope:放在此处的数据为当前流程共享,但是会随着视图解析而销毁。

  5.ViewScope:放在此处的数据仅在当前视图状态可见

  数据存储与取值方式:context.getFlowScope().put() context.getFlowScope().get()

尾声:

  介绍到这里,webflow的基础知识就已经介绍完毕啦,个人的总结就是webflow在某些特定的场合下确实比MVC的方式,在项目代码结构看起来更清晰明了,但也存在一些天然缺陷(没有MVC那么自由),webflow的流程自由是配置时候的流程自由,在配置好之后就是固定的啦。(当然,这本来也是这个框架的定位!)现在webflow的官网中对于webflow的流程定义给出了很多实用的标签和属性(如解决页面弹框等问题)如果对这一块感兴趣的朋友可以参见官网继续学习~~

  最后附上两个链接吧:

  1.spring-webflow官网:https://projects.spring.io/spring-webflow/

  2.本文档相关实践项目:https://github.com/ksuth/Study.git

    

    

    

Spring-webflow基础讲解的更多相关文章

  1. Spring Boot基础讲解

    Spring Boot Spring Boot 是由Pivotal团队提供的框架,它并不是一个全新的框架,而是将已有的 Spring 组件整合起来,设计目的是用来简化新Spring应用的初始搭建以及开 ...

  2. Spring Boot 基础教程系列学习文档

    Spring Boot基础教程1-Spring Tool Suite工具的安装 Spring Boot基础教程2-RESTfull API简单项目的快速搭建 Spring Boot基础教程3-配置文件 ...

  3. 一起学Spring之基础篇

    本文主要讲解Spring的基础环境搭建以及演变由来,仅供学习分享使用,如有不足之处,还请指正. 什么是Spring ? Spring是一个开源框架,用来处理业务逻辑层和其他层之间的耦合问题.因此Spr ...

  4. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  5. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  6. 2015年11月30日 spring初级知识讲解(一)装配Bean

    序,Spring的依赖注入是学习spring的基础.IOC为控制反转,意思是需要的时候就由spring生成一个,而不是先生成再使用. 写在前面 Spring提供面向接口编程,面向接口编程与依赖注入协作 ...

  7. Verilog语法基础讲解之参数化设计

    Verilog语法基础讲解之参数化设计   在Verilog语法中,可以实现参数化设计.所谓参数化设计,就是在一个功能模块中,对于一个常量,其值在不同的应用场合需要设置为不同的置,则将此值在设计时使用 ...

  8. spring中基础核心接口总结

    spring中基础核心接口总结理解这几个接口,及其实现类就可以快速了解spring,具体的用法参考其他spring资料 1.BeanFactory最基础最核心的接口重要的实现类有:XmlBeanFac ...

  9. Spring Boot 基础

    Spring Boot 基础 Spring Boot 项目(参考1) 提供了一个类似ASP.NET MVC的默认模板一样的标准样板,直接集成了一系列的组件并使用了默认的配置.使用Spring Boot ...

  10. Spring MVC 基础

    Spring MVC 基础 1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是 ...

随机推荐

  1. Entity Framework 查漏补缺 (三)

    Code First的数据库映射 有两种方式来实现数据库映射: 数据属性:Data Annotation 映射配置: Fluent API 有继承关系的实体如何映射? Code First在生成数据库 ...

  2. [翻译]Linux 内核里的数据结构 —— 基数树

    目录 Linux 内核里的数据结构 -- 基数树 基数树 Radix tree Linux内核基数树API 链接 Linux 内核里的数据结构 -- 基数树 基数树 Radix tree 正如你所知道 ...

  3. AppBoxFuture(五): 分布式文件存储-Store Everything

      本来本篇是想介绍前端组件化开发用户界面,发现框架还未实现文件存储,原本计划是后续设计开发的,索性把计划提前,所以本篇将介绍基于Raft实现分布式的文件存储引擎. 一. 实现思路   既然是分布式存 ...

  4. 【大数据安全】Apache Kylin 安全配置(Kerberos)

    1. 概述 本文首先会简单介绍Kylin的安装配置,然后介绍启用Kerberos的CDH集群中如何部署及使用Kylin. Apache Kylin™是一个开源的分布式分析引擎,提供Hadoop/Spa ...

  5. RESTful 规范

    RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...

  6. [Nodejs] node实现静态文件服务器

    node 静态文件处理 一般后端进行静态文件处理都是使用 Apache nginx 等静态 web 服务器,但是既然使用 node 了,就用 node 实现以下静态服务器吧. 之前弄了不少充满艺术的数 ...

  7. 如何在已有项目中引入FineUIMvc

    FineUIMvc简介 FineUIMvc 是基于 jQuery 的专业 ASP.NET MVC 控件库,其前身是基于 WebForms 的开源控件库 FineUI(历时9年120多个版本).Fine ...

  8. c#上位机与三菱PLC(FX3U)串口通讯

    项目中会经常用到上位机与PLC之间的串口通信,本文介绍一下C#如何编写上位机代码 与三菱FX3U进行通讯 1. 第一种方法是自己写代码实现,主要代码如下: //对PLC的Y7进行置1 byte[] Y ...

  9. Spring-注解实现IOC

    一.定义 注解:是一种标记式的配置方式,与XML配置文件不同,注解提供了更大的便捷性,易于维护修改,但是耦合度高. 本质:是一个继承了 Annotation 接口的接口,注解本身并没有什么作用,通过特 ...

  10. html文档知识补充

    13.form表单(*******) 功能:前后数据交互,帮你提交任意的数据 input通过控制type属性来展示不同的获取用户输入的页面效果 type属性总结: text:纯文本 password: ...