Spring Web Flow 入门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>

Cart:

package samples.webflow;import java.io.Serializable;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;//购物车的实现类public class Cart implements Serializable {private static final long serialVersionUID = 7901330827203016310L;private Map<Integer, CartItem> map = new HashMap<Integer, CartItem>();//getItems 用于获取当前购物车里的物品public List<CartItem> getItems() {return new ArrayList<CartItem>(map.values());}//addItem 用于向购物车添加商品public void addItem(Product product) {int id = product.getId();CartItem item = map.get(id);if (item != null)item.increaseQuantity();elsemap.put(id, new CartItem(product, 1));}//getTotalPrice 用于获取购物车里所有商品的总价格public int getTotalPrice() {int total = 0;for (CartItem item : map.values())total += item.getProduct().getPrice() * item.getQuantity();return total;}}

Cart 是购物车的实现类,其同样要实现java.io.Serializable 接口,但它没有像 ProductService 一样成为由 Spring IoC 容器管理的 Bean,每个客户的购物车是不同的,因此不能使用 Spring IoC 容器默认的 Singleton 模式。

CartItem:

package samples.webflow;import java.io.Serializable;//购物车中的条目public class CartItem implements Serializable {private static final long serialVersionUID = 8388627124326126637L;private Product product;//商品private int quantity;//数量public CartItem(Product product, int quantity) {this.product = product;this.quantity = quantity;}//计算该条目的总价格public int getTotalPrice() {return this.quantity * this.product.getPrice();}//增加商品的数量public void increaseQuantity() {this.quantity++;}/*** Return property product*/public Product getProduct() {return product;}/*** Sets property product*/public void setProduct(Product product) {this.product = product;}/*** Return property quantity*/public int getQuantity() {return quantity;}/*** Sets property quantity*/public void setQuantity(int quantity) {this.quantity = quantity;}/* getter setter */}

shopping.xml:

<?xml version="1.0" encoding="UTF-8"?><flow xmlns=""xmlns:xsi=""xsi:schemaLocation=" "><!– 在 shopping flow 开始时必须分配一个 Cart 对象,由于要调用 subflow ,这个 Cart 对象应存放于 conversationScope 中。同时要添加一个 subflow-state 用于执行添加商品到购物车的任务。 –><!– mycart为一个服务类 –><var name="mycart" class="samples.webflow.Cart" /><on-start><set name="conversationScope.cart" value="mycart"></set></on-start><!– view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id –><view-state id="viewCart" view="viewCart"><!– 在进入 view 的 render 流程之后,在 view 真正 render出来之前 –><on-render><!– 要在 viewCart 页面中显示商品,只需在 view-state 元素的 on-render 切入点调用 productService的 getProducts 方法,并将所得结果保存到 viewScope 中即可 –><evaluate expression="productService.getProducts()" result="viewScope.products" /></on-render><transition on="submit" to="viewOrder" /><transition on="addToCart" to="addProductToCart" /></view-state><subflow-state id="addProductToCart" subflow="addToCart"><transition on="productAdded" to="viewCart" /></subflow-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>

在/WEB-INF/flows 目录下添加 addToCart.xml

subflow-state元素的 subflow 属性即指明了这个被调用的 flow 的 id 为“ addToCart ”,现在就要添加addToCart flow的定义。

你挤进地铁时,西藏的山鹰一直盘旋云端,

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

相关文章:

你感兴趣的文章:

标签云: