首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Spring Web Flow 2.0 入门(7)

Spring Web Flow 2.0 入门(7)

添加三个 jsp 页面在 /WEB-INF/jsp 目录下创建三个 flow 所需的视图资源。以下清单只给出 jsp 页面中 body 元素以内的代码,其余省略。
清单 17 viewCart.jsp
1
2
<h1>View Cart</h1>
<a href="${flowExecutionUrl}&_eventId=submit">Submit</a>




清单 18 viewOrder.jsp
1
2
<h1>Order</h1>
<a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>




清单 19 orderConfirmed.jsp
1
2
<h1>Order Confirmed</h1>
<a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to index</a>




这几个页面都使用了变量 flowExecutionUrl ,表示 flow 执行到当前状态时的 URL 。 flowExecutionUrl 的值已经由 Spring Web Flow 2.0 框架的代码进行赋值,并放入相应的 model 中供 view 访问。 flowExecutionUrl 的值包含 flow 在执行过程中会为每一状态生成的唯一的 key ,因此不可用其他手段来获取。请求参数中 _eventId 的值与清单 16 中 transition 元素的 on 属性的值是对应的,在接收到_eventId参数后,相应transition会被执行。
修改 index.jsp 页面在 index.jsp 页面中添加启动 flow 的链接,从 webmvc-config.xml 配置文件中可以看出,要启动 flow ,只需提供 /shopping.do 链接即可。
清单 20 index.jsp
1
2
<h1>Hello!</h1><br/>
<a href="shopping.do">View Cart</a>




运行应用程序将应用程序发布到 Tomcat 服务器,访问 index.jsp ,并启动 flow ,测试页面的跳转。效果如图 5所示:
图 4 flow 运行效果用 Unified EL 实现业务逻辑到现在为止,这个购物车应用只是实现了页面之间的跳转,接下来我们要实现与业务逻辑相关的功能。由于本教程的重点在于介绍如何应用 Spring Web Flow ,所实现的业务比较简单,与实际应用有较大的距离,请读者谅解。
业务的逻辑涉及到数据的获取、传递、保存,相关的业务功能函数的调用等内容,这些功能的实现都可用 Java 代码来完成,但定义 Spring Web Flow 的语法与 Java 是无关的,这就要求 Spring Web Flow 提供与 Java 代码的整合机制。要了解这种机制,关键在于搞清楚两个问题:
  • 业务逻辑代码在什么时候被调用?
  • 业务逻辑代码在调用后得到的数据如何保存、传递?
业务逻辑代码在什么时候被调用?在 Spring Web Flow 中,业务逻辑代码的执行可由以下三种情形来触发:
  • 客户端请求中包含了 _eventId 参数
  • 执行到框架自定义的切入点
  • 执行到 <action-state> 元素
客户端请求中包含了 _eventId 参数这种方式一般用在 state 之间的 transition ,通过指定 _eventId 参数的值,表明了客户的行为,从而导致相应事件的发生,在 Spring Web Flow 的定义文件中可以通过 evaluate 元素来指定要处理的业务逻辑。参看清单21:
清单 21 transition 示例
1
2
3
<transition on="submit">
<evaluate expression="validator.validate()" />
</transition>




清单 21 的代码表示,当客户端的请求中包含“ _eventId=submit ”,则 evaluate 元素中 expression 属性所指明的表达式会被执行,即 validator 对象的validate 方法会得到调用。
执行到框架自定义的切入点Spring Web Flow 定义了 5 个切入点,通过 flow 定义文件的配置,可在这 5 个切入点插入相关业务逻辑代码。
表 2 Spring Web Flow 自定义的切入点切入点名称 XML 元素名称 触发时刻 flow starton-startflow 执行之前 state entryon-entry进入某个 state 之后,做其他事情之前view renderon-render在进入 view 的 render 流程之后,在 view 真正 render出来之前state exiton-exit在退出 state 之前flow endon-endflow 执行结束之后
清单 22 给出了在 view render 切入点插入业务逻辑代码的例子:
清单 22 on-render 元素
1
2
3
4
5
6
<view-state id="viewCart" view="viewCart" >
  <on-render>
    <evaluate expression="productService.getProducts()"
      result="viewScope.products"/>
  </on-render>
</view-state>




执行到 <action-state> 元素Spring Web Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state 。如果某个应用的业务逻辑代码即不适合放在 transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加 <action-state> 元素专用于该业务逻辑的执行。示例代码参看清单23:
清单 23 action-state 示例
1
2
3
4
<action-state id="addToCart">
  <evaluate expression="cart.addItem(productService.getProduct(productId))"/>
  <transition to="productAdded"/>
</action-state>

返回列表