Spring Web Flow是Spring框架的子项目,作用是让程序按规定流程运行。  

1 安装配置Spring Web Flow

  虽然Spring Web Flow是Spring框架的子项目,但它并不是Spring框架的一部分,所以在构建基于流程的应用前,需要先添加Spring Web Flow所需的jar包。下载地址为:http://www.springframework.org/webflow

  Spring Web Flow是构建与Spring MVC基础之上的。这意味着所有的流程请求都需要首先经过Spring MVC的DispatcherServlet。所以我们需要在Spring应用上下文中进行相应的配置。

1.1 FlowRegistry

  FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowResigtry 中。 

<webflow:flow-registry  id=”shopping”/>
</webflow:flow-registry>

  每个 flow 都必须要有 id 来标识,如果在配置中省略,那么该 flow 默认的 id 将是该定义文件(xml文件)的文件名去掉后缀所得的字符串(例如本例中如果去掉>。

1.2 FlowExecutor

  FlowExecutor 是 Spring Web Flow 的一个核心接口,启动某个 flow ,都要通过这个接口来进行。从配置角度来说,只要保证有个 FlowExecutor 就可以了, Spring Web Flow 的默认行为已经足够。
<webflow:flow-executor  />

1.3 Spring Web Flow 如何与 Spring Web MVC 整合在一起?

  客户端发送的请求,先会由 servlet 容器(本教程示例中即为 Tomcat )接收, servlet 容器会找到相应的应用程序(本教程中即为 CartApp ),再根据 web.xml 的配置找到出符合映射条件的 servlet 来处理。 Spring Web MVC 中处理请求的 servlet 是 DispatcherServlet ,如果请求的路径满足 DispatcherServlet 的映射条件,则 DispatcherServlet 会找出 Spring IoC 容器中所有的 HandlerMapping ,根据这些 HandlerMapping 中匹配最好的 handler (一般情况下都是 controller ,即控制器)来处理请求。当 Controller 处理完毕,一般都会返回一个 view (视图)的名字,DispatcherServlet再根据这个view的名字找到相应的视图资源返回给客户端。

  搞清楚 Spring Web MVC 处理请求的流程后,基本上就可以明白要整合 Spring Web MVC 与 Spring Web Flow 所需要的配置了。为了让客户端的请求变成执行某个 flow 的请求,要解决以下几个问题:

  1. 需要在某个 HandlerMapping 中配置负责处理 flow 请求的 handler (或 controller )
  2. 该handler (或 controller )要负责启动指定的 flow
  3. flow 执行过程中以及执行完成后所涉及的视图应呈现给客户端

1.4 FlowHandler 和 FlowController

  现在,需要一种接收执行 flow 的请求,然后根据请求来启动相应 flow的handler (处理器), Spring Web Flow 2.0 提供了两种方案可供选择。第一种方案是自己编写实现了 FlowHandler 接口的类,让这个类来实现这个功能。第二种方案是使用一个现成的叫做 FlowController 的控制器。第一种方案灵活性比较大,在许多场合可能也是唯一的选择,但对每个 flow 都需要编写相应的 FlowHandler 。本教程的示例采用第二种方案,对 FlowHandler 的介绍可参看 Spring Web Flow 2.0 自带的文档。 FlowController 其实是个适配器,一般来讲,我们只要明白 FlowController 可根据客户端请求的结尾部分,找出相应的 flow 来执行。配置 FlowController只需指定FlowExecutor即可

<bean />
</bean>

  另外还需在 HandlerMapping 中指明 /shopping.do 请求由 flowController 来处理:

Spring学习笔记4—流程(Spring Web Flow)
<bean >        </span>......
</bean>
Spring学习笔记4—流程(Spring Web Flow)
  需要指出的是,不管设成 /shopping.do 还是设成 /shopping ,或者 /shopping.htm ,效果都是一样的, flowController 都会去找 id 为 shopping的flow来执行。

1.5 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”来解析,最后呈现给用户。

Spring学习笔记4—流程(Spring Web Flow)

    <!-- FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowRes    igtry 中 -->
    <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->
    <webflow:flow-registry />
    </webflow:flow-registry>


   <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->
<webflow:flow-builder-services />
</bean>
Spring学习笔记4—流程(Spring Web Flow)

  所有这些配置的目的无非是两个:一是要让客户端的请求转变成 flow 的执行,二是要让 flow 执行过程中、或执行结束后得到的视图能返还给客户端。

 

2 Spring Web Flow的组件

  Spring Web Flow中,流程是由3个主要元素定义的:状态、转移和流程数据。

2.1 状态

  Spring Web Flow定义了5种不同类型的状态(state)——行为、决策、结束、子流程和视图状态。

  除了结束状态外,其他状态都可以转换到别的状态,一般通过在状态中定义转移(transition) 来实现到其他状态的转换,转换的发生一般由事件(event)来触发。

2.1.1 视图状态

  视图状态用来为用户展现信息并是用户参与流程。实际的视图可以是任意类型,但通常是用JSP来实现。  

  在流程XML文件中,使用<view-state>定义视图状态。

<view-state id="viewCart" view="viewCart">
        <transition on="submit" to="viewOrder">
        </transition>
</view-state>
View Code

2.1.2 行为状态

  行为状态是程序自身在执行任务,一般情况下会触发Spring管理的Bean的一些方法并根据方法的返回结果转移到另一个状态。

  在流程XML文件中,使用<action-state>定义行为状态。

<action-state id="addToCart">
        <evaluate expression="cart.addItem(productService.getProduct(productId))" />
        <transition to="productAdded" />
</action-state>
View Code

相关文章:

  • 2022-02-04
  • 2021-10-27
  • 2021-06-22
  • 2021-07-05
  • 2022-01-02
  • 2021-04-14
  • 2021-12-19
猜你喜欢
  • 2021-04-26
  • 2022-01-10
  • 2022-01-01
  • 2022-01-22
  • 2021-08-20
  • 2021-11-12
相关资源
相似解决方案