博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Web Flow 入门demo(二)与业务结合 附源代码
阅读量:5295 次
发布时间:2019-06-14

本文共 4983 字,大约阅读时间需要 16 分钟。

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

业务的逻辑涉及到数据的获取、传递、保存。相关的业务功能函数的调用等内容,这些功能的实现都可用Java 代码来完毕,但定义 Spring Web Flow 的语法与 Java 是无关的,这就要求 Spring Web Flow 提供与 Java代码的整合机制。

要了解这样的机制。关键在于搞清楚两个问题:

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

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

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

  • client请求中包括了 _eventId 參数
  • 运行到框架自己定义的切入点
  • 运行到 <action-state> 元素

 

1。client请求中包括了 _eventId參数

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

当client的请求中包括“_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 元素

兴许会具体介绍,以下的demo即使用此种方式与业务逻辑建立关系。

 

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

SpringWeb Flow 中的这个 <action-state> 是专为运行业务逻辑而设的 state 。

假设某个应用的业务逻辑代码既不适合放在transition 中由client来触发,也不适合放在 Spring Web Flow 自己定义的切入点,那么就能够考虑加入<action-state> 元素专用于该业务逻辑的运行。

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 提供了在这两种范围里存取数据的方法。

注意: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类

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
products = new HashMap
();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
getProducts() {return new ArrayList
(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 页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
View Cart

View Cart

Submit

Products for Your Choice

${product.description} ${product.price}

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

View Cart页面效果图:

 

总结:

 

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

转载于:https://www.cnblogs.com/cxchanpin/p/6907968.html

你可能感兴趣的文章
C#预处理器命令
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
Html学习_简易个人网页制作
查看>>
jqery总结
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
dos批处理(bat)运行exe
查看>>
Pycharm安装Markdown插件
查看>>
【转】redo与undo
查看>>
C#更新程序设计
查看>>
常用Request对象获取请求信息
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Shell命令-内置命令及其它之watch、date
查看>>