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

第一部分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 接口。

注:

  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<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的结合方式,下篇博客将陆续介绍流程的嵌套。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 05:29:49

Spring Web Flow 入门demo(二)与业务结合 附源码的相关文章

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

上篇博客我们说Spring web Flow与业务结合的方式主要有三种,下面我们主要介绍一下第三种的应用方式 3,执行到<action-state> 元素 SpringWeb Flow 中的这个 <action-state> 是专为执行业务逻辑而设的 state .如果某个应用的业务逻辑代码既不适合放在transition 中由客户端来触发,也不适合放在 Spring Web Flow 自定义的切入点,那么就可以考虑添加<action-state> 元素专用于该业务逻辑

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

上篇博客我们说Spring web Flow与业务结合的方式主要有三种,以下我们主要介绍一下第三种的应用方式 3,运行到<action-state> 元素 SpringWeb Flow 中的这个 <action-state> 是专为运行业务逻辑而设的 state . 假设某个应用的业务逻辑代码既不适合放在transition 中由client来触发,也不适合放在 Spring Web Flow 自己定义的切入点,那么就能够考虑加入<action-state> 元素专用于

Spring Web Flow 入门demo(一)附源码

Spring Web Flow (SWF)是Spring Framework的一个脱离模块.这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC. Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案.当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器. 下面我们还是从一个简单的demo开始了解它: 这个例子是结合Springmvc来实现,项目结构:

leaflet-webpack 入门开发系列五地图卷帘(附源码下载)

前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 webpack 配置介绍文档详细的 webpack 文档配置介绍,适合新手查看,我也是边看边学 vscode 安装包下载,我这边用 vscode工具编译开发前端项目,个人觉的这款工具还不错 leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 l

Spring AOP实现方式三之自动扫描注入【附源码】

注解AOP实现  这里唯一不同的就是application 里面 不需要配置每个bean都需要配置了,直接自动扫描 注册,主要知识点是怎么通过配置文件得到bean, 注意类前面的@注解. 源码结构: 1.首先我们新建一个接口,love 谈恋爱接口. package com.spring.aop; /** * 谈恋爱接口 * * @author Administrator * */ public interface Love { /* * 谈恋爱方法 */ void fallInLove(); v

思考:实战 Spring Cloud 微服务架构下的“秒杀”(附源码)

内容概要 关于秒杀的更多思考,在原有的秒杀架构的基础上新增了新的实现方案 1.架构介绍 2.关于秒杀的场景特点分析 * 分析,在做秒杀系统的设计之初,一直在思考如何去设计这个秒杀系统,使之在现有的技术基础和认知范围内,能够做到最好:同时也能充分的利用公司现有的中间件来完成系统的实现. 我们都知道,正常去实现一个WEB端的秒杀系统,前端的处理和后端的处理一样重要:前端一般会做CDN,后端一般会做分布式部署,限流,性能优化等等一系列的操作,并完成一些网络的优化,比如IDC多线路(电信.联通.移动)的

spring web flow 2.0入门(转:http://luanxiyuan.iteye.com/blog/2282126)

Spring Web Flow 2.0 入门详解 博客分类: spring 目录: 参考文献 购物车用例 什么情况下可以使用 Spring Web Flow? 配置 Spring Web MVC 配置 Spring Web Flow 2.0 的基础 在购物车示例应用中配置 Spring Web Flow 用 Unified EL 实现业务逻辑 用 subflow 实现添加商品到购物车功能 global transition 简介 1.参考文献 参考1:http://www.ibm.com/dev

Spring web flow——披萨订购流程示例(1)

一.Spring web Flow定义 Spring Web Flow(后面简称swf)是一个Web框架,它适用于元素按规定流程运行的程序.Spring Web Flow是Spring MVC的扩展,它支持开发基于流程的应用程序.它将流程的定义于实现流程行为的类和视图分离开来. 下面我们通过生成披萨订单的新Web应用程序.我们会使用Spring Web Flow来定义订单流程. 1.1 swf环境准备 尽管swf是Spring框架的子项目,但它并不是Spring框架的一部分.因此,在构建基于流程

Spring web flow 配置文件

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/s