javascript
Spring Web Flow 入门demo(二)与业务结合 附源码
轉載地址
http://blog.csdn.net/hejingyuan6/article/details/46516287
第一部分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 元素來指定要處理的業務邏輯
[html] view plaincopyprint?
當客戶端的請求中包含“_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 元素
[html] view plaincopyprint?后續會詳細介紹,下面的demo即使用此種方式與業務邏輯建立關系。
?
3,執行到<action-state> 元素
SpringWeb Flow 中的這個 <action-state> 是專為執行業務邏輯而設的 state 。如果某個應用的業務邏輯代碼既不適合放在transition 中由客戶端來觸發,也不適合放在 Spring Web Flow 自定義的切入點,那么就可以考慮添加<action-state> 元素專用于該業務邏輯的執行。
action-state 示例
[html] view plaincopyprint?后續會詳細介紹,在下篇博客中會介紹。
?
業務邏輯代碼在調用后得到的數據如何保存、傳遞?
?
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 提供了在這兩種范圍里存取數據的方法。
[html] view plaincopyprint?注意:Spring Web Flow 2.0 在默認配置下,flowScope 和 conversationScope的實現依賴于 Java 序列化和反序列化技術,因此存放于 flowScope 或 conversationScope 中的對象需要實現java.io.Serializable 接口。
注:
SpringWeb Flow 還提供了大量其他的變量,以方便數據的存取。如 viewScope 范圍即是從進入 view-state 至退出 view-state 結束,requestScope 即和一般的 request 范圍沒什么區別,等等。另外還有一些用于獲取 flow 以外數據的變量,如requestParameters 、 messageContext 等等。具體變量的列表可參看 Spring Web Flow自帶的文檔。
??
Demo實現:
ProductService類
[java] view plaincopyprint?
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?
[html] view plaincopyprint?
修改viewCart.jsp 頁面
productService的 getProducts 方法所得的結果會存放在 viewScope 中名為 products 的變量中, jsp 頁面的代碼可直接訪問該變量。?
修改后的 viewCart.jsp 頁面
[html] view plaincopyprint?
訪問地址:http://localhost:8080/CartApp4/spring/index.jsp
View Cart頁面效果圖:
源碼下載
?
總結:
?
以上的代碼實現是結合第一篇博客后融合業務邏輯來操作,主要介紹了業務和Spring Web Flow的結合方式,下篇博客將陸續介紹流程的嵌套。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的Spring Web Flow 入门demo(二)与业务结合 附源码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Web Flow 入门de
- 下一篇: Spring Web Flow 入门de