转载地址

http://blog.csdn.net/hejingyuan6/article/details/46516287

第一部分demo仅仅介绍了简单的页面跳转,接下来我们要实现与业务逻辑相关的功能。

业务的逻辑涉及到数据的获取、传递、保存,相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完成,但定义 spring Web Flow 的语法与 Java 是无关的,这就要求 Spring Web Flow 提供与 Java代码的整合机制。要了解这种机制,关键在于搞清楚两个问题:

  • 业务逻辑代码在什么时候被调用?
  • 业务逻辑代码在调用后得到的数据如何保存、传递?

业务逻辑代码在什么时候被调用?

在 Spring Web Flow中,业务逻辑代码的执行可由以下三种情形来触发:

  • 客户端请求中包含了 _eventId 参数
  • 执行到框架自定义的切入点
  • 执行到 <action-state> 元素

1,客户端请求中包含了 _eventId参数

这种方式一般用在state 之间的 transition ,通过指定 _eventId 参数的值,表明了客户的行为,从而导致相应事件的发生,在 Spring Web Flow的定义文件中可以通过 evaluate 元素来指定要处理的业务逻辑

[html] view plaincopyprint?
  1. <transition on="submit">
  2. <evaluate expression="validator.validate()" />
  3. </transition>

当客户端的请求中包含“_eventId=submit ”,则 evaluate 元素中 expression 属性所指明的表达式会被执行,即 validator对象的validate 方法会得到调用。

2,执行到框架自定义的切入点

SpringWeb Flow 定义了 5 个切入点,通过 flow 定义文件的配置,可在这 5 个切入点插入相关业务逻辑代码。

SpringWeb Flow 自定义的切入点

切入点名称

XML 元素名称

触发时刻

flow start

on-start

flow 执行之前

state entry

on-entry

进入某个 state 之后,做其他事情之前

view render

on-render

在进入 view 的 render 流程之后,在 view 真正 render出来之前

state exit

on-exit

在退出 state 之前

flow end

on-end

flow 执行结束之后

on-render 元素

[html] view plaincopyprint?
  1. <view-state id="viewCart" view="viewCart" >
  2. <on-render>
  3. <evaluate expression="productService.getProducts()" result="viewScope.products"/>
  4. </on-render>
  5. </view-state>

后续会详细介绍,下面的demo即使用此种方式与业务逻辑建立关系。

3,执行到<action-state> 元素

SpringWeb Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state 。如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加<action-state> 元素专用于该业务逻辑的执行。

action-state 示例

[html] view plaincopyprint?
  1. <action-state id="addToCart">
  2. <evaluate expression="cart.addItem(productService.getProduct(productId))"/>
  3. <transition to="productAdded"/>
  4. </action-state>

后续会详细介绍,在下篇博客中会介绍。

业务逻辑代码在调用后得到的数据如何保存、传递?

Spring Web Flow的定义中可直接使用表达式语言( Expression Language ),前面的代码都是用的 Unified EL ,对于习惯用 OGNL的开发人员,可通过 flow-builder-services 的配置改成使用 OGNL 。不管是哪一种表达式语言, Spring Web Flow都提供了一些固定名称的变量,用于数据的保存、传递。

在 Spring Web Flow的解决方案中,我们知道 Spring Web Flow 所着力解决的问题即是数据存取范围的问题,为此, Spring Web Flow提供了两种比较重要的范围,一是 flow 范围,另一个是 conversation 范围。通过 flowScope 和 conversationScope这两个变量, Spring Web Flow 提供了在这两种范围里存取数据的方法。

[html] view plaincopyprint?
  1. <evaluate expression="productService.getProducts()" result="flowScope.products" />

注意:Spring Web Flow 2.0 在默认配置下,flowScope 和 conversationScope的实现依赖于 Java 序列化和反序列化技术,因此存放于 flowScope 或 conversationScope 中的对象需要实现java.io.Serializable 接口。

注:

  1. flow 范围。此范围内的对象在 flow 开始时创建, flow 结束时销毁,在 flow 定义文件中可通过“ flowScope ”变量名来访问。
  2. conversation 范围。此范围内的对象与 flow 范围对象基本相似,唯一不同在于 conversation 范围内的对象所在的 flow 如果调用了其他 subflow ,那么在 subflow 中也可访问该对象。(也就是说:subflow中能够访问conversation中的对象)

SpringWeb Flow 还提供了大量其他的变量,以方便数据的存取。如 viewScope 范围即是从进入 view-state 至退出 view-state 结束,requestScope 即和一般的 request 范围没什么区别,等等。另外还有一些用于获取 flow 以外数据的变量,如requestParameters 、 messageContext 等等。具体变量的列表可参看 Spring Web Flow自带的文档。

Demo实现:

ProductService类

[java] view plaincopyprint?
  1. package samples.webflow;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import org.springframework.stereotype.Service;
  7. @Service("productService")
  8. public class ProductService {
  9. private Map<Integer, Product> products = new HashMap<Integer, Product>();
  10. public ProductService() {
  11. products.put(1new Product(1"Bulldog"1000));
  12. products.put(2new Product(2"Chihuahua"1500));
  13. products.put(3new Product(3"Labrador"2000));
  14. }
  15. public List<Product> getProducts() {
  16. return new ArrayList<Product>(products.values());
  17. }
  18. public Product getProduct(int productId) {
  19. return products.get(productId);
  20. }
  21. }

Service 注解表示 Spring IoC容器会初始化一个名为 productService 的 Bean ,这个 Bean 可在 Spring Web Flow的定义中直接访问。(这也是为什么在web-application-config.xml中添加注解的原因)

修改shopping.xml 文件

要在 viewCart 页面中显示商品,只需在view-state 元素的 on-render 切入点调用 productService 的 getProducts 方法,并将所得结果保存到viewScope 中即可。

修改后的shopping.xml

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <flow xmlns="http://www.springframework.org/schema/webflow"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/webflow
  5. http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
  6. <!-- view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id -->
  7. <view-state id="viewCart" view="viewCart">
  8. <on-render>
  9. <!-- 要在 viewCart 页面中显示商品,只需在 view-state 元素的 on-render 切入点调用 productService 的
  10. getProducts 方法,并将所得结果保存到 viewScope 中即可 -->
  11. <!-- productService 的 getProducts 方法所得的结果会存放在 viewScope 中名为 products 的变量中, jsp 页面的代码可直接访问该变量。 -->
  12. <!-- 通过 evaluate 元素来指定要处理的业务逻辑 -->
  13. <evaluate expression="productService.getProducts()" result="viewScope.products" />
  14. </on-render>
  15. <transition on="submit" to="viewOrder">
  16. </transition>
  17. </view-state>
  18. <view-state id="viewOrder" view="viewOrder">
  19. <transition on="confirm" to="orderConfirmed">
  20. </transition>
  21. </view-state>
  22. <view-state id="orderConfirmed" view="orderConfirmed">
  23. <transition on="returnToIndex" to="returnToIndex">
  24. </transition>
  25. </view-state>
  26. <end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">
  27. </end-state>
  28. </flow>

修改viewCart.jsp 页面

productService的 getProducts 方法所得的结果会存放在 viewScope 中名为 products 的变量中, jsp 页面的代码可直接访问该变量。

修改后的 viewCart.jsp 页面

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <html xmlns="http://www.w3.org/1999/xhtml">
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  8. <title>View Cart</title>
  9. </head>
  10. <body>
  11. <h1>View Cart</h1>
  12. <a href="${flowExecutionUrl}&_eventId=submit">Submit</a>
  13. <h2>Products for Your Choice</h2>
  14. <table>
  15. <c:forEach var="product" items="${products}">
  16. <tr>
  17. <td>${product.description}</td>
  18. <td>${product.price}</td>
  19. </tr>
  20. </c:forEach>
  21. </table>
  22. </body>
  23. </html>

访问地址:http://localhost:8080/CartApp4/spring/index.jsp

View Cart页面效果图:

源码下载

总结:

以上的代码实现是结合第一篇博客后融合业务逻辑来操作,主要介绍了业务和Spring Web Flow的结合方式,下篇博客将陆续介绍流程的嵌套。

Spring Web Flow 入门demo(二)与业务结合 附源码相关推荐

  1. Spring Web Flow 入门demo(二)与业务结合 附源代码

    第一部分demo仅仅介绍了简单的页面跳转,接下来我们要实现与业务逻辑相关的功能. 业务的逻辑涉及到数据的获取.传递.保存.相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完毕,但定 ...

  2. Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码

    转载地址 ; http://blog.csdn.net/hejingyuan6/article/details/46723021 上篇博客我们说spring web Flow与业务结合的方式主要有三种 ...

  3. Spring Web Flow 入门demo(一)简单页面跳转 附源码

    转载地址 http://blog.csdn.net/hejingyuan6/article/details/46508821 spring Web Flow (SWF)是Spring Framewor ...

  4. arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...

    你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...

  5. JAVA计算机毕业设计校园二手书交易平台(附源码、数据库)

    JAVA计算机毕业设计校园二手书交易平台(附源码.数据库) 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...

  6. Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码

    前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...

  7. 前后端分离 Spring Boot + Vue 开发网易云QQ音乐(附源码)!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者|xiangzhihong segmentfault.com/ ...

  8. Spring Boot + Vue.js 实现前后端分离(附源码)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 梁小生0101 链接:juejin.im/post/5c6 ...

  9. 黑马pink老师前端从入门到精通教程汇总(附源码+配套资料)

    本篇内容主要是PINK老师教程汇总(主要内容如下) 1.web端布局:先讲解HTML5常用标签,接着讲解CSS3常见样式增加的H5C3新特性,新语法,最后讲解PC端品优购项目.以及CSS3动画 2d ...

最新文章

  1. 分区时磁盘上没有足够的空间完成此操作的解决方法
  2. ImportError: cannot import name ‘moving_averages‘
  3. 整理 45 道 CSS 基础面试题(附答案)
  4. 软件工程实验报告:图书管理系统
  5. vue3.0开发环境搭建及vue2.x和vue3.x的区别
  6. Java获取照片EXIF信息
  7. 英语foteball足球foteball单词
  8. 日常生活小技巧 -- Beyond Compare之PC与UNIX文件比较
  9. 设置好DNS CAA记录,轻松提高HTTPS站点安全
  10. discuzX1.5制作单页教程
  11. linux桥接模式配置
  12. 分布式事务框架lcn入门demo
  13. 旅行商问题(TSP)简介
  14. networkx 画图中文方块
  15. jQuery实现购物车
  16. 未来软件工作室2019年年会总结
  17. Markdown文本目录生成、页内跳转
  18. FS4052A是一个4.0-23V宽电压输入,2A充电电流单电池 同步降压锂离子电池充电器
  19. 统计学——中位数、众数
  20. Flutter桌面开发 - windows插件开发

热门文章

  1. 【SpringBoot高级】SpringBoot整合篇
  2. 关于jinja2的{{...|safe}}过滤器
  3. 【Python入门】第一个py程序
  4. 怎么把cad做的图分享给别人_在线协同文档分享后,别人只能看却不能写怎么办?...
  5. 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列
  6. 【四重优化,速看】剑指 Offer 13. 机器人的运动范围
  7. 【解析】1013 Battle Over Cities (25 分)_31行代码AC
  8. jQuery的引入和使用
  9. linux 标准输入句柄,标准文件描述符与标准文件句柄
  10. java怎么在记事本里写过运行_[置顶] 如何运行用记事本写的java程序