Spring Web Flow 入门demo(二)与业务结合 附源码
转载地址
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 元素来指定要处理的业务逻辑
- <transition on="submit">
- <evaluate expression="validator.validate()" />
- </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 元素
- <view-state id="viewCart" view="viewCart" >
- <on-render>
- <evaluate expression="productService.getProducts()" result="viewScope.products"/>
- </on-render>
- </view-state>
后续会详细介绍,下面的demo即使用此种方式与业务逻辑建立关系。
3,执行到<action-state> 元素
SpringWeb Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state 。如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加<action-state> 元素专用于该业务逻辑的执行。
action-state 示例
- <action-state id="addToCart">
- <evaluate expression="cart.addItem(productService.getProduct(productId))"/>
- <transition to="productAdded"/>
- </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 提供了在这两种范围里存取数据的方法。
- <evaluate expression="productService.getProducts()" result="flowScope.products" />
注意:Spring Web Flow 2.0 在默认配置下,flowScope 和 conversationScope的实现依赖于 Java 序列化和反序列化技术,因此存放于 flowScope 或 conversationScope 中的对象需要实现java.io.Serializable 接口。
注:
- flow 范围。此范围内的对象在 flow 开始时创建, flow 结束时销毁,在 flow 定义文件中可通过“ flowScope ”变量名来访问。
- 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类
- package samples.webflow;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import org.springframework.stereotype.Service;
- @Service("productService")
- public class ProductService {
- private Map<Integer, Product> products = new HashMap<Integer, Product>();
- public ProductService() {
- products.put(1, new Product(1, "Bulldog", 1000));
- products.put(2, new Product(2, "Chihuahua", 1500));
- products.put(3, new Product(3, "Labrador", 2000));
- }
- public List<Product> getProducts() {
- return new ArrayList<Product>(products.values());
- }
- public Product getProduct(int productId) {
- return products.get(productId);
- }
- }
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
- <?xml version="1.0" encoding="UTF-8"?>
- <flow xmlns="http://www.springframework.org/schema/webflow"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/webflow
- http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
- <!-- view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id -->
- <view-state id="viewCart" view="viewCart">
- <on-render>
- <!-- 要在 viewCart 页面中显示商品,只需在 view-state 元素的 on-render 切入点调用 productService 的
- getProducts 方法,并将所得结果保存到 viewScope 中即可 -->
- <!-- productService 的 getProducts 方法所得的结果会存放在 viewScope 中名为 products 的变量中, jsp 页面的代码可直接访问该变量。 -->
- <!-- 通过 evaluate 元素来指定要处理的业务逻辑 -->
- <evaluate expression="productService.getProducts()" result="viewScope.products" />
- </on-render>
- <transition on="submit" to="viewOrder">
- </transition>
- </view-state>
- <view-state id="viewOrder" view="viewOrder">
- <transition on="confirm" to="orderConfirmed">
- </transition>
- </view-state>
- <view-state id="orderConfirmed" view="orderConfirmed">
- <transition on="returnToIndex" to="returnToIndex">
- </transition>
- </view-state>
- <end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">
- </end-state>
- </flow>
修改viewCart.jsp 页面
productService的 getProducts 方法所得的结果会存放在 viewScope 中名为 products 的变量中, jsp 页面的代码可直接访问该变量。
修改后的 viewCart.jsp 页面
- <?xml version="1.0" encoding="utf-8" ?>
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>View Cart</title>
- </head>
- <body>
- <h1>View Cart</h1>
- <a href="${flowExecutionUrl}&_eventId=submit">Submit</a>
- <h2>Products for Your Choice</h2>
- <table>
- <c:forEach var="product" items="${products}">
- <tr>
- <td>${product.description}</td>
- <td>${product.price}</td>
- </tr>
- </c:forEach>
- </table>
- </body>
- </html>
访问地址:http://localhost:8080/CartApp4/spring/index.jsp
View Cart页面效果图:
源码下载
总结:
以上的代码实现是结合第一篇博客后融合业务逻辑来操作,主要介绍了业务和Spring Web Flow的结合方式,下篇博客将陆续介绍流程的嵌套。
Spring Web Flow 入门demo(二)与业务结合 附源码相关推荐
- Spring Web Flow 入门demo(二)与业务结合 附源代码
第一部分demo仅仅介绍了简单的页面跳转,接下来我们要实现与业务逻辑相关的功能. 业务的逻辑涉及到数据的获取.传递.保存.相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完毕,但定 ...
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源码
转载地址 ; http://blog.csdn.net/hejingyuan6/article/details/46723021 上篇博客我们说spring web Flow与业务结合的方式主要有三种 ...
- Spring Web Flow 入门demo(一)简单页面跳转 附源码
转载地址 http://blog.csdn.net/hejingyuan6/article/details/46508821 spring Web Flow (SWF)是Spring Framewor ...
- arcgis开发 多版本之间如何兼容_arcgis api 4.x for js 结合 react 入门开发系列初探篇(附源码下载)...
你还在使用 JQuery 或者 Dojo 框架开发 arcgis api 4.x for js 吗?想试试模块化开发吗?随着前端技术的发展,arcgis api 4.x for js 也有了结合 re ...
- JAVA计算机毕业设计校园二手书交易平台(附源码、数据库)
JAVA计算机毕业设计校园二手书交易平台(附源码.数据库) 目运行 环境项配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe ...
- Spring Boot 整合 Shiro(三)Kaptcha验证码 附源码
前言 本文是根据上篇<Spring Boot 整合Shiro(二)加密登录与密码加盐处理>进行修改,如有不明白的转上篇文章了解. 1.导入依赖 <!-- https://mvnrep ...
- 前后端分离 Spring Boot + Vue 开发网易云QQ音乐(附源码)!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者|xiangzhihong segmentfault.com/ ...
- Spring Boot + Vue.js 实现前后端分离(附源码)
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者: 梁小生0101 链接:juejin.im/post/5c6 ...
- 黑马pink老师前端从入门到精通教程汇总(附源码+配套资料)
本篇内容主要是PINK老师教程汇总(主要内容如下) 1.web端布局:先讲解HTML5常用标签,接着讲解CSS3常见样式增加的H5C3新特性,新语法,最后讲解PC端品优购项目.以及CSS3动画 2d ...
最新文章
- 分区时磁盘上没有足够的空间完成此操作的解决方法
- ImportError: cannot import name ‘moving_averages‘
- 整理 45 道 CSS 基础面试题(附答案)
- 软件工程实验报告:图书管理系统
- vue3.0开发环境搭建及vue2.x和vue3.x的区别
- Java获取照片EXIF信息
- 英语foteball足球foteball单词
- 日常生活小技巧 -- Beyond Compare之PC与UNIX文件比较
- 设置好DNS CAA记录,轻松提高HTTPS站点安全
- discuzX1.5制作单页教程
- linux桥接模式配置
- 分布式事务框架lcn入门demo
- 旅行商问题(TSP)简介
- networkx 画图中文方块
- jQuery实现购物车
- 未来软件工作室2019年年会总结
- Markdown文本目录生成、页内跳转
- FS4052A是一个4.0-23V宽电压输入,2A充电电流单电池 同步降压锂离子电池充电器
- 统计学——中位数、众数
- Flutter桌面开发 - windows插件开发
热门文章
- 【SpringBoot高级】SpringBoot整合篇
- 关于jinja2的{{...|safe}}过滤器
- 【Python入门】第一个py程序
- 怎么把cad做的图分享给别人_在线协同文档分享后,别人只能看却不能写怎么办?...
- 【解题报告】Leecode 859. 亲密字符串——Leecode每日一题系列
- 【四重优化,速看】剑指 Offer 13. 机器人的运动范围
- 【解析】1013 Battle Over Cities (25 分)_31行代码AC
- jQuery的引入和使用
- linux 标准输入句柄,标准文件描述符与标准文件句柄
- java怎么在记事本里写过运行_[置顶] 如何运行用记事本写的java程序