Spring Web Flow 入門demo(二)與業務結合 附源碼

來源:互聯網
上載者:User

標籤:


第一部分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的結合方式,下篇部落格將陸續介紹流程的嵌套。




著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Spring Web Flow 入門demo(二)與業務結合 附源碼

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.