返回介绍

8.3.1 定义基本流程

发布于 2024-08-17 00:45:50 字数 2400 浏览 0 评论 0 收藏 0

一个新的披萨连锁店Spizza决定允许用户在线订购以减轻店面电话的压力。当顾客访问Spizza站点时,他们需要进行用户识别,选择一个或更多披萨添加到订单中,提供支付信息然后提交订单并等待热乎又新鲜的披萨送过来。图8.2阐述了这个流程。

图8.2 将订购披萨的过程归结为一个简单的流程

图中的方框代表了状态而箭头代表了转移。你可以看到,订购披萨的整个流程很简单且是线性的。在Spring Web Flow中,表示这个流程是很容易的。使这个过程变得更有意思的就是前三个流程会比图中的简单方框更复杂。

以下的程序清单8.1展示了如何使用Spring Web Flow的XML流程定义来实现披萨订单的整体流程。

程序清单8.1 披萨订单流程定义为Spring Web Flow

在流程定义中,我们看到的第一件事就是order变量的声明。每次流程开始的时候,都会创建一个Order实例。Order类会带有关于订单的所有信息,包含顾客信息、订购的披萨列表以及支付详情,如下面所示。

程序清单8.2 Order带有披萨订单的所有细节信息

流程定义的主要组成部分是流程的状态。默认情况下,流程定义文件中的第一个状态也会是流程访问中的第一个状态。在本例中,也就是identifyCustomer状态(一个子流程)。但是如果你愿意的话,你可以通过<flow>元素的start-state属性将任意状态指定为开始状态。

识别顾客、构造披萨订单以及支付这样的活动太复杂了,并不适合将其强行塞入一个状态。这是我们为何在后面将其单独定义为流程的原因。但是为了更好地整体了解披萨流程,这些活动都是以<subflow-state>元素来进行展现的。

流程变量order将在前三个状态中进行填充并在第四个状态中进行保存。identifyCustomer子流程状态使用了<output>元素来填充order的customer属性,将其设置为顾客子流程收到的输出。buildOrder和takePayment状态使用了不同的方式,它们使用<input>将order流程变量作为输入,这些子流程就能在其内部填充order对象。

在订单得到顾客、一些披萨以及支付细节后,就可以对其进行保存了。saveOrder是处理这个任务的行为状态。它使用<evaluate>来调用ID为pizzaFlowActions的bean的saveOrder()方法,并将保存的订单对象传递进来。订单完成保存后,它会转移到thankCustomer。

thankCustomer状态是一个简单的视图状态,后台使用了“/WEB-INF/flows/pizza/ thankCustomer.jsp”这个JSP文件,如下所示:

程序清单8.3 感谢顾客订购的JSP视图

在“感谢”页面中,会感谢顾客的订购并为其提供一个完成流程的链接。这个链接是整个页面中最有意思的事情,因为它展示了用户与流程交互的唯一办法。

Spring Web Flow为视图的用户提供了一个flowExecutionUrl变量,它包含了流程的URL。结束链接将一个“_eventId”参数关联到URL上,以便回到Web流程时触发finished事件。这个事件将会让流程到达结束状态。

流程将会在结束状态完成。鉴于在流程结束后没有下一步做什么的具体信息,流程将会重新从identifyCustomer状态开始,以准备接受另一个披萨订单。

这涵盖了订购披萨的整体流程。但是这个流程并不仅仅是我们在代码清单8.1中所看到的这些。我们还需要定义identifyCustomer、buildOrder、takePayment这些状态的子流程。让我们从识别用户开始构建这些流程。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文