首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Spring Web Flow 2.0 Unified EL 業務邏輯整合指南:表達式觸發、作用域變量與數據流轉

     編輯:Java 相關知識

業務邏輯整合三大問題

  1. 何時調用業務代碼?
  2. 調用後數據如何保存/傳遞?
  3. 如何在 XML 流程定義中調用 Java 方法?

三大觸發時機

1. 客戶端事件觸發

<transition on="submit">
    <evaluate expression="validator.validate()"/>
</transition>

請求含 _eventId=submit 時執行。

2. 框架預定義切入點

切入點XML 元素觸發時機
Flow 啟動<on-start>Flow 執行前
State 進入<on-entry>進入 State 後,其他動作前
視圖渲染<on-render>進入渲染流程後,視圖生成前
State 退出<on-exit>退出 State 前
Flow 結束<on-end>Flow 執行結束後

示例:視圖渲染前加載數據

<view-state id="viewCart" view="viewCart">
    <on-render>
        <evaluate expression="productService.getProducts()" result="viewScope.products"/>
    </on-render>
</view-state>

3. Action State 專用執行

<action-state id="addToCart">
    <evaluate expression="cart.addItem(productService.getProduct(productId))"/>
    <transition to="productAdded"/>
</action-state>

純業務邏輯執行,無視圖渲染。

數據作用域變量體系

變量範圍生命周期
flowScopeFlow 級Flow 啟動→結束
conversationScope會話級主 Flow 及所有 Subflow
viewScope視圖級View State 進入→退出
requestScope請求級單次 HTTP 請求
flashScope重定向級當前請求+下次重定向請求

數據存取示例

<!-- 保存到 Flow 範圍 -->
<evaluate expression="productService.getProducts()" result="flowScope.products"/>

<!-- 保存到會話範圍 -->
<set name="conversationScope.cart" value="mycart"/>

<!-- 從請求參數獲取 -->
<set name="requestScope.productId" value="requestParameters.productId"/>

完整業務邏輯整合示例:商品展示與加入購物車

領域類

@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 id) { return products.get(id); }
}

流程配置

<view-state id="viewCart" view="viewCart">
    <on-render>
        <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>

視圖頁面

<c:forEach var="product" items="${products}">
    <tr>
        <td>${product.description}</td>
        <td>${product.price}</td>
        <td>
            <a href="${flowExecutionUrl}&_eventId=addToCart&productId=${product.id}">[add to cart]</a>
        </td>
    </tr>
</c:forEach>

EL 選擇:Unified EL vs OGNL

默認 Unified EL(JSP 2.1 標準),可通過 flow-builder-services 配置切換 OGNL。Unified EL 支持方法調用、隱式對象、Lambda 表達式(EL 3.0+)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved