简介
最近在搭建CAS单点登录,CAS中使用了Spring Web Flow来构建MVC 应用,需要对Web Flow的基本概念有一定的了解才能进行CAS登录的改造。
什么是Spring Web Flow
Flow字面上的意思为工作流,意思就是将一系列的操作进行编排,使用户较为直观的了解整个业务流程,比如OA系统中的工作流,IT管理人员在OA系统中编辑了一个请假的工作流,那么在员工在OA上提出请假单时,就可以直观的查看请假的流程是什么,现在流程进行到哪一步,Spring Web Flow对Spring MVC进行了再一次封装,使之前在Controller的页面和动作跳转已工作流的这种形式直观的体现出来,可以在xml中配置和查看某个业务具体的流程跳转(Spring Web Flow是基于SpringMVC的基础上开发的,允许web应用对flows实现。一个Flow封装了一些列的操作步骤,引导用户执行某些业务任务。Flows可以包含多个HTTP的请求,她有状态、能处理事务的数据,是可重用的,本质上是可以动态的长时间运行).
Spring Web Flow 的基本配置
每个Flow可以包含多个如下的配置:
- Actions: 一个可执行任务和有返回结果的组件
- Transitions: 把Flow从一个状态转到另外一个状态;转换可能对整个FLow有全局影响。
- Views: 把表示层展现到客户端显示的组件
- Decisions: 路由到其他的Flow,可以有逻辑的判定组件
Flow 可看作是客户端与服务器的一次对话( conversation )。 Flow 的完成要由分多个步骤来实现,在 Spring Web Flow 的语义中,步骤指的就是 state 。 Spring Web Flow 提供了五种 state ,分别是 Action State 、 View State 、 Subflow State 、 Decision State 、 End State ,这些 state 可用于定义 flow 执行过程中的各个步骤。除了 End State 外,其他 state 都可以转换到别的 state ,一般通过在 state 中定义 transition 来实现到其他 state 的转换,转换的发生一般由事件( event )来触发
Spring Web Flow的核心类
FlowRegistry
FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowResigtry 中。
FlowExecutor
FlowExecutor 是 Spring Web Flow 的一个核心接口,启动某个 flow ,都要通过这个接口来进行
FlowBuilder Services
flow-builder-services 属性的配置指明了在这个 flow-registry “仓库”里的 flow 的一些基本特性,例如,是用 Unified EL 还是 OGNL, model (模型)对象中的数据在显示之前是否需要先作转换,等等。比如我们需要在 flow-builder-services 属性中指明 Spring Web Flow 中所用到的 view ,由 Spring Web MVC 的“ View Resolver ”来查找,由 Spring Web MVC 的“ View Class”来解析,最后呈现给客户。
Flow 的xml配置
下面是CAS 的login-webflow.xmlw配置文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
CAS中对Spring Web Flow的代码进行了二次封装,主体的逻辑是在程序开启时将login这个url和上述的web flow做绑定,当访问后缀为login的地址时会自动跳转到这个flow中,将配置的casLoginView这个页面展示出去,当casLoginView页面中触发submit动作时候又会跳转到realSubmit这个action,接着运行配置的authenticationViaFormAction代码,最后flow完成调用
Spring Web Flow 基础详细说明和实例
https://www.ibm.com/developerworks/cn/education/java/j-spring-webflow/index.html
总结
Spring Web Flow总体来说就是对传统的MVC C到V和V到C做了一层中间层,使这部分的业务更加抽象更能体现出业务流程,并实现在Requset和Session中多加了一种状态Flow作用域,在Flow的调用中这部分的调用都是共享状态的(类似session,在多次请求中session可以获取相同的变量,flow的作用域比request大但是却小于session),但是大大加大了配置的代码