0%

Spring Web flow 概念简介

简介

最近在搭建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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="UTF-8"?>
<flow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/webflow"
xsi:schemaLocation="http://www.springframework.org/schema/webflow
http://www.springframework.org/schema/webflow/spring-webflow.xsd">

<action-state id="initializeLoginForm">
<evaluate expression="initializeLoginAction" />
<transition on="success" to="viewLoginForm"/>
</action-state>

<view-state id="viewLoginForm" view="casLoginView" model="credential">
<binder>
<binding property="username" required="true"/>
<binding property="password" required="true"/>
</binder>
<transition on="submit" bind="true" validate="true" to="realSubmit" history="invalidate"/>
</view-state>

<action-state id="realSubmit">
<evaluate expression="authenticationViaFormAction"/>
<transition on="warn" to="warn"/>
<transition on="success" to="createTicketGrantingTicket"/>
<transition on="successWithWarnings" to="showAuthenticationWarningMessages"/>
<transition on="authenticationFailure" to="handleAuthenticationFailure"/>
<transition on="error" to="initializeLoginForm"/>
</action-state>
</flow>

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),但是大大加大了配置的代码